1b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet/*
2b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * Copyright (C) 2010 The Android Open Source Project
3b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet *
4b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License");
5b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * you may not use this file except in compliance with the License.
6b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * You may obtain a copy of the License at
7b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet *
8b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet *      http://www.apache.org/licenses/LICENSE-2.0
9b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet *
10b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software
11b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
12b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * See the License for the specific language governing permissions and
14b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * limitations under the License.
15b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet */
16b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
17b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetpackage android.graphics;
18b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
19918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohetimport com.android.ide.common.rendering.api.LayoutLog;
20b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport com.android.layoutlib.bridge.Bridge;
21b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager;
229a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohetimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
23b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
24b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport android.os.Parcel;
25b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
26b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Rectangle;
27b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.Shape;
28b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.geom.AffineTransform;
29b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.geom.Area;
30b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetimport java.awt.geom.Rectangle2D;
31b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
32b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet/**
33b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Region
34b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet *
35b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Region have been replaced
36b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * by calls to methods of the same name in this delegate class.
37b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet *
38b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously
39b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between
40b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * it and the original Region class.
41b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet *
42b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * This also serve as a base class for all Region delegate classes.
43b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet *
44b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet * @see DelegateManager
45b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet *
46b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet */
47b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohetpublic class Region_Delegate {
48b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
49b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    // ---- delegate manager ----
50b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    protected static final DelegateManager<Region_Delegate> sManager =
51f0a53435f14d23d9555fc46014352ee6a7baa647Xavier Ducrohet            new DelegateManager<Region_Delegate>(Region_Delegate.class);
52b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
53b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    // ---- delegate helper data ----
54b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
55b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    // ---- delegate data ----
56b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    private Area mArea = new Area();
57b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
58b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    // ---- Public Helper methods ----
59b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
60b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    public static Region_Delegate getDelegate(int nativeShader) {
61b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return sManager.getDelegate(nativeShader);
62b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
63b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
64b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    public Area getJavaArea() {
65b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return mArea;
66b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
67b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
68b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /**
69b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet     * Combines two {@link Shape} into another one (actually an {@link Area}), according
70b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet     * to the given {@link Region.Op}.
71b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet     *
72b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet     * If the Op is not one that combines two shapes, then this return null
73b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet     *
74a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet     * @param shape1 the firt shape to combine which can be null if there's no original clip.
75b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet     * @param shape2 the 2nd shape to combine
76b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet     * @param regionOp the operande for the combine
77b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet     * @return a new area or null.
78b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet     */
79b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    public static Area combineShapes(Shape shape1, Shape shape2, int regionOp) {
80b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (regionOp == Region.Op.DIFFERENCE.nativeInt) {
81a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            // if shape1 is null (empty), then the result is null.
82a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            if (shape1 == null) {
83a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet                return null;
84a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            }
85a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet
86b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            // result is always a new area.
87b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            Area result = new Area(shape1);
88b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            result.subtract(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
89b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return result;
90b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
91b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        } else if (regionOp == Region.Op.INTERSECT.nativeInt) {
92a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            // if shape1 is null, then the result is simply shape2.
93a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            if (shape1 == null) {
94a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet                return new Area(shape2);
95a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            }
96a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet
97b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            // result is always a new area.
98b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            Area result = new Area(shape1);
99b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            result.intersect(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
100b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return result;
101b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
102b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        } else if (regionOp == Region.Op.UNION.nativeInt) {
103a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            // if shape1 is null, then the result is simply shape2.
104a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            if (shape1 == null) {
105a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet                return new Area(shape2);
106a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            }
107a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet
108b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            // result is always a new area.
109b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            Area result = new Area(shape1);
110b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            result.add(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
111b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return result;
112b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
113b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        } else if (regionOp == Region.Op.XOR.nativeInt) {
114a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            // if shape1 is null, then the result is simply shape2
115a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            if (shape1 == null) {
116a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet                return new Area(shape2);
117a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            }
118a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet
119b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            // result is always a new area.
120b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            Area result = new Area(shape1);
121b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            result.exclusiveOr(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
122a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            return result;
123b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
124b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        } else if (regionOp == Region.Op.REVERSE_DIFFERENCE.nativeInt) {
125b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            // result is always a new area.
126b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            Area result = new Area(shape2);
127a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet
128a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            if (shape1 != null) {
129a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet                result.subtract(shape1 instanceof Area ? (Area) shape1 : new Area(shape1));
130a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet            }
131a7cac5e0542779cadf0f5ccf71584e4b4425f7a6Xavier Ducrohet
132b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return result;
133b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
134b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
135b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return null;
136b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
137b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
138b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    // ---- native methods ----
139b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
1409a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1410de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    /*package*/ static boolean isEmpty(Region thisRegion) {
1420de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
1430de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (regionDelegate == null) {
1440de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return true;
1450de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
1460de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
1470de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        return regionDelegate.mArea.isEmpty();
1480de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    }
1490de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
1509a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1510de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    /*package*/ static boolean isRect(Region thisRegion) {
1520de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
1530de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (regionDelegate == null) {
1540de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return true;
1550de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
1560de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
1570de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        return regionDelegate.mArea.isRectangular();
1580de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    }
1590de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
1609a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1610de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    /*package*/ static boolean isComplex(Region thisRegion) {
1620de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
1630de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (regionDelegate == null) {
1640de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return true;
1650de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
1660de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
1670de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        return regionDelegate.mArea.isSingular() == false;
1680de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    }
1690de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
1709a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1710de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    /*package*/ static boolean contains(Region thisRegion, int x, int y) {
1720de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
1730de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (regionDelegate == null) {
1740de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return false;
1750de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
1760de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
1770de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        return regionDelegate.mArea.contains(x, y);
1780de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    }
1790de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
1809a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1810de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    /*package*/ static boolean quickContains(Region thisRegion,
1820de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            int left, int top, int right, int bottom) {
1830de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
1840de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (regionDelegate == null) {
1850de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return false;
1860de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
1870de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
1880de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        return regionDelegate.mArea.isRectangular() &&
1890de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet                regionDelegate.mArea.contains(left, top, right - left, bottom - top);
1900de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    }
1910de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
1929a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
1930de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    /*package*/ static boolean quickReject(Region thisRegion,
1940de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            int left, int top, int right, int bottom) {
1950de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
1960de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (regionDelegate == null) {
1970de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return false;
1980de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
1990de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2000de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        return regionDelegate.mArea.isEmpty() ||
2010de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet                regionDelegate.mArea.intersects(left, top, right - left, bottom - top) == false;
2020de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    }
2030de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2049a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2050de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    /*package*/ static boolean quickReject(Region thisRegion, Region rgn) {
2060de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
2070de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (regionDelegate == null) {
2080de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return false;
2090de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
2100de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2110de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate targetRegionDelegate = sManager.getDelegate(rgn.mNativeRegion);
2120de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (targetRegionDelegate == null) {
2130de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return false;
2140de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
2150de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2160de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        return regionDelegate.mArea.isEmpty() ||
2170de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet                regionDelegate.mArea.getBounds().intersects(
2180de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet                        targetRegionDelegate.mArea.getBounds()) == false;
2190de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2200de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    }
2210de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2229a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2230de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    /*package*/ static void translate(Region thisRegion, int dx, int dy, Region dst) {
2240de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
2250de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (regionDelegate == null) {
2260de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return;
2270de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
2280de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2290de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate targetRegionDelegate = sManager.getDelegate(dst.mNativeRegion);
2300de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (targetRegionDelegate == null) {
2310de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return;
2320de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
2330de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2340de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (regionDelegate.mArea.isEmpty()) {
2350de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            targetRegionDelegate.mArea = new Area();
2360de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        } else {
2370de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            targetRegionDelegate.mArea = new Area(regionDelegate.mArea);
2380de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            AffineTransform mtx = new AffineTransform();
2390de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            mtx.translate(dx, dy);
2400de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            targetRegionDelegate.mArea.transform(mtx);
2410de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
2420de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    }
2430de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2449a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
2450de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    /*package*/ static void scale(Region thisRegion, float scale, Region dst) {
2460de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
2470de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (regionDelegate == null) {
2480de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return;
2490de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
2500de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2510de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        Region_Delegate targetRegionDelegate = sManager.getDelegate(dst.mNativeRegion);
2520de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (targetRegionDelegate == null) {
2530de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            return;
2540de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
2550de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2560de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        if (regionDelegate.mArea.isEmpty()) {
2570de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            targetRegionDelegate.mArea = new Area();
2580de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        } else {
2590de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            targetRegionDelegate.mArea = new Area(regionDelegate.mArea);
2600de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            AffineTransform mtx = new AffineTransform();
2610de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            mtx.scale(scale, scale);
2620de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet            targetRegionDelegate.mArea.transform(mtx);
2630de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet        }
2640de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet    }
2650de16070935adb8656d646b8c69a362652db7443Xavier Ducrohet
2669a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
267b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static int nativeConstructor() {
268b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate newDelegate = new Region_Delegate();
269cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        return sManager.addNewDelegate(newDelegate);
270b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
271b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
2729a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
273b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static void nativeDestructor(int native_region) {
274cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        sManager.removeJavaReferenceFor(native_region);
275b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
276b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
2779a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
278b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static boolean nativeSetRegion(int native_dst, int native_src) {
279b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
280b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (dstRegion == null) {
281b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
282b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
283b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
284b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate srcRegion = sManager.getDelegate(native_src);
285b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (srcRegion == null) {
286b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
287b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
288b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
289b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        dstRegion.mArea.reset();
290b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        dstRegion.mArea.add(srcRegion.mArea);
291b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
292b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return true;
293b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
294b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
2959a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
296b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static boolean nativeSetRect(int native_dst,
297b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            int left, int top, int right, int bottom) {
298b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
299b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (dstRegion == null) {
300b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
301b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
302b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
303b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        dstRegion.mArea = new Area(new Rectangle2D.Float(left, top, right - left, bottom - top));
304b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return dstRegion.mArea.getBounds().isEmpty() == false;
305b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
306b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
3079a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
308b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static boolean nativeSetPath(int native_dst, int native_path, int native_clip) {
309b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
310b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (dstRegion == null) {
311b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
312b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
313b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
314b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Path_Delegate path = Path_Delegate.getDelegate(native_path);
315b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (path == null) {
316b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
317b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
318b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
319b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        dstRegion.mArea = new Area(path.getJavaShape());
320b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
321b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate clip = sManager.getDelegate(native_clip);
322b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (clip != null) {
323b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            dstRegion.mArea.subtract(clip.getJavaArea());
324b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
325b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
326b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return dstRegion.mArea.getBounds().isEmpty() == false;
327b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
328b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
3299a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
330b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static boolean nativeGetBounds(int native_region, Rect rect) {
331b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate region = sManager.getDelegate(native_region);
332b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (region == null) {
333b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
334b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
335b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
336b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Rectangle bounds = region.mArea.getBounds();
337b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (bounds.isEmpty()) {
338b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            rect.left = rect.top = rect.right = rect.bottom = 0;
339b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
340b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
341b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
342b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        rect.left = bounds.x;
343b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        rect.top = bounds.y;
344b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        rect.right = bounds.x + bounds.width;
345b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        rect.bottom = bounds.y + bounds.height;
346b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return true;
347b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
348b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
3499a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
350b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static boolean nativeGetBoundaryPath(int native_region, int native_path) {
351b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate region = sManager.getDelegate(native_region);
352b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (region == null) {
353b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
354b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
355b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
356b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Path_Delegate path = Path_Delegate.getDelegate(native_path);
357b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (path == null) {
358b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
359b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
360b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
361b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (region.mArea.isEmpty()) {
362b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            path.reset();
363b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
364b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
365b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
366b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        path.setPathIterator(region.mArea.getPathIterator(new AffineTransform()));
367b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return true;
368b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
369b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
3709a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
371b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static boolean nativeOp(int native_dst,
372b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            int left, int top, int right, int bottom, int op) {
373b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate region = sManager.getDelegate(native_dst);
374b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (region == null) {
375b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
376b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
377b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
378b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        region.mArea = combineShapes(region.mArea,
379b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                new Rectangle2D.Float(left, top, right - left, bottom - top), op);
380b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
381b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        assert region.mArea != null;
382b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (region.mArea != null) {
383b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            region.mArea = new Area();
384b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
385b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
386b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return region.mArea.getBounds().isEmpty() == false;
387b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
388b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
3899a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
390b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static boolean nativeOp(int native_dst, Rect rect, int native_region, int op) {
391b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate region = sManager.getDelegate(native_dst);
392b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (region == null) {
393b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
394b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
395b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
396b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        region.mArea = combineShapes(region.mArea,
397b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                new Rectangle2D.Float(rect.left, rect.top, rect.width(), rect.height()), op);
398b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
399b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        assert region.mArea != null;
400b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (region.mArea != null) {
401b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            region.mArea = new Area();
402b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
403b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
404b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return region.mArea.getBounds().isEmpty() == false;
405b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
406b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
4079a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
408b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static boolean nativeOp(int native_dst,
409b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            int native_region1, int native_region2, int op) {
410b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
411b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (dstRegion == null) {
412b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return true;
413b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
414b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
415b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate region1 = sManager.getDelegate(native_region1);
416b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (region1 == null) {
417b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
418b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
419b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
420b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate region2 = sManager.getDelegate(native_region2);
421b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (region2 == null) {
422b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
423b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
424b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
425b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        dstRegion.mArea = combineShapes(region1.mArea, region2.mArea, op);
426b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
427b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        assert dstRegion.mArea != null;
428b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (dstRegion.mArea != null) {
429b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            dstRegion.mArea = new Area();
430b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
431b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
432b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return dstRegion.mArea.getBounds().isEmpty() == false;
433b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
434b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
435b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
4369a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
437b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static int nativeCreateFromParcel(Parcel p) {
438b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        // This is only called by Region.CREATOR (Parcelable.Creator<Region>), which is only
439b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        // used during aidl call so really this should not be called.
440918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet        Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
44151a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                "AIDL is not suppored, and therefore Regions cannot be created from parcels.",
44251a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                null /*data*/);
443b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return 0;
444b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
445b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
4469a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
447b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static boolean nativeWriteToParcel(int native_region,
448b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet                                                      Parcel p) {
449b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        // This is only called when sending a region through aidl, so really this should not
450b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        // be called.
451918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet        Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
45251a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                "AIDL is not suppored, and therefore Regions cannot be written to parcels.",
45351a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet                null /*data*/);
454b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return false;
455b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
456b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
4579a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
458b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    /*package*/ static boolean nativeEquals(int native_r1, int native_r2) {
459b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate region1 = sManager.getDelegate(native_r1);
460b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (region1 == null) {
461b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
462b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
463b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
464b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        Region_Delegate region2 = sManager.getDelegate(native_r2);
465b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        if (region2 == null) {
466b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet            return false;
467b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        }
468b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
469b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet        return region1.mArea.equals(region2.mArea);
470b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    }
471b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
4729a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
4737d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet    /*package*/ static String nativeToString(int native_region) {
4747d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet        Region_Delegate region = sManager.getDelegate(native_region);
4757d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet        if (region == null) {
4767d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet            return "not found";
4777d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet        }
4787d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet
4797d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet        return region.mArea.toString();
4807d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet    }
4817d7016e72431ad7ee595d857a19231c69efeb6deXavier Ducrohet
482b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet    // ---- Private delegate/helper methods ----
483b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet
484b44b43b1579486ff7ecd0f7528f17711acdeae98Xavier Ducrohet}
485