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