diff options
author | 2012-03-14 19:41:55 +0000 | |
---|---|---|
committer | 2012-03-14 19:41:55 +0000 | |
commit | 68bc6f7b4510813c1af886d0cdeea2f0f7a2a510 (patch) | |
tree | a1ce9d16b8a4850d6795ff284b850541476aa701 /src/core/SkPaint.cpp | |
parent | 610f716b00f214e4899a102c1bbc1d6a323e114e (diff) |
add kUTF32_TextEncoding
git-svn-id: http://skia.googlecode.com/svn/trunk@3387 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkPaint.cpp')
-rw-r--r-- | src/core/SkPaint.cpp | 102 |
1 files changed, 97 insertions, 5 deletions
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index 4f5128f7a2..68d7561ab5 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -440,6 +440,8 @@ int SkPaint::textToGlyphs(const void* textData, size_t byteLength, case kUTF16_TextEncoding: return SkUTF16_CountUnichars((const uint16_t*)textData, byteLength >> 1); + case kUTF32_TextEncoding: + return byteLength >> 2; case kGlyphID_TextEncoding: return byteLength >> 1; default: @@ -478,6 +480,14 @@ int SkPaint::textToGlyphs(const void* textData, size_t byteLength, } break; } + case kUTF32_TextEncoding: { + const int32_t* text32 = (const int32_t*)text; + const int32_t* stop32 = (const int32_t*)stop; + while (text32 < stop32) { + *gptr++ = cache->unicharToGlyph(*text32++); + } + break; + } default: SkDEBUGFAIL("unknown text encoding"); } @@ -527,6 +537,16 @@ bool SkPaint::containsText(const void* textData, size_t byteLength) const { } break; } + case SkPaint::kUTF32_TextEncoding: { + const int32_t* text = static_cast<const int32_t*>(textData); + const int32_t* stop = text + (byteLength >> 2); + while (text < stop) { + if (0 == cache->unicharToGlyph(*text++)) { + return false; + } + } + break; + } default: SkDEBUGFAIL("unknown text encoding"); return false; @@ -573,7 +593,7 @@ static const SkGlyph& sk_getMetrics_utf16_next(SkGlyphCache* cache, const char** text) { SkASSERT(cache != NULL); SkASSERT(text != NULL); - + return cache->getUnicharMetrics(SkUTF16_NextUnichar((const uint16_t**)text)); } @@ -581,10 +601,32 @@ static const SkGlyph& sk_getMetrics_utf16_prev(SkGlyphCache* cache, const char** text) { SkASSERT(cache != NULL); SkASSERT(text != NULL); - + return cache->getUnicharMetrics(SkUTF16_PrevUnichar((const uint16_t**)text)); } +static const SkGlyph& sk_getMetrics_utf32_next(SkGlyphCache* cache, + const char** text) { + SkASSERT(cache != NULL); + SkASSERT(text != NULL); + + const int32_t* ptr = *(const int32_t**)text; + SkUnichar uni = *ptr++; + *text = (const char*)ptr; + return cache->getUnicharMetrics(uni); +} + +static const SkGlyph& sk_getMetrics_utf32_prev(SkGlyphCache* cache, + const char** text) { + SkASSERT(cache != NULL); + SkASSERT(text != NULL); + + const int32_t* ptr = *(const int32_t**)text; + SkUnichar uni = *--ptr; + *text = (const char*)ptr; + return cache->getUnicharMetrics(uni); +} + static const SkGlyph& sk_getMetrics_glyph_next(SkGlyphCache* cache, const char** text) { SkASSERT(cache != NULL); @@ -641,6 +683,28 @@ static const SkGlyph& sk_getAdvance_utf16_prev(SkGlyphCache* cache, return cache->getUnicharAdvance(SkUTF16_PrevUnichar((const uint16_t**)text)); } +static const SkGlyph& sk_getAdvance_utf32_next(SkGlyphCache* cache, + const char** text) { + SkASSERT(cache != NULL); + SkASSERT(text != NULL); + + const int32_t* ptr = *(const int32_t**)text; + SkUnichar uni = *ptr++; + *text = (const char*)ptr; + return cache->getUnicharAdvance(uni); +} + +static const SkGlyph& sk_getAdvance_utf32_prev(SkGlyphCache* cache, + const char** text) { + SkASSERT(cache != NULL); + SkASSERT(text != NULL); + + const int32_t* ptr = *(const int32_t**)text; + SkUnichar uni = *--ptr; + *text = (const char*)ptr; + return cache->getUnicharAdvance(uni); +} + static const SkGlyph& sk_getAdvance_glyph_next(SkGlyphCache* cache, const char** text) { SkASSERT(cache != NULL); @@ -670,28 +734,32 @@ SkMeasureCacheProc SkPaint::getMeasureCacheProc(TextBufferDirection tbd, static const SkMeasureCacheProc gMeasureCacheProcs[] = { sk_getMetrics_utf8_next, sk_getMetrics_utf16_next, + sk_getMetrics_utf32_next, sk_getMetrics_glyph_next, sk_getMetrics_utf8_prev, sk_getMetrics_utf16_prev, + sk_getMetrics_utf32_prev, sk_getMetrics_glyph_prev, sk_getAdvance_utf8_next, sk_getAdvance_utf16_next, + sk_getAdvance_utf32_next, sk_getAdvance_glyph_next, sk_getAdvance_utf8_prev, sk_getAdvance_utf16_prev, + sk_getAdvance_utf32_prev, sk_getAdvance_glyph_prev }; unsigned index = this->getTextEncoding(); if (kBackward_TextBufferDirection == tbd) { - index += 3; + index += 4; } if (!needFullMetrics && !this->isDevKernText()) { - index += 6; + index += 8; } SkASSERT(index < SK_ARRAY_COUNT(gMeasureCacheProcs)); @@ -733,6 +801,28 @@ static const SkGlyph& sk_getMetrics_utf16_xy(SkGlyphCache* cache, x, y); } +static const SkGlyph& sk_getMetrics_utf32_00(SkGlyphCache* cache, + const char** text, SkFixed, SkFixed) { + SkASSERT(cache != NULL); + SkASSERT(text != NULL); + + const int32_t* ptr = *(const int32_t**)text; + SkUnichar uni = *ptr++; + *text = (const char*)ptr; + return cache->getUnicharMetrics(uni); +} + +static const SkGlyph& sk_getMetrics_utf32_xy(SkGlyphCache* cache, + const char** text, SkFixed x, SkFixed y) { + SkASSERT(cache != NULL); + SkASSERT(text != NULL); + + const int32_t* ptr = *(const int32_t**)text; + SkUnichar uni = *--ptr; + *text = (const char*)ptr; + return cache->getUnicharMetrics(uni); +} + static const SkGlyph& sk_getMetrics_glyph_00(SkGlyphCache* cache, const char** text, SkFixed, SkFixed) { SkASSERT(cache != NULL); @@ -761,16 +851,18 @@ SkDrawCacheProc SkPaint::getDrawCacheProc() const { static const SkDrawCacheProc gDrawCacheProcs[] = { sk_getMetrics_utf8_00, sk_getMetrics_utf16_00, + sk_getMetrics_utf32_00, sk_getMetrics_glyph_00, sk_getMetrics_utf8_xy, sk_getMetrics_utf16_xy, + sk_getMetrics_utf32_xy, sk_getMetrics_glyph_xy }; unsigned index = this->getTextEncoding(); if (fFlags & kSubpixelText_Flag) { - index += 3; + index += 4; } SkASSERT(index < SK_ARRAY_COUNT(gDrawCacheProcs)); |