Try out SkMatrix::Concat.
This should RVO to the same as doing it on the stack with setConcat.
BUG=skia:
R=reed@google.com, mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/293693002
git-svn-id: http://skia.googlecode.com/svn/trunk@14782 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/core/SkMatrix.h b/include/core/SkMatrix.h
index 8394c38..e225336 100644
--- a/include/core/SkMatrix.h
+++ b/include/core/SkMatrix.h
@@ -590,6 +590,15 @@
static const SkMatrix& InvalidMatrix();
/**
+ * Return the concatenation of two matrices, a * b.
+ */
+ static SkMatrix Concat(const SkMatrix& a, const SkMatrix& b) {
+ SkMatrix result;
+ result.setConcat(a, b);
+ return result;
+ }
+
+ /**
* Testing routine; the matrix's type cache should never need to be
* manually invalidated during normal use.
*/
diff --git a/src/record/SkRecordDraw.cpp b/src/record/SkRecordDraw.cpp
index 5df1650..2bf7076 100644
--- a/src/record/SkRecordDraw.cpp
+++ b/src/record/SkRecordDraw.cpp
@@ -38,13 +38,7 @@
DRAW(PushCull, pushCull(r.rect));
DRAW(Clear, clear(r.color));
DRAW(Concat, concat(r.matrix));
-
-// We can't clobber the canvas' initial CTM when calling setMatrix.
-template <> void Draw::draw(const SetMatrix& r) {
- SkMatrix ctm;
- ctm.setConcat(fInitialCTM, r.matrix);
- fCanvas->setMatrix(ctm);
-}
+DRAW(SetMatrix, setMatrix(SkMatrix::Concat(fInitialCTM, r.matrix)));
DRAW(ClipPath, clipPath(r.path, r.op, r.doAA));
DRAW(ClipRRect, clipRRect(r.rrect, r.op, r.doAA));
diff --git a/tests/MatrixTest.cpp b/tests/MatrixTest.cpp
index 9e39d5b2..ab406fb 100644
--- a/tests/MatrixTest.cpp
+++ b/tests/MatrixTest.cpp
@@ -785,3 +785,16 @@
test_matrix_decomposition(reporter);
test_matrix_homogeneous(reporter);
}
+
+DEF_TEST(Matrix_Concat, r) {
+ SkMatrix a;
+ a.setTranslate(10, 20);
+
+ SkMatrix b;
+ b.setScale(3, 5);
+
+ SkMatrix expected;
+ expected.setConcat(a,b);
+
+ REPORTER_ASSERT(r, expected == SkMatrix::Concat(a, b));
+}