WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
try
bug-229025-20211016175951.patch (text/plain), 235.94 KB, created by
Cameron McCormack (:heycam)
on 2021-10-15 23:59:53 PDT
(
hide
)
Description:
try
Filename:
MIME Type:
Creator:
Cameron McCormack (:heycam)
Created:
2021-10-15 23:59:53 PDT
Size:
235.94 KB
patch
obsolete
>Subversion Revision: 284229 >diff --git a/Source/WTF/ChangeLog b/Source/WTF/ChangeLog >index 78ecf8642d5c47f1b3a102d39ab5443e56d6683b..d16d1489fcbf544b5cbc4cf810106aac7b555c23 100644 >--- a/Source/WTF/ChangeLog >+++ b/Source/WTF/ChangeLog >@@ -1,3 +1,13 @@ >+2021-10-03 Cameron McCormack <heycam@apple.com> >+ >+ Ensure CanvasRenderingContext2D.drawImage(video) uses the right color space >+ https://bugs.webkit.org/show_bug.cgi?id=229025 >+ <rdar://problem/81828490> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * wtf/PlatformHave.h: Add HAVE_CVBUFFERCOPYATTACHMENTS. >+ > 2021-10-14 Nikos Mouchtaris <nmouchtaris@apple.com> > > Enable lazy image loading by default >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index fc9e7f2f76e01cb851da00e2f3aa82f9da5513b7..245f85c90f67ca5ac09903dbccc42b7fb3e447bb 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,114 @@ >+2021-09-21 Cameron McCormack <heycam@apple.com> >+ >+ Ensure CanvasRenderingContext2D.drawImage(video) uses the right color space >+ https://bugs.webkit.org/show_bug.cgi?id=229025 >+ <rdar://problem/81828490> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ When GPU process media handling is disabled (and in the GPU process >+ when it is handling a NativeImageForCurrentTime message), >+ MediaPlayer::nativeImageForCurrentTime is used to get the video frame >+ image. We make this return an image with the right color space on >+ Apple platforms in PixelBufferConformerCV::createImageFromPixelBuffer. >+ >+ For now, we avoid using the correct color space when passing >+ HTMLVideoElements to WebGLRenderingContext.texImage2D. The >+ specification is unclear about what color space the texture data >+ should be in, and implementations are currently interoperable in not >+ converting the RGB color space of the video (such as Rec.601, Rec.709, >+ etc.) into sRGB. To avoid the conversion, and effectively reinterpret >+ the video RGB colors as sRGB, we make the ImageBuffer the video is >+ drawn into have a matching color space, as it's the raw RGB values >+ from the ImageBuffer that are uploade as the texture. >+ >+ (An alternative to this could be passing an argument through >+ nativeImageForCurrentTime and paintCurrentFrameInContext, which says >+ to avoid doing the conversion from video RGB to sRGB, but that needs a >+ fair amount of plumbing.) >+ >+ If https://github.com/KhronosGroup/WebGL/issues/2165 is resolved, the >+ changes to LRUImageBufferCache in this commit can be reverted, so that >+ video frames are drawn into sRGB ImageBuffers again. (We'd also need >+ something to make the copyToPlatformTexture() call in >+ texImageSourceHelper do the correct color conversion somehow.) >+ >+ The now differing behavior between CanvasRenderingContext2D.drawImage >+ and WebGLRenderingContext.texImage2D means that the WebGL conformance >+ suite textures/misc/texture-corner-case-videos.html test fails, since >+ it checks for incorrect 2D canvas video frame color conversion. >+ >+ Tests: imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video.html >+ imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html >+ >+ * html/HTMLVideoElement.cpp: >+ (WebCore::HTMLVideoElement::colorSpace const): New function that >+ exposes the color space of the current frame of the video. >+ * html/HTMLVideoElement.h: >+ * html/ImageBitmap.cpp: >+ (WebCore::ImageBitmap::createPromise): Create the ImageBuffer in a >+ color space that matches the video, not always sRGB. >+ * html/canvas/WebGLRenderingContextBase.cpp: >+ (WebCore::WebGLRenderingContextBase::drawImageIntoBuffer): >+ (WebCore::WebGLRenderingContextBase::videoFrameToImage): Use an >+ ImageBuffer whose color space matches the video frame's color space. >+ (WebCore::WebGLRenderingContextBase::LRUImageBufferCache::imageBuffer): >+ Add a DestinationColorSpace argument, so that the LRU cache is keyed >+ off both size and color space. >+ * html/canvas/WebGLRenderingContextBase.h: >+ * platform/cocoa/CoreVideoSoftLink.cpp: >+ * platform/cocoa/CoreVideoSoftLink.h: Add SPIs that let us get or >+ compute a CGColorSpace from a CVPixelBuffer. Remove >+ CVImageBufferGetColorSpace, which is unsused. >+ * platform/graphics/MediaPlayer.cpp: >+ (WebCore::MediaPlayer::colorSpace): >+ * platform/graphics/MediaPlayer.h: >+ * platform/graphics/MediaPlayerPrivate.h: >+ (WebCore::MediaPlayerPrivateInterface::colorSpace): >+ * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h: >+ * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp: >+ (WebCore::MediaPlayerPrivateAVFoundationCF::colorSpace): >+ * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h: >+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h: >+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm: >+ (WebCore::MediaPlayerPrivateAVFoundationObjC::colorSpace): Expose the >+ color space of the current image. While we strictly only need the pixel >+ buffer to be up to date, we call updateLastImage() since it has the >+ UpdateSynchronously behavior, and the caller to colorSpace() will use >+ the image soon anyway. >+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h: >+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm: >+ (WebCore::MediaPlayerPrivateMediaSourceAVFObjC::colorSpace): >+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: >+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: >+ (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::colorSpace): >+ * platform/graphics/cg/ColorSpaceCG.h: >+ * platform/graphics/cv/CVUtilities.h: >+ * platform/graphics/cv/CVUtilities.mm: >+ (WebCore::createCGColorSpaceForCVPixelBuffer): New function to produce >+ a CGColorSpace for a CVPixelBuffer. On macOS, this is stored as an >+ attachment on the CVPixelBuffer. On iOS, we must call SPI to create a >+ CGColorSpace based on the other color space information in the >+ attachments. (It's possible we should cache the results of this >+ function for a given set of color space attachments, since >+ CVImageBufferCreateColorSpaceFromAttachments can end up creating a new >+ CGColorSpace object every time it's called.) >+ * platform/graphics/cv/PixelBufferConformerCV.cpp: >+ (WebCore::PixelBufferConformerCV::createImageFromPixelBuffer): Create >+ the CGImage in a color space matching the CVPixelBuffer. >+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: >+ (WebCore::MediaPlayerPrivateGStreamer::colorSpace): >+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: >+ * platform/graphics/holepunch/MediaPlayerPrivateHolePunch.h: >+ * platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp: >+ (WebCore::MediaPlayerPrivateMediaFoundation::colorSpace): >+ * platform/graphics/win/MediaPlayerPrivateMediaFoundation.h: >+ * platform/mock/mediasource/MockMediaPlayerMediaSource.cpp: >+ (WebCore::MockMediaPlayerMediaSource::colorSpace): >+ * platform/mock/mediasource/MockMediaPlayerMediaSource.h: >+ * svg/graphics/SVGImage.cpp: >+ (WebCore::SVGImage::drawInternal): >+ > 2021-10-14 Chris Dumez <cdumez@apple.com> > > Service workers running on the main thread should use the main VM >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 7b966d89f3a72918da4ef1677419f21f8cacb08a..5acb74c398645c6120e0b6ae16a65913093cc0e7 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,47 @@ >+2021-09-21 Cameron McCormack <heycam@apple.com> >+ >+ Ensure CanvasRenderingContext2D.drawImage(video) uses the right color space >+ https://bugs.webkit.org/show_bug.cgi?id=229025 >+ <rdar://problem/81828490> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ When GPU process media handling is enabled, ctx.drawImage(video) >+ calls work by sending a NativeImageForCurrentTime message to the GPU >+ process, which returns an IOSurface around which a CGImage is created. >+ There's no good way to get the color space off the IOSurface, so we >+ add a second return argument to NativeImageForCurrentTime to indicate >+ the color space used. >+ >+ ImageBitmap creates an ImageBuffer for that image to be painted into, >+ and for that we also need to know the color space of the video. The >+ code that sends NativeImageForCurrentTime and then paints the >+ resulting image into the GraphicsContext is further down. So we add >+ a separate IPC message that gets the color space of the video's >+ current frame. (It would be better if we could avoid a second >+ synchronous IPC message call, but either ImageBitmap's scaling and >+ cropping code, or the ImageBuffer creation call, would need to be moved >+ down into MediaPlayerPrivateRemote::paintCurrentFrameInContext, which >+ doesn't seem like the right place for it.) >+ >+ * GPUProcess/media/RemoteImageDecoderAVFProxy.cpp: >+ (WebKit::RemoteImageDecoderAVFProxy::createFrameImageAtIndex): >+ * GPUProcess/media/RemoteImageDecoderAVFProxy.h: >+ * GPUProcess/media/RemoteMediaPlayerProxy.h: >+ * GPUProcess/media/RemoteMediaPlayerProxy.messages.in: >+ * GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm: >+ (WebKit::RemoteMediaPlayerProxy::nativeImageForCurrentTime): >+ (WebKit::RemoteMediaPlayerProxy::colorSpace): >+ * WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp: >+ (WebKit::MediaPlayerPrivateRemote::colorSpace): >+ * WebProcess/GPU/media/MediaPlayerPrivateRemote.h: >+ * WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm: >+ (WebKit::MediaPlayerPrivateRemote::nativeImageForCurrentTime): Add a >+ second return argument to NativeImageForCurrentTime to indicate the >+ color space of the returned IOSurface. >+ (WebKit::MediaPlayerPrivateRemote::colorSpace): Add a new IPC message to >+ get the color space of a video's current frame. >+ > 2021-10-14 Wenson Hsieh <wenson_hsieh@apple.com> > > [JS IPC] Implement a way to synchronously wait for an incoming IPC message >diff --git a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm >index 7e904196454e79a131d7982b508081e6eaf3742c..286d64b411e6ce4d715533c7b0cba8a429986ee3 100644 >--- a/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm >+++ b/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH264.mm >@@ -42,9 +42,9 @@ - (void)setError:(OSStatus)error; > @end > > static void overrideColorSpaceAttachmentsIfNeeded(CVImageBufferRef imageBuffer) { >- auto guess = CVBufferGetAttachment(imageBuffer, (CFStringRef)@"ColorInfoGuessedBy", nullptr); >- if (!guess || !CFEqual(guess, (CFStringRef)@"VideoToolbox")) >- return; >+// auto guess = CVBufferGetAttachment(imageBuffer, (CFStringRef)@"ColorInfoGuessedBy", nullptr); >+// if (!guess || !CFEqual(guess, (CFStringRef)@"VideoToolbox")) >+// return; > > CVBufferRemoveAttachment(imageBuffer, kCVImageBufferCGColorSpaceKey); > CVBufferSetAttachment(imageBuffer, kCVImageBufferColorPrimariesKey, kCVImageBufferColorPrimaries_ITU_R_709_2, kCVAttachmentMode_ShouldPropagate); >diff --git a/Source/WTF/wtf/PlatformHave.h b/Source/WTF/wtf/PlatformHave.h >index f71b524b2dc3a34132699275de5618ee69df8325..7f9f95f62e2aba59fd4fa9cd3e604ce064b1d0b6 100644 >--- a/Source/WTF/wtf/PlatformHave.h >+++ b/Source/WTF/wtf/PlatformHave.h >@@ -1057,3 +1057,10 @@ > #if PLATFORM(IOS) > #define HAVE_PUACTIVITYPROGRESSCONTROLLER 1 > #endif >+ >+#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 120000) \ >+ || (((PLATFORM(IOS) && !PLATFORM(IOS_FAMILY_SIMULATOR)) || PLATFORM(MACCATALYST)) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 150000) \ >+ || (PLATFORM(WATCHOS) && !PLATFORM(IOS_FAMILY_SIMULATOR) && __WATCH_OS_VERSION_MIN_REQUIRED >= 80000) \ >+ || (PLATFORM(APPLETV) && !PLATFORM(IOS_FAMILY_SIMULATOR) && __TV_OS_VERSION_MIN_REQUIRED >= 150000) >+#define HAVE_CVBUFFERCOPYATTACHMENTS 1 >+#endif >diff --git a/Source/WebCore/html/HTMLVideoElement.cpp b/Source/WebCore/html/HTMLVideoElement.cpp >index 04c02b8c89bb4c0ebddcca45028bbfd00da79b6f..b72d043d31f3925a109ff23303cd9f27af53917a 100644 >--- a/Source/WebCore/html/HTMLVideoElement.cpp >+++ b/Source/WebCore/html/HTMLVideoElement.cpp >@@ -284,6 +284,15 @@ void HTMLVideoElement::mediaPlayerFirstVideoFrameAvailable() > renderer->updateFromElement(); > } > >+std::optional<DestinationColorSpace> HTMLVideoElement::colorSpace() const >+{ >+ RefPtr<MediaPlayer> player = HTMLMediaElement::player(); >+ if (!player) >+ return std::nullopt; >+ >+ return player->colorSpace(); >+} >+ > RefPtr<ImageBuffer> HTMLVideoElement::createBufferForPainting(const FloatSize& size, RenderingMode renderingMode, const DestinationColorSpace& colorSpace, PixelFormat pixelFormat) const > { > auto* hostWindow = document().view() && document().view()->root() ? document().view()->root()->hostWindow() : nullptr; >diff --git a/Source/WebCore/html/HTMLVideoElement.h b/Source/WebCore/html/HTMLVideoElement.h >index 10991f05f1474eee5eb01ee7832339120f6e372f..e872b8bcd37c8f28f613e77f8cec0c79e5a3ab72 100644 >--- a/Source/WebCore/html/HTMLVideoElement.h >+++ b/Source/WebCore/html/HTMLVideoElement.h >@@ -78,6 +78,7 @@ public: > void paintCurrentFrameInContext(GraphicsContext&, const FloatRect&); > > WEBCORE_EXPORT RefPtr<NativeImage> nativeImageForCurrentTime(); >+ std::optional<DestinationColorSpace> colorSpace() const; > > WEBCORE_EXPORT bool shouldDisplayPosterImage() const; > >diff --git a/Source/WebCore/html/ImageBitmap.cpp b/Source/WebCore/html/ImageBitmap.cpp >index 062a7d798df08ff6fabb572db520fbb1992e6167..f210b4a22d5429e496805f1e82ba9695238d9d74 100644 >--- a/Source/WebCore/html/ImageBitmap.cpp >+++ b/Source/WebCore/html/ImageBitmap.cpp >@@ -512,8 +512,12 @@ void ImageBitmap::createPromise(ScriptExecutionContext& scriptExecutionContext, > > auto outputSize = outputSizeForSourceRectangle(sourceRectangle, options); > >- // FIXME: Add support for color spaces / pixel formats to ImageBitmap. >- auto bitmapData = video->createBufferForPainting(outputSize, bufferRenderingMode, DestinationColorSpace::SRGB(), PixelFormat::BGRA8); >+ auto colorSpace = video->colorSpace(); >+ if (!colorSpace) >+ colorSpace = DestinationColorSpace::SRGB(); >+ >+ // FIXME: Add support for pixel formats to ImageBitmap. >+ auto bitmapData = video->createBufferForPainting(outputSize, bufferRenderingMode, *colorSpace, PixelFormat::BGRA8); > if (!bitmapData) { > resolveWithBlankImageBuffer(scriptExecutionContext, !taintsOrigin(scriptExecutionContext.securityOrigin(), *video), WTFMove(promise)); > return; >diff --git a/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp b/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp >index ce9a091073c92817d3a827627cbe34df68f168f9..9ff0a97c93cea775f93c80fdd9a41bd0358e723b 100644 >--- a/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp >+++ b/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp >@@ -5885,7 +5885,7 @@ RefPtr<Image> WebGLRenderingContextBase::drawImageIntoBuffer(Image& image, int w > { > IntSize size(width, height); > size.scale(deviceScaleFactor); >- ImageBuffer* buf = m_generatedImageCache.imageBuffer(size); >+ ImageBuffer* buf = m_generatedImageCache.imageBuffer(size, DestinationColorSpace::SRGB()); > if (!buf) { > synthesizeGLError(GraphicsContextGL::OUT_OF_MEMORY, functionName, "out of memory"); > return nullptr; >@@ -5901,6 +5901,16 @@ RefPtr<Image> WebGLRenderingContextBase::drawImageIntoBuffer(Image& image, int w > > RefPtr<Image> WebGLRenderingContextBase::videoFrameToImage(HTMLVideoElement* video, BackingStoreCopy backingStoreCopy, const char* functionName) > { >+ // FIXME: When texImage2D is passed an HTMLVideoElement, implementations >+ // interoperably use the native RGB color values of the video frame (e.g. >+ // Rec.601 color space values) for the texture. But nativeImageForCurrentTime >+ // and paintCurrentFrameInContext return and use an image with its color space >+ // correctly matching the video. >+ // >+ // https://github.com/KhronosGroup/WebGL/issues/2165 is open on converting >+ // the video element image source to sRGB instead of leaving it in its >+ // native RGB color space. For now, we make sure to paint into an >+ // ImageBuffer with a matching color space, to avoid the conversion. > #if USE(AVFOUNDATION) > auto nativeImage = video->nativeImageForCurrentTime(); > // Currently we might be missing an image due to MSE not being able to provide the first requested frame. >@@ -5913,7 +5923,7 @@ RefPtr<Image> WebGLRenderingContextBase::videoFrameToImage(HTMLVideoElement* vid > return nullptr; > } > FloatRect imageRect { { }, imageSize }; >- ImageBuffer* imageBuffer = m_generatedImageCache.imageBuffer(imageSize, CompositeOperator::Copy); >+ ImageBuffer* imageBuffer = m_generatedImageCache.imageBuffer(imageSize, nativeImage->colorSpace(), CompositeOperator::Copy); > if (!imageBuffer) { > synthesizeGLError(GraphicsContextGL::OUT_OF_MEMORY, functionName, "out of memory"); > return nullptr; >@@ -5924,7 +5934,10 @@ RefPtr<Image> WebGLRenderingContextBase::videoFrameToImage(HTMLVideoElement* vid > // video visible size is different to the natural size. This should be removed > // once all platforms implement nativeImageForCurrentTime(). > IntSize videoSize { static_cast<int>(video->videoWidth()), static_cast<int>(video->videoHeight()) }; >- ImageBuffer* imageBuffer = m_generatedImageCache.imageBuffer(videoSize); >+ auto colorSpace = video->colorSpace(); >+ if (!colorSpace) >+ colorSpace = DestinationColorSpace::SRGB(); >+ ImageBuffer* imageBuffer = m_generatedImageCache.imageBuffer(videoSize, *colorSpace); > if (!imageBuffer) { > synthesizeGLError(GraphicsContextGL::OUT_OF_MEMORY, functionName, "out of memory"); > return nullptr; >@@ -7778,32 +7791,32 @@ WebGLRenderingContextBase::LRUImageBufferCache::LRUImageBufferCache(int capacity > { > } > >-ImageBuffer* WebGLRenderingContextBase::LRUImageBufferCache::imageBuffer(const IntSize& size, CompositeOperator fillOperator) >+ImageBuffer* WebGLRenderingContextBase::LRUImageBufferCache::imageBuffer(const IntSize& size, DestinationColorSpace colorSpace, CompositeOperator fillOperator) > { > size_t i; > for (i = 0; i < m_buffers.size(); ++i) { >- ImageBuffer* buf = m_buffers[i].get(); >- if (!buf) >+ if (!m_buffers[i]) > break; >- if (buf->logicalSize() != size) >+ ImageBuffer& buf = m_buffers[i]->second.get(); >+ if (m_buffers[i]->first != colorSpace || buf.logicalSize() != size) > continue; > bubbleToFront(i); > if (fillOperator != CompositeOperator::Copy && fillOperator != CompositeOperator::Clear) >- buf->context().clearRect({ { }, size }); >- return buf; >+ buf.context().clearRect({ { }, size }); >+ return &buf; > } > > // FIXME (149423): Should this ImageBuffer be unconditionally unaccelerated? >- auto temp = ImageBuffer::create(size, RenderingMode::Unaccelerated, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8); >+ auto temp = ImageBuffer::create(size, RenderingMode::Unaccelerated, 1, colorSpace, PixelFormat::BGRA8); > if (!temp) > return nullptr; > ASSERT(m_buffers.size() > 0); > i = std::min(m_buffers.size() - 1, i); >- m_buffers[i] = WTFMove(temp); >+ m_buffers[i] = { colorSpace, temp.releaseNonNull() }; > >- ImageBuffer* buf = m_buffers[i].get(); >+ ImageBuffer& buf = m_buffers[i]->second.get(); > bubbleToFront(i); >- return buf; >+ return &buf; > } > > void WebGLRenderingContextBase::LRUImageBufferCache::bubbleToFront(size_t idx) >diff --git a/Source/WebCore/html/canvas/WebGLRenderingContextBase.h b/Source/WebCore/html/canvas/WebGLRenderingContextBase.h >index b7170d2bd71f11175886f1137d11e222b43252b1..f0988577b2cbb23438a87357050efed352789285 100644 >--- a/Source/WebCore/html/canvas/WebGLRenderingContextBase.h >+++ b/Source/WebCore/html/canvas/WebGLRenderingContextBase.h >@@ -621,10 +621,10 @@ protected: > LRUImageBufferCache(int capacity); > // Returns pointer to a cleared image buffer that is owned by the cache. The pointer is valid until next call. > // Using fillOperator == CompositeOperator::Copy can be used to omit the clear of the buffer. >- ImageBuffer* imageBuffer(const IntSize&, CompositeOperator fillOperator = CompositeOperator::SourceOver); >+ ImageBuffer* imageBuffer(const IntSize&, DestinationColorSpace, CompositeOperator fillOperator = CompositeOperator::SourceOver); > private: > void bubbleToFront(size_t idx); >- Vector<RefPtr<ImageBuffer>> m_buffers; >+ Vector<std::optional<std::pair<DestinationColorSpace, Ref<ImageBuffer>>>> m_buffers; > }; > LRUImageBufferCache m_generatedImageCache { 0 }; > >diff --git a/Source/WebCore/platform/cocoa/CoreVideoSoftLink.cpp b/Source/WebCore/platform/cocoa/CoreVideoSoftLink.cpp >index f23d2cb6fabfa84d16c7093b4051c5c0424b8644..3e073a7865dca8183d8bc5ee979d17be90851098 100644 >--- a/Source/WebCore/platform/cocoa/CoreVideoSoftLink.cpp >+++ b/Source/WebCore/platform/cocoa/CoreVideoSoftLink.cpp >@@ -32,7 +32,11 @@ typedef struct __IOSurface* IOSurfaceRef; > > SOFT_LINK_FRAMEWORK_FOR_SOURCE(WebCore, CoreVideo) > >+#if HAVE(CVBUFFERCOPYATTACHMENTS) >+SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVBufferCopyAttachments, CFDictionaryRef, (CVBufferRef buffer, CVAttachmentMode mode), (buffer, mode)) >+#endif > SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVBufferGetAttachment, CFTypeRef, (CVBufferRef buffer, CFStringRef key, CVAttachmentMode* attachmentMode), (buffer, key, attachmentMode)) >+SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVBufferGetAttachments, CFDictionaryRef, (CVBufferRef buffer, CVAttachmentMode mode), (buffer, mode)) > SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVPixelBufferGetTypeID, CFTypeID, (), ()) > SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVPixelBufferGetWidth, size_t, (CVPixelBufferRef pixelBuffer), (pixelBuffer)) > SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVPixelBufferGetHeight, size_t, (CVPixelBufferRef pixelBuffer), (pixelBuffer)) >@@ -46,7 +50,7 @@ SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVPixelBufferUnlockBaseAddress > SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVPixelBufferPoolCreate, CVReturn,(CFAllocatorRef allocator, CFDictionaryRef poolAttributes, CFDictionaryRef pixelBufferAttributes, CVPixelBufferPoolRef* poolOut), (allocator, poolAttributes, pixelBufferAttributes, poolOut)) > SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVPixelBufferPoolCreatePixelBuffer, CVReturn, (CFAllocatorRef allocator, CVPixelBufferPoolRef pixelBufferPool, CVPixelBufferRef* pixelBufferOut), (allocator, pixelBufferPool, pixelBufferOut)) > SOFT_LINK_FUNCTION_FOR_SOURCE_WITH_EXPORT(WebCore, CoreVideo, CVPixelBufferGetIOSurface, IOSurfaceRef, (CVPixelBufferRef pixelBuffer), (pixelBuffer), WEBCORE_EXPORT) >-SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVImageBufferGetColorSpace, CGColorSpaceRef, (CVImageBufferRef pixelBuffer), (pixelBuffer)) >+SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVImageBufferCreateColorSpaceFromAttachments, CGColorSpaceRef, (CFDictionaryRef attachments), (attachments)) > > SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(WebCore, CoreVideo, kCVPixelBufferPixelFormatTypeKey, CFStringRef, WEBCORE_EXPORT) > SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, CoreVideo, kCVPixelBufferCGBitmapContextCompatibilityKey, CFStringRef) >@@ -72,6 +76,7 @@ SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, CoreVideo, kCVImageBufferTransferFunction > SOFT_LINK_CONSTANT_MAY_FAIL_FOR_SOURCE(WebCore, CoreVideo, kCVImageBufferYCbCrMatrix_DCI_P3, CFStringRef) > SOFT_LINK_CONSTANT_MAY_FAIL_FOR_SOURCE(WebCore, CoreVideo, kCVImageBufferYCbCrMatrix_P3_D65, CFStringRef) > SOFT_LINK_CONSTANT_MAY_FAIL_FOR_SOURCE(WebCore, CoreVideo, kCVImageBufferYCbCrMatrix_ITU_R_2020, CFStringRef) >+SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, CoreVideo, kCVImageBufferCGColorSpaceKey, CFStringRef) > > #if USE(OPENGL_ES) > SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVOpenGLESTextureCacheCreate, CVReturn, (CFAllocatorRef allocator, CFDictionaryRef cacheAttributes, CVEAGLContext eaglContext, CFDictionaryRef textureAttributes, CVOpenGLESTextureCacheRef* cacheOut), (allocator, cacheAttributes, eaglContext, textureAttributes, cacheOut)) >diff --git a/Source/WebCore/platform/cocoa/CoreVideoSoftLink.h b/Source/WebCore/platform/cocoa/CoreVideoSoftLink.h >index 985fbe861ec3a1af25f9423092ddb7450feaebda..c9b41391cfcb9934c3bc50433f318f8d95c87f2b 100644 >--- a/Source/WebCore/platform/cocoa/CoreVideoSoftLink.h >+++ b/Source/WebCore/platform/cocoa/CoreVideoSoftLink.h >@@ -32,8 +32,14 @@ typedef struct __IOSurface* IOSurfaceRef; > > SOFT_LINK_FRAMEWORK_FOR_HEADER(WebCore, CoreVideo) > >+#if HAVE(CVBUFFERCOPYATTACHMENTS) >+SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVBufferCopyAttachments, CFDictionaryRef, (CVBufferRef buffer, CVAttachmentMode mode), (buffer, mode)) >+#define CVBufferCopyAttachments softLink_CoreVideo_CVBufferCopyAttachments >+#endif > SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVBufferGetAttachment, CFTypeRef, (CVBufferRef buffer, CFStringRef key, CVAttachmentMode* attachmentMode), (buffer, key, attachmentMode)) > #define CVBufferGetAttachment softLink_CoreVideo_CVBufferGetAttachment >+SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVBufferGetAttachments, CFDictionaryRef, (CVBufferRef buffer, CVAttachmentMode mode), (buffer, mode)) >+#define CVBufferGetAttachments softLink_CoreVideo_CVBufferGetAttachments > SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVPixelBufferGetTypeID, CFTypeID, (), ()) > #define CVPixelBufferGetTypeID softLink_CoreVideo_CVPixelBufferGetTypeID > SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVPixelBufferGetWidth, size_t, (CVPixelBufferRef pixelBuffer), (pixelBuffer)) >@@ -62,8 +68,8 @@ SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVPixelBufferGetIOSurface, IOS > #define CVPixelBufferGetIOSurface softLink_CoreVideo_CVPixelBufferGetIOSurface > SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVPixelBufferPoolGetPixelBufferAttributes, CFDictionaryRef, (CVPixelBufferPoolRef pool), (pool)) > #define CVPixelBufferPoolGetPixelBufferAttributes softLink_CoreVideo_CVPixelBufferPoolGetPixelBufferAttributes >-SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVImageBufferGetColorSpace, CGColorSpaceRef, (CVImageBufferRef pixelBuffer), (pixelBuffer)) >-#define CVImageBufferGetColorSpace softLink_CoreVideo_CVImageBufferGetColorSpace >+SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVImageBufferCreateColorSpaceFromAttachments, CGColorSpaceRef, (CFDictionaryRef attachments), (attachments)) >+#define CVImageBufferCreateColorSpaceFromAttachments softLink_CoreVideo_CVImageBufferCreateColorSpaceFromAttachments > > SOFT_LINK_CONSTANT_FOR_HEADER(WebCore, CoreVideo, kCVPixelBufferPixelFormatTypeKey, CFStringRef) > #define kCVPixelBufferPixelFormatTypeKey get_CoreVideo_kCVPixelBufferPixelFormatTypeKey() >@@ -111,6 +117,8 @@ SOFT_LINK_CONSTANT_FOR_HEADER(WebCore, CoreVideo, kCVImageBufferTransferFunction > #define kCVImageBufferTransferFunction_ITU_R_709_2 get_CoreVideo_kCVImageBufferTransferFunction_ITU_R_709_2() > SOFT_LINK_CONSTANT_FOR_HEADER(WebCore, CoreVideo, kCVImageBufferTransferFunction_SMPTE_240M_1995, CFStringRef) > #define kCVImageBufferTransferFunction_SMPTE_240M_1995 get_CoreVideo_kCVImageBufferTransferFunction_SMPTE_240M_1995() >+SOFT_LINK_CONSTANT_FOR_HEADER(WebCore, CoreVideo, kCVImageBufferCGColorSpaceKey, CFStringRef) >+#define kCVImageBufferCGColorSpaceKey get_CoreVideo_kCVImageBufferCGColorSpaceKey() > > #if USE(OPENGL_ES) > SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVOpenGLESTextureCacheCreate, CVReturn, (CFAllocatorRef allocator, CFDictionaryRef cacheAttributes, CVEAGLContext eaglContext, CFDictionaryRef textureAttributes, CVOpenGLESTextureCacheRef* cacheOut), (allocator, cacheAttributes, eaglContext, textureAttributes, cacheOut)) >diff --git a/Source/WebCore/platform/graphics/MediaPlayer.cpp b/Source/WebCore/platform/graphics/MediaPlayer.cpp >index 84a7a072731c12788acecebc12ea687cebdb0c2f..ce71d7722d0da52872fe6f76b787e7f5a395c1ae 100644 >--- a/Source/WebCore/platform/graphics/MediaPlayer.cpp >+++ b/Source/WebCore/platform/graphics/MediaPlayer.cpp >@@ -157,6 +157,7 @@ public: > void setSize(const IntSize&) final { } > > void paint(GraphicsContext&, const FloatRect&) final { } >+ DestinationColorSpace colorSpace() final { return DestinationColorSpace::SRGB(); } > > bool hasSingleSecurityOrigin() const final { return true; } > }; >@@ -1073,6 +1074,11 @@ RefPtr<NativeImage> MediaPlayer::nativeImageForCurrentTime() > return m_private->nativeImageForCurrentTime(); > } > >+DestinationColorSpace MediaPlayer::colorSpace() >+{ >+ return m_private->colorSpace(); >+} >+ > MediaPlayer::SupportsType MediaPlayer::supportsType(const MediaEngineSupportParameters& parameters) > { > // 4.8.10.3 MIME types - The canPlayType(type) method must return the empty string if type is a type that the >diff --git a/Source/WebCore/platform/graphics/MediaPlayer.h b/Source/WebCore/platform/graphics/MediaPlayer.h >index 9712648cbaabe7599e67df65af2c356bf241635f..04cfe1503523ef1588bb522506ec3aa6aec701c4 100644 >--- a/Source/WebCore/platform/graphics/MediaPlayer.h >+++ b/Source/WebCore/platform/graphics/MediaPlayer.h >@@ -469,6 +469,7 @@ public: > #endif > > RefPtr<NativeImage> nativeImageForCurrentTime(); >+ DestinationColorSpace colorSpace(); > > using MediaPlayerEnums::NetworkState; > NetworkState networkState(); >diff --git a/Source/WebCore/platform/graphics/MediaPlayerPrivate.h b/Source/WebCore/platform/graphics/MediaPlayerPrivate.h >index 6ab47b1538ffc2f2944c84a9f44c5c8cbb602cf7..f21e44fc4c48484e3856f62a38a85bc71b9155d0 100644 >--- a/Source/WebCore/platform/graphics/MediaPlayerPrivate.h >+++ b/Source/WebCore/platform/graphics/MediaPlayerPrivate.h >@@ -182,6 +182,7 @@ public: > virtual RetainPtr<CVPixelBufferRef> pixelBufferForCurrentTime() { return nullptr; } > #endif > virtual RefPtr<NativeImage> nativeImageForCurrentTime() { return nullptr; } >+ virtual DestinationColorSpace colorSpace() = 0; > > virtual void setPreload(MediaPlayer::Preload) { } > >diff --git a/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h b/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h >index c9b4f40ef85cbc85ec510683b815dbeb67df6f87..1598b43d5bdfb9028c5ae121fc0d38cca88dc3f9 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h >+++ b/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h >@@ -191,6 +191,7 @@ protected: > std::unique_ptr<PlatformTimeRanges> buffered() const override; > bool didLoadingProgress() const override; > void paint(GraphicsContext&, const FloatRect&) override = 0; >+ DestinationColorSpace colorSpace() override = 0; > void paintCurrentFrameInContext(GraphicsContext&, const FloatRect&) override = 0; > void setPreload(MediaPlayer::Preload) override; > PlatformLayer* platformLayer() const override { return 0; } >diff --git a/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp b/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp >index c934be48f6b70dbfc737497fd832342eaf54287e..c9104f0414f60a95ab3317cfdf96a6531ece7151 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp >+++ b/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp >@@ -907,6 +907,11 @@ void MediaPlayerPrivateAVFoundationCF::paint(GraphicsContext& context, const Flo > m_videoFrameHasDrawn = true; > } > >+DestinationColorSpace MediaPlayerPrivateAVFoundationCF::colorSpace() >+{ >+ return DestinationColorSpace::SRGB(); >+} >+ > #if HAVE(AVFOUNDATION_LOADER_DELEGATE) && ENABLE(LEGACY_ENCRYPTED_MEDIA) > > static bool keySystemIsSupported(const String& keySystem) >diff --git a/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h b/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h >index f5c0a12c8fbe2d7668cb1615c2111537681c7ed0..ccd6ae7bcf8fad9699523e0a7aaaa5d61307fd96 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h >+++ b/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.h >@@ -76,6 +76,7 @@ private: > virtual void setVolume(float); > void setClosedCaptionsVisible(bool) override; > virtual void paint(GraphicsContext&, const FloatRect&); >+ DestinationColorSpace colorSpace() override; > virtual void paintCurrentFrameInContext(GraphicsContext&, const FloatRect&); > virtual PlatformLayer* platformLayer() const; > virtual bool supportsAcceleratedRendering() const { return true; } >diff --git a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h >index 5a5a003e9b16f3a2020900959363657f7969b2bf..2dfb474ccf5d0db6b18cea672828e71f19953c7a 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h >+++ b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h >@@ -259,6 +259,7 @@ private: > bool videoOutputHasAvailableFrame(); > void paintWithVideoOutput(GraphicsContext&, const FloatRect&); > RefPtr<NativeImage> nativeImageForCurrentTime() final; >+ DestinationColorSpace colorSpace() final; > void waitForVideoOutputMediaDataWillChange(); > > RetainPtr<CVPixelBufferRef> pixelBufferForCurrentTime() final; >diff --git a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm >index f762e9cf7560a5345d014e7765e8a68ef8e59303..2a0799e3aaa88bfb8024be12823fb9bb96a8301f 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm >+++ b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm >@@ -36,6 +36,7 @@ > #import "AuthenticationChallenge.h" > #import "CDMInstanceFairPlayStreamingAVFObjC.h" > #import "CDMSessionAVFoundationObjC.h" >+#import "CVUtilities.h" > #import "ColorSpaceCG.h" > #import "Cookie.h" > #import "DeprecatedGlobalSettings.h" >@@ -2591,6 +2592,15 @@ RefPtr<NativeImage> MediaPlayerPrivateAVFoundationObjC::nativeImageForCurrentTim > return m_lastImage; > } > >+DestinationColorSpace MediaPlayerPrivateAVFoundationObjC::colorSpace() >+{ >+ updateLastImage(UpdateType::UpdateSynchronously); >+ if (!m_lastPixelBuffer) >+ return DestinationColorSpace::SRGB(); >+ >+ return DestinationColorSpace(createCGColorSpaceForCVPixelBuffer(m_lastPixelBuffer.get())); >+} >+ > void MediaPlayerPrivateAVFoundationObjC::waitForVideoOutputMediaDataWillChange() > { > if (m_waitForVideoOutputMediaDataWillChangeTimedOut) >diff --git a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h >index 8d025d264c84d7977ff3c40a5901f96b4c7d74ae..53f02c18302ffd3acdfdc43c95f0b23b14b5d77e 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h >+++ b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.h >@@ -222,6 +222,7 @@ private: > void paint(GraphicsContext&, const FloatRect&) override; > void paintCurrentFrameInContext(GraphicsContext&, const FloatRect&) override; > RetainPtr<CVPixelBufferRef> pixelBufferForCurrentTime() final; >+ DestinationColorSpace colorSpace() final; > > bool supportsAcceleratedRendering() const override; > // called when the rendering system flips the into or out of accelerated rendering mode. >diff --git a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm >index 36f013bae7f82f80f1fb63daa0d5d5d27badc9f7..ee014356f05f94d4122dea15b262c2578bafb4e6 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm >+++ b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaSourceAVFObjC.mm >@@ -731,6 +731,12 @@ RetainPtr<CVPixelBufferRef> MediaPlayerPrivateMediaSourceAVFObjC::pixelBufferFor > return m_lastPixelBuffer; > } > >+DestinationColorSpace MediaPlayerPrivateMediaSourceAVFObjC::colorSpace() >+{ >+ updateLastImage(); >+ return m_lastImage ? m_lastImage->colorSpace() : DestinationColorSpace::SRGB(); >+} >+ > bool MediaPlayerPrivateMediaSourceAVFObjC::hasAvailableVideoFrame() const > { > return m_hasAvailableVideoFrame; >diff --git a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h >index 63fd9ea93d47e24720671a4b6c5f5dddf9dca835..6ad9258c0fc1496706bd211165e111aa860480c7 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h >+++ b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h >@@ -142,6 +142,7 @@ private: > > void paint(GraphicsContext&, const FloatRect&) override; > void paintCurrentFrameInContext(GraphicsContext&, const FloatRect&) override; >+ DestinationColorSpace colorSpace() override; > bool metaDataAvailable() const { return m_mediaStreamPrivate && m_readyState >= MediaPlayer::ReadyState::HaveMetadata; } > > void acceleratedRenderingStateChanged() final { updateLayersAsNeeded(); } >diff --git a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm >index dd3af64177a933892cb77fa0c43bd265156d4141..680f887d52eaa522ba8c0f0e55af1fc958964ec4 100644 >--- a/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm >+++ b/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm >@@ -1007,6 +1007,12 @@ void MediaPlayerPrivateMediaStreamAVFObjC::paintCurrentFrameInContext(GraphicsCo > context.drawNativeImage(*image, imageRect.size(), transformedDestRect, imageRect); > } > >+DestinationColorSpace MediaPlayerPrivateMediaStreamAVFObjC::colorSpace() >+{ >+ updateCurrentFrameImage(); >+ return m_imagePainter.cgImage ? m_imagePainter.cgImage->colorSpace() : DestinationColorSpace::SRGB(); >+} >+ > void MediaPlayerPrivateMediaStreamAVFObjC::updateLayersAsNeeded() > { > if (m_player->renderingCanBeAccelerated()) >diff --git a/Source/WebCore/platform/graphics/cg/ColorSpaceCG.h b/Source/WebCore/platform/graphics/cg/ColorSpaceCG.h >index 032930f52b81567f5d9eaa96dd51377ccd578e5c..f77edfb31ed2f247e5841604c69587e6a39b4bfc 100644 >--- a/Source/WebCore/platform/graphics/cg/ColorSpaceCG.h >+++ b/Source/WebCore/platform/graphics/cg/ColorSpaceCG.h >@@ -26,9 +26,11 @@ > #pragma once > > #include "ColorSpace.h" >+#include <CoreGraphics/CoreGraphics.h> > #include <optional> >+#include <wtf/cf/TypeCastsCF.h> > >-typedef struct CGColorSpace *CGColorSpaceRef; >+WTF_DECLARE_CF_TYPE_TRAIT(CGColorSpace); > > namespace WebCore { > >diff --git a/Source/WebCore/platform/graphics/cv/CVUtilities.h b/Source/WebCore/platform/graphics/cv/CVUtilities.h >index c594ce90b87d8a3eafe7c4585dc498a41796e762..2e5f19658a35bf58f2cd4e0fa74b9d5a2baf2dcf 100644 >--- a/Source/WebCore/platform/graphics/cv/CVUtilities.h >+++ b/Source/WebCore/platform/graphics/cv/CVUtilities.h >@@ -30,6 +30,7 @@ > #include <wtf/Expected.h> > #include <wtf/RetainPtr.h> > >+using CGColorSpaceRef = struct CGColorSpace*; > using CVPixelBufferPoolRef = struct __CVPixelBufferPool*; > using CVPixelBufferRef = struct __CVBuffer*; > >@@ -43,4 +44,5 @@ WEBCORE_EXPORT Expected<RetainPtr<CVPixelBufferRef>, CVReturn> createCVPixelBuff > > WEBCORE_EXPORT Expected<RetainPtr<CVPixelBufferRef>, CVReturn> createCVPixelBuffer(IOSurfaceRef); > >+RetainPtr<CGColorSpaceRef> createCGColorSpaceForCVPixelBuffer(CVPixelBufferRef); > } >diff --git a/Source/WebCore/platform/graphics/cv/CVUtilities.mm b/Source/WebCore/platform/graphics/cv/CVUtilities.mm >index ddcf98c69bea647c2b26f590e15e3d017b83e6df..40727043fd12d62a4cbd7dbb59e41160a28ddf22 100644 >--- a/Source/WebCore/platform/graphics/cv/CVUtilities.mm >+++ b/Source/WebCore/platform/graphics/cv/CVUtilities.mm >@@ -107,4 +107,27 @@ Expected<RetainPtr<CVPixelBufferRef>, CVReturn> createCVPixelBuffer(IOSurfaceRef > return adoptCF(pixelBuffer); > } > >+RetainPtr<CGColorSpaceRef> createCGColorSpaceForCVPixelBuffer(CVPixelBufferRef buffer) >+{ >+ if (CGColorSpaceRef colorSpace = dynamic_cf_cast<CGColorSpaceRef>(CVBufferGetAttachment(buffer, kCVImageBufferCGColorSpaceKey, nullptr))) >+ return colorSpace; >+ >+ RetainPtr<CFDictionaryRef> attachments; >+#if HAVE(CVBUFFERCOPYATTACHMENTS) >+ attachments = adoptCF(CVBufferCopyAttachments(buffer, kCVAttachmentMode_ShouldPropagate)); >+#else >+ attachments = CVBufferGetAttachments(buffer, kCVAttachmentMode_ShouldPropagate); >+#endif >+ if (auto colorSpace = adoptCF(CVImageBufferCreateColorSpaceFromAttachments(attachments.get()))) >+ return colorSpace; >+ >+ // We should only get here with content that has a broken embedded ICC >+ // profile; in all other cases VideoToolbox should have put either known >+ // accurate or guessed color space attachments on the pixel buffer. Content >+ // that requires an embedded ICC profile is unlikely to be presented >+ // correctly with any particular fallback color space we choose, so we >+ // choose sRGB for ease. >+ return sRGBColorSpaceRef(); >+} >+ > } >diff --git a/Source/WebCore/platform/graphics/cv/PixelBufferConformerCV.cpp b/Source/WebCore/platform/graphics/cv/PixelBufferConformerCV.cpp >index bb790ddd18b9847aa068814d02a733c472c51c26..5faa31fb9822944005fbf8da31a97d06f4e83e04 100644 >--- a/Source/WebCore/platform/graphics/cv/PixelBufferConformerCV.cpp >+++ b/Source/WebCore/platform/graphics/cv/PixelBufferConformerCV.cpp >@@ -26,6 +26,7 @@ > #include "config.h" > #include "PixelBufferConformerCV.h" > >+#include "CVUtilities.h" > #include "GraphicsContextCG.h" > #include "ImageBufferUtilitiesCG.h" > #include "Logging.h" >@@ -165,6 +166,8 @@ RetainPtr<CGImageRef> PixelBufferConformerCV::createImageFromPixelBuffer(CVPixel > if (!byteLength) > return nullptr; > >+ auto colorSpace = createCGColorSpaceForCVPixelBuffer(rawBuffer); >+ > CVPixelBufferInfo* info = new CVPixelBufferInfo(); > info->pixelBuffer = WTFMove(buffer); > info->lockCount = 0; >@@ -172,7 +175,7 @@ RetainPtr<CGImageRef> PixelBufferConformerCV::createImageFromPixelBuffer(CVPixel > CGDataProviderDirectCallbacks providerCallbacks = { 0, CVPixelBufferGetBytePointerCallback, CVPixelBufferReleaseBytePointerCallback, 0, CVPixelBufferReleaseInfoCallback }; > RetainPtr<CGDataProviderRef> provider = adoptCF(CGDataProviderCreateDirect(info, byteLength, &providerCallbacks)); > >- return adoptCF(CGImageCreate(width, height, 8, 32, bytesPerRow, sRGBColorSpaceRef(), bitmapInfo, provider.get(), nullptr, false, kCGRenderingIntentDefault)); >+ return adoptCF(CGImageCreate(width, height, 8, 32, bytesPerRow, colorSpace.get(), bitmapInfo, provider.get(), nullptr, false, kCGRenderingIntentDefault)); > } > > } >diff --git a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp >index 2135207c05efe5af56aa628d6243569eccaea3a2..e30efae19dd65de12f630fabd9884dd23d6ec8c2 100644 >--- a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp >+++ b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp >@@ -3268,6 +3268,11 @@ void MediaPlayerPrivateGStreamer::paint(GraphicsContext& context, const FloatRec > context.drawImage(gstImage->image(), rect, imageRect, { gstImage->hasAlpha() ? CompositeOperator::SourceOver : CompositeOperator::Copy, m_videoSourceOrientation }); > } > >+DestinationColorSpace MediaPlayerPrivateGStreamer::colorSpace() >+{ >+ return DestinationColorSpace::SRGB(); >+} >+ > #if USE(GSTREAMER_GL) > bool MediaPlayerPrivateGStreamer::copyVideoTextureToPlatformTexture(GraphicsContextGL* context, PlatformGLObject outputTexture, GCGLenum outputTarget, GCGLint level, GCGLenum internalFormat, GCGLenum format, GCGLenum type, bool premultiplyAlpha, bool flipY) > { >diff --git a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h >index 5285c04b0fa07abd9d939af1c5c73d3724f50d9b..6ff2c9ebd28810a4455a9a8545ad6768fcfdeea5 100644 >--- a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h >+++ b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h >@@ -181,6 +181,7 @@ public: > AudioSourceProvider* audioSourceProvider() final; > #endif > void paint(GraphicsContext&, const FloatRect&) final; >+ DestinationColorSpace colorSpace() final; > bool supportsFullscreen() const final; > MediaPlayer::MovieLoadType movieLoadType() const final; > >diff --git a/Source/WebCore/platform/graphics/holepunch/MediaPlayerPrivateHolePunch.h b/Source/WebCore/platform/graphics/holepunch/MediaPlayerPrivateHolePunch.h >index c1553005c06eab7f7e4002d04814468136537aa3..4d165eeb6ec323cf4f2ee02f38ac1ae53daa9d36 100644 >--- a/Source/WebCore/platform/graphics/holepunch/MediaPlayerPrivateHolePunch.h >+++ b/Source/WebCore/platform/graphics/holepunch/MediaPlayerPrivateHolePunch.h >@@ -87,6 +87,8 @@ public: > > void paint(GraphicsContext&, const FloatRect&) final { }; > >+ DestinationColorSpace colorSpace() final { return DestinationColorSpace::SRGB(); } >+ > bool supportsAcceleratedRendering() const final { return true; } > > bool shouldIgnoreIntrinsicSize() final { return true; } >diff --git a/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp b/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp >index 3ba93a03abba620c3fbbe577da593d688fe5e444..e6deb5ec1038c599d6c64af2f98ded7add456757 100644 >--- a/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp >+++ b/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.cpp >@@ -358,6 +358,11 @@ void MediaPlayerPrivateMediaFoundation::paint(GraphicsContext& context, const Fl > m_presenter->paintCurrentFrame(context, rect); > } > >+DestinationColorSpace MediaPlayerPrivateMediaFoundation::colorSpace() >+{ >+ return DestinationColorSpace::SRGB(); >+} >+ > bool MediaPlayerPrivateMediaFoundation::createSession() > { > if (FAILED(MFStartup(MF_VERSION, MFSTARTUP_FULL))) >diff --git a/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.h b/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.h >index 8d6c167b402afc9e8cb5f00a31b7022e3439a8ec..0de19dba25c13ad4ca98e711b563889ffa53743a 100644 >--- a/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.h >+++ b/Source/WebCore/platform/graphics/win/MediaPlayerPrivateMediaFoundation.h >@@ -100,6 +100,8 @@ public: > > void paint(GraphicsContext&, const FloatRect&) final; > >+ DestinationColorSpace colorSpace() final; >+ > private: > float maxTimeLoaded() const { return m_maxTimeLoaded; } > >diff --git a/Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.cpp b/Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.cpp >index e99a3c8613adc6b7b19012b801f11fc9e307f33f..9dd2b0b5b95a505a392aba94882f0531f365e90b 100644 >--- a/Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.cpp >+++ b/Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.cpp >@@ -298,6 +298,11 @@ std::optional<VideoPlaybackQualityMetrics> MockMediaPlayerMediaSource::videoPlay > return m_mediaSourcePrivate ? m_mediaSourcePrivate->videoPlaybackQualityMetrics() : std::nullopt; > } > >+DestinationColorSpace MockMediaPlayerMediaSource::colorSpace() >+{ >+ return DestinationColorSpace::SRGB(); >+} >+ > } > > #endif >diff --git a/Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.h b/Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.h >index 7c60844419eb75fb20375acdb2f92b7d62f74c1b..d329bad684ce35a76eb136f8e32e02130a6133bf 100644 >--- a/Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.h >+++ b/Source/WebCore/platform/mock/mediasource/MockMediaPlayerMediaSource.h >@@ -89,6 +89,7 @@ private: > MediaTime durationMediaTime() const override; > void seekWithTolerance(const MediaTime&, const MediaTime&, const MediaTime&) override; > std::optional<VideoPlaybackQualityMetrics> videoPlaybackQualityMetrics() override; >+ DestinationColorSpace colorSpace() override; > > MediaPlayer* m_player; > RefPtr<MockMediaSourcePrivate> m_mediaSourcePrivate; >diff --git a/Source/WebCore/svg/graphics/SVGImage.cpp b/Source/WebCore/svg/graphics/SVGImage.cpp >index 27e8c6cf7fb3af512b71f3dd238ecc72cf7fc62c..30b90f8dd2e0a3afdfb9938396bf24f0e01fd9f4 100644 >--- a/Source/WebCore/svg/graphics/SVGImage.cpp >+++ b/Source/WebCore/svg/graphics/SVGImage.cpp >@@ -320,6 +320,7 @@ ImageDrawResult SVGImage::drawInternal(GraphicsContext& context, const FloatRect > context.setCompositeOperation(CompositeOperator::SourceOver, BlendMode::Normal); > } > >+ // FIXME: We should honor options.orientation(), since ImageBitmap's flipY handling relies on it. https://bugs.webkit.org/show_bug.cgi?id=231001 > FloatSize scale(dstRect.size() / srcRect.size()); > > // We can only draw the entire frame, clipped to the rect we want. So compute where the top left >diff --git a/Source/WebKit/GPUProcess/media/RemoteImageDecoderAVFProxy.cpp b/Source/WebKit/GPUProcess/media/RemoteImageDecoderAVFProxy.cpp >index fa838749432365a4089aea5aecbcea660db64ba0..732a19492ad74fd578edb6391d598f9e0001d889 100644 >--- a/Source/WebKit/GPUProcess/media/RemoteImageDecoderAVFProxy.cpp >+++ b/Source/WebKit/GPUProcess/media/RemoteImageDecoderAVFProxy.cpp >@@ -113,28 +113,27 @@ void RemoteImageDecoderAVFProxy::setData(ImageDecoderIdentifier identifier, cons > completionHandler(frameCount, imageDecoder->size(), imageDecoder->hasTrack(), WTFMove(frameInfos)); > } > >-void RemoteImageDecoderAVFProxy::createFrameImageAtIndex(ImageDecoderIdentifier identifier, size_t index, CompletionHandler<void(std::optional<WTF::MachSendRight>&&, std::optional<WebCore::DestinationColorSpace>&&)>&& completionHandler) >+void RemoteImageDecoderAVFProxy::createFrameImageAtIndex(ImageDecoderIdentifier identifier, size_t index, CompletionHandler<void(std::optional<WTF::MachSendRight>&&, WebCore::DestinationColorSpace)>&& completionHandler) > { > ASSERT(m_imageDecoders.contains(identifier)); >- std::optional<WTF::MachSendRight> sendRight; >- std::optional<WebCore::DestinationColorSpace> colorSpace; > if (!m_imageDecoders.contains(identifier)) { >- completionHandler(WTFMove(sendRight), WTFMove(colorSpace)); >+ completionHandler(std::nullopt, DestinationColorSpace::SRGB()); > return; > } > > auto frameImage = m_imageDecoders.get(identifier)->createFrameImageAtIndex(index); > if (!frameImage) { >- completionHandler(WTFMove(sendRight), WTFMove(colorSpace)); >+ completionHandler(std::nullopt, DestinationColorSpace::SRGB()); > return; > } > >- if (auto surface = IOSurface::createFromImage(frameImage.get())) { >- sendRight = surface->createSendRight(); >- colorSpace = surface->colorSpace(); >+ auto surface = IOSurface::createFromImage(frameImage.get()); >+ if (!surface) { >+ completionHandler(std::nullopt, DestinationColorSpace::SRGB()); >+ return; > } > >- completionHandler(WTFMove(sendRight), WTFMove(colorSpace)); >+ completionHandler(surface->createSendRight(), surface->colorSpace()); > } > > void RemoteImageDecoderAVFProxy::clearFrameBufferCache(ImageDecoderIdentifier identifier, size_t index) >diff --git a/Source/WebKit/GPUProcess/media/RemoteImageDecoderAVFProxy.h b/Source/WebKit/GPUProcess/media/RemoteImageDecoderAVFProxy.h >index e2c111c40a4d342911df4a19af1ab0f57181aab9..8f7d3633dd02d90a1a5604a00634e31fa51b57fa 100644 >--- a/Source/WebKit/GPUProcess/media/RemoteImageDecoderAVFProxy.h >+++ b/Source/WebKit/GPUProcess/media/RemoteImageDecoderAVFProxy.h >@@ -56,7 +56,7 @@ private: > void deleteDecoder(WebCore::ImageDecoderIdentifier); > void setExpectedContentSize(WebCore::ImageDecoderIdentifier, long long expectedContentSize); > void setData(WebCore::ImageDecoderIdentifier, const IPC::DataReference&, bool allDataReceived, CompletionHandler<void(size_t frameCount, const WebCore::IntSize& size, bool hasTrack, std::optional<Vector<WebCore::ImageDecoder::FrameInfo>>&&)>&&); >- void createFrameImageAtIndex(WebCore::ImageDecoderIdentifier, size_t index, CompletionHandler<void(std::optional<WTF::MachSendRight>&&, std::optional<WebCore::DestinationColorSpace>&&)>&&); >+ void createFrameImageAtIndex(WebCore::ImageDecoderIdentifier, size_t index, CompletionHandler<void(std::optional<WTF::MachSendRight>&&, WebCore::DestinationColorSpace)>&&); > void clearFrameBufferCache(WebCore::ImageDecoderIdentifier, size_t index); > > void encodedDataStatusChanged(WebCore::ImageDecoderIdentifier); >diff --git a/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h b/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h >index c8b79405eb41eae5ce76af3e58325c715a4ad287..460d2e38e28e28bdc955582f6dceb255b5d72f74 100644 >--- a/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h >+++ b/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.h >@@ -311,7 +311,8 @@ private: > void currentTimeChanged(const MediaTime&); > > #if PLATFORM(COCOA) >- void nativeImageForCurrentTime(CompletionHandler<void(std::optional<WTF::MachSendRight>&&)>&&); >+ void nativeImageForCurrentTime(CompletionHandler<void(std::optional<WTF::MachSendRight>&&, WebCore::DestinationColorSpace)>&&); >+ void colorSpace(CompletionHandler<void(WebCore::DestinationColorSpace)>&&); > #endif > #if USE(AVFOUNDATION) > void pixelBufferForCurrentTimeIfChanged(CompletionHandler<void(std::optional<RetainPtr<CVPixelBufferRef>>&&)>&&); >diff --git a/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.messages.in b/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.messages.in >index 68bf8d32b71c85610c2caf51b31e8f1ce0218450..145a99e826cd2afccee002ad591f5bff108c6d38 100644 >--- a/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.messages.in >+++ b/Source/WebKit/GPUProcess/media/RemoteMediaPlayerProxy.messages.in >@@ -123,7 +123,8 @@ messages -> RemoteMediaPlayerProxy NotRefCounted { > #endif > > #if PLATFORM(COCOA) >- NativeImageForCurrentTime() -> (std::optional<MachSendRight> sendRight) Synchronous >+ NativeImageForCurrentTime() -> (std::optional<MachSendRight> sendRight, WebCore::DestinationColorSpace colorSpace) Synchronous >+ ColorSpace() -> (WebCore::DestinationColorSpace colorSpace) Synchronous > #endif > #if USE(AVFOUNDATION) > PixelBufferForCurrentTimeIfChanged() -> (std::optional<RetainPtr<CVPixelBufferRef>> pixelBuffer) Synchronous >diff --git a/Source/WebKit/GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm b/Source/WebKit/GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm >index 179c2d692e3c1393642092f5ce022bf3d1e2a524..08b2fdef5a4fcb18addbd16c1fd6086c1be9c27c 100644 >--- a/Source/WebKit/GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm >+++ b/Source/WebKit/GPUProcess/media/cocoa/RemoteMediaPlayerProxyCocoa.mm >@@ -83,32 +83,42 @@ void RemoteMediaPlayerProxy::setVideoInlineSizeFenced(const WebCore::FloatSize& > setVideoInlineSizeIfPossible(*m_inlineLayerHostingContext, size); > } > >-void RemoteMediaPlayerProxy::nativeImageForCurrentTime(CompletionHandler<void(std::optional<WTF::MachSendRight>&&)>&& completionHandler) >+void RemoteMediaPlayerProxy::nativeImageForCurrentTime(CompletionHandler<void(std::optional<WTF::MachSendRight>&&, WebCore::DestinationColorSpace)>&& completionHandler) > { > if (!m_player) { >- completionHandler(std::nullopt); >+ completionHandler(std::nullopt, DestinationColorSpace::SRGB()); > return; > } > > auto nativeImage = m_player->nativeImageForCurrentTime(); > if (!nativeImage) { >- completionHandler(std::nullopt); >+ completionHandler(std::nullopt, DestinationColorSpace::SRGB()); > return; > } > > auto platformImage = nativeImage->platformImage(); > if (!platformImage) { >- completionHandler(std::nullopt); >+ completionHandler(std::nullopt, DestinationColorSpace::SRGB()); > return; > } > > auto surface = WebCore::IOSurface::createFromImage(platformImage.get()); > if (!surface) { >- completionHandler(std::nullopt); >+ completionHandler(std::nullopt, DestinationColorSpace::SRGB()); > return; > } > >- completionHandler(surface->createSendRight()); >+ completionHandler(surface->createSendRight(), nativeImage->colorSpace()); >+} >+ >+void RemoteMediaPlayerProxy::colorSpace(CompletionHandler<void(WebCore::DestinationColorSpace)>&& completionHandler) >+{ >+ if (!m_player) { >+ completionHandler(DestinationColorSpace::SRGB()); >+ return; >+ } >+ >+ completionHandler(m_player->colorSpace()); > } > > #if USE(AVFOUNDATION) >diff --git a/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp b/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp >index fdf96c56c491bb064ab72ec07fe8e6ff5195ec5b..57d2300aa92a02831525f986deb759c11ac9c591 100644 >--- a/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp >+++ b/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp >@@ -992,6 +992,12 @@ RefPtr<NativeImage> MediaPlayerPrivateRemote::nativeImageForCurrentTime() > notImplemented(); > return nullptr; > } >+ >+DestinationColorSpace MediaPlayerPrivateRemote::colorSpace() >+{ >+ notImplemented(); >+ return DestinationColorSpace::SRGB(); >+} > #endif > > bool MediaPlayerPrivateRemote::hasAvailableVideoFrame() const >diff --git a/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h b/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h >index 48dcf63bdedbf9b8c9ed8d86ff51f20f41f82a35..ff35ce07ae62d51f98d29d51b56f1f03cafd8c26 100644 >--- a/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h >+++ b/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h >@@ -290,6 +290,7 @@ private: > RetainPtr<CVPixelBufferRef> pixelBufferForCurrentTime() final; > #endif > RefPtr<WebCore::NativeImage> nativeImageForCurrentTime() final; >+ WebCore::DestinationColorSpace colorSpace() final; > > WebCore::MediaPlayerIdentifier identifier() const final; > >diff --git a/Source/WebKit/WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm b/Source/WebKit/WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm >index c27a468cf5ed3e7e4c07e2d136be72bbd5894fa8..a2f8352fb20fbb2a0d62faec59b2f4a82654bbff 100644 >--- a/Source/WebKit/WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm >+++ b/Source/WebKit/WebProcess/GPU/media/cocoa/MediaPlayerPrivateRemoteCocoa.mm >@@ -49,13 +49,14 @@ PlatformLayerContainer MediaPlayerPrivateRemote::createVideoFullscreenLayer() > RefPtr<NativeImage> MediaPlayerPrivateRemote::nativeImageForCurrentTime() > { > std::optional<MachSendRight> sendRight; >- if (!connection().sendSync(Messages::RemoteMediaPlayerProxy::NativeImageForCurrentTime(), Messages::RemoteMediaPlayerProxy::NativeImageForCurrentTime::Reply(sendRight), m_id)) >+ auto colorSpace = DestinationColorSpace::SRGB(); >+ if (!connection().sendSync(Messages::RemoteMediaPlayerProxy::NativeImageForCurrentTime(), Messages::RemoteMediaPlayerProxy::NativeImageForCurrentTime::Reply(sendRight, colorSpace), m_id)) > return nullptr; > > if (!sendRight) > return nullptr; > >- auto surface = WebCore::IOSurface::createFromSendRight(WTFMove(*sendRight), WebCore::DestinationColorSpace::SRGB()); >+ auto surface = WebCore::IOSurface::createFromSendRight(WTFMove(*sendRight), colorSpace); > if (!surface) > return nullptr; > >@@ -66,6 +67,13 @@ RefPtr<NativeImage> MediaPlayerPrivateRemote::nativeImageForCurrentTime() > return NativeImage::create(WTFMove(platformImage)); > } > >+WebCore::DestinationColorSpace MediaPlayerPrivateRemote::colorSpace() >+{ >+ auto colorSpace = DestinationColorSpace::SRGB(); >+ connection().sendSync(Messages::RemoteMediaPlayerProxy::ColorSpace(), Messages::RemoteMediaPlayerProxy::ColorSpace::Reply(colorSpace), m_id); >+ return colorSpace; >+} >+ > #if USE(AVFOUNDATION) > RetainPtr<CVPixelBufferRef> MediaPlayerPrivateRemote::pixelBufferForCurrentTime() > { >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 6d46aeb05076e2e6f3ca980cbb8dc17457bfbd9a..61828c95f22d99fbe9ad414bd51ce19a14272096 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,42 @@ >+2021-09-28 Cameron McCormack <heycam@apple.com> >+ >+ Ensure CanvasRenderingContext2D.drawImage(video) uses the right color space >+ https://bugs.webkit.org/show_bug.cgi?id=229025 >+ <rdar://problem/81828490> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * TestExpectations: >+ texture-corner-case-videos.html relies on incorrect color space handling >+ with drawImage() on a 2D canvas and so now fails. >+ >+ * platform/glib/TestExpectations: >+ * platform/ios-14/TestExpectations: >+ * platform/ios-device/TestExpectations: >+ * platform/ios/TestExpectations: >+ * platform/mac-wk2/TestExpectations: >+ * platform/mac/TestExpectations: >+ New tests pass only on macOS Monterey+ and iOS 15+. >+ >+ * fast/canvas/canvas-createPattern-video-loading-expected.txt: >+ * fast/canvas/canvas-createPattern-video-loading.html: >+ * fast/canvas/canvas-createPattern-video-modify-expected.txt: >+ * fast/canvas/canvas-createPattern-video-modify.html: >+ * media/video-canvas-createPattern-expected.txt: >+ * media/video-canvas-createPattern.html: >+ * media/video-canvas-drawing-output-expected.txt: >+ * media/video-canvas-drawing-output.html: >+ * media/video-orientation-canvas-expected.txt: >+ * media/video-orientation-canvas.html: >+ Update some tests to check for correctly converted color values. >+ >+ * platform/mac/media/video-canvas-createPattern-expected.png: Removed. >+ * platform/wpe/media/video-canvas-createPattern-expected.png: Removed. >+ >+ * platform/mac-wk1/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-flipY-expected.txt: >+ An existing failure that changed a bit. This is >+ https://bugs.webkit.org/show_bug.cgi?id=231001. >+ > 2021-10-14 Aditya Keerthi <akeerthi@apple.com> > > [iOS] Paint <datalist> indicator in RenderTheme >diff --git a/LayoutTests/imported/w3c/ChangeLog b/LayoutTests/imported/w3c/ChangeLog >index d334c5aece3d59b0ae9b622f17b9d668de84afaa..db3dddd9cf81d8bb483b5727cdffb5c8ac81ab9b 100644 >--- a/LayoutTests/imported/w3c/ChangeLog >+++ b/LayoutTests/imported/w3c/ChangeLog >@@ -1,3 +1,33 @@ >+2021-10-01 Cameron McCormack <heycam@apple.com> >+ >+ Ensure CanvasRenderingContext2D.drawImage(video) uses the right color space >+ https://bugs.webkit.org/show_bug.cgi?id=229025 >+ <rdar://problem/81828490> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add some new WPTs for drawImage(video). >+ >+ * web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-drawImage.html: >+ * web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-flipY.html: >+ Updated tests to check that video color space conversion is done >+ correctly. >+ >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video-expected.txt: Added. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video.html: Added. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video-expected.txt: Added. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html: Added. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3.js: >+ (pixelsApproximatelyEqual): Tweaked threshold to pass video tests on iOS. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-222000000.mp4: Added. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-222000000.webm: Added. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-3FF000000.mp4: Added. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-3FF000000.webm: Added. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-BB0000.mp4: Added. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-BB0000.webm: Added. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-FF0100.mp4: Added. >+ * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-FF0100.webm: Added. >+ > 2021-10-14 Antti Koivisto <antti@apple.com> > > [CSS Cascade Layers] Layer should have higher priority than its descendant layers >diff --git a/LayoutTests/TestExpectations b/LayoutTests/TestExpectations >index 21b72d72035af8daa46be3b9dff6ce2bea69039c..cee2cfc19e51c28c12d367e3c05fefa3d78f506a 100644 >--- a/LayoutTests/TestExpectations >+++ b/LayoutTests/TestExpectations >@@ -3539,7 +3539,6 @@ webgl/1.0.x [ Skip ] > webgl/1.0.x/conformance/canvas/to-data-url-test.html [ Pass ] > webgl/1.0.x/conformance/misc/invalid-passed-params.html [ Pass ] > webgl/1.0.x/conformance/glsl/bugs/character-set.html [ Pass ] >-webgl/1.0.x/conformance/textures/misc/texture-corner-case-videos.html [ Pass ] > webgl/1.0.x/conformance/glsl/misc/fragcolor-fragdata-invariant.html [ Pass ] > webgl/1.0.x/conformance/context/constants-and-properties.html [ Pass ] > >@@ -3551,7 +3550,6 @@ webgl/2.0.y [ Skip ] > webgl/2.0.y/conformance/canvas/to-data-url-test.html [ Pass ] > webgl/2.0.y/conformance/misc/invalid-passed-params.html [ Pass ] > webgl/2.0.y/conformance/glsl/bugs/character-set.html [ Pass ] >-webgl/2.0.y/conformance/textures/misc/texture-corner-case-videos.html [ Pass ] > webgl/2.0.y/conformance/glsl/misc/fragcolor-fragdata-invariant.html [ Pass ] > webgl/2.0.y/conformance2/context/constants-and-properties-2.html [ Pass ] > webgl/2.0.y/conformance2/vertex_arrays/vertex-array-object.html [ Pass ] >@@ -3570,6 +3568,10 @@ webgl/2.0.0/conformance/context/constants-and-properties.html [ Skip ] > webgl/2.0.0/conformance/glsl/misc/shader-with-define-line-continuation.frag.html [ Skip ] > webgl/2.0.0/conformance/misc/invalid-passed-params.html [ Skip ] > >+# https://github.com/KhronosGroup/WebGL/issues/3341 >+webgl/1.0.x/conformance/textures/misc/texture-corner-case-videos.html [ Failure ] >+webgl/2.0.y/conformance/textures/misc/texture-corner-case-videos.html [ Failure ] >+ > # pre-wrap progression. Other rendering engines agree with the result. > webkit.org/b/206168 [ Debug ] fast/dom/insert-span-into-long-text-bug-28245.html [ Skip ] > >@@ -5077,6 +5079,8 @@ imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/can > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html [ Failure ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Failure ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html [ Failure ] >+imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video.html [ Failure ] >+imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html [ Failure ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Failure ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-image.html [ Failure ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-settings.html [ Failure ] >diff --git a/LayoutTests/fast/canvas/canvas-createPattern-video-loading-expected.txt b/LayoutTests/fast/canvas/canvas-createPattern-video-loading-expected.txt >index 68b3aea5e1a9e67700603be8b53872c76c1d14fa..179cdf38259d76fa124fd10ba4dd58be0b1b17ee 100644 >--- a/LayoutTests/fast/canvas/canvas-createPattern-video-loading-expected.txt >+++ b/LayoutTests/fast/canvas/canvas-createPattern-video-loading-expected.txt >@@ -4,78 +4,78 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE > > > PASS document.createElement('canvas').getContext('2d').createPattern(video, 'repeat') is null >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >-PASS buffer[0] is within 2 of 17 >-PASS buffer[1] is within 2 of 197 >-PASS buffer[2] is within 2 of 195 >-PASS buffer[0] is within 2 of 17 >-PASS buffer[1] is within 2 of 197 >-PASS buffer[2] is within 2 of 195 >-PASS buffer[0] is within 2 of 17 >-PASS buffer[1] is within 2 of 197 >-PASS buffer[2] is within 2 of 195 >-PASS buffer[0] is within 2 of 17 >-PASS buffer[1] is within 2 of 197 >-PASS buffer[2] is within 2 of 195 >-PASS buffer[0] is within 2 of 20 >+PASS buffer[0] is within 2 of 200 > PASS buffer[1] is within 2 of 200 >-PASS buffer[2] is within 2 of 18 >-PASS buffer[0] is within 2 of 20 >+PASS buffer[2] is within 2 of 0 >+PASS buffer[0] is within 2 of 200 > PASS buffer[1] is within 2 of 200 >-PASS buffer[2] is within 2 of 18 >-PASS buffer[0] is within 2 of 20 >+PASS buffer[2] is within 2 of 0 >+PASS buffer[0] is within 2 of 200 > PASS buffer[1] is within 2 of 200 >-PASS buffer[2] is within 2 of 18 >-PASS buffer[0] is within 2 of 20 >+PASS buffer[2] is within 2 of 0 >+PASS buffer[0] is within 2 of 200 > PASS buffer[1] is within 2 of 200 >-PASS buffer[2] is within 2 of 18 >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >-PASS buffer[0] is within 2 of 17 >-PASS buffer[1] is within 2 of 197 >-PASS buffer[2] is within 2 of 195 >-PASS buffer[0] is within 2 of 17 >-PASS buffer[1] is within 2 of 197 >-PASS buffer[2] is within 2 of 195 >-PASS buffer[0] is within 2 of 17 >-PASS buffer[1] is within 2 of 197 >-PASS buffer[2] is within 2 of 195 >-PASS buffer[0] is within 2 of 17 >-PASS buffer[1] is within 2 of 197 >-PASS buffer[2] is within 2 of 195 >-PASS buffer[0] is within 2 of 20 >+PASS buffer[2] is within 2 of 0 >+PASS buffer[0] is within 2 of 57 >+PASS buffer[1] is within 2 of 202 >+PASS buffer[2] is within 2 of 203 >+PASS buffer[0] is within 2 of 57 >+PASS buffer[1] is within 2 of 202 >+PASS buffer[2] is within 2 of 203 >+PASS buffer[0] is within 2 of 57 >+PASS buffer[1] is within 2 of 202 >+PASS buffer[2] is within 2 of 203 >+PASS buffer[0] is within 2 of 57 >+PASS buffer[1] is within 2 of 202 >+PASS buffer[2] is within 2 of 203 >+PASS buffer[0] is within 2 of 53 >+PASS buffer[1] is within 2 of 203 >+PASS buffer[2] is within 2 of 9 >+PASS buffer[0] is within 2 of 53 >+PASS buffer[1] is within 2 of 203 >+PASS buffer[2] is within 2 of 9 >+PASS buffer[0] is within 2 of 53 >+PASS buffer[1] is within 2 of 203 >+PASS buffer[2] is within 2 of 9 >+PASS buffer[0] is within 2 of 53 >+PASS buffer[1] is within 2 of 203 >+PASS buffer[2] is within 2 of 9 >+PASS buffer[0] is within 2 of 200 > PASS buffer[1] is within 2 of 200 >-PASS buffer[2] is within 2 of 18 >-PASS buffer[0] is within 2 of 20 >+PASS buffer[2] is within 2 of 0 >+PASS buffer[0] is within 2 of 200 > PASS buffer[1] is within 2 of 200 >-PASS buffer[2] is within 2 of 18 >-PASS buffer[0] is within 2 of 20 >+PASS buffer[2] is within 2 of 0 >+PASS buffer[0] is within 2 of 200 > PASS buffer[1] is within 2 of 200 >-PASS buffer[2] is within 2 of 18 >-PASS buffer[0] is within 2 of 20 >+PASS buffer[2] is within 2 of 0 >+PASS buffer[0] is within 2 of 200 > PASS buffer[1] is within 2 of 200 >-PASS buffer[2] is within 2 of 18 >+PASS buffer[2] is within 2 of 0 >+PASS buffer[0] is within 2 of 57 >+PASS buffer[1] is within 2 of 202 >+PASS buffer[2] is within 2 of 203 >+PASS buffer[0] is within 2 of 57 >+PASS buffer[1] is within 2 of 202 >+PASS buffer[2] is within 2 of 203 >+PASS buffer[0] is within 2 of 57 >+PASS buffer[1] is within 2 of 202 >+PASS buffer[2] is within 2 of 203 >+PASS buffer[0] is within 2 of 57 >+PASS buffer[1] is within 2 of 202 >+PASS buffer[2] is within 2 of 203 >+PASS buffer[0] is within 2 of 53 >+PASS buffer[1] is within 2 of 203 >+PASS buffer[2] is within 2 of 9 >+PASS buffer[0] is within 2 of 53 >+PASS buffer[1] is within 2 of 203 >+PASS buffer[2] is within 2 of 9 >+PASS buffer[0] is within 2 of 53 >+PASS buffer[1] is within 2 of 203 >+PASS buffer[2] is within 2 of 9 >+PASS buffer[0] is within 2 of 53 >+PASS buffer[1] is within 2 of 203 >+PASS buffer[2] is within 2 of 9 > PASS successfullyParsed is true > > TEST COMPLETE >diff --git a/LayoutTests/fast/canvas/canvas-createPattern-video-loading.html b/LayoutTests/fast/canvas/canvas-createPattern-video-loading.html >index 60bb590cc6b08c266ead86f90c585b64089f2b89..93ee48f6cfb4d07cdbd33d3351ec2e35e6d02c09 100644 >--- a/LayoutTests/fast/canvas/canvas-createPattern-video-loading.html >+++ b/LayoutTests/fast/canvas/canvas-createPattern-video-loading.html >@@ -12,20 +12,20 @@ > var buffer; > var expectedResults = [ > // Each entry is formatted as [x, y, r, g, b]. >- [40, 165, 194, 193, 14], // Represents yellow north west tile. >- [355, 165, 194, 193, 14], // Represents yellow north east tile. >- [40, 403, 194, 193, 14], // Represents yellow south west tile. >- [355, 403, 194, 193, 14], // Represents yellow south east tile. >- >- [56, 165, 17, 197, 195], // Represents blue/cyan north west tile. >- [371, 165, 17, 197, 195], // Represents blue/cyan north east tile. >- [56, 403, 17, 197, 195], // Represents blue/cyan south west tile. >- [371, 403, 17, 197, 195], // Represents blue/cyan south east tile. >- >- [73, 165, 20, 200, 18], // Represents green north west tile. >- [388, 165, 20, 200, 18], // Represents green north east tile. >- [73, 403, 20, 200, 18], // Represents green south west tile. >- [388, 403, 20, 200, 18], // Represents green south east tile. >+ [40, 165, 200, 200, 0], // Represents yellow north west tile. >+ [355, 165, 200, 200, 0], // Represents yellow north east tile. >+ [40, 403, 200, 200, 0], // Represents yellow south west tile. >+ [355, 403, 200, 200, 0], // Represents yellow south east tile. >+ >+ [56, 165, 57, 202, 203], // Represents blue/cyan north west tile. >+ [371, 165, 57, 202, 203], // Represents blue/cyan north east tile. >+ [56, 403, 57, 202, 203], // Represents blue/cyan south west tile. >+ [371, 403, 57, 202, 203], // Represents blue/cyan south east tile. >+ >+ [73, 165, 53, 203, 9], // Represents green north west tile. >+ [388, 165, 53, 203, 9], // Represents green north east tile. >+ [73, 403, 53, 203, 9], // Represents green south west tile. >+ [388, 403, 53, 203, 9], // Represents green south east tile. > ]; > > var canvases = document.createElement("div"); >diff --git a/LayoutTests/fast/canvas/canvas-createPattern-video-modify-expected.txt b/LayoutTests/fast/canvas/canvas-createPattern-video-modify-expected.txt >index a8f906e5a1c80c1d9c26f07379502b8fd1204e5f..11b62e29c2caace54212e05a69a626fb1a4ad977 100644 >--- a/LayoutTests/fast/canvas/canvas-createPattern-video-modify-expected.txt >+++ b/LayoutTests/fast/canvas/canvas-createPattern-video-modify-expected.txt >@@ -3,18 +3,18 @@ Tests that modifying the video used in createPattern does not affect the pattern > On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". > > >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >-PASS buffer[0] is within 2 of 194 >-PASS buffer[1] is within 2 of 193 >-PASS buffer[2] is within 2 of 14 >+PASS buffer[0] is within 2 of 200 >+PASS buffer[1] is within 2 of 200 >+PASS buffer[2] is within 2 of 0 >+PASS buffer[0] is within 2 of 200 >+PASS buffer[1] is within 2 of 200 >+PASS buffer[2] is within 2 of 0 >+PASS buffer[0] is within 2 of 200 >+PASS buffer[1] is within 2 of 200 >+PASS buffer[2] is within 2 of 0 >+PASS buffer[0] is within 2 of 200 >+PASS buffer[1] is within 2 of 200 >+PASS buffer[2] is within 2 of 0 > PASS successfullyParsed is true > > TEST COMPLETE >diff --git a/LayoutTests/fast/canvas/canvas-createPattern-video-modify.html b/LayoutTests/fast/canvas/canvas-createPattern-video-modify.html >index 7720551b7e131957ad882d0be2566e4bcbe0f0c5..ea6564f739cc21d63c61fe4f594aaf709f48e951 100644 >--- a/LayoutTests/fast/canvas/canvas-createPattern-video-modify.html >+++ b/LayoutTests/fast/canvas/canvas-createPattern-video-modify.html >@@ -14,10 +14,10 @@ > var modified = false; > var expectedResults = [ > // Each entry is formatted as [x, y, r, g, b]. >- [40, 165, 194, 193, 14], // Represents yellow north west tile. >- [355, 165, 194, 193, 14], // Represents yellow north east tile. >- [40, 403, 194, 193, 14], // Represents yellow south west tile. >- [355, 403, 194, 193, 14], // Represents yellow south east tile. >+ [40, 165, 200, 200, 0], // Represents yellow north west tile. >+ [355, 165, 200, 200, 0], // Represents yellow north east tile. >+ [40, 403, 200, 200, 0], // Represents yellow south west tile. >+ [355, 403, 200, 200, 0], // Represents yellow south east tile. > ]; > > var video = document.createElement("video"); >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-drawImage.html b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-drawImage.html >index 574ee16b59a3805e36ddde449c426108ca912f79..6f15a10eccec0bf0d36d68951d971493343c4474 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-drawImage.html >+++ b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-drawImage.html >@@ -9,19 +9,33 @@ > <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> > <body> > <script> >-function testCanvasDisplayingPattern(canvas, width, height) >+function testCanvasDisplayingPattern(canvas, width, height, sourceIsVideo) > { >- var tolerance = 10; // for creating ImageBitmap from a video, the tolerance needs to be high >- const check = (x, y, r, g, b, a) => >+ var tolerance = 1; >+ let topLeft = [255, 0, 0, 255]; >+ let topRight = [0, 255, 0, 255]; >+ let bottomLeft = [0, 0, 255, 255]; >+ let bottomRight = [0, 0, 0, 255]; >+ if (sourceIsVideo) { >+ // The source video uses colors in the Rec.601 color space whose >+ // values are close to full red, full green, full blue, and black, >+ // but when converted to sRGB, are somewhat different. >+ topLeft = [247, 37, 0, 255]; >+ topRight = [63, 251, 0, 255]; >+ bottomLeft = [28, 35, 255, 255]; >+ bottomRight = [5, 0, 2, 255]; >+ } >+ const check = (x, y, [r, g, b, a]) => > _assertPixelApprox(canvas, x,y, r,g,b,a, `${x},${y}`, `${r},${g},${b},${a}`, tolerance); >- check(1 * width / 4, 1 * height / 4, 255,0,0,255); >- check(3 * width / 4, 1 * height / 4, 0,255,0,255); >- check(1 * width / 4, 3 * height / 4, 0,0,255,255); >- check(3 * width / 4, 3 * height / 4, 0,0,0,255); >+ check(1 * width / 4, 1 * height / 4, topLeft); >+ check(3 * width / 4, 1 * height / 4, topRight); >+ check(1 * width / 4, 3 * height / 4, bottomLeft); >+ check(3 * width / 4, 3 * height / 4, bottomRight); > } > > function testDrawImageBitmap(source, args = [], { resizeWidth = 20, resizeHeight = 20 } = {}) > { >+ let sourceIsVideo = source instanceof HTMLVideoElement; > var canvas = document.createElement("canvas"); > canvas.width = resizeWidth; > canvas.height = resizeHeight; >@@ -30,7 +44,7 @@ function testDrawImageBitmap(source, args = [], { resizeWidth = 20, resizeHeight > assert_equals(imageBitmap.width, resizeWidth); > assert_equals(imageBitmap.height, resizeHeight); > ctx.drawImage(imageBitmap, 0, 0); >- testCanvasDisplayingPattern(canvas, resizeWidth, resizeHeight); >+ testCanvasDisplayingPattern(canvas, resizeWidth, resizeHeight, sourceIsVideo); > }); > } > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-flipY.html b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-flipY.html >index e8b5010f6c4c2fce27e6ba98c8a3b56b3e4c5ec2..f1fea5971fe5cda18f0a532aa96bb663e1f9bfd4 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-flipY.html >+++ b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-flipY.html >@@ -9,26 +9,37 @@ > <link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css"> > <body> > <script> >-function testCanvasDisplayingPattern(canvas, width, height, flipped) >+function testCanvasDisplayingPattern(canvas, width, height, sourceIsVideo, flipped) > { >- var tolerance = 10; // for creating ImageBitmap from a video, the tolerance needs to be high >- const check = (x, y, r, g, b, a) => >- _assertPixelApprox(canvas, x,y, r,g,b,a, `${x},${y}`, `${r},${g},${b},${a}`, tolerance); >+ var tolerance = 1; >+ let topLeft = [255, 0, 0, 255]; >+ let topRight = [0, 255, 0, 255]; >+ let bottomLeft = [0, 0, 255, 255]; >+ let bottomRight = [0, 0, 0, 255]; >+ if (sourceIsVideo) { >+ // The source video uses colors in the Rec.601 color space whose >+ // values are close to full red, full green, full blue, and black, >+ // but when converted to sRGB, are somewhat different. >+ topLeft = [247, 37, 0, 255]; >+ topRight = [63, 251, 0, 255]; >+ bottomLeft = [28, 35, 255, 255]; >+ bottomRight = [5, 0, 2, 255]; >+ } > if (flipped) { >- check(1 * width / 4, 3 * height / 4, 255,0,0,255); >- check(3 * width / 4, 3 * height / 4, 0,255,0,255); >- check(1 * width / 4, 1 * height / 4, 0,0,255,255); >- check(3 * width / 4, 1 * height / 4, 0,0,0,255); >- } else { >- check(1 * width / 4, 1 * height / 4, 255,0,0,255); >- check(3 * width / 4, 1 * height / 4, 0,255,0,255); >- check(1 * width / 4, 3 * height / 4, 0,0,255,255); >- check(3 * width / 4, 3 * height / 4, 0,0,0,255); >+ [topLeft, bottomLeft] = [bottomLeft, topLeft]; >+ [topRight, bottomRight] = [bottomRight, topRight]; > } >+ const check = (x, y, [r, g, b, a]) => >+ _assertPixelApprox(canvas, x,y, r,g,b,a, `${x},${y}`, `${r},${g},${b},${a}`, tolerance); >+ check(1 * width / 4, 1 * height / 4, topLeft); >+ check(3 * width / 4, 1 * height / 4, topRight); >+ check(1 * width / 4, 3 * height / 4, bottomLeft); >+ check(3 * width / 4, 3 * height / 4, bottomRight); > } > > function testDrawImageBitmap(source, args = [], flipped, { resizeWidth = 20, resizeHeight = 20 } = {}) > { >+ let sourceIsVideo = source instanceof HTMLVideoElement; > var canvas = document.createElement("canvas"); > canvas.width = resizeWidth; > canvas.height = resizeHeight; >@@ -37,7 +48,7 @@ function testDrawImageBitmap(source, args = [], flipped, { resizeWidth = 20, res > assert_equals(imageBitmap.width, resizeWidth); > assert_equals(imageBitmap.height, resizeHeight); > ctx.drawImage(imageBitmap, 0, 0); >- testCanvasDisplayingPattern(canvas, resizeWidth, resizeHeight, flipped); >+ testCanvasDisplayingPattern(canvas, resizeWidth, resizeHeight, sourceIsVideo, flipped); > }); > } > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..7f52787dce586f2b86fa9226953944869084472c >--- /dev/null >+++ b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video-expected.txt >@@ -0,0 +1,34 @@ >+ >+PASS sRGB-FF0100, Context srgb, ImageData srgb, cropSource=false >+PASS sRGB-FF0100, Context srgb, ImageData srgb, cropSource=true >+PASS sRGB-FF0100, Context srgb, ImageData display-p3, cropSource=false >+PASS sRGB-FF0100, Context srgb, ImageData display-p3, cropSource=true >+PASS sRGB-FF0100, Context display-p3, ImageData srgb, cropSource=false >+PASS sRGB-FF0100, Context display-p3, ImageData srgb, cropSource=true >+PASS sRGB-FF0100, Context display-p3, ImageData display-p3, cropSource=false >+PASS sRGB-FF0100, Context display-p3, ImageData display-p3, cropSource=true >+PASS sRGB-BB0000, Context srgb, ImageData srgb, cropSource=false >+PASS sRGB-BB0000, Context srgb, ImageData srgb, cropSource=true >+PASS sRGB-BB0000, Context srgb, ImageData display-p3, cropSource=false >+PASS sRGB-BB0000, Context srgb, ImageData display-p3, cropSource=true >+PASS sRGB-BB0000, Context display-p3, ImageData srgb, cropSource=false >+PASS sRGB-BB0000, Context display-p3, ImageData srgb, cropSource=true >+PASS sRGB-BB0000, Context display-p3, ImageData display-p3, cropSource=false >+PASS sRGB-BB0000, Context display-p3, ImageData display-p3, cropSource=true >+PASS Rec2020-3FF000000, Context srgb, ImageData srgb, cropSource=false >+PASS Rec2020-3FF000000, Context srgb, ImageData srgb, cropSource=true >+PASS Rec2020-3FF000000, Context srgb, ImageData display-p3, cropSource=false >+PASS Rec2020-3FF000000, Context srgb, ImageData display-p3, cropSource=true >+PASS Rec2020-3FF000000, Context display-p3, ImageData srgb, cropSource=false >+PASS Rec2020-3FF000000, Context display-p3, ImageData srgb, cropSource=true >+PASS Rec2020-3FF000000, Context display-p3, ImageData display-p3, cropSource=false >+PASS Rec2020-3FF000000, Context display-p3, ImageData display-p3, cropSource=true >+PASS Rec2020-222000000, Context srgb, ImageData srgb, cropSource=false >+PASS Rec2020-222000000, Context srgb, ImageData srgb, cropSource=true >+PASS Rec2020-222000000, Context srgb, ImageData display-p3, cropSource=false >+PASS Rec2020-222000000, Context srgb, ImageData display-p3, cropSource=true >+PASS Rec2020-222000000, Context display-p3, ImageData srgb, cropSource=false >+PASS Rec2020-222000000, Context display-p3, ImageData srgb, cropSource=true >+PASS Rec2020-222000000, Context display-p3, ImageData display-p3, cropSource=false >+PASS Rec2020-222000000, Context display-p3, ImageData display-p3, cropSource=true >+ >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video.html b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video.html >new file mode 100644 >index 0000000000000000000000000000000000000000..11a136fd5007ca29fb3d23f1252f4f465c6e3f35 >--- /dev/null >+++ b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video.html >@@ -0,0 +1,55 @@ >+<!DOCTYPE HTML> >+<script src="/resources/testharness.js"></script> >+<script src="/resources/testharnessreport.js"></script> >+<script src="canvas-display-p3.js"></script> >+<body> >+<script> >+// Test that drawing ImageBitmaps with different video source color profiles >+// into sRGB and Display P3 canvases works, by reading pixels with >+// getImageData() as sRGB and Display P3 values. >+for (let [filenameBase, expectedPixels] of Object.entries(videoTests)) { >+ for (let contextColorSpace of ["srgb", "display-p3"]) { >+ for (let imageDataColorSpace of ["srgb", "display-p3"]) { >+ for (let cropSource of [false, true]) { >+ async_test(function(t) { >+ let video = document.createElement("video"); >+ video.onloadeddata = t.step_func(function() { >+ >+ let canvas = document.createElement("canvas"); >+ canvas.width = 2; >+ canvas.height = 2; >+ >+ let ctx = canvas.getContext("2d", { colorSpace: contextColorSpace }); >+ >+ let imageBitmapPromise; >+ if (cropSource) >+ imageBitmapPromise = createImageBitmap(video, 1, 1, 1, 1); >+ else >+ imageBitmapPromise = createImageBitmap(video); >+ >+ imageBitmapPromise.then(t.step_func_done(function(imageBitmap) { >+ video.remove(); >+ ctx.drawImage(imageBitmap, 0, 0); >+ >+ let imageData = ctx.getImageData(0, 0, 1, 1, { colorSpace: imageDataColorSpace }); >+ >+ let expected = expectedPixels[`${contextColorSpace} ${imageDataColorSpace}`]; >+ assert_true(pixelsApproximatelyEqual(imageData.data, expected), `Actual pixel value ${[...imageData.data]} is approximately equal to ${expected}.`); >+ }), t.step_func(function(error) { >+ video.remove(); >+ throw error; >+ })); >+ }); >+ for (let format of ["mp4", "webm"]) { >+ let source = document.createElement("source"); >+ source.src = `resources/${filenameBase}.${format}`; >+ source.type = `video/${format}`; >+ video.append(source); >+ } >+ document.body.append(video); >+ }, `${filenameBase}, Context ${contextColorSpace}, ImageData ${imageDataColorSpace}, cropSource=${cropSource}`); >+ } >+ } >+ } >+} >+</script> >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..2d8b5df210cdab892d650289f74efe02e52c249a >--- /dev/null >+++ b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video-expected.txt >@@ -0,0 +1,34 @@ >+ >+PASS sRGB-FF0100, Context srgb, ImageData srgb, scaleImage=false >+PASS sRGB-FF0100, Context srgb, ImageData srgb, scaleImage=true >+PASS sRGB-FF0100, Context srgb, ImageData display-p3, scaleImage=false >+PASS sRGB-FF0100, Context srgb, ImageData display-p3, scaleImage=true >+PASS sRGB-FF0100, Context display-p3, ImageData srgb, scaleImage=false >+PASS sRGB-FF0100, Context display-p3, ImageData srgb, scaleImage=true >+PASS sRGB-FF0100, Context display-p3, ImageData display-p3, scaleImage=false >+PASS sRGB-FF0100, Context display-p3, ImageData display-p3, scaleImage=true >+PASS sRGB-BB0000, Context srgb, ImageData srgb, scaleImage=false >+PASS sRGB-BB0000, Context srgb, ImageData srgb, scaleImage=true >+PASS sRGB-BB0000, Context srgb, ImageData display-p3, scaleImage=false >+PASS sRGB-BB0000, Context srgb, ImageData display-p3, scaleImage=true >+PASS sRGB-BB0000, Context display-p3, ImageData srgb, scaleImage=false >+PASS sRGB-BB0000, Context display-p3, ImageData srgb, scaleImage=true >+PASS sRGB-BB0000, Context display-p3, ImageData display-p3, scaleImage=false >+PASS sRGB-BB0000, Context display-p3, ImageData display-p3, scaleImage=true >+PASS Rec2020-3FF000000, Context srgb, ImageData srgb, scaleImage=false >+PASS Rec2020-3FF000000, Context srgb, ImageData srgb, scaleImage=true >+PASS Rec2020-3FF000000, Context srgb, ImageData display-p3, scaleImage=false >+PASS Rec2020-3FF000000, Context srgb, ImageData display-p3, scaleImage=true >+PASS Rec2020-3FF000000, Context display-p3, ImageData srgb, scaleImage=false >+PASS Rec2020-3FF000000, Context display-p3, ImageData srgb, scaleImage=true >+PASS Rec2020-3FF000000, Context display-p3, ImageData display-p3, scaleImage=false >+PASS Rec2020-3FF000000, Context display-p3, ImageData display-p3, scaleImage=true >+PASS Rec2020-222000000, Context srgb, ImageData srgb, scaleImage=false >+PASS Rec2020-222000000, Context srgb, ImageData srgb, scaleImage=true >+PASS Rec2020-222000000, Context srgb, ImageData display-p3, scaleImage=false >+PASS Rec2020-222000000, Context srgb, ImageData display-p3, scaleImage=true >+PASS Rec2020-222000000, Context display-p3, ImageData srgb, scaleImage=false >+PASS Rec2020-222000000, Context display-p3, ImageData srgb, scaleImage=true >+PASS Rec2020-222000000, Context display-p3, ImageData display-p3, scaleImage=false >+PASS Rec2020-222000000, Context display-p3, ImageData display-p3, scaleImage=true >+ >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html >new file mode 100644 >index 0000000000000000000000000000000000000000..34c45d24672f7ac6a28c4940b92c33112df8b2ae >--- /dev/null >+++ b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html >@@ -0,0 +1,46 @@ >+<!DOCTYPE HTML> >+<script src="/resources/testharness.js"></script> >+<script src="/resources/testharnessreport.js"></script> >+<script src="canvas-display-p3.js"></script> >+<body> >+<script> >+// Test that drawing videos with different color spaces into sRGB and Display P3 >+// canvases works, by reading pixels with getImageData() as sRGB and Display P3 >+// values. >+for (let [filenameBase, expectedPixels] of Object.entries(videoTests)) { >+ for (let contextColorSpace of ["srgb", "display-p3"]) { >+ for (let imageDataColorSpace of ["srgb", "display-p3"]) { >+ for (let scaleImage of [false, true]) { >+ async_test(function(t) { >+ let video = document.createElement("video"); >+ video.onloadeddata = t.step_func_done(function() { >+ >+ let canvas = document.createElement("canvas"); >+ canvas.width = 2; >+ canvas.height = 2; >+ >+ let ctx = canvas.getContext("2d", { colorSpace: contextColorSpace }); >+ if (scaleImage) >+ ctx.drawImage(video, 0, 0, 10, 10); >+ else >+ ctx.drawImage(video, 0, 0); >+ video.remove(); >+ >+ let imageData = ctx.getImageData(0, 0, 1, 1, { colorSpace: imageDataColorSpace }); >+ >+ let expected = expectedPixels[`${contextColorSpace} ${imageDataColorSpace}`]; >+ assert_true(pixelsApproximatelyEqual(imageData.data, expected), `Actual pixel value ${[...imageData.data]} is approximately equal to ${expected}.`); >+ }); >+ for (let format of ["mp4", "webm"]) { >+ let source = document.createElement("source"); >+ source.src = `resources/${filenameBase}.${format}`; >+ source.type = `video/${format}`; >+ video.append(source); >+ } >+ document.body.append(video); >+ }, `${filenameBase}, Context ${contextColorSpace}, ImageData ${imageDataColorSpace}, scaleImage=${scaleImage}`); >+ } >+ } >+ } >+} >+</script> >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3.js b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3.js >index 921bbd71f5eeb20d635b5622634de05ef221e7d7..c6ee97b7880a4ac2333b82b60407102045d1f509 100644 >--- a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3.js >+++ b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3.js >@@ -207,6 +207,59 @@ const svgImageTests = { > }, > }; > >+// Each video: >+// * is 300x200 and has a single color >+// * has a filename base that indicates its contents: >+// >+// <color-space>-<8-or-10-bit-color-value> >+// >+// * was generated using commands like: >+// >+// W=300 H=200 Y=3F Cb=66 Cr=F0 ; \ >+// perl -e "print pack('c', 0x$Y) x ($W * $H), pack('c', 0x$Cb) x ($W * $H / 4), pack('c', 0x$Cr) x ($W * $H / 4)" | \ >+// ffmpeg -f rawvideo -pix_fmt yuv420p -s:v ${W}x$H -r 25 -i - -pix_fmt yuv420p -colorspace bt709 -color_primaries bt709 -color_trc iec61966_2_1 sRGB-FF0100.webm >+// >+// W=300 H=200 Y=0BB Cb=1BD Cr=2EF ; \ >+// perl -e "print pack('s', 0x$Y) x ($W * $H), pack('s', 0x$Cb) x ($W * $H / 4), pack('s', 0x$Cr) x ($W * $H / 4)" | \ >+// ffmpeg -f rawvideo -pix_fmt yuv420p10le -s:v ${W}x$H -r 25 -i - -c:v libx265 -vtag hvc1 -pix_fmt yuv420p10le -colorspace bt2020nc -color_primaries bt2020 -color_trc bt2020-10 Rec2020-222000000.mp4 >+// >+// W=300 H=200 Y=0BB Cb=1BD Cr=2EF ; \ >+// perl -e "print pack('s', 0x$Y) x ($W * $H), pack('s', 0x$Cb) x ($W * $H / 4), pack('s', 0x$Cr) x ($W * $H / 4)" | \ >+// ffmpeg -f rawvideo -pix_fmt yuv420p10le -s:v ${W}x$H -r 25 -i - -vcodec libvpx-vp9 -profile:v 2 -pix_fmt yuv420p10le -colorspace bt2020nc -color_primaries bt2020 -color_trc bt2020-10 Rec2020-222000000.webm >+// >+// where the Y'CbCr values were computed using https://jdashg.github.io/misc/colors/from-coeffs.html. >+const videoTests = { >+ // Rec.709 Y'CbCr (0x3F, 0x66, 0xF0) = sRGB (0xFF, 0x01, 0x00) >+ "sRGB-FF0100": { >+ "srgb srgb": [255, 1, 0, 255], >+ "srgb display-p3": [234, 51, 35, 255], >+ "display-p3 srgb": [255, 0, 0, 255], >+ "display-p3 display-p3": [234, 51, 35, 255], >+ }, >+ // Rec.709 Y'CbCr (0x32, 0x6D, 0xD2) = sRGB (0xBB, 0x00, 0x00) >+ "sRGB-BB0000": { >+ "srgb srgb": [187, 0, 0, 255], >+ "srgb display-p3": [171, 35, 23, 255], >+ "display-p3 srgb": [187, 1, 0, 255], >+ "display-p3 display-p3": [171, 35, 23, 255], >+ }, >+ >+ // 10 bit Rec.2020 Y'CbCr (0x126, 0x183, 0x3C0) = Rec.2020 (0x3FF, 0x000, 0x000) >+ "Rec2020-3FF000000": { >+ "srgb srgb": [255, 0, 0, 255], >+ "srgb display-p3": [234, 51, 35, 255], >+ "display-p3 srgb": [255, 0, 0, 255], >+ "display-p3 display-p3": [255, 0, 9, 255], >+ }, >+ // 10 bit Rec.2020 Y'CbCr (0x0BB, 0x1BD, 0x2EF) = Rec.2020 (0x222, 0x000, 0x000) >+ "Rec2020-222000000": { >+ "srgb srgb": [186, 0, 0, 255], >+ "srgb display-p3": [170, 34, 23, 255], >+ "display-p3 srgb": [186, 0, 0, 255], >+ "display-p3 display-p3": [169, 0, 3, 255], >+ }, >+}; >+ > const fromSRGBToDisplayP3 = { > "255,0,0,255": [234, 51, 35, 255], > "255,0,0,204": [234, 51, 35, 204], >@@ -223,7 +276,7 @@ const fromDisplayP3ToSRGB = { > > function pixelsApproximatelyEqual(p1, p2) { > for (let i = 0; i < 4; ++i) { >- if (Math.abs(p1[i] - p2[i]) > 2) >+ if (Math.abs(p1[i] - p2[i]) > 3) > return false; > } > return true; >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-222000000.mp4 b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-222000000.mp4 >new file mode 100644 >index 0000000000000000000000000000000000000000..71ad32c5f00c35294f4e23c3732ee31e347f3aa8 >GIT binary patch >literal 3275 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 >QO3WrZH-^`Dhodz805l-7y8r+H > >literal 0 >HcmV?d00001 > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-222000000.webm b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-222000000.webm >new file mode 100644 >index 0000000000000000000000000000000000000000..5e4eae49dc11ddd63ddff170571c0ac8a68956c2 >GIT binary patch >literal 604 >zcmb1gy}x+AQ(GgW({~{L)X3uWxsk)EsiizMDc7mJk;$pGkx3%BA)S!{1ekOLeP@^K >z^4;AXyt+lyb7flan#P3?o><7bY#{H3@9rL;oKVQ&^x!p3j7AWyOz>`?WD}Fv8;Cg! >zkznI!L4aJfN$dK?W_~9J--ceF#IiI~3q5l)JwpS7a7R?WOJ|3J3&as1=U-h1b)C=k >zM#kc!9jdx31b258<<DtkP}(}Dxil}Otu-t@EWon4kx}_^a|=^a6vG3k7Re1wj5@m- >zPt0m$3f<5Xx~q{dbYmlD=<Y^NP*6C`D=vmAR8Kz8kbVNnk#b$!?&|04@8TNd(vIpj >zxQ6891Kr68$H4WfA?uw9^k*{ApN7UJAdf2KWG0mrROpr!Sf-y?<hr=SB{aw}#M9r; >zrG1KlffX3(8JHMA00V=(^S096&l?#QZ);>=Xqe>L>=eKm!Dh`MBgDs}!@!`C_|1TU >zA)R@{!vFvO&zTM+{wz4WVx?Q&iXJA3N$e5~p!l7*yMJ>d!}cy<I{Mhec<n<YGXT!t >Bu~z^9 > >literal 0 >HcmV?d00001 > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-3FF000000.mp4 b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-3FF000000.mp4 >new file mode 100644 >index 0000000000000000000000000000000000000000..0e2880a93abdb04d0b24facc37b57932250c674f >GIT binary patch >literal 3275 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 >QD`u0O8^i0n!%>>P2LiXWCjbBd > >literal 0 >HcmV?d00001 > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-3FF000000.webm b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Rec2020-3FF000000.webm >new file mode 100644 >index 0000000000000000000000000000000000000000..4f28de8ceaf770f344dfb157afeb46fd5973e4f6 >GIT binary patch >literal 605 >zcmb1gy}x+AQ(GgW({~{L)X3uWxsk)EsiizMDc7mJk;$pGkx3%BA)S!{1ekOMeP@^K >z^4;AXyt+lyb7flan#P3?o><7bY#{H3@9rL;oKVQ&^x!p3j7AWyOz>`?WD}G48;Cg! >zkznI!L4aJfN$dK?W_~9J--ceF#IiI~3q5l)JwpS7a7R?WOJ|3J3&as1=U-h1b)C=k >zM#kc!9a~QAR-L<Wwac7F2BocYnoILi+FHZn!vZXu8yS@!H@7e)MKL^pYLVQ~#Hh2Y >z@x-h~rqB&Np}QLSLN_*YhVE|U1O<h|yy9Z0LiOYW4e2MK94Xhu?XG^#{w}UTF72pp >zgKJ1mKG2<va130p8nWJ*Kz}9!{b^`y0`jOrPG(YBL4|Hvfo1xMMXrlGTtb5!Lp=Tc >zT-v7?7+8Uko`H!01TZkjJ8vu9^SqH^@%BarhK5O=%}xQF5p32BGD3VjIt&aNiQfzu >z7}CBin*aa*|2wDbf#m1T<`pa5@>cXPNlapwU;st%#NGXy8yU8D0Ta^4CdO+Y8kqr3 >C&$UAU > >literal 0 >HcmV?d00001 > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-BB0000.mp4 b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-BB0000.mp4 >new file mode 100644 >index 0000000000000000000000000000000000000000..59572f513873cc962fd91ff141228f01a97c8a0b >GIT binary patch >literal 1600 >zcmZuxO=u)V6s}1$h?tWRR>(rB8(4IHx_gq@WTatZ2pe!0*Mo~JLQ`E`oo=W9rm8ZT >z*;5b|@g^)DJPG2#AM~ams0)fLc=VEh7gyGw74)!|1<~=V?o4)!KBnt^@3-pJdo_d* >z8tPFIt2`xSh8T{|VFPZb#j;HZxi6GL!1iYvFb)3E+`Z%R``>T=`uR@>Tc5sJ-=_zU >z{r<<$=`7O*<+&8p?zE|FTOEt81b&CH4h&mOIJ7QY+&tG<rt6nB;28)G!$w|=5)o?Z >zSXR5?SdI;4q;=74wRU%Rn}awIdBU=0F1K4|mu95X1U`A8<2+Mc%9+o&Yf~vgw@m}# >zCpquAcGv1!lw~X#DdAefcGnu(cAKWcjl__u9UtfnEz}61SUnlIcGE%-7MjLG5qKt} >zjR;S&Y+JZ?hw@0~Df19&Q!Pc3#0qG2xEgQ`!279d;Rr0al4rto?7D5!kSXmIsuvf= >zqe{>(ygUq*&~C$_I+BP`Zigm$-eVC2Z=$oQN@9+)OcWN)WVr{AQ>M*1;!F#fFgQW) >zCp(gjJf5co(~vo?NJ|!HNC8L5j87<8Dikiu_lgm49JmfJ3s_;Q@I60f%4`x#QP#C9 >z;_XQLu;qowyzRVzwNe%c?THa`yUvPr2)#7UAX3FeCisqamo0Nl$;_2Xp(2D!?j4nD >z?2@}&hBWnYucj;ruG4N>v~P-WttRHFUzo%tXG6EM28Gh1aF=OZph*}A^bomNAN@Do >zBzu@(SG@Kzd1Czc{?E7T@5GlsUi<FijqbZ&ebCyy|LXk18&5v7bSotD*WaMt>(4)Z >zE4t@AAy2)uboH~LdMMm{mXO(#X`T;|C`kuV06s;tzd$%mYQ+5R(!T_#kI856dj21p >z!81FD+v>sig6@@j&Q3W_vYnpNRd8aN7>>zjp|91kTrV9?i9jo$MUf~x?UGDHmA8zo >zeVGO^gN~-b@!B1zXUKD3mvN0KNMwnym`6LohF>y|c#CC0B8*S%MYJ&lSQw;b(&=NK >z3M$)TfLSrYAY*@EM<%qwwa1nA6X0)@R+EMppHIyH7Pz75oRy-EvbO-uXXrm3m3nGD >zF&;x&L)ML2K<39kki~8A4-eMuFK)iI_v+r;m<~b-nOnc{igT?-=Az$z{Pxjnf8Dub >zvOLK1L}ol0VypRTy9JDQb=5N$_KEojIiYmf1`}e=gbx#dwxBw00O(ME#1~+@QkiCM >zAKIbgd8I4;EMR{p&<y-?DoSq5k4(1;?Uk%3%xxY~Bd+FQ={=pBgeUROZ<3fpkn?O1 >NuB<lCbegth{R7P;c4Ghl > >literal 0 >HcmV?d00001 > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-BB0000.webm b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-BB0000.webm >new file mode 100644 >index 0000000000000000000000000000000000000000..23a6364bdb709df08f3f915d80596a3c5cb51392 >GIT binary patch >literal 604 >zcmb1gy}x+AQ(GgW({~{L)X3uWxsk)EsiizMDc7mJk;$pGkx3%BA)S!{1ekOLeP@^K >z^4;AXyt+lyb7flan#P3?o><7bY#{H3@9rL;oKVQ&^x!p3j7AWyOz>`?WD}Fv8;Cg! >zkznI!L4aJfN$dK?W_~9J--ceF#IiI~3q5l)JwpS7a7R?WOJ|3J3&as1=U-h1b)C=k >zM#kc!9lw4ruHgUb5jdxjL22up=F+^Bw$`xtumH>EMn>hw%`HqxQ49~DS|m3#G3xAU >zJTa@0DRe_m=&nZI(2b3Zp}QLyK|$d#uecbhP(ArTL;49QN6K|^yQ`nGzl&>-OFOFD >z;2M&X4|FFZ90S*@hOBoc(4Wabe;OK_fIO;@lbKXjP@!8^V3~emk?Z0Pm(U=`5Kn(U >zm-Z<J23BCCXJBFg0SpZC&f7|NKW}7MyseRep`ppM*~vj@15X))g^G-X7Xw2;;x_{Z >zhIH=M;{X5uU;hpy{=Ro871cO<Rj|QX$l);qD1ImI?%&+Vu)PbIjy^UqUi;9<3;^rF >BwY~rV > >literal 0 >HcmV?d00001 > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-FF0100.mp4 b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-FF0100.mp4 >new file mode 100644 >index 0000000000000000000000000000000000000000..37a29f9f8316021452d70d59f92047d680d1075c >GIT binary patch >literal 1600 >zcmZuxPiP%Q7@wD5@L)k~z#dW<HA2z6m)(8IYZ_Q+h_yLb=%ockSY~Huv+LX4+00B{ >z-peTm6+L<>SVVg9P!Ug3Pim1WO2Lblr0Bu=UqKJO6h)uE+09Fz(T}(D{l335-+bRZ >zLI{n`piH&Q37H_4<MUXLyLq|b5<>2el@PG~nMcfkzdLo`aQOCDXMX<RhrPA;FU{@J >zy~lq0z3+7vXp?fO1a&)Ys@hJ+p^H)2VXOngS_=;I=gyxw+gzY47gymK2@b=mEC-p0 >z4fPzS-SiyKg)%XwT%Mob+S+RM(n!dR6)maO=j|@7#N-)#WNA`a=w-@T$hhxPC1Sr# >zBN1kjcYSx+S#~HZST@kYclzyRr|-ILnhQS>eX2J@pp&%J1B7A?ROGuY2SHe9p7uo) >z*o-bB0>z4T;kzBm6D4yNAk?Ksi7ZPs&{BUX;s$_k<i3L=uxMKr!uQ-c*QGJjCMb0` >zEv-kLV51CV9BX0xrbkVp5TX4J&7|zI1VS*<xm0H<$5}=ShZd^ZgQqz&_8e(pgvuD4 >zpbxW6#RdVFdC3f9jw>>Xr3F&JQ8DWiE0zn5%L;>X0Gvj?2h1W?+A6{zOqsTuq)JqE >zZHaU}F(GWS6h*KuOIT}ViO{YXAh+)=I{Prl(*h#ZToi(D8h^pD$5hN-sS-LtxZ=S< >zxz?_@&s9wG5cg`!g5Z1YmP0peF}~BnJZ+RVam88R@0@}{8&UcTG%e923<P?JTx<jV >zx7{Q=m|$PL@*;V1`1kIQcjn%>aqGRM?`}PH?P~eU&96UxYx3#yUwrxb_Uk*7YIg16 >z+m{~t<8tFDArD@8RkYrm`Q+KxE)X(#JeRVEL|NWTBJeSq{0YJd(jfMCkNzb<eMmli >z&-4G#1fJPh+*TLH=S{cTb8^gal<mZru7)Ga$Z$wL4Siz{%V(9ttcZ*Tnh}}C)2_%y >z)OoAe#z%RSGU#X?9j@JjdV*ZIQN=ZrC{q=}Vjt}YTYk|#;x$%8nXo>M7tqESV7ixA >zNym>l8`ZX%2(w~?LDv4jrpjoI8&7BxX273nqel&~KG*F37PzJHoV8*OWv>C+&(eQ9 >zYW3K9Y&e8;3Rzbh5jisahRm#kzq7aEe)#?6otJm6U^)mTWNPL1OWyScnM!{B_U5D4 >z|GInEW;x1brV5_*vDJ}!yJ?Jfebp1^c8UE6Ii^k31{-3}gbx#dwxBw00cc-;z^7r` >zu1ynn_U+JdS?el42RPh}3<G~I7ZtbWN5)%)_9|AE_BIcwnb!00_*Elq!sGbow@K_F >R$TO@LFD|uCc3Q6E`~xIldujjx > >literal 0 >HcmV?d00001 > >diff --git a/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-FF0100.webm b/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-FF0100.webm >new file mode 100644 >index 0000000000000000000000000000000000000000..31b69af924fbc3b3322fe4c6bc66e8abf5eb89f8 >GIT binary patch >literal 605 >zcmb1gy}x+AQ(GgW({~{L)X3uWxsk)EsiizMDc7mJk;$pGkx3%BA)S!{1ekOMeP@^K >z^4;AXyt+lyb7flan#P3?o><7bY#{H3@9rL;oKVQ&^x!p3j7AWyOz>`?WD}G48;Cg! >zkznI!L4aJfN$dK?W_~9J--ceF#IiI~3q5l)JwpS7a7R?WOJ|3J3&as1=U-h1b)C=k >zM#kc!9S59R>KlK)_ny<pptN;Pb7@{mTWeT+Sb$}7Bct-;<`$-;D24}6Es`6W7<G0v >zo|x6h6uO}&bXOy9=*C9I(A|xUprCM=S6mELsGfYFA^ilDBjvid-PO<8-^De^r5)96 >za1F`H2fC9Hj)Ch{L)JSJ=+9)JKMjpdKps`d$xJFMsL(AduuMO($aQgtOK6Z|h^N1w >zOZyZ911m7nGcYlL00stm=WV5Xo;NZq-rmT-(9q=B?BpP{fv1eYLPbWxi-92^@tXky >zLpsNl>Hq)#|8iR%NdD?OcqL@9d59Y$k0)~v11N$g?(W~*$gsT&n2<g;F<$%7$P56T >C_qA&P > >literal 0 >HcmV?d00001 > >diff --git a/LayoutTests/media/video-canvas-createPattern-expected.txt b/LayoutTests/media/video-canvas-createPattern-expected.txt >index cf0815e1779f790e68fe8b05b6498edf854f0cd1..81e03a5ce0be2059b38b5bcd1bf270d6c6643707 100644 >--- a/LayoutTests/media/video-canvas-createPattern-expected.txt >+++ b/LayoutTests/media/video-canvas-createPattern-expected.txt >@@ -1,56 +1,56 @@ > > EVENT(canplaythrough) > EVENT(seeked) >-Saw close enough to (194, 193, 14) at (40, 165) OK >-Saw close enough to (194, 193, 14) at (355, 165) OK >-Saw close enough to (194, 193, 14) at (40, 403) OK >-Saw close enough to (194, 193, 14) at (355, 403) OK >-Saw close enough to (17, 197, 195) at (56, 165) OK >-Saw close enough to (17, 197, 195) at (371, 165) OK >-Saw close enough to (17, 197, 195) at (56, 403) OK >-Saw close enough to (17, 197, 195) at (371, 403) OK >-Saw close enough to (20, 200, 18) at (73, 165) OK >-Saw close enough to (20, 200, 18) at (388, 165) OK >-Saw close enough to (20, 200, 18) at (73, 403) OK >-Saw close enough to (20, 200, 18) at (388, 403) OK >+Saw close enough to (200, 200, 0) at (40, 165) OK >+Saw close enough to (200, 200, 0) at (355, 165) OK >+Saw close enough to (200, 200, 0) at (40, 403) OK >+Saw close enough to (200, 200, 0) at (355, 403) OK >+Saw close enough to (57, 202, 203) at (56, 165) OK >+Saw close enough to (57, 202, 203) at (371, 165) OK >+Saw close enough to (57, 202, 203) at (56, 403) OK >+Saw close enough to (57, 202, 203) at (371, 403) OK >+Saw close enough to (53, 203, 9) at (73, 165) OK >+Saw close enough to (53, 203, 9) at (388, 165) OK >+Saw close enough to (53, 203, 9) at (73, 403) OK >+Saw close enough to (53, 203, 9) at (388, 403) OK > EVENT(seeked) >-Saw close enough to (194, 193, 14) at (40, 165) OK >-Saw close enough to (194, 193, 14) at (355, 165) OK >-Saw close enough to (194, 193, 14) at (40, 403) OK >-Saw close enough to (194, 193, 14) at (355, 403) OK >-Saw close enough to (17, 197, 195) at (56, 165) OK >-Saw close enough to (17, 197, 195) at (371, 165) OK >-Saw close enough to (17, 197, 195) at (56, 403) OK >-Saw close enough to (17, 197, 195) at (371, 403) OK >-Saw close enough to (20, 200, 18) at (73, 165) OK >-Saw close enough to (20, 200, 18) at (388, 165) OK >-Saw close enough to (20, 200, 18) at (73, 403) OK >-Saw close enough to (20, 200, 18) at (388, 403) OK >+Saw close enough to (200, 200, 0) at (40, 165) OK >+Saw close enough to (200, 200, 0) at (355, 165) OK >+Saw close enough to (200, 200, 0) at (40, 403) OK >+Saw close enough to (200, 200, 0) at (355, 403) OK >+Saw close enough to (57, 202, 203) at (56, 165) OK >+Saw close enough to (57, 202, 203) at (371, 165) OK >+Saw close enough to (57, 202, 203) at (56, 403) OK >+Saw close enough to (57, 202, 203) at (371, 403) OK >+Saw close enough to (53, 203, 9) at (73, 165) OK >+Saw close enough to (53, 203, 9) at (388, 165) OK >+Saw close enough to (53, 203, 9) at (73, 403) OK >+Saw close enough to (53, 203, 9) at (388, 403) OK > EVENT(seeked) >-Saw close enough to (194, 193, 14) at (40, 165) OK >-Saw close enough to (194, 193, 14) at (355, 165) OK >-Saw close enough to (194, 193, 14) at (40, 403) OK >-Saw close enough to (194, 193, 14) at (355, 403) OK >-Saw close enough to (17, 197, 195) at (56, 165) OK >-Saw close enough to (17, 197, 195) at (371, 165) OK >-Saw close enough to (17, 197, 195) at (56, 403) OK >-Saw close enough to (17, 197, 195) at (371, 403) OK >-Saw close enough to (20, 200, 18) at (73, 165) OK >-Saw close enough to (20, 200, 18) at (388, 165) OK >-Saw close enough to (20, 200, 18) at (73, 403) OK >-Saw close enough to (20, 200, 18) at (388, 403) OK >+Saw close enough to (200, 200, 0) at (40, 165) OK >+Saw close enough to (200, 200, 0) at (355, 165) OK >+Saw close enough to (200, 200, 0) at (40, 403) OK >+Saw close enough to (200, 200, 0) at (355, 403) OK >+Saw close enough to (57, 202, 203) at (56, 165) OK >+Saw close enough to (57, 202, 203) at (371, 165) OK >+Saw close enough to (57, 202, 203) at (56, 403) OK >+Saw close enough to (57, 202, 203) at (371, 403) OK >+Saw close enough to (53, 203, 9) at (73, 165) OK >+Saw close enough to (53, 203, 9) at (388, 165) OK >+Saw close enough to (53, 203, 9) at (73, 403) OK >+Saw close enough to (53, 203, 9) at (388, 403) OK > EVENT(seeked) >-Saw close enough to (194, 193, 14) at (40, 165) OK >-Saw close enough to (194, 193, 14) at (355, 165) OK >-Saw close enough to (194, 193, 14) at (40, 403) OK >-Saw close enough to (194, 193, 14) at (355, 403) OK >-Saw close enough to (17, 197, 195) at (56, 165) OK >-Saw close enough to (17, 197, 195) at (371, 165) OK >-Saw close enough to (17, 197, 195) at (56, 403) OK >-Saw close enough to (17, 197, 195) at (371, 403) OK >-Saw close enough to (20, 200, 18) at (73, 165) OK >-Saw close enough to (20, 200, 18) at (388, 165) OK >-Saw close enough to (20, 200, 18) at (73, 403) OK >-Saw close enough to (20, 200, 18) at (388, 403) OK >+Saw close enough to (200, 200, 0) at (40, 165) OK >+Saw close enough to (200, 200, 0) at (355, 165) OK >+Saw close enough to (200, 200, 0) at (40, 403) OK >+Saw close enough to (200, 200, 0) at (355, 403) OK >+Saw close enough to (57, 202, 203) at (56, 165) OK >+Saw close enough to (57, 202, 203) at (371, 165) OK >+Saw close enough to (57, 202, 203) at (56, 403) OK >+Saw close enough to (57, 202, 203) at (371, 403) OK >+Saw close enough to (53, 203, 9) at (73, 165) OK >+Saw close enough to (53, 203, 9) at (388, 165) OK >+Saw close enough to (53, 203, 9) at (73, 403) OK >+Saw close enough to (53, 203, 9) at (388, 403) OK > END OF TEST > >diff --git a/LayoutTests/media/video-canvas-createPattern.html b/LayoutTests/media/video-canvas-createPattern.html >index f51442fe5dd1f38d71ef6c38d26ebb88e8f578b4..fdc295c4940a456bcca05b4bb96bcd49b64ce2b3 100644 >--- a/LayoutTests/media/video-canvas-createPattern.html >+++ b/LayoutTests/media/video-canvas-createPattern.html >@@ -10,20 +10,20 @@ > > var expectedResults = [ > // Each entry is formatted as [x, y, r, g, b]. >- [40, 165, 194, 193, 14], // Represents yellow north west tile. >- [355, 165, 194, 193, 14], // Represents yellow north east tile. >- [40, 403, 194, 193, 14], // Represents yellow south west tile. >- [355, 403, 194, 193, 14], // Represents yellow south east tile. >+ [40, 165, 200, 200, 0], // Represents yellow north west tile. >+ [355, 165, 200, 200, 0], // Represents yellow north east tile. >+ [40, 403, 200, 200, 0], // Represents yellow south west tile. >+ [355, 403, 200, 200, 0], // Represents yellow south east tile. > >- [56, 165, 17, 197, 195], // Represents blue/cyan north west tile. >- [371, 165, 17, 197, 195], // Represents blue/cyan north east tile. >- [56, 403, 17, 197, 195], // Represents blue/cyan south west tile. >- [371, 403, 17, 197, 195], // Represents blue/cyan south east tile. >+ [56, 165, 57, 202, 203], // Represents blue/cyan north west tile. >+ [371, 165, 57, 202, 203], // Represents blue/cyan north east tile. >+ [56, 403, 57, 202, 203], // Represents blue/cyan south west tile. >+ [371, 403, 57, 202, 203], // Represents blue/cyan south east tile. > >- [73, 165, 20, 200, 18], // Represents green north west tile. >- [388, 165, 20, 200, 18], // Represents green north east tile. >- [73, 403, 20, 200, 18], // Represents green south west tile. >- [388, 403, 20, 200, 18], // Represents green south east tile. >+ [73, 165, 53, 203, 9], // Represents green north west tile. >+ [388, 165, 53, 203, 9], // Represents green north east tile. >+ [73, 403, 53, 203, 9], // Represents green south west tile. >+ [388, 403, 53, 203, 9], // Represents green south east tile. > ] > > if (window.testRunner) { >diff --git a/LayoutTests/media/video-canvas-drawing-output-expected.txt b/LayoutTests/media/video-canvas-drawing-output-expected.txt >index 35f25ccee98547289105097b2ccb7555ca0eb4bc..a978c55467de086f05c7ade4e7a0febb7af2e369 100644 >--- a/LayoutTests/media/video-canvas-drawing-output-expected.txt >+++ b/LayoutTests/media/video-canvas-drawing-output-expected.txt >@@ -1,20 +1,20 @@ > > EVENT(canplaythrough) > EVENT(seeked) >-Saw close enough to (194, 193, 14) at (40, 165) OK >-Saw close enough to (17, 197, 195) at (56, 165) OK >-Saw close enough to (20, 200, 18) at (73, 165) OK >+Saw close enough to (200, 200, 0) at (40, 165) OK >+Saw close enough to (57, 202, 203) at (56, 165) OK >+Saw close enough to (53, 203, 9) at (73, 165) OK > EVENT(seeked) >-Saw close enough to (194, 193, 14) at (40, 165) OK >-Saw close enough to (17, 197, 195) at (56, 165) OK >-Saw close enough to (20, 200, 18) at (73, 165) OK >+Saw close enough to (200, 200, 0) at (40, 165) OK >+Saw close enough to (57, 202, 203) at (56, 165) OK >+Saw close enough to (53, 203, 9) at (73, 165) OK > EVENT(seeked) >-Saw close enough to (194, 193, 14) at (40, 165) OK >-Saw close enough to (17, 197, 195) at (56, 165) OK >-Saw close enough to (20, 200, 18) at (73, 165) OK >+Saw close enough to (200, 200, 0) at (40, 165) OK >+Saw close enough to (57, 202, 203) at (56, 165) OK >+Saw close enough to (53, 203, 9) at (73, 165) OK > EVENT(seeked) >-Saw close enough to (194, 193, 14) at (40, 165) OK >-Saw close enough to (17, 197, 195) at (56, 165) OK >-Saw close enough to (20, 200, 18) at (73, 165) OK >+Saw close enough to (200, 200, 0) at (40, 165) OK >+Saw close enough to (57, 202, 203) at (56, 165) OK >+Saw close enough to (53, 203, 9) at (73, 165) OK > END OF TEST > >diff --git a/LayoutTests/media/video-canvas-drawing-output.html b/LayoutTests/media/video-canvas-drawing-output.html >index 6a4aff8d8439118e46a6bb66ad9be333e6cf7d1d..bb0b5f5239652adbdd467e7ab4013865fd1609bf 100644 >--- a/LayoutTests/media/video-canvas-drawing-output.html >+++ b/LayoutTests/media/video-canvas-drawing-output.html >@@ -8,9 +8,9 @@ > > var expectedResults = [ > // [x, y, r, g, b] >- [40, 165, 194, 193, 14], // yellow >- [56, 165, 17, 197, 195], // blue/cyan >- [73, 165, 20, 200, 18], // green >+ [40, 165, 200, 200, 0], // yellow >+ [56, 165, 57, 202, 203], // blue/cyan >+ [73, 165, 53, 203, 9], // green > ]; > > if (window.testRunner) { >diff --git a/LayoutTests/media/video-orientation-canvas-expected.txt b/LayoutTests/media/video-orientation-canvas-expected.txt >index 041c887cf08c207ada848e000dedc3646366c228..cb70f2393d048af12fc3b2ace342f5799170d5f7 100644 >--- a/LayoutTests/media/video-orientation-canvas-expected.txt >+++ b/LayoutTests/media/video-orientation-canvas-expected.txt >@@ -1,6 +1,6 @@ > >-EXPECTED (context.getImageData(88, 115, 1, 1).data == [208,0,0,255] with tolerance 5 OK >-EXPECTED (context.getImageData(237, 88, 1, 1).data == [208,0,0,255] with tolerance 5 OK >-EXPECTED (context.getImageData(200, 237, 1, 1).data == [208,0,0,255] with tolerance 5 OK >+EXPECTED (context.getImageData(88, 115, 1, 1).data == [208,30,0,255] with tolerance 5 OK >+EXPECTED (context.getImageData(237, 88, 1, 1).data == [208,30,0,255] with tolerance 5 OK >+EXPECTED (context.getImageData(200, 237, 1, 1).data == [208,30,0,255] with tolerance 5 OK > END OF TEST > >diff --git a/LayoutTests/media/video-orientation-canvas.html b/LayoutTests/media/video-orientation-canvas.html >index ec55495119e4aa68815a3a8146c8a4ea05872034..6e76309a8b335d928779991bb9717662f94b4fcf 100644 >--- a/LayoutTests/media/video-orientation-canvas.html >+++ b/LayoutTests/media/video-orientation-canvas.html >@@ -4,7 +4,7 @@ > <title>video-orientation-canvas</title> > <script src="video-test.js"></script> > <script> >- let redColor = new Uint8ClampedArray([208, 0, 0, 255]); >+ let redColor = new Uint8ClampedArray([208, 30, 0, 255]); > var context; > > function arraysAreApproximatelyEqual(arrayString, expected, tolerance) { >@@ -74,4 +74,4 @@ > <canvas id=canvas2></canvas> > <canvas id=canvas3></canvas> > </body> >-</html> >\ No newline at end of file >+</html> >diff --git a/LayoutTests/platform/glib/TestExpectations b/LayoutTests/platform/glib/TestExpectations >index 353f431d8d0ea47610c68b4fa0cb7b0a28651ff8..2eef6d52b544efea84e26ad30b29340483eb0d18 100644 >--- a/LayoutTests/platform/glib/TestExpectations >+++ b/LayoutTests/platform/glib/TestExpectations >@@ -232,8 +232,6 @@ media/media-controller-time-constant.html [ Pass ] > media/media-controller-time.html [ Pass ] > media/media-controller-unpause.html [ Pass ] > media/mediacapabilities/mediacapabilities-types.html [ Pass ] >-media/video-canvas-createPattern.html [ Pass ] >-media/video-canvas-drawing-output.html [ Pass ] > media/video-controller-currentTime-rate.html [ Pass ] > webaudio/codec-tests/aac/vbr-128kbps-44khz.html [ Pass ] > webaudio/codec-tests/mp3/128kbps-44khz.html [ Pass ] >diff --git a/LayoutTests/platform/ios-14/TestExpectations b/LayoutTests/platform/ios-14/TestExpectations >index 3e3160a3f3c1f242b4a587e81759a179b5ce2090..be53543d25486ec7693023207979ccda1783ebd0 100644 >--- a/LayoutTests/platform/ios-14/TestExpectations >+++ b/LayoutTests/platform/ios-14/TestExpectations >@@ -72,6 +72,8 @@ imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/can > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html [ Failure ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Failure ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html [ Failure ] >+imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video.html [ Failure ] >+imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html [ Failure ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Failure ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-image.html [ Failure ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-settings.html [ Failure ] >diff --git a/LayoutTests/platform/ios-device/TestExpectations b/LayoutTests/platform/ios-device/TestExpectations >index ee37e97ed0fd6a71acec687e6deddf4723083182..488a54b63aff870c19e5493d822e4d9465fddd5e 100644 >--- a/LayoutTests/platform/ios-device/TestExpectations >+++ b/LayoutTests/platform/ios-device/TestExpectations >@@ -99,8 +99,6 @@ js/stringimpl-to-jsstring-on-large-strings-3.html [ Crash ] > > loader/go-back-to-different-window-size.html [ Crash ] > >-media/video-canvas-createPattern.html [ Failure ] >-media/video-canvas-drawing-output.html [ Failure ] > media/video-load-preload-metadata.html [ Failure ] > media/video-played-collapse.html [ Failure ] > media/video-played-reset.html [ Failure ] >diff --git a/LayoutTests/platform/ios/TestExpectations b/LayoutTests/platform/ios/TestExpectations >index 419afadf5b7879722d11ffe4f19e6d671f26bc37..fa1db25c2750c8543544e16fe3933e2cd54c790e 100644 >--- a/LayoutTests/platform/ios/TestExpectations >+++ b/LayoutTests/platform/ios/TestExpectations >@@ -3484,6 +3484,8 @@ imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/can > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html [ Pass ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Pass ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html [ Pass ] >+imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video.html [ Pass ] >+imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html [ Pass ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Pass ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-image.html [ Pass ] > imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-settings.html [ Pass ] >diff --git a/LayoutTests/platform/ios/webgl/1.0.x/conformance/textures/misc/texture-corner-case-videos-expected.txt b/LayoutTests/platform/ios/webgl/1.0.x/conformance/textures/misc/texture-corner-case-videos-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..d3de27188b8efe7f8f77b37ef155ca49ee381917 >--- /dev/null >+++ b/LayoutTests/platform/ios/webgl/1.0.x/conformance/textures/misc/texture-corner-case-videos-expected.txt >@@ -0,0 +1,21 @@ >+This test runs the WebGL Test listed below in an iframe and reports PASS or FAIL. >+ >+Test: ../../../../resources/webgl_test_files/conformance/textures/misc/texture-corner-case-videos.html >+ >+[ 1: PASS ] shouldBe 0,255,0 >+[ 2: PASS ] shouldBe 255,0,0 >+[ 3: PASS ] getError was expected value: NO_ERROR : should be no errors >+[ 4: PASS ] shouldBe 255,0,0 >+[ 5: PASS ] shouldBe 0,255,0 >+[ 6: PASS ] getError was expected value: NO_ERROR : should be no errors >+[ 7: PASS ] shouldBe 0,255,0 >+[ 8: PASS ] shouldBe 255,0,0 >+[ 9: PASS ] getError was expected value: NO_ERROR : should be no errors >+[ 10: PASS ] shouldBe 255,0,0 >+[ 11: PASS ] shouldBe 0,255,0 >+[ 12: PASS ] getError was expected value: NO_ERROR : should be no errors >+[ 13: FAIL ] shouldBe 0,255,0 at (4, 24) expected: 0,255,0 was 63,251,0 >+[ 14: FAIL ] shouldBe 255,0,0 at (4, 4) expected: 255,0,0 was 247,36,0 >+[ 15: PASS ] getError was expected value: NO_ERROR : should be no errors >+[ 16: PASS ] successfullyParsed is true >+[ FAIL ] 2 failures reported >diff --git a/LayoutTests/platform/ios/webgl/2.0.y/conformance/textures/misc/texture-corner-case-videos-expected.txt b/LayoutTests/platform/ios/webgl/2.0.y/conformance/textures/misc/texture-corner-case-videos-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..12ef202690ee3756d4fc838a50b93bd42a146bed >--- /dev/null >+++ b/LayoutTests/platform/ios/webgl/2.0.y/conformance/textures/misc/texture-corner-case-videos-expected.txt >@@ -0,0 +1,21 @@ >+This test runs the WebGL Test listed below in an iframe and reports PASS or FAIL. >+ >+Test: ../../../../resources/webgl_test_files/conformance/textures/misc/texture-corner-case-videos.html?webglVersion=2 >+ >+[ 1: PASS ] shouldBe 0,255,0 >+[ 2: PASS ] shouldBe 255,0,0 >+[ 3: PASS ] getError was expected value: NO_ERROR : should be no errors >+[ 4: PASS ] shouldBe 255,0,0 >+[ 5: PASS ] shouldBe 0,255,0 >+[ 6: PASS ] getError was expected value: NO_ERROR : should be no errors >+[ 7: PASS ] shouldBe 0,255,0 >+[ 8: PASS ] shouldBe 255,0,0 >+[ 9: PASS ] getError was expected value: NO_ERROR : should be no errors >+[ 10: PASS ] shouldBe 255,0,0 >+[ 11: PASS ] shouldBe 0,255,0 >+[ 12: PASS ] getError was expected value: NO_ERROR : should be no errors >+[ 13: FAIL ] shouldBe 0,255,0 at (4, 24) expected: 0,255,0 was 63,251,0 >+[ 14: FAIL ] shouldBe 255,0,0 at (4, 4) expected: 255,0,0 was 247,36,0 >+[ 15: PASS ] getError was expected value: NO_ERROR : should be no errors >+[ 16: PASS ] successfullyParsed is true >+[ FAIL ] 2 failures reported >diff --git a/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-flipY-expected.txt b/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-flipY-expected.txt >index 6294ee1a0e707b44d7156dad73c50d5746d01bf2..ec1a49b4be75233e44c1d3d4c668aaee2954042e 100644 >--- a/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-flipY-expected.txt >+++ b/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/html/canvas/element/manual/imagebitmap/createImageBitmap-flipY-expected.txt >@@ -8,7 +8,7 @@ PASS createImageBitmap from an HTMLVideoElement from a data URL imageOrientation > PASS createImageBitmap from a bitmap HTMLImageElement imageOrientation: "none", and drawImage on the created ImageBitmap > PASS createImageBitmap from a bitmap HTMLImageElement imageOrientation: "flipY", and drawImage on the created ImageBitmap > PASS createImageBitmap from a vector HTMLImageElement imageOrientation: "none", and drawImage on the created ImageBitmap >-FAIL createImageBitmap from a vector HTMLImageElement imageOrientation: "flipY", and drawImage on the created ImageBitmap assert_approx_equals: Red channel of the pixel at (5, 15) expected 255 +/- 10 but got 0 >+FAIL createImageBitmap from a vector HTMLImageElement imageOrientation: "flipY", and drawImage on the created ImageBitmap assert_approx_equals: Red channel of the pixel at (5, 5) expected 0 +/- 1 but got 255 > FAIL createImageBitmap from a bitmap SVGImageElement imageOrientation: "none", and drawImage on the created ImageBitmap promise_test: Unhandled rejection with value: object "TypeError: Type error" > FAIL createImageBitmap from a bitmap SVGImageElement imageOrientation: "flipY", and drawImage on the created ImageBitmap promise_test: Unhandled rejection with value: object "TypeError: Type error" > FAIL createImageBitmap from a vector SVGImageElement imageOrientation: "none", and drawImage on the created ImageBitmap promise_test: Unhandled rejection with value: object "TypeError: Type error" >diff --git a/LayoutTests/platform/mac-wk2/TestExpectations b/LayoutTests/platform/mac-wk2/TestExpectations >index 14bcd73aec15cb8e45930c90cb0db71bac7e66a7..9290b35ca5db6fa4e2b0456488e9f4ef7215efd1 100644 >--- a/LayoutTests/platform/mac-wk2/TestExpectations >+++ b/LayoutTests/platform/mac-wk2/TestExpectations >@@ -1214,7 +1214,6 @@ webkit.org/b/179796 http/tests/cache/disk-cache/disk-cache-validation-back-navig > [ arm64 ] imported/w3c/web-platform-tests/html/canvas/element/path-objects/2d.path.arc.selfintersect.1.html [ Failure ] > [ arm64 ] imported/w3c/web-platform-tests/html/canvas/element/path-objects/2d.path.arc.shape.3.html [ Failure ] > [ arm64 ] inspector/canvas/memory.html [ Failure ] >-[ arm64 ] media/video-canvas-createPattern.html [ Failure ] > > webkit.org/b/229671 [ BigSur+ Debug arm64 ] imported/w3c/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-auto.html [ Pass Crash ] > >diff --git a/LayoutTests/platform/mac/TestExpectations b/LayoutTests/platform/mac/TestExpectations >index dfc0d9a20d32157bf278f2bd8d6b3ebea01be11c..8d59a57834a15656cd473200497e906bb17864d1 100644 >--- a/LayoutTests/platform/mac/TestExpectations >+++ b/LayoutTests/platform/mac/TestExpectations >@@ -1930,9 +1930,6 @@ webkit.org/b/230411 http/tests/media/hls/video-controller-getStartDate.html [ Pa > > webkit.org/b/227891 http/tests/appcache/fail-on-update.html [ Pass Timeout DumpJSConsoleLogInStdErr ] > >-# rdar://66660680 (REGRESSION (20A2327a-20A2348b): media/video-canvas-createPattern.html is failing) >-[ BigSur+ ] media/video-canvas-createPattern.html [ Failure ] >- > # Remove this once <rdar://problem/66734187> hits the bots > [ BigSur+ ] fast/text/locale-shaping.html [ Pass ImageOnlyFailure ] > >@@ -2360,6 +2357,8 @@ webkit.org/b/231463 fast/css/accent-color/range.html [ ImageOnlyFailure ] > [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html [ Pass ] > [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Pass ] > [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html [ Pass ] >+[ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-video.html [ Pass ] >+[ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-video.html [ Pass ] > [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Pass ] > [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-image.html [ Pass ] > [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-settings.html [ Pass ] >diff --git a/LayoutTests/platform/mac/media/video-canvas-createPattern-expected.png b/LayoutTests/platform/mac/media/video-canvas-createPattern-expected.png >deleted file mode 100644 >index 31fb20aea0b2072b02fe120a6ec64c5051f0209e..0000000000000000000000000000000000000000 >GIT binary patch >literal 0 >HcmV?d00001 > >literal 47292 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 > >diff --git a/LayoutTests/platform/wpe/media/video-canvas-createPattern-expected.png b/LayoutTests/platform/wpe/media/video-canvas-createPattern-expected.png >deleted file mode 100644 >index 6657d99da5b2d16c39e825b20fbc9fc1137a3541..0000000000000000000000000000000000000000 >GIT binary patch >literal 0 >HcmV?d00001 > >literal 37359 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 >M86{|ml)mr(03oka8~^|S >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 229025
:
438925
|
438926
|
438928
|
439323
|
439558
|
439565
|
439958
|
440014
|
440577
|
441172
|
441179
|
441479
|
441687