BitmapFactory.java revision a9d0d47076ecf2d1739bb3534abc9deead8ebebd
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 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 Projectimport android.content.res.AssetManager;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics;
22eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chenimport android.util.TypedValue;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.BufferedInputStream;
25eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chenimport java.io.FileDescriptor;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
28eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chenimport java.io.InputStream;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
31eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen * Creates Bitmap objects from various sources, including files, streams,
32eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen * and byte-arrays.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class BitmapFactory {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class Options {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Create a default Options object, which if left unchanged will give
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the same result from the decoder as if null were passed.
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Options() {
41207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy            inDither = false;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            inScaled = true;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4637f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * If set, decode methods that take the Options object will attempt to
47decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase         * reuse this bitmap when loading content. If the decode operation cannot
48decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase         * use this bitmap, the decode method will return <code>null</code> and
49decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase         * will throw an IllegalArgumentException. The
5037f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * current implementation necessitates that the reused bitmap be of the
51decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase         * same size as the source content and in jpeg or png format (whether as a
5237f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * resource or as a stream). The {@link android.graphics.Bitmap.Config
5337f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * configuration} of the reused bitmap will override the setting of
5437f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * {@link #inPreferredConfig}, if set.
5537f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         *
5637f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * <p>You should still always use the returned Bitmap of the decode
5737f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * method and not assume that reusing the bitmap worked, due to the
5837f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * constraints outlined above and failure situations that can occur.
5937f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * Checking whether the return value matches the value of the inBitmap
6037f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * set in the Options structure is a way to see if the bitmap was reused,
6137f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * but in all cases you should use the returned Bitmap to make sure
6237f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         * that you are using the bitmap that was used as the decode destination.</p>
6337f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase         */
6437f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase        public Bitmap inBitmap;
6537f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase
6637f74cad46c6f1799aec3c52e8f47598237f43d4Chet Haase        /**
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If set to true, the decoder will return null (no bitmap), but
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the out... fields will still be set, allowing the caller to query
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the bitmap without having to allocate the memory for its pixels.
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean inJustDecodeBounds;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If set to a value > 1, requests the decoder to subsample the original
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * image, returning a smaller image to save memory. The sample size is
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the number of pixels in either dimension that correspond to a single
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * pixel in the decoded bitmap. For example, inSampleSize == 4 returns
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * an image that is 1/4 the width/height of the original, and 1/16 the
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * number of pixels. Any value <= 1 is treated the same as 1. Note: the
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * decoder will try to fulfill this request, but the resulting bitmap
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * may have different dimensions that precisely what has been requested.
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Also, powers of 2 are often faster/easier for the decoder to honor.
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int inSampleSize;
85eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If this is non-null, the decoder will try to decode into this
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * internal configuration. If it is null, or the request cannot be met,
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the decoder will try to pick the best matching config based on the
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * system's screen depth, and characteristics of the original image such
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * as if it has per-pixel alpha (requiring a config that also does).
92207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy         *
93207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy         * Image are loaded with the {@link Bitmap.Config#ARGB_8888} config by
94207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy         * default.
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
96207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy        public Bitmap.Config inPreferredConfig = Bitmap.Config.ARGB_8888;
97eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
997341d7a104b47996445d069a695e155a07184606Dianne Hackborn         * If dither is true, the decoder will attempt to dither the decoded
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * image.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean inDither;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * The pixel density to use for the bitmap.  This will always result
10611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * in the returned bitmap having a density set for it (see
1076e1df0e981c8c588e411b8ad6e55554fe4815655Gilles Debunne         * {@link Bitmap#setDensity(int) Bitmap.setDensity(int)}).  In addition,
10811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * if {@link #inScaled} is set (which it is by default} and this
10911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * density does not match {@link #inTargetDensity}, then the bitmap
11011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * will be scaled to the target density before being returned.
11111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         *
11211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * <p>If this is 0,
11311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * {@link BitmapFactory#decodeResource(Resources, int)},
11411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * {@link BitmapFactory#decodeResource(Resources, int, android.graphics.BitmapFactory.Options)},
11511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * and {@link BitmapFactory#decodeResourceStream}
11611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * will fill in the density associated with the resource.  The other
11711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * functions will leave it as-is and no density will be applied.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
11911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see #inTargetDensity
12011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see #inScreenDensity
12111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see #inScaled
12211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see Bitmap#setDensity(int)
12311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see android.util.DisplayMetrics#densityDpi
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int inDensity;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
12811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * The pixel density of the destination this bitmap will be drawn to.
12911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * This is used in conjunction with {@link #inDensity} and
13011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * {@link #inScaled} to determine if and how to scale the bitmap before
13111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * returning it.
13211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         *
13311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * <p>If this is 0,
13411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * {@link BitmapFactory#decodeResource(Resources, int)},
13511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * {@link BitmapFactory#decodeResource(Resources, int, android.graphics.BitmapFactory.Options)},
13611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * and {@link BitmapFactory#decodeResourceStream}
13711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * will fill in the density associated the Resources object's
13811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * DisplayMetrics.  The other
13911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * functions will leave it as-is and no scaling for density will be
14011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * performed.
14111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         *
14211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see #inDensity
14311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see #inScreenDensity
14411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see #inScaled
14511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see android.util.DisplayMetrics#densityDpi
14611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         */
14711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        public int inTargetDensity;
14811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn
14911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        /**
15011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * The pixel density of the actual screen that is being used.  This is
15111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * purely for applications running in density compatibility code, where
15211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * {@link #inTargetDensity} is actually the density the application
15311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * sees rather than the real screen density.
15411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         *
15511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * <p>By setting this, you
15611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * allow the loading code to avoid scaling a bitmap that is currently
15711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * in the screen density up/down to the compatibility density.  Instead,
15811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * if {@link #inDensity} is the same as {@link #inScreenDensity}, the
15911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * bitmap will be left as-is.  Anything using the resulting bitmap
16011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * must also used {@link Bitmap#getScaledWidth(int)
16111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * Bitmap.getScaledWidth} and {@link Bitmap#getScaledHeight
16211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * Bitmap.getScaledHeight} to account for any different between the
16311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * bitmap's density and the target's density.
16411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         *
16511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * <p>This is never set automatically for the caller by
16611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * {@link BitmapFactory} itself.  It must be explicitly set, since the
16711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * caller must deal with the resulting bitmap in a density-aware way.
16811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         *
16911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see #inDensity
17011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see #inTargetDensity
17111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see #inScaled
17211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * @see android.util.DisplayMetrics#densityDpi
17311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         */
17411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        public int inScreenDensity;
17511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn
17611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        /**
17711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * When this flag is set, if {@link #inDensity} and
17811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * {@link #inTargetDensity} are not 0, the
17911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * bitmap will be scaled to match {@link #inTargetDensity} when loaded,
18011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * rather than relying on the graphics system scaling it each time it
18111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * is drawn to a Canvas.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
18311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * <p>This flag is turned on by default and should be turned off if you need
18411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * a non-scaled version of the bitmap.  Nine-patch bitmaps ignore this
18511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn         * flag and are always scaled.
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean inScaled;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
190c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * If this is set to true, then the resulting bitmap will allocate its
191c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * pixels such that they can be purged if the system needs to reclaim
192c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * memory. In that instance, when the pixels need to be accessed again
193c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * (e.g. the bitmap is drawn, getPixels() is called), they will be
194c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * automatically re-decoded.
195c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         *
196c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * For the re-decode to happen, the bitmap must have access to the
197c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * encoded data, either by sharing a reference to the input
198c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * or by making a copy of it. This distinction is controlled by
199c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * inInputShareable. If this is true, then the bitmap may keep a shallow
200c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * reference to the input. If this is false, then the bitmap will
201c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * explicitly make a copy of the input data, and keep that. Even if
202c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * sharing is allowed, the implementation may still decide to make a
203c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * deep copy of the input data.
204c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         */
205c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed        public boolean inPurgeable;
206c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed
207c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed        /**
208c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * This field works in conjuction with inPurgeable. If inPurgeable is
209c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * false, then this field is ignored. If inPurgeable is true, then this
210c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * field determines whether the bitmap can share a reference to the
211c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         * input data (inputstream, array, etc.) or if it must make a deep copy.
212c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed         */
213c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed        public boolean inInputShareable;
214c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed
215c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed        /**
216953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen         * If inPreferQualityOverSpeed is set to true, the decoder will try to
217953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen         * decode the reconstructed image to a higher quality even at the
218953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen         * expense of the decoding speed. Currently the field only affects JPEG
219953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen         * decode, in the case of which a more accurate, but slightly slower,
220953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen         * IDCT method will be used instead.
221953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen         */
222953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen        public boolean inPreferQualityOverSpeed;
223953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen
224953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen        /**
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The resulting width of the bitmap, set independent of the state of
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * inJustDecodeBounds. However, if there is an error trying to decode,
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * outWidth will be set to -1.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
229953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int outWidth;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The resulting height of the bitmap, set independent of the state of
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * inJustDecodeBounds. However, if there is an error trying to decode,
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * outHeight will be set to -1.
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int outHeight;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If known, this string is set to the mimetype of the decoded image.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If not know, or there is an error, it is set to null.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String outMimeType;
244eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Temp storage to use for decoding.  Suggest 16K or so.
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public byte[] inTempStorage;
249eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private native void requestCancel();
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Flag to indicate that cancel has been called on this object.  This
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * is useful if there's an intermediary that wants to first decode the
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * bounds and then decode the image.  In that case the intermediary
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * can check, inbetween the bounds decode and the image decode, to see
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if the operation is canceled.
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean mCancel;
260eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  This can be called from another thread while this options object is
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  inside a decode... call. Calling this will notify the decoder that
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  it should cancel its operation. This is not guaranteed to cancel
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  the decode, but if it does, the decoder... operation will return
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  null, or if inJustDecodeBounds is true, will set outWidth/outHeight
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  to -1
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void requestCancelDecode() {
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCancel = true;
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestCancel();
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode a file path into a bitmap. If the specified file name is null,
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or cannot be decoded into a bitmap, the function returns null.
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pathName complete path name for the file to be decoded.
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param opts null-ok; Options that control downsampling and whether the
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             image should be completely decoded, or just is size returned.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The decoded bitmap, or null if the image data could not be
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         decoded, or, if opts is non-null, if opts requested only the
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         size be returned (in opts.outWidth and opts.outHeight)
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Bitmap decodeFile(String pathName, Options opts) {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bitmap bm = null;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InputStream stream = null;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream = new FileInputStream(pathName);
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bm = decodeStream(stream, null, opts);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (Exception e) {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*  do nothing.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                If the exception happened on open, bm will be null.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            */
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (stream != null) {
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    stream.close();
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (IOException e) {
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // do nothing here
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return bm;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode a file path into a bitmap. If the specified file name is null,
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or cannot be decoded into a bitmap, the function returns null.
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pathName complete path name for the file to be decoded.
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the resulting decoded bitmap, or null if it could not be decoded.
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Bitmap decodeFile(String pathName) {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return decodeFile(pathName, null);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode a new Bitmap from an InputStream. This InputStream was obtained from
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resources, which we pass to be able to scale the bitmap accordingly.
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn    public static Bitmap decodeResourceStream(Resources res, TypedValue value,
32411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            InputStream is, Rect pad, Options opts) {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (opts == null) {
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            opts = new Options();
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        if (opts.inDensity == 0 && value != null) {
331a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn            final int density = value.density;
33211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            if (density == TypedValue.DENSITY_DEFAULT) {
33311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                opts.inDensity = DisplayMetrics.DENSITY_DEFAULT;
33411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            } else if (density != TypedValue.DENSITY_NONE) {
33511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                opts.inDensity = density;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn
33911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        if (opts.inTargetDensity == 0 && res != null) {
34011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            opts.inTargetDensity = res.getDisplayMetrics().densityDpi;
34111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        }
34211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn
34311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        return decodeStream(is, pad, opts);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn     * Synonym for opening the given resource and calling
34811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn     * {@link #decodeResourceStream}.
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param res   The resources object containing the image data
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The resource id of the image data
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param opts null-ok; Options that control downsampling and whether the
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             image should be completely decoded, or just is size returned.
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The decoded bitmap, or null if the image data could not be
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         decoded, or, if opts is non-null, if opts requested only the
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         size be returned (in opts.outWidth and opts.outHeight)
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Bitmap decodeResource(Resources res, int id, Options opts) {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bitmap bm = null;
360650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy        InputStream is = null;
361650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final TypedValue value = new TypedValue();
364650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy            is = res.openRawResource(id, value);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            bm = decodeResourceStream(res, value, is, null, opts);
367650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy        } catch (Exception e) {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*  do nothing.
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                If the exception happened on open, bm will be null.
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                If it happened on close, bm is still valid.
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            */
372650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy        } finally {
373650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy            try {
374650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy                if (is != null) is.close();
375650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy            } catch (IOException e) {
376650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy                // Ignore
377650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy            }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
379650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy
380decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase        if (bm == null && opts != null && opts.inBitmap != null) {
381decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase            throw new IllegalArgumentException("Problem decoding into existing bitmap");
382decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase        }
383decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return bm;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
386eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn     * Synonym for {@link #decodeResource(Resources, int, android.graphics.BitmapFactory.Options)}
38911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn     * will null Options.
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param res The resources object containing the image data
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The resource id of the image data
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The decoded bitmap, or null if the image could not be decode.
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Bitmap decodeResource(Resources res, int id) {
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return decodeResource(res, id, null);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode an immutable bitmap from the specified byte array.
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data byte array of compressed image data
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param offset offset into imageData for where the decoder should begin
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               parsing.
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length the number of bytes, beginning at offset, to parse
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param opts null-ok; Options that control downsampling and whether the
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             image should be completely decoded, or just is size returned.
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The decoded bitmap, or null if the image data could not be
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         decoded, or, if opts is non-null, if opts requested only the
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         size be returned (in opts.outWidth and opts.outHeight)
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Bitmap decodeByteArray(byte[] data, int offset, int length, Options opts) {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((offset | length) < 0 || data.length < offset + length) {
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
416decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase        Bitmap bm = nativeDecodeByteArray(data, offset, length, opts);
417decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase        if (bm == null && opts != null && opts.inBitmap != null) {
418decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase            throw new IllegalArgumentException("Problem decoding into existing bitmap");
419decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase        }
420decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase        return bm;
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
422eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode an immutable bitmap from the specified byte array.
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data byte array of compressed image data
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param offset offset into imageData for where the decoder should begin
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *               parsing.
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length the number of bytes, beginning at offset, to parse
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The decoded bitmap, or null if the image could not be decode.
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Bitmap decodeByteArray(byte[] data, int offset, int length) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return decodeByteArray(data, offset, length, null);
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
435eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode an input stream into a bitmap. If the input stream is null, or
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cannot be used to decode a bitmap, the function returns null.
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The stream's position will be where ever it was after the encoded data
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was read.
441eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen     *
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param is The input stream that holds the raw data to be decoded into a
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *           bitmap.
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outPadding If not null, return the padding rect for the bitmap if
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   it exists, otherwise set padding to [-1,-1,-1,-1]. If
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   no bitmap is returned (null) then padding is
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   unchanged.
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param opts null-ok; Options that control downsampling and whether the
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             image should be completely decoded, or just is size returned.
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The decoded bitmap, or null if the image data could not be
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         decoded, or, if opts is non-null, if opts requested only the
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         size be returned (in opts.outWidth and opts.outHeight)
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts) {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // we don't throw in this case, thus allowing the caller to only check
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the cache, and not force the image to be decoded.
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (is == null) {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
460eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // we need mark/reset to work properly
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!is.markSupported()) {
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            is = new BufferedInputStream(is, 16 * 1024);
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // so we can call reset() if a given codec gives up after reading up to
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this many bytes. FIXME: need to find out from the codecs what this
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // value should be.
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        is.mark(1024);
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Bitmap  bm;
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (is instanceof AssetManager.AssetInputStream) {
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bm = nativeDecodeAsset(((AssetManager.AssetInputStream) is).getAssetInt(),
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    outPadding, opts);
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // pass some temp storage down to the native code. 1024 is made up,
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // but should be large enough to avoid too many small calls back
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // into is.read(...) This number is not related to the value passed
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // to mark(...) above.
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte [] tempStorage = null;
483207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy            if (opts != null) tempStorage = opts.inTempStorage;
484207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy            if (tempStorage == null) tempStorage = new byte[16 * 1024];
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bm = nativeDecodeStream(is, tempStorage, outPadding, opts);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
487decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase        if (bm == null && opts != null && opts.inBitmap != null) {
488decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase            throw new IllegalArgumentException("Problem decoding into existing bitmap");
489decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase        }
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4917341d7a104b47996445d069a695e155a07184606Dianne Hackborn        return finishDecode(bm, outPadding, opts);
4927341d7a104b47996445d069a695e155a07184606Dianne Hackborn    }
4937341d7a104b47996445d069a695e155a07184606Dianne Hackborn
4947341d7a104b47996445d069a695e155a07184606Dianne Hackborn    private static Bitmap finishDecode(Bitmap bm, Rect outPadding, Options opts) {
49511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        if (bm == null || opts == null) {
49611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            return bm;
49711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        }
49811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn
49911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        final int density = opts.inDensity;
50011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        if (density == 0) {
50111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            return bm;
50211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        }
50311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn
50411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        bm.setDensity(density);
50511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        final int targetDensity = opts.inTargetDensity;
506207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy        if (targetDensity == 0 || density == targetDensity || density == opts.inScreenDensity) {
50711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            return bm;
50811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        }
50911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn
51011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        byte[] np = bm.getNinePatchChunk();
51111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        final boolean isNinePatch = np != null && NinePatch.isNinePatchChunk(np);
51211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        if (opts.inScaled || isNinePatch) {
51311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            float scale = targetDensity / (float)density;
51411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            // TODO: This is very inefficient and should be done in native by Skia
51511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            final Bitmap oldBitmap = bm;
51611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            bm = Bitmap.createScaledBitmap(oldBitmap, (int) (bm.getWidth() * scale + 0.5f),
51711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                    (int) (bm.getHeight() * scale + 0.5f), true);
51811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            oldBitmap.recycle();
51911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn
52011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            if (isNinePatch) {
52111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                np = nativeScaleNinePatch(np, scale, outPadding);
52211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                bm.setNinePatchChunk(np);
52311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            }
52411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn            bm.setDensity(targetDensity);
52511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn        }
52611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return bm;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5297341d7a104b47996445d069a695e155a07184606Dianne Hackborn
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode an input stream into a bitmap. If the input stream is null, or
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * cannot be used to decode a bitmap, the function returns null.
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The stream's position will be where ever it was after the encoded data
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was read.
535eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen     *
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param is The input stream that holds the raw data to be decoded into a
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *           bitmap.
53803f0292744094ec107ffce71301c394503a31dedGilles Debunne     * @return The decoded bitmap, or null if the image data could not be decoded.
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Bitmap decodeStream(InputStream is) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return decodeStream(is, null, null);
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode a bitmap from the file descriptor. If the bitmap cannot be decoded
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return null. The position within the descriptor will not be changed when
5477341d7a104b47996445d069a695e155a07184606Dianne Hackborn     * this returns, so the descriptor can be used again as-is.
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd The file descriptor containing the bitmap data to decode
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outPadding If not null, return the padding rect for the bitmap if
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   it exists, otherwise set padding to [-1,-1,-1,-1]. If
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   no bitmap is returned (null) then padding is
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                   unchanged.
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param opts null-ok; Options that control downsampling and whether the
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             image should be completely decoded, or just is size returned.
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the decoded bitmap, or null
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) {
559a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin        if (nativeIsSeekable(fd)) {
560a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin            Bitmap bm = nativeDecodeFileDescriptor(fd, outPadding, opts);
561a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin            if (bm == null && opts != null && opts.inBitmap != null) {
562a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin                throw new IllegalArgumentException("Problem decoding into existing bitmap");
563a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin            }
564a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin            return finishDecode(bm, outPadding, opts);
565a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin        } else {
566a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin            FileInputStream fis = new FileInputStream(fd);
567a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin            try {
568a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin                return decodeStream(fis, outPadding, opts);
569a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin            } finally {
570a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin                try {
571a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin                    fis.close();
572a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin                } catch (Throwable t) {/* ignore */}
573a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin            }
574decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase        }
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
576eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Decode a bitmap from the file descriptor. If the bitmap cannot be decoded
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return null. The position within the descriptor will not be changed when
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this returns, so the descriptor can be used again as is.
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd The file descriptor containing the bitmap data to decode
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the decoded bitmap, or null
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Bitmap decodeFileDescriptor(FileDescriptor fd) {
586984b5df3830fe26a45bee39c7e8dd86714c99ed0Marco Nelissen        return decodeFileDescriptor(fd, null, null);
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
588eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen
589ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed    /**
590ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     * Set the default config used for decoding bitmaps. This config is
591ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     * presented to the codec if the caller did not specify a preferred config
592ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     * in their call to decode...
593ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     *
594ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     * The default value is chosen by the system to best match the device's
595ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     * screen and memory constraints.
596ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     *
597ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     * @param config The preferred config for decoding bitmaps. If null, then
598ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     *               a suitable default is chosen by the system.
599ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     *
600ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     * @hide - only called by the browser at the moment, but should be stable
601ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     *   enough to expose if needed
602ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed     */
603ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed    public static void setDefaultConfig(Bitmap.Config config) {
604ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed        if (config == null) {
605ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed            // pick this for now, as historically it was our default.
606ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed            // However, if we have a smarter algorithm, we can change this.
607ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed            config = Bitmap.Config.RGB_565;
608ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed        }
609ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed        nativeSetDefaultConfig(config.nativeInt);
610ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed    }
611ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed
612ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed    private static native void nativeSetDefaultConfig(int nativeConfig);
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native Bitmap nativeDecodeStream(InputStream is, byte[] storage,
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect padding, Options opts);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native Bitmap nativeDecodeFileDescriptor(FileDescriptor fd,
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect padding, Options opts);
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native Bitmap nativeDecodeAsset(int asset, Rect padding, Options opts);
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native Bitmap nativeDecodeByteArray(byte[] data, int offset,
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int length, Options opts);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static native byte[] nativeScaleNinePatch(byte[] chunk, float scale, Rect pad);
621a9d0d47076ecf2d1739bb3534abc9deead8ebebdOwen Lin    private static native boolean nativeIsSeekable(FileDescriptor fd);
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
623