summaryrefslogtreecommitdiff
path: root/tools/aapt/Images.cpp
diff options
context:
space:
mode:
authorMatt Sarett <msarett@google.com>2016-02-01 15:22:42 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-02-01 15:22:42 +0000
commit37a866e9a6e325a6bcebd052e959ff264a34dd6a (patch)
tree0ecf9fef4f6482850d5c5eb785e827d33c137e65 /tools/aapt/Images.cpp
parent4c95e0b4df62918d6e2abf9878ad4a7e7bb54123 (diff)
parent33fcd11bc296fa495a4f4584f782c1c0fe4fe592 (diff)
Merge "Encode paletted PNGs more efficiently (part 2)"
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 ff1252d08532..40466bd25451 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);