Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(246)

Unified Diff: third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp

Issue 2787053004: Respect colorSpace in DecodingImageGenerator::onGetPixels() (Closed)
Patch Set: Rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/graphics/ImageDecodingStore.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 afd588d32dc1bcaeb31da0950145c93bcd2d00dc..a1781f5277fbd036db351ed7ca269e3b1e5c48fa 100644
--- a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
+++ b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
@@ -70,33 +70,89 @@ SkData* DecodingImageGenerator::onRefEncodedData(GrContext* ctx) {
return data_->GetAsSkData().release();
}
-bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info,
+static void doColorSpaceXform(const SkImageInfo& dst_info,
+ void* pixels,
+ size_t row_bytes,
+ SkColorSpace* src_color_space) {
+ TRACE_EVENT0("blink", "DecodingImageGenerator::getPixels - apply xform");
+ std::unique_ptr<SkColorSpaceXform> xform =
+ SkColorSpaceXform::New(src_color_space, dst_info.colorSpace());
+
+ uint32_t* row = reinterpret_cast<uint32_t*>(pixels);
+ for (int y = 0; y < dst_info.height(); y++) {
+ SkColorSpaceXform::ColorFormat format =
+ SkColorSpaceXform::kRGBA_8888_ColorFormat;
+ if (kN32_SkColorType == kBGRA_8888_SkColorType) {
+ format = SkColorSpaceXform::kBGRA_8888_ColorFormat;
+ }
+ SkAlphaType alpha_type =
+ dst_info.isOpaque() ? kOpaque_SkAlphaType : kUnpremul_SkAlphaType;
+ 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()) {
+ for (int x = 0; x < dst_info.width(); x++) {
+ row[x] =
+ SkPreMultiplyARGB(SkGetPackedA32(row[x]), SkGetPackedR32(row[x]),
+ SkGetPackedG32(row[x]), SkGetPackedB32(row[x]));
+ }
+ }
+
+ row = reinterpret_cast<uint32_t*>(
+ (reinterpret_cast<uint8_t*>(row) + row_bytes));
+ }
+}
+
+bool DecodingImageGenerator::onGetPixels(const SkImageInfo& dst_info,
void* pixels,
size_t row_bytes,
- SkPMColor table[],
- int* table_count) {
+ SkPMColor*,
+ int*) {
TRACE_EVENT1("blink", "DecodingImageGenerator::getPixels", "frame index",
static_cast<int>(frame_index_));
// Implementation doesn't support scaling yet, so make sure we're not given a
// different size.
- if (info.width() != getInfo().width() || info.height() != getInfo().height())
+ if (dst_info.dimensions() != getInfo().dimensions()) {
return false;
+ }
- if (info.colorType() != getInfo().colorType()) {
- // blink::ImageFrame may have changed the owning SkBitmap to
- // kOpaque_SkAlphaType after fully decoding the image frame, so if we see a
- // request for opaque, that is ok even if our initial alpha type was not
- // opaque.
+ if (dst_info.colorType() != kN32_SkColorType) {
return false;
}
+ // Skip the check for alphaType. blink::ImageFrame may have changed the
+ // owning SkBitmap to kOpaque_SkAlphaType after fully decoding the image
+ // frame, so if we see a request for opaque, that is ok even if our initial
+ // alpha type was not opaque.
+
+ // Pass decodeColorSpace to the decoder. That is what we can expect the
+ // output to be.
+ SkColorSpace* decode_color_space = getInfo().colorSpace();
+ SkImageInfo decode_info =
+ dst_info.makeColorSpace(sk_ref_sp(decode_color_space));
+
+ const bool needs_color_xform =
+ decode_color_space && dst_info.colorSpace() &&
+ !SkColorSpace::Equals(decode_color_space, dst_info.colorSpace());
+ ImageDecoder::AlphaOption alpha_option = ImageDecoder::kAlphaPremultiplied;
+ if (needs_color_xform && !decode_info.isOpaque()) {
+ alpha_option = ImageDecoder::kAlphaNotPremultiplied;
+ decode_info = decode_info.makeAlphaType(kUnpremul_SkAlphaType);
+ }
+
PlatformInstrumentation::WillDecodeLazyPixelRef(uniqueID());
bool decoded = frame_generator_->DecodeAndScale(
- data_.Get(), all_data_received_, frame_index_, getInfo(), pixels,
- row_bytes);
+ data_.Get(), all_data_received_, frame_index_, decode_info, pixels,
+ row_bytes, alpha_option);
PlatformInstrumentation::DidDecodeLazyPixelRef();
+ if (decoded && needs_color_xform) {
+ doColorSpaceXform(dst_info, pixels, row_bytes, decode_color_space);
+ }
+
return decoded;
}
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/graphics/ImageDecodingStore.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698