| 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;
|
| +}
|
| +
|
|
|