Fix rotated clip regions

bug: 26562461
fixes: 30109912

SeekBar clips out the area of the thumb when drawing its track. This
creates a clip region, since a rect has been subtracted.

This changes region transform support in computing final clip to
properly support any rect-to-rect transform (such as 90 degree rotation)
when applying a clip region.

Change-Id: Ib3bbc52637e59e00b3a7e7d5c4c40555e26c578b
diff --git a/libs/hwui/ClipArea.cpp b/libs/hwui/ClipArea.cpp
index 39b8d3d..84451ba 100644
--- a/libs/hwui/ClipArea.cpp
+++ b/libs/hwui/ClipArea.cpp
@@ -530,14 +530,14 @@
 }
 
 void ClipArea::applyTransformToRegion(const Matrix4& transform, SkRegion* region) {
-    if (transform.isSimple() && !transform.isPureTranslate()) {
+    if (transform.rectToRect() && !transform.isPureTranslate()) {
         // handle matrices with scale manually by mapping each rect
         SkRegion other;
         SkRegion::Iterator it(*region);
         while (!it.done()) {
             Rect rect(it.rect());
             transform.mapRect(rect);
-            rect.roundOut();
+            rect.snapGeometryToPixelBoundaries(true);
             other.op(rect.left, rect.top, rect.right, rect.bottom, SkRegion::kUnion_Op);
             it.next();
         }
diff --git a/libs/hwui/tests/unit/ClipAreaTests.cpp b/libs/hwui/tests/unit/ClipAreaTests.cpp
index afabd35..d4d7919 100644
--- a/libs/hwui/tests/unit/ClipAreaTests.cpp
+++ b/libs/hwui/tests/unit/ClipAreaTests.cpp
@@ -334,5 +334,14 @@
     EXPECT_EQ(SkIRect::MakeLTRB(12, 26, 16, 32), region.getBounds());
 }
 
+TEST(ClipArea, applyTransformToRegion_rotate90) {
+    SkRegion region(SkIRect::MakeLTRB(1, 2, 3, 4));
+    Matrix4 transform;
+    transform.loadRotate(90);
+    ClipArea::applyTransformToRegion(transform, &region);
+    EXPECT_TRUE(region.isRect());
+    EXPECT_EQ(SkIRect::MakeLTRB(-4, 1, -2, 3), region.getBounds());
+}
+
 } // namespace uirenderer
 } // namespace android