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

Commit ded4d14e authored by Jerome Gaillard's avatar Jerome Gaillard
Browse files

Deals with translation and scaling in layoutlib

Layoutlib now correctly interprets the translation and scaling
xml attributes of views, by implementing what the Android platform
does in native code.

Change-Id: Ie8465f40ef4508d3c31796200800f12cb8f883a4
parent 7efb74d5
Loading
Loading
Loading
Loading
+119 −13
Original line number Diff line number Diff line
@@ -38,10 +38,15 @@ public class RenderNode_Delegate {


    private float mLift;
    private float mTranslationX;
    private float mTranslationY;
    private float mTranslationZ;
    private float mRotation;
    private float mScaleX = 1;
    private float mScaleY = 1;
    private float mPivotX;
    private float mPivotY;
    private boolean mPivotExplicitelySet;
    private boolean mPivotExplicitlySet;
    private int mLeft;
    private int mRight;
    private int mTop;
@@ -80,6 +85,63 @@ public class RenderNode_Delegate {
        return 0f;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetTranslationX(long renderNode, float translationX) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mTranslationX != translationX) {
            delegate.mTranslationX = translationX;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static float nGetTranslationX(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            return delegate.mTranslationX;
        }
        return 0f;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetTranslationY(long renderNode, float translationY) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mTranslationY != translationY) {
            delegate.mTranslationY = translationY;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static float nGetTranslationY(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            return delegate.mTranslationY;
        }
        return 0f;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetTranslationZ(long renderNode, float translationZ) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mTranslationZ != translationZ) {
            delegate.mTranslationZ = translationZ;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static float nGetTranslationZ(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            return delegate.mTranslationZ;
        }
        return 0f;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetRotation(long renderNode, float rotation) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
@@ -103,8 +165,17 @@ public class RenderNode_Delegate {
    /*package*/ static void getMatrix(RenderNode renderNode, Matrix outMatrix) {
        outMatrix.reset();
        if (renderNode != null) {
            outMatrix.preRotate(renderNode.getRotation(), renderNode.getPivotX(),
                    renderNode.getPivotY());
            float rotation = renderNode.getRotation();
            float translationX = renderNode.getTranslationX();
            float translationY = renderNode.getTranslationY();
            float pivotX = renderNode.getPivotX();
            float pivotY = renderNode.getPivotY();
            float scaleX = renderNode.getScaleX();
            float scaleY = renderNode.getScaleY();

            outMatrix.setTranslate(translationX, translationY);
            outMatrix.preRotate(rotation, pivotX, pivotY);
            outMatrix.preScale(scaleX, scaleY, pivotX, pivotY);
        }
    }

@@ -166,18 +237,15 @@ public class RenderNode_Delegate {
    @LayoutlibDelegate
    /*package*/ static boolean nIsPivotExplicitlySet(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            return delegate.mPivotExplicitelySet;
        }
        return false;
        return delegate != null && delegate.mPivotExplicitlySet;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetPivotX(long renderNode, float pivotX) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mPivotX != pivotX) {
        if (delegate != null) {
            delegate.mPivotX = pivotX;
            delegate.mPivotExplicitelySet = true;
            delegate.mPivotExplicitlySet = true;
            return true;
        }
        return false;
@@ -187,7 +255,7 @@ public class RenderNode_Delegate {
    /*package*/ static float nGetPivotX(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            if (delegate.mPivotExplicitelySet) {
            if (delegate.mPivotExplicitlySet) {
                return delegate.mPivotX;
            } else {
                return (delegate.mRight - delegate.mLeft) / 2.0f;
@@ -199,9 +267,9 @@ public class RenderNode_Delegate {
    @LayoutlibDelegate
    /*package*/ static boolean nSetPivotY(long renderNode, float pivotY) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mPivotY != pivotY) {
        if (delegate != null) {
            delegate.mPivotY = pivotY;
            delegate.mPivotExplicitelySet = true;
            delegate.mPivotExplicitlySet = true;
            return true;
        }
        return false;
@@ -211,7 +279,7 @@ public class RenderNode_Delegate {
    /*package*/ static float nGetPivotY(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            if (delegate.mPivotExplicitelySet) {
            if (delegate.mPivotExplicitlySet) {
                return delegate.mPivotY;
            } else {
                return (delegate.mBottom - delegate.mTop) / 2.0f;
@@ -219,4 +287,42 @@ public class RenderNode_Delegate {
        }
        return 0f;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetScaleX(long renderNode, float scaleX) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mScaleX != scaleX) {
            delegate.mScaleX = scaleX;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static float nGetScaleX(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            return delegate.mScaleX;
        }
        return 0f;
    }

    @LayoutlibDelegate
    /*package*/ static boolean nSetScaleY(long renderNode, float scaleY) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null && delegate.mScaleY != scaleY) {
            delegate.mScaleY = scaleY;
            return true;
        }
        return false;
    }

    @LayoutlibDelegate
    /*package*/ static float nGetScaleY(long renderNode) {
        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
        if (delegate != null) {
            return delegate.mScaleY;
        }
        return 0f;
    }
}
+10 −0
Original line number Diff line number Diff line
@@ -192,6 +192,12 @@ public final class CreateInfo implements ICreateInfo {
        "android.view.RenderNode#nDestroyRenderNode",
        "android.view.RenderNode#nSetElevation",
        "android.view.RenderNode#nGetElevation",
        "android.view.RenderNode#nSetTranslationX",
        "android.view.RenderNode#nGetTranslationX",
        "android.view.RenderNode#nSetTranslationY",
        "android.view.RenderNode#nGetTranslationY",
        "android.view.RenderNode#nSetTranslationZ",
        "android.view.RenderNode#nGetTranslationZ",
        "android.view.RenderNode#nSetRotation",
        "android.view.RenderNode#nGetRotation",
        "android.view.RenderNode#getMatrix",
@@ -204,6 +210,10 @@ public final class CreateInfo implements ICreateInfo {
        "android.view.RenderNode#nGetPivotX",
        "android.view.RenderNode#nSetPivotY",
        "android.view.RenderNode#nGetPivotY",
        "android.view.RenderNode#nSetScaleX",
        "android.view.RenderNode#nGetScaleX",
        "android.view.RenderNode#nSetScaleY",
        "android.view.RenderNode#nGetScaleY",
        "android.view.RenderNode#nIsPivotExplicitlySet",
        "android.view.ViewGroup#drawChild",
        "android.widget.SimpleMonthView#getTitle",