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