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

Commit 629f6770 authored by Chris Craik's avatar Chris Craik
Browse files

Simplify DisplayList matrices

Somewhat unifies the ortho/perspecive paths - the property matrix
(translate/scale/rotate) is now always a Matrix4.

Change-Id: I36e4fe83d1150ee6e4be5f64f34d0fc8d6525cc6
parent c734de9c
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
///////////////////////////////////////////////////////////////////////////////