Index: src/gpu/GrTextContext.cpp |
diff --git a/src/gpu/GrTextContext.cpp b/src/gpu/GrTextContext.cpp |
index 77e98d2fd5fa30263707f34cf749f4099ba163d7..ab9ef85f1d1972d7e966948bec9d30755f2473bf 100644 |
--- a/src/gpu/GrTextContext.cpp |
+++ b/src/gpu/GrTextContext.cpp |
@@ -5,12 +5,17 @@ |
* found in the LICENSE file. |
*/ |
- |
#include "GrTextContext.h" |
+#include "GrContext.h" |
+ |
+#include "SkAutoKern.h" |
+#include "SkGlyphCache.h" |
+#include "SkGr.h" |
GrTextContext::GrTextContext(GrContext* context, const GrPaint& paint, |
- const SkPaint& skPaint) : fPaint(paint), fSkPaint(skPaint) { |
- fContext = context; |
+ const SkPaint& skPaint, const SkDeviceProperties& properties) : |
+ fContext(context), fPaint(paint), fSkPaint(skPaint), |
+ fDeviceProperties(properties) { |
const GrClipData* clipData = context->getClip(); |
@@ -24,5 +29,47 @@ GrTextContext::GrTextContext(GrContext* context, const GrPaint& paint, |
devConservativeBound.roundOut(&fClipRect); |
- fDrawTarget = fContext->getTextTarget(); |
+ fDrawTarget = context->getTextTarget(); |
} |
+ |
+//*** change to output positions? |
+void GrTextContext::MeasureText(SkGlyphCache* cache, SkDrawCacheProc glyphCacheProc, |
+ const char text[], size_t byteLength, SkVector* stopVector) { |
+ SkFixed x = 0, y = 0; |
+ const char* stop = text + byteLength; |
+ |
+ SkAutoKern autokern; |
+ |
+ while (text < stop) { |
+ // don't need x, y here, since all subpixel variants will have the |
+ // same advance |
+ const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); |
+ |
+ x += autokern.adjust(glyph) + glyph.fAdvanceX; |
+ y += glyph.fAdvanceY; |
+ } |
+ stopVector->set(SkFixedToScalar(x), SkFixedToScalar(y)); |
+ |
+ SkASSERT(text == stop); |
+} |
+ |
+static void GlyphCacheAuxProc(void* data) { |
+ GrFontScaler* scaler = (GrFontScaler*)data; |
+ SkSafeUnref(scaler); |
+} |
+ |
+GrFontScaler* GrTextContext::GetGrFontScaler(SkGlyphCache* cache) { |
+ void* auxData; |
+ GrFontScaler* scaler = NULL; |
+ |
+ if (cache->getAuxProcData(GlyphCacheAuxProc, &auxData)) { |
+ scaler = (GrFontScaler*)auxData; |
+ } |
+ if (NULL == scaler) { |
+ scaler = SkNEW_ARGS(SkGrFontScaler, (cache)); |
+ cache->setAuxProc(GlyphCacheAuxProc, scaler); |
+ } |
+ |
+ return scaler; |
+} |
+ |