Title: [283827] branches/safari-612-branch
Revision
283827
Author
[email protected]
Date
2021-10-08 12:44:23 -0700 (Fri, 08 Oct 2021)

Log Message

Cherry-pick r282634. rdar://problem/83957287

    Preserve canvas color space when producing JPEGs from toDataURL/toBlob
    https://bugs.webkit.org/show_bug.cgi?id=230209
    <rdar://82948457>

    Reviewed by Sam Weinig.

    LayoutTests/imported/w3c:

    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas-expected.txt: Added.
    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html: Copied from LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html.
    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas-expected.txt:
    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html:
    * web-platform-tests/html/canvas/tools/yaml/element/color_space.yaml:

    Source/WebCore:

    Test: imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html

    * platform/graphics/cg/ImageBufferCGBackend.cpp:
    (WebCore::colorSpaceForBitmap): Return an appropriate color space for
    performing any graphics operations on ImageBuffers (such as scaling or
    cropping, or compositing on top of solid colors) becore encoding.
    (WebCore::createBitmapImageAfterScalingIfNeeded):
    (WebCore::ImageBufferCGBackend::copyCGImageForEncoding const):

    LayoutTests:

    * TestExpectations:
    * platform/ios-14/TestExpectations:
    * platform/ios/TestExpectations:
    * platform/mac/TestExpectations:

    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@282634 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Modified Paths

Added Paths

Diff

Modified: branches/safari-612-branch/LayoutTests/ChangeLog (283826 => 283827)


--- branches/safari-612-branch/LayoutTests/ChangeLog	2021-10-08 19:44:16 UTC (rev 283826)
+++ branches/safari-612-branch/LayoutTests/ChangeLog	2021-10-08 19:44:23 UTC (rev 283827)
@@ -1,5 +1,56 @@
 2021-10-08  Russell Epstein  <[email protected]>
 
+        Cherry-pick r282634. rdar://problem/83957287
+
+    Preserve canvas color space when producing JPEGs from toDataURL/toBlob
+    https://bugs.webkit.org/show_bug.cgi?id=230209
+    <rdar://82948457>
+    
+    Reviewed by Sam Weinig.
+    
+    LayoutTests/imported/w3c:
+    
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas-expected.txt: Added.
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html: Copied from LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html.
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas-expected.txt:
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html:
+    * web-platform-tests/html/canvas/tools/yaml/element/color_space.yaml:
+    
+    Source/WebCore:
+    
+    Test: imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html
+    
+    * platform/graphics/cg/ImageBufferCGBackend.cpp:
+    (WebCore::colorSpaceForBitmap): Return an appropriate color space for
+    performing any graphics operations on ImageBuffers (such as scaling or
+    cropping, or compositing on top of solid colors) becore encoding.
+    (WebCore::createBitmapImageAfterScalingIfNeeded):
+    (WebCore::ImageBufferCGBackend::copyCGImageForEncoding const):
+    
+    LayoutTests:
+    
+    * TestExpectations:
+    * platform/ios-14/TestExpectations:
+    * platform/ios/TestExpectations:
+    * platform/mac/TestExpectations:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@282634 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-09-16  Cameron McCormack  <[email protected]>
+
+            Preserve canvas color space when producing JPEGs from toDataURL/toBlob
+            https://bugs.webkit.org/show_bug.cgi?id=230209
+            <rdar://82948457>
+
+            Reviewed by Sam Weinig.
+
+            * TestExpectations:
+            * platform/ios-14/TestExpectations:
+            * platform/ios/TestExpectations:
+            * platform/mac/TestExpectations:
+
+2021-10-08  Russell Epstein  <[email protected]>
+
         Cherry-pick r282626. rdar://problem/83956767
 
     Support drawImage with a wide gamut image painting into a display-p3 canvas

Modified: branches/safari-612-branch/LayoutTests/TestExpectations (283826 => 283827)


--- branches/safari-612-branch/LayoutTests/TestExpectations	2021-10-08 19:44:16 UTC (rev 283826)
+++ branches/safari-612-branch/LayoutTests/TestExpectations	2021-10-08 19:44:23 UTC (rev 283827)
@@ -5116,6 +5116,7 @@
 # display-p3 canvas and ImageData are Cocoa only for now.
 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Failure ]
 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-settings.html [ Failure ]
+imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html [ Failure ]
 
 webkit.org/b/226942 imported/w3c/web-platform-tests/webaudio/the-audio-api/the-audiobuffersourcenode-interface/active-processing.https.html [ Pass Failure ]
 

Modified: branches/safari-612-branch/LayoutTests/imported/w3c/ChangeLog (283826 => 283827)


--- branches/safari-612-branch/LayoutTests/imported/w3c/ChangeLog	2021-10-08 19:44:16 UTC (rev 283826)
+++ branches/safari-612-branch/LayoutTests/imported/w3c/ChangeLog	2021-10-08 19:44:23 UTC (rev 283827)
@@ -1,5 +1,57 @@
 2021-10-08  Russell Epstein  <[email protected]>
 
+        Cherry-pick r282634. rdar://problem/83957287
+
+    Preserve canvas color space when producing JPEGs from toDataURL/toBlob
+    https://bugs.webkit.org/show_bug.cgi?id=230209
+    <rdar://82948457>
+    
+    Reviewed by Sam Weinig.
+    
+    LayoutTests/imported/w3c:
+    
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas-expected.txt: Added.
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html: Copied from LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html.
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas-expected.txt:
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html:
+    * web-platform-tests/html/canvas/tools/yaml/element/color_space.yaml:
+    
+    Source/WebCore:
+    
+    Test: imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html
+    
+    * platform/graphics/cg/ImageBufferCGBackend.cpp:
+    (WebCore::colorSpaceForBitmap): Return an appropriate color space for
+    performing any graphics operations on ImageBuffers (such as scaling or
+    cropping, or compositing on top of solid colors) becore encoding.
+    (WebCore::createBitmapImageAfterScalingIfNeeded):
+    (WebCore::ImageBufferCGBackend::copyCGImageForEncoding const):
+    
+    LayoutTests:
+    
+    * TestExpectations:
+    * platform/ios-14/TestExpectations:
+    * platform/ios/TestExpectations:
+    * platform/mac/TestExpectations:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@282634 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-09-16  Cameron McCormack  <[email protected]>
+
+            Preserve canvas color space when producing JPEGs from toDataURL/toBlob
+            https://bugs.webkit.org/show_bug.cgi?id=230209
+            <rdar://82948457>
+
+            Reviewed by Sam Weinig.
+
+            * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas-expected.txt: Added.
+            * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html: Copied from LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html.
+            * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas-expected.txt:
+            * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html:
+            * web-platform-tests/html/canvas/tools/yaml/element/color_space.yaml:
+
+2021-10-08  Russell Epstein  <[email protected]>
+
         Cherry-pick r282626. rdar://problem/83956767
 
     Support drawImage with a wide gamut image painting into a display-p3 canvas

Added: branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas-expected.txt (0 => 283827)


--- branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas-expected.txt	                        (rev 0)
+++ branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas-expected.txt	2021-10-08 19:44:23 UTC (rev 283827)
@@ -0,0 +1,6 @@
+2d.color.space.p3.toDataURL.jpeg.p3.canvas
+test if toDataURL('image/jpeg') returns p3 data from canvas with p3 color space
+Actual output:
+
+PASS test if toDataURL('image/jpeg') returns p3 data from canvas with p3 color space
+

Copied: branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html (from rev 283826, branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html) (0 => 283827)


--- branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html	                        (rev 0)
+++ branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html	2021-10-08 19:44:23 UTC (rev 283827)
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<title>Canvas test: 2d.color.space.p3.toDataURL.jpeg.p3.canvas</title>
+<script src=""
+<script src=""
+<script src=""
+<link rel="stylesheet" href=""
+<body class="show_output">
+
+<h1>2d.color.space.p3.toDataURL.jpeg.p3.canvas</h1>
+<p class="desc">test if toDataURL('image/jpeg') returns p3 data from canvas with p3 color space</p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+
+<ul id="d"></ul>
+<script>
+var t = async_test("test if toDataURL('image/jpeg') returns p3 data from canvas with p3 color space");
+_addTest(function(canvas, ctx) {
+
+ctx.fillStyle = "rgba(155, 27, 27, 1)";
+ctx.fillRect(0, 0, 1, 1);
+ctx.fillStyle = "rgba(27, 155, 27, 0)";
+ctx.fillRect(1, 0, 1, 1);
+ctx.fillStyle = "rgba(27, 27, 155, 0.5)";
+ctx.fillRect(0, 1, 1, 1);
+ctx.fillStyle = "rgba(27, 27, 27, 0.5)";
+ctx.fillRect(1, 1, 1, 1);
+expectedPixels = ctx.getImageData(0, 0, 2, 2, {colorSpace: "display-p3"}).data;
+
+var image = new Image();
+image._onload_ = t.step_func_done(function() {
+    var dstCanvas = document.createElement("canvas");
+    dstCanvas.width = 2;
+    dstCanvas.height = 2;
+    var ctx = dstCanvas.getContext('2d', {colorSpace: "display-p3"});
+    ctx.drawImage(image, 0, 0);
+    var actualPixels = ctx.getImageData(0, 0, 2, 2, {colorSpace: "display-p3"}).data;
+    assert_array_approx_equals(actualPixels, expectedPixels, 2);
+});
+image.src = ""
+
+
+}, {colorSpace: "display-p3"});
+</script>
+

Modified: branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas-expected.txt (283826 => 283827)


--- branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas-expected.txt	2021-10-08 19:44:16 UTC (rev 283826)
+++ branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas-expected.txt	2021-10-08 19:44:23 UTC (rev 283827)
@@ -1,6 +1,6 @@
 2d.color.space.p3.toDataURL.p3.canvas
-test if toblob returns p3 data from canvas with p3 color space
+test if toDataURL returns p3 data from canvas with p3 color space
 Actual output:
 
-PASS test if toblob returns p3 data from canvas with p3 color space
+PASS test if toDataURL returns p3 data from canvas with p3 color space
 

Modified: branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html (283826 => 283827)


--- branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html	2021-10-08 19:44:16 UTC (rev 283826)
+++ branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html	2021-10-08 19:44:23 UTC (rev 283827)
@@ -8,7 +8,7 @@
 <body class="show_output">
 
 <h1>2d.color.space.p3.toDataURL.p3.canvas</h1>
-<p class="desc">test if toblob returns p3 data from canvas with p3 color space</p>
+<p class="desc">test if toDataURL returns p3 data from canvas with p3 color space</p>
 
 
 <p class="output">Actual output:</p>
@@ -16,7 +16,7 @@
 
 <ul id="d"></ul>
 <script>
-var t = async_test("test if toblob returns p3 data from canvas with p3 color space");
+var t = async_test("test if toDataURL returns p3 data from canvas with p3 color space");
 _addTest(function(canvas, ctx) {
 
 ctx.fillStyle = "rgba(155, 27, 27, 1)";

Modified: branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/tools/yaml/element/color_space.yaml (283826 => 283827)


--- branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/tools/yaml/element/color_space.yaml	2021-10-08 19:44:16 UTC (rev 283826)
+++ branches/safari-612-branch/LayoutTests/imported/w3c/web-platform-tests/html/canvas/tools/yaml/element/color_space.yaml	2021-10-08 19:44:23 UTC (rev 283827)
@@ -75,7 +75,7 @@
 - name: 2d.color.space.p3.toDataURL.p3.canvas
   testing:
   - 2d.color.space.p3.and.uint8
-  desc: test if toblob returns p3 data from canvas with p3 color space
+  desc: test if toDataURL returns p3 data from canvas with p3 color space
   attributes: |
     {colorSpace: "display-p3"}
   code: |
@@ -101,6 +101,35 @@
     });
     image.src = ""
 
+- name: 2d.color.space.p3.toDataURL.jpeg.p3.canvas
+  testing:
+  - 2d.color.space.p3.and.uint8
+  desc: test if toDataURL('image/jpeg') returns p3 data from canvas with p3 color space
+  attributes: |
+    {colorSpace: "display-p3"}
+  code: |
+    ctx.fillStyle = "rgba(155, 27, 27, 1)";
+    ctx.fillRect(0, 0, 1, 1);
+    ctx.fillStyle = "rgba(27, 155, 27, 0)";
+    ctx.fillRect(1, 0, 1, 1);
+    ctx.fillStyle = "rgba(27, 27, 155, 0.5)";
+    ctx.fillRect(0, 1, 1, 1);
+    ctx.fillStyle = "rgba(27, 27, 27, 0.5)";
+    ctx.fillRect(1, 1, 1, 1);
+    expectedPixels = ctx.getImageData(0, 0, 2, 2, {colorSpace: "display-p3"}).data;
+
+    var image = new Image();
+    image._onload_ = t.step_func_done(function() {
+        var dstCanvas = document.createElement("canvas");
+        dstCanvas.width = 2;
+        dstCanvas.height = 2;
+        var ctx = dstCanvas.getContext('2d', {colorSpace: "display-p3"});
+        ctx.drawImage(image, 0, 0);
+        var actualPixels = ctx.getImageData(0, 0, 2, 2, {colorSpace: "display-p3"}).data;
+        assert_array_approx_equals(actualPixels, expectedPixels, 2);
+    });
+    image.src = ""
+
 - name: 2d.color.space.p3.toBlob.with.putImageData
   testing:
   - 2d.color.space.p3.and.uint8

Modified: branches/safari-612-branch/LayoutTests/platform/ios/TestExpectations (283826 => 283827)


--- branches/safari-612-branch/LayoutTests/platform/ios/TestExpectations	2021-10-08 19:44:16 UTC (rev 283826)
+++ branches/safari-612-branch/LayoutTests/platform/ios/TestExpectations	2021-10-08 19:44:23 UTC (rev 283827)
@@ -3478,3 +3478,4 @@
 # display-p3 canvas and ImageData are Cocoa only for now.
 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Pass ]
 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-settings.html [ Pass ]
+imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html [ Pass ]

Modified: branches/safari-612-branch/LayoutTests/platform/ios-14/TestExpectations (283826 => 283827)


--- branches/safari-612-branch/LayoutTests/platform/ios-14/TestExpectations	2021-10-08 19:44:16 UTC (rev 283826)
+++ branches/safari-612-branch/LayoutTests/platform/ios-14/TestExpectations	2021-10-08 19:44:23 UTC (rev 283827)
@@ -96,6 +96,7 @@
 # display-p3 canvas and ImageData are iOS 15+.
 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Failure ]
 imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-settings.html [ Failure ]
+imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html [ Failure ]
 
 # rdar://79084756 ((r278618) media/modern-media-controls /overflow-support/chapters.html is timing out since introduction (226828))
 media/modern-media-controls/overflow-support/chapters.html [ Pass ]

Modified: branches/safari-612-branch/LayoutTests/platform/mac/TestExpectations (283826 => 283827)


--- branches/safari-612-branch/LayoutTests/platform/mac/TestExpectations	2021-10-08 19:44:16 UTC (rev 283826)
+++ branches/safari-612-branch/LayoutTests/platform/mac/TestExpectations	2021-10-08 19:44:23 UTC (rev 283827)
@@ -2327,3 +2327,4 @@
 # display-p3 canvas and ImageData are Cocoa only for now.
 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage.html [ Pass ]
 [ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-settings.html [ Pass ]
+[ Monterey+ ] imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html [ Pass ]

Modified: branches/safari-612-branch/Source/WebCore/ChangeLog (283826 => 283827)


--- branches/safari-612-branch/Source/WebCore/ChangeLog	2021-10-08 19:44:16 UTC (rev 283826)
+++ branches/safari-612-branch/Source/WebCore/ChangeLog	2021-10-08 19:44:23 UTC (rev 283827)
@@ -1,5 +1,60 @@
 2021-10-08  Russell Epstein  <[email protected]>
 
+        Cherry-pick r282634. rdar://problem/83957287
+
+    Preserve canvas color space when producing JPEGs from toDataURL/toBlob
+    https://bugs.webkit.org/show_bug.cgi?id=230209
+    <rdar://82948457>
+    
+    Reviewed by Sam Weinig.
+    
+    LayoutTests/imported/w3c:
+    
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas-expected.txt: Added.
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html: Copied from LayoutTests/imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html.
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas-expected.txt:
+    * web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.p3.canvas.html:
+    * web-platform-tests/html/canvas/tools/yaml/element/color_space.yaml:
+    
+    Source/WebCore:
+    
+    Test: imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html
+    
+    * platform/graphics/cg/ImageBufferCGBackend.cpp:
+    (WebCore::colorSpaceForBitmap): Return an appropriate color space for
+    performing any graphics operations on ImageBuffers (such as scaling or
+    cropping, or compositing on top of solid colors) becore encoding.
+    (WebCore::createBitmapImageAfterScalingIfNeeded):
+    (WebCore::ImageBufferCGBackend::copyCGImageForEncoding const):
+    
+    LayoutTests:
+    
+    * TestExpectations:
+    * platform/ios-14/TestExpectations:
+    * platform/ios/TestExpectations:
+    * platform/mac/TestExpectations:
+    
+    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@282634 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+    2021-09-16  Cameron McCormack  <[email protected]>
+
+            Preserve canvas color space when producing JPEGs from toDataURL/toBlob
+            https://bugs.webkit.org/show_bug.cgi?id=230209
+            <rdar://82948457>
+
+            Reviewed by Sam Weinig.
+
+            Test: imported/w3c/web-platform-tests/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.toDataURL.jpeg.p3.canvas.html
+
+            * platform/graphics/cg/ImageBufferCGBackend.cpp:
+            (WebCore::colorSpaceForBitmap): Return an appropriate color space for
+            performing any graphics operations on ImageBuffers (such as scaling or
+            cropping, or compositing on top of solid colors) becore encoding.
+            (WebCore::createBitmapImageAfterScalingIfNeeded):
+            (WebCore::ImageBufferCGBackend::copyCGImageForEncoding const):
+
+2021-10-08  Russell Epstein  <[email protected]>
+
         Cherry-pick r282626. rdar://problem/83956767
 
     Support drawImage with a wide gamut image painting into a display-p3 canvas

Modified: branches/safari-612-branch/Source/WebCore/platform/graphics/cg/ImageBufferCGBackend.cpp (283826 => 283827)


--- branches/safari-612-branch/Source/WebCore/platform/graphics/cg/ImageBufferCGBackend.cpp	2021-10-08 19:44:16 UTC (rev 283826)
+++ branches/safari-612-branch/Source/WebCore/platform/graphics/cg/ImageBufferCGBackend.cpp	2021-10-08 19:44:23 UTC (rev 283827)
@@ -93,6 +93,13 @@
     return image;
 }
 
+static CGColorSpaceRef colorSpaceForBitmap(DestinationColorSpace imageBufferColorSpace)
+{
+    if (CGColorSpaceGetModel(imageBufferColorSpace.platformColorSpace()) != kCGColorSpaceModelRGB)
+        return sRGBColorSpaceRef();
+    return imageBufferColorSpace.platformColorSpace();
+}
+
 static RefPtr<Image> createBitmapImageAfterScalingIfNeeded(RefPtr<NativeImage>&& image, const IntSize& logicalSize, const IntSize& backendSize, float resolutionScale, PreserveResolution preserveResolution)
 {
     if (!image)
@@ -101,7 +108,7 @@
     if (resolutionScale == 1 || preserveResolution == PreserveResolution::Yes)
         image = NativeImage::create(createCroppedImageIfNecessary(image->platformImage().get(), backendSize));
     else {
-        auto context = adoptCF(CGBitmapContextCreate(0, logicalSize.width(), logicalSize.height(), 8, 4 * logicalSize.width(), sRGBColorSpaceRef(), kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host));
+        auto context = adoptCF(CGBitmapContextCreate(0, logicalSize.width(), logicalSize.height(), 8, 4 * logicalSize.width(), colorSpaceForBitmap(image->colorSpace()), kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host));
         CGContextSetBlendMode(context.get(), kCGBlendModeCopy);
         CGContextClipToRect(context.get(), FloatRect(FloatPoint::zero(), logicalSize));
         FloatSize imageSizeInUserSpace = logicalSize;
@@ -177,7 +184,7 @@
         // FIXME: Should this be using the same logic as ImageBufferUtilitiesCG?
 
         // JPEGs don't have an alpha channel, so we have to manually composite on top of black.
-        PixelBufferFormat format { AlphaPremultiplication::Premultiplied, PixelFormat::RGBA8, DestinationColorSpace::SRGB() };
+        PixelBufferFormat format { AlphaPremultiplication::Premultiplied, PixelFormat::RGBA8, DestinationColorSpace(colorSpaceForBitmap(colorSpace())) };
         auto pixelBuffer = getPixelBuffer(format, logicalRect());
         if (!pixelBuffer)
             return nullptr;
@@ -209,7 +216,7 @@
     if (!nativeImage)
         return nullptr;
     auto image = nativeImage->platformImage();
-    auto context = adoptCF(CGBitmapContextCreate(0, backendSize().width(), backendSize().height(), 8, 4 * backendSize().width(), sRGBColorSpaceRef(), kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host));
+    auto context = adoptCF(CGBitmapContextCreate(0, backendSize().width(), backendSize().height(), 8, 4 * backendSize().width(), colorSpaceForBitmap(colorSpace()), kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host));
     CGContextSetBlendMode(context.get(), kCGBlendModeCopy);
     CGContextClipToRect(context.get(), CGRectMake(0, 0, backendSize().width(), backendSize().height()));
     CGContextDrawImage(context.get(), CGRectMake(0, 0, backendSize().width(), backendSize().height()), image.get());
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to