diff options
| -rw-r--r-- | tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java | 11 | ||||
| -rw-r--r-- | tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java | 91 | 
2 files changed, 88 insertions, 14 deletions
diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java index 5256b583f8d3..04ce9d077b53 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/BitmapFactory_Delegate.java @@ -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 @@ -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 { @@ -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(); @@ -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); diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java index 4121f798ba9a..ec284ac3cfed 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap_Delegate.java @@ -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; @@ -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); @@ -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());      }      /** @@ -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());      }      /** @@ -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());      }      /** @@ -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 @@ -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 @@ -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 @@ -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*/);      } @@ -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;      }      /**  |