diff options
author | Matt Sarett <msarett@google.com> | 2016-02-01 15:22:42 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-02-01 15:22:42 +0000 |
commit | 37a866e9a6e325a6bcebd052e959ff264a34dd6a (patch) | |
tree | 0ecf9fef4f6482850d5c5eb785e827d33c137e65 /tools/aapt/Images.cpp | |
parent | 4c95e0b4df62918d6e2abf9878ad4a7e7bb54123 (diff) | |
parent | 33fcd11bc296fa495a4f4584f782c1c0fe4fe592 (diff) |
Merge "Encode paletted PNGs more efficiently (part 2)"
Diffstat (limited to 'tools/aapt/Images.cpp')
-rw-r--r-- | tools/aapt/Images.cpp | 32 |
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); |