| Index: gfx/skbitmap_operations.cc
|
| diff --git a/gfx/skbitmap_operations.cc b/gfx/skbitmap_operations.cc
|
| index 27508bad5241fed6dda395c7dafe1e042447459e..b8cec114e5c87759567edf5de3645e6c3a7f98a2 100644
|
| --- a/gfx/skbitmap_operations.cc
|
| +++ b/gfx/skbitmap_operations.cc
|
| @@ -668,3 +668,30 @@ SkBitmap SkBitmapOperations::DownsampleByTwo(const SkBitmap& bitmap) {
|
| return result;
|
| }
|
|
|
| +// static
|
| +SkBitmap SkBitmapOperations::UnPreMultiply(const SkBitmap& bitmap) {
|
| + if (bitmap.isNull())
|
| + return bitmap;
|
| + if (bitmap.isOpaque())
|
| + return bitmap;
|
| +
|
| + SkBitmap opaque_bitmap;
|
| + opaque_bitmap.setConfig(bitmap.config(), bitmap.width(), bitmap.height());
|
| + opaque_bitmap.allocPixels();
|
| +
|
| + {
|
| + SkAutoLockPixels bitmap_lock(bitmap);
|
| + SkAutoLockPixels opaque_bitmap_lock(opaque_bitmap);
|
| + for (int y = 0; y < opaque_bitmap.height(); y++) {
|
| + for (int x = 0; x < opaque_bitmap.width(); x++) {
|
| + uint32 src_pixel = *bitmap.getAddr32(x, y);
|
| + uint32* dst_pixel = opaque_bitmap.getAddr32(x, y);
|
| + SkColor unmultiplied = SkUnPreMultiply::PMColorToColor(src_pixel);
|
| + *dst_pixel = unmultiplied;
|
| + }
|
| + }
|
| + }
|
| +
|
| + opaque_bitmap.setIsOpaque(true);
|
| + return opaque_bitmap;
|
| +}
|
|
|