Merge "Work-around paletted image decoding bug in SDK_JELLYBEAN" into nyc-dev
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user