Bitmap_Delegate.java revision 9fe7fca9bcdceade9c654c6a8dcf0c48be16d78d
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 199fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Guptaimport com.android.annotations.Nullable; 20ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.LayoutLog; 21ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.Bridge; 22ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.impl.DelegateManager; 23ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.resources.Density; 24ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 25ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 26ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.graphics.Bitmap.Config; 27ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.os.Parcel; 28ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 29ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.awt.Graphics2D; 30ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.awt.image.BufferedImage; 31ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.File; 32ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.IOException; 33ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.InputStream; 34ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.io.OutputStream; 35ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.nio.Buffer; 36ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.Arrays; 37835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Guptaimport java.util.EnumSet; 38835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Guptaimport java.util.Set; 39ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 40ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport javax.imageio.ImageIO; 41ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 42ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/** 43ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Delegate implementing the native methods of android.graphics.Bitmap 44ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 45ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Through the layoutlib_create tool, the original native methods of Bitmap have been replaced 46ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * by calls to methods of the same name in this delegate class. 47ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 48ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * This class behaves like the original native implementation, but in Java, keeping previously 49ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * native data into its own objects and mapping them to int that are sent back and forth between 50ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * it and the original Bitmap class. 51ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 52ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see DelegateManager 53ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 54ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 55ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipublic final class Bitmap_Delegate { 56ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 57eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta 58835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta public enum BitmapCreateFlags { 59835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta PREMULTIPLIED, MUTABLE 60835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta } 61835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta 62ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- delegate manager ---- 63ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private static final DelegateManager<Bitmap_Delegate> sManager = 64ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski new DelegateManager<Bitmap_Delegate>(Bitmap_Delegate.class); 65ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 66ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- delegate helper data ---- 67ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 68ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- delegate data ---- 69ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private final Config mConfig; 70ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private BufferedImage mImage; 71ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private boolean mHasAlpha = true; 72ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private boolean mHasMipMap = false; // TODO: check the default. 73eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta private boolean mIsPremultiplied = true; 74ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private int mGenerationId = 0; 75ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 76ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 77ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- Public Helper methods ---- 78ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 79ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 80ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Returns the native delegate associated to a given an int referencing a {@link Bitmap} object. 81ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 82ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath public static Bitmap_Delegate getDelegate(long native_bitmap) { 83ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return sManager.getDelegate(native_bitmap); 84ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 85ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 869fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta @Nullable 879fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta public static Bitmap_Delegate getDelegate(@Nullable Bitmap bitmap) { 889fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta // refSkPixelRef is a hack to get the native pointer: see #nativeRefPixelRef() 899fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta return bitmap == null ? null : getDelegate(bitmap.refSkPixelRef()); 909fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta } 919fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta 92ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 93ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Creates and returns a {@link Bitmap} initialized with the given file content. 94ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 95ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param input the file from which to read the bitmap content 96ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param isMutable whether the bitmap is mutable 97ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param density the density associated with the bitmap 98ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 99ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#isMutable() 100ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#getDensity() 101ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 102ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public static Bitmap createBitmap(File input, boolean isMutable, Density density) 103ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski throws IOException { 104835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density); 105835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta } 10669fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta 107835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta /** 108835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * Creates and returns a {@link Bitmap} initialized with the given file content. 109835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * 110835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param input the file from which to read the bitmap content 111835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param density the density associated with the bitmap 112835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * 11369fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta * @see Bitmap#isPremultiplied() 114835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#isMutable() 115835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#getDensity() 116835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta */ 117835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta public static Bitmap createBitmap(File input, Set<BitmapCreateFlags> createFlags, 118835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta Density density) throws IOException { 119ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create a delegate with the content of the file. 120ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); 12169fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta 122835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(delegate, createFlags, density.getDpiValue()); 123ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 124ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 125ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 126ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Creates and returns a {@link Bitmap} initialized with the given stream content. 127ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 128ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param input the stream from which to read the bitmap content 129ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param isMutable whether the bitmap is mutable 130ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param density the density associated with the bitmap 131ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 132ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#isMutable() 133ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#getDensity() 134ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 135ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public static Bitmap createBitmap(InputStream input, boolean isMutable, Density density) 136ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski throws IOException { 137835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density); 138835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta } 139835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta 140835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta /** 141835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * Creates and returns a {@link Bitmap} initialized with the given stream content. 142835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * 143835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param input the stream from which to read the bitmap content 144835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @param density the density associated with the bitmap 145835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * 14669fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta * @see Bitmap#isPremultiplied() 147835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#isMutable() 148835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#getDensity() 149835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta */ 150835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta public static Bitmap createBitmap(InputStream input, Set<BitmapCreateFlags> createFlags, 151835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta Density density) throws IOException { 152ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create a delegate with the content of the stream. 153ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); 154ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 155835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(delegate, createFlags, density.getDpiValue()); 156ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 157ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 158ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 159ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Creates and returns a {@link Bitmap} initialized with the given {@link BufferedImage} 160ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 161ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param image the bitmap content 162ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param isMutable whether the bitmap is mutable 163ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param density the density associated with the bitmap 164ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 165ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#isMutable() 166ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#getDensity() 167ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 168c8460df6228766eaf9f1f6e15994f9ba84910a4dDeepanshu Gupta public static Bitmap createBitmap(BufferedImage image, boolean isMutable, Density density) { 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 density the density associated with the bitmap 177835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * 17869fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta * @see Bitmap#isPremultiplied() 179835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#isMutable() 180835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta * @see Bitmap#getDensity() 181835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta */ 182835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta public static Bitmap createBitmap(BufferedImage image, Set<BitmapCreateFlags> createFlags, 183c8460df6228766eaf9f1f6e15994f9ba84910a4dDeepanshu Gupta Density density) { 184ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create a delegate with the given image. 185ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ARGB_8888); 186ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 187835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(delegate, createFlags, density.getDpiValue()); 188ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 189ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 1909fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta private static int getBufferedImageType() { 191ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return BufferedImage.TYPE_INT_ARGB; 192ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 193ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 194ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 195ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Returns the {@link BufferedImage} used by the delegate of the given {@link Bitmap}. 196ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 197ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public BufferedImage getImage() { 198ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mImage; 199ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 200ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 201ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 202ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Returns the Android bitmap config. Note that this not the config of the underlying 203ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Java2D bitmap. 204ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 205ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public Config getConfig() { 206ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mConfig; 207ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 208ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 209ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 210ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Returns the hasAlpha rendering hint 211ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @return true if the bitmap alpha should be used at render time 212ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 213ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public boolean hasAlpha() { 214ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mHasAlpha && mConfig != Config.RGB_565; 215ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 216ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 217ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 218ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Update the generationId. 219ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 220ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Bitmap#getGenerationId() 221ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 222ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public void change() { 223ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mGenerationId++; 224ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 225ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 226ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- native methods ---- 227ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 228ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 229ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width, 230835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta int height, int nativeConfig, boolean isMutable) { 2319fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta int imageType = getBufferedImageType(); 232ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 233ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create the image 234ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image = new BufferedImage(width, height, imageType); 235ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 236ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (colors != null) { 237ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image.setRGB(0, 0, width, height, colors, offset, stride); 238ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 239ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 240ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create a delegate with the content of the stream. 241ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.nativeToConfig(nativeConfig)); 242ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 243835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(delegate, getPremultipliedBitmapCreateFlags(isMutable), 24469fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta Bitmap.getDefaultDensity()); 245ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 246ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 247ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 248ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static Bitmap nativeCopy(long srcBitmap, int nativeConfig, boolean isMutable) { 249ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate srcBmpDelegate = sManager.getDelegate(srcBitmap); 250ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (srcBmpDelegate == null) { 251ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return null; 252ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 253ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 254ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage srcImage = srcBmpDelegate.getImage(); 255ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 256ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int width = srcImage.getWidth(); 257ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int height = srcImage.getHeight(); 258ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 2599fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta int imageType = getBufferedImageType(); 260ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 261ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create the image 262ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image = new BufferedImage(width, height, imageType); 263ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 264ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // copy the source image into the image. 265ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] argb = new int[width * height]; 266ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski srcImage.getRGB(0, 0, width, height, argb, 0, width); 267ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image.setRGB(0, 0, width, height, argb, 0, width); 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), 273835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta Bitmap.getDefaultDensity()); 274ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 275ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 276ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 277ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeDestructor(long nativeBitmap) { 278ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski sManager.removeJavaReferenceFor(nativeBitmap); 279ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 280ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 281ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 28269fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta /*package*/ static boolean nativeRecycle(long nativeBitmap) { 283ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski sManager.removeJavaReferenceFor(nativeBitmap); 28469fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta return true; 28569fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta } 28669fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta 28769fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta @LayoutlibDelegate 28869fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta /*package*/ static void nativeReconfigure(long nativeBitmap, int width, int height, 289f587825e94af5200aadc77a86e9f5084ac1a4e94Deepanshu Gupta int config, int allocSize, boolean isPremultiplied) { 29069fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, 29169fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta "Bitmap.reconfigure() is not supported", null /*data*/); 292ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 293ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 294ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 295ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static boolean nativeCompress(long nativeBitmap, int format, int quality, 296ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski OutputStream stream, byte[] tempStorage) { 297ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, 298ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "Bitmap.compress() is not supported", null /*data*/); 299ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return true; 300ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 301ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 302ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 303ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeErase(long nativeBitmap, int color) { 304ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 305ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 306ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 307ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 308ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 309ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 310ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image = delegate.mImage; 311ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 312ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Graphics2D g = image.createGraphics(); 313ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski try { 314ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski g.setColor(new java.awt.Color(color, true)); 315ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 316ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski g.fillRect(0, 0, image.getWidth(), image.getHeight()); 317ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } finally { 318ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski g.dispose(); 319ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 320ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 321ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 322ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 323ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static int nativeRowBytes(long nativeBitmap) { 324ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 325ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 326ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 327ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return 0; 328ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 329ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 330ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return delegate.mImage.getWidth(); 331ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 332ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 333ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 334ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static int nativeConfig(long nativeBitmap) { 335ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 336ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 337ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 338ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return 0; 339ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 340ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 341ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return delegate.mConfig.nativeInt; 342ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 343ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 344ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 345ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static boolean nativeHasAlpha(long nativeBitmap) { 346ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 347ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 3489fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta return delegate == null || delegate.mHasAlpha; 349ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 350ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 351ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 352ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 353ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static boolean nativeHasMipMap(long nativeBitmap) { 354ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 355ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 3569fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta return delegate == null || delegate.mHasMipMap; 357ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 358ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 359ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 360ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 361eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta /*package*/ static int nativeGetPixel(long nativeBitmap, int x, int y) { 362ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 363ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 364ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 365ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return 0; 366ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 367ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 368ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return delegate.mImage.getRGB(x, y); 369ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 370ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 371ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 372ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeGetPixels(long nativeBitmap, int[] pixels, int offset, 373eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta int stride, int x, int y, int width, int height) { 374ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 375ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 376ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 377ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 378ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 379ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski delegate.getImage().getRGB(x, y, width, height, pixels, offset, stride); 380ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 381ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 382ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 383ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 384eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta /*package*/ static void nativeSetPixel(long nativeBitmap, int x, int y, int color) { 385ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 386ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 387ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 388ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 389ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 390ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski delegate.getImage().setRGB(x, y, color); 391ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 392ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 393ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 394ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeSetPixels(long nativeBitmap, int[] colors, int offset, 395eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta int stride, int x, int y, int width, int height) { 396ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 397ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 398ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 399ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 400ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 401ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski delegate.getImage().setRGB(x, y, width, height, colors, offset, stride); 402ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 403ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 404ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 405ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeCopyPixelsToBuffer(long nativeBitmap, Buffer dst) { 406ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // FIXME implement native delegate 407ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 408ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "Bitmap.copyPixelsToBuffer is not supported.", null, null /*data*/); 409ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 410ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 411ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 412ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeCopyPixelsFromBuffer(long nb, Buffer src) { 413ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // FIXME implement native delegate 414ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().fidelityWarning(LayoutLog.TAG_UNSUPPORTED, 415ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "Bitmap.copyPixelsFromBuffer is not supported.", null, null /*data*/); 416ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 417ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 418ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 419ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static int nativeGenerationId(long nativeBitmap) { 420ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 421ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 422ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return 0; 423ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 424ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 425ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return delegate.mGenerationId; 426ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 427ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 428ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 429ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /*package*/ static Bitmap nativeCreateFromParcel(Parcel p) { 430ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // This is only called by Bitmap.CREATOR (Parcelable.Creator<Bitmap>), which is only 431ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // used during aidl call so really this should not be called. 432ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, 433ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "AIDL is not suppored, and therefore Bitmaps cannot be created from parcels.", 434ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski null /*data*/); 435ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return null; 436ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 437ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 438ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 439ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static boolean nativeWriteToParcel(long nativeBitmap, boolean isMutable, 440ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int density, Parcel p) { 441ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // This is only called when sending a bitmap through aidl, so really this should not 442ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // be called. 443ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().error(LayoutLog.TAG_UNSUPPORTED, 444ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "AIDL is not suppored, and therefore Bitmaps cannot be written to parcels.", 445ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski null /*data*/); 446ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return false; 447ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 448ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 449ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 450ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static Bitmap nativeExtractAlpha(long nativeBitmap, long nativePaint, 451ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] offsetXY) { 452ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate bitmap = sManager.getDelegate(nativeBitmap); 453ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (bitmap == null) { 454ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return null; 455ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 456ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 457ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the paint which can be null if nativePaint is 0. 458ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Paint_Delegate paint = Paint_Delegate.getDelegate(nativePaint); 459ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 460ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (paint != null && paint.getMaskFilter() != null) { 461ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().fidelityWarning(LayoutLog.TAG_MASKFILTER, 462ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "MaskFilter not supported in Bitmap.extractAlpha", 463ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski null, null /*data*/); 464ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 465ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 466ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int alpha = paint != null ? paint.getAlpha() : 0xFF; 467ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image = createCopy(bitmap.getImage(), BufferedImage.TYPE_INT_ARGB, alpha); 468ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 469ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // create the delegate. The actual Bitmap config is only an alpha channel 470ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ALPHA_8); 471ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 472ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // the density doesn't matter, it's set by the Java method. 473835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createBitmap(delegate, EnumSet.of(BitmapCreateFlags.MUTABLE), 474ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Density.DEFAULT_DENSITY /*density*/); 475ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 476ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 477ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 478eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta /*package*/ static boolean nativeIsPremultiplied(long nativeBitmap) { 479eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta // get the delegate from the native int. 480eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 481eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta return delegate != null && delegate.mIsPremultiplied; 482eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta 483eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta } 484eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta 485eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta @LayoutlibDelegate 486eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta /*package*/ static void nativeSetPremultiplied(long nativeBitmap, boolean isPremul) { 487eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta // get the delegate from the native int. 488eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 489eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta if (delegate == null) { 490eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta return; 491eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta } 492eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta 493eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta delegate.mIsPremultiplied = isPremul; 494eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta } 495eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta 496eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta @LayoutlibDelegate 497eeb44a29846ac0d36a1fad1b6869e932d1dc01ceDeepanshu Gupta /*package*/ static void nativeSetHasAlpha(long nativeBitmap, boolean hasAlpha, 498cd0ed56f8a5f7788bcff050ab8aa42b0504e8535Deepanshu Gupta boolean isPremul) { 499ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 500ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 501ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 502ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 503ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 504ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 505ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski delegate.mHasAlpha = hasAlpha; 506ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 507ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 508ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 509ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static void nativeSetHasMipMap(long nativeBitmap, boolean hasMipMap) { 510ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the delegate from the native int. 511ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate = sManager.getDelegate(nativeBitmap); 512ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate == null) { 513ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return; 514ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 515ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 516ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski delegate.mHasMipMap = hasMipMap; 517ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 518ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 519ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 520ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath /*package*/ static boolean nativeSameAs(long nb0, long nb1) { 521ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate1 = sManager.getDelegate(nb0); 522ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate1 == null) { 523ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return false; 524ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 525ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 526ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bitmap_Delegate delegate2 = sManager.getDelegate(nb1); 527ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate2 == null) { 528ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return false; 529ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 530ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 531ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image1 = delegate1.getImage(); 532ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage image2 = delegate2.getImage(); 533ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate1.mConfig != delegate2.mConfig || 534ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image1.getWidth() != image2.getWidth() || 535ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image1.getHeight() != image2.getHeight()) { 536ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return false; 537ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 538ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 539ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get the internal data 540ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int w = image1.getWidth(); 541ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int h = image2.getHeight(); 542ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] argb1 = new int[w*h]; 543ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] argb2 = new int[w*h]; 544ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 545ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image1.getRGB(0, 0, w, h, argb1, 0, w); 546ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image2.getRGB(0, 0, w, h, argb2, 0, w); 547ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 548ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // compares 549ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (delegate1.mConfig == Config.ALPHA_8) { 550ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // in this case we have to manually compare the alpha channel as the rest is garbage. 551ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski final int length = w*h; 552ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski for (int i = 0 ; i < length ; i++) { 553ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if ((argb1[i] & 0xFF000000) != (argb2[i] & 0xFF000000)) { 554ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return false; 555ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 556ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 557ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return true; 558ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 559ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 560ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return Arrays.equals(argb1, argb2); 561ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 562ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 5639fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta // Only used by AssetAtlasService, which we don't care about. 5649fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta @LayoutlibDelegate 5659fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta /*package*/ static long nativeRefPixelRef(long nativeBitmap) { 5669fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta // Hack: This is called by Bitmap.refSkPixelRef() and LayoutLib uses that method to get 5679fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta // the native pointer from a Bitmap. So, we return nativeBitmap here. 5689fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta return nativeBitmap; 5699fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta } 5709fe7fca9bcdceade9c654c6a8dcf0c48be16d78dDeepanshu Gupta 571ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- Private delegate/helper methods ---- 572ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 573ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private Bitmap_Delegate(BufferedImage image, Config config) { 574ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mImage = image; 575ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mConfig = config; 576ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 577ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 578835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta private static Bitmap createBitmap(Bitmap_Delegate delegate, 579835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta Set<BitmapCreateFlags> createFlags, int density) { 580ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // get its native_int 581ec4118922fa844ef31b73d16adc76f4da4c6c8e6Narayan Kamath long nativeInt = sManager.addNewDelegate(delegate); 582ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 583835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta int width = delegate.mImage.getWidth(); 584835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta int height = delegate.mImage.getHeight(); 585835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta boolean isMutable = createFlags.contains(BitmapCreateFlags.MUTABLE); 586835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta boolean isPremultiplied = createFlags.contains(BitmapCreateFlags.PREMULTIPLIED); 587835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta 588ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // and create/return a new Bitmap with it 589835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return new Bitmap(nativeInt, null /* buffer */, width, height, density, isMutable, 590835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta isPremultiplied, null /*ninePatchChunk*/, null /* layoutBounds */); 591ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 592ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 593835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta private static Set<BitmapCreateFlags> getPremultipliedBitmapCreateFlags(boolean isMutable) { 59469fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta Set<BitmapCreateFlags> createFlags = EnumSet.of(BitmapCreateFlags.PREMULTIPLIED); 595835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta if (isMutable) { 596835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta createFlags.add(BitmapCreateFlags.MUTABLE); 597835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta } 598835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta return createFlags; 599835e279c3960664c32b35aa7e3215b13c8fa3be4Deepanshu Gupta } 60069fea4897f756b9cf489a92b7073554086e6d252Deepanshu Gupta 601ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 602ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Creates and returns a copy of a given BufferedImage. 603ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * <p/> 604ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * if alpha is different than 255, then it is applied to the alpha channel of each pixel. 605ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 606ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param image the image to copy 607ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param imageType the type of the new image 608ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param alpha an optional alpha modifier 609ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @return a new BufferedImage 610ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 611ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /*package*/ static BufferedImage createCopy(BufferedImage image, int imageType, int alpha) { 612ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int w = image.getWidth(); 613ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int h = image.getHeight(); 614ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 615ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski BufferedImage result = new BufferedImage(w, h, imageType); 616ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 617ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] argb = new int[w * h]; 618ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image.getRGB(0, 0, image.getWidth(), image.getHeight(), argb, 0, image.getWidth()); 619ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 620ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (alpha != 255) { 621ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski final int length = argb.length; 622ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski for (int i = 0 ; i < length; i++) { 623ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int a = (argb[i] >>> 24 * alpha) / 255; 624ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski argb[i] = (a << 24) | (argb[i] & 0x00FFFFFF); 625ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 626ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 627ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 628ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski result.setRGB(0, 0, w, h, argb, 0, w); 629ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 630ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return result; 631ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 632ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 633ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski} 634