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

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

Issue 1331533002: [poc] curve-filter Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Draw layered images with a recording GraphicContext Created 5 years, 1 month 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
Index: third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp
index 5cf79cc4b3e8a823731a10f01098d1bae7ce2f38..0bd9f2ca8f536e5f211b12ebddc2c2f18559034f 100644
--- a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp
+++ b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp
@@ -36,10 +36,14 @@
#include "platform/geometry/FloatRect.h"
#include "platform/geometry/LayoutRect.h"
#include "platform/graphics/BitmapImage.h"
+#include "platform/graphics/ColorSpaceFilter.h"
+#include "platform/graphics/ColorSpaceProfile.h"
#include "platform/graphics/FirstPaintInvalidationTracking.h"
#include "platform/graphics/GraphicsContext.h"
#include "platform/graphics/GraphicsLayerFactory.h"
+#include "platform/graphics/GraphicsScreen.h"
#include "platform/graphics/Image.h"
+#include "platform/graphics/ImageBuffer.h"
#include "platform/graphics/LinkHighlight.h"
#include "platform/graphics/filters/SkiaImageFilterBuilder.h"
#include "platform/graphics/paint/DrawingRecorder.h"
@@ -1065,7 +1069,58 @@ void GraphicsLayer::setContentsToImage(Image* image, RespectImageOrientationEnum
RefPtr<SkImage> skImage = image ? image->imageForCurrentFrame() : nullptr;
if (image && skImage && image->isBitmapImage()) {
- if (respectImageOrientation == RespectImageOrientation) {
+ RELEASE_ASSERT(currentScreenId()); // There should be an active graphics screen.
+
+ if (imageColorProfilesEnabled() && toBitmapImage(image)->hasColorProfile()) {
+ // FIXME: maybe pass the color transform filter to the layer so it gets applied on the GPU.
+ // FIXME: alternative is to somehow cache this local drawing on this GraphicsLayer, which would
+ // save having to plumb transform SkColorFilters through to the GPU process, or else have BitmapImage
+ // cache color corrected images and provide the appropriate image here.
+ // FIXME: In an experiment, I passed a SkColorCubeFilter to the GPU and that works. But note that
+ // SkColorCurveFilter does not: it gets dropped on floor somewhere after CC sends it to the GPU process
+ // (maybe because SkColorCurveFilter has float-16 textures, whereas SkColorCubeFilter does not?).
+
+ /*
+ bool opaque = image->currentFrameKnownToBeOpaque();
+ OwnPtr<ImageBuffer> buffer = ImageBuffer::create(image->size(), opaque ? Opaque : NonOpaque);
+ IntRect source = IntRect(IntPoint(), image->size());
+ image->draw(buffer->canvas(), SkPaint(), source, source, DoNotRespectImageOrientation, Image::ClampImageToSourceRect);
+ skImage = buffer->newSkImageSnapshot(PreferNoAcceleration);
+ */
+
+ OwnPtr<PaintController> paintController = PaintController::create();
+ GraphicsContext context(*paintController);
+
+ FloatRect bounds(0, 0, image->size().width(), image->size().width());
+ context.beginRecording(bounds);
+ context.drawImage(image, IntRect(0, 0, image->size().width(), image->size().width()));
+ RefPtr<const SkPicture> picture = context.endRecording();
+
+ SkISize skISize = SkISize::Make(image->size().width(), image->size().width());
+ skImage = SkImage::NewFromPicture(picture.get(), skISize, nullptr, nullptr);
+
+ /*
+ FIXME: SkRef counting on the SkImage counting ASSERTs on the Mac Release try: find out why.
Noel Gordon 2015/12/01 03:15:47 Need an adoptRef at the end: skImage = adoptRef
Noel Gordon 2015/12/01 03:18:09 And similarly for the skImage created @ line 1100
+ SkPictureRecorder recorder;
+ SkRect bounds = SkRect::MakeIWH(skImage->width(), skImage->height());
+ SkCanvas* canvas = recorder.beginRecording(bounds, nullptr, 0);
+
+ SkPaint defaultPaint;
+ canvas->drawImageRect(skImage.get(), bounds, bounds, &defaultPaint, SkCanvas::kStrict_SrcRectConstraint);
+ RefPtr<SkPicture> picture = adoptRef(recorder.endRecording());
+
+ SkPaint transformPaint;
+ RefPtr<ColorSpaceProfile> screen = screenColorProfile(currentScreenId());
+ RefPtr<ColorSpaceProfile> source = toBitmapImage(image)->colorProfile();
+ if (RefPtr<SkColorFilter> colorTransform = createColorSpaceFilter(source.get(), screen.get()))
+ transformPaint.setColorFilter(colorTransform.get());
+
+ SkISize skISize = SkISize::Make(skImage->width(), skImage->height());
+ skImage = SkImage::NewFromPicture(picture.get(), skISize, nullptr, &transformPaint);
+ */
+ }
+
+ if (skImage && respectImageOrientation == RespectImageOrientation) {
ImageOrientation imageOrientation = toBitmapImage(image)->currentFrameOrientation();
skImage = DragImage::resizeAndOrientImage(skImage.release(), imageOrientation);
}

Powered by Google App Engine
This is Rietveld 408576698