| /* |
| * Copyright 2010 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "GrTextContext.h" |
| #include "GrContext.h" |
| |
| #include "SkAutoKern.h" |
| #include "SkGlyphCache.h" |
| #include "GrFontScaler.h" |
| |
| GrTextContext::GrTextContext(GrContext* context, const SkDeviceProperties& properties) : |
| fContext(context), fDeviceProperties(properties), fDrawTarget(NULL) { |
| } |
| |
| void GrTextContext::init(const GrPaint& grPaint, const SkPaint& skPaint) { |
| const GrClipData* clipData = fContext->getClip(); |
| |
| SkRect devConservativeBound; |
| clipData->fClipStack->getConservativeBounds( |
| -clipData->fOrigin.fX, |
| -clipData->fOrigin.fY, |
| fContext->getRenderTarget()->width(), |
| fContext->getRenderTarget()->height(), |
| &devConservativeBound); |
| |
| devConservativeBound.roundOut(&fClipRect); |
| |
| fDrawTarget = fContext->getTextTarget(); |
| |
| fPaint = grPaint; |
| fSkPaint = skPaint; |
| } |
| |
| //*** 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(GrFontScaler, (cache)); |
| cache->setAuxProc(GlyphCacheAuxProc, scaler); |
| } |
| |
| return scaler; |
| } |