Index: cc/playback/raster_source.cc |
diff --git a/cc/playback/raster_source.cc b/cc/playback/raster_source.cc |
index e15a91968c385393cb4ecbb6ec5e61d44c872e73..eaaa19b309ea231ff771f3a514f55670b084d41b 100644 |
--- a/cc/playback/raster_source.cc |
+++ b/cc/playback/raster_source.cc |
@@ -16,6 +16,7 @@ |
#include "cc/playback/skip_image_canvas.h" |
#include "skia/ext/analysis_canvas.h" |
#include "third_party/skia/include/core/SkCanvas.h" |
+#include "third_party/skia/include/core/SkColorSpaceXformCanvas.h" |
#include "third_party/skia/include/core/SkPictureRecorder.h" |
#include "ui/gfx/geometry/rect_conversions.h" |
@@ -87,7 +88,7 @@ void RasterSource::PlaybackToCanvas(SkCanvas* raster_canvas, |
if (settings.skip_images) { |
SkipImageCanvas canvas(raster_canvas); |
- RasterCommon(&canvas, nullptr); |
+ RasterCommon(&canvas, settings.target_color_space, nullptr); |
} else if (settings.use_image_hijack_canvas) { |
const SkImageInfo& info = raster_canvas->imageInfo(); |
ImageHijackCanvas canvas(info.width(), info.height(), image_decode_cache_, |
@@ -101,9 +102,9 @@ void RasterSource::PlaybackToCanvas(SkCanvas* raster_canvas, |
canvas.setMatrix(raster_canvas->getTotalMatrix()); |
canvas.addCanvas(raster_canvas); |
- RasterCommon(&canvas, nullptr); |
+ RasterCommon(&canvas, settings.target_color_space, nullptr); |
} else { |
- RasterCommon(raster_canvas, nullptr); |
+ RasterCommon(raster_canvas, settings.target_color_space, nullptr); |
} |
} |
@@ -196,12 +197,22 @@ void RasterSource::PrepareForPlaybackToCanvas(SkCanvas* canvas) const { |
canvas->restore(); |
} |
-void RasterSource::RasterCommon(SkCanvas* canvas, |
+void RasterSource::RasterCommon(SkCanvas* input_canvas, |
+ const gfx::ColorSpace& target_color_space, |
SkPicture::AbortCallback* callback) const { |
+ SkCanvas* raster_canvas = input_canvas; |
+ // TODO(ccameron): This cannot link until SkCreateColorSpaceXformCanvas is |
+ // marked as SK_API. |
+ // std::unique_ptr<SkCanvas> color_transform_canvas; |
+ // if (target_color_space.IsValid()) { |
+ // color_transform_canvas = SkCreateColorSpaceXformCanvas( |
+ // input_canvas, target_color_space.ToSkColorSpace()); |
+ // raster_canvas = color_transform_canvas.get(); |
+ // } |
DCHECK(display_list_.get()); |
int repeat_count = std::max(1, slow_down_raster_scale_factor_for_debug_); |
for (int i = 0; i < repeat_count; ++i) |
- display_list_->Raster(canvas, callback); |
+ display_list_->Raster(raster_canvas, callback); |
} |
sk_sp<SkPicture> RasterSource::GetFlattenedPicture() { |
@@ -211,7 +222,8 @@ sk_sp<SkPicture> RasterSource::GetFlattenedPicture() { |
SkCanvas* canvas = recorder.beginRecording(size_.width(), size_.height()); |
if (!size_.IsEmpty()) { |
PrepareForPlaybackToCanvas(canvas); |
- RasterCommon(canvas, nullptr); |
+ // No target color space should be set for generating an SkPicture. |
+ RasterCommon(canvas, gfx::ColorSpace(), nullptr); |
} |
return recorder.finishRecordingAsPicture(); |
@@ -235,7 +247,9 @@ bool RasterSource::PerformSolidColorAnalysis(const gfx::Rect& content_rect, |
layer_rect.Intersect(gfx::Rect(size_)); |
skia::AnalysisCanvas canvas(layer_rect.width(), layer_rect.height()); |
canvas.translate(-layer_rect.x(), -layer_rect.y()); |
- RasterCommon(&canvas, &canvas); |
+ // No target color space should be set for solid color analysis (the |
+ // resulting solid color will be known to be sRGB). |
+ RasterCommon(&canvas, gfx::ColorSpace(), &canvas); |
return canvas.GetColorIfSolid(color); |
} |