Changeset 283531 in webkit


Ignore:
Timestamp:
Oct 4, 2021 7:32:56 PM (10 months ago)
Author:
Cameron McCormack
Message:

Choose an appropriate color space when converting an SVG image into a NativeImage for canvas drawImage
https://bugs.webkit.org/show_bug.cgi?id=231062
<rdar://problem/83752451>

Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

Add a test for drawImage() with an SVG image that has sRGB and Display
P3 colors.

Not adding tests for patterns pointing to SVG images for now, since
WebKit currently always taints the canvas in that case, or for
ImageBitmaps wrapping SVG images, since we always flatten them to sRGB
(and we don't track what content is inside the SVG to make a better
decision about what color space ImageBuffer to use).

  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https-expected.txt: Renamed from LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-expected.txt.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https.html: Renamed from LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3.js:
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Display-P3-0.7333-0-0.svg: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Display-P3-1-0-0.svg: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-BB0000.svg: Added.
  • web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-FF0000.svg: Added.

Source/WebCore:

When GPUP canvas is enabled, drawImage() with an SVG image is handled
by drawing into a NativeImage and then sending that to the GPUP. We
need to choose a color space for the NativeImage's ImageBuffer that
matches the canvas.

Once full SVG rendering is supported by the GPU process, we can undo
this code, as we'll no longer be using a NativeImage.

Test: imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https.html

  • html/canvas/CanvasRenderingContext2DBase.cpp:

(WebCore::CanvasRenderingContext2DBase::drawImage):
(WebCore::drawImageToContext):
(WebCore::CanvasRenderingContext2DBase::fullCanvasCompositedDrawImage):

  • platform/graphics/GraphicsContext.cpp:

(WebCore::GraphicsContext::drawImageForCanvas):

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

(WebCore::Image::drawForCanvas):

  • platform/graphics/Image.h:
  • platform/graphics/MediaPlayer.h:
  • svg/graphics/SVGImage.cpp:

(WebCore::SVGImage::drawForCanvasForContainer):
(WebCore::SVGImage::drawForContainer):
(WebCore::SVGImage::drawForContainerInternal):
(WebCore::SVGImage::nativeImage):
(WebCore::SVGImage::drawForCanvas):
(WebCore::SVGImage::draw):
(WebCore::SVGImage::drawInternal):
(WebCore::SVGImage::drawAsNativeImage):

  • svg/graphics/SVGImage.h:
  • svg/graphics/SVGImageForContainer.cpp:

(WebCore::SVGImageForContainer::drawForCanvas):

  • svg/graphics/SVGImageForContainer.h:

LayoutTests:

  • TestExpectations:
  • platform/ios-14/TestExpectations:
  • platform/ios/TestExpectations:
  • platform/mac/TestExpectations:
Location:
trunk
Files:
4 added
19 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r283529 r283531  
     12021-10-04  Cameron McCormack  <heycam@apple.com>
     2
     3        Choose an appropriate color space when converting an SVG image into a NativeImage for canvas drawImage
     4        https://bugs.webkit.org/show_bug.cgi?id=231062
     5        <rdar://problem/83752451>
     6
     7        Reviewed by Simon Fraser.
     8
     9        * TestExpectations:
     10        * platform/ios-14/TestExpectations:
     11        * platform/ios/TestExpectations:
     12        * platform/mac/TestExpectations:
     13
    1142021-10-04  Cameron McCormack  <heycam@apple.com>
    215
  • trunk/LayoutTests/TestExpectations

    r283525 r283531  
    50825082fast/canvas/canvas-color-space-display-p3-ImageData.html [ Failure ]
    50835083fast/canvas/canvas-color-space-display-p3.html [ ImageOnlyFailure ]
    5084 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Failure ]
     5084imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https.html [ Failure ]
    50855085imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Failure ]
    50865086imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Failure ]
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r283525 r283531  
     12021-10-04  Cameron McCormack  <heycam@apple.com>
     2
     3        Choose an appropriate color space when converting an SVG image into a NativeImage for canvas drawImage
     4        https://bugs.webkit.org/show_bug.cgi?id=231062
     5        <rdar://problem/83752451>
     6
     7        Reviewed by Simon Fraser.
     8
     9        Add a test for drawImage() with an SVG image that has sRGB and Display
     10        P3 colors.
     11
     12        Not adding tests for patterns pointing to SVG images for now, since
     13        WebKit currently always taints the canvas in that case, or for
     14        ImageBitmaps wrapping SVG images, since we always flatten them to sRGB
     15        (and we don't track what content is inside the SVG to make a better
     16        decision about what color space ImageBuffer to use).
     17
     18        * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https-expected.txt: Renamed from LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-expected.txt.
     19        * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https.html: Renamed from LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html.
     20        * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3.js:
     21        * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Display-P3-0.7333-0-0.svg: Added.
     22        * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/Display-P3-1-0-0.svg: Added.
     23        * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-BB0000.svg: Added.
     24        * web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/resources/sRGB-FF0000.svg: Added.
     25
    1262021-10-04  Tim Nguyen  <ntim@apple.com>
    227
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https-expected.txt

    r283529 r283531  
    208208PASS Adobe-RGB-BBBC00000000CCCC.png, Context display-p3, ImageData display-p3, scaleImage=false
    209209PASS Adobe-RGB-BBBC00000000CCCC.png, Context display-p3, ImageData display-p3, scaleImage=true
     210PASS sRGB-FF0000.svg, Context srgb, ImageData srgb, scaleImage=false
     211PASS sRGB-FF0000.svg, Context srgb, ImageData srgb, scaleImage=true
     212PASS sRGB-FF0000.svg, Context srgb, ImageData display-p3, scaleImage=false
     213PASS sRGB-FF0000.svg, Context srgb, ImageData display-p3, scaleImage=true
     214PASS sRGB-FF0000.svg, Context display-p3, ImageData srgb, scaleImage=false
     215PASS sRGB-FF0000.svg, Context display-p3, ImageData srgb, scaleImage=true
     216PASS sRGB-FF0000.svg, Context display-p3, ImageData display-p3, scaleImage=false
     217PASS sRGB-FF0000.svg, Context display-p3, ImageData display-p3, scaleImage=true
     218PASS sRGB-BB0000.svg, Context srgb, ImageData srgb, scaleImage=false
     219PASS sRGB-BB0000.svg, Context srgb, ImageData srgb, scaleImage=true
     220PASS sRGB-BB0000.svg, Context srgb, ImageData display-p3, scaleImage=false
     221PASS sRGB-BB0000.svg, Context srgb, ImageData display-p3, scaleImage=true
     222PASS sRGB-BB0000.svg, Context display-p3, ImageData srgb, scaleImage=false
     223PASS sRGB-BB0000.svg, Context display-p3, ImageData srgb, scaleImage=true
     224PASS sRGB-BB0000.svg, Context display-p3, ImageData display-p3, scaleImage=false
     225PASS sRGB-BB0000.svg, Context display-p3, ImageData display-p3, scaleImage=true
     226PASS Display-P3-1-0-0.svg, Context srgb, ImageData srgb, scaleImage=false
     227PASS Display-P3-1-0-0.svg, Context srgb, ImageData srgb, scaleImage=true
     228PASS Display-P3-1-0-0.svg, Context srgb, ImageData display-p3, scaleImage=false
     229PASS Display-P3-1-0-0.svg, Context srgb, ImageData display-p3, scaleImage=true
     230PASS Display-P3-1-0-0.svg, Context display-p3, ImageData srgb, scaleImage=false
     231PASS Display-P3-1-0-0.svg, Context display-p3, ImageData srgb, scaleImage=true
     232PASS Display-P3-1-0-0.svg, Context display-p3, ImageData display-p3, scaleImage=false
     233PASS Display-P3-1-0-0.svg, Context display-p3, ImageData display-p3, scaleImage=true
     234PASS Display-P3-0.7333-0-0.svg, Context srgb, ImageData srgb, scaleImage=false
     235PASS Display-P3-0.7333-0-0.svg, Context srgb, ImageData srgb, scaleImage=true
     236PASS Display-P3-0.7333-0-0.svg, Context srgb, ImageData display-p3, scaleImage=false
     237PASS Display-P3-0.7333-0-0.svg, Context srgb, ImageData display-p3, scaleImage=true
     238PASS Display-P3-0.7333-0-0.svg, Context display-p3, ImageData srgb, scaleImage=false
     239PASS Display-P3-0.7333-0-0.svg, Context display-p3, ImageData srgb, scaleImage=true
     240PASS Display-P3-0.7333-0-0.svg, Context display-p3, ImageData display-p3, scaleImage=false
     241PASS Display-P3-0.7333-0-0.svg, Context display-p3, ImageData display-p3, scaleImage=true
    210242
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https.html

    r283529 r283531  
    77// sRGB and Display P3 canvases works, by reading pixels with getImageData()
    88// as sRGB and Display P3 values.
    9 for (let [filename, expectedPixels] of Object.entries(imageTests)) {
     9for (let [filename, expectedPixels] of Object.entries({...imageTests, ...svgImageTests})) {
    1010    for (let contextColorSpace of ["srgb", "display-p3"]) {
    1111        for (let imageDataColorSpace of ["srgb", "display-p3"]) {
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3.js

    r282630 r283531  
    1 // Each image:
     1// Each PNG:
    22//  * is 2x2 and has a single color
    33//  * has a filename that indicates its contents:
     
    175175        "display-p3 srgb": [219, 0, 1, 204],
    176176        "display-p3 display-p3": [201, 42, 29, 204],
     177    },
     178};
     179
     180const svgImageTests = {
     181    // SVG source images
     182
     183    "sRGB-FF0000.svg": {
     184        "srgb srgb": [255, 0, 0, 255],
     185        "srgb display-p3": [234, 51, 35, 255],
     186        "display-p3 srgb": [255, 0, 0, 255],
     187        "display-p3 display-p3": [234, 51, 35, 255],
     188    },
     189    "sRGB-BB0000.svg": {
     190        "srgb srgb": [187, 0, 0, 255],
     191        "srgb display-p3": [171, 35, 23, 255],
     192        "display-p3 srgb": [187, 1, 0, 255],
     193        "display-p3 display-p3": [171, 35, 23, 255],
     194    },
     195
     196    "Display-P3-1-0-0.svg": {
     197        "srgb srgb": [255, 0, 0, 255],
     198        "srgb display-p3": [234, 51, 35, 255],
     199        "display-p3 srgb": [255, 0, 0, 255],
     200        "display-p3 display-p3": [255, 0, 0, 255],
     201    },
     202    "Display-P3-0.7333-0-0.svg": {
     203        "srgb srgb": [205, 0, 0, 255],
     204        "srgb display-p3": [188, 39, 26, 255],
     205        "display-p3 srgb": [205, 0, 0, 255],
     206        "display-p3 display-p3": [187, 0, 0, 255],
    177207    },
    178208};
  • trunk/LayoutTests/platform/ios-14/TestExpectations

    r283523 r283531  
    6666fast/canvas/canvas-color-space-display-p3-ImageData.html [ Failure ]
    6767fast/canvas/canvas-color-space-display-p3.html [ ImageOnlyFailure ]
    68 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Failure ]
     68imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https.html [ Failure ]
    6969imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Failure ]
    7070imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Failure ]
  • trunk/LayoutTests/platform/ios-simulator/TestExpectations

    r283529 r283531  
    6262fast/canvas/canvas-color-space-display-p3-ImageData.html [ Failure ]
    6363fast/canvas/canvas-color-space-display-p3.html [ ImageOnlyFailure ]
    64 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Failure ]
     64imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https.html [ Failure ]
    6565imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Failure ]
    6666imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Failure ]
  • trunk/LayoutTests/platform/ios/TestExpectations

    r283523 r283531  
    34873487fast/canvas/canvas-color-space-display-p3-ImageData.html [ Pass ]
    34883488fast/canvas/canvas-color-space-display-p3.html [ Pass ]
    3489 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Pass ]
     3489imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https.html [ Pass ]
    34903490imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Pass ]
    34913491imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Pass ]
  • trunk/LayoutTests/platform/mac/TestExpectations

    r283406 r283531  
    23532353[ Monterey+ ] fast/canvas/canvas-color-space-display-p3-ImageData.html [ Pass ]
    23542354[ Monterey+ ] fast/canvas/canvas-color-space-display-p3.html [ Pass ]
    2355 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Pass ]
     2355[ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https.html [ Pass ]
    23562356[ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-Blob.html [ Pass ]
    23572357[ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-ImageBitmap.html [ Pass ]
  • trunk/Source/WebCore/ChangeLog

    r283526 r283531  
     12021-10-04  Cameron McCormack  <heycam@apple.com>
     2
     3        Choose an appropriate color space when converting an SVG image into a NativeImage for canvas drawImage
     4        https://bugs.webkit.org/show_bug.cgi?id=231062
     5        <rdar://problem/83752451>
     6
     7        Reviewed by Simon Fraser.
     8
     9        When GPUP canvas is enabled, drawImage() with an SVG image is handled
     10        by drawing into a NativeImage and then sending that to the GPUP. We
     11        need to choose a color space for the NativeImage's ImageBuffer that
     12        matches the canvas.
     13
     14        Once full SVG rendering is supported by the GPU process, we can undo
     15        this code, as we'll no longer be using a NativeImage.
     16
     17        Test: imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.https.html
     18
     19        * html/canvas/CanvasRenderingContext2DBase.cpp:
     20        (WebCore::CanvasRenderingContext2DBase::drawImage):
     21        (WebCore::drawImageToContext):
     22        (WebCore::CanvasRenderingContext2DBase::fullCanvasCompositedDrawImage):
     23        * platform/graphics/GraphicsContext.cpp:
     24        (WebCore::GraphicsContext::drawImageForCanvas):
     25        * platform/graphics/GraphicsContext.h:
     26        * platform/graphics/Image.cpp:
     27        (WebCore::Image::drawForCanvas):
     28        * platform/graphics/Image.h:
     29        * platform/graphics/MediaPlayer.h:
     30        * svg/graphics/SVGImage.cpp:
     31        (WebCore::SVGImage::drawForCanvasForContainer):
     32        (WebCore::SVGImage::drawForContainer):
     33        (WebCore::SVGImage::drawForContainerInternal):
     34        (WebCore::SVGImage::nativeImage):
     35        (WebCore::SVGImage::drawForCanvas):
     36        (WebCore::SVGImage::draw):
     37        (WebCore::SVGImage::drawInternal):
     38        (WebCore::SVGImage::drawAsNativeImage):
     39        * svg/graphics/SVGImage.h:
     40        * svg/graphics/SVGImageForContainer.cpp:
     41        (WebCore::SVGImageForContainer::drawForCanvas):
     42        * svg/graphics/SVGImageForContainer.h:
     43
    1442021-10-04  Jer Noble  <jer.noble@apple.com>
    245
  • trunk/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp

    r282920 r283531  
    15711571    bool repaintEntireCanvas = false;
    15721572    if (rectContainsCanvas(normalizedDstRect)) {
    1573         c->drawImage(*image, normalizedDstRect, normalizedSrcRect, options);
     1573        c->drawImageForCanvas(*image, normalizedDstRect, normalizedSrcRect, options, colorSpace());
    15741574        repaintEntireCanvas = true;
    15751575    } else if (isFullCanvasCompositeMode(op)) {
     
    15781578    } else if (op == CompositeOperator::Copy) {
    15791579        clearCanvas();
    1580         c->drawImage(*image, normalizedDstRect, normalizedSrcRect, options);
     1580        c->drawImageForCanvas(*image, normalizedDstRect, normalizedSrcRect, options, colorSpace());
    15811581        repaintEntireCanvas = true;
    15821582    } else
    1583         c->drawImage(*image, normalizedDstRect, normalizedSrcRect, options);
     1583        c->drawImageForCanvas(*image, normalizedDstRect, normalizedSrcRect, options, colorSpace());
    15841584
    15851585    if (isEntireBackingStoreDirty())
     
    18431843}
    18441844
    1845 static void drawImageToContext(Image& image, GraphicsContext& context, const FloatRect& dest, const FloatRect& src, const ImagePaintingOptions& options)
    1846 {
    1847     context.drawImage(image, dest, src, options);
    1848 }
    1849 
    1850 static void drawImageToContext(ImageBuffer& imageBuffer, GraphicsContext& context, const FloatRect& dest, const FloatRect& src, const ImagePaintingOptions& options)
     1845static void drawImageToContext(Image& image, GraphicsContext& context, const FloatRect& dest, const FloatRect& src, const ImagePaintingOptions& options, DestinationColorSpace colorSpace)
     1846{
     1847    context.drawImageForCanvas(image, dest, src, options, colorSpace);
     1848}
     1849
     1850static void drawImageToContext(ImageBuffer& imageBuffer, GraphicsContext& context, const FloatRect& dest, const FloatRect& src, const ImagePaintingOptions& options, DestinationColorSpace)
    18511851{
    18521852    context.drawImageBuffer(imageBuffer, dest, src, options);
     
    18791879    buffer->context().translate(croppedOffset);
    18801880    buffer->context().concatCTM(effectiveTransform);
    1881     drawImageToContext(image, buffer->context(), adjustedDest, src, { CompositeOperator::SourceOver });
     1881    drawImageToContext(image, buffer->context(), adjustedDest, src, { CompositeOperator::SourceOver }, colorSpace());
    18821882
    18831883    compositeBuffer(*buffer, bufferRect, op);
  • trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp

    r283443 r283531  
    546546}
    547547
     548ImageDrawResult GraphicsContext::drawImageForCanvas(Image& image, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& options, DestinationColorSpace canvasColorSpace)
     549{
     550    InterpolationQualityMaintainer interpolationQualityForThisScope(*this, options.interpolationQuality());
     551    return image.drawForCanvas(*this, destination, source, options, canvasColorSpace);
     552}
     553
    548554ImageDrawResult GraphicsContext::drawTiledImage(Image& image, const FloatRect& destination, const FloatPoint& source, const FloatSize& tileSize, const FloatSize& spacing, const ImagePaintingOptions& options)
    549555{
  • trunk/Source/WebCore/platform/graphics/GraphicsContext.h

    r283273 r283531  
    431431    WEBCORE_EXPORT virtual ImageDrawResult drawImage(Image&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& = { ImageOrientation::FromImage });
    432432
     433    virtual ImageDrawResult drawImageForCanvas(Image&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions&, DestinationColorSpace canvasColorSpace);
     434
    433435    WEBCORE_EXPORT virtual ImageDrawResult drawTiledImage(Image&, const FloatRect& destination, const FloatPoint& source, const FloatSize& tileSize, const FloatSize& spacing, const ImagePaintingOptions& = { });
    434436    WEBCORE_EXPORT virtual ImageDrawResult drawTiledImage(Image&, const FloatRect& destination, const FloatRect& source, const FloatSize& tileScaleFactor, Image::TileRule, Image::TileRule, const ImagePaintingOptions& = { });
  • trunk/Source/WebCore/platform/graphics/Image.cpp

    r282696 r283531  
    154154}
    155155
     156ImageDrawResult Image::drawForCanvas(GraphicsContext& context, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions& options, DestinationColorSpace)
     157{
     158    return draw(context, dstRect, srcRect, options);
     159}
     160
    156161ImageDrawResult Image::drawTiled(GraphicsContext& ctxt, const FloatRect& destRect, const FloatPoint& srcPoint, const FloatSize& scaledTileSize, const FloatSize& spacing, const ImagePaintingOptions& options)
    157162{
  • trunk/Source/WebCore/platform/graphics/Image.h

    r282696 r283531  
    202202#endif
    203203    virtual ImageDrawResult draw(GraphicsContext&, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions& = { }) = 0;
     204    virtual ImageDrawResult drawForCanvas(GraphicsContext&, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions&, DestinationColorSpace canvasColorSpace);
    204205    ImageDrawResult drawTiled(GraphicsContext&, const FloatRect& dstRect, const FloatPoint& srcPoint, const FloatSize& tileSize, const FloatSize& spacing, const ImagePaintingOptions& = { });
    205206    ImageDrawResult drawTiled(GraphicsContext&, const FloatRect& dstRect, const FloatRect& srcRect, const FloatSize& tileScaleFactor, TileRule hRule, TileRule vRule, const ImagePaintingOptions& = { });
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.h

    r283237 r283531  
    6666class CDMInstance;
    6767class CachedResourceLoader;
     68class DestinationColorSpace;
    6869class GraphicsContextGL;
    6970class GraphicsContext;
  • trunk/Source/WebCore/svg/graphics/SVGImage.cpp

    r282799 r283531  
    177177}
    178178
    179 ImageDrawResult SVGImage::drawForContainer(GraphicsContext& context, const FloatSize containerSize, float containerZoom, const URL& initialFragmentURL, const FloatRect& dstRect,
    180     const FloatRect& srcRect, const ImagePaintingOptions& options)
     179ImageDrawResult SVGImage::drawForCanvasForContainer(GraphicsContext& context, const FloatSize containerSize, float containerZoom, const URL& initialFragmentURL, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions& options, DestinationColorSpace canvasColorSpace)
     180{
     181    return drawForContainerInternal(context, containerSize, containerZoom, initialFragmentURL, dstRect, srcRect, options, canvasColorSpace);
     182}
     183
     184ImageDrawResult SVGImage::drawForContainer(GraphicsContext& context, const FloatSize containerSize, float containerZoom, const URL& initialFragmentURL, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions& options)
     185{
     186    return drawForContainerInternal(context, containerSize, containerZoom, initialFragmentURL, dstRect, srcRect, options, DestinationColorSpace::SRGB());
     187}
     188
     189ImageDrawResult SVGImage::drawForContainerInternal(GraphicsContext& context, const FloatSize containerSize, float containerZoom, const URL& initialFragmentURL, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions& options, DestinationColorSpace intermediateColorSpace)
    181190{
    182191    if (!m_page)
     
    202211    frameView()->scrollToFragment(initialFragmentURL);
    203212
    204     ImageDrawResult result = draw(context, dstRect, scaledSrc, options);
     213    ImageDrawResult result = drawInternal(context, dstRect, scaledSrc, options, intermediateColorSpace);
    205214
    206215    setImageObserver(observer);
     
    215224RefPtr<NativeImage> SVGImage::nativeImage(const GraphicsContext*)
    216225{
    217     return nativeImage(size(), FloatRect(FloatPoint(), size()));
    218 }
    219 
    220 RefPtr<NativeImage> SVGImage::nativeImage(const FloatSize& imageSize, const FloatRect& sourceRect)
     226    return nativeImage(size(), FloatRect(FloatPoint(), size()), DestinationColorSpace::SRGB());
     227}
     228
     229RefPtr<NativeImage> SVGImage::nativeImage(const FloatSize& imageSize, const FloatRect& sourceRect, DestinationColorSpace colorSpace)
    221230{
    222231    if (!m_page)
    223232        return nullptr;
    224233
    225     auto imageBuffer = ImageBuffer::create(imageSize, RenderingMode::Unaccelerated, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8);
     234    auto imageBuffer = ImageBuffer::create(imageSize, RenderingMode::Unaccelerated, 1, colorSpace, PixelFormat::BGRA8);
    226235    if (!imageBuffer)
    227236        return nullptr;
     
    276285}
    277286
     287ImageDrawResult SVGImage::drawForCanvas(GraphicsContext& context, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions& options, DestinationColorSpace canvasColorSpace)
     288{
     289    return drawInternal(context, dstRect, srcRect, options, canvasColorSpace);
     290}
     291
    278292ImageDrawResult SVGImage::draw(GraphicsContext& context, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions& options)
     293{
     294    return drawInternal(context, dstRect, srcRect, options, DestinationColorSpace::SRGB());
     295}
     296
     297ImageDrawResult SVGImage::drawInternal(GraphicsContext& context, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions& options, DestinationColorSpace intermediateColorSpace)
    279298{
    280299    if (!m_page)
     
    284303        // Display list drawing can't handle arbitrary DOM content.
    285304        // FIXME https://bugs.webkit.org/show_bug.cgi?id=227748: Remove this when it can.
    286         return drawAsNativeImage(context, dstRect, srcRect, options);
     305        return drawAsNativeImage(context, dstRect, srcRect, options, intermediateColorSpace);
    287306    }
    288307
     
    337356
    338357
    339 ImageDrawResult SVGImage::drawAsNativeImage(GraphicsContext& context, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& options)
     358ImageDrawResult SVGImage::drawAsNativeImage(GraphicsContext& context, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& options, DestinationColorSpace colorSpace)
    340359{
    341360    ASSERT(!context.hasPlatformContext());
    342361
    343362    auto rectInNativeImage = FloatRect { { }, destination.size() };
    344     auto nativeImage = this->nativeImage(rectInNativeImage.size(), source);
     363    auto nativeImage = this->nativeImage(rectInNativeImage.size(), source, colorSpace);
    345364    if (!nativeImage)
    346365        return ImageDrawResult::DidNothing;
  • trunk/Source/WebCore/svg/graphics/SVGImage.h

    r279793 r283531  
    8989    RefPtr<NativeImage> nativeImageForCurrentFrame(const GraphicsContext* = nullptr) final;
    9090    RefPtr<NativeImage> nativeImage(const GraphicsContext* = nullptr) final;
    91     RefPtr<NativeImage> nativeImage(const FloatSize& imageSize, const FloatRect& sourceRect);
     91    RefPtr<NativeImage> nativeImage(const FloatSize& imageSize, const FloatRect& sourceRect, DestinationColorSpace);
    9292
    9393    void startAnimationTimerFired();
     
    9595    WEBCORE_EXPORT explicit SVGImage(ImageObserver&);
    9696    ImageDrawResult draw(GraphicsContext&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& = { }) final;
    97     ImageDrawResult drawAsNativeImage(GraphicsContext&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& = { });
     97    ImageDrawResult drawForCanvas(GraphicsContext&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions&, DestinationColorSpace) final;
     98    ImageDrawResult drawAsNativeImage(GraphicsContext&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions&, DestinationColorSpace);
    9899    ImageDrawResult drawForContainer(GraphicsContext&, const FloatSize containerSize, float containerZoom, const URL& initialFragmentURL, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions& = { });
     100    ImageDrawResult drawForContainerInternal(GraphicsContext&, const FloatSize containerSize, float containerZoom, const URL& initialFragmentURL, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions&, DestinationColorSpace);
     101    ImageDrawResult drawInternal(GraphicsContext&, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions&, DestinationColorSpace);
     102    ImageDrawResult drawForCanvasForContainer(GraphicsContext&, const FloatSize containerSize, float containerZoom, const URL& initialFragmentURL, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions&, DestinationColorSpace);
    99103    void drawPatternForContainer(GraphicsContext&, const FloatSize& containerSize, float containerZoom, const URL& initialFragmentURL, const FloatRect& srcRect, const AffineTransform&, const FloatPoint& phase, const FloatSize& spacing, const FloatRect&, const ImagePaintingOptions& = { });
    100104
  • trunk/Source/WebCore/svg/graphics/SVGImageForContainer.cpp

    r279793 r283531  
    4949}
    5050
     51ImageDrawResult SVGImageForContainer::drawForCanvas(GraphicsContext& context, const FloatRect& dstRect, const FloatRect& srcRect, const ImagePaintingOptions& options, DestinationColorSpace canvasColorSpace)
     52{
     53    return m_image->drawForCanvasForContainer(context, m_containerSize, m_containerZoom, m_initialFragmentURL, dstRect, srcRect, options, canvasColorSpace);
     54}
     55
    5156void SVGImageForContainer::drawPattern(GraphicsContext& context, const FloatRect& dstRect, const FloatRect& srcRect, const AffineTransform& patternTransform,
    5257    const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& options)
  • trunk/Source/WebCore/svg/graphics/SVGImageForContainer.h

    r279793 r283531  
    5555
    5656    ImageDrawResult draw(GraphicsContext&, const FloatRect&, const FloatRect&, const ImagePaintingOptions& = { }) final;
     57    ImageDrawResult drawForCanvas(GraphicsContext&, const FloatRect&, const FloatRect&, const ImagePaintingOptions&, DestinationColorSpace) final;
    5758
    5859    void drawPattern(GraphicsContext&, const FloatRect&, const FloatRect&, const AffineTransform&, const FloatPoint&, const FloatSize&, const ImagePaintingOptions& = { }) final;
Note: See TracChangeset for help on using the changeset viewer.