<!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>[286591] 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/286591">286591</a></dd>
<dt>Author</dt> <dd>mrobinson@webkit.org</dd>
<dt>Date</dt> <dd>2021-12-07 00:27:13 -0800 (Tue, 07 Dec 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>perspective() <= 1px should be clamped to 1px
https://bugs.webkit.org/show_bug.cgi?id=232619
<rdar://problem/85197362>

Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

* web-platform-tests/css/css-transforms/animation/transform-interpolation-verify-reftests-expected.txt: Update to show newly passing subtests.

Source/WebCore:

No new tests. This is covered by the newly passing WPT tests
in this change.

When the CSS 3D transform interoperability experimental feature is turned on,
round perspectives that are < 1 pixel to 1 pixel. This behavior is described
in the specification, but breaks backward compatibility. The reasoning provided
by the specification is:

    As very small <length> values can produce bizarre rendering results and
    stress the numerical accuracy of transform calculations, values less than
    1px must be treated as 1px for rendering purposes.

* platform/graphics/transforms/PerspectiveTransformOperation.h: When getting
the floating point perspective value, round to 1px.
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::perspectiveTransform const): Use usedPerspective from
RenderSTyle.
* rendering/RenderObject.cpp:
(WebCore::RenderObject::getTransformFromContainer const): Ditto.
* rendering/style/RenderStyle.cpp:
(WebCore::RenderStyle::usedPerspective const): Added this method which rounds
to 1px.
* rendering/style/RenderStyle.h:

LayoutTests:

* TestExpectations: Mark tests as passing.
* transforms/3d/general/3dtransform-values.html:
* transforms/3d/general/prefixed-3dtransform-values.html:
* transforms/3d/general/3dtransform-values-expected.txt:
* transforms/3d/general/prefixed-3dtransform-values-expected.txt:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsTestExpectations">trunk/LayoutTests/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestscsscsstransformsanimationtransforminterpolationverifyreftestsexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-verify-reftests-expected.txt</a></li>
<li><a href="#trunkLayoutTeststransforms3dgeneral3dtransformvaluesexpectedtxt">trunk/LayoutTests/transforms/3d/general/3dtransform-values-expected.txt</a></li>
<li><a href="#trunkLayoutTeststransforms3dgeneral3dtransformvalueshtml">trunk/LayoutTests/transforms/3d/general/3dtransform-values.html</a></li>
<li><a href="#trunkLayoutTeststransforms3dgeneralprefixed3dtransformvaluesexpectedtxt">trunk/LayoutTests/transforms/3d/general/prefixed-3dtransform-values-expected.txt</a></li>
<li><a href="#trunkLayoutTeststransforms3dgeneralprefixed3dtransformvalueshtml">trunk/LayoutTests/transforms/3d/general/prefixed-3dtransform-values.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsPerspectiveTransformOperationh">trunk/Source/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayercpp">trunk/Source/WebCore/rendering/RenderLayer.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderObjectcpp">trunk/Source/WebCore/rendering/RenderObject.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleRenderStylecpp">trunk/Source/WebCore/rendering/style/RenderStyle.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingstyleRenderStyleh">trunk/Source/WebCore/rendering/style/RenderStyle.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/LayoutTests/ChangeLog 2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2021-12-07  Martin Robinson  <mrobinson@webkit.org>
+
+        perspective() <= 1px should be clamped to 1px
+        https://bugs.webkit.org/show_bug.cgi?id=232619
+        <rdar://problem/85197362>
+
+        Reviewed by Simon Fraser.
+
+        * TestExpectations: Mark tests as passing.
+        * transforms/3d/general/3dtransform-values.html:
+        * transforms/3d/general/prefixed-3dtransform-values.html:
+        * transforms/3d/general/3dtransform-values-expected.txt:
+        * transforms/3d/general/prefixed-3dtransform-values-expected.txt:
+
</ins><span class="cx"> 2021-12-06  Said Abou-Hallawa  <said@apple.com>
</span><span class="cx"> 
</span><span class="cx">         [GPU Process]  [Filters] Make FilterEffect::externalRepresentation() and its overridable functions work iteratively
</span></span></pre></div>
<a id="trunkLayoutTestsTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/TestExpectations (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/TestExpectations       2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/LayoutTests/TestExpectations  2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -3922,9 +3922,6 @@
</span><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/perspective-children-only-inline.html [ ImageOnlyFailure ]
</span><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/perspective-containing-block-dynamic-1b.html [ ImageOnlyFailure ]
</span><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/perspective-transforms-equivalence.html [ ImageOnlyFailure ]
</span><del>-webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/perspective-zero-2.html [ ImageOnlyFailure ]
-webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/perspective-zero-3.html [ ImageOnlyFailure ]
-webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/perspective-zero.html [ ImageOnlyFailure ]
</del><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/preserve3d-and-filter-no-perspective.html [ ImageOnlyFailure ]
</span><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/rotateY-180deg-with-overflow-scroll.html [ ImageOnlyFailure ]
</span><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/rotate_45deg.html [ ImageOnlyFailure ]
</span><span class="lines">@@ -3987,7 +3984,6 @@
</span><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/transform3d-perspective-002.html [ Pass ImageOnlyFailure ]
</span><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/transform3d-perspective-003.html [ ImageOnlyFailure ]
</span><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/transform3d-perspective-004.html [ ImageOnlyFailure ]
</span><del>-webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/transform3d-perspective-005.html [ ImageOnlyFailure ]
</del><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/transform3d-preserve3d-006.html [ Pass ImageOnlyFailure ]
</span><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/transform3d-preserve3d-007.html [ Pass ImageOnlyFailure ]
</span><span class="cx"> webkit.org/b/230080 imported/w3c/web-platform-tests/css/css-transforms/transform3d-preserve3d-008.html [ Pass ImageOnlyFailure ]
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog 2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/LayoutTests/imported/w3c/ChangeLog    2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2021-12-07  Martin Robinson  <mrobinson@webkit.org>
+
+        perspective() <= 1px should be clamped to 1px
+        https://bugs.webkit.org/show_bug.cgi?id=232619
+        <rdar://problem/85197362>
+
+        Reviewed by Simon Fraser.
+
+        * web-platform-tests/css/css-transforms/animation/transform-interpolation-verify-reftests-expected.txt: Update to show newly passing subtests.
+
</ins><span class="cx"> 2021-12-06  Tadeu Zagallo  <tzagallo@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Restore navigator.hardwareConcurrency
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestscsscsstransformsanimationtransforminterpolationverifyreftestsexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-verify-reftests-expected.txt (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-verify-reftests-expected.txt      2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-interpolation-verify-reftests-expected.txt 2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -155,12 +155,12 @@
</span><span class="cx"> PASS CSS Transitions with transition: all: property <transform> from [perspective(100px) translateZ(15px)] to [perspective(25px) translateZ(15px)] at (0.5) should be [perspective(40px) translateZ(15px)]
</span><span class="cx"> PASS CSS Animations: property <transform> from [perspective(100px) translateZ(15px)] to [perspective(25px) translateZ(15px)] at (0.5) should be [perspective(40px) translateZ(15px)]
</span><span class="cx"> PASS Web Animations: property <transform> from [perspective(100px) translateZ(15px)] to [perspective(25px) translateZ(15px)] at (0.5) should be [perspective(40px) translateZ(15px)]
</span><del>-FAIL CSS Transitions: property <transform> from [perspective(0.1px) translateZ(0.25px)] to [perspective(0.1px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.25 , 0.75 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 10 , 0 , 0 , 0.25 , - 1.5 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [perspective(0.1px) translateZ(0.25px)] to [perspective(0.1px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.25 , 0.75 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 10 , 0 , 0 , 0.25 , - 1.5 ) "
-FAIL CSS Animations: property <transform> from [perspective(0.1px) translateZ(0.25px)] to [perspective(0.1px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.25 , 0.75 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 10 , 0 , 0 , 0.25 , - 1.5 ) "
-FAIL Web Animations: property <transform> from [perspective(0.1px) translateZ(0.25px)] to [perspective(0.1px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.25 , 0.75 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 10 , 0 , 0 , 0.25 , - 1.5 ) "
-FAIL CSS Transitions: property <transform> from [perspective(0px) translateZ(0.25px)] to [perspective(0px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.25 , 0.75 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0.25 , 1 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [perspective(0px) translateZ(0.25px)] to [perspective(0px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.25 , 0.75 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0.25 , 1 ) "
</del><ins>+PASS CSS Transitions: property <transform> from [perspective(0.1px) translateZ(0.25px)] to [perspective(0.1px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)]
+PASS CSS Transitions with transition: all: property <transform> from [perspective(0.1px) translateZ(0.25px)] to [perspective(0.1px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)]
+PASS CSS Animations: property <transform> from [perspective(0.1px) translateZ(0.25px)] to [perspective(0.1px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)]
+PASS Web Animations: property <transform> from [perspective(0.1px) translateZ(0.25px)] to [perspective(0.1px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)]
+PASS CSS Transitions: property <transform> from [perspective(0px) translateZ(0.25px)] to [perspective(0px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)]
+PASS CSS Transitions with transition: all: property <transform> from [perspective(0px) translateZ(0.25px)] to [perspective(0px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)]
</ins><span class="cx"> FAIL CSS Animations: property <transform> from [perspective(0px) translateZ(0.25px)] to [perspective(0px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.25 , 0.75 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0.25 , 1 ) "
</span><span class="cx"> FAIL Web Animations: property <transform> from [perspective(0px) translateZ(0.25px)] to [perspective(0px) translateZ(0.25px)] at (0.5) should be [perspective(1px) translateZ(0.25px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.25 , 0.75 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0.25 , 1 ) "
</span><span class="cx"> FAIL CSS Transitions: property <transform> from [perspective(0px) translateZ(0.5px)] to [perspective(3px) translateZ(0.5px)] at (0.5) should be [perspective(1.5px) translateZ(0.5px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 0.67 , 0 , 0 , 0.5 , 0.67 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 0.17 , 0 , 0 , 0.5 , 0.92 ) "
</span><span class="lines">@@ -171,8 +171,8 @@
</span><span class="cx"> PASS CSS Transitions with transition: all: property <transform> from [perspective(10px) translateZ(0.5px)] to [perspective(1px) translateZ(0.5px)] at (-1) should be [translateZ(0.5px)]
</span><span class="cx"> PASS CSS Animations: property <transform> from [perspective(10px) translateZ(0.5px)] to [perspective(1px) translateZ(0.5px)] at (-1) should be [translateZ(0.5px)]
</span><span class="cx"> PASS Web Animations: property <transform> from [perspective(10px) translateZ(0.5px)] to [perspective(1px) translateZ(0.5px)] at (-1) should be [translateZ(0.5px)]
</span><del>-FAIL CSS Transitions: property <transform> from [perspective(1px) translateZ(0.5px)] to [perspective(10px) translateZ(0.5px)] at (-1) should be [perspective(1px) translateZ(0.5px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.5 , 0.5 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1.9 , 0 , 0 , 0.5 , 0.05 ) "
-FAIL CSS Transitions with transition: all: property <transform> from [perspective(1px) translateZ(0.5px)] to [perspective(10px) translateZ(0.5px)] at (-1) should be [perspective(1px) translateZ(0.5px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.5 , 0.5 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1.9 , 0 , 0 , 0.5 , 0.05 ) "
-FAIL CSS Animations: property <transform> from [perspective(1px) translateZ(0.5px)] to [perspective(10px) translateZ(0.5px)] at (-1) should be [perspective(1px) translateZ(0.5px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.5 , 0.5 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1.9 , 0 , 0 , 0.5 , 0.05 ) "
-FAIL Web Animations: property <transform> from [perspective(1px) translateZ(0.5px)] to [perspective(10px) translateZ(0.5px)] at (-1) should be [perspective(1px) translateZ(0.5px)] assert_equals: expected "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1 , 0 , 0 , 0.5 , 0.5 ) " but got "matrix3d ( 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , - 1.9 , 0 , 0 , 0.5 , 0.05 ) "
</del><ins>+PASS CSS Transitions: property <transform> from [perspective(1px) translateZ(0.5px)] to [perspective(10px) translateZ(0.5px)] at (-1) should be [perspective(1px) translateZ(0.5px)]
+PASS CSS Transitions with transition: all: property <transform> from [perspective(1px) translateZ(0.5px)] to [perspective(10px) translateZ(0.5px)] at (-1) should be [perspective(1px) translateZ(0.5px)]
+PASS CSS Animations: property <transform> from [perspective(1px) translateZ(0.5px)] to [perspective(10px) translateZ(0.5px)] at (-1) should be [perspective(1px) translateZ(0.5px)]
+PASS Web Animations: property <transform> from [perspective(1px) translateZ(0.5px)] to [perspective(10px) translateZ(0.5px)] at (-1) should be [perspective(1px) translateZ(0.5px)]
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTeststransforms3dgeneral3dtransformvaluesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/transforms/3d/general/3dtransform-values-expected.txt (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/3d/general/3dtransform-values-expected.txt  2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/LayoutTests/transforms/3d/general/3dtransform-values-expected.txt     2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -15,7 +15,8 @@
</span><span class="cx"> transform "perspective(400em)" expected "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -0.00015625, 0, 0, 0, 1)" : PASS
</span><span class="cx"> transform "perspective(50%)" expected "none" : PASS
</span><span class="cx"> transform "perspective(-400)" expected "none" : PASS
</span><del>-transform "perspective(0)" expected "matrix(1, 0, 0, 1, 0, 0)" : PASS
</del><ins>+transform "perspective(0)" expected "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 1)" : PASS
+transform "perspective(none)" expected "matrix(1, 0, 0, 1, 0, 0)" : PASS
</ins><span class="cx"> transform "perspective(400deg)" expected "none" : PASS
</span><span class="cx"> transform "perspective(banana)" expected "none" : PASS
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTeststransforms3dgeneral3dtransformvalueshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/transforms/3d/general/3dtransform-values.html (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/3d/general/3dtransform-values.html  2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/LayoutTests/transforms/3d/general/3dtransform-values.html     2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -43,7 +43,8 @@
</span><span class="cx">       { 'transform' : 'perspective(400em)', 'result' : 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -0.00015625, 0, 0, 0, 1)' },
</span><span class="cx">       { 'transform' : 'perspective(50%)', 'result' : 'none' },
</span><span class="cx">       { 'transform' : 'perspective(-400)', 'result' : 'none' },
</span><del>-      { 'transform' : 'perspective(0)', 'result' : 'matrix(1, 0, 0, 1, 0, 0)' },
</del><ins>+      { 'transform' : 'perspective(0)', 'result' : 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 1)' },
+      { 'transform' : 'perspective(none)', 'result' : 'matrix(1, 0, 0, 1, 0, 0)' },
</ins><span class="cx">       { 'transform' : 'perspective(400deg)', 'result' : 'none' }, // unit must be length
</span><span class="cx">       { 'transform' : 'perspective(banana)', 'result' : 'none' }, // unit must be length
</span><span class="cx">     ];
</span></span></pre></div>
<a id="trunkLayoutTeststransforms3dgeneralprefixed3dtransformvaluesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/transforms/3d/general/prefixed-3dtransform-values-expected.txt (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/3d/general/prefixed-3dtransform-values-expected.txt 2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/LayoutTests/transforms/3d/general/prefixed-3dtransform-values-expected.txt    2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -15,7 +15,8 @@
</span><span class="cx"> transform "perspective(400em)" expected "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -0.00015625, 0, 0, 0, 1)" : PASS
</span><span class="cx"> transform "perspective(50%)" expected "none" : PASS
</span><span class="cx"> transform "perspective(-400)" expected "none" : PASS
</span><del>-transform "perspective(0)" expected "matrix(1, 0, 0, 1, 0, 0)" : PASS
</del><ins>+transform "perspective(0)" expected "matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 1)" : PASS
+transform "perspective(none)" expected "matrix(1, 0, 0, 1, 0, 0)" : PASS
</ins><span class="cx"> transform "perspective(400deg)" expected "none" : PASS
</span><span class="cx"> transform "perspective(banana)" expected "none" : PASS
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTeststransforms3dgeneralprefixed3dtransformvalueshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/transforms/3d/general/prefixed-3dtransform-values.html (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/transforms/3d/general/prefixed-3dtransform-values.html 2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/LayoutTests/transforms/3d/general/prefixed-3dtransform-values.html    2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -43,7 +43,8 @@
</span><span class="cx">       { 'transform' : 'perspective(400em)', 'result' : 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -0.00015625, 0, 0, 0, 1)' },
</span><span class="cx">       { 'transform' : 'perspective(50%)', 'result' : 'none' },
</span><span class="cx">       { 'transform' : 'perspective(-400)', 'result' : 'none' },
</span><del>-      { 'transform' : 'perspective(0)', 'result' : 'matrix(1, 0, 0, 1, 0, 0)' },
</del><ins>+      { 'transform' : 'perspective(0)', 'result' : 'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 1)' },
+      { 'transform' : 'perspective(none)', 'result' : 'matrix(1, 0, 0, 1, 0, 0)' },
</ins><span class="cx">       { 'transform' : 'perspective(400deg)', 'result' : 'none' }, // unit must be length
</span><span class="cx">       { 'transform' : 'perspective(banana)', 'result' : 'none' }, // unit must be length
</span><span class="cx">     ];
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/Source/WebCore/ChangeLog      2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2021-12-07  Martin Robinson  <mrobinson@webkit.org>
+
+        perspective() <= 1px should be clamped to 1px
+        https://bugs.webkit.org/show_bug.cgi?id=232619
+        <rdar://problem/85197362>
+
+        Reviewed by Simon Fraser.
+
+        No new tests. This is covered by the newly passing WPT tests
+        in this change.
+
+        When the CSS 3D transform interoperability experimental feature is turned on,
+        round perspectives that are < 1 pixel to 1 pixel. This behavior is described
+        in the specification, but breaks backward compatibility. The reasoning provided
+        by the specification is:
+
+            As very small <length> values can produce bizarre rendering results and
+            stress the numerical accuracy of transform calculations, values less than
+            1px must be treated as 1px for rendering purposes.
+
+        * platform/graphics/transforms/PerspectiveTransformOperation.h: When getting
+        the floating point perspective value, round to 1px.
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::perspectiveTransform const): Use usedPerspective from
+        RenderSTyle.
+        * rendering/RenderObject.cpp:
+        (WebCore::RenderObject::getTransformFromContainer const): Ditto.
+        * rendering/style/RenderStyle.cpp:
+        (WebCore::RenderStyle::usedPerspective const): Added this method which rounds
+        to 1px.
+        * rendering/style/RenderStyle.h:
+
</ins><span class="cx"> 2021-12-06  Said Abou-Hallawa  <said@apple.com>
</span><span class="cx"> 
</span><span class="cx">         [GPU Process]  [Filters] Make FilterEffect::externalRepresentation() and its overridable functions work iteratively
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsPerspectiveTransformOperationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h        2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/Source/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h   2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -60,7 +60,12 @@
</span><span class="cx">     {
</span><span class="cx">         if (!m_p)
</span><span class="cx">             return { };
</span><del>-        return floatValueForLength(*m_p, 1.0);
</del><ins>+
+        // From https://www.w3.org/TR/css-transforms-2/#perspective-property:
+        // "As very small <length> values can produce bizarre rendering results and stress the numerical accuracy of
+        // transform calculations, values less than 1px must be treated as 1px for rendering purposes. (This clamping
+        // does not affect the underlying value, so perspective: 0; in a stylesheet will still serialize back as 0.)"
+        return std::max(1.0f, floatValueForLength(*m_p, 1.0));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool apply(TransformationMatrix& transform, const FloatSize&) const override
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.cpp   2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp      2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -1764,7 +1764,7 @@
</span><span class="cx"> 
</span><span class="cx">     TransformationMatrix t;
</span><span class="cx">     t.translate(perspectiveOrigin.x(), perspectiveOrigin.y());
</span><del>-    t.applyPerspective(style.perspective());
</del><ins>+    t.applyPerspective(style.usedPerspective(renderer()));
</ins><span class="cx">     t.translate(-perspectiveOrigin.x(), -perspectiveOrigin.y());
</span><span class="cx"> 
</span><span class="cx">     return t;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderObject.cpp  2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp     2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -1389,7 +1389,7 @@
</span><span class="cx">         FloatPoint perspectiveOrigin = downcast<RenderLayerModelObject>(*containerObject).layer()->perspectiveOrigin();
</span><span class="cx"> 
</span><span class="cx">         TransformationMatrix perspectiveMatrix;
</span><del>-        perspectiveMatrix.applyPerspective(containerObject->style().perspective());
</del><ins>+        perspectiveMatrix.applyPerspective(containerObject->style().usedPerspective(*this));
</ins><span class="cx">         
</span><span class="cx">         transform.translateRight3d(-perspectiveOrigin.x(), -perspectiveOrigin.y(), 0);
</span><span class="cx">         transform = perspectiveMatrix * transform;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleRenderStylecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/RenderStyle.cpp (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/RenderStyle.cpp     2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.cpp        2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -1813,6 +1813,11 @@
</span><span class="cx">     return *m_rareNonInheritedData->transitions;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+float RenderStyle::usedPerspective(const RenderObject& object) const
+{
+    return object.document().settings().css3DTransformInteroperabilityEnabled() ? std::max(1.0f, perspective()) : perspective();
+}
+
</ins><span class="cx"> const Animation* RenderStyle::transitionForProperty(CSSPropertyID property) const
</span><span class="cx"> {
</span><span class="cx">     auto* transitions = this->transitions();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingstyleRenderStyleh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/style/RenderStyle.h (286590 => 286591)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/style/RenderStyle.h       2021-12-07 07:30:07 UTC (rev 286590)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.h  2021-12-07 08:27:13 UTC (rev 286591)
</span><span class="lines">@@ -730,6 +730,7 @@
</span><span class="cx"> 
</span><span class="cx">     BackfaceVisibility backfaceVisibility() const { return static_cast<BackfaceVisibility>(m_rareNonInheritedData->backfaceVisibility); }
</span><span class="cx">     float perspective() const { return m_rareNonInheritedData->perspective; }
</span><ins>+    float usedPerspective(const RenderObject&) const;
</ins><span class="cx">     bool hasPerspective() const { return m_rareNonInheritedData->perspective != initialPerspective(); }
</span><span class="cx">     const Length& perspectiveOriginX() const { return m_rareNonInheritedData->perspectiveOriginX; }
</span><span class="cx">     const Length& perspectiveOriginY() const { return m_rareNonInheritedData->perspectiveOriginY; }
</span></span></pre>
</div>
</div>

</body>
</html>