Bitmap_Delegate.java revision 69fea4897f756b9cf489a92b7073554086e6d252
1ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/* 2ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Copyright (C) 2010 The Android Open Source Project 3ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 4ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * you may not use this file except in compliance with the License. 6ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * You may obtain a copy of the License at 7ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 8ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 10ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Unless required by applicable law or agreed to in writing, software 11ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * See the License for the specific language governing permissions and 14ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * limitations under the License. 15ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 16ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 17ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipackage android.graphics; 18ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 19ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.LayoutLog; 20ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.Bridge; 21ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.impl.DelegateManager; 22ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.resources.Density; 23ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 24ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 25ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.graphics.Bitmap.Config; 26ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.os.Parcel; 27ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 28ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.awt.Graphics2D; 29ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.awt.image.BufferedImage; 30ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.File; 31ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.IOException; 32ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.InputStream; 33ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.OutputStream; 34ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.nio.Buffer; 35ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.Arrays; 36835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Guptaimport java.util.EnumSet; 37835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Guptaimport java.util.Set; 38ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 39ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport javax.imageio.ImageIO; 40ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 41ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/** 42ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Delegate implementing the native methods of android.graphics.Bitmap 43ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 44ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Through the layoutlib_create tool, the original native methods of Bitmap have been replaced 45ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * by calls to methods of the same name in this delegate class. 46ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 47ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * This class behaves like the original native implementation, but in Java, keeping previously 48ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * native data into its own objects and mapping them to int that are sent back and forth between 49ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * it and the original Bitmap class. 50ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 51ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see DelegateManager 52ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 53ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 54ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipublic final class Bitmap_Delegate { 55ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 56835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta public enum BitmapCreateFlags { 57835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta PREMULTIPLIED, MUTABLE 58835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta } 59835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta 60ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- delegate manager ---- 61ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private static final DelegateManager<Bitmap_Delegate> sManager = 62ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski new DelegateManager<Bitmap_Delegate>(Bitmap_Delegate.class); 63ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 64ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- delegate helper data ---- 65ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 66ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- delegate data ---- 67ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private final Config mConfig; 68ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private BufferedImage mImage; 69ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private boolean mHasAlpha = true; 70ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private boolean mHasMipMap = false; // TODO: check the default. 71ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private int mGenerationId = 0; 72ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 73ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 74ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- Public Helper methods ---- 75ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 76ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 77ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Returns the native delegate associated to a given {@link Bitmap_Delegate} object. 78ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 79ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public static Bitmap_Delegate getDelegate(Bitmap bitmap) { 80ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return sManager.getDelegate(bitmap.mNativeBitmap); 81ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 82ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 83ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 84ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Returns the native delegate associated to a given an int referencing a {@link Bitmap} object. 85ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 86ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath public static Bitmap_Delegate getDelegate(long native_bitmap) { 87ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return sManager.getDelegate(native_bitmap); 88ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 89ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 90ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 91ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Creates and returns a {@link Bitmap} initialized with the given file content. 92ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 93ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param input the file from which to read the bitmap content 94ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param isMutable whether the bitmap is mutable 95ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param density the density associated with the bitmap 96ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 97ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#isMutable() 98ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#getDensity() 99ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 100ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public static Bitmap createBitmap(File input, boolean isMutable, Density density) 101ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski throws IOException { 102835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density); 103835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta } 10469fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta 105835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta /** 106835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * Creates and returns a {@link Bitmap} initialized with the given file content. 107835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * 108835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param input the file from which to read the bitmap content 109835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param density the density associated with the bitmap 110835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * 11169fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta * @see Bitmap#isPremultiplied() 112835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#isMutable() 113835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#getDensity() 114835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta */ 115835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta public static Bitmap createBitmap(File input, Set<BitmapCreateFlags> createFlags, 116835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta Density density) throws IOException { 117ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create a delegate with the content of the file. 118ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); 11969fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta 120835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(delegate, createFlags, density.getDpiValue()); 121ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 122ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 123ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 124ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Creates and returns a {@link Bitmap} initialized with the given stream content. 125ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 126ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param input the stream from which to read the bitmap content 127ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param isMutable whether the bitmap is mutable 128ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param density the density associated with the bitmap 129ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 130ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#isMutable() 131ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#getDensity() 132ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 133ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public static Bitmap createBitmap(InputStream input, boolean isMutable, Density density) 134ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski throws IOException { 135835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density); 136835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta } 137835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta 138835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta /** 139835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * Creates and returns a {@link Bitmap} initialized with the given stream content. 140835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * 141835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param input the stream from which to read the bitmap content 142835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param createFlags 143835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param density the density associated with the bitmap 144835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * 14569fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta * @see Bitmap#isPremultiplied() 146835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#isMutable() 147835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#getDensity() 148835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta */ 149835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta public static Bitmap createBitmap(InputStream input, Set<BitmapCreateFlags> createFlags, 150835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta Density density) throws IOException { 151ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create a delegate with the content of the stream. 152ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); 153ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 154835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(delegate, createFlags, density.getDpiValue()); 155ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 156ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 157ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 158ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Creates and returns a {@link Bitmap} initialized with the given {@link BufferedImage} 159ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 160ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param image the bitmap content 161ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param isMutable whether the bitmap is mutable 162ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param density the density associated with the bitmap 163ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 164ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#isMutable() 165ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#getDensity() 166ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 167ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public static Bitmap createBitmap(BufferedImage image, boolean isMutable, 168ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Density density) throws IOException { 169835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(image, getPremultipliedBitmapCreateFlags(isMutable), density); 170835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta } 171835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta 172835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta /** 173835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * Creates and returns a {@link Bitmap} initialized with the given {@link BufferedImage} 174835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * 175835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param image the bitmap content 176835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param createFlags 177835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param density the density associated with the bitmap 178835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * 17969fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta * @see Bitmap#isPremultiplied() 180835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#isMutable() 181835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#getDensity() 182835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta */ 183835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta public static Bitmap createBitmap(BufferedImage image, Set<BitmapCreateFlags> createFlags, 184835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta Density density) throws IOException { 185ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create a delegate with the given image. 186ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ARGB_8888); 187ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 188835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(delegate, createFlags, density.getDpiValue()); 189ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 190ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 191ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 192ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Returns the {@link BufferedImage} used by the delegate of the given {@link Bitmap}. 193ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 194ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public static BufferedImage getImage(Bitmap bitmap) { 195ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 196ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(bitmap.mNativeBitmap); 197ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 198ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return null; 199ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 200ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 201ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return delegate.mImage; 202ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 203ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 204ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public static int getBufferedImageType(int nativeBitmapConfig) { 205ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski switch (Config.nativeToConfig(nativeBitmapConfig)) { 206ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski case ALPHA_8: 207ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return BufferedImage.TYPE_INT_ARGB; 208ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski case RGB_565: 209ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return BufferedImage.TYPE_INT_ARGB; 210ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski case ARGB_4444: 211ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return BufferedImage.TYPE_INT_ARGB; 212ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski case ARGB_8888: 213ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return BufferedImage.TYPE_INT_ARGB; 214ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 215ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 216ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return BufferedImage.TYPE_INT_ARGB; 217ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 218ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 219ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 220ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Returns the {@link BufferedImage} used by the delegate of the given {@link Bitmap}. 221ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 222ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public BufferedImage getImage() { 223ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mImage; 224ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 225ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 226ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 227ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Returns the Android bitmap config. Note that this not the config of the underlying 228ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Java2D bitmap. 229ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 230ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public Config getConfig() { 231ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mConfig; 232ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 233ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 234ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 235ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Returns the hasAlpha rendering hint 236ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @return true if the bitmap alpha should be used at render time 237ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 238ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public boolean hasAlpha() { 239ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mHasAlpha && mConfig != Config.RGB_565; 240ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 241ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 242ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public boolean hasMipMap() { 243ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // TODO: check if more checks are required as in hasAlpha. 244ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mHasMipMap; 245ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 246ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 247ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Update the generationId. 248ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 249ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#getGenerationId() 250ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 251ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public void change() { 252ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mGenerationId++; 253ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 254ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 255ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- native methods ---- 256ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 257ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 258ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width, 259835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta int height, int nativeConfig, boolean isMutable) { 260ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int imageType = getBufferedImageType(nativeConfig); 261ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 262ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create the image 263ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image = new BufferedImage(width, height, imageType); 264ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 265ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (colors != null) { 266ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image.setRGB(0, 0, width, height, colors, offset, stride); 267ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 268ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 269ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create a delegate with the content of the stream. 270ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.nativeToConfig(nativeConfig)); 271ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 272835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(delegate, getPremultipliedBitmapCreateFlags(isMutable), 27369fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta Bitmap.getDefaultDensity()); 274ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 275ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 276ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 277ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static Bitmap nativeCopy(long srcBitmap, int nativeConfig, boolean isMutable) { 278ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate srcBmpDelegate = sManager.getDelegate(srcBitmap); 279ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (srcBmpDelegate == null) { 280ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return null; 281ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 282ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 283ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage srcImage = srcBmpDelegate.getImage(); 284ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 285ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int width = srcImage.getWidth(); 286ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int height = srcImage.getHeight(); 287ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 288ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int imageType = getBufferedImageType(nativeConfig); 289ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 290ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create the image 291ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image = new BufferedImage(width, height, imageType); 292ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 293ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // copy the source image into the image. 294ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] argb = new int[width * height]; 295ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski srcImage.getRGB(0, 0, width, height, argb, 0, width); 296ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image.setRGB(0, 0, width, height, argb, 0, width); 297ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 298ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create a delegate with the content of the stream. 299ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.nativeToConfig(nativeConfig)); 300ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 301835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(delegate, getPremultipliedBitmapCreateFlags(isMutable), 302835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta Bitmap.getDefaultDensity()); 303ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 304ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 305ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 306ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeDestructor(long nativeBitmap) { 307ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski sManager.removeJavaReferenceFor(nativeBitmap); 308ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 309ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 310ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 31169fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta /*package*/ static boolean nativeRecycle(long nativeBitmap) { 312ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski sManager.removeJavaReferenceFor(nativeBitmap); 31369fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta return true; 31469fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta } 31569fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta 31669fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta @LayoutlibDelegate 31769fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta /*package*/ static void nativeReconfigure(long nativeBitmap, int width, int height, 31869fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta int config, int allocSize) { 31969fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, 32069fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta "Bitmap.reconfigure() is not supported", null /*data*/); 321ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 322ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 323ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 324ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static boolean nativeCompress(long nativeBitmap, int format, int quality, 325ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski OutputStream stream, byte[] tempStorage) { 326ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, 327ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "Bitmap.compress() is not supported", null /*data*/); 328ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return true; 329ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 330ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 331ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 332ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeErase(long nativeBitmap, int color) { 333ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 334ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 335ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 336ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 337ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 338ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 339ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image = delegate.mImage; 340ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 341ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Graphics2D g = image.createGraphics(); 342ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski try { 343ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski g.setColor(new java.awt.Color(color, true)); 344ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 345ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski g.fillRect(0, 0, image.getWidth(), image.getHeight()); 346ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } finally { 347ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski g.dispose(); 348ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 349ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 350ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 351ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 352ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static int nativeRowBytes(long nativeBitmap) { 353ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 354ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 355ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 356ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return 0; 357ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 358ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 359ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return delegate.mImage.getWidth(); 360ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 361ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 362ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 363ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static int nativeConfig(long nativeBitmap) { 364ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 365ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 366ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 367ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return 0; 368ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 369ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 370ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return delegate.mConfig.nativeInt; 371ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 372ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 373ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 374ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static boolean nativeHasAlpha(long nativeBitmap) { 375ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 376ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 377ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 378ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return true; 379ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 380ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 381ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return delegate.mHasAlpha; 382ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 383ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 384ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 385ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static boolean nativeHasMipMap(long nativeBitmap) { 386ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 387ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 388ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 389ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return true; 390ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 391ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 392ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return delegate.mHasMipMap; 393ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 394ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 395ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 39669fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta /*package*/ static int nativeGetPixel(long nativeBitmap, int x, int y, 39769fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta boolean isPremultiplied) { 398ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 399ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 400ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 401ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return 0; 402ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 403ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 40469fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta // TODO: Support isPremultiplied. 405ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return delegate.mImage.getRGB(x, y); 406ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 407ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 408ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 409ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeGetPixels(long nativeBitmap, int[] pixels, int offset, 41069fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta int stride, int x, int y, int width, int height, boolean isPremultiplied) { 411ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 412ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 413ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 414ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 415ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 416ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski delegate.getImage().getRGB(x, y, width, height, pixels, offset, stride); 417ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 418ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 419ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 420ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 42169fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta /*package*/ static void nativeSetPixel(long nativeBitmap, int x, int y, int color, 42269fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta boolean isPremultiplied) { 423ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 424ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 425ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 426ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 427ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 428ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski delegate.getImage().setRGB(x, y, color); 429ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 430ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 431ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 432ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeSetPixels(long nativeBitmap, int[] colors, int offset, 43369fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta int stride, int x, int y, int width, int height, boolean isPremultiplied) { 434ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 435ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 436ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 437ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 438ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 439ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski delegate.getImage().setRGB(x, y, width, height, colors, offset, stride); 440ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 441ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 442ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 443ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeCopyPixelsToBuffer(long nativeBitmap, Buffer dst) { 444ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // FIXME implement native delegate 445ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 446ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "Bitmap.copyPixelsToBuffer is not supported.", null, null /*data*/); 447ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 448ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 449ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 450ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeCopyPixelsFromBuffer(long nb, Buffer src) { 451ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // FIXME implement native delegate 452ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 453ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "Bitmap.copyPixelsFromBuffer is not supported.", null, null /*data*/); 454ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 455ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 456ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 457ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static int nativeGenerationId(long nativeBitmap) { 458ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 459ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 460ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return 0; 461ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 462ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 463ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return delegate.mGenerationId; 464ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 465ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 466ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 467ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /*package*/ static Bitmap nativeCreateFromParcel(Parcel p) { 468ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // This is only called by Bitmap.CREATOR (Parcelable.Creator<Bitmap>), which is only 469ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // used during aidl call so really this should not be called. 470ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, 471ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "AIDL is not suppored, and therefore Bitmaps cannot be created from parcels.", 472ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski null /*data*/); 473ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return null; 474ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 475ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 476ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 477ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static boolean nativeWriteToParcel(long nativeBitmap, boolean isMutable, 478ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int density, Parcel p) { 479ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // This is only called when sending a bitmap through aidl, so really this should not 480ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // be called. 481ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, 482ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "AIDL is not suppored, and therefore Bitmaps cannot be written to parcels.", 483ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski null /*data*/); 484ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return false; 485ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 486ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 487ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 488ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static Bitmap nativeExtractAlpha(long nativeBitmap, long nativePaint, 489ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] offsetXY) { 490ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate bitmap = sManager.getDelegate(nativeBitmap); 491ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (bitmap == null) { 492ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return null; 493ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 494ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 495ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the paint which can be null if nativePaint is 0. 496ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Paint_Delegate paint = Paint_Delegate.getDelegate(nativePaint); 497ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 498ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (paint != null && paint.getMaskFilter() != null) { 499ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER, 500ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "MaskFilter not supported in Bitmap.extractAlpha", 501ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski null, null /*data*/); 502ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 503ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 504ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int alpha = paint != null ? paint.getAlpha() : 0xFF; 505ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image = createCopy(bitmap.getImage(), BufferedImage.TYPE_INT_ARGB, alpha); 506ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 507ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create the delegate. The actual Bitmap config is only an alpha channel 508ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ALPHA_8); 509ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 510ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // the density doesn't matter, it's set by the Java method. 511835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(delegate, EnumSet.of(BitmapCreateFlags.MUTABLE), 512ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Density.DEFAULT_DENSITY /*density*/); 513ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 514ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 515ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 516ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativePrepareToDraw(long nativeBitmap) { 517ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // nothing to be done here. 518ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 519ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 520ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 521ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeSetHasAlpha(long nativeBitmap, boolean hasAlpha) { 522ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 523ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 524ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 525ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 526ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 527ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 528ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski delegate.mHasAlpha = hasAlpha; 529ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 530ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 531ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 532ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeSetHasMipMap(long nativeBitmap, boolean hasMipMap) { 533ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 534ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 535ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 536ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 537ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 538ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 539ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski delegate.mHasMipMap = hasMipMap; 540ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 541ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 542ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 543ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static boolean nativeSameAs(long nb0, long nb1) { 544ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate1 = sManager.getDelegate(nb0); 545ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate1 == null) { 546ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return false; 547ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 548ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 549ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate2 = sManager.getDelegate(nb1); 550ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate2 == null) { 551ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return false; 552ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 553ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 554ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image1 = delegate1.getImage(); 555ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image2 = delegate2.getImage(); 556ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate1.mConfig != delegate2.mConfig || 557ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image1.getWidth() != image2.getWidth() || 558ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image1.getHeight() != image2.getHeight()) { 559ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return false; 560ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 561ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 562ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the internal data 563ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int w = image1.getWidth(); 564ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int h = image2.getHeight(); 565ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] argb1 = new int[w*h]; 566ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] argb2 = new int[w*h]; 567ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 568ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image1.getRGB(0, 0, w, h, argb1, 0, w); 569ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image2.getRGB(0, 0, w, h, argb2, 0, w); 570ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 571ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // compares 572ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate1.mConfig == Config.ALPHA_8) { 573ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // in this case we have to manually compare the alpha channel as the rest is garbage. 574ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski final int length = w*h; 575ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski for (int i = 0 ; i < length ; i++) { 576ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if ((argb1[i] & 0xFF000000) != (argb2[i] & 0xFF000000)) { 577ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return false; 578ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 579ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 580ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return true; 581ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 582ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 583ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return Arrays.equals(argb1, argb2); 584ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 585ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 586ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- Private delegate/helper methods ---- 587ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 588ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private Bitmap_Delegate(BufferedImage image, Config config) { 589ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mImage = image; 590ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mConfig = config; 591ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 592ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 593835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta private static Bitmap createBitmap(Bitmap_Delegate delegate, 594835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta Set<BitmapCreateFlags> createFlags, int density) { 595ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get its native_int 596ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath long nativeInt = sManager.addNewDelegate(delegate); 597ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 598835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta int width = delegate.mImage.getWidth(); 599835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta int height = delegate.mImage.getHeight(); 600835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta boolean isMutable = createFlags.contains(BitmapCreateFlags.MUTABLE); 601835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta boolean isPremultiplied = createFlags.contains(BitmapCreateFlags.PREMULTIPLIED); 602835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta 603ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // and create/return a new Bitmap with it 604835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return new Bitmap(nativeInt, null /* buffer */, width, height, density, isMutable, 605835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta isPremultiplied, null /*ninePatchChunk*/, null /* layoutBounds */); 606ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 607ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 608835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta private static Set<BitmapCreateFlags> getPremultipliedBitmapCreateFlags(boolean isMutable) { 60969fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta Set<BitmapCreateFlags> createFlags = EnumSet.of(BitmapCreateFlags.PREMULTIPLIED); 610835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta if (isMutable) { 611835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta createFlags.add(BitmapCreateFlags.MUTABLE); 612835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta } 613835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createFlags; 614835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta } 61569fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta 616ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 617ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Creates and returns a copy of a given BufferedImage. 618ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * <p/> 619ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * if alpha is different than 255, then it is applied to the alpha channel of each pixel. 620ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 621ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param image the image to copy 622ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param imageType the type of the new image 623ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param alpha an optional alpha modifier 624ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @return a new BufferedImage 625ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 626ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /*package*/ static BufferedImage createCopy(BufferedImage image, int imageType, int alpha) { 627ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int w = image.getWidth(); 628ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int h = image.getHeight(); 629ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 630ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage result = new BufferedImage(w, h, imageType); 631ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 632ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] argb = new int[w * h]; 633ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image.getRGB(0, 0, image.getWidth(), image.getHeight(), argb, 0, image.getWidth()); 634ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 635ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (alpha != 255) { 636ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski final int length = argb.length; 637ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski for (int i = 0 ; i < length; i++) { 638ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int a = (argb[i] >>> 24 * alpha) / 255; 639ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski argb[i] = (a << 24) | (argb[i] & 0x00FFFFFF); 640ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 641ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 642ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 643ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski result.setRGB(0, 0, w, h, argb, 0, w); 644ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 645ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return result; 646ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 647ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 648ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski} 649