OSDN Git Service

Partial revert of 261725fdb2962271c222a049fcdf57bbdc8363c7
authorChris Craik <ccraik@google.com>
Thu, 10 Mar 2016 00:03:21 +0000 (16:03 -0800)
committerChris Craik <ccraik@google.com>
Thu, 10 Mar 2016 00:14:35 +0000 (16:14 -0800)
Bug:27534946

Mapping empty rects still must be done to get correct positions for
line/point rects describing strokable bounds.

Change-Id: I2f9efe543e58eb438b755276585491c1256d6719

libs/hwui/Matrix.cpp
libs/hwui/Rect.h
libs/hwui/tests/unit/MatrixTests.cpp

index deab956..709156c 100644 (file)
@@ -437,8 +437,16 @@ void Matrix4::mapPoint(float& x, float& y) const {
     y = dy * dz;
 }
 
+/**
+ * Set the contents of the rect to be the bounding rect around each of the corners, mapped by the
+ * matrix.
+ *
+ * NOTE: an empty rect to an arbitrary matrix isn't guaranteed to have an empty output, since that's
+ * important for conservative bounds estimation (e.g. rotate45Matrix.mapRect of Rect(0, 10) should
+ * result in non-empty.
+ */
 void Matrix4::mapRect(Rect& r) const {
-    if (isIdentity() || r.isEmpty()) return;
+    if (isIdentity()) return;
 
     if (isSimple()) {
         MUL_ADD_STORE(r.left, data[kScaleX], data[kTranslateX]);
index d9fce9b..de4fa55 100644 (file)
@@ -286,7 +286,8 @@ public:
 
     friend std::ostream& operator<<(std::ostream& os, const Rect& rect) {
         if (rect.isEmpty()) {
-            return os << "empty";
+            // Print empty, but continue, since empty rects may still have useful coordinate info
+            os << "(empty)";
         }
 
         if (rect.left == 0 && rect.top == 0) {
index da22637..eddab87 100644 (file)
 
 using namespace android::uirenderer;
 
-TEST(Matrix, mapRect) {
+TEST(Matrix, mapRect_emptyScaleSkew) {
     // Skew, so we don't hit identity/translate/simple fast paths
-    Matrix4 matrix;
-    matrix.skew(0.1f, 0.1f);
+    Matrix4 scaleMatrix;
+    scaleMatrix.loadScale(10, 10, 1);
+    scaleMatrix.skew(0.1f, 0.1f);
 
     // non-zero empty rect, so sorting x/y would make rect non-empty
-    Rect empty(100, 100, -100, -100);
+    Rect empty(15, 20, 15, 100);
     ASSERT_TRUE(empty.isEmpty());
-    matrix.mapRect(empty);
-    EXPECT_TRUE(empty.isEmpty())
-        << "Empty rect should always remain empty, regardless of mapping.";
+    scaleMatrix.mapRect(empty);
+    EXPECT_EQ(Rect(170, 215, 250, 1015), empty);
+    EXPECT_FALSE(empty.isEmpty())
+        << "Empty 'line' rect doesn't remain empty when skewed.";
+}
+
+TEST(Matrix, mapRect_emptyRotate) {
+    // Skew, so we don't hit identity/translate/simple fast paths
+    Matrix4 skewMatrix;
+    skewMatrix.loadRotate(45);
+
+    // non-zero empty rect, so sorting x/y would make rect non-empty
+    Rect lineRect(0, 100);
+    ASSERT_TRUE(lineRect.isEmpty());
+    skewMatrix.mapRect(lineRect);
+    EXPECT_FALSE(lineRect.isEmpty())
+        << "Empty 'line' rect doesn't remain empty when rotated.";
 }