summaryrefslogtreecommitdiff
path: root/tools/aapt/Images.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/aapt/Images.cpp')
-rw-r--r--tools/aapt/Images.cpp32
1 files changed, 28 insertions, 4 deletions
diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp
index 867a6ffa97bc..a2a42a35429d 100644
--- a/tools/aapt/Images.cpp
+++ b/tools/aapt/Images.cpp
@@ -906,10 +906,34 @@ static void analyze_image(const char *imageName, image_info &imageInfo, int gray
png_bytep row = imageInfo.rows[j];
png_bytep out = outRows[j];
for (i = 0; i < w; i++) {
- rr = *row++;
- gg = *row++;
- bb = *row++;
- aa = *row++;
+
+ // Make sure any zero alpha pixels are fully zeroed. On average,
+ // each of our PNG assets seem to have about four distinct pixels
+ // with zero alpha.
+ // There are several advantages to setting these to zero:
+ // (1) Images are more likely able to be encodable with a palette.
+ // (2) Image palettes will be smaller.
+ // (3) Premultiplied and unpremultiplied PNG decodes can skip
+ // writing zeros to memory, often saving significant numbers
+ // of memory pages.
+ aa = *(row + 3);
+ if (aa == 0) {
+ rr = 0;
+ gg = 0;
+ bb = 0;
+
+ // Also set red, green, and blue to zero in "row". If we later
+ // decide to encode the PNG as RGB or RGBA, we will use the
+ // values stored there.
+ *(row) = 0;
+ *(row + 1) = 0;
+ *(row + 2) = 0;
+ } else {
+ rr = *(row);
+ gg = *(row + 1);
+ bb = *(row + 2);
+ }
+ row += 4;
int odev = maxGrayDeviation;
maxGrayDeviation = MAX(ABS(rr - gg), maxGrayDeviation);