Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(866)

Unified Diff: src/ports/SkFontHost_win_dw.cpp

Issue 22859070: Implement charToGlyph on remaining ports. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/ports/SkFontHost_win_dw.cpp
===================================================================
--- src/ports/SkFontHost_win_dw.cpp (revision 10894)
+++ src/ports/SkFontHost_win_dw.cpp (working copy)
@@ -554,6 +554,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;
@@ -1123,6 +1125,61 @@
*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
+{
+ EncodingProc next_uni_proc = find_encoding_proc(encoding);
+
+ if (NULL == glyphs) {
+ for (int i = 0; i < glyphCount; ++i) {
+ const SkUnichar c = next_uni_proc(&chars);
+ UINT16 glyphIndex;
+ fDWriteFontFace->GetGlyphIndices((UINT32*)&c, 1, &glyphIndex);
+ if (0 == glyphIndex) {
+ return i;
+ }
+ }
+ return glyphCount;
+ }
+
+ int first = glyphCount;
+ for (int i = 0; i < glyphCount; ++i) {
+ const SkUnichar c = next_uni_proc(&chars);
+ UINT16 glyphIndex;
+ fDWriteFontFace->GetGlyphIndices((UINT32*)&c, 1, &glyphIndex);
+ glyphs[i] = glyphIndex;
+ if (0 == glyphIndex && i < first) {
+ first = i;
+ }
+ }
+ return first;
+}
+
int DWriteFontTypeface::onCountGlyphs() const {
return fDWriteFontFace->GetGlyphCount();
}

Powered by Google App Engine
This is Rietveld 408576698