Index: src/core/SkTextMapStateProc.h |
diff --git a/src/core/SkTextMapStateProc.h b/src/core/SkTextMapStateProc.h |
index 5a8dcaa3b1a5b9e84c2fc3e127498a644c9d0697..8ef9389b3ab5f07d3ae76654ef922cf33f04e5d4 100644 |
--- a/src/core/SkTextMapStateProc.h |
+++ b/src/core/SkTextMapStateProc.h |
@@ -13,20 +13,22 @@ |
class SkTextMapStateProc { |
public: |
- SkTextMapStateProc(const SkMatrix& matrix, SkScalar y, int scalarsPerPosition) |
+ SkTextMapStateProc(const SkMatrix& matrix, const SkPoint& offset, int scalarsPerPosition) |
: fMatrix(matrix) |
, fProc(matrix.getMapXYProc()) |
- , fY(y) |
- , fScaleX(fMatrix.getScaleX()) |
- , fTransX(fMatrix.getTranslateX()) { |
+ , fOffset(offset) |
+ , fScaleX(fMatrix.getScaleX()) { |
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(); |
+ // Bake the matrix scale/translation components into fOffset, |
+ // to expedite proc computations. |
+ fOffset.set(SkScalarMul(offset.x(), fMatrix.getScaleX()) + fMatrix.getTranslateX(), |
+ SkScalarMul(offset.y(), fMatrix.getScaleY()) + fMatrix.getTranslateY()); |
+ |
if (mtype & SkMatrix::kScale_Mask) { |
fMapCase = kOnlyScaleX; |
} else { |
@@ -49,25 +51,25 @@ |
kX |
} fMapCase; |
const SkMatrix::MapXYProc fProc; |
- SkScalar fY; // Ignored by kXY case. |
- SkScalar fScaleX, fTransX; // These are only used by Only... cases. |
+ SkPoint fOffset; // In kOnly* mode, this includes the matrix translation component. |
+ SkScalar fScaleX; // This is only used by kOnly... cases. |
}; |
inline void SkTextMapStateProc::operator()(const SkScalar pos[], SkPoint* loc) const { |
switch(fMapCase) { |
case kXY: |
- fProc(fMatrix, pos[0], pos[1], loc); |
+ fProc(fMatrix, pos[0] + fOffset.x(), pos[1] + fOffset.y(), loc); |
break; |
case kOnlyScaleX: |
- loc->set(SkScalarMul(fScaleX, *pos) + fTransX, fY); |
+ loc->set(SkScalarMul(fScaleX, *pos) + fOffset.x(), fOffset.y()); |
break; |
case kOnlyTransX: |
- loc->set(*pos + fTransX, fY); |
+ loc->set(*pos + fOffset.x(), fOffset.y()); |
break; |
default: |
SkASSERT(false); |
case kX: |
- fProc(fMatrix, *pos, fY, loc); |
+ fProc(fMatrix, *pos + fOffset.x(), fOffset.y(), loc); |
break; |
} |
} |