summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Paymyshev <apaymyshev@yandex-team.ru>2020-08-18 19:36:05 +0000
committerMichael BrĂ¼ning <michael.bruning@qt.io>2020-12-07 22:24:35 +0000
commit117abfcce740660b30c07d5af7cf82475bdc554f (patch)
treeccb4b360c1eb0da08ea4ceb0ce17a3af05511b04
parent765a0ff57eb920867cc1b98d720ed220de94a242 (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.cc7
-rw-r--r--chromium/ui/gfx/skbitmap_operations.cc4
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);