summaryrefslogtreecommitdiff
path: root/tools/aapt/Images.cpp
diff options
context:
space:
mode:
authorMatt Sarett <msarett@google.com>2016-03-16 18:22:59 -0400
committerMatt Sarett <msarett@google.com>2016-03-16 18:36:06 -0400
commit48efde4fb14cfe160747a8148b8e1a810c8f1c6e (patch)
tree8434e93fc9109a3b8db7e0fe604ad984a94f2227 /tools/aapt/Images.cpp
parentdbdca5b29989ce2c0cacfeea99db03b799cc3fb7 (diff)
Work-around paletted image decoding bug in SDK_JELLYBEAN
Because there is a bug decoding paletted images in SDK_JELLYBEAN, we need to avoid encoding paletted images for apps that support SDK_JELLYBEAN and earlier. BUG=27643907 Change-Id: Ib7d51ed87435cd36507915d62b0057c06f18b2b6
Diffstat (limited to 'tools/aapt/Images.cpp')
-rw-r--r--tools/aapt/Images.cpp26
1 files changed, 20 insertions, 6 deletions
diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp
index 40466bd25451..9939c188cdd9 100644
--- a/tools/aapt/Images.cpp
+++ b/tools/aapt/Images.cpp
@@ -1134,10 +1134,9 @@ static void analyze_image(const char *imageName, image_info &imageInfo, int gray
}
}
-
static void write_png(const char* imageName,
png_structp write_ptr, png_infop write_info,
- image_info& imageInfo, int grayscaleTolerance)
+ image_info& imageInfo, const Bundle* bundle)
{
png_uint_32 width, height;
int color_type;
@@ -1174,9 +1173,26 @@ static void write_png(const char* imageName,
bool hasTransparency;
int paletteEntries, alphaPaletteEntries;
+ int grayscaleTolerance = bundle->getGrayscaleTolerance();
analyze_image(imageName, imageInfo, grayscaleTolerance, rgbPalette, alphaPalette,
&paletteEntries, &alphaPaletteEntries, &hasTransparency, &color_type, outRows);
+ // Legacy versions of aapt would always encode 9patch PNGs as RGBA. This had the unintended
+ // benefit of working around a bug decoding paletted images in Android 4.1.
+ // https://code.google.com/p/android/issues/detail?id=34619
+ //
+ // If SDK_JELLY_BEAN is supported, we need to avoid a paletted encoding in order to not expose
+ // this bug.
+ if (!bundle->isMinSdkAtLeast(SDK_JELLY_BEAN_MR1)) {
+ if (imageInfo.is9Patch && PNG_COLOR_TYPE_PALETTE == color_type) {
+ if (hasTransparency) {
+ color_type = PNG_COLOR_TYPE_RGB_ALPHA;
+ } else {
+ color_type = PNG_COLOR_TYPE_RGB;
+ }
+ }
+ }
+
if (kIsDebug) {
switch (color_type) {
case PNG_COLOR_TYPE_PALETTE:
@@ -1332,8 +1348,7 @@ static bool write_png_protected(png_structp write_ptr, String8& printableName, p
return false;
}
- write_png(printableName.string(), write_ptr, write_info, *imageInfo,
- bundle->getGrayscaleTolerance());
+ write_png(printableName.string(), write_ptr, write_info, *imageInfo, bundle);
return true;
}
@@ -1543,8 +1558,7 @@ status_t preProcessImageToCache(const Bundle* bundle, const String8& source, con
}
// Actually write out to the new png
- write_png(dest.string(), write_ptr, write_info, imageInfo,
- bundle->getGrayscaleTolerance());
+ write_png(dest.string(), write_ptr, write_info, imageInfo, bundle);
if (bundle->getVerbose()) {
// Find the size of our new file