diff options
-rw-r--r-- | include/core/SkPaint.h | 3 | ||||
-rw-r--r-- | src/core/SkPaint.cpp | 31 |
2 files changed, 34 insertions, 0 deletions
diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h index 7be5ad2..30ff663 100644 --- a/include/core/SkPaint.h +++ b/include/core/SkPaint.h @@ -870,6 +870,9 @@ public: /** Returns the base glyph count for the strike associated with this paint */ unsigned getBaseGlyphCount(SkUnichar text) const; + + int utfToGlyphs(const void* text, TextEncoding encoding, + size_t byteLength, uint16_t glyphs[]) const; #endif // returns true if the paint's settings (e.g. xfermode + alpha) resolve to diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index 82a1f57..07fe9b0 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -440,6 +440,37 @@ const void* SkPaint::findImage(const SkGlyph& glyph) { SkGlyphCache::AttachCache(cache); return image; } + +int SkPaint::utfToGlyphs(const void* textData, TextEncoding encoding, + size_t byteLength, uint16_t glyphs[]) const { + + SkAutoGlyphCache autoCache(*this, NULL); + SkGlyphCache* cache = autoCache.getCache(); + + const char* text = (const char*) textData; + const char* stop = text + byteLength; + uint16_t* gptr = glyphs; + + switch (encoding) { + case SkPaint::kUTF8_TextEncoding: + while (text < stop) { + *gptr++ = cache->unicharToGlyph(SkUTF8_NextUnichar(&text)); + } + break; + case SkPaint::kUTF16_TextEncoding: { + const uint16_t* text16 = (const uint16_t*)text; + const uint16_t* stop16 = (const uint16_t*)stop; + while (text16 < stop16) { + *gptr++ = cache->unicharToGlyph(SkUTF16_NextUnichar(&text16)); + } + break; + } + default: + SkDEBUGFAIL("unknown text encoding"); + } + return gptr - glyphs; +} + #endif int SkPaint::textToGlyphs(const void* textData, size_t byteLength, |