BitmapFactory.java revision 2361098da3b9d9c3eeed410dc72ba62c0e9177cf
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 /** 672361098da3b9d9c3eeed410dc72ba62c0e9177cfRomain Guy * If set, decode methods will always return a mutable Bitmap instead of 682361098da3b9d9c3eeed410dc72ba62c0e9177cfRomain Guy * an immutable one. This can be used for instance to programmatically apply 692361098da3b9d9c3eeed410dc72ba62c0e9177cfRomain Guy * effects to a Bitmap loaded through BitmapFactory. 702361098da3b9d9c3eeed410dc72ba62c0e9177cfRomain Guy */ 712361098da3b9d9c3eeed410dc72ba62c0e9177cfRomain Guy @SuppressWarnings({"UnusedDeclaration"}) // used in native code 722361098da3b9d9c3eeed410dc72ba62c0e9177cfRomain Guy public boolean inMutable; 732361098da3b9d9c3eeed410dc72ba62c0e9177cfRomain Guy 742361098da3b9d9c3eeed410dc72ba62c0e9177cfRomain Guy /** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If set to true, the decoder will return null (no bitmap), but 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the out... fields will still be set, allowing the caller to query 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the bitmap without having to allocate the memory for its pixels. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean inJustDecodeBounds; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If set to a value > 1, requests the decoder to subsample the original 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * image, returning a smaller image to save memory. The sample size is 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the number of pixels in either dimension that correspond to a single 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pixel in the decoded bitmap. For example, inSampleSize == 4 returns 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an image that is 1/4 the width/height of the original, and 1/16 the 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * number of pixels. Any value <= 1 is treated the same as 1. Note: the 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * decoder will try to fulfill this request, but the resulting bitmap 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may have different dimensions that precisely what has been requested. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Also, powers of 2 are often faster/easier for the decoder to honor. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int inSampleSize; 93eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this is non-null, the decoder will try to decode into this 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * internal configuration. If it is null, or the request cannot be met, 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the decoder will try to pick the best matching config based on the 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system's screen depth, and characteristics of the original image such 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as if it has per-pixel alpha (requiring a config that also does). 100207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy * 101207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy * Image are loaded with the {@link Bitmap.Config#ARGB_8888} config by 102207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy * default. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 104207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy public Bitmap.Config inPreferredConfig = Bitmap.Config.ARGB_8888; 105eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1077341d7a104b47996445d069a695e155a07184606Dianne Hackborn * If dither is true, the decoder will attempt to dither the decoded 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * image. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean inDither; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * The pixel density to use for the bitmap. This will always result 11411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * in the returned bitmap having a density set for it (see 1156e1df0e981c8c588e411b8ad6e55554fe4815655Gilles Debunne * {@link Bitmap#setDensity(int) Bitmap.setDensity(int)}). In addition, 11611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * if {@link #inScaled} is set (which it is by default} and this 11711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * density does not match {@link #inTargetDensity}, then the bitmap 11811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * will be scaled to the target density before being returned. 11911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * 12011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * <p>If this is 0, 12111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link BitmapFactory#decodeResource(Resources, int)}, 12211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link BitmapFactory#decodeResource(Resources, int, android.graphics.BitmapFactory.Options)}, 12311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * and {@link BitmapFactory#decodeResourceStream} 12411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * will fill in the density associated with the resource. The other 12511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * functions will leave it as-is and no density will be applied. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see #inTargetDensity 12811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see #inScreenDensity 12911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see #inScaled 13011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see Bitmap#setDensity(int) 13111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see android.util.DisplayMetrics#densityDpi 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int inDensity; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * The pixel density of the destination this bitmap will be drawn to. 13711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * This is used in conjunction with {@link #inDensity} and 13811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link #inScaled} to determine if and how to scale the bitmap before 13911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * returning it. 14011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * 14111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * <p>If this is 0, 14211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link BitmapFactory#decodeResource(Resources, int)}, 14311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link BitmapFactory#decodeResource(Resources, int, android.graphics.BitmapFactory.Options)}, 14411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * and {@link BitmapFactory#decodeResourceStream} 14511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * will fill in the density associated the Resources object's 14611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * DisplayMetrics. The other 14711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * functions will leave it as-is and no scaling for density will be 14811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * performed. 14911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * 15011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see #inDensity 15111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see #inScreenDensity 15211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see #inScaled 15311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see android.util.DisplayMetrics#densityDpi 15411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn */ 15511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn public int inTargetDensity; 15611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn 15711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn /** 15811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * The pixel density of the actual screen that is being used. This is 15911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * purely for applications running in density compatibility code, where 16011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link #inTargetDensity} is actually the density the application 16111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * sees rather than the real screen density. 16211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * 16311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * <p>By setting this, you 16411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * allow the loading code to avoid scaling a bitmap that is currently 16511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * in the screen density up/down to the compatibility density. Instead, 16611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * if {@link #inDensity} is the same as {@link #inScreenDensity}, the 16711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * bitmap will be left as-is. Anything using the resulting bitmap 16811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * must also used {@link Bitmap#getScaledWidth(int) 16911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * Bitmap.getScaledWidth} and {@link Bitmap#getScaledHeight 17011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * Bitmap.getScaledHeight} to account for any different between the 17111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * bitmap's density and the target's density. 17211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * 17311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * <p>This is never set automatically for the caller by 17411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link BitmapFactory} itself. It must be explicitly set, since the 17511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * caller must deal with the resulting bitmap in a density-aware way. 17611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * 17711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see #inDensity 17811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see #inTargetDensity 17911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see #inScaled 18011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * @see android.util.DisplayMetrics#densityDpi 18111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn */ 18211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn public int inScreenDensity; 18311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn 18411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn /** 18511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * When this flag is set, if {@link #inDensity} and 18611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link #inTargetDensity} are not 0, the 18711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * bitmap will be scaled to match {@link #inTargetDensity} when loaded, 18811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * rather than relying on the graphics system scaling it each time it 18911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * is drawn to a Canvas. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * <p>This flag is turned on by default and should be turned off if you need 19211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * a non-scaled version of the bitmap. Nine-patch bitmaps ignore this 19311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * flag and are always scaled. 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean inScaled; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 198c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * If this is set to true, then the resulting bitmap will allocate its 199c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * pixels such that they can be purged if the system needs to reclaim 200c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * memory. In that instance, when the pixels need to be accessed again 201c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * (e.g. the bitmap is drawn, getPixels() is called), they will be 202c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * automatically re-decoded. 203c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * 204c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * For the re-decode to happen, the bitmap must have access to the 205c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * encoded data, either by sharing a reference to the input 206c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * or by making a copy of it. This distinction is controlled by 207c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * inInputShareable. If this is true, then the bitmap may keep a shallow 208c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * reference to the input. If this is false, then the bitmap will 209c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * explicitly make a copy of the input data, and keep that. Even if 210c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * sharing is allowed, the implementation may still decide to make a 211c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * deep copy of the input data. 212c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed */ 213c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed public boolean inPurgeable; 214c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed 215c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed /** 216c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * This field works in conjuction with inPurgeable. If inPurgeable is 217c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * false, then this field is ignored. If inPurgeable is true, then this 218c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * field determines whether the bitmap can share a reference to the 219c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed * input data (inputstream, array, etc.) or if it must make a deep copy. 220c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed */ 221c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed public boolean inInputShareable; 222c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed 223c70e06bbfac0d92ec218a32e35d9d7fa80f23cc9Mike Reed /** 224953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen * If inPreferQualityOverSpeed is set to true, the decoder will try to 225953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen * decode the reconstructed image to a higher quality even at the 226953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen * expense of the decoding speed. Currently the field only affects JPEG 227953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen * decode, in the case of which a more accurate, but slightly slower, 228953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen * IDCT method will be used instead. 229953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen */ 230953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen public boolean inPreferQualityOverSpeed; 231953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen 232953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen /** 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resulting width 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 * outWidth will be set to -1. 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 237953f9094a2ec14594fa8501d5f3e2d9e300b1b62Wei-Ta Chen 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int outWidth; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resulting height of the bitmap, set independent of the state of 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inJustDecodeBounds. However, if there is an error trying to decode, 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * outHeight will be set to -1. 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int outHeight; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If known, this string is set to the mimetype of the decoded image. 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If not know, or there is an error, it is set to null. 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String outMimeType; 252eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Temp storage to use for decoding. Suggest 16K or so. 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public byte[] inTempStorage; 257eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void requestCancel(); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flag to indicate that cancel has been called on this object. This 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is useful if there's an intermediary that wants to first decode the 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bounds and then decode the image. In that case the intermediary 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can check, inbetween the bounds decode and the image decode, to see 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the operation is canceled. 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean mCancel; 268eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This can be called from another thread while this options object is 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inside a decode... call. Calling this will notify the decoder that 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it should cancel its operation. This is not guaranteed to cancel 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the decode, but if it does, the decoder... operation will return 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null, or if inJustDecodeBounds is true, will set outWidth/outHeight 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to -1 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void requestCancelDecode() { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCancel = true; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestCancel(); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decode a file path into a bitmap. If the specified file name is null, 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or cannot be decoded into a bitmap, the function returns null. 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pathName complete path name for the file to be decoded. 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param opts null-ok; Options that control downsampling and whether the 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * image should be completely decoded, or just is size returned. 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The decoded bitmap, or null if the image data could not be 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * decoded, or, if opts is non-null, if opts requested only the 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * size be returned (in opts.outWidth and opts.outHeight) 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Bitmap decodeFile(String pathName, Options opts) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap bm = null; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream stream = null; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream = new FileInputStream(pathName); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bm = decodeStream(stream, null, opts); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* do nothing. 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project If the exception happened on open, bm will be null. 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stream != null) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do nothing here 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bm; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decode a file path into a bitmap. If the specified file name is null, 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or cannot be decoded into a bitmap, the function returns null. 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pathName complete path name for the file to be decoded. 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the resulting decoded bitmap, or null if it could not be decoded. 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Bitmap decodeFile(String pathName) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return decodeFile(pathName, null); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decode a new Bitmap from an InputStream. This InputStream was obtained from 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resources, which we pass to be able to scale the bitmap accordingly. 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn public static Bitmap decodeResourceStream(Resources res, TypedValue value, 33211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn InputStream is, Rect pad, Options opts) { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opts == null) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project opts = new Options(); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn if (opts.inDensity == 0 && value != null) { 339a53b828635fce8b6b2d3e3377d74d72070056623Dianne Hackborn final int density = value.density; 34011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn if (density == TypedValue.DENSITY_DEFAULT) { 34111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn opts.inDensity = DisplayMetrics.DENSITY_DEFAULT; 34211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn } else if (density != TypedValue.DENSITY_NONE) { 34311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn opts.inDensity = density; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn 34711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn if (opts.inTargetDensity == 0 && res != null) { 34811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn opts.inTargetDensity = res.getDisplayMetrics().densityDpi; 34911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn } 35011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn 35111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn return decodeStream(is, pad, opts); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * Synonym for opening the given resource and calling 35611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * {@link #decodeResourceStream}. 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param res The resources object containing the image data 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The resource id of the image data 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param opts null-ok; Options that control downsampling and whether the 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * image should be completely decoded, or just is size returned. 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The decoded bitmap, or null if the image data could not be 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * decoded, or, if opts is non-null, if opts requested only the 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * size be returned (in opts.outWidth and opts.outHeight) 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Bitmap decodeResource(Resources res, int id, Options opts) { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap bm = null; 368650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy InputStream is = null; 369650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final TypedValue value = new TypedValue(); 372650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy is = res.openRawResource(id, value); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn bm = decodeResourceStream(res, value, is, null, opts); 375650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } catch (Exception e) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* do nothing. 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project If the exception happened on open, bm will be null. 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project If it happened on close, bm is still valid. 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 380650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } finally { 381650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy try { 382650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy if (is != null) is.close(); 383650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } catch (IOException e) { 384650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy // Ignore 385650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 387650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy 388decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase if (bm == null && opts != null && opts.inBitmap != null) { 389decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase throw new IllegalArgumentException("Problem decoding into existing bitmap"); 390decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase } 391decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bm; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 394eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 39611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * Synonym for {@link #decodeResource(Resources, int, android.graphics.BitmapFactory.Options)} 39711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * will null Options. 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param res The resources object containing the image data 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The resource id of the image data 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The decoded bitmap, or null if the image could not be decode. 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Bitmap decodeResource(Resources res, int id) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return decodeResource(res, id, null); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decode an immutable bitmap from the specified byte array. 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param data byte array of compressed image data 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offset offset into imageData for where the decoder should begin 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parsing. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param length the number of bytes, beginning at offset, to parse 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param opts null-ok; Options that control downsampling and whether the 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * image should be completely decoded, or just is size returned. 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The decoded bitmap, or null if the image data could not be 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * decoded, or, if opts is non-null, if opts requested only the 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * size be returned (in opts.outWidth and opts.outHeight) 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Bitmap decodeByteArray(byte[] data, int offset, int length, Options opts) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((offset | length) < 0 || data.length < offset + length) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 424decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase Bitmap bm = nativeDecodeByteArray(data, offset, length, opts); 425decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase if (bm == null && opts != null && opts.inBitmap != null) { 426decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase throw new IllegalArgumentException("Problem decoding into existing bitmap"); 427decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase } 428decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase return bm; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 430eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decode an immutable bitmap from the specified byte array. 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param data byte array of compressed image data 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offset offset into imageData for where the decoder should begin 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parsing. 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param length the number of bytes, beginning at offset, to parse 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The decoded bitmap, or null if the image could not be decode. 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Bitmap decodeByteArray(byte[] data, int offset, int length) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return decodeByteArray(data, offset, length, null); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 443eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decode an input stream into a bitmap. If the input stream is null, or 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cannot be used to decode a bitmap, the function returns null. 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The stream's position will be where ever it was after the encoded data 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was read. 449eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen * 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param is The input stream that holds the raw data to be decoded into a 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bitmap. 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outPadding If not null, return the padding rect for the bitmap if 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it exists, otherwise set padding to [-1,-1,-1,-1]. If 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * no bitmap is returned (null) then padding is 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param opts null-ok; Options that control downsampling and whether the 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * image should be completely decoded, or just is size returned. 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The decoded bitmap, or null if the image data could not be 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * decoded, or, if opts is non-null, if opts requested only the 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * size be returned (in opts.outWidth and opts.outHeight) 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we don't throw in this case, thus allowing the caller to only check 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the cache, and not force the image to be decoded. 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (is == null) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 468eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we need mark/reset to work properly 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!is.markSupported()) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is = new BufferedInputStream(is, 16 * 1024); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so we can call reset() if a given codec gives up after reading up to 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this many bytes. FIXME: need to find out from the codecs what this 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // value should be. 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is.mark(1024); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap bm; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (is instanceof AssetManager.AssetInputStream) { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bm = nativeDecodeAsset(((AssetManager.AssetInputStream) is).getAssetInt(), 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outPadding, opts); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // pass some temp storage down to the native code. 1024 is made up, 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // but should be large enough to avoid too many small calls back 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // into is.read(...) This number is not related to the value passed 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to mark(...) above. 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte [] tempStorage = null; 491207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy if (opts != null) tempStorage = opts.inTempStorage; 492207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy if (tempStorage == null) tempStorage = new byte[16 * 1024]; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bm = nativeDecodeStream(is, tempStorage, outPadding, opts); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 495decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase if (bm == null && opts != null && opts.inBitmap != null) { 496decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase throw new IllegalArgumentException("Problem decoding into existing bitmap"); 497decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4997341d7a104b47996445d069a695e155a07184606Dianne Hackborn return finishDecode(bm, outPadding, opts); 5007341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 5017341d7a104b47996445d069a695e155a07184606Dianne Hackborn 5027341d7a104b47996445d069a695e155a07184606Dianne Hackborn private static Bitmap finishDecode(Bitmap bm, Rect outPadding, Options opts) { 50311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn if (bm == null || opts == null) { 50411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn return bm; 50511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn } 50611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn 50711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn final int density = opts.inDensity; 50811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn if (density == 0) { 50911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn return bm; 51011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn } 51111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn 51211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn bm.setDensity(density); 51311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn final int targetDensity = opts.inTargetDensity; 514207b3ab604bcbe47fa55f26f358cde60cf8a784dRomain Guy if (targetDensity == 0 || density == targetDensity || density == opts.inScreenDensity) { 51511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn return bm; 51611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn } 51711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn 51811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn byte[] np = bm.getNinePatchChunk(); 51911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn final boolean isNinePatch = np != null && NinePatch.isNinePatchChunk(np); 52011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn if (opts.inScaled || isNinePatch) { 52111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn float scale = targetDensity / (float)density; 52211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // TODO: This is very inefficient and should be done in native by Skia 52311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn final Bitmap oldBitmap = bm; 52411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn bm = Bitmap.createScaledBitmap(oldBitmap, (int) (bm.getWidth() * scale + 0.5f), 52511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn (int) (bm.getHeight() * scale + 0.5f), true); 52611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn oldBitmap.recycle(); 52711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn 52811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn if (isNinePatch) { 52911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn np = nativeScaleNinePatch(np, scale, outPadding); 53011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn bm.setNinePatchChunk(np); 53111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn } 53211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn bm.setDensity(targetDensity); 53311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn } 5342361098da3b9d9c3eeed410dc72ba62c0e9177cfRomain Guy 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bm; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5377341d7a104b47996445d069a695e155a07184606Dianne Hackborn 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decode an input stream into a bitmap. If the input stream is null, or 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cannot be used to decode a bitmap, the function returns null. 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The stream's position will be where ever it was after the encoded data 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was read. 543eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen * 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param is The input stream that holds the raw data to be decoded into a 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bitmap. 54603f0292744094ec107ffce71301c394503a31dedGilles Debunne * @return The decoded bitmap, or null if the image data could not be decoded. 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Bitmap decodeStream(InputStream is) { 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return decodeStream(is, null, null); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decode a bitmap from the file descriptor. If the bitmap cannot be decoded 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return null. The position within the descriptor will not be changed when 5557341d7a104b47996445d069a695e155a07184606Dianne Hackborn * this returns, so the descriptor can be used again as-is. 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fd The file descriptor containing the bitmap data to decode 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param outPadding If not null, return the padding rect for the bitmap if 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it exists, otherwise set padding to [-1,-1,-1,-1]. If 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * no bitmap is returned (null) then padding is 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param opts null-ok; Options that control downsampling and whether the 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * image should be completely decoded, or just is size returned. 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the decoded bitmap, or null 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts) { 5677341d7a104b47996445d069a695e155a07184606Dianne Hackborn Bitmap bm = nativeDecodeFileDescriptor(fd, outPadding, opts); 568decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase if (bm == null && opts != null && opts.inBitmap != null) { 569decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase throw new IllegalArgumentException("Problem decoding into existing bitmap"); 570decc8cd41eca3770c8f5ee13d81b9cd5f0c25ccdChet Haase } 5717341d7a104b47996445d069a695e155a07184606Dianne Hackborn return finishDecode(bm, outPadding, opts); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 573eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Decode a bitmap from the file descriptor. If the bitmap cannot be decoded 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return null. The position within the descriptor will not be changed when 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this returns, so the descriptor can be used again as is. 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fd The file descriptor containing the bitmap data to decode 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the decoded bitmap, or null 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Bitmap decodeFileDescriptor(FileDescriptor fd) { 583984b5df3830fe26a45bee39c7e8dd86714c99ed0Marco Nelissen return decodeFileDescriptor(fd, null, null); 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 585eb949674fd3b83b706f795fc6b16ab1c66250c93Wei-Ta Chen 586ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed /** 587ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * Set the default config used for decoding bitmaps. This config is 588ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * presented to the codec if the caller did not specify a preferred config 589ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * in their call to decode... 590ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * 591ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * The default value is chosen by the system to best match the device's 592ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * screen and memory constraints. 593ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * 594ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * @param config The preferred config for decoding bitmaps. If null, then 595ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * a suitable default is chosen by the system. 596ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * 597ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * @hide - only called by the browser at the moment, but should be stable 598ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed * enough to expose if needed 599ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed */ 600ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed public static void setDefaultConfig(Bitmap.Config config) { 601ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed if (config == null) { 602ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed // pick this for now, as historically it was our default. 603ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed // However, if we have a smarter algorithm, we can change this. 604ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed config = Bitmap.Config.RGB_565; 605ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed } 606ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed nativeSetDefaultConfig(config.nativeInt); 607ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed } 608ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed 609ab4a0c164b5a44d5bfd37069cfe499db31e7620cMike Reed private static native void nativeSetDefaultConfig(int nativeConfig); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static native Bitmap nativeDecodeStream(InputStream is, byte[] storage, 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect padding, Options opts); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static native Bitmap nativeDecodeFileDescriptor(FileDescriptor fd, 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect padding, Options opts); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static native Bitmap nativeDecodeAsset(int asset, Rect padding, Options opts); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static native Bitmap nativeDecodeByteArray(byte[] data, int offset, 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length, Options opts); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static native byte[] nativeScaleNinePatch(byte[] chunk, float scale, Rect pad); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 619