| Index: src/ports/SkFontHost_win_dw.cpp
|
| ===================================================================
|
| --- src/ports/SkFontHost_win_dw.cpp (revision 11929)
|
| +++ src/ports/SkFontHost_win_dw.cpp (working copy)
|
| @@ -566,6 +566,8 @@
|
| SkAdvancedTypefaceMetrics::PerGlyphInfo,
|
| const uint32_t*, uint32_t) const SK_OVERRIDE;
|
| virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE;
|
| + virtual int onCharsToGlyphs(const void* chars, Encoding encoding,
|
| + uint16_t glyphs[], int glyphCount) const SK_OVERRIDE;
|
| virtual int onCountGlyphs() const SK_OVERRIDE;
|
| virtual int onGetUPEM() const SK_OVERRIDE;
|
| virtual SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const SK_OVERRIDE;
|
| @@ -1131,6 +1133,79 @@
|
| *isLocalStream = SkToBool(fDWriteFontFileLoader.get());
|
| }
|
|
|
| +static SkUnichar next_utf8(const void** chars) {
|
| + return SkUTF8_NextUnichar((const char**)chars);
|
| +}
|
| +
|
| +static SkUnichar next_utf16(const void** chars) {
|
| + return SkUTF16_NextUnichar((const uint16_t**)chars);
|
| +}
|
| +
|
| +static SkUnichar next_utf32(const void** chars) {
|
| + const SkUnichar** uniChars = (const SkUnichar**)chars;
|
| + SkUnichar uni = **uniChars;
|
| + *uniChars += 1;
|
| + return uni;
|
| +}
|
| +
|
| +typedef SkUnichar (*EncodingProc)(const void**);
|
| +
|
| +static EncodingProc find_encoding_proc(SkTypeface::Encoding enc) {
|
| + static const EncodingProc gProcs[] = {
|
| + next_utf8, next_utf16, next_utf32
|
| + };
|
| + SkASSERT((size_t)enc < SK_ARRAY_COUNT(gProcs));
|
| + return gProcs[enc];
|
| +}
|
| +
|
| +int DWriteFontTypeface::onCharsToGlyphs(const void* chars, Encoding encoding,
|
| + uint16_t glyphs[], int glyphCount) const
|
| +{
|
| + if (NULL == glyphs) {
|
| + EncodingProc next_ucs4_proc = find_encoding_proc(encoding);
|
| + for (int i = 0; i < glyphCount; ++i) {
|
| + const SkUnichar c = next_ucs4_proc(&chars);
|
| + BOOL exists;
|
| + fDWriteFont->HasCharacter(c, &exists);
|
| + if (!exists) {
|
| + return i;
|
| + }
|
| + }
|
| + return glyphCount;
|
| + }
|
| +
|
| + switch (encoding) {
|
| + case SkTypeface::kUTF8_Encoding:
|
| + case SkTypeface::kUTF16_Encoding: {
|
| + static const int scratchCount = 256;
|
| + UINT32 scratch[scratchCount];
|
| + EncodingProc next_ucs4_proc = find_encoding_proc(encoding);
|
| + for (int baseGlyph = 0; baseGlyph < glyphCount; baseGlyph += scratchCount) {
|
| + int glyphsLeft = glyphCount - baseGlyph;
|
| + int limit = SkTMin(glyphsLeft, scratchCount);
|
| + for (int i = 0; i < limit; ++i) {
|
| + scratch[i] = next_ucs4_proc(&chars);
|
| + }
|
| + fDWriteFontFace->GetGlyphIndices(scratch, limit, &glyphs[baseGlyph]);
|
| + }
|
| + break;
|
| + }
|
| + case SkTypeface::kUTF32_Encoding:
|
| + const UINT32* utf32 = reinterpret_cast<const UINT32*>(chars);
|
| + fDWriteFontFace->GetGlyphIndices(utf32, glyphCount, glyphs);
|
| + break;
|
| + default:
|
| + SK_CRASH();
|
| + }
|
| +
|
| + for (int i = 0; i < glyphCount; ++i) {
|
| + if (0 == glyphs[i]) {
|
| + return i;
|
| + }
|
| + }
|
| + return glyphCount;
|
| +}
|
| +
|
| int DWriteFontTypeface::onCountGlyphs() const {
|
| return fDWriteFontFace->GetGlyphCount();
|
| }
|
|
|