Index: third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp |
index a50faac2c0d81841ba6ea89ba3ebb135e5525756..1aef4b57a7c5bd9a3827d1fad2af733f342d6db6 100644 |
--- a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp |
@@ -65,11 +65,16 @@ SkData* DecodingImageGenerator::onRefEncodedData() { |
static void doColorSpaceXform(const SkImageInfo& dst_info, |
void* pixels, |
size_t row_bytes, |
- SkColorSpace* src_color_space) { |
+ SkColorSpace* src_color_space, |
+ SkTransferFunctionBehavior behavior) { |
TRACE_EVENT0("blink", "DecodingImageGenerator::getPixels - apply xform"); |
std::unique_ptr<SkColorSpaceXform> xform = |
SkColorSpaceXform::New(src_color_space, dst_info.colorSpace()); |
+ const bool post_xform_premul = |
+ (dst_info.alphaType() == kPremul_SkAlphaType) && |
+ (behavior == SkTransferFunctionBehavior::kIgnore); |
+ |
uint32_t* row = reinterpret_cast<uint32_t*>(pixels); |
for (int y = 0; y < dst_info.height(); y++) { |
SkColorSpaceXform::ColorFormat format = |
@@ -78,13 +83,13 @@ static void doColorSpaceXform(const SkImageInfo& dst_info, |
format = SkColorSpaceXform::kBGRA_8888_ColorFormat; |
} |
SkAlphaType alpha_type = |
- dst_info.isOpaque() ? kOpaque_SkAlphaType : kUnpremul_SkAlphaType; |
+ post_xform_premul ? kUnpremul_SkAlphaType : dst_info.alphaType(); |
bool xformed = |
xform->apply(format, row, format, row, dst_info.width(), alpha_type); |
DCHECK(xformed); |
// To be compatible with dst space blending, premultiply in the dst space. |
- if (kPremul_SkAlphaType == dst_info.alphaType()) { |
+ if (post_xform_premul) { |
for (int x = 0; x < dst_info.width(); x++) { |
row[x] = |
SkPreMultiplyARGB(SkGetPackedA32(row[x]), SkGetPackedR32(row[x]), |
@@ -100,8 +105,7 @@ static void doColorSpaceXform(const SkImageInfo& dst_info, |
bool DecodingImageGenerator::onGetPixels(const SkImageInfo& dst_info, |
void* pixels, |
size_t row_bytes, |
- SkPMColor*, |
- int*) { |
+ const Options& options) { |
TRACE_EVENT1("blink", "DecodingImageGenerator::getPixels", "frame index", |
static_cast<int>(frame_index_)); |
@@ -142,7 +146,8 @@ bool DecodingImageGenerator::onGetPixels(const SkImageInfo& dst_info, |
PlatformInstrumentation::DidDecodeLazyPixelRef(); |
if (decoded && needs_color_xform) { |
- doColorSpaceXform(dst_info, pixels, row_bytes, decode_color_space); |
+ doColorSpaceXform(dst_info, pixels, row_bytes, decode_color_space, |
+ options.fBehavior); |
} |
return decoded; |