Loading tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java +9 −2 Original line number Diff line number Diff line Loading @@ -24,10 +24,13 @@ import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.content.res.BridgeResources.NinePatchInputStream; import android.graphics.BitmapFactory.Options; import android.graphics.Bitmap_Delegate.BitmapCreateFlags; import java.io.FileDescriptor; import java.io.IOException; import java.io.InputStream; import java.util.EnumSet; import java.util.Set; /** * Delegate implementing the native methods of android.graphics.BitmapFactory Loading Loading @@ -98,8 +101,12 @@ import java.io.InputStream; //TODO support rescaling Density density = Density.MEDIUM; Set<BitmapCreateFlags> bitmapCreateFlags = EnumSet.of(BitmapCreateFlags.MUTABLE); if (opts != null) { density = Density.getEnum(opts.inDensity); if (opts.inPremultiplied) { bitmapCreateFlags.add(BitmapCreateFlags.PREMULTIPLIED); } } try { Loading @@ -112,7 +119,7 @@ import java.io.InputStream; npis, true /*is9Patch*/, false /*convert*/); // get the bitmap and chunk objects. bm = Bitmap_Delegate.createBitmap(ninePatch.getImage(), true /*isMutable*/, bm = Bitmap_Delegate.createBitmap(ninePatch.getImage(), bitmapCreateFlags, density); NinePatchChunk chunk = ninePatch.getChunk(); Loading @@ -127,7 +134,7 @@ import java.io.InputStream; padding.bottom = paddingarray[3]; } else { // load the bitmap directly. bm = Bitmap_Delegate.createBitmap(is, true, density); bm = Bitmap_Delegate.createBitmap(is, bitmapCreateFlags, density); } } catch (IOException e) { Bridge.getLog().error(null,"Failed to load image" , e, null); Loading tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java +79 −12 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.Buffer; import java.util.Arrays; import java.util.EnumSet; import java.util.Set; import javax.imageio.ImageIO; Loading @@ -51,6 +53,10 @@ import javax.imageio.ImageIO; */ public final class Bitmap_Delegate { public enum BitmapCreateFlags { PREMULTIPLIED, MUTABLE } // ---- delegate manager ---- private static final DelegateManager<Bitmap_Delegate> sManager = new DelegateManager<Bitmap_Delegate>(Bitmap_Delegate.class); Loading Loading @@ -93,10 +99,25 @@ public final class Bitmap_Delegate { */ public static Bitmap createBitmap(File input, boolean isMutable, Density density) throws IOException { return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density); } /** * Creates and returns a {@link Bitmap} initialized with the given file content. * * @param input the file from which to read the bitmap content * @param density the density associated with the bitmap * * @see Bitmap#isPremultiplied() * @see Bitmap#isMutable() * @see Bitmap#getDensity() */ public static Bitmap createBitmap(File input, Set<BitmapCreateFlags> createFlags, Density density) throws IOException { // create a delegate with the content of the file. Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); return createBitmap(delegate, isMutable, density.getDpiValue()); return createBitmap(delegate, createFlags, density.getDpiValue()); } /** Loading @@ -111,10 +132,26 @@ public final class Bitmap_Delegate { */ public static Bitmap createBitmap(InputStream input, boolean isMutable, Density density) throws IOException { return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density); } /** * Creates and returns a {@link Bitmap} initialized with the given stream content. * * @param input the stream from which to read the bitmap content * @param createFlags * @param density the density associated with the bitmap * * @see Bitmap#isPremultiplied() * @see Bitmap#isMutable() * @see Bitmap#getDensity() */ public static Bitmap createBitmap(InputStream input, Set<BitmapCreateFlags> createFlags, Density density) throws IOException { // create a delegate with the content of the stream. Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); return createBitmap(delegate, isMutable, density.getDpiValue()); return createBitmap(delegate, createFlags, density.getDpiValue()); } /** Loading @@ -129,10 +166,26 @@ public final class Bitmap_Delegate { */ public static Bitmap createBitmap(BufferedImage image, boolean isMutable, Density density) throws IOException { return createBitmap(image, getPremultipliedBitmapCreateFlags(isMutable), density); } /** * Creates and returns a {@link Bitmap} initialized with the given {@link BufferedImage} * * @param image the bitmap content * @param createFlags * @param density the density associated with the bitmap * * @see Bitmap#isPremultiplied() * @see Bitmap#isMutable() * @see Bitmap#getDensity() */ public static Bitmap createBitmap(BufferedImage image, Set<BitmapCreateFlags> createFlags, Density density) throws IOException { // create a delegate with the given image. Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ARGB_8888); return createBitmap(delegate, isMutable, density.getDpiValue()); return createBitmap(delegate, createFlags, density.getDpiValue()); } /** Loading Loading @@ -203,7 +256,7 @@ public final class Bitmap_Delegate { @LayoutlibDelegate /*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width, int height, int nativeConfig, boolean mutable) { int height, int nativeConfig, boolean isMutable) { int imageType = getBufferedImageType(nativeConfig); // create the image Loading @@ -216,7 +269,8 @@ public final class Bitmap_Delegate { // create a delegate with the content of the stream. Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.nativeToConfig(nativeConfig)); return createBitmap(delegate, mutable, Bitmap.getDefaultDensity()); return createBitmap(delegate, getPremultipliedBitmapCreateFlags(isMutable), Bitmap.getDefaultDensity()); } @LayoutlibDelegate Loading Loading @@ -244,7 +298,8 @@ public final class Bitmap_Delegate { // create a delegate with the content of the stream. Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.nativeToConfig(nativeConfig)); return createBitmap(delegate, isMutable, Bitmap.getDefaultDensity()); return createBitmap(delegate, getPremultipliedBitmapCreateFlags(isMutable), Bitmap.getDefaultDensity()); } @LayoutlibDelegate Loading Loading @@ -464,7 +519,7 @@ public final class Bitmap_Delegate { Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ALPHA_8); // the density doesn't matter, it's set by the Java method. return createBitmap(delegate, false /*isMutable*/, return createBitmap(delegate, EnumSet.of(BitmapCreateFlags.MUTABLE), Density.DEFAULT_DENSITY /*density*/); } Loading Loading @@ -546,15 +601,27 @@ public final class Bitmap_Delegate { mConfig = config; } private static Bitmap createBitmap(Bitmap_Delegate delegate, boolean isMutable, int density) { private static Bitmap createBitmap(Bitmap_Delegate delegate, Set<BitmapCreateFlags> createFlags, int density) { // get its native_int int nativeInt = sManager.addNewDelegate(delegate); int width = delegate.mImage.getWidth(); int height = delegate.mImage.getHeight(); boolean isMutable = createFlags.contains(BitmapCreateFlags.MUTABLE); boolean isPremultiplied = createFlags.contains(BitmapCreateFlags.PREMULTIPLIED); // and create/return a new Bitmap with it // TODO: pass correct width, height, isPremultiplied return new Bitmap(nativeInt, null /* buffer */, -1 /* width */, -1 /* height */, density, isMutable, true /* isPremultiplied */, null /*ninePatchChunk*/, null /* layoutBounds */); return new Bitmap(nativeInt, null /* buffer */, width, height, density, isMutable, isPremultiplied, null /*ninePatchChunk*/, null /* layoutBounds */); } private static Set<BitmapCreateFlags> getPremultipliedBitmapCreateFlags(boolean isMutable) { Set<BitmapCreateFlags> createFlags = EnumSet.of(BitmapCreateFlags.PREMULTIPLIED); if (isMutable) { createFlags.add(BitmapCreateFlags.MUTABLE); } return createFlags; } /** Loading Loading
tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java +9 −2 Original line number Diff line number Diff line Loading @@ -24,10 +24,13 @@ import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.content.res.BridgeResources.NinePatchInputStream; import android.graphics.BitmapFactory.Options; import android.graphics.Bitmap_Delegate.BitmapCreateFlags; import java.io.FileDescriptor; import java.io.IOException; import java.io.InputStream; import java.util.EnumSet; import java.util.Set; /** * Delegate implementing the native methods of android.graphics.BitmapFactory Loading Loading @@ -98,8 +101,12 @@ import java.io.InputStream; //TODO support rescaling Density density = Density.MEDIUM; Set<BitmapCreateFlags> bitmapCreateFlags = EnumSet.of(BitmapCreateFlags.MUTABLE); if (opts != null) { density = Density.getEnum(opts.inDensity); if (opts.inPremultiplied) { bitmapCreateFlags.add(BitmapCreateFlags.PREMULTIPLIED); } } try { Loading @@ -112,7 +119,7 @@ import java.io.InputStream; npis, true /*is9Patch*/, false /*convert*/); // get the bitmap and chunk objects. bm = Bitmap_Delegate.createBitmap(ninePatch.getImage(), true /*isMutable*/, bm = Bitmap_Delegate.createBitmap(ninePatch.getImage(), bitmapCreateFlags, density); NinePatchChunk chunk = ninePatch.getChunk(); Loading @@ -127,7 +134,7 @@ import java.io.InputStream; padding.bottom = paddingarray[3]; } else { // load the bitmap directly. bm = Bitmap_Delegate.createBitmap(is, true, density); bm = Bitmap_Delegate.createBitmap(is, bitmapCreateFlags, density); } } catch (IOException e) { Bridge.getLog().error(null,"Failed to load image" , e, null); Loading
tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java +79 −12 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import java.io.InputStream; import java.io.OutputStream; import java.nio.Buffer; import java.util.Arrays; import java.util.EnumSet; import java.util.Set; import javax.imageio.ImageIO; Loading @@ -51,6 +53,10 @@ import javax.imageio.ImageIO; */ public final class Bitmap_Delegate { public enum BitmapCreateFlags { PREMULTIPLIED, MUTABLE } // ---- delegate manager ---- private static final DelegateManager<Bitmap_Delegate> sManager = new DelegateManager<Bitmap_Delegate>(Bitmap_Delegate.class); Loading Loading @@ -93,10 +99,25 @@ public final class Bitmap_Delegate { */ public static Bitmap createBitmap(File input, boolean isMutable, Density density) throws IOException { return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density); } /** * Creates and returns a {@link Bitmap} initialized with the given file content. * * @param input the file from which to read the bitmap content * @param density the density associated with the bitmap * * @see Bitmap#isPremultiplied() * @see Bitmap#isMutable() * @see Bitmap#getDensity() */ public static Bitmap createBitmap(File input, Set<BitmapCreateFlags> createFlags, Density density) throws IOException { // create a delegate with the content of the file. Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); return createBitmap(delegate, isMutable, density.getDpiValue()); return createBitmap(delegate, createFlags, density.getDpiValue()); } /** Loading @@ -111,10 +132,26 @@ public final class Bitmap_Delegate { */ public static Bitmap createBitmap(InputStream input, boolean isMutable, Density density) throws IOException { return createBitmap(input, getPremultipliedBitmapCreateFlags(isMutable), density); } /** * Creates and returns a {@link Bitmap} initialized with the given stream content. * * @param input the stream from which to read the bitmap content * @param createFlags * @param density the density associated with the bitmap * * @see Bitmap#isPremultiplied() * @see Bitmap#isMutable() * @see Bitmap#getDensity() */ public static Bitmap createBitmap(InputStream input, Set<BitmapCreateFlags> createFlags, Density density) throws IOException { // create a delegate with the content of the stream. Bitmap_Delegate delegate = new Bitmap_Delegate(ImageIO.read(input), Config.ARGB_8888); return createBitmap(delegate, isMutable, density.getDpiValue()); return createBitmap(delegate, createFlags, density.getDpiValue()); } /** Loading @@ -129,10 +166,26 @@ public final class Bitmap_Delegate { */ public static Bitmap createBitmap(BufferedImage image, boolean isMutable, Density density) throws IOException { return createBitmap(image, getPremultipliedBitmapCreateFlags(isMutable), density); } /** * Creates and returns a {@link Bitmap} initialized with the given {@link BufferedImage} * * @param image the bitmap content * @param createFlags * @param density the density associated with the bitmap * * @see Bitmap#isPremultiplied() * @see Bitmap#isMutable() * @see Bitmap#getDensity() */ public static Bitmap createBitmap(BufferedImage image, Set<BitmapCreateFlags> createFlags, Density density) throws IOException { // create a delegate with the given image. Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ARGB_8888); return createBitmap(delegate, isMutable, density.getDpiValue()); return createBitmap(delegate, createFlags, density.getDpiValue()); } /** Loading Loading @@ -203,7 +256,7 @@ public final class Bitmap_Delegate { @LayoutlibDelegate /*package*/ static Bitmap nativeCreate(int[] colors, int offset, int stride, int width, int height, int nativeConfig, boolean mutable) { int height, int nativeConfig, boolean isMutable) { int imageType = getBufferedImageType(nativeConfig); // create the image Loading @@ -216,7 +269,8 @@ public final class Bitmap_Delegate { // create a delegate with the content of the stream. Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.nativeToConfig(nativeConfig)); return createBitmap(delegate, mutable, Bitmap.getDefaultDensity()); return createBitmap(delegate, getPremultipliedBitmapCreateFlags(isMutable), Bitmap.getDefaultDensity()); } @LayoutlibDelegate Loading Loading @@ -244,7 +298,8 @@ public final class Bitmap_Delegate { // create a delegate with the content of the stream. Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.nativeToConfig(nativeConfig)); return createBitmap(delegate, isMutable, Bitmap.getDefaultDensity()); return createBitmap(delegate, getPremultipliedBitmapCreateFlags(isMutable), Bitmap.getDefaultDensity()); } @LayoutlibDelegate Loading Loading @@ -464,7 +519,7 @@ public final class Bitmap_Delegate { Bitmap_Delegate delegate = new Bitmap_Delegate(image, Config.ALPHA_8); // the density doesn't matter, it's set by the Java method. return createBitmap(delegate, false /*isMutable*/, return createBitmap(delegate, EnumSet.of(BitmapCreateFlags.MUTABLE), Density.DEFAULT_DENSITY /*density*/); } Loading Loading @@ -546,15 +601,27 @@ public final class Bitmap_Delegate { mConfig = config; } private static Bitmap createBitmap(Bitmap_Delegate delegate, boolean isMutable, int density) { private static Bitmap createBitmap(Bitmap_Delegate delegate, Set<BitmapCreateFlags> createFlags, int density) { // get its native_int int nativeInt = sManager.addNewDelegate(delegate); int width = delegate.mImage.getWidth(); int height = delegate.mImage.getHeight(); boolean isMutable = createFlags.contains(BitmapCreateFlags.MUTABLE); boolean isPremultiplied = createFlags.contains(BitmapCreateFlags.PREMULTIPLIED); // and create/return a new Bitmap with it // TODO: pass correct width, height, isPremultiplied return new Bitmap(nativeInt, null /* buffer */, -1 /* width */, -1 /* height */, density, isMutable, true /* isPremultiplied */, null /*ninePatchChunk*/, null /* layoutBounds */); return new Bitmap(nativeInt, null /* buffer */, width, height, density, isMutable, isPremultiplied, null /*ninePatchChunk*/, null /* layoutBounds */); } private static Set<BitmapCreateFlags> getPremultipliedBitmapCreateFlags(boolean isMutable) { Set<BitmapCreateFlags> createFlags = EnumSet.of(BitmapCreateFlags.PREMULTIPLIED); if (isMutable) { createFlags.add(BitmapCreateFlags.MUTABLE); } return createFlags; } /** Loading