diff options
author | Anton Paymyshev <apaymyshev@yandex-team.ru> | 2020-08-18 19:36:05 +0000 |
---|---|---|
committer | Michael BrĂ¼ning <michael.bruning@qt.io> | 2020-12-07 22:24:35 +0000 |
commit | 117abfcce740660b30c07d5af7cf82475bdc554f (patch) | |
tree | ccb4b360c1eb0da08ea4ceb0ce17a3af05511b04 | |
parent | 765a0ff57eb920867cc1b98d720ed220de94a242 (diff) |
[Backport] Dependency for CVE-2020-16024
Cherry-pick of patch originally reviewed on
https://chromium-review.googlesource.com/c/chromium/src/+/2345144:
Fix icon generation for PWA from png with transparent pixels.
SkBitmap used as a source for icon bitmaps generation may have color components premultiplied by alpha value. In that case utilizing SkBitmap pixels as is makes them appear darker in resulting icon where no premultiplication is expected.
With this CL premultiplied alpha pixels are converted to pixels where colors components are independent from alpha channel if required.
Bug: 1090720
Change-Id: Idfc34fe66fbd6d4ed1a44332c59b0f9bd6d9fc84
Reviewed-by: Scott Violet <sky@chromium.org>
Commit-Queue: Scott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799266}
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r-- | chromium/ui/gfx/icon_util.cc | 7 | ||||
-rw-r--r-- | chromium/ui/gfx/skbitmap_operations.cc | 4 |
2 files changed, 8 insertions, 3 deletions
diff --git a/chromium/ui/gfx/icon_util.cc b/chromium/ui/gfx/icon_util.cc index eb0bcdb23dc..8be6d8d8080 100644 --- a/chromium/ui/gfx/icon_util.cc +++ b/chromium/ui/gfx/icon_util.cc @@ -21,6 +21,7 @@ #include "ui/gfx/geometry/size.h" #include "ui/gfx/image/image.h" #include "ui/gfx/image/image_family.h" +#include "ui/gfx/skbitmap_operations.h" namespace { @@ -630,7 +631,11 @@ void IconUtil::SetSingleIconImageInformation(const SkBitmap& bitmap, // opaque. unsigned char* image_addr = reinterpret_cast<unsigned char*>(icon_image); unsigned char* xor_mask_addr = image_addr + sizeof(BITMAPINFOHEADER); - CopySkBitmapBitsIntoIconBuffer(bitmap, xor_mask_addr, xor_mask_size); + + // Make sure pixels are not premultiplied by alpha. + SkBitmap unpremul_bitmap = SkBitmapOperations::UnPreMultiply(bitmap); + CopySkBitmapBitsIntoIconBuffer(unpremul_bitmap, xor_mask_addr, xor_mask_size); + *image_byte_count = bytes_in_resource; } diff --git a/chromium/ui/gfx/skbitmap_operations.cc b/chromium/ui/gfx/skbitmap_operations.cc index 25bd1816f8d..2d1c9c1f837 100644 --- a/chromium/ui/gfx/skbitmap_operations.cc +++ b/chromium/ui/gfx/skbitmap_operations.cc @@ -628,11 +628,11 @@ SkBitmap SkBitmapOperations::DownsampleByTwo(const SkBitmap& bitmap) { SkBitmap SkBitmapOperations::UnPreMultiply(const SkBitmap& bitmap) { if (bitmap.isNull()) return bitmap; - if (bitmap.isOpaque()) + if (bitmap.alphaType() != kPremul_SkAlphaType) return bitmap; const SkImageInfo& opaque_info = - bitmap.info().makeAlphaType(kOpaque_SkAlphaType); + bitmap.info().makeAlphaType(kUnpremul_SkAlphaType); SkBitmap opaque_bitmap; opaque_bitmap.allocPixels(opaque_info); |