Index: src/core/SkTextMapStateProc.h |
diff --git a/src/core/SkTextMapStateProc.h b/src/core/SkTextMapStateProc.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5a8dcaa3b1a5b9e84c2fc3e127498a644c9d0697 |
--- /dev/null |
+++ b/src/core/SkTextMapStateProc.h |
@@ -0,0 +1,76 @@ |
+/* |
+ * Copyright 2014 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef SkTextMapStateProc_DEFINED |
+#define SkTextMapStateProc_DEFINED |
+ |
+#include "SkPoint.h" |
+#include "SkMatrix.h" |
+ |
+class SkTextMapStateProc { |
+public: |
+ SkTextMapStateProc(const SkMatrix& matrix, SkScalar y, int scalarsPerPosition) |
+ : fMatrix(matrix) |
+ , fProc(matrix.getMapXYProc()) |
+ , fY(y) |
+ , fScaleX(fMatrix.getScaleX()) |
+ , fTransX(fMatrix.getTranslateX()) { |
+ SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); |
+ if (1 == scalarsPerPosition) { |
+ unsigned mtype = fMatrix.getType(); |
+ if (mtype & (SkMatrix::kAffine_Mask | SkMatrix::kPerspective_Mask)) { |
+ fMapCase = kX; |
+ } else { |
+ fY = SkScalarMul(y, fMatrix.getScaleY()) + |
+ fMatrix.getTranslateY(); |
+ if (mtype & SkMatrix::kScale_Mask) { |
+ fMapCase = kOnlyScaleX; |
+ } else { |
+ fMapCase = kOnlyTransX; |
+ } |
+ } |
+ } else { |
+ fMapCase = kXY; |
+ } |
+ } |
+ |
+ void operator()(const SkScalar pos[], SkPoint* loc) const; |
+ |
+private: |
+ const SkMatrix& fMatrix; |
+ enum { |
+ kXY, |
+ kOnlyScaleX, |
+ kOnlyTransX, |
+ kX |
+ } fMapCase; |
+ const SkMatrix::MapXYProc fProc; |
+ SkScalar fY; // Ignored by kXY case. |
+ SkScalar fScaleX, fTransX; // These are only used by Only... cases. |
+}; |
+ |
+inline void SkTextMapStateProc::operator()(const SkScalar pos[], SkPoint* loc) const { |
+ switch(fMapCase) { |
+ case kXY: |
+ fProc(fMatrix, pos[0], pos[1], loc); |
+ break; |
+ case kOnlyScaleX: |
+ loc->set(SkScalarMul(fScaleX, *pos) + fTransX, fY); |
+ break; |
+ case kOnlyTransX: |
+ loc->set(*pos + fTransX, fY); |
+ break; |
+ default: |
+ SkASSERT(false); |
+ case kX: |
+ fProc(fMatrix, *pos, fY, loc); |
+ break; |
+ } |
+} |
+ |
+#endif |
+ |