Title: [101300] trunk/Source
Revision
101300
Author
[email protected]
Date
2011-11-28 16:16:58 -0800 (Mon, 28 Nov 2011)

Log Message

FloatQuad::isRectilinear() returns false for 180degree rotations
https://bugs.webkit.org/show_bug.cgi?id=73040

Patch by Dana Jansens <[email protected]> on 2011-11-28
Reviewed by James Robinson.

Source/WebCore:

Added unit test FloatQuadTest.cpp.

* platform/graphics/FloatQuad.cpp:
(WebCore::withinEpsilon): Check two values are as close as can be represented by floats.
(WebCore::FloatQuad::isRectilinear): Use withinEpsilon().

Source/WebKit/chromium:

* WebKit.gypi:
* tests/FloatQuadTest.cpp: Added.
(WebCore::TEST):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (101299 => 101300)


--- trunk/Source/WebCore/ChangeLog	2011-11-29 00:13:10 UTC (rev 101299)
+++ trunk/Source/WebCore/ChangeLog	2011-11-29 00:16:58 UTC (rev 101300)
@@ -1,3 +1,16 @@
+2011-11-28  Dana Jansens  <[email protected]>
+
+        FloatQuad::isRectilinear() returns false for 180degree rotations
+        https://bugs.webkit.org/show_bug.cgi?id=73040
+
+        Reviewed by James Robinson.
+
+        Added unit test FloatQuadTest.cpp.
+
+        * platform/graphics/FloatQuad.cpp:
+        (WebCore::withinEpsilon): Check two values are as close as can be represented by floats.
+        (WebCore::FloatQuad::isRectilinear): Use withinEpsilon().
+
 2011-11-28  Beth Dakin  <[email protected]>
 
         Speculative Chromium build-fix.

Modified: trunk/Source/WebCore/platform/graphics/FloatQuad.cpp (101299 => 101300)


--- trunk/Source/WebCore/platform/graphics/FloatQuad.cpp	2011-11-29 00:13:10 UTC (rev 101299)
+++ trunk/Source/WebCore/platform/graphics/FloatQuad.cpp	2011-11-29 00:16:58 UTC (rev 101300)
@@ -30,9 +30,9 @@
 #include "FloatQuad.h"
 
 #include <algorithm>
+#include <limits>
 
-using std::max;
-using std::min;
+using namespace std;
 
 namespace WebCore {
 
@@ -85,10 +85,15 @@
     return FloatRect(left, top, right - left, bottom - top);
 }
 
+static inline bool withinEpsilon(float a, float b)
+{
+    return fabs(a - b) < numeric_limits<float>::epsilon();
+}
+
 bool FloatQuad::isRectilinear() const
 {
-    return (m_p1.x() == m_p2.x() && m_p2.y() == m_p3.y() && m_p3.x() == m_p4.x() && m_p4.y() == m_p1.y())
-        || (m_p1.y() == m_p2.y() && m_p2.x() == m_p3.x() && m_p3.y() == m_p4.y() && m_p4.x() == m_p1.x());
+    return (withinEpsilon(m_p1.x(), m_p2.x()) && withinEpsilon(m_p2.y(), m_p3.y()) && withinEpsilon(m_p3.x(), m_p4.x()) && withinEpsilon(m_p4.y(), m_p1.y()))
+        || (withinEpsilon(m_p1.y(), m_p2.y()) && withinEpsilon(m_p2.x(), m_p3.x()) && withinEpsilon(m_p3.y(), m_p4.y()) && withinEpsilon(m_p4.x(), m_p1.x()));
 }
 
 bool FloatQuad::containsPoint(const FloatPoint& p) const

Modified: trunk/Source/WebKit/chromium/ChangeLog (101299 => 101300)


--- trunk/Source/WebKit/chromium/ChangeLog	2011-11-29 00:13:10 UTC (rev 101299)
+++ trunk/Source/WebKit/chromium/ChangeLog	2011-11-29 00:16:58 UTC (rev 101300)
@@ -1,3 +1,14 @@
+2011-11-28  Dana Jansens  <[email protected]>
+
+        FloatQuad::isRectilinear() returns false for 180degree rotations
+        https://bugs.webkit.org/show_bug.cgi?id=73040
+
+        Reviewed by James Robinson.
+
+        * WebKit.gypi:
+        * tests/FloatQuadTest.cpp: Added.
+        (WebCore::TEST):
+
 2011-11-28  Sheriff Bot  <[email protected]>
 
         Unreviewed, rolling out r101273.

Modified: trunk/Source/WebKit/chromium/WebKit.gypi (101299 => 101300)


--- trunk/Source/WebKit/chromium/WebKit.gypi	2011-11-29 00:13:10 UTC (rev 101299)
+++ trunk/Source/WebKit/chromium/WebKit.gypi	2011-11-29 00:16:58 UTC (rev 101300)
@@ -66,6 +66,7 @@
             'tests/CCSchedulerStateMachineTest.cpp',
             'tests/CCSchedulerTestCommon.h',
             'tests/CCThreadTaskTest.cpp',
+            'tests/FloatQuadTest.cpp',
             'tests/FrameTestHelpers.cpp',
             'tests/FrameTestHelpers.h',
             'tests/IDBBindingUtilitiesTest.cpp',

Added: trunk/Source/WebKit/chromium/tests/FloatQuadTest.cpp (0 => 101300)


--- trunk/Source/WebKit/chromium/tests/FloatQuadTest.cpp	                        (rev 0)
+++ trunk/Source/WebKit/chromium/tests/FloatQuadTest.cpp	2011-11-29 00:16:58 UTC (rev 101300)
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include "FloatQuad.h"
+
+#include "TransformationMatrix.h"
+
+#include <gtest/gtest.h>
+
+using namespace WebCore;
+
+namespace {
+
+TEST(FloatQuadTest, IsRectilinearTest)
+{
+    const int numRectilinear = 8;
+    TransformationMatrix rectilinearTrans[numRectilinear];
+    rectilinearTrans[1].rotate(90);
+    rectilinearTrans[2].rotate(180);
+    rectilinearTrans[3].rotate(270);
+    rectilinearTrans[4].skewX(0.00000000001);
+    rectilinearTrans[5].skewY(0.00000000001);
+    rectilinearTrans[6].scale(0.00001);
+    rectilinearTrans[6].rotate(180);
+    rectilinearTrans[7].scale(100000);
+    rectilinearTrans[7].rotate(180);
+
+    for (int i = 0; i < numRectilinear; ++i) {
+        FloatQuad quad = rectilinearTrans[i].mapQuad(FloatRect(0.01010101, 0.01010101, 100.01010101, 100.01010101));
+        EXPECT_TRUE(quad.isRectilinear());
+    }
+
+    const int numNonRectilinear = 10;
+    TransformationMatrix nonRectilinearTrans[numNonRectilinear];
+    nonRectilinearTrans[0].rotate(359.999);
+    nonRectilinearTrans[1].rotate(0.0000001);
+    nonRectilinearTrans[2].rotate(89.999999);
+    nonRectilinearTrans[3].rotate(90.0000001);
+    nonRectilinearTrans[4].rotate(179.999999);
+    nonRectilinearTrans[5].rotate(180.0000001);
+    nonRectilinearTrans[6].rotate(269.999999);
+    nonRectilinearTrans[7].rotate(270.0000001);
+    nonRectilinearTrans[8].skewX(0.00001);
+    nonRectilinearTrans[9].skewY(0.00001);
+
+    for (int i = 0; i < numNonRectilinear; ++i) {
+        FloatQuad quad = nonRectilinearTrans[i].mapQuad(FloatRect(0.01010101, 0.01010101, 100.01010101, 100.01010101));
+        EXPECT_FALSE(quad.isRectilinear());
+    }
+}
+
+} // empty namespace
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to