13af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi/*
23af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi * Copyright (C) 2014 The Android Open Source Project
33af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi *
43af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
53af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi * you may not use this file except in compliance with the License.
63af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi * You may obtain a copy of the License at
73af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi *
83af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
93af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi *
103af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
113af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
123af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi * See the License for the specific language governing permissions and
143af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi * limitations under the License.
153af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi */
163af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
173af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivipackage android.view;
183af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
193af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviimport com.android.layoutlib.bridge.impl.DelegateManager;
203af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
213af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
223af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviimport android.graphics.Matrix;
233af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
243af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Triviimport libcore.util.NativeAllocationRegistry_Delegate;
253af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
263af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi/**
273af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi * Delegate implementing the native methods of {@link RenderNode}
28712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * <p/>
29712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * Through the layoutlib_create tool, some native methods of RenderNode have been replaced by calls
30712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * to methods of the same name in this delegate class.
31712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi *
32712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi * @see DelegateManager
33712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi */
34712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivipublic class RenderNode_Delegate {
35712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
36712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
37712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    // ---- delegate manager ----
38b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private static final DelegateManager<RenderNode_Delegate> sManager =
39b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            new DelegateManager<RenderNode_Delegate>(RenderNode_Delegate.class);
40b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private static long sFinalizer = -1;
41e214a8c49938e7356943b59db53474e5fc3ae07cJean-Michel Trivi
42b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private float mLift;
43b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private float mTranslationX;
44b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private float mTranslationY;
45b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private float mTranslationZ;
46b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private float mRotation;
47b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private float mScaleX = 1;
48b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private float mScaleY = 1;
49b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private float mPivotX;
50b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private float mPivotY;
51b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private boolean mPivotExplicitlySet;
52b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private int mLeft;
53b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private int mRight;
54b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private int mTop;
55b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private int mBottom;
56b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    @SuppressWarnings("UnusedDeclaration")
57b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    private String mName;
58b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi
59b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    @LayoutlibDelegate
60b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    /*package*/ static long nCreate(String name) {
61b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        RenderNode_Delegate renderNodeDelegate = new RenderNode_Delegate();
62b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        renderNodeDelegate.mName = name;
63b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        return sManager.addNewDelegate(renderNodeDelegate);
64e214a8c49938e7356943b59db53474e5fc3ae07cJean-Michel Trivi    }
65b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi
66b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    @LayoutlibDelegate
67b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    /*package*/ static long nGetNativeFinalizer() {
68b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        synchronized (RenderNode_Delegate.class) {
69b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            if (sFinalizer == -1) {
70b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi                sFinalizer = NativeAllocationRegistry_Delegate.createFinalizer(sManager::removeJavaReferenceFor);
71b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            }
72b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        }
73b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        return sFinalizer;
74b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    }
75b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi
76b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    @LayoutlibDelegate
77b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    /*package*/ static boolean nSetElevation(long renderNode, float lift) {
78b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
79b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        if (delegate != null && delegate.mLift != lift) {
80b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            delegate.mLift = lift;
81b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            return true;
82b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        }
83b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        return false;
84b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    }
85b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi
86b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    @LayoutlibDelegate
87b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    /*package*/ static float nGetElevation(long renderNode) {
88b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
89b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        if (delegate != null) {
90e214a8c49938e7356943b59db53474e5fc3ae07cJean-Michel Trivi            return delegate.mLift;
91b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        }
92b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        return 0f;
93b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    }
94b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi
95b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    @LayoutlibDelegate
96b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    /*package*/ static boolean nSetTranslationX(long renderNode, float translationX) {
97b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
98b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        if (delegate != null && delegate.mTranslationX != translationX) {
99b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            delegate.mTranslationX = translationX;
100b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            return true;
101b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        }
102b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        return false;
103b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    }
104b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi
105b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    @LayoutlibDelegate
106b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    /*package*/ static float nGetTranslationX(long renderNode) {
107b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
108b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        if (delegate != null) {
109b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            return delegate.mTranslationX;
110b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        }
111b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        return 0f;
1123af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
1133b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi
1143b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    @LayoutlibDelegate
1153b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    /*package*/ static boolean nSetTranslationY(long renderNode, float translationY) {
1163b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
1173b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        if (delegate != null && delegate.mTranslationY != translationY) {
1183b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi            delegate.mTranslationY = translationY;
1193b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi            return true;
1203b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        }
1213b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        return false;
1223b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    }
1233b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi
1243b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    @LayoutlibDelegate
1253b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    /*package*/ static float nGetTranslationY(long renderNode) {
1263b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
1273b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        if (delegate != null) {
1283b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi            return delegate.mTranslationY;
1293b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        }
1303b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        return 0f;
1313b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    }
1323b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi
1333b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    @LayoutlibDelegate
1343b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    /*package*/ static boolean nSetTranslationZ(long renderNode, float translationZ) {
1353b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
1363b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        if (delegate != null && delegate.mTranslationZ != translationZ) {
1373b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi            delegate.mTranslationZ = translationZ;
1383b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi            return true;
1393b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        }
1403b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        return false;
1413b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    }
1423b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi
1433b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    @LayoutlibDelegate
1443b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    /*package*/ static float nGetTranslationZ(long renderNode) {
1453b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
1463b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        if (delegate != null) {
1473b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi            return delegate.mTranslationZ;
1483b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        }
1493b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        return 0f;
1503b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    }
1513b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi
1523b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    @LayoutlibDelegate
1533b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    /*package*/ static boolean nSetRotation(long renderNode, float rotation) {
1543b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
1553b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        if (delegate != null && delegate.mRotation != rotation) {
1563b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi            delegate.mRotation = rotation;
1573b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi            return true;
1583b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        }
1593b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        return false;
1603b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    }
1613b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi
1623b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    @LayoutlibDelegate
1633b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    /*package*/ static float nGetRotation(long renderNode) {
1643af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
1653af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        if (delegate != null) {
1663af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            return delegate.mRotation;
1673af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        }
1683af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return 0f;
1693af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
1703af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
1713af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    @LayoutlibDelegate
1723af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    /*package*/ static void getMatrix(RenderNode renderNode, Matrix outMatrix) {
173712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        outMatrix.reset();
1743af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        if (renderNode != null) {
175712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            float rotation = renderNode.getRotation();
176712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            float translationX = renderNode.getTranslationX();
177712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            float translationY = renderNode.getTranslationY();
178712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            float pivotX = renderNode.getPivotX();
179712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            float pivotY = renderNode.getPivotY();
180712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            float scaleX = renderNode.getScaleX();
181712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            float scaleY = renderNode.getScaleY();
182712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
183712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            outMatrix.setTranslate(translationX, translationY);
184712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            outMatrix.preRotate(rotation, pivotX, pivotY);
185712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi            outMatrix.preScale(scaleX, scaleY, pivotX, pivotY);
186712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        }
187712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi    }
188712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
1893af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    @LayoutlibDelegate
1903af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    /*package*/ static boolean nSetLeft(long renderNode, int left) {
1913af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
1923af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        if (delegate != null && delegate.mLeft != left) {
1933af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mLeft = left;
1943af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            return true;
195712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        }
1963af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return false;
1973af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
1983af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
1993af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    @LayoutlibDelegate
2003af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    /*package*/ static boolean nSetTop(long renderNode, int top) {
2013af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
202712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi        if (delegate != null && delegate.mTop != top) {
2033af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mTop = top;
2043af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            return true;
2053af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        }
2063af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return false;
2073af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
208712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi
2093af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    @LayoutlibDelegate
2103af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    /*package*/ static boolean nSetRight(long renderNode, int right) {
2113af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
2123af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        if (delegate != null && delegate.mRight != right) {
2133af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mRight = right;
2143af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            return true;
2153af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        }
2163af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return false;
2173af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
2183af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
2193af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    @LayoutlibDelegate
2203af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    /*package*/ static boolean nSetBottom(long renderNode, int bottom) {
2213af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
2223af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        if (delegate != null && delegate.mBottom != bottom) {
2233af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mBottom = bottom;
2243af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            return true;
2253af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        }
2263af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return false;
2273af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
2283af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
2293af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    @LayoutlibDelegate
2303af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    /*package*/ static boolean nSetLeftTopRightBottom(long renderNode, int left, int top, int right,
2313af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            int bottom) {
2323af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
2333af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        if (delegate != null && (delegate.mLeft != left || delegate.mTop != top || delegate
2343af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi                .mRight != right || delegate.mBottom != bottom)) {
2353af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mLeft = left;
2363af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mTop = top;
2373af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mRight = right;
2383af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mBottom = bottom;
2393af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            return true;
2403af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        }
2413af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return false;
2423af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
2433af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
2443af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    @LayoutlibDelegate
2453af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    /*package*/ static boolean nIsPivotExplicitlySet(long renderNode) {
2463af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
2473af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return delegate != null && delegate.mPivotExplicitlySet;
2483af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
2493af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
2503af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    @LayoutlibDelegate
2513af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    /*package*/ static boolean nSetPivotX(long renderNode, float pivotX) {
2523af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
2533af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        if (delegate != null) {
2543af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mPivotX = pivotX;
2553af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mPivotExplicitlySet = true;
2563af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            return true;
2573af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        }
2583af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return false;
2593af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
2603af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
2613af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    @LayoutlibDelegate
2623af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    /*package*/ static float nGetPivotX(long renderNode) {
2633af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
2643af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        if (delegate != null) {
2653af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            if (delegate.mPivotExplicitlySet) {
2663af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi                return delegate.mPivotX;
2673af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            } else {
2683af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi                return (delegate.mRight - delegate.mLeft) / 2.0f;
2693af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            }
2703af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        }
2713af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return 0f;
2723af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
2733af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
2743af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    @LayoutlibDelegate
2753af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    /*package*/ static boolean nSetPivotY(long renderNode, float pivotY) {
2763af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
2773af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        if (delegate != null) {
2783af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mPivotY = pivotY;
2793af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mPivotExplicitlySet = true;
2803af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            return true;
2813af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        }
2823af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return false;
2833af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
2843b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi
2853b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    @LayoutlibDelegate
2863b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi    /*package*/ static float nGetPivotY(long renderNode) {
2873b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
2883af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        if (delegate != null) {
2893b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi            if (delegate.mPivotExplicitlySet) {
2903af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi                return delegate.mPivotY;
2913af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            } else {
2923af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi                return (delegate.mBottom - delegate.mTop) / 2.0f;
2933b142e50f4ae068f50f8e3d277e0f19910c67001Jean-Michel Trivi            }
2943af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        }
2953af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return 0f;
2963af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
2973af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi
2983af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    @LayoutlibDelegate
2993af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    /*package*/ static boolean nSetScaleX(long renderNode, float scaleX) {
3003af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
3013af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        if (delegate != null && delegate.mScaleX != scaleX) {
3023af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            delegate.mScaleX = scaleX;
3033af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi            return true;
3043af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        }
3053af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi        return false;
3063af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi    }
307b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi
308b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    @LayoutlibDelegate
309b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    /*package*/ static float nGetScaleX(long renderNode) {
310b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
311b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        if (delegate != null) {
312b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            return delegate.mScaleX;
313b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        }
314b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        return 0f;
315b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    }
316b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi
317b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    @LayoutlibDelegate
318b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    /*package*/ static boolean nSetScaleY(long renderNode, float scaleY) {
319b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
320b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        if (delegate != null && delegate.mScaleY != scaleY) {
321b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            delegate.mScaleY = scaleY;
322b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            return true;
323b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        }
324b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        return false;
325b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    }
326b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi
327b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    @LayoutlibDelegate
328b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    /*package*/ static float nGetScaleY(long renderNode) {
329b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        RenderNode_Delegate delegate = sManager.getDelegate(renderNode);
330b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        if (delegate != null) {
331b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi            return delegate.mScaleY;
332b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        }
333b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi        return 0f;
334b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi    }
335b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi}
336b3e52a63baaea367cf411348b68ecd8fd429b029Jean-Michel Trivi