Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06584350 authored by Chris Craik's avatar Chris Craik
Browse files

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
parent 55c7c9c2
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -530,14 +530,14 @@ void ClipArea::applyClip(const ClipBase* clip, const Matrix4& transform) {
}

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();
        }
+9 −0
Original line number Diff line number Diff line
@@ -334,5 +334,14 @@ TEST(ClipArea, applyTransformToRegion_translateScale) {
    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