Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fdace4e2 authored by Chris Craik's avatar Chris Craik Committed by Android (Google) Code Review
Browse files

Merge "Simplify DisplayList matrices"

parents 6250c59e 629f6770
Loading
Loading
Loading
Loading
+44 −45
Original line number Diff line number Diff line
@@ -299,12 +299,13 @@ float DisplayList::getPivotY() {

void DisplayList::updateMatrix() {
    if (mMatrixDirty) {
        // NOTE: mTransformMatrix won't be up to date if a DisplayList goes from a complex transform
        // to a pure translate. This is safe because the matrix isn't read in pure translate cases.
        if (mMatrixFlags && mMatrixFlags != TRANSLATION) {
            if (!mTransformMatrix) {
            mTransformMatrix = new SkMatrix();
                // only allocate a matrix if we have a complex transform
                mTransformMatrix = new Matrix4();
            }
        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
            mTransformMatrix->reset();
        } else {
            if (!mPivotExplicitlySet) {
                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
                    mPrevWidth = mWidth;
@@ -313,28 +314,36 @@ void DisplayList::updateMatrix() {
                    mPivotY = mPrevHeight / 2.0f;
                }
            }
            if (!Caches::getInstance().propertyEnable3d && (mMatrixFlags & ROTATION_3D) == 0) {
                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
            const bool perspectiveEnabled = Caches::getInstance().propertyEnable3d;
            if (!perspectiveEnabled && (mMatrixFlags & ROTATION_3D) == 0) {
                mTransformMatrix->loadTranslate(
                        mPivotX + mTranslationX,
                        mPivotY + mTranslationY,
                        0);
                mTransformMatrix->rotate(mRotation, 0, 0, 1);
                mTransformMatrix->scale(mScaleX, mScaleY, 1);
                mTransformMatrix->translate(-mPivotX, -mPivotY);
            } else {
                if (Caches::getInstance().propertyEnable3d) {
                    mTransform.loadTranslate(mPivotX + mTranslationX, mPivotY + mTranslationY,
                if (perspectiveEnabled) {
                    mTransformMatrix->loadTranslate(
                            mPivotX + mTranslationX,
                            mPivotY + mTranslationY,
                            mTranslationZ);
                    mTransform.rotate(mRotationX, 1, 0, 0);
                    mTransform.rotate(mRotationY, 0, 1, 0);
                    mTransform.rotate(mRotation, 0, 0, 1);
                    mTransform.scale(mScaleX, mScaleY, 1);
                    mTransform.translate(-mPivotX, -mPivotY);
                    mTransformMatrix->rotate(mRotationX, 1, 0, 0);
                    mTransformMatrix->rotate(mRotationY, 0, 1, 0);
                    mTransformMatrix->rotate(mRotation, 0, 0, 1);
                    mTransformMatrix->scale(mScaleX, mScaleY, 1);
                    mTransformMatrix->translate(-mPivotX, -mPivotY);
                } else {
                    /* TODO: support this old transform approach, based on API level */
                    if (!mTransformCamera) {
                        mTransformCamera = new Sk3DView();
                        mTransformMatrix3D = new SkMatrix();
                    }
                    mTransformMatrix->reset();
                    SkMatrix transformMatrix;
                    transformMatrix.reset();
                    mTransformCamera->save();
                    mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
                    transformMatrix.preScale(mScaleX, mScaleY, mPivotX, mPivotY);
                    mTransformCamera->rotateX(mRotationX);
                    mTransformCamera->rotateY(mRotationY);
                    mTransformCamera->rotateZ(-mRotation);
@@ -342,8 +351,10 @@ void DisplayList::updateMatrix() {
                    mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
                    mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
                            mPivotY + mTranslationY);
                    mTransformMatrix->postConcat(*mTransformMatrix3D);
                    transformMatrix.postConcat(*mTransformMatrix3D);
                    mTransformCamera->restore();

                    mTransformMatrix->load(transformMatrix);
                }
            }
        }
@@ -357,19 +368,20 @@ void DisplayList::outputViewProperties(const int level) {
        ALOGD("%*sTranslate (left, top) %d, %d", level * 2, "", mLeft, mTop);
    }
    if (mStaticMatrix) {
        ALOGD("%*sConcatMatrix (static) %p: " MATRIX_STRING,
                level * 2, "", mStaticMatrix, MATRIX_ARGS(mStaticMatrix));
        ALOGD("%*sConcatMatrix (static) %p: " SK_MATRIX_STRING,
                level * 2, "", mStaticMatrix, SK_MATRIX_ARGS(mStaticMatrix));
    }
    if (mAnimationMatrix) {
        ALOGD("%*sConcatMatrix (animation) %p: " MATRIX_STRING,
                level * 2, "", mAnimationMatrix, MATRIX_ARGS(mAnimationMatrix));
        ALOGD("%*sConcatMatrix (animation) %p: " SK_MATRIX_STRING,
                level * 2, "", mAnimationMatrix, SK_MATRIX_ARGS(mAnimationMatrix));
    }
    if (mMatrixFlags != 0) {
        if (mMatrixFlags == TRANSLATION) {
            ALOGD("%*sTranslate %f, %f", level * 2, "", mTranslationX, mTranslationY);
            ALOGD("%*sTranslate %.2f, %.2f, %.2f",
                    level * 2, "", mTranslationX, mTranslationY, mTranslationZ);
        } else {
            ALOGD("%*sConcatMatrix %p: " MATRIX_STRING,
                    level * 2, "", mTransformMatrix, MATRIX_ARGS(mTransformMatrix));
            ALOGD("%*sConcatMatrix %p: " MATRIX_4_STRING,
                    level * 2, "", mTransformMatrix, MATRIX_4_ARGS(mTransformMatrix));
        }
    }

@@ -419,19 +431,11 @@ void DisplayList::setViewProperties(OpenGLRenderer& renderer, T& handler,
        renderer.concatMatrix(mAnimationMatrix);
    }
    if (mMatrixFlags != 0) {
        if (Caches::getInstance().propertyEnable3d) {
        if (mMatrixFlags == TRANSLATION) {
                renderer.translate(mTranslationX, mTranslationY, mTranslationZ);
            renderer.translate(mTranslationX, mTranslationY,
                    Caches::getInstance().propertyEnable3d ? mTranslationZ : 0.0f); // TODO: necessary?
        } else {
                renderer.concatMatrix(mTransform);
            }
        } else {
            // avoid setting translationZ, use SkMatrix
            if (mMatrixFlags == TRANSLATION) {
                renderer.translate(mTranslationX, mTranslationY, 0);
            } else {
                renderer.concatMatrix(mTransformMatrix);
            }
            renderer.concatMatrix(*mTransformMatrix);
        }
    }
    bool clipToBoundsNeeded = mCaching ? false : mClipToBounds;
@@ -482,12 +486,7 @@ void DisplayList::applyViewPropertyTransforms(mat4& matrix) {
        if (mMatrixFlags == TRANSLATION) {
            matrix.translate(mTranslationX, mTranslationY, mTranslationZ);
        } else {
            if (Caches::getInstance().propertyEnable3d) {
                matrix.multiply(mTransform);
            } else {
                mat4 temp(*mTransformMatrix);
                matrix.multiply(temp);
            }
            matrix.multiply(*mTransformMatrix);
        }
    }
}
+9 −2
Original line number Diff line number Diff line
@@ -614,13 +614,20 @@ private:
    bool mPivotExplicitlySet;
    bool mMatrixDirty;
    bool mMatrixIsIdentity;

    /**
     * Stores the total transformation of the DisplayList based upon its scalar
     * translate/rotate/scale properties.
     *
     * In the common translation-only case, the matrix isn't allocated and the mTranslation
     * properties are used directly.
     */
    Matrix4* mTransformMatrix;
    uint32_t mMatrixFlags;
    SkMatrix* mTransformMatrix;
    Sk3DView* mTransformCamera;
    SkMatrix* mTransformMatrix3D;
    SkMatrix* mStaticMatrix;
    SkMatrix* mAnimationMatrix;
    Matrix4 mTransform;
    bool mCaching;

    /**
+3 −3
Original line number Diff line number Diff line
@@ -465,7 +465,7 @@ public:

    virtual void output(int level, uint32_t logFlags) const {
        if (mMatrix) {
            OP_LOG("SetMatrix " MATRIX_STRING, MATRIX_ARGS(mMatrix));
            OP_LOG("SetMatrix " SK_MATRIX_STRING, SK_MATRIX_ARGS(mMatrix));
        } else {
            OP_LOGS("SetMatrix (reset)");
        }
@@ -487,7 +487,7 @@ public:
    }

    virtual void output(int level, uint32_t logFlags) const {
        OP_LOG("ConcatMatrix " MATRIX_STRING, MATRIX_ARGS(mMatrix));
        OP_LOG("ConcatMatrix " SK_MATRIX_STRING, SK_MATRIX_ARGS(mMatrix));
    }

    virtual const char* name() { return "ConcatMatrix"; }
@@ -848,7 +848,7 @@ public:
    }

    virtual void output(int level, uint32_t logFlags) const {
        OP_LOG("Draw bitmap %p matrix " MATRIX_STRING, mBitmap, MATRIX_ARGS(mMatrix));
        OP_LOG("Draw bitmap %p matrix " SK_MATRIX_STRING, mBitmap, SK_MATRIX_ARGS(mMatrix));
    }

    virtual const char* name() { return "DrawBitmapMatrix"; }
+10 −2
Original line number Diff line number Diff line
@@ -26,12 +26,20 @@
namespace android {
namespace uirenderer {

#define MATRIX_STRING "[%.2f %.2f %.2f] [%.2f %.2f %.2f] [%.2f %.2f %.2f]"
#define MATRIX_ARGS(m) \
#define SK_MATRIX_STRING "[%.2f %.2f %.2f] [%.2f %.2f %.2f] [%.2f %.2f %.2f]"
#define SK_MATRIX_ARGS(m) \
    (m)->get(0), (m)->get(1), (m)->get(2), \
    (m)->get(3), (m)->get(4), (m)->get(5), \
    (m)->get(6), (m)->get(7), (m)->get(8)

#define MATRIX_4_STRING "[%.2f %.2f %.2f %.2f] [%.2f %.2f %.2f %.2f]" \
    " [%.2f %.2f %.2f %.2f] [%.2f %.2f %.2f %.2f]"
#define MATRIX_4_ARGS(m) \
    (m)->data[0], (m)->data[4], (m)->data[8], (m)->data[12], \
    (m)->data[1], (m)->data[5], (m)->data[9], (m)->data[13], \
    (m)->data[2], (m)->data[6], (m)->data[10], (m)->data[14], \
    (m)->data[3], (m)->data[7], (m)->data[11], (m)->data[15] \

///////////////////////////////////////////////////////////////////////////////
// Classes
///////////////////////////////////////////////////////////////////////////////