14b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet/* 24b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Copyright (C) 2010 The Android Open Source Project 34b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 44b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License"); 54b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * you may not use this file except in compliance with the License. 64b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * You may obtain a copy of the License at 74b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 84b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * http://www.apache.org/licenses/LICENSE-2.0 94b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 104b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software 114b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS, 124b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * See the License for the specific language governing permissions and 144b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * limitations under the License. 154b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet */ 164b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 174b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetpackage android.graphics; 184b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 194b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.ide.common.rendering.api.LayoutLog; 204b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.layoutlib.bridge.Bridge; 214b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager; 224b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 234b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 244b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport android.os.Parcel; 254b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 264b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport java.awt.Rectangle; 274b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport java.awt.Shape; 284b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport java.awt.geom.AffineTransform; 294b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport java.awt.geom.Area; 304b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport java.awt.geom.Rectangle2D; 314b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 324b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet/** 334b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Region 344b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 354b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Region have been replaced 364b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * by calls to methods of the same name in this delegate class. 374b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 384b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously 394b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between 404b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * it and the original Region class. 414b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 424b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * This also serve as a base class for all Region delegate classes. 434b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 444b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * @see DelegateManager 454b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 464b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet */ 474b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetpublic class Region_Delegate { 484b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 494b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- delegate manager ---- 504b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet protected static final DelegateManager<Region_Delegate> sManager = 514b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet new DelegateManager<Region_Delegate>(Region_Delegate.class); 524b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 534b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- delegate helper data ---- 544b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 554b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- delegate data ---- 564b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet private Area mArea = new Area(); 574b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 584b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- Public Helper methods ---- 594b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 604b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet public static Region_Delegate getDelegate(int nativeShader) { 614b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return sManager.getDelegate(nativeShader); 624b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 634b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 644b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet public Area getJavaArea() { 654b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return mArea; 664b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 674b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 684b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /** 694b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Combines two {@link Shape} into another one (actually an {@link Area}), according 704b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * to the given {@link Region.Op}. 714b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 724b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * If the Op is not one that combines two shapes, then this return null 734b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 744b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * @param shape1 the firt shape to combine which can be null if there's no original clip. 754b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * @param shape2 the 2nd shape to combine 764b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * @param regionOp the operande for the combine 774b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * @return a new area or null. 784b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet */ 794b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet public static Area combineShapes(Shape shape1, Shape shape2, int regionOp) { 804b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionOp == Region.Op.DIFFERENCE.nativeInt) { 814b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // if shape1 is null (empty), then the result is null. 824b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (shape1 == null) { 834b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return null; 844b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 854b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 864b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // result is always a new area. 874b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Area result = new Area(shape1); 884b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet result.subtract(shape2 instanceof Area ? (Area) shape2 : new Area(shape2)); 894b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return result; 904b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 914b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } else if (regionOp == Region.Op.INTERSECT.nativeInt) { 924b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // if shape1 is null, then the result is simply shape2. 934b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (shape1 == null) { 944b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return new Area(shape2); 954b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 964b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 974b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // result is always a new area. 984b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Area result = new Area(shape1); 994b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet result.intersect(shape2 instanceof Area ? (Area) shape2 : new Area(shape2)); 1004b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return result; 1014b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1024b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } else if (regionOp == Region.Op.UNION.nativeInt) { 1034b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // if shape1 is null, then the result is simply shape2. 1044b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (shape1 == null) { 1054b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return new Area(shape2); 1064b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1074b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1084b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // result is always a new area. 1094b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Area result = new Area(shape1); 1104b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet result.add(shape2 instanceof Area ? (Area) shape2 : new Area(shape2)); 1114b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return result; 1124b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1134b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } else if (regionOp == Region.Op.XOR.nativeInt) { 1144b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // if shape1 is null, then the result is simply shape2 1154b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (shape1 == null) { 1164b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return new Area(shape2); 1174b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1184b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1194b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // result is always a new area. 1204b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Area result = new Area(shape1); 1214b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet result.exclusiveOr(shape2 instanceof Area ? (Area) shape2 : new Area(shape2)); 1224b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return result; 1234b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1244b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } else if (regionOp == Region.Op.REVERSE_DIFFERENCE.nativeInt) { 1254b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // result is always a new area. 1264b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Area result = new Area(shape2); 1274b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1284b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (shape1 != null) { 1294b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet result.subtract(shape1 instanceof Area ? (Area) shape1 : new Area(shape1)); 1304b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1314b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1324b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return result; 1334b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1344b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1354b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return null; 1364b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1374b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1384b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- native methods ---- 1394b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1404b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 1414b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean isEmpty(Region thisRegion) { 1424b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); 1434b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionDelegate == null) { 1444b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 1454b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1464b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1474b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return regionDelegate.mArea.isEmpty(); 1484b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1494b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1504b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 1514b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean isRect(Region thisRegion) { 1524b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); 1534b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionDelegate == null) { 1544b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 1554b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1564b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1574b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return regionDelegate.mArea.isRectangular(); 1584b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1594b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1604b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 1614b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean isComplex(Region thisRegion) { 1624b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); 1634b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionDelegate == null) { 1644b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 1654b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1664b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1674b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return regionDelegate.mArea.isSingular() == false; 1684b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1694b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1704b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 1714b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean contains(Region thisRegion, int x, int y) { 1724b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); 1734b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionDelegate == null) { 1744b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 1754b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1764b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1774b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return regionDelegate.mArea.contains(x, y); 1784b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1794b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1804b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 1814b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean quickContains(Region thisRegion, 1824b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet int left, int top, int right, int bottom) { 1834b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); 1844b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionDelegate == null) { 1854b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 1864b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1874b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1884b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return regionDelegate.mArea.isRectangular() && 1894b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet regionDelegate.mArea.contains(left, top, right - left, bottom - top); 1904b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1914b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1924b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 1934b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean quickReject(Region thisRegion, 1944b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet int left, int top, int right, int bottom) { 1954b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); 1964b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionDelegate == null) { 1974b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 1984b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1994b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2004b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return regionDelegate.mArea.isEmpty() || 2014b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet regionDelegate.mArea.intersects(left, top, right - left, bottom - top) == false; 2024b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2034b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2044b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 2054b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean quickReject(Region thisRegion, Region rgn) { 2064b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); 2074b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionDelegate == null) { 2084b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 2094b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2104b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2114b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate targetRegionDelegate = sManager.getDelegate(rgn.mNativeRegion); 2124b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (targetRegionDelegate == null) { 2134b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 2144b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2154b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2164b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return regionDelegate.mArea.isEmpty() || 2174b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet regionDelegate.mArea.getBounds().intersects( 2184b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet targetRegionDelegate.mArea.getBounds()) == false; 2194b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2204b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2214b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2224b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 2234b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static void translate(Region thisRegion, int dx, int dy, Region dst) { 2244b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); 2254b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionDelegate == null) { 2264b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return; 2274b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2284b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2294b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate targetRegionDelegate = sManager.getDelegate(dst.mNativeRegion); 2304b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (targetRegionDelegate == null) { 2314b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return; 2324b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2334b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2344b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionDelegate.mArea.isEmpty()) { 2354b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet targetRegionDelegate.mArea = new Area(); 2364b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } else { 2374b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet targetRegionDelegate.mArea = new Area(regionDelegate.mArea); 2384b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet AffineTransform mtx = new AffineTransform(); 2394b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet mtx.translate(dx, dy); 2404b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet targetRegionDelegate.mArea.transform(mtx); 2414b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2424b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2434b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2444b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 2454b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static void scale(Region thisRegion, float scale, Region dst) { 2464b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion); 2474b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionDelegate == null) { 2484b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return; 2494b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2504b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2514b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate targetRegionDelegate = sManager.getDelegate(dst.mNativeRegion); 2524b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (targetRegionDelegate == null) { 2534b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return; 2544b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2554b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2564b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (regionDelegate.mArea.isEmpty()) { 2574b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet targetRegionDelegate.mArea = new Area(); 2584b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } else { 2594b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet targetRegionDelegate.mArea = new Area(regionDelegate.mArea); 2604b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet AffineTransform mtx = new AffineTransform(); 2614b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet mtx.scale(scale, scale); 2624b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet targetRegionDelegate.mArea.transform(mtx); 2634b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2644b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2654b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2664b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 2674b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static int nativeConstructor() { 2684b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate newDelegate = new Region_Delegate(); 2694b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return sManager.addNewDelegate(newDelegate); 2704b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2714b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2724b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 2734b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static void nativeDestructor(int native_region) { 2744b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet sManager.removeJavaReferenceFor(native_region); 2754b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2764b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2774b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 2784b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean nativeSetRegion(int native_dst, int native_src) { 2794b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate dstRegion = sManager.getDelegate(native_dst); 2804b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (dstRegion == null) { 2814b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 2824b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2834b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2844b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate srcRegion = sManager.getDelegate(native_src); 2854b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (srcRegion == null) { 2864b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 2874b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2884b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2894b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet dstRegion.mArea.reset(); 2904b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet dstRegion.mArea.add(srcRegion.mArea); 2914b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2924b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 2934b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 2944b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 2954b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 2964b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean nativeSetRect(int native_dst, 2974b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet int left, int top, int right, int bottom) { 2984b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate dstRegion = sManager.getDelegate(native_dst); 2994b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (dstRegion == null) { 3004b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 3014b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3024b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3034b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet dstRegion.mArea = new Area(new Rectangle2D.Float(left, top, right - left, bottom - top)); 3044b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return dstRegion.mArea.getBounds().isEmpty() == false; 3054b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3064b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3074b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 3084b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean nativeSetPath(int native_dst, int native_path, int native_clip) { 3094b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate dstRegion = sManager.getDelegate(native_dst); 3104b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (dstRegion == null) { 3114b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 3124b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3134b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3144b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Path_Delegate path = Path_Delegate.getDelegate(native_path); 3154b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (path == null) { 3164b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 3174b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3184b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3194b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet dstRegion.mArea = new Area(path.getJavaShape()); 3204b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3214b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate clip = sManager.getDelegate(native_clip); 3224b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (clip != null) { 3234b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet dstRegion.mArea.subtract(clip.getJavaArea()); 3244b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3254b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3264b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return dstRegion.mArea.getBounds().isEmpty() == false; 3274b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3284b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3294b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 3304b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean nativeGetBounds(int native_region, Rect rect) { 3314b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate region = sManager.getDelegate(native_region); 3324b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (region == null) { 3334b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 3344b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3354b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3364b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Rectangle bounds = region.mArea.getBounds(); 3374b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (bounds.isEmpty()) { 3384b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet rect.left = rect.top = rect.right = rect.bottom = 0; 3394b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 3404b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3414b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3424b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet rect.left = bounds.x; 3434b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet rect.top = bounds.y; 3444b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet rect.right = bounds.x + bounds.width; 3454b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet rect.bottom = bounds.y + bounds.height; 3464b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 3474b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3484b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3494b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 3504b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean nativeGetBoundaryPath(int native_region, int native_path) { 3514b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate region = sManager.getDelegate(native_region); 3524b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (region == null) { 3534b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 3544b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3554b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3564b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Path_Delegate path = Path_Delegate.getDelegate(native_path); 3574b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (path == null) { 3584b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 3594b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3604b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3614b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (region.mArea.isEmpty()) { 3624b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet path.reset(); 3634b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 3644b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3654b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3664b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet path.setPathIterator(region.mArea.getPathIterator(new AffineTransform())); 3674b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 3684b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3694b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3704b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 3714b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean nativeOp(int native_dst, 3724b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet int left, int top, int right, int bottom, int op) { 3734b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate region = sManager.getDelegate(native_dst); 3744b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (region == null) { 3754b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 3764b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3774b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3784b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet region.mArea = combineShapes(region.mArea, 3794b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet new Rectangle2D.Float(left, top, right - left, bottom - top), op); 3804b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3814b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet assert region.mArea != null; 3824b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (region.mArea != null) { 3834b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet region.mArea = new Area(); 3844b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3854b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3864b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return region.mArea.getBounds().isEmpty() == false; 3874b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3884b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3894b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 3904b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean nativeOp(int native_dst, Rect rect, int native_region, int op) { 3914b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate region = sManager.getDelegate(native_dst); 3924b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (region == null) { 3934b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 3944b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 3954b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3964b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet region.mArea = combineShapes(region.mArea, 3974b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet new Rectangle2D.Float(rect.left, rect.top, rect.width(), rect.height()), op); 3984b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 3994b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet assert region.mArea != null; 4004b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (region.mArea != null) { 4014b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet region.mArea = new Area(); 4024b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4034b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4044b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return region.mArea.getBounds().isEmpty() == false; 4054b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4064b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4074b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 4084b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean nativeOp(int native_dst, 4094b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet int native_region1, int native_region2, int op) { 4104b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate dstRegion = sManager.getDelegate(native_dst); 4114b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (dstRegion == null) { 4124b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return true; 4134b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4144b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4154b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate region1 = sManager.getDelegate(native_region1); 4164b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (region1 == null) { 4174b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 4184b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4194b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4204b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate region2 = sManager.getDelegate(native_region2); 4214b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (region2 == null) { 4224b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 4234b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4244b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4254b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet dstRegion.mArea = combineShapes(region1.mArea, region2.mArea, op); 4264b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4274b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet assert dstRegion.mArea != null; 4284b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (dstRegion.mArea != null) { 4294b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet dstRegion.mArea = new Area(); 4304b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4314b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4324b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return dstRegion.mArea.getBounds().isEmpty() == false; 4334b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4344b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4354b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4364b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 4374b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static int nativeCreateFromParcel(Parcel p) { 4384b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // This is only called by Region.CREATOR (Parcelable.Creator<Region>), which is only 4394b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // used during aidl call so really this should not be called. 4404b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, 4414b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet "AIDL is not suppored, and therefore Regions cannot be created from parcels.", 4424b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet null /*data*/); 4434b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return 0; 4444b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4454b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4464b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 4474b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean nativeWriteToParcel(int native_region, 4484b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Parcel p) { 4494b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // This is only called when sending a region through aidl, so really this should not 4504b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // be called. 4514b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, 4524b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet "AIDL is not suppored, and therefore Regions cannot be written to parcels.", 4534b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet null /*data*/); 4544b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 4554b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4564b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4574b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 4584b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /*package*/ static boolean nativeEquals(int native_r1, int native_r2) { 4594b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate region1 = sManager.getDelegate(native_r1); 4604b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (region1 == null) { 4614b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 4624b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4634b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4644b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Region_Delegate region2 = sManager.getDelegate(native_r2); 4654b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (region2 == null) { 4664b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return false; 4674b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4684b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4694b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return region1.mArea.equals(region2.mArea); 4704b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 4714b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4724b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- Private delegate/helper methods ---- 4734b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 4744b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet} 475