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 26dc9de2..130c590e 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 @@ -176,16 +176,16 @@ public class Res9patchStreamDecoder implements ResStreamDecoder { } public static NinePatch decode(ExtDataInput di) throws IOException { - di.skipBytes(1); + di.skipBytes(1); // wasDeserialized byte numXDivs = di.readByte(); byte numYDivs = di.readByte(); - di.skipBytes(1); - di.skipBytes(8); + di.skipBytes(1); // numColors + di.skipBytes(8); // xDivs/yDivs offset int padLeft = di.readInt(); int padRight = di.readInt(); int padTop = di.readInt(); int padBottom = di.readInt(); - di.skipBytes(4); + di.skipBytes(4); // colorsOffset int[] xDivs = di.readIntArray(numXDivs); int[] yDivs = di.readIntArray(numYDivs); 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 b2482807..0d0622a0 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 @@ -389,12 +389,50 @@ public class BuildAndDecodeTest { final int[] controlImageGrid = controlImage.getRGB(0, 0, w, h, null, 0, w); final int[] testImageGrid = testImage.getRGB(0, 0, w, h, null, 0, w); - for (int i = 0; i < controlImageGrid.length; i++) { assertEquals("Image lost Optical Bounds at i = " + i, controlImageGrid[i], testImageGrid[i]); } } + @Test + public void robust9patchTest() throws BrutException, IOException { + String[] ninePatches = {"ic_notification_overlay.9.png", "status_background.9.png", + "search_bg_transparent.9.png", "screenshot_panel.9.png", "recents_lower_gradient.9.png"}; + + char slash = File.separatorChar; + String location = slash + "res" + slash + "drawable-xxhdpi" + slash; + + for (String ninePatch : ninePatches) { + File control = new File((sTestOrigDir + location), ninePatch); + File test = new File((sTestNewDir + location), ninePatch); + + BufferedImage controlImage = ImageIO.read(control); + BufferedImage testImage = ImageIO.read(test); + + int w = controlImage.getWidth(), h = controlImage.getHeight(); + + // Check the entire horizontal line + for (int i = 1; i < w; i++) { + if (isTransparent(controlImage.getRGB(i, 0))) { + assertTrue(isTransparent(testImage.getRGB(i, 0))); + } else { + assertEquals("Image lost npTc chunk on image " + ninePatch + " at (x, y) (" + i + "," + 0 + ")", + controlImage.getRGB(i, 0), testImage.getRGB(i, 0)); + } + } + + // Check the entire vertical line + for (int i = 1; i < h; i++) { + if (isTransparent(controlImage.getRGB(0, i))) { + assertTrue(isTransparent(testImage.getRGB(0, i))); + } else { + assertEquals("Image lost npTc chunk on image " + ninePatch + " at (x, y) (" + 0 + "," + i + ")", + controlImage.getRGB(0, i), testImage.getRGB(0, i)); + } + } + } + } + @Test public void drawableXxhdpiTest() throws BrutException, IOException { compareResFolder("drawable-xxhdpi"); @@ -515,6 +553,10 @@ public class BuildAndDecodeTest { assertTrue(f.isDirectory()); } + private boolean isTransparent(int pixel) { + return pixel >> 24 == 0x00; + } + private void compareXmlFiles(String path, ElementQualifier qualifier) throws BrutException { DetailedDiff diff; try { diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/ic_notification_overlay.9.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/ic_notification_overlay.9.png new file mode 100644 index 00000000..fa7de0ed Binary files /dev/null and b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/ic_notification_overlay.9.png differ diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/recents_lower_gradient.9.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/recents_lower_gradient.9.png new file mode 100644 index 00000000..427cad9f Binary files /dev/null and b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/recents_lower_gradient.9.png differ diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/screenshot_panel.9.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/screenshot_panel.9.png new file mode 100644 index 00000000..45259d7f Binary files /dev/null and b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/screenshot_panel.9.png differ diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/search_bg_transparent.9.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/search_bg_transparent.9.png new file mode 100644 index 00000000..c0bf31d0 Binary files /dev/null and b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/search_bg_transparent.9.png differ diff --git a/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/status_background.9.png b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/status_background.9.png new file mode 100644 index 00000000..727c8040 Binary files /dev/null and b/brut.apktool/apktool-lib/src/test/resources/brut/apktool/testapp/res/drawable-xxhdpi/status_background.9.png differ