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