Fix GC issue, fix local shader transformations.
Change-Id: I208bdf89815dcd18dcadd43df932a77362918435
diff --git a/libs/hwui/Matrix.cpp b/libs/hwui/Matrix.cpp
index c64b483..74d50e4 100644
--- a/libs/hwui/Matrix.cpp
+++ b/libs/hwui/Matrix.cpp
@@ -80,7 +80,7 @@
data[kScaleZ] = 1.0f;
- mSimpleMatrix = (!v[SkMatrix::kMPersp0] && !v[SkMatrix::kMPersp1] && !v[SkMatrix::kMPersp2]);
+ mSimpleMatrix = (v.getType() <= SkMatrix::kScale_Mask);
}
void Matrix4::copyTo(SkMatrix& v) const {
@@ -232,9 +232,26 @@
data[kTranslateZ] = -(far + near) / (far - near);
}
+#define MUL_ADD_STORE(a, b, c) a = (a) * (b) + (c)
+
+void Matrix4::mapPoint(float& x, float& y) const {
+ if (mSimpleMatrix) {
+ MUL_ADD_STORE(x, data[kScaleX], data[kTranslateX]);
+ MUL_ADD_STORE(y, data[kScaleY], data[kTranslateY]);
+ return;
+ }
+
+ float dx = x * data[kScaleX] + y * data[kSkewX] + data[kTranslateX];
+ float dy = x * data[kSkewY] + y * data[kScaleY] + data[kTranslateY];
+ float dz = x * data[kPerspective0] + y * data[kPerspective1] + data[kPerspective2];
+ if (dz) dz = 1.0f / dz;
+
+ x = dx * dz;
+ y = dy * dz;
+}
+
void Matrix4::mapRect(Rect& r) const {
if (mSimpleMatrix) {
- #define MUL_ADD_STORE(a, b, c) a = (a) * (b) + (c)
MUL_ADD_STORE(r.left, data[kScaleX], data[kTranslateX]);
MUL_ADD_STORE(r.right, data[kScaleX], data[kTranslateX]);
MUL_ADD_STORE(r.top, data[kScaleY], data[kTranslateY]);