Merge "Work-around paletted image decoding bug in SDK_JELLYBEAN" into nyc-dev

This commit is contained in:
Matt Sarett
2016-03-21 18:26:18 +00:00
committed by Android (Google) Code Review
2 changed files with 21 additions and 7 deletions

View File

@@ -249,7 +249,7 @@ public:
* above. SDK levels that have a non-numeric identifier are assumed * above. SDK levels that have a non-numeric identifier are assumed
* to be newer than any SDK level that has a number designated. * to be newer than any SDK level that has a number designated.
*/ */
bool isMinSdkAtLeast(int desired) { bool isMinSdkAtLeast(int desired) const {
/* If the application specifies a minSdkVersion in the manifest /* If the application specifies a minSdkVersion in the manifest
* then use that. Otherwise, check what the user specified on * then use that. Otherwise, check what the user specified on
* the command line. If neither, it's not available since * the command line. If neither, it's not available since

View File

@@ -1134,10 +1134,9 @@ static void analyze_image(const char *imageName, image_info &imageInfo, int gray
} }
} }
static void write_png(const char* imageName, static void write_png(const char* imageName,
png_structp write_ptr, png_infop write_info, png_structp write_ptr, png_infop write_info,
image_info& imageInfo, int grayscaleTolerance) image_info& imageInfo, const Bundle* bundle)
{ {
png_uint_32 width, height; png_uint_32 width, height;
int color_type; int color_type;
@@ -1174,9 +1173,26 @@ static void write_png(const char* imageName,
bool hasTransparency; bool hasTransparency;
int paletteEntries, alphaPaletteEntries; int paletteEntries, alphaPaletteEntries;
int grayscaleTolerance = bundle->getGrayscaleTolerance();
analyze_image(imageName, imageInfo, grayscaleTolerance, rgbPalette, alphaPalette, analyze_image(imageName, imageInfo, grayscaleTolerance, rgbPalette, alphaPalette,
&paletteEntries, &alphaPaletteEntries, &hasTransparency, &color_type, outRows); &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) { if (kIsDebug) {
switch (color_type) { switch (color_type) {
case PNG_COLOR_TYPE_PALETTE: case PNG_COLOR_TYPE_PALETTE:
@@ -1332,8 +1348,7 @@ static bool write_png_protected(png_structp write_ptr, String8& printableName, p
return false; return false;
} }
write_png(printableName.string(), write_ptr, write_info, *imageInfo, write_png(printableName.string(), write_ptr, write_info, *imageInfo, bundle);
bundle->getGrayscaleTolerance());
return true; return true;
} }
@@ -1543,8 +1558,7 @@ status_t preProcessImageToCache(const Bundle* bundle, const String8& source, con
} }
// Actually write out to the new png // Actually write out to the new png
write_png(dest.string(), write_ptr, write_info, imageInfo, write_png(dest.string(), write_ptr, write_info, imageInfo, bundle);
bundle->getGrayscaleTolerance());
if (bundle->getVerbose()) { if (bundle->getVerbose()) {
// Find the size of our new file // Find the size of our new file