BitmapFactory_Delegate.java revision 779c906592b67867fee83a6527d474c333a701ff
1779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet/* 2779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * Copyright (C) 2011 The Android Open Source Project 3779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * 4779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License"); 5779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * you may not use this file except in compliance with the License. 6779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * You may obtain a copy of the License at 7779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * 8779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * http://www.apache.org/licenses/LICENSE-2.0 9779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * 10779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * Unless required by applicable law or agreed to in writing, software 11779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS, 12779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * See the License for the specific language governing permissions and 14779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * limitations under the License. 15779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet */ 16779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 17779c906592b67867fee83a6527d474c333a701ffXavier Ducrohetpackage android.graphics; 18779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 19779c906592b67867fee83a6527d474c333a701ffXavier Ducrohetimport com.android.layoutlib.bridge.Bridge; 20779c906592b67867fee83a6527d474c333a701ffXavier Ducrohetimport com.android.layoutlib.bridge.android.BridgeResources.NinePatchInputStream; 21779c906592b67867fee83a6527d474c333a701ffXavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager; 22779c906592b67867fee83a6527d474c333a701ffXavier Ducrohetimport com.android.ninepatch.NinePatchChunk; 23779c906592b67867fee83a6527d474c333a701ffXavier Ducrohetimport com.android.resources.Density; 24779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 25779c906592b67867fee83a6527d474c333a701ffXavier Ducrohetimport android.graphics.BitmapFactory.Options; 26779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 27779c906592b67867fee83a6527d474c333a701ffXavier Ducrohetimport java.io.FileDescriptor; 28779c906592b67867fee83a6527d474c333a701ffXavier Ducrohetimport java.io.IOException; 29779c906592b67867fee83a6527d474c333a701ffXavier Ducrohetimport java.io.InputStream; 30779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 31779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet/** 32779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * Delegate implementing the native methods of android.graphics.BitmapFactory 33779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * 34779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * Through the layoutlib_create tool, the original native methods of BitmapFactory have been 35779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * replaced by calls to methods of the same name in this delegate class. 36779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * 37779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * Because it's a stateless class to start with, there's no need to keep a {@link DelegateManager} 38779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * around to map int to instance of the delegate. 39779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet * 40779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet */ 41779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet/*package*/ class BitmapFactory_Delegate { 42779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 43779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet // ------ Native Delegates ------ 44779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 45779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet /*package*/ static void nativeSetDefaultConfig(int nativeConfig) { 46779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet // pass 47779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } 48779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 49779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet /*package*/ static Bitmap nativeDecodeStream(InputStream is, byte[] storage, 50779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet Rect padding, Options opts) { 51779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet Bitmap bm = null; 52779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 53779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet Density density = Density.MEDIUM; 54779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet if (opts != null) { 55779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet density = Density.getEnum(opts.inDensity); 56779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } 57779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 58779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet try { 59779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet if (is instanceof NinePatchInputStream) { 60779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet NinePatchInputStream npis = (NinePatchInputStream) is; 61779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet npis.disableFakeMarkSupport(); 62779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 63779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet // load the bitmap as a nine patch 64779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet com.android.ninepatch.NinePatch ninePatch = com.android.ninepatch.NinePatch.load( 65779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet npis, true /*is9Patch*/, false /*convert*/); 66779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 67779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet // get the bitmap and chunk objects. 68779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet bm = Bitmap_Delegate.createBitmap(ninePatch.getImage(), true /*isMutable*/, 69779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet density); 70779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet NinePatchChunk chunk = ninePatch.getChunk(); 71779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 72779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet // put the chunk in the bitmap 73779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet bm.setNinePatchChunk(NinePatch_Delegate.serialize(chunk)); 74779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 75779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet // read the padding 76779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet int[] paddingarray = chunk.getPadding(); 77779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet padding.left = paddingarray[0]; 78779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet padding.top = paddingarray[1]; 79779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet padding.right = paddingarray[2]; 80779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet padding.bottom = paddingarray[3]; 81779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } else { 82779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet // load the bitmap directly. 83779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet bm = Bitmap_Delegate.createBitmap(is, true, density); 84779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } 85779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } catch (IOException e) { 86779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet Bridge.getLog().error(null,"Failed to load image" , e, null); 87779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } 88779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 89779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet return bm; 90779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } 91779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 92779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet /*package*/ static Bitmap nativeDecodeFileDescriptor(FileDescriptor fd, 93779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet Rect padding, Options opts) { 94779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet opts.inBitmap = null; 95779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet return null; 96779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } 97779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 98779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet /*package*/ static Bitmap nativeDecodeAsset(int asset, Rect padding, Options opts) { 99779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet opts.inBitmap = null; 100779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet return null; 101779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } 102779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 103779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet /*package*/ static Bitmap nativeDecodeByteArray(byte[] data, int offset, 104779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet int length, Options opts) { 105779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet opts.inBitmap = null; 106779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet return null; 107779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } 108779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 109779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet /*package*/ static byte[] nativeScaleNinePatch(byte[] chunk, float scale, Rect pad) { 110779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet // don't scale for now. 111779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet return chunk; 112779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } 113779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet 114779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet /*package*/ static boolean nativeIsSeekable(FileDescriptor fd) { 115779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet return true; 116779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet } 117779c906592b67867fee83a6527d474c333a701ffXavier Ducrohet} 118