<!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>[168227] 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/168227">168227</a></dd>
<dt>Author</dt> <dd>simon.fraser@apple.com</dd>
<dt>Date</dt> <dd>2014-05-03 13:32:24 -0700 (Sat, 03 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Very fuzzy layers under non-decompasable matrices
https://bugs.webkit.org/show_bug.cgi?id=132516
&lt;rdar://problem/16717478&gt;

Reviewed by Sam Weinig.

Source/WebCore:
<a href="http://trac.webkit.org/projects/webkit/changeset/155977">r155977</a> added code to modify layer contentsScale based on a root-relative
scale, so that scaled-up layers remained sharp. It does this by decomposing
an accumulated matrix, but failed to test whether the decomposition
succeeded. This would result in contentsScale of 0, which is clamped to 0.1,
resulting in very fuzzy layers.

Fix by testing for success of decomposition.

Test: compositing/contents-scale/non-decomposable-matrix.html

* platform/graphics/ca/GraphicsLayerCA.cpp:
(WebCore::maxScaleFromTransform):
* platform/graphics/transforms/TransformationMatrix.cpp:
(WebCore::TransformationMatrix::decompose2): Return early for identity matrices,
with fix for m11 and m22.
(WebCore::TransformationMatrix::decompose4): Return early for identity matrices.
* platform/graphics/transforms/TransformationMatrix.h:
Make Decomposed2Type and Decomposed4Type into C++ structs.
(WebCore::TransformationMatrix::Decomposed2Type::operator==): Added to make it easier
to write code that asserts that decomposition is correct.
(WebCore::TransformationMatrix::Decomposed4Type::operator==): Ditto.

LayoutTests:
Compare scaling under non-decomposable and decomposable matrices.

* compositing/contents-scale/non-decomposable-matrix-expected.html: Added.
* compositing/contents-scale/non-decomposable-matrix.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp">trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsTransformationMatrixcpp">trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsTransformationMatrixh">trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestscompositingcontentsscalenondecomposablematrixexpectedhtml">trunk/LayoutTests/compositing/contents-scale/non-decomposable-matrix-expected.html</a></li>
<li><a href="#trunkLayoutTestscompositingcontentsscalenondecomposablematrixhtml">trunk/LayoutTests/compositing/contents-scale/non-decomposable-matrix.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (168226 => 168227)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-05-03 19:13:56 UTC (rev 168226)
+++ trunk/LayoutTests/ChangeLog        2014-05-03 20:32:24 UTC (rev 168227)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2014-05-03  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
+        Very fuzzy layers under non-decompasable matrices
+        https://bugs.webkit.org/show_bug.cgi?id=132516
+        &lt;rdar://problem/16717478&gt;
+
+        Reviewed by Sam Weinig.
+        
+        Compare scaling under non-decomposable and decomposable matrices.
+
+        * compositing/contents-scale/non-decomposable-matrix-expected.html: Added.
+        * compositing/contents-scale/non-decomposable-matrix.html: Added.
+
</ins><span class="cx"> 2014-05-03  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Subpixel rendering: Add hidpi fieldset/legend test case to check fieldset's cliprect when legend text is present.
</span></span></pre></div>
<a id="trunkLayoutTestscompositingcontentsscalenondecomposablematrixexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/contents-scale/non-decomposable-matrix-expected.html (0 => 168227)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/contents-scale/non-decomposable-matrix-expected.html                                (rev 0)
+++ trunk/LayoutTests/compositing/contents-scale/non-decomposable-matrix-expected.html        2014-05-03 20:32:24 UTC (rev 168227)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;style&gt;
+        .box {
+            box-sizing: border-box;
+            margin: 20px;
+            width: 100px;
+            height: 100px;
+            background-color: orange;
+            border: 20px solid blue;
+        }
+        
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div class=&quot;box&quot; style=&quot;-webkit-transform: scale3d(1, 1, 1)&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestscompositingcontentsscalenondecomposablematrixhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/compositing/contents-scale/non-decomposable-matrix.html (0 => 168227)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/compositing/contents-scale/non-decomposable-matrix.html                                (rev 0)
+++ trunk/LayoutTests/compositing/contents-scale/non-decomposable-matrix.html        2014-05-03 20:32:24 UTC (rev 168227)
</span><span class="lines">@@ -0,0 +1,20 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+
+&lt;html&gt;
+&lt;head&gt;
+    &lt;style&gt;
+        .box {
+            box-sizing: border-box;
+            margin: 20px;
+            width: 100px;
+            height: 100px;
+            background-color: orange;
+            border: 20px solid blue;
+        }
+        
+    &lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div class=&quot;box&quot; style=&quot;-webkit-transform: scale3d(1, 1, 0)&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (168226 => 168227)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-05-03 19:13:56 UTC (rev 168226)
+++ trunk/Source/WebCore/ChangeLog        2014-05-03 20:32:24 UTC (rev 168227)
</span><span class="lines">@@ -1,5 +1,35 @@
</span><span class="cx"> 2014-05-03  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Very fuzzy layers under non-decompasable matrices
+        https://bugs.webkit.org/show_bug.cgi?id=132516
+        &lt;rdar://problem/16717478&gt;
+
+        Reviewed by Sam Weinig.
+        
+        r155977 added code to modify layer contentsScale based on a root-relative
+        scale, so that scaled-up layers remained sharp. It does this by decomposing
+        an accumulated matrix, but failed to test whether the decomposition
+        succeeded. This would result in contentsScale of 0, which is clamped to 0.1,
+        resulting in very fuzzy layers.
+        
+        Fix by testing for success of decomposition.
+
+        Test: compositing/contents-scale/non-decomposable-matrix.html
+
+        * platform/graphics/ca/GraphicsLayerCA.cpp:
+        (WebCore::maxScaleFromTransform):
+        * platform/graphics/transforms/TransformationMatrix.cpp:
+        (WebCore::TransformationMatrix::decompose2): Return early for identity matrices,
+        with fix for m11 and m22.
+        (WebCore::TransformationMatrix::decompose4): Return early for identity matrices.
+        * platform/graphics/transforms/TransformationMatrix.h:
+        Make Decomposed2Type and Decomposed4Type into C++ structs.
+        (WebCore::TransformationMatrix::Decomposed2Type::operator==): Added to make it easier
+        to write code that asserts that decomposition is correct.
+        (WebCore::TransformationMatrix::Decomposed4Type::operator==): Ditto.
+
+2014-05-03  Simon Fraser  &lt;simon.fraser@apple.com&gt;
+
</ins><span class="cx">         Fix crash in WebKit client app when zooming
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=132475
</span><span class="cx">         &lt;rdar://problem/16703405&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp (168226 => 168227)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2014-05-03 19:13:56 UTC (rev 168226)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2014-05-03 20:32:24 UTC (rev 168227)
</span><span class="lines">@@ -293,7 +293,9 @@
</span><span class="cx">         return 1;
</span><span class="cx"> 
</span><span class="cx">     TransformationMatrix::Decomposed4Type decomposeData;
</span><del>-    t.decompose4(decomposeData);
</del><ins>+    if (!t.decompose4(decomposeData))
+        return 1;
+
</ins><span class="cx">     return std::max(fabsf(narrowPrecisionToFloat(decomposeData.scaleX)), fabsf(narrowPrecisionToFloat(decomposeData.scaleY)));
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsTransformationMatrixcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp (168226 => 168227)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp        2014-05-03 19:13:56 UTC (rev 168226)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp        2014-05-03 20:32:24 UTC (rev 168227)
</span><span class="lines">@@ -1579,6 +1579,9 @@
</span><span class="cx">         memset(&amp;decomp, 0, sizeof(decomp));
</span><span class="cx">         decomp.scaleX = 1;
</span><span class="cx">         decomp.scaleY = 1;
</span><ins>+        decomp.m11 = 1;
+        decomp.m22 = 1;
+        return true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return WebCore::decompose2(m_matrix, decomp);
</span><span class="lines">@@ -1592,6 +1595,7 @@
</span><span class="cx">         decomp.scaleX = 1;
</span><span class="cx">         decomp.scaleY = 1;
</span><span class="cx">         decomp.scaleZ = 1;
</span><ins>+        return true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return WebCore::decompose4(m_matrix, decomp);
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsTransformationMatrixh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h (168226 => 168227)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h        2014-05-03 19:13:56 UTC (rev 168226)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h        2014-05-03 20:32:24 UTC (rev 168227)
</span><span class="lines">@@ -126,13 +126,13 @@
</span><span class="cx">                m_matrix[3][0] == 0 &amp;&amp; m_matrix[3][1] == 0 &amp;&amp; m_matrix[3][2] == 0 &amp;&amp; m_matrix[3][3] == 1;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // This form preserves the double math from input to output
</del><ins>+    // This form preserves the double math from input to output.
</ins><span class="cx">     void map(double x, double y, double&amp; x2, double&amp; y2) const { multVecMatrix(x, y, x2, y2); }
</span><span class="cx"> 
</span><del>-    // Map a 3D point through the transform, returning a 3D point.
</del><ins>+    // Maps a 3D point through the transform, returning a 3D point.
</ins><span class="cx">     FloatPoint3D mapPoint(const FloatPoint3D&amp;) const;
</span><span class="cx"> 
</span><del>-    // Map a 2D point through the transform, returning a 2D point.
</del><ins>+    // Maps a 2D point through the transform, returning a 2D point.
</ins><span class="cx">     // Note that this ignores the z component, effectively projecting the point into the z=0 plane.
</span><span class="cx">     FloatPoint mapPoint(const FloatPoint&amp;) const;
</span><span class="cx"> 
</span><span class="lines">@@ -143,7 +143,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // If the matrix has 3D components, the z component of the result is
</span><del>-    // dropped, effectively projecting the rect into the z=0 plane
</del><ins>+    // dropped, effectively projecting the rect into the z=0 plane.
</ins><span class="cx">     FloatRect mapRect(const FloatRect&amp;) const;
</span><span class="cx"> 
</span><span class="cx">     // Rounds the resulting mapped rectangle out. This is helpful for bounding
</span><span class="lines">@@ -152,16 +152,14 @@
</span><span class="cx">     LayoutRect mapRect(const LayoutRect&amp;) const;
</span><span class="cx"> 
</span><span class="cx">     // If the matrix has 3D components, the z component of the result is
</span><del>-    // dropped, effectively projecting the quad into the z=0 plane
</del><ins>+    // dropped, effectively projecting the quad into the z=0 plane.
</ins><span class="cx">     FloatQuad mapQuad(const FloatQuad&amp;) const;
</span><span class="cx"> 
</span><del>-    // Map a point on the z=0 plane into a point on
-    // the plane with with the transform applied, by extending
-    // a ray perpendicular to the source plane and computing
-    // the local x,y position of the point where that ray intersects
-    // with the destination plane.
</del><ins>+    // Maps a point on the z=0 plane into a point on the plane with with the transform applied, by
+    // extending a ray perpendicular to the source plane and computing the local x,y position of
+    // the point where that ray intersects with the destination plane.
</ins><span class="cx">     FloatPoint projectPoint(const FloatPoint&amp;, bool* clamped = 0) const;
</span><del>-    // Projects the four corners of the quad
</del><ins>+    // Projects the four corners of the quad.
</ins><span class="cx">     FloatQuad projectQuad(const FloatQuad&amp;,  bool* clamped = 0) const;
</span><span class="cx">     // Projects the four corners of the quad and takes a bounding box,
</span><span class="cx">     // while sanitizing values created when the w component is negative.
</span><span class="lines">@@ -230,8 +228,7 @@
</span><span class="cx">     TransformationMatrix&amp; rotateFromVector(double x, double y);
</span><span class="cx">     TransformationMatrix&amp; rotate3d(double rx, double ry, double rz);
</span><span class="cx">     
</span><del>-    // The vector (x,y,z) is normalized if it's not already. A vector of
-    // (0,0,0) uses a vector of (0,0,1).
</del><ins>+    // The vector (x,y,z) is normalized if it's not already. A vector of (0,0,0) uses a vector of (0,0,1).
</ins><span class="cx">     TransformationMatrix&amp; rotate3d(double x, double y, double z, double angle);
</span><span class="cx">     
</span><span class="cx">     TransformationMatrix&amp; translate(double tx, double ty);
</span><span class="lines">@@ -250,30 +247,47 @@
</span><span class="cx">     TransformationMatrix&amp; applyPerspective(double p);
</span><span class="cx">     bool hasPerspective() const { return m_matrix[2][3] != 0.0f; }
</span><span class="cx"> 
</span><del>-    // returns a transformation that maps a rect to a rect
</del><ins>+    // Returns a transformation that maps a rect to a rect.
</ins><span class="cx">     static TransformationMatrix rectToRect(const FloatRect&amp;, const FloatRect&amp;);
</span><span class="cx"> 
</span><span class="cx">     bool isInvertible() const;
</span><span class="cx"> 
</span><del>-    // This method returns the identity matrix if it is not invertible.
</del><ins>+    // Returns the identity matrix if it is not invertible.
</ins><span class="cx">     // Use isInvertible() before calling this if you need to know.
</span><span class="cx">     TransformationMatrix inverse() const;
</span><span class="cx"> 
</span><del>-    // decompose the matrix into its component parts
-    typedef struct {
</del><ins>+    // Decompose the matrix into its component parts.
+    struct Decomposed2Type {
</ins><span class="cx">         double scaleX, scaleY;
</span><span class="cx">         double translateX, translateY;
</span><span class="cx">         double angle;
</span><span class="cx">         double m11, m12, m21, m22;
</span><del>-    } Decomposed2Type;
</del><ins>+        
+        bool operator==(const Decomposed2Type&amp; other) const
+        {
+            return scaleX == other.scaleX &amp;&amp; scaleY == other.scaleY
+                &amp;&amp; translateX == other.translateX &amp;&amp; translateY == other.translateY
+                &amp;&amp; angle == other.angle
+                &amp;&amp; m11 == other.m11 &amp;&amp; m12 == other.m12 &amp;&amp; m21 == other.m21 &amp;&amp; m22 == other.m22;
+        }
+    };
</ins><span class="cx"> 
</span><del>-    typedef struct {
</del><ins>+    struct Decomposed4Type {
</ins><span class="cx">         double scaleX, scaleY, scaleZ;
</span><span class="cx">         double skewXY, skewXZ, skewYZ;
</span><span class="cx">         double quaternionX, quaternionY, quaternionZ, quaternionW;
</span><span class="cx">         double translateX, translateY, translateZ;
</span><span class="cx">         double perspectiveX, perspectiveY, perspectiveZ, perspectiveW;
</span><del>-    } Decomposed4Type;
</del><ins>+
+        bool operator==(const Decomposed4Type&amp; other) const
+        {
+            return scaleX == other.scaleX &amp;&amp; scaleY == other.scaleY &amp;&amp; scaleZ == other.scaleZ
+                &amp;&amp; skewXY == other.skewXY &amp;&amp; skewXZ == other.skewXZ &amp;&amp; skewYZ == other.skewYZ
+                &amp;&amp; quaternionX == other.quaternionX &amp;&amp; quaternionY == other.quaternionY &amp;&amp; quaternionZ == other.quaternionZ &amp;&amp; quaternionW == other.quaternionW
+                &amp;&amp; translateX == other.translateX &amp;&amp; translateY == other.translateY &amp;&amp; translateZ == other.translateZ
+                &amp;&amp; perspectiveX == other.perspectiveX &amp;&amp; perspectiveY == other.perspectiveY &amp;&amp; perspectiveZ == other.perspectiveZ &amp;&amp; perspectiveW == other.perspectiveW;
+        }
+    };
</ins><span class="cx">     
</span><span class="cx">     bool decompose2(Decomposed2Type&amp;) const;
</span><span class="cx">     void recompose2(const Decomposed2Type&amp;);
</span><span class="lines">@@ -291,7 +305,7 @@
</span><span class="cx">                 m31() == 0 &amp;&amp; m32() == 0 &amp;&amp; m33() == 1 &amp;&amp; m34() == 0 &amp;&amp; m43() == 0 &amp;&amp; m44() == 1);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Throw away the non-affine parts of the matrix (lossy!)
</del><ins>+    // Throw away the non-affine parts of the matrix (lossy!).
</ins><span class="cx">     void makeAffine();
</span><span class="cx"> 
</span><span class="cx">     AffineTransform toAffineTransform() const;
</span><span class="lines">@@ -357,7 +371,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool isIntegerTranslation() const;
</span><span class="cx"> 
</span><del>-    // This method returns the matrix without 3D components.
</del><ins>+    // Returns the matrix without 3D components.
</ins><span class="cx">     TransformationMatrix to2dTransform() const;
</span><span class="cx">     
</span><span class="cx">     typedef float FloatMatrix4[16];
</span><span class="lines">@@ -380,7 +394,6 @@
</span><span class="cx">         return FloatPoint(static_cast&lt;float&gt;(resultX), static_cast&lt;float&gt;(resultY));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // multiply passed 3D point by matrix
</del><span class="cx">     void multVecMatrix(double x, double y, double z, double&amp; dstX, double&amp; dstY, double&amp; dstZ) const;
</span><span class="cx">     FloatPoint3D internalMapPoint(const FloatPoint3D&amp; sourcePoint) const
</span><span class="cx">     {
</span></span></pre>
</div>
</div>

</body>
</html>