Changeset 282696 in webkit
- Timestamp:
- Sep 17, 2021 2:42:50 PM (10 months ago)
- Location:
- trunk
- Files:
-
- 12 added
- 21 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/TestExpectations (modified) (1 diff)
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob-expected.txt (added)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap-expected.txt (added)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData-expected.txt (added)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas-expected.txt (added)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned-expected.txt (added)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html (added)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image-expected.txt (added)
-
LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html (added)
-
LayoutTests/platform/ios-14/TestExpectations (modified) (1 diff)
-
LayoutTests/platform/ios/TestExpectations (modified) (1 diff)
-
LayoutTests/platform/mac/TestExpectations (modified) (1 diff)
-
Source/WTF/ChangeLog (modified) (1 diff)
-
Source/WTF/wtf/PlatformHave.h (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/bindings/js/SerializedScriptValue.cpp (modified) (2 diffs)
-
Source/WebCore/html/ImageBitmap.cpp (modified) (11 diffs)
-
Source/WebCore/html/ImageBitmap.h (modified) (1 diff)
-
Source/WebCore/html/OffscreenCanvas.cpp (modified) (3 diffs)
-
Source/WebCore/platform/graphics/BitmapImage.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/BitmapImage.h (modified) (1 diff)
-
Source/WebCore/platform/graphics/DestinationColorSpace.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/DestinationColorSpace.h (modified) (1 diff)
-
Source/WebCore/platform/graphics/Image.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/Image.h (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/Shared/cg/ShareableBitmapCG.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r282695 r282696 1 2021-09-17 Cameron McCormack <heycam@apple.com> 2 3 Preserve color space when creating ImageBuffers for ImageBitmaps 4 https://bugs.webkit.org/show_bug.cgi?id=229022 5 <rdar://problem/81828459> 6 7 Reviewed by Sam Weinig. 8 9 * TestExpectations: 10 * platform/ios-14/TestExpectations: 11 * platform/ios/TestExpectations: 12 * platform/mac/TestExpectations: 13 1 14 2021-09-17 Eric Hutchison <ehutchison@apple.com> 2 15 -
trunk/LayoutTests/TestExpectations
r282636 r282696 5254 5254 fast/canvas/canvas-color-space-display-p3.html [ Failure ] 5255 5255 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Failure ] 5256 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Failure ] 5257 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Failure ] 5258 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html [ Failure ] 5259 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html [ Failure ] 5260 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Failure ] 5261 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html [ Failure ] 5256 5262 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Failure ] 5257 5263 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-image.html [ Failure ] -
trunk/LayoutTests/imported/w3c/ChangeLog
r282637 r282696 1 2021-09-17 Cameron McCormack <heycam@apple.com> 2 3 Preserve color space when creating ImageBuffers for ImageBitmaps 4 https://bugs.webkit.org/show_bug.cgi?id=229022 5 <rdar://problem/81828459> 6 7 Reviewed by Sam Weinig. 8 9 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob-expected.txt: Added. 10 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html: Added. 11 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap-expected.txt: Added. 12 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html: Added. 13 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData-expected.txt: Added. 14 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html: Added. 15 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas-expected.txt: Added. 16 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html: Added. 17 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned-expected.txt: Added. 18 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html: Added. 19 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image-expected.txt: Added. 20 * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html: Added. 21 1 22 2021-09-17 Youenn Fablet <youenn@apple.com> 2 23 -
trunk/LayoutTests/platform/ios-14/TestExpectations
r282634 r282696 73 73 fast/canvas/canvas-color-space-display-p3.html [ Failure ] 74 74 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Failure ] 75 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Failure ] 76 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Failure ] 77 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html [ Failure ] 78 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html [ Failure ] 79 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Failure ] 80 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html [ Failure ] 75 81 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Failure ] 76 82 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-image.html [ Failure ] -
trunk/LayoutTests/platform/ios/TestExpectations
r282634 r282696 3489 3489 fast/canvas/canvas-color-space-display-p3.html [ Pass ] 3490 3490 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Pass ] 3491 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Pass ] 3492 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Pass ] 3493 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html [ Pass ] 3494 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html [ Pass ] 3495 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Pass ] 3496 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html [ Pass ] 3491 3497 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Pass ] 3492 3498 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-image.html [ Pass ] -
trunk/LayoutTests/platform/mac/TestExpectations
r282694 r282696 2352 2352 [ Monterey+ ] fast/canvas/canvas-color-space-display-p3.html [ Pass ] 2353 2353 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Pass ] 2354 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Pass ] 2355 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Pass ] 2356 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html [ Pass ] 2357 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html [ Pass ] 2358 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Pass ] 2359 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html [ Pass ] 2354 2360 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Pass ] 2355 2361 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-image.html [ Pass ] -
trunk/Source/WTF/ChangeLog
r282686 r282696 1 2021-09-17 Cameron McCormack <heycam@apple.com> 2 3 Preserve color space when creating ImageBuffers for ImageBitmaps 4 https://bugs.webkit.org/show_bug.cgi?id=229022 5 <rdar://problem/81828459> 6 7 Reviewed by Sam Weinig. 8 9 * wtf/PlatformHave.h: 10 1 11 2021-09-17 Simon Fraser <simon.fraser@apple.com> 2 12 -
trunk/Source/WTF/wtf/PlatformHave.h
r282632 r282696 1119 1119 #define HAVE_CORE_ANIMATION_FIX_FOR_RADAR_78402035 1 1120 1120 #endif 1121 1122 #if PLATFORM(COCOA) 1123 #if !defined(HAVE_CG_COLOR_SPACE_USES_EXTENDED_RANGE) 1124 #define HAVE_CG_COLOR_SPACE_USES_EXTENDED_RANGE 1 1125 #endif 1126 #endif -
trunk/Source/WebCore/ChangeLog
r282686 r282696 1 2021-09-17 Cameron McCormack <heycam@apple.com> 2 3 Preserve color space when creating ImageBuffers for ImageBitmaps 4 https://bugs.webkit.org/show_bug.cgi?id=229022 5 <rdar://problem/81828459> 6 7 Reviewed by Sam Weinig. 8 9 ImageBitmaps can be created with various sources of image data. 10 Currently, they always create an sRGB ImageBuffer to copy the 11 image data into. This patch tries to preserve the color space 12 of the source image data. Because ImageBuffer only works with 8 bit 13 RGBA data, other color space models (such as CMYK) get converted 14 to Display P3 if available, or sRGB otherwise. The rationale for 15 this is that ImageBitmaps are designed to be drawn into canvases, 16 and we currently only support sRGB and Display P3 for canvas backing 17 stores. 18 19 It's not ideal that we do the color space conversion, since it would 20 be better to delay the conversion until it's needed when drawing onto 21 the canvas. It's also not ideal that we can't preserve the pixel 22 format of the image data, which might be 16 bit color or floats. We 23 could support these only if ImageBuffer were extended to support them. 24 A different design for ImageBitmap where it can hold on to the image 25 data source directly (and support for structured cloning and worker 26 thread transferrance added) could also work. For now, we don't worry, 27 and accept the loss of color fidelity when downsampling or converting 28 from non-RGB color space models. 29 30 Support for structured cloning of ImageBitmaps with non-sRGB data 31 isn't added, but a test for this is. (This will need a way to 32 serialize the DestinationColorSpace.) 33 34 Tests: imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html 35 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html 36 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html 37 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html 38 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html 39 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html 40 41 * bindings/js/SerializedScriptValue.cpp: 42 (WebCore::CloneSerializer::dumpImageBitmap): 43 (WebCore::CloneDeserializer::readImageBitmap): 44 * html/ImageBitmap.cpp: 45 (WebCore::ImageBitmap::create): 46 (WebCore::ImageBitmap::createImageBuffer): 47 (WebCore::ImageBitmap::resolveWithBlankImageBuffer): 48 (WebCore::ImageBitmap::createPromise): 49 (WebCore::ImageBitmap::createFromBuffer): 50 * html/ImageBitmap.h: 51 * html/OffscreenCanvas.cpp: 52 (WebCore::OffscreenCanvas::transferToImageBitmap): 53 (WebCore::OffscreenCanvas::createImageBuffer const): 54 * platform/graphics/BitmapImage.cpp: 55 (WebCore::BitmapImage::colorSpace): 56 * platform/graphics/BitmapImage.h: 57 * platform/graphics/DestinationColorSpace.cpp: 58 (WebCore::DestinationColorSpace::asRGB const): New function that 59 abstracts out the behavior "tell me whether the color space is 60 appropriate for use with an 8 bit RGB buffer", which is common 61 to ImageBitmap and ShareableBitmapCG. 62 * platform/graphics/DestinationColorSpace.h: 63 * platform/graphics/Image.cpp: 64 (WebCore::Image::colorSpace): 65 * platform/graphics/Image.h: 66 1 67 2021-09-17 Simon Fraser <simon.fraser@apple.com> 2 68 -
trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp
r282513 r282696 1083 1083 } 1084 1084 1085 // FIXME: Cloned ImageBitmaps should preserve their color space. 1085 1086 PixelBufferFormat format { AlphaPremultiplication::Premultiplied, PixelFormat::RGBA8, DestinationColorSpace::SRGB() }; 1086 1087 const IntSize& logicalSize = buffer->logicalSize(); … … 3174 3175 imageDataSize.scale(resolutionScale); 3175 3176 3176 auto buffer = ImageBitmap::createImageBuffer(*scriptExecutionContextFromExecState(m_lexicalGlobalObject), logicalSize, RenderingMode::Unaccelerated, resolutionScale);3177 auto buffer = ImageBitmap::createImageBuffer(*scriptExecutionContextFromExecState(m_lexicalGlobalObject), logicalSize, RenderingMode::Unaccelerated, DestinationColorSpace::SRGB(), resolutionScale); 3177 3178 if (!buffer) { 3178 3179 fail(); -
trunk/Source/WebCore/html/ImageBitmap.cpp
r280968 r282696 68 68 #endif 69 69 70 Ref<ImageBitmap> ImageBitmap::create(ScriptExecutionContext& scriptExecutionContext, const IntSize& size )71 { 72 return create({ createImageBuffer(scriptExecutionContext, size, bufferRenderingMode ) });70 Ref<ImageBitmap> ImageBitmap::create(ScriptExecutionContext& scriptExecutionContext, const IntSize& size, DestinationColorSpace colorSpace) 71 { 72 return create({ createImageBuffer(scriptExecutionContext, size, bufferRenderingMode, colorSpace) }); 73 73 } 74 74 … … 78 78 } 79 79 80 RefPtr<ImageBuffer> ImageBitmap::createImageBuffer(ScriptExecutionContext& scriptExecutionContext, const FloatSize& size, RenderingMode renderingMode, float resolutionScale) 81 { 80 RefPtr<ImageBuffer> ImageBitmap::createImageBuffer(ScriptExecutionContext& scriptExecutionContext, const FloatSize& size, RenderingMode renderingMode, DestinationColorSpace colorSpace, float resolutionScale) 81 { 82 // FIXME: Should avoid converting color space and pixel format of image sources. 83 auto imageBufferColorSpace = colorSpace.asRGB(); 84 if (!imageBufferColorSpace) { 85 #if ENABLE(DESTINATION_COLOR_SPACE_DISPLAY_P3) 86 imageBufferColorSpace = DestinationColorSpace::DisplayP3(); 87 #else 88 imageBufferColorSpace = DestinationColorSpace::SRGB(); 89 #endif 90 } 91 82 92 if (scriptExecutionContext.isDocument()) { 83 93 auto& document = downcast<Document>(scriptExecutionContext); 84 94 if (document.view() && document.view()->root()) { 85 95 auto hostWindow = document.view()->root()->hostWindow(); 86 return ImageBuffer::create(size, renderingMode, ShouldUseDisplayList::No, RenderingPurpose::Canvas, resolutionScale, DestinationColorSpace::SRGB(), PixelFormat::BGRA8, hostWindow);96 return ImageBuffer::create(size, renderingMode, ShouldUseDisplayList::No, RenderingPurpose::Canvas, resolutionScale, *imageBufferColorSpace, PixelFormat::BGRA8, hostWindow); 87 97 } 88 98 } 89 99 90 100 // FIXME <https://webkit.org/b/218482> Enable worker based ImageBitmap and OffscreenCanvas drawing to use GPU Process rendering 91 return ImageBuffer::create(size, renderingMode, resolutionScale, DestinationColorSpace::SRGB(), PixelFormat::BGRA8);101 return ImageBuffer::create(size, renderingMode, resolutionScale, *imageBufferColorSpace, PixelFormat::BGRA8); 92 102 } 93 103 … … 246 256 // Behavior isn't well specified, but WPT tests expect no Promise rejection (and of course no crashes). 247 257 // Resolve Promise with a blank 1x1 ImageBitmap. 248 auto bitmapData = createImageBuffer(scriptExecutionContext, FloatSize(1, 1), bufferRenderingMode );258 auto bitmapData = createImageBuffer(scriptExecutionContext, FloatSize(1, 1), bufferRenderingMode, DestinationColorSpace::SRGB()); 249 259 250 260 // 9. If the origin of image's image is not the same origin as the origin specified by the … … 364 374 } 365 375 366 auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options);367 auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode);368 376 auto imageForRender = cachedImage->imageForRenderer(imageElement->renderer()); 369 377 if (!imageForRender) { … … 372 380 } 373 381 382 auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options); 383 auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode, imageForRender->colorSpace()); 374 384 if (!bitmapData) { 375 385 resolveWithBlankImageBuffer(scriptExecutionContext, !taintsOrigin(*cachedImage), WTFMove(promise)); … … 431 441 } 432 442 433 auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options);434 auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode);435 436 443 auto imageForRender = canvas.copiedImage(); 437 444 if (!imageForRender) { … … 439 446 return; 440 447 } 448 449 auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options); 450 auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode, imageForRender->colorSpace()); 441 451 442 452 if (!bitmapData) { … … 569 579 570 580 auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options); 571 auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode );581 auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode, existingImageBitmap->buffer()->colorSpace()); 572 582 573 583 if (!bitmapData) { … … 752 762 753 763 auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options); 754 auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode );764 auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode, image->colorSpace()); 755 765 if (!bitmapData) { 756 766 promise.reject(InvalidStateError, "Cannot create an image buffer from the argument to createImageBitmap"); … … 796 806 797 807 auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options); 798 auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode );808 auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode, toDestinationColorSpace(imageData->colorSpace())); 799 809 800 810 if (!bitmapData) { … … 817 827 // 6.3. Set imageBitmap's bitmap data to image's image data, cropped to the 818 828 // source rectangle with formatting. 819 auto tempBitmapData = createImageBuffer(scriptExecutionContext, imageData->size(), bufferRenderingMode );829 auto tempBitmapData = createImageBuffer(scriptExecutionContext, imageData->size(), bufferRenderingMode, toDestinationColorSpace(imageData->colorSpace())); 820 830 if (!tempBitmapData) { 821 831 resolveWithBlankImageBuffer(scriptExecutionContext, true, WTFMove(promise)); -
trunk/Source/WebCore/html/ImageBitmap.h
r280968 r282696 83 83 static void createPromise(ScriptExecutionContext&, Source&&, ImageBitmapOptions&&, int sx, int sy, int sw, int sh, Promise&&); 84 84 85 static RefPtr<ImageBuffer> createImageBuffer(ScriptExecutionContext&, const FloatSize&, RenderingMode, float resolutionScale = 1);85 static RefPtr<ImageBuffer> createImageBuffer(ScriptExecutionContext&, const FloatSize&, RenderingMode, DestinationColorSpace, float resolutionScale = 1); 86 86 87 static Ref<ImageBitmap> create(ScriptExecutionContext&, const IntSize& );87 static Ref<ImageBitmap> create(ScriptExecutionContext&, const IntSize&, DestinationColorSpace); 88 88 static Ref<ImageBitmap> create(std::optional<ImageBitmapBacking>&&); 89 89 -
trunk/Source/WebCore/html/OffscreenCanvas.cpp
r280084 r282696 277 277 278 278 if (!m_hasCreatedImageBuffer) { 279 auto buffer = ImageBitmap::createImageBuffer(*canvasBaseScriptExecutionContext(), size(), RenderingMode::Unaccelerated );279 auto buffer = ImageBitmap::createImageBuffer(*canvasBaseScriptExecutionContext(), size(), RenderingMode::Unaccelerated, m_context->colorSpace()); 280 280 return { ImageBitmap::create(ImageBitmapBacking(WTFMove(buffer))) }; 281 281 } … … 299 299 // create a new bitmap and paint into it. 300 300 301 auto imageBitmap = ImageBitmap::create(*canvasBaseScriptExecutionContext(), size() );301 auto imageBitmap = ImageBitmap::create(*canvasBaseScriptExecutionContext(), size(), DestinationColorSpace::SRGB()); 302 302 if (!imageBitmap->buffer()) 303 303 return { RefPtr<ImageBitmap> { nullptr } }; … … 493 493 return; 494 494 495 setImageBuffer(ImageBitmap::createImageBuffer(*canvasBaseScriptExecutionContext(), size(), RenderingMode::Unaccelerated)); 495 auto colorSpace = m_context ? m_context->colorSpace() : DestinationColorSpace::SRGB(); 496 setImageBuffer(ImageBitmap::createImageBuffer(*canvasBaseScriptExecutionContext(), size(), RenderingMode::Unaccelerated, colorSpace)); 496 497 } 497 498 -
trunk/Source/WebCore/platform/graphics/BitmapImage.cpp
r278253 r282696 658 658 } 659 659 660 DestinationColorSpace BitmapImage::colorSpace() 661 { 662 return nativeImage()->colorSpace(); 663 } 664 660 665 unsigned BitmapImage::decodeCountForTesting() const 661 666 { -
trunk/Source/WebCore/platform/graphics/BitmapImage.h
r278253 r282696 117 117 void stopAsyncDecodingQueue() { m_source->stopAsyncDecodingQueue(); } 118 118 119 DestinationColorSpace colorSpace() final; 120 119 121 WEBCORE_EXPORT unsigned decodeCountForTesting() const; 120 122 -
trunk/Source/WebCore/platform/graphics/DestinationColorSpace.cpp
r277994 r282696 109 109 } 110 110 111 std::optional<DestinationColorSpace> DestinationColorSpace::asRGB() const 112 { 113 #if USE(CG) 114 CGColorSpaceRef colorSpace = platformColorSpace(); 115 if (CGColorSpaceGetModel(colorSpace) == kCGColorSpaceModelIndexed) 116 colorSpace = CGColorSpaceGetBaseColorSpace(colorSpace); 117 118 if (CGColorSpaceGetModel(colorSpace) != kCGColorSpaceModelRGB) 119 return std::nullopt; 120 121 #if HAVE(CG_COLOR_SPACE_USES_EXTENDED_RANGE) 122 if (CGColorSpaceUsesExtendedRange(colorSpace)) 123 return std::nullopt; 124 #endif 125 126 return DestinationColorSpace(colorSpace); 127 #else 128 return *this; 129 #endif 130 } 131 111 132 TextStream& operator<<(TextStream& ts, const DestinationColorSpace& colorSpace) 112 133 { -
trunk/Source/WebCore/platform/graphics/DestinationColorSpace.h
r278340 r282696 45 45 PlatformColorSpaceValue platformColorSpace() const { return m_platformColorSpace.get(); } 46 46 47 WEBCORE_EXPORT std::optional<DestinationColorSpace> asRGB() const; 48 47 49 template<class Encoder> void encode(Encoder&) const; 48 50 template<class Decoder> static std::optional<DestinationColorSpace> decode(Decoder&); -
trunk/Source/WebCore/platform/graphics/Image.cpp
r279793 r282696 353 353 } 354 354 355 DestinationColorSpace Image::colorSpace() 356 { 357 return DestinationColorSpace::SRGB(); 358 } 359 355 360 void Image::dump(TextStream& ts) const 356 361 { -
trunk/Source/WebCore/platform/graphics/Image.h
r279793 r282696 137 137 const SharedBuffer* data() const { return m_encodedImageData.get(); } 138 138 139 virtual DestinationColorSpace colorSpace(); 140 139 141 // Animation begins whenever someone draws the image, so startAnimation() is not normally called. 140 142 // It will automatically pause once all observers no longer want to render the image anywhere. -
trunk/Source/WebKit/ChangeLog
r282693 r282696 1 2021-09-17 Cameron McCormack <heycam@apple.com> 2 3 Preserve color space when creating ImageBuffers for ImageBitmaps 4 https://bugs.webkit.org/show_bug.cgi?id=229022 5 <rdar://problem/81828459> 6 7 Reviewed by Sam Weinig. 8 9 * Shared/cg/ShareableBitmapCG.cpp: 10 (WebKit::ShareableBitmap::validateConfiguration): Factor out some 11 loging into DestinationColorSpace::asRGB. 12 1 13 2021-09-17 Chris Dumez <cdumez@apple.com> 2 14 -
trunk/Source/WebKit/Shared/cg/ShareableBitmapCG.cpp
r282626 r282696 44 44 return; 45 45 46 CGColorSpaceRef colorSpace = configuration.colorSpace->platformColorSpace(); 47 if (CGColorSpaceGetModel(colorSpace) == kCGColorSpaceModelIndexed) 48 colorSpace = CGColorSpaceGetBaseColorSpace(colorSpace); 49 50 if (CGColorSpaceGetModel(colorSpace) != kCGColorSpaceModelRGB) { 46 configuration.colorSpace = configuration.colorSpace->asRGB(); 47 48 if (!configuration.colorSpace) { 51 49 #if HAVE(CORE_GRAPHICS_EXTENDED_SRGB_COLOR_SPACE) 52 co lorSpace = extendedSRGBColorSpaceRef();50 configuration.colorSpace = DestinationColorSpace(extendedSRGBColorSpaceRef()); 53 51 #else 54 co lorSpace = sRGBColorSpaceRef();52 configuration.colorSpace = DestinationColorSpace::SRGB(); 55 53 #endif 56 54 } 57 58 configuration.colorSpace = DestinationColorSpace(colorSpace);59 55 } 60 56
Note: See TracChangeset
for help on using the changeset viewer.