Index: src/gpu/GrBitmapTextContext.cpp |
diff --git a/src/gpu/GrBitmapTextContext.cpp b/src/gpu/GrBitmapTextContext.cpp |
index a3e9cb3d794905ce6e673dbd21ac3453585740a5..b7a858dcaba13de8fd53d032f4a1ab3b60678c2b 100755 |
--- a/src/gpu/GrBitmapTextContext.cpp |
+++ b/src/gpu/GrBitmapTextContext.cpp |
@@ -20,9 +20,11 @@ |
#include "SkAutoKern.h" |
#include "SkDraw.h" |
+#include "SkDrawProcs.h" |
#include "SkGlyphCache.h" |
#include "SkGpuDevice.h" |
#include "SkGr.h" |
+#include "SkTextMapStateProc.h" |
SK_CONF_DECLARE(bool, c_DumpFontCache, "gpu.dumpFontCache", false, |
"Dump the contents of the font cache before every purge."); |
@@ -263,98 +265,6 @@ void GrBitmapTextContext::drawText(const GrPaint& paint, const SkPaint& skPaint, |
this->finish(); |
} |
-/////////////////////////////////////////////////////////////////////////////// |
-// Copied from SkDraw |
- |
-// last parameter is interpreted as SkFixed [x, y] |
-// return the fixed position, which may be rounded or not by the caller |
-// e.g. subpixel doesn't round |
-typedef void (*AlignProc)(const SkPoint&, const SkGlyph&, SkIPoint*); |
- |
-static void leftAlignProc(const SkPoint& loc, const SkGlyph& glyph, SkIPoint* dst) { |
- dst->set(SkScalarToFixed(loc.fX), SkScalarToFixed(loc.fY)); |
-} |
- |
-static void centerAlignProc(const SkPoint& loc, const SkGlyph& glyph, SkIPoint* dst) { |
- dst->set(SkScalarToFixed(loc.fX) - (glyph.fAdvanceX >> 1), |
- SkScalarToFixed(loc.fY) - (glyph.fAdvanceY >> 1)); |
-} |
- |
-static void rightAlignProc(const SkPoint& loc, const SkGlyph& glyph, SkIPoint* dst) { |
- dst->set(SkScalarToFixed(loc.fX) - glyph.fAdvanceX, |
- SkScalarToFixed(loc.fY) - glyph.fAdvanceY); |
-} |
- |
-static AlignProc pick_align_proc(SkPaint::Align align) { |
- static const AlignProc gProcs[] = { |
- leftAlignProc, centerAlignProc, rightAlignProc |
- }; |
- |
- SkASSERT((unsigned)align < SK_ARRAY_COUNT(gProcs)); |
- |
- return gProcs[align]; |
-} |
- |
-class BitmapTextMapState { |
-public: |
- mutable SkPoint fLoc; |
- |
- BitmapTextMapState(const SkMatrix& matrix, SkScalar y) |
- : fMatrix(matrix), fProc(matrix.getMapXYProc()), fY(y) {} |
- |
- typedef void (*Proc)(const BitmapTextMapState&, const SkScalar pos[]); |
- |
- Proc pickProc(int scalarsPerPosition); |
- |
-private: |
- const SkMatrix& fMatrix; |
- SkMatrix::MapXYProc fProc; |
- SkScalar fY; // ignored by MapXYProc |
- // these are only used by Only... procs |
- SkScalar fScaleX, fTransX, fTransformedY; |
- |
- static void MapXProc(const BitmapTextMapState& state, const SkScalar pos[]) { |
- state.fProc(state.fMatrix, *pos, state.fY, &state.fLoc); |
- } |
- |
- static void MapXYProc(const BitmapTextMapState& state, const SkScalar pos[]) { |
- state.fProc(state.fMatrix, pos[0], pos[1], &state.fLoc); |
- } |
- |
- static void MapOnlyScaleXProc(const BitmapTextMapState& state, |
- const SkScalar pos[]) { |
- state.fLoc.set(SkScalarMul(state.fScaleX, *pos) + state.fTransX, |
- state.fTransformedY); |
- } |
- |
- static void MapOnlyTransXProc(const BitmapTextMapState& state, |
- const SkScalar pos[]) { |
- state.fLoc.set(*pos + state.fTransX, state.fTransformedY); |
- } |
-}; |
- |
-BitmapTextMapState::Proc BitmapTextMapState::pickProc(int scalarsPerPosition) { |
- SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); |
- |
- if (1 == scalarsPerPosition) { |
- unsigned mtype = fMatrix.getType(); |
- if (mtype & (SkMatrix::kAffine_Mask | SkMatrix::kPerspective_Mask)) { |
- return MapXProc; |
- } else { |
- fScaleX = fMatrix.getScaleX(); |
- fTransX = fMatrix.getTranslateX(); |
- fTransformedY = SkScalarMul(fY, fMatrix.getScaleY()) + |
- fMatrix.getTranslateY(); |
- return (mtype & SkMatrix::kScale_Mask) ? |
- MapOnlyScaleXProc : MapOnlyTransXProc; |
- } |
- } else { |
- return MapXYProc; |
- } |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPaint, |
const char text[], size_t byteLength, |
const SkScalar pos[], SkScalar constY, |
@@ -381,9 +291,8 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai |
autoMatrix.setIdentity(fContext, &fPaint); |
const char* stop = text + byteLength; |
- AlignProc alignProc = pick_align_proc(fSkPaint.getTextAlign()); |
- BitmapTextMapState tms(ctm, constY); |
- BitmapTextMapState::Proc tmsProc = tms.pickProc(scalarsPerPosition); |
+ SkTextAlignProc alignProc(fSkPaint.getTextAlign()); |
+ SkTextMapStateProc tmsProc(ctm, constY, scalarsPerPosition); |
SkFixed halfSampleX = 0, halfSampleY = 0; |
if (cache->isSubpixel()) { |
@@ -406,9 +315,10 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai |
if (SkPaint::kLeft_Align == fSkPaint.getTextAlign()) { |
while (text < stop) { |
- tmsProc(tms, pos); |
- SkFixed fx = SkScalarToFixed(tms.fLoc.fX) + halfSampleX; |
- SkFixed fy = SkScalarToFixed(tms.fLoc.fY) + halfSampleY; |
+ SkPoint tmsLoc; |
+ tmsProc(pos, &tmsLoc); |
+ SkFixed fx = SkScalarToFixed(tmsLoc.fX) + halfSampleX; |
+ SkFixed fy = SkScalarToFixed(tmsLoc.fY) + halfSampleY; |
const SkGlyph& glyph = glyphCacheProc(cache, &text, |
fx & fxMask, fy & fyMask); |
@@ -431,10 +341,10 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai |
if (metricGlyph.fWidth) { |
SkDEBUGCODE(SkFixed prevAdvX = metricGlyph.fAdvanceX;) |
SkDEBUGCODE(SkFixed prevAdvY = metricGlyph.fAdvanceY;) |
- |
- tmsProc(tms, pos); |
+ SkPoint tmsLoc; |
+ tmsProc(pos, &tmsLoc); |
SkIPoint fixedLoc; |
- alignProc(tms.fLoc, metricGlyph, &fixedLoc); |
+ alignProc(tmsLoc, metricGlyph, &fixedLoc); |
SkFixed fx = fixedLoc.fX + halfSampleX; |
SkFixed fy = fixedLoc.fY + halfSampleY; |
@@ -465,10 +375,11 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai |
const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
if (glyph.fWidth) { |
- tmsProc(tms, pos); |
+ SkPoint tmsLoc; |
+ tmsProc(pos, &tmsLoc); |
- SkFixed fx = SkScalarToFixed(tms.fLoc.fX) + SK_FixedHalf; //halfSampleX; |
- SkFixed fy = SkScalarToFixed(tms.fLoc.fY) + SK_FixedHalf; //halfSampleY; |
+ SkFixed fx = SkScalarToFixed(tmsLoc.fX) + SK_FixedHalf; //halfSampleX; |
+ SkFixed fy = SkScalarToFixed(tmsLoc.fY) + SK_FixedHalf; //halfSampleY; |
this->drawPackedGlyph(GrGlyph::Pack(glyph.getGlyphID(), |
glyph.getSubXFixed(), |
glyph.getSubYFixed()), |
@@ -484,10 +395,11 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai |
const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
if (glyph.fWidth) { |
- tmsProc(tms, pos); |
+ SkPoint tmsLoc; |
+ tmsProc(pos, &tmsLoc); |
SkIPoint fixedLoc; |
- alignProc(tms.fLoc, glyph, &fixedLoc); |
+ alignProc(tmsLoc, glyph, &fixedLoc); |
SkFixed fx = fixedLoc.fX + SK_FixedHalf; //halfSampleX; |
SkFixed fy = fixedLoc.fY + SK_FixedHalf; //halfSampleY; |