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