1ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/*
2ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Copyright (C) 2010 The Android Open Source Project
3ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
4ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * you may not use this file except in compliance with the License.
6ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * You may obtain a copy of the License at
7ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
8ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
10ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * See the License for the specific language governing permissions and
14ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * limitations under the License.
15ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */
16ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
17ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipackage android.graphics;
18ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
19ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.LayoutLog;
20ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.Bridge;
21ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.impl.DelegateManager;
22ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.impl.GcSnapshot;
23ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
24ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
25442aee6bc1abfb143dcfa1ba60d696e576d066c4Deepanshu Guptaimport android.annotation.Nullable;
26ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.graphics.Bitmap.Config;
27ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
28ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.awt.Graphics2D;
29ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.awt.Rectangle;
30ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.awt.geom.AffineTransform;
31ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
32fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Guptaimport libcore.util.NativeAllocationRegistry_Delegate;
33fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta
34ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
35ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/**
36ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Delegate implementing the native methods of android.graphics.Canvas
37ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
38ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Through the layoutlib_create tool, the original native methods of Canvas have been replaced
39ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * by calls to methods of the same name in this delegate class.
40ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
41ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * This class behaves like the original native implementation, but in Java, keeping previously
42ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * native data into its own objects and mapping them to int that are sent back and forth between
43ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * it and the original Canvas class.
44ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
45ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see DelegateManager
46ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski *
47ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */
48989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillardpublic final class Canvas_Delegate extends BaseCanvas_Delegate {
49ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
50ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    // ---- delegate manager ----
51fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta    private static long sFinalizer = -1;
52ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
53ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private DrawFilter_Delegate mDrawFilter = null;
54ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
55ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    // ---- Public Helper methods ----
56ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
57ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
58ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Returns the native delegate associated to a given {@link Canvas} object.
59ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
60ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public static Canvas_Delegate getDelegate(Canvas canvas) {
61989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        return (Canvas_Delegate) sManager.getDelegate(canvas.getNativeCanvasWrapper());
62ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
63ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
64ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
65ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Returns the native delegate associated to a given an int referencing a {@link Canvas} object.
66ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
67ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath    public static Canvas_Delegate getDelegate(long native_canvas) {
68989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        return (Canvas_Delegate) sManager.getDelegate(native_canvas);
69ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
70ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
71ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
72ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Returns the current {@link Graphics2D} used to draw.
73ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
74ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public GcSnapshot getSnapshot() {
75ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mSnapshot;
76ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
77ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
78ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    /**
79ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * Returns the {@link DrawFilter} delegate or null if none have been set.
80ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     *
81ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     * @return the delegate or null.
82ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski     */
83ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    public DrawFilter_Delegate getDrawFilter() {
84ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return mDrawFilter;
85ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
86ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
87ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    // ---- native methods ----
88ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
89ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
907fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    /*package*/ static void nFreeCaches() {
9100774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        // nothing to be done here.
9200774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta    }
9300774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta
9400774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta    @LayoutlibDelegate
957fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    /*package*/ static void nFreeTextLayoutCaches() {
9600774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        // nothing to be done here yet.
9700774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta    }
9800774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta
9900774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta    @LayoutlibDelegate
1007fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    /*package*/ static long nInitRaster(@Nullable Bitmap bitmap) {
1019fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta        long nativeBitmapOrZero = 0;
1029fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta        if (bitmap != null) {
1033f05ee4582c24b84deff038d63e93dc33451f922Diego Perez            nativeBitmapOrZero = bitmap.getNativeInstance();
1049fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta        }
10500774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        if (nativeBitmapOrZero > 0) {
10600774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            // get the Bitmap from the int
10700774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(nativeBitmapOrZero);
10800774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta
10900774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            // create a new Canvas_Delegate with the given bitmap and return its new native int.
11000774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            Canvas_Delegate newDelegate = new Canvas_Delegate(bitmapDelegate);
11100774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta
11200774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            return sManager.addNewDelegate(newDelegate);
11300774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        }
11400774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta
11500774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        // create a new Canvas_Delegate and return its new native int.
11600774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        Canvas_Delegate newDelegate = new Canvas_Delegate();
11700774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta
11800774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        return sManager.addNewDelegate(newDelegate);
11900774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta    }
12000774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta
12100774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta    @LayoutlibDelegate
1227fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static void nSetBitmap(long canvas, Bitmap bitmap) {
123989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(canvas);
12400774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        Bitmap_Delegate bitmapDelegate = Bitmap_Delegate.getDelegate(bitmap);
12500774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        if (canvasDelegate == null || bitmapDelegate==null) {
12600774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            return;
12700774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        }
12800774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        canvasDelegate.mBitmap = bitmapDelegate;
12900774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        canvasDelegate.mSnapshot = GcSnapshot.createDefaultSnapshot(bitmapDelegate);
13000774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta    }
13100774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta
13200774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta    @LayoutlibDelegate
1337fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static boolean nIsOpaque(long nativeCanvas) {
134ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
135989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
136ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
137ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return false;
138ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
139ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
140ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return canvasDelegate.mBitmap.getConfig() == Config.RGB_565;
141ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
142ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
143ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
1447fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static int nGetWidth(long nativeCanvas) {
145ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
146989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
147ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
148ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return 0;
149ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
150ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
151ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return canvasDelegate.mBitmap.getImage().getWidth();
152ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
153ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
154ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
1557fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static int nGetHeight(long nativeCanvas) {
156ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
157989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
158ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
159ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return 0;
160ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
161ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
162ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return canvasDelegate.mBitmap.getImage().getHeight();
163ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
164ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
165ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
1667fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static int nSave(long nativeCanvas, int saveFlags) {
167ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
168989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
169ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
17000774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            return 0;
171ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
172ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
17300774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        return canvasDelegate.save(saveFlags);
174ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
175ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
176ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
1777fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static int nSaveLayer(long nativeCanvas, float l,
17800774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta                                               float t, float r, float b,
17900774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta                                               long paint, int layerFlags) {
180ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
181989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
182ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
18300774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            return 0;
184ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
185ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
18600774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        Paint_Delegate paintDelegate = Paint_Delegate.getDelegate(paint);
18700774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        if (paintDelegate == null) {
18800774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            return 0;
189ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
190ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
19100774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        return canvasDelegate.saveLayer(new RectF(l, t, r, b),
19200774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta                paintDelegate, layerFlags);
193ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
194ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
195ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
1967fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static int nSaveLayerAlpha(long nativeCanvas, float l,
19700774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta                                                    float t, float r, float b,
19800774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta                                                    int alpha, int layerFlags) {
199ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
200989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
201ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
20200774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            return 0;
203ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
204ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
20500774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        return canvasDelegate.saveLayerAlpha(new RectF(l, t, r, b), alpha, layerFlags);
206ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
207ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
208ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
20909b2291d2e2638485bf267642faa76d1e871c864Jerome Gaillard    public static boolean nRestore(long nativeCanvas) {
210ddf486d3a74e0742eabc851e666920d9c0df0ae3Deepanshu Gupta        // FIXME: implement throwOnUnderflow.
211ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
212989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
213ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
21409b2291d2e2638485bf267642faa76d1e871c864Jerome Gaillard            return false;
215ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
216ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
21700774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        canvasDelegate.restore();
21809b2291d2e2638485bf267642faa76d1e871c864Jerome Gaillard        return true;
219ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
220ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
221ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
22209b2291d2e2638485bf267642faa76d1e871c864Jerome Gaillard    public static void nRestoreToCount(long nativeCanvas, int saveCount) {
223ddf486d3a74e0742eabc851e666920d9c0df0ae3Deepanshu Gupta        // FIXME: implement throwOnUnderflow.
224ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
225989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
226ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
227ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return;
228ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
229ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
23000774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        canvasDelegate.restoreTo(saveCount);
231ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
232ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
233ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
2347fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static int nGetSaveCount(long nativeCanvas) {
235ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
236989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
237ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
238ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return 0;
239ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
240ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
241ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return canvasDelegate.getSnapshot().size();
242ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
243ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
244ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
2457fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard   public static void nTranslate(long nativeCanvas, float dx, float dy) {
246ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
247989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
248ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
249ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return;
250ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
251ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
25200774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        canvasDelegate.getSnapshot().translate(dx, dy);
253ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
254ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
255ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
2567fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard       public static void nScale(long nativeCanvas, float sx, float sy) {
25700774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            // get the delegate from the native int.
258989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard            Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
25900774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            if (canvasDelegate == null) {
26000774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta                return;
26100774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            }
262ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
26300774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            canvasDelegate.getSnapshot().scale(sx, sy);
264ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
265ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
266ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
2677fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static void nRotate(long nativeCanvas, float degrees) {
268ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
269989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
27000774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        if (canvasDelegate == null) {
271f587825e94af5200aadc77a86e9f5084ac1a4e94Deepanshu Gupta            return;
272ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
27300774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta
27400774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        canvasDelegate.getSnapshot().rotate(Math.toRadians(degrees));
275ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
276ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
277ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
2787fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard   public static void nSkew(long nativeCanvas, float kx, float ky) {
279ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
280989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
281ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
28200774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta            return;
283ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
284ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
28500774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        // get the current top graphics2D object.
28600774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        GcSnapshot g = canvasDelegate.getSnapshot();
287ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
28800774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        // get its current matrix
28900774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        AffineTransform currentTx = g.getTransform();
29000774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        // get the AffineTransform for the given skew.
29100774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        float[] mtx = Matrix_Delegate.getSkew(kx, ky);
29200774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        AffineTransform matrixTx = Matrix_Delegate.getAffineTransform(mtx);
293ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
29400774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        // combine them so that the given matrix is applied after.
29500774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        currentTx.preConcatenate(matrixTx);
296ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
29700774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        // give it to the graphics2D as a new matrix replacing all previous transform
29800774ed34f31ee4161b38b2c7de421ff8a8061c0Deepanshu Gupta        g.setTransform(currentTx);
299ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
300ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
301ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
3027fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static void nConcat(long nCanvas, long nMatrix) {
303ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
304989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nCanvas);
305ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
306ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return;
307ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
308ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
309ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(nMatrix);
310ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (matrixDelegate == null) {
311ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return;
312ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
313ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
314ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the current top graphics2D object.
315ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        GcSnapshot snapshot = canvasDelegate.getSnapshot();
316ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
317ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get its current matrix
318ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        AffineTransform currentTx = snapshot.getTransform();
319ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the AffineTransform of the given matrix
320ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        AffineTransform matrixTx = matrixDelegate.getAffineTransform();
321ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
322ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // combine them so that the given matrix is applied after.
323ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        currentTx.concatenate(matrixTx);
324ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
325ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // give it to the graphics2D as a new matrix replacing all previous transform
326ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        snapshot.setTransform(currentTx);
327ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
328ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
329ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
3307fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static void nSetMatrix(long nCanvas, long nMatrix) {
331ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
332989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nCanvas);
333ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
334ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return;
335ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
336ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
337ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(nMatrix);
338ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (matrixDelegate == null) {
339ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return;
340ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
341ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
342ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the current top graphics2D object.
343ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        GcSnapshot snapshot = canvasDelegate.getSnapshot();
344ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
345ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the AffineTransform of the given matrix
346ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        AffineTransform matrixTx = matrixDelegate.getAffineTransform();
347ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
348ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // give it to the graphics2D as a new matrix replacing all previous transform
349ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        snapshot.setTransform(matrixTx);
350ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
351ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (matrixDelegate.hasPerspective()) {
352ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            assert false;
353ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_AFFINE,
354ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    "android.graphics.Canvas#setMatrix(android.graphics.Matrix) only " +
355ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    "supports affine transformations.", null, null /*data*/);
356ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
357ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
358ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
359ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
3607fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static boolean nClipRect(long nCanvas,
361ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                                                  float left, float top,
362ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                                                  float right, float bottom,
363ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                                                  int regionOp) {
364ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
365989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nCanvas);
366ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
367ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return false;
368ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
369ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
370ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return canvasDelegate.clipRect(left, top, right, bottom, regionOp);
371ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
372ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
373ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
3747fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static boolean nClipPath(long nativeCanvas,
375ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath                                                  long nativePath,
376ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                                                  int regionOp) {
377989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
378ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
379ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return true;
380ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
381ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
382ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        Path_Delegate pathDelegate = Path_Delegate.getDelegate(nativePath);
383ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (pathDelegate == null) {
384ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return true;
385ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
386ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
387ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return canvasDelegate.mSnapshot.clip(pathDelegate.getJavaShape(), regionOp);
388ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
389ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
390ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
3917fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static void nSetDrawFilter(long nativeCanvas, long nativeFilter) {
392989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
393ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
394ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return;
395ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
396ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
397ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        canvasDelegate.mDrawFilter = DrawFilter_Delegate.getDelegate(nativeFilter);
398ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
3999fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta        if (canvasDelegate.mDrawFilter != null && !canvasDelegate.mDrawFilter.isSupported()) {
400ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            Bridge.getLog().fidelityWarning(LayoutLog.TAG_DRAWFILTER,
401ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                    canvasDelegate.mDrawFilter.getSupportMessage(), null, null /*data*/);
402ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
403ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
404ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
405ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
4067fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static boolean nGetClipBounds(long nativeCanvas,
407ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                                                       Rect bounds) {
408ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
409989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(nativeCanvas);
410ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
411ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return false;
412ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
413ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
414ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        Rectangle rect = canvasDelegate.getSnapshot().getClip().getBounds();
4159fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta        if (rect != null && !rect.isEmpty()) {
416ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            bounds.left = rect.x;
417ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            bounds.top = rect.y;
418ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            bounds.right = rect.x + rect.width;
419ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            bounds.bottom = rect.y + rect.height;
420ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return true;
421ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
422ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
423ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return false;
424ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
425ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
426ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
42709b2291d2e2638485bf267642faa76d1e871c864Jerome Gaillard    public static void nGetMatrix(long canvas, long matrix) {
428ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // get the delegate from the native int.
429989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        Canvas_Delegate canvasDelegate = Canvas_Delegate.getDelegate(canvas);
430ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (canvasDelegate == null) {
431ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return;
432ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
433ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
434ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        Matrix_Delegate matrixDelegate = Matrix_Delegate.getDelegate(matrix);
435ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        if (matrixDelegate == null) {
436ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski            return;
437ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
438ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
439ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        AffineTransform transform = canvasDelegate.getSnapshot().getTransform();
440ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        matrixDelegate.set(Matrix_Delegate.makeValues(transform));
441ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
442ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
443ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
4447fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static boolean nQuickReject(long nativeCanvas, long path) {
445ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // FIXME properly implement quickReject
446ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return false;
447ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
448ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
449ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
4507fa71f524c86d6224fb95b571d3a9e32edb32f22Jerome Gaillard    public static boolean nQuickReject(long nativeCanvas,
451ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                                                     float left, float top,
452ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski                                                     float right, float bottom) {
453ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        // FIXME properly implement quickReject
454ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        return false;
455ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
456ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
457ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    @LayoutlibDelegate
458989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard    /*package*/ static long nGetNativeFinalizer() {
459fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta        synchronized (Canvas_Delegate.class) {
460fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta            if (sFinalizer == -1) {
461fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta                sFinalizer = NativeAllocationRegistry_Delegate.createFinalizer(nativePtr -> {
462989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard                    Canvas_Delegate delegate = Canvas_Delegate.getDelegate(nativePtr);
463fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta                    if (delegate != null) {
464fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta                        delegate.dispose();
465fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta                    }
466fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta                    sManager.removeJavaReferenceFor(nativePtr);
467fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta                });
468fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta            }
469ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski        }
470fbe158f5e1f77cea2a335834a1c91fea1c4680aaDeepanshu Gupta        return sFinalizer;
471ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
472ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
47398019652d24a92fa80af9353438dbb3ec63cc03cJerome Gaillard    @LayoutlibDelegate
47498019652d24a92fa80af9353438dbb3ec63cc03cJerome Gaillard    /*package*/ static void nSetCompatibilityVersion(int apiLevel) {
47598019652d24a92fa80af9353438dbb3ec63cc03cJerome Gaillard        // Unsupported by layoutlib, do nothing
47698019652d24a92fa80af9353438dbb3ec63cc03cJerome Gaillard    }
47798019652d24a92fa80af9353438dbb3ec63cc03cJerome Gaillard
478ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private Canvas_Delegate(Bitmap_Delegate bitmap) {
479989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        super(bitmap);
480ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
481ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
482ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    private Canvas_Delegate() {
483989f4cb6da0c1d20f74a278878bc173c690d0848Jerome Gaillard        super();
484ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski    }
485ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski}
486ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski
487