add kUTF32_TextEncoding

git-svn-id: http://skia.googlecode.com/svn/trunk@3387 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2012-03-14 19:41:55 +00:00
parent 610f716b00
commit 68bc6f7b45
2 changed files with 98 additions and 5 deletions

View File

@ -696,6 +696,7 @@ public:
enum TextEncoding {
kUTF8_TextEncoding, //!< the text parameters are UTF8
kUTF16_TextEncoding, //!< the text parameters are UTF16
kUTF32_TextEncoding, //!< teh text parameters are UTF32
kGlyphID_TextEncoding //!< the text parameters are glyph indices
};

View File

@ -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));