OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkTypes.h" | 8 #include "SkTypes.h" |
9 #undef GetGlyphIndices | 9 #undef GetGlyphIndices |
10 | 10 |
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 } | 559 } |
560 | 560 |
561 protected: | 561 protected: |
562 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; | 562 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; |
563 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; | 563 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; |
564 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; | 564 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; |
565 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( | 565 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( |
566 SkAdvancedTypefaceMetrics::PerGlyphInfo, | 566 SkAdvancedTypefaceMetrics::PerGlyphInfo, |
567 const uint32_t*, uint32_t) const SK_OVERRIDE; | 567 const uint32_t*, uint32_t) const SK_OVERRIDE; |
568 virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE
; | 568 virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE
; |
| 569 virtual int onCharsToGlyphs(const void* chars, Encoding encoding, |
| 570 uint16_t glyphs[], int glyphCount) const SK_OVER
RIDE; |
569 virtual int onCountGlyphs() const SK_OVERRIDE; | 571 virtual int onCountGlyphs() const SK_OVERRIDE; |
570 virtual int onGetUPEM() const SK_OVERRIDE; | 572 virtual int onGetUPEM() const SK_OVERRIDE; |
571 virtual SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const SK_
OVERRIDE; | 573 virtual SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const SK_
OVERRIDE; |
572 virtual int onGetTableTags(SkFontTableTag tags[]) const SK_OVERRIDE; | 574 virtual int onGetTableTags(SkFontTableTag tags[]) const SK_OVERRIDE; |
573 virtual size_t onGetTableData(SkFontTableTag, size_t offset, | 575 virtual size_t onGetTableData(SkFontTableTag, size_t offset, |
574 size_t length, void* data) const SK_OVERRIDE; | 576 size_t length, void* data) const SK_OVERRIDE; |
575 virtual SkTypeface* onRefMatchingStyle(Style) const SK_OVERRIDE; | 577 virtual SkTypeface* onRefMatchingStyle(Style) const SK_OVERRIDE; |
576 }; | 578 }; |
577 | 579 |
578 class SkScalerContext_DW : public SkScalerContext { | 580 class SkScalerContext_DW : public SkScalerContext { |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1124 SkSMallocWCHAR dwFamilyNameChar(dwFamilyNamesLength+1); | 1126 SkSMallocWCHAR dwFamilyNameChar(dwFamilyNamesLength+1); |
1125 HRV(dwFamilyNames->GetString(0, dwFamilyNameChar.get(), dwFamilyNamesLength+
1)); | 1127 HRV(dwFamilyNames->GetString(0, dwFamilyNameChar.get(), dwFamilyNamesLength+
1)); |
1126 | 1128 |
1127 SkString utf8FamilyName; | 1129 SkString utf8FamilyName; |
1128 HRV(wchar_to_skstring(dwFamilyNameChar.get(), &utf8FamilyName)); | 1130 HRV(wchar_to_skstring(dwFamilyNameChar.get(), &utf8FamilyName)); |
1129 | 1131 |
1130 desc->setFamilyName(utf8FamilyName.c_str()); | 1132 desc->setFamilyName(utf8FamilyName.c_str()); |
1131 *isLocalStream = SkToBool(fDWriteFontFileLoader.get()); | 1133 *isLocalStream = SkToBool(fDWriteFontFileLoader.get()); |
1132 } | 1134 } |
1133 | 1135 |
| 1136 static SkUnichar next_utf8(const void** chars) { |
| 1137 return SkUTF8_NextUnichar((const char**)chars); |
| 1138 } |
| 1139 |
| 1140 static SkUnichar next_utf16(const void** chars) { |
| 1141 return SkUTF16_NextUnichar((const uint16_t**)chars); |
| 1142 } |
| 1143 |
| 1144 static SkUnichar next_utf32(const void** chars) { |
| 1145 const SkUnichar** uniChars = (const SkUnichar**)chars; |
| 1146 SkUnichar uni = **uniChars; |
| 1147 *uniChars += 1; |
| 1148 return uni; |
| 1149 } |
| 1150 |
| 1151 typedef SkUnichar (*EncodingProc)(const void**); |
| 1152 |
| 1153 static EncodingProc find_encoding_proc(SkTypeface::Encoding enc) { |
| 1154 static const EncodingProc gProcs[] = { |
| 1155 next_utf8, next_utf16, next_utf32 |
| 1156 }; |
| 1157 SkASSERT((size_t)enc < SK_ARRAY_COUNT(gProcs)); |
| 1158 return gProcs[enc]; |
| 1159 } |
| 1160 |
| 1161 int DWriteFontTypeface::onCharsToGlyphs(const void* chars, Encoding encoding, |
| 1162 uint16_t glyphs[], int glyphCount) const |
| 1163 { |
| 1164 if (NULL == glyphs) { |
| 1165 EncodingProc next_ucs4_proc = find_encoding_proc(encoding); |
| 1166 for (int i = 0; i < glyphCount; ++i) { |
| 1167 const SkUnichar c = next_ucs4_proc(&chars); |
| 1168 BOOL exists; |
| 1169 fDWriteFont->HasCharacter(c, &exists); |
| 1170 if (!exists) { |
| 1171 return i; |
| 1172 } |
| 1173 } |
| 1174 return glyphCount; |
| 1175 } |
| 1176 |
| 1177 switch (encoding) { |
| 1178 case SkTypeface::kUTF8_Encoding: |
| 1179 case SkTypeface::kUTF16_Encoding: { |
| 1180 static const int scratchCount = 256; |
| 1181 UINT32 scratch[scratchCount]; |
| 1182 EncodingProc next_ucs4_proc = find_encoding_proc(encoding); |
| 1183 for (int baseGlyph = 0; baseGlyph < glyphCount; baseGlyph += scratchCoun
t) { |
| 1184 int glyphsLeft = glyphCount - baseGlyph; |
| 1185 int limit = SkTMin(glyphsLeft, scratchCount); |
| 1186 for (int i = 0; i < limit; ++i) { |
| 1187 scratch[i] = next_ucs4_proc(&chars); |
| 1188 } |
| 1189 fDWriteFontFace->GetGlyphIndices(scratch, limit, &glyphs[baseGlyph])
; |
| 1190 } |
| 1191 break; |
| 1192 } |
| 1193 case SkTypeface::kUTF32_Encoding: |
| 1194 const UINT32* utf32 = reinterpret_cast<const UINT32*>(chars); |
| 1195 fDWriteFontFace->GetGlyphIndices(utf32, glyphCount, glyphs); |
| 1196 break; |
| 1197 default: |
| 1198 SK_CRASH(); |
| 1199 } |
| 1200 |
| 1201 for (int i = 0; i < glyphCount; ++i) { |
| 1202 if (0 == glyphs[i]) { |
| 1203 return i; |
| 1204 } |
| 1205 } |
| 1206 return glyphCount; |
| 1207 } |
| 1208 |
1134 int DWriteFontTypeface::onCountGlyphs() const { | 1209 int DWriteFontTypeface::onCountGlyphs() const { |
1135 return fDWriteFontFace->GetGlyphCount(); | 1210 return fDWriteFontFace->GetGlyphCount(); |
1136 } | 1211 } |
1137 | 1212 |
1138 int DWriteFontTypeface::onGetUPEM() const { | 1213 int DWriteFontTypeface::onGetUPEM() const { |
1139 DWRITE_FONT_METRICS metrics; | 1214 DWRITE_FONT_METRICS metrics; |
1140 fDWriteFontFace->GetMetrics(&metrics); | 1215 fDWriteFontFace->GetMetrics(&metrics); |
1141 return metrics.designUnitsPerEm; | 1216 return metrics.designUnitsPerEm; |
1142 } | 1217 } |
1143 | 1218 |
(...skipping 786 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1930 SK_TRACEHR(hr, "Could not get GetUserDefaultLocaleName."); | 2005 SK_TRACEHR(hr, "Could not get GetUserDefaultLocaleName."); |
1931 } else { | 2006 } else { |
1932 localeNameLen = getUserDefaultLocaleNameProc(localeNameStorage, LOCALE_N
AME_MAX_LENGTH); | 2007 localeNameLen = getUserDefaultLocaleNameProc(localeNameStorage, LOCALE_N
AME_MAX_LENGTH); |
1933 if (localeNameLen) { | 2008 if (localeNameLen) { |
1934 localeName = localeNameStorage; | 2009 localeName = localeNameStorage; |
1935 }; | 2010 }; |
1936 } | 2011 } |
1937 | 2012 |
1938 return SkNEW_ARGS(SkFontMgr_DirectWrite, (sysFontCollection.get(), localeNam
e, localeNameLen)); | 2013 return SkNEW_ARGS(SkFontMgr_DirectWrite, (sysFontCollection.get(), localeNam
e, localeNameLen)); |
1939 } | 2014 } |
OLD | NEW |