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

Unified Diff: third_party/WebKit/Source/core/html/HTMLVideoElement.cpp

Issue 1331533002: [poc] curve-filter Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix CanvasRenderingContext2D::createPattern crash for #40 Created 4 years, 11 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
Index: third_party/WebKit/Source/core/html/HTMLVideoElement.cpp
diff --git a/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp b/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp
index ab6deeb1a452b50dac4f0d1c44d344b7e6da9446..cad1b5f29451c890e4b1bcb9d4c360689b4284e6 100644
--- a/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLVideoElement.cpp
@@ -41,7 +41,10 @@
#include "core/layout/LayoutVideo.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "platform/UserGestureIndicator.h"
+#include "platform/graphics/ColorSpaceFilter.h"
+#include "platform/graphics/ColorSpaceProfile.h"
#include "platform/graphics/GraphicsContext.h"
+#include "platform/graphics/GraphicsScreen.h"
#include "platform/graphics/ImageBuffer.h"
#include "platform/graphics/gpu/Extensions3DUtil.h"
#include "public/platform/WebCanvas.h"
@@ -194,7 +197,7 @@ void HTMLVideoElement::updateDisplayState()
setDisplayMode(Poster);
}
-void HTMLVideoElement::paintCurrentFrame(SkCanvas* canvas, const IntRect& destRect, const SkPaint* paint) const
+void HTMLVideoElement::paintCurrentFrame(SkCanvas* canvas, const IntRect& destRect, const SkPaint* paint, ColorSpaceProfile* target) const
{
if (!webMediaPlayer())
return;
@@ -203,8 +206,31 @@ void HTMLVideoElement::paintCurrentFrame(SkCanvas* canvas, const IntRect& destRe
if (!paint || !SkXfermode::AsMode(paint->getXfermode(), &mode))
mode = SkXfermode::kSrcOver_Mode;
+ // FIXME: read the video color space from the video frame and use it as the source color profile
+ // rather than assuming an sRGB source as is done here.
+ RefPtr<SkColorFilter> colorTransform;
+ if (RefPtr<ColorSpaceProfile> targetProfile = target) {
+ RefPtr<ColorSpaceProfile> sourceProfile = screenColorProfile(ScreenDevice::sRGB);
+ colorTransform = createColorSpaceFilter(sourceProfile.get(), targetProfile.get());
+ }
+
+ SkPictureRecorder recorder;
+ IntRect sourceRect = IntRect(0, 0, videoWidth(), videoHeight());
+ SkCanvas* recordingCanvas = recorder.beginRecording(sourceRect);
// TODO(junov, philipj): crbug.com/456529 Pass the whole SkPaint instead of only alpha and xfermode
- webMediaPlayer()->paint(canvas, destRect, paint ? paint->getAlpha() : 0xFF, mode);
+ // and maybe correctly handle the video source color profile as well.
+ webMediaPlayer()->paint(recordingCanvas, sourceRect, 0xFF, SkXfermode::kSrc_Mode);
+ RefPtr<SkPicture> recorded = adoptRef(recorder.endRecording());
+
+ SkPaint transformPaint;
+ transformPaint.setColorFilter(colorTransform.get());
+ transformPaint.setAlpha(paint ? paint->getAlpha() : 0xFF);
+ transformPaint.setXfermodeMode(mode);
+ transformPaint.setFilterQuality(kLow_SkFilterQuality);
+
+ SkISize size = SkISize::Make(videoWidth(), videoHeight());
+ RefPtr<SkImage> image = adoptRef(SkImage::NewFromPicture(recorded.get(), size, nullptr, nullptr));
+ canvas->drawImageRect(image.get(), SkIRect::MakeSize(size), destRect, &transformPaint);
}
bool HTMLVideoElement::copyVideoTextureToPlatformTexture(WebGraphicsContext3D* context, Platform3DObject texture, GLenum internalFormat, GLenum type, bool premultiplyAlpha, bool flipY)
@@ -300,7 +326,7 @@ PassRefPtr<Image> HTMLVideoElement::getSourceImageForCanvas(SourceImageStatus* s
return nullptr;
}
- paintCurrentFrame(imageBuffer->canvas(), IntRect(IntPoint(0, 0), intrinsicSize), nullptr);
+ paintCurrentFrame(imageBuffer->canvas(), IntRect(IntPoint(0, 0), intrinsicSize), nullptr, nullptr);
RefPtr<Image> snapshot = imageBuffer->newImageSnapshot();
if (!snapshot) {
*status = InvalidSourceImageStatus;
« no previous file with comments | « third_party/WebKit/Source/core/html/HTMLVideoElement.h ('k') | third_party/WebKit/Source/core/input/EventHandler.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698