<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[279885] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/279885">279885</a></dd>
<dt>Author</dt> <dd>said@apple.com</dd>
<dt>Date</dt> <dd>2021-07-13 12:38:32 -0700 (Tue, 13 Jul 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>[CG] REGRESSION(<a href="http://trac.webkit.org/projects/webkit/changeset/278863">r278863</a>): The destination rectangle is truncated when the sub-image is used
https://bugs.webkit.org/show_bug.cgi?id=227614
<rdar://79840643>

Reviewed by Simon Fraser.

Source/WebCore:

This patch gets the calculation of the destRect in the case of the sub-
image as it was before <a href="http://trac.webkit.org/projects/webkit/changeset/278863">r278863</a>.

The size of the destRect has to be equal to the backend size of the
ImageBuffer in logical coordinates.

* platform/graphics/cg/GraphicsContextCG.cpp:
(WebCore::GraphicsContextCG::drawNativeImage):

Tools:

Add an API test to test drawing an ImageBuffer into another and both
have the logicalSize scaled such that they have pixels.

* TestWebKitAPI/Tests/WebCore/ImageBufferTests.cpp:
(TestWebKitAPI::TEST):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscgGraphicsContextCGcpp">trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebCoreImageBufferTestscpp">trunk/Tools/TestWebKitAPI/Tests/WebCore/ImageBufferTests.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (279884 => 279885)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-07-13 19:35:38 UTC (rev 279884)
+++ trunk/Source/WebCore/ChangeLog      2021-07-13 19:38:32 UTC (rev 279885)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2021-07-13  Said Abou-Hallawa  <said@apple.com>
+
+        [CG] REGRESSION(r278863): The destination rectangle is truncated when the sub-image is used
+        https://bugs.webkit.org/show_bug.cgi?id=227614
+        <rdar://79840643>
+
+        Reviewed by Simon Fraser.
+
+        This patch gets the calculation of the destRect in the case of the sub-
+        image as it was before r278863.
+
+        The size of the destRect has to be equal to the backend size of the
+        ImageBuffer in logical coordinates.
+
+        * platform/graphics/cg/GraphicsContextCG.cpp:
+        (WebCore::GraphicsContextCG::drawNativeImage):
+
</ins><span class="cx"> 2021-07-13  Kyle Piddington  <kpiddington@apple.com>
</span><span class="cx"> 
</span><span class="cx">         rAF driven WebGL submits excessive amount of GPU work when frames are slow
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscgGraphicsContextCGcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp (279884 => 279885)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp  2021-07-13 19:35:38 UTC (rev 279884)
+++ trunk/Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp     2021-07-13 19:38:32 UTC (rev 279885)
</span><span class="lines">@@ -297,8 +297,10 @@
</span><span class="cx">             // interpolation smoothes sharp edges, causing pixels from outside the source rect to bleed
</span><span class="cx">             // into the destination rect. See <rdar://problem/6112909>.
</span><span class="cx">             subImage = getSubimage(subImage.get(), imageSize, subimageRect, options);
</span><del>-            adjustedDestRect = enclosingIntRect(adjustedDestRect);
</del><span class="cx"> 
</span><ins>+            auto subPixelPadding = normalizedSrcRect.location() - subimageRect.location();
+            adjustedDestRect = { adjustedDestRect.location() - subPixelPadding * scale, subimageRect.size() * scale };
+
</ins><span class="cx">             // If the image is only partially loaded, then shrink the destination rect that we're drawing
</span><span class="cx">             // into accordingly.
</span><span class="cx">             if (currentImageSize.height() < normalizedSrcRect.maxY()) {
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (279884 => 279885)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog    2021-07-13 19:35:38 UTC (rev 279884)
+++ trunk/Tools/ChangeLog       2021-07-13 19:38:32 UTC (rev 279885)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2021-07-13  Said Abou-Hallawa  <said@apple.com>
+
+        [CG] REGRESSION(r278863): The destination rectangle is truncated when the sub-image is used
+        https://bugs.webkit.org/show_bug.cgi?id=227614
+        <rdar://79840643>
+
+        Reviewed by Simon Fraser.
+
+        Add an API test to test drawing an ImageBuffer into another and both
+        have the logicalSize scaled such that they have pixels.
+
+        * TestWebKitAPI/Tests/WebCore/ImageBufferTests.cpp:
+        (TestWebKitAPI::TEST):
+
</ins><span class="cx"> 2021-07-13  Kevin Neal  <kevin_neal@apple.com>
</span><span class="cx"> 
</span><span class="cx">         [results.webkit.org] linkify urls in commit messages
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebCoreImageBufferTestscpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/ImageBufferTests.cpp (279884 => 279885)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebCore/ImageBufferTests.cpp     2021-07-13 19:35:38 UTC (rev 279884)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/ImageBufferTests.cpp        2021-07-13 19:38:32 UTC (rev 279885)
</span><span class="lines">@@ -49,4 +49,56 @@
</span><span class="cx">     EXPECT_NE(nullptr, displayListUnaccelerated);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TEST(ImageBufferTests, ImageBufferSubPixelDrawing)
+{
+    auto colorSpace = DestinationColorSpace::SRGB();
+    auto pixelFormat = PixelFormat::BGRA8;
+    FloatSize logicalSize { 392, 44 };
+    float scale = 1.91326535;
+    auto frontImageBuffer = ImageBuffer::create(logicalSize, RenderingMode::Accelerated, scale, colorSpace, pixelFormat, nullptr);
+    auto backImageBuffer = ImageBuffer::create(logicalSize, RenderingMode::Accelerated, scale, colorSpace, pixelFormat, nullptr);
+    
+    auto strokeRect = FloatRect { { }, logicalSize };
+    strokeRect.inflate(-0.5);
+    auto fillRect = strokeRect;
+    fillRect.inflate(-1);
+
+    auto& frontContext = frontImageBuffer->context();
+    auto& backContext = backImageBuffer->context();
+
+    frontContext.setShouldAntialias(false);
+    backContext.setShouldAntialias(false);
+
+    frontContext.setStrokeColor(Color::red);
+    frontContext.strokeRect(strokeRect, 1);
+    
+    frontContext.fillRect(fillRect, Color::green);
+
+    for (int i = 0; i < 1000; ++i) {
+        backContext.drawImageBuffer(*frontImageBuffer, WebCore::FloatPoint { }, { WebCore::CompositeOperator::Copy });
+        frontContext.drawImageBuffer(*backImageBuffer, WebCore::FloatPoint { }, { WebCore::CompositeOperator::Copy });
+    }
+
+    auto checkGreenPixel = [&](ImageBuffer& imageBuffer, int x, int y) {
+        PixelBufferFormat format { AlphaPremultiplication::Unpremultiplied, PixelFormat::RGBA8, colorSpace };
+        auto frontPixelBuffer = imageBuffer.getPixelBuffer(format, { x, y, 1, 1 });
+        auto& data = frontPixelBuffer->data();
+
+        EXPECT_EQ(data.item(0), 0x00);
+        EXPECT_EQ(data.item(1), 0xff);
+        EXPECT_EQ(data.item(2), 0x00);
+        EXPECT_EQ(data.item(3), 0xff);
+    };
+
+    checkGreenPixel(*frontImageBuffer, fillRect.x()    + 1, fillRect.y()    + 1);
+    checkGreenPixel(*frontImageBuffer, fillRect.maxX() - 1, fillRect.y()    + 1);
+    checkGreenPixel(*frontImageBuffer, fillRect.x()    + 1, fillRect.maxY() - 1);
+    checkGreenPixel(*frontImageBuffer, fillRect.maxX() - 1, fillRect.maxY() - 1);
+
+    checkGreenPixel(*backImageBuffer, fillRect.x()    + 1, fillRect.y()    + 1);
+    checkGreenPixel(*backImageBuffer, fillRect.maxX() - 1, fillRect.y()    + 1);
+    checkGreenPixel(*backImageBuffer, fillRect.x()    + 1, fillRect.maxY() - 1);
+    checkGreenPixel(*backImageBuffer, fillRect.maxX() - 1, fillRect.maxY() - 1);
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre>
</div>
</div>

</body>
</html>