Changeset 282696 in webkit


Ignore:
Timestamp:
Sep 17, 2021 2:42:50 PM (10 months ago)
Author:
Cameron McCormack
Message:

Preserve color space when creating ImageBuffers for ImageBitmaps
https://bugs.webkit.org/show_bug.cgi?id=229022
<rdar://problem/81828459>

Reviewed by Sam Weinig.

LayoutTests/imported/w3c:

  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob-expected.txt: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap-expected.txt: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData-expected.txt: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas-expected.txt: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned-expected.txt: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image-expected.txt: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html: Added.

Source/WebCore:

ImageBitmaps can be created with various sources of image data.
Currently, they always create an sRGB ImageBuffer to copy the
image data into. This patch tries to preserve the color space
of the source image data. Because ImageBuffer only works with 8 bit
RGBA data, other color space models (such as CMYK) get converted
to Display P3 if available, or sRGB otherwise. The rationale for
this is that ImageBitmaps are designed to be drawn into canvases,
and we currently only support sRGB and Display P3 for canvas backing
stores.

It's not ideal that we do the color space conversion, since it would
be better to delay the conversion until it's needed when drawing onto
the canvas. It's also not ideal that we can't preserve the pixel
format of the image data, which might be 16 bit color or floats. We
could support these only if ImageBuffer were extended to support them.
A different design for ImageBitmap where it can hold on to the image
data source directly (and support for structured cloning and worker
thread transferrance added) could also work. For now, we don't worry,
and accept the loss of color fidelity when downsampling or converting
from non-RGB color space models.

Support for structured cloning of ImageBitmaps with non-sRGB data
isn't added, but a test for this is. (This will need a way to
serialize the DestinationColorSpace.)

Tests: imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html

imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html
imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html
imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html
imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html
imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html

  • bindings/js/SerializedScriptValue.cpp:

(WebCore::CloneSerializer::dumpImageBitmap):
(WebCore::CloneDeserializer::readImageBitmap):

  • html/ImageBitmap.cpp:

(WebCore::ImageBitmap::create):
(WebCore::ImageBitmap::createImageBuffer):
(WebCore::ImageBitmap::resolveWithBlankImageBuffer):
(WebCore::ImageBitmap::createPromise):
(WebCore::ImageBitmap::createFromBuffer):

  • html/ImageBitmap.h:
  • html/OffscreenCanvas.cpp:

(WebCore::OffscreenCanvas::transferToImageBitmap):
(WebCore::OffscreenCanvas::createImageBuffer const):

  • platform/graphics/BitmapImage.cpp:

(WebCore::BitmapImage::colorSpace):

  • platform/graphics/BitmapImage.h:
  • platform/graphics/DestinationColorSpace.cpp:

(WebCore::DestinationColorSpace::asRGB const): New function that
abstracts out the behavior "tell me whether the color space is
appropriate for use with an 8 bit RGB buffer", which is common
to ImageBitmap and ShareableBitmapCG.

  • platform/graphics/DestinationColorSpace.h:
  • platform/graphics/Image.cpp:

(WebCore::Image::colorSpace):

  • platform/graphics/Image.h:

Source/WebKit:

  • Shared/cg/ShareableBitmapCG.cpp:

(WebKit::ShareableBitmap::validateConfiguration): Factor out some
loging into DestinationColorSpace::asRGB.

Source/WTF:

  • wtf/PlatformHave.h:

LayoutTests:

  • TestExpectations:
  • platform/ios-14/TestExpectations:
  • platform/ios/TestExpectations:
  • platform/mac/TestExpectations:
Location:
trunk
Files:
12 added
21 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r282695 r282696  
     12021-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
    1142021-09-17  Eric Hutchison  <ehutchison@apple.com>
    215
  • trunk/LayoutTests/TestExpectations

    r282636 r282696  
    52545254fast/canvas/canvas-color-space-display-p3.html [ Failure ]
    52555255imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Failure ]
     5256imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Failure ]
     5257imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Failure ]
     5258imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html [ Failure ]
     5259imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html [ Failure ]
     5260imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Failure ]
     5261imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html [ Failure ]
    52565262imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Failure ]
    52575263imported/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  
     12021-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
    1222021-09-17  Youenn Fablet  <youenn@apple.com>
    223
  • trunk/LayoutTests/platform/ios-14/TestExpectations

    r282634 r282696  
    7373fast/canvas/canvas-color-space-display-p3.html [ Failure ]
    7474imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Failure ]
     75imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Failure ]
     76imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Failure ]
     77imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html [ Failure ]
     78imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html [ Failure ]
     79imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Failure ]
     80imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html [ Failure ]
    7581imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Failure ]
    7682imported/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  
    34893489fast/canvas/canvas-color-space-display-p3.html [ Pass ]
    34903490imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Pass ]
     3491imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Pass ]
     3492imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Pass ]
     3493imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageData.html [ Pass ]
     3494imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-canvas.html [ Pass ]
     3495imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Pass ]
     3496imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-image.html [ Pass ]
    34913497imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Pass ]
    34923498imported/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  
    23522352[ Monterey+ ] fast/canvas/canvas-color-space-display-p3.html [ Pass ]
    23532353[ 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 ]
    23542360[ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html [ Pass ]
    23552361[ 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  
     12021-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
    1112021-09-17  Simon Fraser  <simon.fraser@apple.com>
    212
  • trunk/Source/WTF/wtf/PlatformHave.h

    r282632 r282696  
    11191119#define HAVE_CORE_ANIMATION_FIX_FOR_RADAR_78402035 1
    11201120#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  
     12021-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
    1672021-09-17  Simon Fraser  <simon.fraser@apple.com>
    268
  • trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp

    r282513 r282696  
    10831083        }
    10841084
     1085        // FIXME: Cloned ImageBitmaps should preserve their color space.
    10851086        PixelBufferFormat format { AlphaPremultiplication::Premultiplied, PixelFormat::RGBA8, DestinationColorSpace::SRGB() };
    10861087        const IntSize& logicalSize = buffer->logicalSize();
     
    31743175        imageDataSize.scale(resolutionScale);
    31753176
    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);
    31773178        if (!buffer) {
    31783179            fail();
  • trunk/Source/WebCore/html/ImageBitmap.cpp

    r280968 r282696  
    6868#endif
    6969
    70 Ref<ImageBitmap> ImageBitmap::create(ScriptExecutionContext& scriptExecutionContext, const IntSize& size)
    71 {
    72     return create({ createImageBuffer(scriptExecutionContext, size, bufferRenderingMode) });
     70Ref<ImageBitmap> ImageBitmap::create(ScriptExecutionContext& scriptExecutionContext, const IntSize& size, DestinationColorSpace colorSpace)
     71{
     72    return create({ createImageBuffer(scriptExecutionContext, size, bufferRenderingMode, colorSpace) });
    7373}
    7474
     
    7878}
    7979
    80 RefPtr<ImageBuffer> ImageBitmap::createImageBuffer(ScriptExecutionContext& scriptExecutionContext, const FloatSize& size, RenderingMode renderingMode, float resolutionScale)
    81 {
     80RefPtr<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
    8292    if (scriptExecutionContext.isDocument()) {
    8393        auto& document = downcast<Document>(scriptExecutionContext);
    8494        if (document.view() && document.view()->root()) {
    8595            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);
    8797        }
    8898    }
    8999
    90100    // 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);
    92102}
    93103
     
    246256    // Behavior isn't well specified, but WPT tests expect no Promise rejection (and of course no crashes).
    247257    // 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());
    249259
    250260    // 9. If the origin of image's image is not the same origin as the origin specified by the
     
    364374    }
    365375
    366     auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options);
    367     auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode);
    368376    auto imageForRender = cachedImage->imageForRenderer(imageElement->renderer());
    369377    if (!imageForRender) {
     
    372380    }
    373381
     382    auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options);
     383    auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode, imageForRender->colorSpace());
    374384    if (!bitmapData) {
    375385        resolveWithBlankImageBuffer(scriptExecutionContext, !taintsOrigin(*cachedImage), WTFMove(promise));
     
    431441    }
    432442
    433     auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options);
    434     auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode);
    435 
    436443    auto imageForRender = canvas.copiedImage();
    437444    if (!imageForRender) {
     
    439446        return;
    440447    }
     448
     449    auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options);
     450    auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode, imageForRender->colorSpace());
    441451
    442452    if (!bitmapData) {
     
    569579
    570580    auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options);
    571     auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode);
     581    auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode, existingImageBitmap->buffer()->colorSpace());
    572582
    573583    if (!bitmapData) {
     
    752762
    753763    auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options);
    754     auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode);
     764    auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode, image->colorSpace());
    755765    if (!bitmapData) {
    756766        promise.reject(InvalidStateError, "Cannot create an image buffer from the argument to createImageBitmap");
     
    796806
    797807    auto outputSize = outputSizeForSourceRectangle(sourceRectangle.returnValue(), options);
    798     auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode);
     808    auto bitmapData = createImageBuffer(scriptExecutionContext, outputSize, bufferRenderingMode, toDestinationColorSpace(imageData->colorSpace()));
    799809
    800810    if (!bitmapData) {
     
    817827    // 6.3. Set imageBitmap's bitmap data to image's image data, cropped to the
    818828    //      source rectangle with formatting.
    819     auto tempBitmapData = createImageBuffer(scriptExecutionContext, imageData->size(), bufferRenderingMode);
     829    auto tempBitmapData = createImageBuffer(scriptExecutionContext, imageData->size(), bufferRenderingMode, toDestinationColorSpace(imageData->colorSpace()));
    820830    if (!tempBitmapData) {
    821831        resolveWithBlankImageBuffer(scriptExecutionContext, true, WTFMove(promise));
  • trunk/Source/WebCore/html/ImageBitmap.h

    r280968 r282696  
    8383    static void createPromise(ScriptExecutionContext&, Source&&, ImageBitmapOptions&&, int sx, int sy, int sw, int sh, Promise&&);
    8484
    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);
    8686
    87     static Ref<ImageBitmap> create(ScriptExecutionContext&, const IntSize&);
     87    static Ref<ImageBitmap> create(ScriptExecutionContext&, const IntSize&, DestinationColorSpace);
    8888    static Ref<ImageBitmap> create(std::optional<ImageBitmapBacking>&&);
    8989
  • trunk/Source/WebCore/html/OffscreenCanvas.cpp

    r280084 r282696  
    277277
    278278        if (!m_hasCreatedImageBuffer) {
    279             auto buffer = ImageBitmap::createImageBuffer(*canvasBaseScriptExecutionContext(), size(), RenderingMode::Unaccelerated);
     279            auto buffer = ImageBitmap::createImageBuffer(*canvasBaseScriptExecutionContext(), size(), RenderingMode::Unaccelerated, m_context->colorSpace());
    280280            return { ImageBitmap::create(ImageBitmapBacking(WTFMove(buffer))) };
    281281        }
     
    299299        // create a new bitmap and paint into it.
    300300
    301         auto imageBitmap = ImageBitmap::create(*canvasBaseScriptExecutionContext(), size());
     301        auto imageBitmap = ImageBitmap::create(*canvasBaseScriptExecutionContext(), size(), DestinationColorSpace::SRGB());
    302302        if (!imageBitmap->buffer())
    303303            return { RefPtr<ImageBitmap> { nullptr } };
     
    493493        return;
    494494
    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));
    496497}
    497498
  • trunk/Source/WebCore/platform/graphics/BitmapImage.cpp

    r278253 r282696  
    658658}
    659659
     660DestinationColorSpace BitmapImage::colorSpace()
     661{
     662    return nativeImage()->colorSpace();
     663}
     664
    660665unsigned BitmapImage::decodeCountForTesting() const
    661666{
  • trunk/Source/WebCore/platform/graphics/BitmapImage.h

    r278253 r282696  
    117117    void stopAsyncDecodingQueue() { m_source->stopAsyncDecodingQueue(); }
    118118
     119    DestinationColorSpace colorSpace() final;
     120
    119121    WEBCORE_EXPORT unsigned decodeCountForTesting() const;
    120122
  • trunk/Source/WebCore/platform/graphics/DestinationColorSpace.cpp

    r277994 r282696  
    109109}
    110110
     111std::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
    111132TextStream& operator<<(TextStream& ts, const DestinationColorSpace& colorSpace)
    112133{
  • trunk/Source/WebCore/platform/graphics/DestinationColorSpace.h

    r278340 r282696  
    4545    PlatformColorSpaceValue platformColorSpace() const { return m_platformColorSpace.get(); }
    4646
     47    WEBCORE_EXPORT std::optional<DestinationColorSpace> asRGB() const;
     48
    4749    template<class Encoder> void encode(Encoder&) const;
    4850    template<class Decoder> static std::optional<DestinationColorSpace> decode(Decoder&);
  • trunk/Source/WebCore/platform/graphics/Image.cpp

    r279793 r282696  
    353353}
    354354
     355DestinationColorSpace Image::colorSpace()
     356{
     357    return DestinationColorSpace::SRGB();
     358}
     359
    355360void Image::dump(TextStream& ts) const
    356361{
  • trunk/Source/WebCore/platform/graphics/Image.h

    r279793 r282696  
    137137    const SharedBuffer* data() const { return m_encodedImageData.get(); }
    138138
     139    virtual DestinationColorSpace colorSpace();
     140
    139141    // Animation begins whenever someone draws the image, so startAnimation() is not normally called.
    140142    // It will automatically pause once all observers no longer want to render the image anywhere.
  • trunk/Source/WebKit/ChangeLog

    r282693 r282696  
     12021-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
    1132021-09-17  Chris Dumez  <cdumez@apple.com>
    214
  • trunk/Source/WebKit/Shared/cg/ShareableBitmapCG.cpp

    r282626 r282696  
    4444        return;
    4545
    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) {
    5149#if HAVE(CORE_GRAPHICS_EXTENDED_SRGB_COLOR_SPACE)
    52         colorSpace = extendedSRGBColorSpaceRef();
     50        configuration.colorSpace = DestinationColorSpace(extendedSRGBColorSpaceRef());
    5351#else
    54         colorSpace = sRGBColorSpaceRef();
     52        configuration.colorSpace = DestinationColorSpace::SRGB();
    5553#endif
    5654    }
    57 
    58     configuration.colorSpace = DestinationColorSpace(colorSpace);
    5955}
    6056
Note: See TracChangeset for help on using the changeset viewer.