diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/Res9patchStreamDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/Res9patchStreamDecoder.java index 9ce1be8a..ade5daa0 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/Res9patchStreamDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/Res9patchStreamDecoder.java @@ -20,6 +20,8 @@ import brut.androlib.AndrolibException; import brut.androlib.err.CantFind9PatchChunk; import brut.util.ExtDataInput; import java.awt.image.BufferedImage; +import java.awt.image.Raster; +import java.awt.image.WritableRaster; import java.io.*; import javax.imageio.ImageIO; import javax.imageio.ImageTypeSpecifier; @@ -39,8 +41,24 @@ public class Res9patchStreamDecoder implements ResStreamDecoder { BufferedImage im = ImageIO.read(new ByteArrayInputStream(data)); int w = im.getWidth(), h = im.getHeight(); - BufferedImage im2 = new BufferedImage(w+2, h+2, BufferedImage.TYPE_INT_ARGB); - im2.createGraphics().drawImage(im, 1, 1, w, h, null); + BufferedImage im2 = new BufferedImage(w + 2, h + 2, BufferedImage.TYPE_INT_ARGB); + if (im.getType() == BufferedImage.TYPE_CUSTOM) { + //TODO: Ensure this is gray + alpha case? + Raster srcRaster = im.getRaster(); + WritableRaster dstRaster = im2.getRaster(); + int[] gray = null, alpha = null; + for (int y = 0; y < im.getHeight(); y++) { + gray = srcRaster.getSamples(0, y, w, 1, 0, gray); + alpha = srcRaster.getSamples(0, y, w, 1, 1, alpha); + + dstRaster.setSamples(1, y + 1, w, 1, 0, gray); + dstRaster.setSamples(1, y + 1, w, 1, 1, gray); + dstRaster.setSamples(1, y + 1, w, 1, 2, gray); + dstRaster.setSamples(1, y + 1, w, 1, 3, alpha); + } + } else { + im2.createGraphics().drawImage(im, 1, 1, w, h, null); + } NinePatch np = getNinePatch(data); drawHLine(im2, h + 1, np.padLeft + 1, w - np.padRight); diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java index 4a0b252b..de49686c 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/BuildAndDecodeTest.java @@ -350,6 +350,27 @@ public class BuildAndDecodeTest { assertEquals(controlImage.getRGB(30, 30), testImage.getRGB(30, 30)); } + @Test + public void issue1508Test() throws BrutException, IOException { + char slash = File.separatorChar; + String location = slash + "res" + slash + "drawable-xhdpi" + slash; + + File control = new File((sTestOrigDir + location), "btn_zoom_up_normal.9.png"); + File test = new File((sTestNewDir + location), "btn_zoom_up_normal.9.png"); + + BufferedImage controlImage = ImageIO.read(control); + BufferedImage testImage = ImageIO.read(test); + + // 0, 0 = clear + assertEquals(controlImage.getRGB(0, 0), testImage.getRGB(0, 0)); + + // 30, 0 = black line + assertEquals(controlImage.getRGB(0, 30), testImage.getRGB(0, 30)); + + // 30, 30 = greyish button + assertEquals(controlImage.getRGB(30, 30), testImage.getRGB(30, 30)); + } + @Test public void drawableXxhdpiTest() throws BrutException, IOException { compareResFolder("drawable-xxhdpi"); diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xhdpi/btn_zoom_up_normal.9.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xhdpi/btn_zoom_up_normal.9.png new file mode 100644 index 00000000..7f73df09 Binary files /dev/null and b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xhdpi/btn_zoom_up_normal.9.png differ