Only treat PNG_COLOR_TYPE_RGB as 565
Bug: 12145
Test: imagedecoder_png_fuzzer
Test: Codec_PngRoundTrip
If a PNG's sBIT specifies that the significant bits are 565, SkPngCodec
treats the image as defaulting to kRGB_565_SkColorType, rather than the
typical kN32_SkColorType. This feature is likely rarely used in the
wild, but it is used by Skia to encode kRGB_565_SkColorType to a PNG and
then recreate the original SkPixmap. These Skia-created PNGs always use
PNG_COLOR_TYPE_RGB, so only respect this sBIT with PNG_COLOR_TYPE_RGB.
Further, if the PNG is PNG_COLOR_TYPE_PALETTE, treating it as 565 means
that we read it incorrectly.
Change-Id: I81dcce771c8492cdcf5677d3c13167a1231acfe4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/445963
Reviewed-by: Heather Miller <hcm@google.com>
Commit-Queue: Derek Sollenberger <djsollen@google.com>
(cherry picked from commit 983ae8625b05737e7528fac074030d11e225961d)
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/446397
Reviewed-by: Break Glass <breakglass@skia.org>
Reviewed-by: Joe Gregorio <jcgregorio@google.com>
Commit-Queue: Heather Miller <hcm@google.com>
Owners-Override: Joe Gregorio <jcgregorio@google.com>
diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp
index 288dee6..f97a52f 100644
--- a/src/codec/SkPngCodec.cpp
+++ b/src/codec/SkPngCodec.cpp
@@ -933,22 +933,39 @@
}
}
- if (encodedColorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
- png_color_8p sigBits;
- if (png_get_sBIT(fPng_ptr, fInfo_ptr, &sigBits)) {
- if (8 == sigBits->alpha && kGraySigBit_GrayAlphaIsJustAlpha == sigBits->gray) {
- color = SkEncodedInfo::kXAlpha_Color;
+ switch (encodedColorType) {
+ case PNG_COLOR_TYPE_GRAY_ALPHA:{
+ png_color_8p sigBits;
+ if (png_get_sBIT(fPng_ptr, fInfo_ptr, &sigBits)) {
+ if (8 == sigBits->alpha && kGraySigBit_GrayAlphaIsJustAlpha == sigBits->gray) {
+ color = SkEncodedInfo::kXAlpha_Color;
+ }
}
+ break;
}
- } else if (SkEncodedInfo::kOpaque_Alpha == alpha) {
+ case PNG_COLOR_TYPE_RGB:{
+ png_color_8p sigBits;
+ if (png_get_sBIT(fPng_ptr, fInfo_ptr, &sigBits)) {
+ if (5 == sigBits->red && 6 == sigBits->green && 5 == sigBits->blue) {
+ // Recommend a decode to 565 if the sBIT indicates 565.
+ color = SkEncodedInfo::k565_Color;
+ }
+ }
+ break;
+ }
+ }
+
+#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
+ if (encodedColorType != PNG_COLOR_TYPE_GRAY_ALPHA
+ && SkEncodedInfo::kOpaque_Alpha == alpha) {
png_color_8p sigBits;
if (png_get_sBIT(fPng_ptr, fInfo_ptr, &sigBits)) {
if (5 == sigBits->red && 6 == sigBits->green && 5 == sigBits->blue) {
- // Recommend a decode to 565 if the sBIT indicates 565.
- color = SkEncodedInfo::k565_Color;
+ SkAndroidFrameworkUtils::SafetyNetLog("190188264");
}
}
}
+#endif // SK_BUILD_FOR_ANDROID_FRAMEWORK
SkEncodedInfo encodedInfo = SkEncodedInfo::Make(origWidth, origHeight, color, alpha,
bitDepth, std::move(profile));