Handle post-record-time clipPath scaling
bug:29547149
Change-Id: I268210b240d2d8e08638114715f9622840fc02f7
diff --git a/libs/hwui/ClipArea.cpp b/libs/hwui/ClipArea.cpp
index fe68239..39b8d3d 100644
--- a/libs/hwui/ClipArea.cpp
+++ b/libs/hwui/ClipArea.cpp
@@ -464,10 +464,7 @@
}
case ClipMode::Region:
other = getRegion(recordedClip);
-
- // TODO: handle non-translate transforms properly!
- other.translate(recordedClipTransform.getTranslateX(),
- recordedClipTransform.getTranslateY());
+ applyTransformToRegion(recordedClipTransform, &other);
}
ClipRegion* regionClip = allocator.create<ClipRegion>();
@@ -527,11 +524,29 @@
}
} else {
SkRegion region(getRegion(clip));
- // TODO: handle non-translate transforms properly!
- region.translate(transform.getTranslateX(), transform.getTranslateY());
+ applyTransformToRegion(transform, ®ion);
clipRegion(region, SkRegion::kIntersect_Op);
}
}
+void ClipArea::applyTransformToRegion(const Matrix4& transform, SkRegion* region) {
+ if (transform.isSimple() && !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();
+ other.op(rect.left, rect.top, rect.right, rect.bottom, SkRegion::kUnion_Op);
+ it.next();
+ }
+ region->swap(other);
+ } else {
+ // TODO: handle non-translate transforms properly!
+ region->translate(transform.getTranslateX(), transform.getTranslateY());
+ }
+}
+
} /* namespace uirenderer */
} /* namespace android */