Chromium Code Reviews| Index: src/core/SkDraw.cpp |
| diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp |
| index d2d618090e39d4e085bbf5cf8174721bbe990b93..3e8f95fec699a0e878251b10940502c36f212df9 100644 |
| --- a/src/core/SkDraw.cpp |
| +++ b/src/core/SkDraw.cpp |
| @@ -1680,11 +1680,24 @@ void SkDraw::drawText(const char text[], size_t byteLength, |
| SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); |
| - SkAutoGlyphCache autoCache(paint, &fDevice->fLeakyProperties, fMatrix); |
| + const SkMatrix* ctm = fMatrix; |
| + const SkPaint* paintRef = &paint; |
| + SkPaint paintCopy; |
| + uint32_t procFlags = fProcs ? fProcs->fFlags : 0; |
| + if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { |
| + paintCopy = paint; |
| + paintCopy.setTextSize(32); |
|
bungeman-skia
2013/10/24 19:50:48
32 is quite a magic number. If you want a 'canonic
|
| + paintCopy.setLCDRenderText(false); |
| + paintRef = &paintCopy; |
| + } |
| + if (procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag) { |
| + ctm = NULL; |
| + } |
| + SkAutoGlyphCache autoCache(*paintRef, &fDevice->fLeakyProperties, ctm); |
| SkGlyphCache* cache = autoCache.getCache(); |
| // transform our starting point |
| - { |
| + if (!(procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag)) { |
| SkPoint loc; |
| fMatrix->mapXY(x, y, &loc); |
| x = loc.fX; |
| @@ -1742,16 +1755,31 @@ void SkDraw::drawText(const char text[], size_t byteLength, |
| SkFixed fx = SkScalarToFixed(x) + d1g.fHalfSampleX; |
| SkFixed fy = SkScalarToFixed(y) + d1g.fHalfSampleY; |
| + SkFixed fscale; |
| + if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { |
| + SkScalar sscale = paint.getTextSize()/32.f; |
| + fscale = SkScalarToFixed(sscale); |
| + } |
| while (text < stop) { |
| const SkGlyph& glyph = glyphCacheProc(cache, &text, fx & fxMask, fy & fyMask); |
| - fx += autokern.adjust(glyph); |
| + if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { |
| + fx += SkFixedMul_portable(autokern.adjust(glyph), fscale); |
| + } else { |
| + fx += autokern.adjust(glyph); |
| + } |
| if (glyph.fWidth) { |
| proc(d1g, fx, fy, glyph); |
| } |
| - fx += glyph.fAdvanceX; |
| - fy += glyph.fAdvanceY; |
| + |
| + if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { |
| + fx += SkFixedMul_portable(glyph.fAdvanceX, fscale); |
| + fy += SkFixedMul_portable(glyph.fAdvanceY, fscale); |
| + } else { |
| + fx += glyph.fAdvanceX; |
| + fy += glyph.fAdvanceY; |
| + } |
| } |
| } |
| @@ -1909,7 +1937,19 @@ void SkDraw::drawPosText(const char text[], size_t byteLength, |
| } |
| SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); |
| - SkAutoGlyphCache autoCache(paint, &fDevice->fLeakyProperties, fMatrix); |
| + const SkMatrix* ctm = fMatrix; |
| + const SkPaint* paintRef = &paint; |
| + SkPaint paintCopy; |
| + uint32_t procFlags = fProcs ? fProcs->fFlags : 0; |
| + if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { |
| + paintCopy = paint; |
| + paintCopy.setTextSize(32); |
| + paintRef = &paintCopy; |
| + } |
| + if (procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag) { |
| + ctm = NULL; |
| + } |
| + SkAutoGlyphCache autoCache(*paintRef, &fDevice->fLeakyProperties, ctm); |
| SkGlyphCache* cache = autoCache.getCache(); |
| SkAAClipBlitterWrapper wrapper; |
| @@ -1951,7 +1991,12 @@ void SkDraw::drawPosText(const char text[], size_t byteLength, |
| if (SkPaint::kLeft_Align == paint.getTextAlign()) { |
| while (text < stop) { |
| - tmsProc(tms, pos); |
| + if (procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag) { |
| + tms.fLoc.fX = *pos; |
| + tms.fLoc.fY = *(pos+1); |
| + } else { |
| + tmsProc(tms, pos); |
| + } |
| SkFixed fx = SkScalarToFixed(tms.fLoc.fX) + d1g.fHalfSampleX; |
| SkFixed fy = SkScalarToFixed(tms.fLoc.fY) + d1g.fHalfSampleY; |