19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
21e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy * The NinePatch class permits drawing a bitmap in nine or more sections.
22e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy * Essentially, it allows the creation of custom graphics that will scale the
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * way that you define, when content added within the image exceeds the normal
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bounds of the graphic. For a thorough explanation of a NinePatch image,
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * read the discussion in the
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html#nine-patch">2D
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Graphics</a> document.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The <a href="{@docRoot}guide/developing/tools/draw9patch.html">Draw 9-Patch</a>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tool offers an extremely handy way to create your NinePatch images,
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using a WYSIWYG graphics editor.
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class NinePatch {
35deba785f122a47915756ffd991f5540d952cf937Romain Guy    private final Bitmap mBitmap;
36e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
373b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    /**
38e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Used by native code. This pointer is an instance of Res_png_9patch*.
39e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     *
403b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     * @hide
413b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     */
42e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    public final int mNativeChunk;
43e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
44deba785f122a47915756ffd991f5540d952cf937Romain Guy    private Paint mPaint;
45e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    private String mSrcName;
46f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy
47f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy    /**
48f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy     * Create a drawable projection from a bitmap to nine patches.
49f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy     *
50e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param bitmap The bitmap describing the patches.
51e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param chunk The 9-patch data chunk describing how the underlying bitmap
52e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     *              is split apart and drawn.
53f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy     */
54f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy    public NinePatch(Bitmap bitmap, byte[] chunk) {
55f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy        this(bitmap, chunk, null);
56f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy    }
57f3187b7df158d2de36955ddcc666ba4b8544a2ceRomain Guy
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a drawable projection from a bitmap to nine patches.
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param bitmap The bitmap describing the patches.
62e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param chunk The 9-patch data chunk describing how the underlying
63e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     *              bitmap is split apart and drawn.
64e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param srcName The name of the source for the bitmap. Might be null.
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public NinePatch(Bitmap bitmap, byte[] chunk, String srcName) {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBitmap = bitmap;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSrcName = srcName;
69e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        mNativeChunk = validateNinePatchChunk(mBitmap.ni(), chunk);
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public NinePatch(NinePatch patch) {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBitmap = patch.mBitmap;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSrcName = patch.mSrcName;
7854285f2cbfb6e307d594ca264f7230b4e1e3cdcePhil Dubach        if (patch.mPaint != null) {
7954285f2cbfb6e307d594ca264f7230b4e1e3cdcePhil Dubach            mPaint = new Paint(patch.mPaint);
8054285f2cbfb6e307d594ca264f7230b4e1e3cdcePhil Dubach        }
81e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        // No need to validate the 9patch chunk again, it was done by
82e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        // the instance we're copying from
83e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        mNativeChunk = patch.mNativeChunk;
84e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    }
85e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
86e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    @Override
87e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    protected void finalize() throws Throwable {
88e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        try {
89e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy            nativeFinalize(mNativeChunk);
90e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        } finally {
91e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy            super.finalize();
92e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        }
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
95e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    /**
96e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Returns the name of this NinePatch object if one was specified
97e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * when calling the constructor.
98e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     */
99e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    public String getName() {
100e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        return mSrcName;
101e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    }
102e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
103e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    /**
104e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Returns the paint used to draw this NinePatch. The paint can be null.
105e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     *
106e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @see #setPaint(Paint)
107e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @see #draw(Canvas, Rect)
108e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @see #draw(Canvas, RectF)
109e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     */
110e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    public Paint getPaint() {
111e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        return mPaint;
112e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    }
113e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
114e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    /**
115e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Sets the paint to use when drawing the NinePatch.
116e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     *
117e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param p The paint that will be used to draw this NinePatch.
118e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     *
119e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @see #getPaint()
120e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @see #draw(Canvas, Rect)
121e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @see #draw(Canvas, RectF)
122e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     */
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPaint(Paint p) {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPaint = p;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1263b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy
1273b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    /**
128e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Returns the bitmap used to draw this NinePatch.
1293b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy     */
1303b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    public Bitmap getBitmap() {
1313b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy        return mBitmap;
1323b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy    }
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
135e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Draws the NinePatch. This method will use the paint returned by {@link #getPaint()}.
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
137e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param canvas A container for the current matrix and clip used to draw the NinePatch.
138e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param location Where to draw the NinePatch.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas, RectF location) {
141f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy        canvas.drawPatch(this, location, mPaint);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
143f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
145e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Draws the NinePatch. This method will use the paint returned by {@link #getPaint()}.
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
147e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param canvas A container for the current matrix and clip used to draw the NinePatch.
148e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param location Where to draw the NinePatch.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas, Rect location) {
151f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy        canvas.drawPatch(this, location, mPaint);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
155e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Draws the NinePatch. This method will ignore the paint returned
156e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * by {@link #getPaint()} and use the specified paint instead.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
158e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param canvas A container for the current matrix and clip used to draw the NinePatch.
159e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param location Where to draw the NinePatch.
160e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param paint The Paint to draw through.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas, Rect location, Paint paint) {
163f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy        canvas.drawPatch(this, location, paint);
164f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy    }
165f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy
166f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy    void drawSoftware(Canvas canvas, RectF location, Paint paint) {
167e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        nativeDraw(canvas.mNativeCanvas, location, mBitmap.ni(), mNativeChunk,
168f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy                paint != null ? paint.mNativePaint : 0, canvas.mDensity, mBitmap.mDensity);
169f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy    }
170f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy
171f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy    void drawSoftware(Canvas canvas, Rect location, Paint paint) {
172e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        nativeDraw(canvas.mNativeCanvas, location, mBitmap.ni(), mNativeChunk,
173f296dca95f09be9832b5dcc79717986525d2b6cbRomain Guy                paint != null ? paint.mNativePaint : 0, canvas.mDensity, mBitmap.mDensity);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn    /**
17711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn     * Return the underlying bitmap's density, as per
17811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn     * {@link Bitmap#getDensity() Bitmap.getDensity()}.
17911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn     */
18011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn    public int getDensity() {
18111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        return mBitmap.mDensity;
18211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn    }
183e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
184e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    /**
185e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Returns the intrinsic width, in pixels, of this NinePatch. This is equivalent
186e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * to querying the width of the underlying bitmap returned by {@link #getBitmap()}.
187e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     */
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWidth() {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mBitmap.getWidth();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
192e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    /**
193e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Returns the intrinsic height, in pixels, of this NinePatch. This is equivalent
194e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * to querying the height of the underlying bitmap returned by {@link #getBitmap()}.
195e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     */
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getHeight() {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mBitmap.getHeight();
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
200e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    /**
201e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Indicates whether this NinePatch contains transparent or translucent pixels.
202e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * This is equivalent to calling <code>getBitmap().hasAlpha()</code> on this
203e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * NinePatch.
204e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     */
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean hasAlpha() {
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mBitmap.hasAlpha();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    /**
210e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Returns a {@link Region} representing the parts of the NinePatch that are
211e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * completely transparent.
212e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     *
213e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param bounds The location and size of the NinePatch.
214e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     *
215e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @return null if the NinePatch has no transparent region to
216e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * report, else a {@link Region} holding the parts of the specified bounds
217e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * that are transparent.
218e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     */
219e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    public final Region getTransparentRegion(Rect bounds) {
220e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        int r = nativeGetTransparentRegion(mBitmap.ni(), mNativeChunk, bounds);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return r != 0 ? new Region(r) : null;
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
223e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
224e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    /**
225e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Verifies that the specified byte array is a valid 9-patch data chunk.
226e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     *
227e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @param chunk A byte array representing a 9-patch data chunk.
228e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     *
229e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * @return True if the specified byte array represents a 9-patch data chunk,
230e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     *         false otherwise.
231e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     */
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean isNinePatchChunk(byte[] chunk);
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
234e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    /**
235e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * Validates the 9-patch chunk and throws an exception if the chunk is invalid.
236e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * If validation is successful, this method returns a native Res_png_9patch*
237e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     * object used by the renderers.
238e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy     */
239e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    private static native int validateNinePatchChunk(int bitmap, byte[] chunk);
240e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    private static native void nativeFinalize(int chunk);
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void nativeDraw(int canvas_instance, RectF loc, int bitmap_instance,
242e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy            int c, int paint_instance_or_null, int destDensity, int srcDensity);
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native void nativeDraw(int canvas_instance, Rect loc, int bitmap_instance,
244e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy            int c, int paint_instance_or_null, int destDensity, int srcDensity);
245e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    private static native int nativeGetTransparentRegion(int bitmap, int chunk, Rect location);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
247