Region_Delegate.java revision 9be03c4e980d3058aeb3fd730da5f7d4a4a4f8a8
1c3aae25116e66c177579b0b79182b09340b19753Chris Lattner/*
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman * Copyright (C) 2010 The Android Open Source Project
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell *
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell * Licensed under the Apache License, Version 2.0 (the "License");
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner * you may not use this file except in compliance with the License.
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner * You may obtain a copy of the License at
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman *
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell *      http://www.apache.org/licenses/LICENSE-2.0
9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman *
10c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * Unless required by applicable law or agreed to in writing, software
11c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * distributed under the License is distributed on an "AS IS" BASIS,
12ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner * See the License for the specific language governing permissions and
14cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner * limitations under the License.
15cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner */
16cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
17cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpackage android.graphics;
18583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey
194b84086e89d86fb16f562166d9fea8df37db6be7Dan Gohmanimport com.android.ide.common.rendering.api.LayoutLog;
2043d1fd449f1a0ac9d9dafa0b9569bb6b2e976198Anton Korobeynikovimport com.android.layoutlib.bridge.Bridge;
21583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskeyimport com.android.layoutlib.bridge.impl.DelegateManager;
22b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattnerimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
23109654fae9c5b8b96bd3a829824cdbceb27ced06Chris Lattner
245892d47a625638a90afeb31dd4f6f80a2f9bacdeChris Lattnerimport android.os.Parcel;
25322812e603705e1c2037313633e72f689524b163Evan Cheng
26eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattnerimport java.awt.Rectangle;
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeimport java.awt.Shape;
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeimport java.awt.geom.AffineTransform;
29c7c3f110eda0ff8040e4bd99e38d3112b910810fJim Laskeyimport java.awt.geom.Area;
30c3aae25116e66c177579b0b79182b09340b19753Chris Lattnerimport java.awt.geom.Rectangle2D;
31c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
3244c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey/**
33c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * Delegate implementing the native methods of android.graphics.Region
34d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng *
35ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner * Through the layoutlib_create tool, the original native methods of Region have been replaced
36c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * by calls to methods of the same name in this delegate class.
37c3aae25116e66c177579b0b79182b09340b19753Chris Lattner *
38c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * This class behaves like the original native implementation, but in Java, keeping previously
39c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * native data into its own objects and mapping them to int that are sent back and forth between
40c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * it and the original Region class.
41c3aae25116e66c177579b0b79182b09340b19753Chris Lattner *
42c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * This also serve as a base class for all Region delegate classes.
43c3aae25116e66c177579b0b79182b09340b19753Chris Lattner *
44c3aae25116e66c177579b0b79182b09340b19753Chris Lattner * @see DelegateManager
45c3aae25116e66c177579b0b79182b09340b19753Chris Lattner *
46c3aae25116e66c177579b0b79182b09340b19753Chris Lattner */
47cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattnerpublic class Region_Delegate {
48cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
49063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner    // ---- delegate manager ----
50c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    protected static final DelegateManager<Region_Delegate> sManager =
51ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner            new DelegateManager<Region_Delegate>(Region_Delegate.class);
5244c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey
53cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner    // ---- delegate helper data ----
54213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner
55c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    // ---- delegate data ----
56cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner    private Area mArea = new Area();
57213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner
58b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner    // ---- Public Helper methods ----
59691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
60213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner    public static Region_Delegate getDelegate(long nativeShader) {
61213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner        return sManager.getDelegate(nativeShader);
62583bd47f777fe3eb8305872fa0eadab31e833dffJim Laskey    }
63213a16c637926bfc38ba373d3aba6778e181e3ecChris Lattner
64cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner    public Area getJavaArea() {
65ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner        return mArea;
66ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner    }
67ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner
68c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    /**
69c3aae25116e66c177579b0b79182b09340b19753Chris Lattner     * Combines two {@link Shape} into another one (actually an {@link Area}), according
70cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner     * to the given {@link Region.Op}.
71cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner     *
72c3aae25116e66c177579b0b79182b09340b19753Chris Lattner     * If the Op is not one that combines two shapes, then this return null
73063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner     *
74063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner     * @param shape1 the firt shape to combine which can be null if there's no original clip.
75ead0d88ad7659dabd66cc3149af97d98256fca84Chris Lattner     * @param shape2 the 2nd shape to combine
7644c3b9fdd416c79f4b67cde1aecfced5921efd81Jim Laskey     * @param regionOp the operande for the combine
77cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner     * @return a new area or null.
78ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey     */
791080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner    public static Area combineShapes(Shape shape1, Shape shape2, int regionOp) {
801080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner        if (regionOp == Region.Op.DIFFERENCE.nativeInt) {
81ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            // if shape1 is null (empty), then the result is null.
82ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            if (shape1 == null) {
83ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey                return null;
84ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            }
851080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
86ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            // result is always a new area.
87ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            Area result = new Area(shape1);
88ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            result.subtract(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
89ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            return result;
90ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
91ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey        } else if (regionOp == Region.Op.INTERSECT.nativeInt) {
92ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            // if shape1 is null, then the result is simply shape2.
93ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            if (shape1 == null) {
94ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey                return new Area(shape2);
95ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            }
96ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey
97ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            // result is always a new area.
98ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            Area result = new Area(shape1);
99ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            result.intersect(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
100ec20402c90b605afeedbcf0e3aabe6f8054f23ddJim Laskey            return result;
1011080b9ee534579c67f7c99364cc6fa11edbcd919Chris Lattner
102b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner        } else if (regionOp == Region.Op.UNION.nativeInt) {
103b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner            // if shape1 is null, then the result is simply shape2.
104b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner            if (shape1 == null) {
105b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner                return new Area(shape2);
106b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner            }
107b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner
108be20a88f534325f736830c94fc084c55b4aefdfdDan Gohman            // result is always a new area.
109b80e2be8894db9f843f32ebaffb9b7fd6b57d206Chris Lattner            Area result = new Area(shape1);
110c3aae25116e66c177579b0b79182b09340b19753Chris Lattner            result.add(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
111cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner            return result;
112c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
113cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner        } else if (regionOp == Region.Op.XOR.nativeInt) {
114c3aae25116e66c177579b0b79182b09340b19753Chris Lattner            // if shape1 is null, then the result is simply shape2
115c3aae25116e66c177579b0b79182b09340b19753Chris Lattner            if (shape1 == null) {
116c3aae25116e66c177579b0b79182b09340b19753Chris Lattner                return new Area(shape2);
117cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner            }
118c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
119cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner            // result is always a new area.
120c3aae25116e66c177579b0b79182b09340b19753Chris Lattner            Area result = new Area(shape1);
121cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner            result.exclusiveOr(shape2 instanceof Area ? (Area) shape2 : new Area(shape2));
1221d4d41411190dd9e62764e56713753d4155764ddNate Begeman            return result;
1231d4d41411190dd9e62764e56713753d4155764ddNate Begeman
1241d4d41411190dd9e62764e56713753d4155764ddNate Begeman        } else if (regionOp == Region.Op.REVERSE_DIFFERENCE.nativeInt) {
1251d4d41411190dd9e62764e56713753d4155764ddNate Begeman            // result is always a new area.
126c7c3f110eda0ff8040e4bd99e38d3112b910810fJim Laskey            Area result = new Area(shape2);
1271d4d41411190dd9e62764e56713753d4155764ddNate Begeman
12801d029b82cb08367d81aa10cdc94d05360466649Chris Lattner            if (shape1 != null) {
12901d029b82cb08367d81aa10cdc94d05360466649Chris Lattner                result.subtract(shape1 instanceof Area ? (Area) shape1 : new Area(shape1));
13001d029b82cb08367d81aa10cdc94d05360466649Chris Lattner            }
13101d029b82cb08367d81aa10cdc94d05360466649Chris Lattner
13201d029b82cb08367d81aa10cdc94d05360466649Chris Lattner            return result;
13301d029b82cb08367d81aa10cdc94d05360466649Chris Lattner        }
13401d029b82cb08367d81aa10cdc94d05360466649Chris Lattner
135c3aae25116e66c177579b0b79182b09340b19753Chris Lattner        return null;
136c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    }
137c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
138cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner    // ---- native methods ----
139c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
140c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    @LayoutlibDelegate
141063287a76b5d1486f498fcf674a26d1155471a3fChris Lattner    /*package*/ static boolean isEmpty(Region thisRegion) {
142c3aae25116e66c177579b0b79182b09340b19753Chris Lattner        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
143d1fc96499b7619356c7542200d32da898b79f7c1Chris Lattner        if (regionDelegate == null) {
144190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner            return true;
145190a418bf6b49a4ef1c1980229a2f0d516e8a2cdChris Lattner        }
146130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
147130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng        return regionDelegate.mArea.isEmpty();
148130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng    }
149130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng
150130a6471b90f66e99b1f9f42877fdf611c330ac6Evan Cheng    @LayoutlibDelegate
15170046e920fa37989a041af663ada2b2b646e258fChris Lattner    /*package*/ static boolean isRect(Region thisRegion) {
15270046e920fa37989a041af663ada2b2b646e258fChris Lattner        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
15383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        if (regionDelegate == null) {
15483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            return true;
15583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        }
15683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
15770046e920fa37989a041af663ada2b2b646e258fChris Lattner        return regionDelegate.mArea.isRectangular();
15870046e920fa37989a041af663ada2b2b646e258fChris Lattner    }
15983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
16070046e920fa37989a041af663ada2b2b646e258fChris Lattner    @LayoutlibDelegate
16170046e920fa37989a041af663ada2b2b646e258fChris Lattner    /*package*/ static boolean isComplex(Region thisRegion) {
16283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
16370046e920fa37989a041af663ada2b2b646e258fChris Lattner        if (regionDelegate == null) {
16470046e920fa37989a041af663ada2b2b646e258fChris Lattner            return true;
16583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        }
16670046e920fa37989a041af663ada2b2b646e258fChris Lattner
16770046e920fa37989a041af663ada2b2b646e258fChris Lattner        return regionDelegate.mArea.isSingular() == false;
16883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    }
16913d57320bd212483463d4f8992d5787b29eda5dfBill Wendling
17070046e920fa37989a041af663ada2b2b646e258fChris Lattner    @LayoutlibDelegate
17170046e920fa37989a041af663ada2b2b646e258fChris Lattner    /*package*/ static boolean contains(Region thisRegion, int x, int y) {
17270046e920fa37989a041af663ada2b2b646e258fChris Lattner        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
1731b1a49714ef26225a42199cf2930529f31868322Chris Lattner        if (regionDelegate == null) {
17470046e920fa37989a041af663ada2b2b646e258fChris Lattner            return false;
17570046e920fa37989a041af663ada2b2b646e258fChris Lattner        }
17683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
17783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        return regionDelegate.mArea.contains(x, y);
1780bd4893a0726889b942405262e53d06cf3fe3be8Chris Lattner    }
17983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
180cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    @LayoutlibDelegate
181cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner    /*package*/ static boolean quickContains(Region thisRegion,
18283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            int left, int top, int right, int bottom) {
1836394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
1846394b099e836f56a937cdcc7332c9487b504ca68Dan Gohman        if (regionDelegate == null) {
18583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            return false;
18683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        }
18783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
188c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner        return regionDelegate.mArea.isRectangular() &&
189c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner                regionDelegate.mArea.contains(left, top, right - left, bottom - top);
19083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    }
191f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen
192f04afdbb48568ef09f11fd10ac03426101f2dbf8Dale Johannesen    @LayoutlibDelegate
19383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    /*package*/ static boolean quickReject(Region thisRegion,
194cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner            int left, int top, int right, int bottom) {
19583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
196cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner        if (regionDelegate == null) {
197cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner            return false;
198cbea3045ce0bdd061c494a831d0ce2d5834211ccChris Lattner        }
19983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
20083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        return regionDelegate.mArea.isEmpty() ||
201c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner                regionDelegate.mArea.intersects(left, top, right - left, bottom - top) == false;
202c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    }
20383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
20483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    @LayoutlibDelegate
205c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner    /*package*/ static boolean quickReject(Region thisRegion, Region rgn) {
206c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
20783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        if (regionDelegate == null) {
208c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner            return false;
20983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        }
210c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner
211c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner        Region_Delegate targetRegionDelegate = sManager.getDelegate(rgn.mNativeRegion);
212c9f8f416800784ca6453222b307bc44ad24739b0Chris Lattner        if (targetRegionDelegate == null) {
21383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            return false;
214d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng        }
215d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
21683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        return regionDelegate.mArea.isEmpty() ||
217d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng                regionDelegate.mArea.getBounds().intersects(
218d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng                        targetRegionDelegate.mArea.getBounds()) == false;
219d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng
220c3aae25116e66c177579b0b79182b09340b19753Chris Lattner    }
22183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
22283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    @LayoutlibDelegate
223276dcbdc8db6614cfd5004dc7dc35e437ddf9c58Duncan Sands    /*package*/ static void translate(Region thisRegion, int dx, int dy, Region dst) {
22483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
22583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        if (regionDelegate == null) {
2267f460203b0c5350e9b2c592f438e40f7a7de6e45Dan Gohman            return;
2277f460203b0c5350e9b2c592f438e40f7a7de6e45Dan Gohman        }
2284406604047423576e36657c7ede266ca42e79642Dan Gohman
229c3aae25116e66c177579b0b79182b09340b19753Chris Lattner        Region_Delegate targetRegionDelegate = sManager.getDelegate(dst.mNativeRegion);
230d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner        if (targetRegionDelegate == null) {
231d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner            return;
232d5d0f9bd20d9df07d6b4d41b7e8ed6d33b6a649dChris Lattner        }
233cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner
234cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner        if (regionDelegate.mArea.isEmpty()) {
235e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner            targetRegionDelegate.mArea = new Area();
236e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner        } else {
237e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner            targetRegionDelegate.mArea = new Area(regionDelegate.mArea);
238e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner            AffineTransform mtx = new AffineTransform();
239e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner            mtx.translate(dx, dy);
24083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            targetRegionDelegate.mArea.transform(mtx);
241bd564bfc63163e31f320c3da9749db70992dc35eChris Lattner        }
2422fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    }
243e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner
24466a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng    @LayoutlibDelegate
24566a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng    /*package*/ static void scale(Region thisRegion, float scale, Region dst) {
24666a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng        Region_Delegate regionDelegate = sManager.getDelegate(thisRegion.mNativeRegion);
24766a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng        if (regionDelegate == null) {
24883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            return;
249bd564bfc63163e31f320c3da9749db70992dc35eChris Lattner        }
2502fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner
25166a48bbc3565b40ea0e6f2d58cf5e3a8e64802efEvan Cheng        Region_Delegate targetRegionDelegate = sManager.getDelegate(dst.mNativeRegion);
252e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner        if (targetRegionDelegate == null) {
25383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            return;
25483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        }
255f06f35e30b4c4d7db304f717a3d4dc6595fbd078Chris Lattner
2562fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner        if (regionDelegate.mArea.isEmpty()) {
25718c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner            targetRegionDelegate.mArea = new Area();
258e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner        } else {
259e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner            targetRegionDelegate.mArea = new Area(regionDelegate.mArea);
260e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner            AffineTransform mtx = new AffineTransform();
261e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner            mtx.scale(scale, scale);
26283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            targetRegionDelegate.mArea.transform(mtx);
263e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner        }
26483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    }
265f06f35e30b4c4d7db304f717a3d4dc6595fbd078Chris Lattner
2662fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    @LayoutlibDelegate
267e3f1026683c38f6605ccaf698b7082f1b0a0f8c8Chris Lattner    /*package*/ static long nativeConstructor() {
26818c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner        Region_Delegate newDelegate = new Region_Delegate();
2697cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner        return sManager.addNewDelegate(newDelegate);
270cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner    }
2711ccae666f596d5aeca5c9942995763600b622062Chris Lattner
2721ccae666f596d5aeca5c9942995763600b622062Chris Lattner    @LayoutlibDelegate
27383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    /*package*/ static void nativeDestructor(long native_region) {
2746a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner        sManager.removeJavaReferenceFor(native_region);
2756a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner    }
2766a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner
2776a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner    @LayoutlibDelegate
27883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    /*package*/ static void nativeSetRegion(long native_dst, long native_src) {
279f06f35e30b4c4d7db304f717a3d4dc6595fbd078Chris Lattner        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
2802fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner        if (dstRegion == null) {
2816a5b6d7633c96c72ca7d5f8ba0c855e4690ada04Chris Lattner            return;
2821ccae666f596d5aeca5c9942995763600b622062Chris Lattner        }
2830f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling
2840f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling        Region_Delegate srcRegion = sManager.getDelegate(native_src);
2850f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling        if (srcRegion == null) {
2860f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling            return;
2870f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling        }
2880f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling
2890f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling        dstRegion.mArea.reset();
2900f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling        dstRegion.mArea.add(srcRegion.mArea);
2910f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling
2920f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    }
2930f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling
29434cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng    @LayoutlibDelegate
2950f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling    /*package*/ static boolean nativeSetRect(long native_dst,
2960f8d9c04d9feef86cee35cf5fecfb348a6b3de50Bill Wendling            int left, int top, int right, int bottom) {
297c3aae25116e66c177579b0b79182b09340b19753Chris Lattner        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
298cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner        if (dstRegion == null) {
29983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            return true;
30083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        }
30183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
30283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        dstRegion.mArea = new Area(new Rectangle2D.Float(left, top, right - left, bottom - top));
303c3aae25116e66c177579b0b79182b09340b19753Chris Lattner        return dstRegion.mArea.getBounds().isEmpty() == false;
30483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    }
3052d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
30683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    @LayoutlibDelegate
307f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner    /*package*/ static boolean nativeSetPath(long native_dst, long native_path, long native_clip) {
308f7db8c69a12582c7d1ff7c5f25c948dca2dbf7dcChris Lattner        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
3096d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman        if (dstRegion == null) {
3106d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman            return true;
3116d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman        }
3126d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman
31383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        Path_Delegate path = Path_Delegate.getDelegate(native_path);
3146d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman        if (path == null) {
31583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            return true;
3166d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman        }
31708ce9769718354e6767d3815e4c255e7c9fc0a46Dan Gohman
31808ce9769718354e6767d3815e4c255e7c9fc0a46Dan Gohman        dstRegion.mArea = new Area(path.getJavaShape());
31983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
32008ce9769718354e6767d3815e4c255e7c9fc0a46Dan Gohman        Region_Delegate clip = sManager.getDelegate(native_clip);
32108ce9769718354e6767d3815e4c255e7c9fc0a46Dan Gohman        if (clip != null) {
32208ce9769718354e6767d3815e4c255e7c9fc0a46Dan Gohman            dstRegion.mArea.subtract(clip.getJavaArea());
32308ce9769718354e6767d3815e4c255e7c9fc0a46Dan Gohman        }
32408ce9769718354e6767d3815e4c255e7c9fc0a46Dan Gohman
32508ce9769718354e6767d3815e4c255e7c9fc0a46Dan Gohman        return dstRegion.mArea.getBounds().isEmpty() == false;
32608ce9769718354e6767d3815e4c255e7c9fc0a46Dan Gohman    }
32767bb42aa5957bb24c0604cc08243cde9fe938e94Chris Lattner
3286d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman    @LayoutlibDelegate
3295c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola    /*package*/ static boolean nativeGetBounds(long native_region, Rect rect) {
330707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman        Region_Delegate region = sManager.getDelegate(native_region);
331707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman        if (region == null) {
332707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman            return true;
3331f13c686df75ddbbe15b208606ece4846d7479a8Dan Gohman        }
3341f13c686df75ddbbe15b208606ece4846d7479a8Dan Gohman
3355c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola        Rectangle bounds = region.mArea.getBounds();
336707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman        if (bounds.isEmpty()) {
33755888274f21fc1a760679a51591a209758db8cbfDan Gohman            rect.left = rect.top = rect.right = rect.bottom = 0;
3381f13c686df75ddbbe15b208606ece4846d7479a8Dan Gohman            return false;
3391f13c686df75ddbbe15b208606ece4846d7479a8Dan Gohman        }
3405c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola
341707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman        rect.left = bounds.x;
342707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman        rect.top = bounds.y;
3431f13c686df75ddbbe15b208606ece4846d7479a8Dan Gohman        rect.right = bounds.x + bounds.width;
3445c0d6ed325417baa5d119af9c2b6790231d8565fRafael Espindola        rect.bottom = bounds.y + bounds.height;
3457cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner        return true;
3467cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner    }
3477cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
34883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    @LayoutlibDelegate
3497cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner    /*package*/ static boolean nativeGetBoundaryPath(long native_region, long native_path) {
3507cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner        Region_Delegate region = sManager.getDelegate(native_region);
351b43e9c196542acc80c9e4643809661065710848fNate Begeman        if (region == null) {
352b43e9c196542acc80c9e4643809661065710848fNate Begeman            return false;
353b43e9c196542acc80c9e4643809661065710848fNate Begeman        }
354b43e9c196542acc80c9e4643809661065710848fNate Begeman
355b43e9c196542acc80c9e4643809661065710848fNate Begeman        Path_Delegate path = Path_Delegate.getDelegate(native_path);
35683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        if (path == null) {
357b43e9c196542acc80c9e4643809661065710848fNate Begeman            return false;
358b43e9c196542acc80c9e4643809661065710848fNate Begeman        }
3597cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner
3609373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman        if (region.mArea.isEmpty()) {
3619373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman            path.reset();
3629373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman            return false;
3639373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman        }
3649373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman
3659373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman        path.setPathIterator(region.mArea.getPathIterator(new AffineTransform()));
3662fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner        return true;
3672fa6d3b1fcadbde90eaee0e8e89aebd81630b662Chris Lattner    }
3689373a81e53ce5f9f2c06c4209b8b886605aece08Nate Begeman
3697cf7e3f33f25544d08492d47cc8a1cbba25dc8d7Chris Lattner    @LayoutlibDelegate
370acc398c195a697795bff3245943d104eb19192b9Nate Begeman    /*package*/ static boolean nativeOp(long native_dst,
371acc398c195a697795bff3245943d104eb19192b9Nate Begeman            int left, int top, int right, int bottom, int op) {
37283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        Region_Delegate region = sManager.getDelegate(native_dst);
373acc398c195a697795bff3245943d104eb19192b9Nate Begeman        if (region == null) {
3747cbd525ba85ebe440d15fa359ec940e404d14906Nate Begeman            return false;
375ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth        }
37628873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang
377ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth        region.mArea = combineShapes(region.mArea,
378fd4418fc9b4725c44210c169c4d6500be468ca70Dan Gohman                new Rectangle2D.Float(left, top, right - left, bottom - top), op);
37928873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang
380ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth        assert region.mArea != null;
381ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth        if (region.mArea != null) {
38228873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang            region.mArea = new Area();
383ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth        }
384fd4418fc9b4725c44210c169c4d6500be468ca70Dan Gohman
38528873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang        return region.mArea.getBounds().isEmpty() == false;
386ab0b949e0e9de452f3b052b11634ab761e008b23Andrew Lenharth    }
3874bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands
3884bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands    @LayoutlibDelegate
3896d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman    /*package*/ static boolean nativeOp(long native_dst, Rect rect, long native_region, int op) {
3904bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands        Region_Delegate region = sManager.getDelegate(native_dst);
3914bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands        if (region == null) {
392f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands            return false;
393f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands        }
3944bdcb61af33399d4e01fdf3c47ca1f1f5356e370Duncan Sands
3956d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman        region.mArea = combineShapes(region.mArea,
396f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands                new Rectangle2D.Float(rect.left, rect.top, rect.width(), rect.height()), op);
397f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands
398f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands        assert region.mArea != null;
399f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands        if (region.mArea != null) {
400f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands            region.mArea = new Area();
401f9516208e57364ab1e7d8748af1f59a2ea5fb572Duncan Sands        }
402c3aae25116e66c177579b0b79182b09340b19753Chris Lattner
403c3aae25116e66c177579b0b79182b09340b19753Chris Lattner        return region.mArea.getBounds().isEmpty() == false;
404cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner    }
40583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
40695c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb    @LayoutlibDelegate
40795c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb    /*package*/ static boolean nativeOp(long native_dst,
40883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            long native_region1, long native_region2, int op) {
40924446e253a17720f6462288255ab5ebd13b8491fEvan Cheng        Region_Delegate dstRegion = sManager.getDelegate(native_dst);
41083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        if (dstRegion == null) {
41195c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb            return true;
4128862ef148100070b7bf28beead3951464250c926Evan Cheng        }
413144d8f09e139f691cafadbc17873943ba4c465f3Evan Cheng
414e10efce22502d1a1855d25baf1458660f4ba6f33Duncan Sands        Region_Delegate region1 = sManager.getDelegate(native_region1);
41583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        if (region1 == null) {
416e10efce22502d1a1855d25baf1458660f4ba6f33Duncan Sands            return false;
41783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        }
418e10efce22502d1a1855d25baf1458660f4ba6f33Duncan Sands
4192d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth        Region_Delegate region2 = sManager.getDelegate(native_region2);
420ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng        if (region2 == null) {
421ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng            return false;
422d41b30def3181bce4bf87e8bde664d15663165d0Jeff Cohen        }
42395c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb
42495c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb        dstRegion.mArea = combineShapes(region1.mArea, region2.mArea, op);
425d41b30def3181bce4bf87e8bde664d15663165d0Jeff Cohen
42683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        assert dstRegion.mArea != null;
42795c218a83ecf77590b9dc40c636720772d2b5cd7Christopher Lamb        if (dstRegion.mArea != null) {
4289109fb1eb7d3341727353777c2a4282aa1a0c39aEvan Cheng            dstRegion.mArea = new Area();
429144d8f09e139f691cafadbc17873943ba4c465f3Evan Cheng        }
430ad071e1cd1a4b880019f1b2e827ee81867815f82Evan Cheng
43169de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman        return dstRegion.mArea.getBounds().isEmpty() == false;
43269de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
43369de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman    }
43469de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
43569de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman    @LayoutlibDelegate
43636b5c1338a03453ba1c110b120269ca972fb65a3Dan Gohman    /*package*/ static long nativeCreateFromParcel(Parcel p) {
437cacf462915344c2af25eef1af1f3ee2c7280ff56Chris Lattner        // This is only called by Region.CREATOR (Parcelable.Creator<Region>), which is only
438b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner        // used during aidl call so really this should not be called.
439b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner        Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
440b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner                "AIDL is not suppored, and therefore Regions cannot be created from parcels.",
441b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner                null /*data*/);
442b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner        return 0;
443b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner    }
444b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner
445b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner    @LayoutlibDelegate
446b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner    /*package*/ static boolean nativeWriteToParcel(long native_region,
447b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner                                                      Parcel p) {
448b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner        // This is only called when sending a region through aidl, so really this should not
449b9aff659e82e4ec1a507e6e7fe7969379a431613Chris Lattner        // be called.
4509b88361befd2a94202dc60ccfb3e31756916a9caChris Lattner        Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED,
4519b88361befd2a94202dc60ccfb3e31756916a9caChris Lattner                "AIDL is not suppored, and therefore Regions cannot be written to parcels.",
4526d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman                null /*data*/);
4536d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman        return false;
4541b95095857b78e12138c22e76c7936611c51355bChris Lattner    }
4551b95095857b78e12138c22e76c7936611c51355bChris Lattner
4561b95095857b78e12138c22e76c7936611c51355bChris Lattner    @LayoutlibDelegate
4571b95095857b78e12138c22e76c7936611c51355bChris Lattner    /*package*/ static boolean nativeEquals(long native_r1, long native_r2) {
458eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner        Region_Delegate region1 = sManager.getDelegate(native_r1);
459eb19e40efbd3cae80c908a30cdf4d33450733c45Chris Lattner        if (region1 == null) {
46083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            return false;
46183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        }
46283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
46395514bae7309ffacfc0a79b267159dcfde2b7720Evan Cheng        Region_Delegate region2 = sManager.getDelegate(native_r2);
46483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        if (region2 == null) {
46595514bae7309ffacfc0a79b267159dcfde2b7720Evan Cheng            return false;
46683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        }
4676d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman
468cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman        return region1.mArea.equals(region2.mArea);
469cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman    }
4706d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman
471cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman    @LayoutlibDelegate
4726d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman    /*package*/ static String nativeToString(long native_region) {
473cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman        Region_Delegate region = sManager.getDelegate(native_region);
474cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman        if (region == null) {
47583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands            return "not found";
47683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        }
47783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands
47883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands        return region.mArea.toString();
479cd920d9ecfcefff13c3619a32b58399cac2e3630Dan Gohman    }
4806d9cdd56173fb915a9e3a8f0f6b5a8ed9bed1098Dan Gohman
481694481ee01bfe507c6e37de0dc1c64cff455eefdEvan Cheng    // ---- Private delegate/helper methods ----
482753c8f20e45f6e4198c7cf4096ecc8948a029e9cChris Lattner
4836ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng}
4846ae46c4c8757237bca2b78b589c96c37015bc356Evan Cheng