| 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 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 *streamFontFileLoader = new StreamFontFileLoader(stream); | 222 *streamFontFileLoader = new StreamFontFileLoader(stream); |
| 223 if (NULL == streamFontFileLoader) { | 223 if (NULL == streamFontFileLoader) { |
| 224 return E_OUTOFMEMORY; | 224 return E_OUTOFMEMORY; |
| 225 } | 225 } |
| 226 return S_OK; | 226 return S_OK; |
| 227 } | 227 } |
| 228 | 228 |
| 229 SkAutoTUnref<SkStream> fStream; | 229 SkAutoTUnref<SkStream> fStream; |
| 230 | 230 |
| 231 private: | 231 private: |
| 232 StreamFontFileLoader(SkStream* stream) : fRefCount(1), fStream(stream) { | 232 StreamFontFileLoader(SkStream* stream) : fRefCount(1), fStream(SkRef(stream)
) { } |
| 233 stream->ref(); | |
| 234 } | |
| 235 | 233 |
| 236 ULONG fRefCount; | 234 ULONG fRefCount; |
| 237 }; | 235 }; |
| 238 | 236 |
| 239 HRESULT StreamFontFileLoader::QueryInterface(REFIID iid, void** ppvObject) { | 237 HRESULT StreamFontFileLoader::QueryInterface(REFIID iid, void** ppvObject) { |
| 240 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) { | 238 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) { |
| 241 *ppvObject = this; | 239 *ppvObject = this; |
| 242 AddRef(); | 240 AddRef(); |
| 243 return S_OK; | 241 return S_OK; |
| 244 } else { | 242 } else { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 | 293 |
| 296 SkTScopedComPtr<IDWriteFactory> fFactory; | 294 SkTScopedComPtr<IDWriteFactory> fFactory; |
| 297 SkTScopedComPtr<IDWriteFontFile> fCurrentFile; | 295 SkTScopedComPtr<IDWriteFontFile> fCurrentFile; |
| 298 SkTScopedComPtr<IDWriteFontFileLoader> fFontFileLoader; | 296 SkTScopedComPtr<IDWriteFontFileLoader> fFontFileLoader; |
| 299 bool fHasNext; | 297 bool fHasNext; |
| 300 }; | 298 }; |
| 301 | 299 |
| 302 StreamFontFileEnumerator::StreamFontFileEnumerator(IDWriteFactory* factory, | 300 StreamFontFileEnumerator::StreamFontFileEnumerator(IDWriteFactory* factory, |
| 303 IDWriteFontFileLoader* fontFi
leLoader) | 301 IDWriteFontFileLoader* fontFi
leLoader) |
| 304 : fRefCount(1) | 302 : fRefCount(1) |
| 305 , fFactory(factory) | 303 , fFactory(SkRefComPtr(factory)) |
| 306 , fCurrentFile() | 304 , fCurrentFile() |
| 307 , fFontFileLoader(fontFileLoader) | 305 , fFontFileLoader(SkRefComPtr(fontFileLoader)) |
| 308 , fHasNext(true) | 306 , fHasNext(true) |
| 309 { | 307 { } |
| 310 factory->AddRef(); | |
| 311 fontFileLoader->AddRef(); | |
| 312 } | |
| 313 | 308 |
| 314 HRESULT StreamFontFileEnumerator::QueryInterface(REFIID iid, void** ppvObject) { | 309 HRESULT StreamFontFileEnumerator::QueryInterface(REFIID iid, void** ppvObject) { |
| 315 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileEnumerator)) { | 310 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileEnumerator)) { |
| 316 *ppvObject = this; | 311 *ppvObject = this; |
| 317 AddRef(); | 312 AddRef(); |
| 318 return S_OK; | 313 return S_OK; |
| 319 } else { | 314 } else { |
| 320 *ppvObject = NULL; | 315 *ppvObject = NULL; |
| 321 return E_NOINTERFACE; | 316 return E_NOINTERFACE; |
| 322 } | 317 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 352 *hasCurrentFile = TRUE; | 347 *hasCurrentFile = TRUE; |
| 353 return S_OK; | 348 return S_OK; |
| 354 } | 349 } |
| 355 | 350 |
| 356 HRESULT StreamFontFileEnumerator::GetCurrentFontFile(IDWriteFontFile** fontFile)
{ | 351 HRESULT StreamFontFileEnumerator::GetCurrentFontFile(IDWriteFontFile** fontFile)
{ |
| 357 if (fCurrentFile.get() == NULL) { | 352 if (fCurrentFile.get() == NULL) { |
| 358 *fontFile = NULL; | 353 *fontFile = NULL; |
| 359 return E_FAIL; | 354 return E_FAIL; |
| 360 } | 355 } |
| 361 | 356 |
| 362 fCurrentFile.get()->AddRef(); | 357 *fontFile = SkRefComPtr(fCurrentFile.get()); |
| 363 *fontFile = fCurrentFile.get(); | |
| 364 return S_OK; | 358 return S_OK; |
| 365 } | 359 } |
| 366 | 360 |
| 367 class StreamFontCollectionLoader : public IDWriteFontCollectionLoader { | 361 class StreamFontCollectionLoader : public IDWriteFontCollectionLoader { |
| 368 public: | 362 public: |
| 369 // IUnknown methods | 363 // IUnknown methods |
| 370 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObjec
t); | 364 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObjec
t); |
| 371 virtual ULONG STDMETHODCALLTYPE AddRef(); | 365 virtual ULONG STDMETHODCALLTYPE AddRef(); |
| 372 virtual ULONG STDMETHODCALLTYPE Release(); | 366 virtual ULONG STDMETHODCALLTYPE Release(); |
| 373 | 367 |
| 374 // IDWriteFontCollectionLoader methods | 368 // IDWriteFontCollectionLoader methods |
| 375 virtual HRESULT STDMETHODCALLTYPE CreateEnumeratorFromKey( | 369 virtual HRESULT STDMETHODCALLTYPE CreateEnumeratorFromKey( |
| 376 IDWriteFactory* factory, | 370 IDWriteFactory* factory, |
| 377 void const* collectionKey, | 371 void const* collectionKey, |
| 378 UINT32 collectionKeySize, | 372 UINT32 collectionKeySize, |
| 379 IDWriteFontFileEnumerator** fontFileEnumerator); | 373 IDWriteFontFileEnumerator** fontFileEnumerator); |
| 380 | 374 |
| 381 static HRESULT Create(IDWriteFontFileLoader* fontFileLoader, | 375 static HRESULT Create(IDWriteFontFileLoader* fontFileLoader, |
| 382 StreamFontCollectionLoader** streamFontCollectionLoade
r) { | 376 StreamFontCollectionLoader** streamFontCollectionLoade
r) { |
| 383 *streamFontCollectionLoader = new StreamFontCollectionLoader(fontFileLoa
der); | 377 *streamFontCollectionLoader = new StreamFontCollectionLoader(fontFileLoa
der); |
| 384 if (NULL == streamFontCollectionLoader) { | 378 if (NULL == streamFontCollectionLoader) { |
| 385 return E_OUTOFMEMORY; | 379 return E_OUTOFMEMORY; |
| 386 } | 380 } |
| 387 return S_OK; | 381 return S_OK; |
| 388 } | 382 } |
| 389 private: | 383 private: |
| 390 StreamFontCollectionLoader(IDWriteFontFileLoader* fontFileLoader) | 384 StreamFontCollectionLoader(IDWriteFontFileLoader* fontFileLoader) |
| 391 : fRefCount(1) | 385 : fRefCount(1) |
| 392 , fFontFileLoader(fontFileLoader) | 386 , fFontFileLoader(SkRefComPtr(fontFileLoader)) |
| 393 { | 387 { } |
| 394 fontFileLoader->AddRef(); | |
| 395 } | |
| 396 | 388 |
| 397 ULONG fRefCount; | 389 ULONG fRefCount; |
| 398 SkTScopedComPtr<IDWriteFontFileLoader> fFontFileLoader; | 390 SkTScopedComPtr<IDWriteFontFileLoader> fFontFileLoader; |
| 399 }; | 391 }; |
| 400 | 392 |
| 401 HRESULT StreamFontCollectionLoader::QueryInterface(REFIID iid, void** ppvObject)
{ | 393 HRESULT StreamFontCollectionLoader::QueryInterface(REFIID iid, void** ppvObject)
{ |
| 402 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontCollectionLoader)) { | 394 if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontCollectionLoader)) { |
| 403 *ppvObject = this; | 395 *ppvObject = this; |
| 404 AddRef(); | 396 AddRef(); |
| 405 return S_OK; | 397 return S_OK; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 | 442 |
| 451 class DWriteFontTypeface : public SkTypeface { | 443 class DWriteFontTypeface : public SkTypeface { |
| 452 private: | 444 private: |
| 453 DWriteFontTypeface(SkTypeface::Style style, SkFontID fontID, | 445 DWriteFontTypeface(SkTypeface::Style style, SkFontID fontID, |
| 454 IDWriteFontFace* fontFace, | 446 IDWriteFontFace* fontFace, |
| 455 IDWriteFont* font, | 447 IDWriteFont* font, |
| 456 IDWriteFontFamily* fontFamily, | 448 IDWriteFontFamily* fontFamily, |
| 457 StreamFontFileLoader* fontFileLoader = NULL, | 449 StreamFontFileLoader* fontFileLoader = NULL, |
| 458 IDWriteFontCollectionLoader* fontCollectionLoader = NULL) | 450 IDWriteFontCollectionLoader* fontCollectionLoader = NULL) |
| 459 : SkTypeface(style, fontID, false) | 451 : SkTypeface(style, fontID, false) |
| 460 , fDWriteFontCollectionLoader(fontCollectionLoader) | 452 , fDWriteFontCollectionLoader(SkSafeRefComPtr(fontCollectionLoader)) |
| 461 , fDWriteFontFileLoader(fontFileLoader) | 453 , fDWriteFontFileLoader(SkSafeRefComPtr(fontFileLoader)) |
| 462 , fDWriteFontFamily(fontFamily) | 454 , fDWriteFontFamily(SkRefComPtr(fontFamily)) |
| 463 , fDWriteFont(font) | 455 , fDWriteFont(SkRefComPtr(font)) |
| 464 , fDWriteFontFace(fontFace) { | 456 , fDWriteFontFace(SkRefComPtr(fontFace)) |
| 465 | 457 { } |
| 466 if (fontCollectionLoader != NULL) { | |
| 467 fontCollectionLoader->AddRef(); | |
| 468 } | |
| 469 if (fontFileLoader != NULL) { | |
| 470 fontFileLoader->AddRef(); | |
| 471 } | |
| 472 fontFamily->AddRef(); | |
| 473 font->AddRef(); | |
| 474 fontFace->AddRef(); | |
| 475 } | |
| 476 | 458 |
| 477 public: | 459 public: |
| 478 SkTScopedComPtr<IDWriteFontCollectionLoader> fDWriteFontCollectionLoader; | 460 SkTScopedComPtr<IDWriteFontCollectionLoader> fDWriteFontCollectionLoader; |
| 479 SkTScopedComPtr<StreamFontFileLoader> fDWriteFontFileLoader; | 461 SkTScopedComPtr<StreamFontFileLoader> fDWriteFontFileLoader; |
| 480 SkTScopedComPtr<IDWriteFontFamily> fDWriteFontFamily; | 462 SkTScopedComPtr<IDWriteFontFamily> fDWriteFontFamily; |
| 481 SkTScopedComPtr<IDWriteFont> fDWriteFont; | 463 SkTScopedComPtr<IDWriteFont> fDWriteFont; |
| 482 SkTScopedComPtr<IDWriteFontFace> fDWriteFontFace; | 464 SkTScopedComPtr<IDWriteFontFace> fDWriteFontFace; |
| 483 | 465 |
| 484 static DWriteFontTypeface* Create(IDWriteFontFace* fontFace, | 466 static DWriteFontTypeface* Create(IDWriteFontFace* fontFace, |
| 485 IDWriteFont* font, | 467 IDWriteFont* font, |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 fontFileLoader, fontCollectionLoader); | 707 fontFileLoader, fontCollectionLoader); |
| 726 SkTypefaceCache::Add(face, get_style(font), fontCollectionLoader != NULL
); | 708 SkTypefaceCache::Add(face, get_style(font), fontCollectionLoader != NULL
); |
| 727 } | 709 } |
| 728 return face; | 710 return face; |
| 729 } | 711 } |
| 730 | 712 |
| 731 void SkDWriteFontFromTypeface(const SkTypeface* face, IDWriteFont** font) { | 713 void SkDWriteFontFromTypeface(const SkTypeface* face, IDWriteFont** font) { |
| 732 if (NULL == face) { | 714 if (NULL == face) { |
| 733 HRVM(get_default_font(font), "Could not get default font."); | 715 HRVM(get_default_font(font), "Could not get default font."); |
| 734 } else { | 716 } else { |
| 735 *font = static_cast<const DWriteFontTypeface*>(face)->fDWriteFont.get(); | 717 *font = SkRefComPtr(static_cast<const DWriteFontTypeface*>(face)->fDWrit
eFont.get()); |
| 736 (*font)->AddRef(); | |
| 737 } | 718 } |
| 738 } | 719 } |
| 739 static DWriteFontTypeface* GetDWriteFontByID(SkFontID fontID) { | 720 static DWriteFontTypeface* GetDWriteFontByID(SkFontID fontID) { |
| 740 return static_cast<DWriteFontTypeface*>(SkTypefaceCache::FindByID(fontID)); | 721 return static_cast<DWriteFontTypeface*>(SkTypefaceCache::FindByID(fontID)); |
| 741 } | 722 } |
| 742 | 723 |
| 743 SkScalerContext_Windows::SkScalerContext_Windows(DWriteFontTypeface* typeface, | 724 SkScalerContext_Windows::SkScalerContext_Windows(DWriteFontTypeface* typeface, |
| 744 const SkDescriptor* desc) | 725 const SkDescriptor* desc) |
| 745 : SkScalerContext(typeface, desc) | 726 : SkScalerContext(typeface, desc) |
| 746 , fTypeface(SkRef(typeface)) | 727 , fTypeface(SkRef(typeface)) |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1083 SkSMallocWCHAR dwFamilyNameChar(dwFamilyNamesLength+1); | 1064 SkSMallocWCHAR dwFamilyNameChar(dwFamilyNamesLength+1); |
| 1084 HRV(dwFamilyNames->GetString(0, dwFamilyNameChar.get(), dwFamilyNamesLength+
1)); | 1065 HRV(dwFamilyNames->GetString(0, dwFamilyNameChar.get(), dwFamilyNamesLength+
1)); |
| 1085 | 1066 |
| 1086 SkString utf8FamilyName; | 1067 SkString utf8FamilyName; |
| 1087 HRV(wchar_to_skstring(dwFamilyNameChar.get(), &utf8FamilyName)); | 1068 HRV(wchar_to_skstring(dwFamilyNameChar.get(), &utf8FamilyName)); |
| 1088 | 1069 |
| 1089 desc->setFamilyName(utf8FamilyName.c_str()); | 1070 desc->setFamilyName(utf8FamilyName.c_str()); |
| 1090 *isLocalStream = SkToBool(fDWriteFontFileLoader.get()); | 1071 *isLocalStream = SkToBool(fDWriteFontFileLoader.get()); |
| 1091 } | 1072 } |
| 1092 | 1073 |
| 1093 static SkTypeface* create_from_stream(SkStream* stream) { | 1074 template <typename T> class SkAutoIDWriteUnregister { |
| 1075 public: |
| 1076 SkAutoIDWriteUnregister(IDWriteFactory* factory, T* unregister) |
| 1077 : fFactory(factory), fUnregister(unregister) |
| 1078 { } |
| 1079 |
| 1080 ~SkAutoIDWriteUnregister() { |
| 1081 if (fUnregister) { |
| 1082 unregister(fFactory, fUnregister); |
| 1083 } |
| 1084 } |
| 1085 |
| 1086 T* detatch() { |
| 1087 T* old = fUnregister; |
| 1088 fUnregister = NULL; |
| 1089 return old; |
| 1090 } |
| 1091 |
| 1092 private: |
| 1093 HRESULT unregister(IDWriteFactory* factory, IDWriteFontFileLoader* unregiste
r) { |
| 1094 return factory->UnregisterFontFileLoader(unregister); |
| 1095 } |
| 1096 |
| 1097 HRESULT unregister(IDWriteFactory* factory, IDWriteFontCollectionLoader* unr
egister) { |
| 1098 return factory->UnregisterFontCollectionLoader(unregister); |
| 1099 } |
| 1100 |
| 1101 IDWriteFactory* fFactory; |
| 1102 T* fUnregister; |
| 1103 }; |
| 1104 |
| 1105 static SkTypeface* create_from_stream(SkStream* stream, int ttcIndex) { |
| 1094 IDWriteFactory* factory; | 1106 IDWriteFactory* factory; |
| 1095 HRN(get_dwrite_factory(&factory)); | 1107 HRN(get_dwrite_factory(&factory)); |
| 1096 | 1108 |
| 1097 SkTScopedComPtr<StreamFontFileLoader> fontFileLoader; | 1109 SkTScopedComPtr<StreamFontFileLoader> fontFileLoader; |
| 1098 HRN(StreamFontFileLoader::Create(stream, &fontFileLoader)); | 1110 HRN(StreamFontFileLoader::Create(stream, &fontFileLoader)); |
| 1099 HRN(factory->RegisterFontFileLoader(fontFileLoader.get())); | 1111 HRN(factory->RegisterFontFileLoader(fontFileLoader.get())); |
| 1112 SkAutoIDWriteUnregister<StreamFontFileLoader> autoUnregisterFontFileLoader( |
| 1113 factory, fontFileLoader.get()); |
| 1100 | 1114 |
| 1101 SkTScopedComPtr<StreamFontCollectionLoader> streamFontCollectionLoader; | 1115 SkTScopedComPtr<StreamFontCollectionLoader> fontCollectionLoader; |
| 1102 HRN(StreamFontCollectionLoader::Create(fontFileLoader.get(), &streamFontColl
ectionLoader)); | 1116 HRN(StreamFontCollectionLoader::Create(fontFileLoader.get(), &fontCollection
Loader)); |
| 1103 HRN(factory->RegisterFontCollectionLoader(streamFontCollectionLoader.get()))
; | 1117 HRN(factory->RegisterFontCollectionLoader(fontCollectionLoader.get())); |
| 1118 SkAutoIDWriteUnregister<StreamFontCollectionLoader> autoUnregisterFontCollec
tionLoader( |
| 1119 factory, fontCollectionLoader.get()); |
| 1104 | 1120 |
| 1105 SkTScopedComPtr<IDWriteFontCollection> streamFontCollection; | 1121 SkTScopedComPtr<IDWriteFontCollection> fontCollection; |
| 1106 HRN(factory->CreateCustomFontCollection(streamFontCollectionLoader.get(), NU
LL, 0, | 1122 HRN(factory->CreateCustomFontCollection(fontCollectionLoader.get(), NULL, 0,
&fontCollection)); |
| 1107 &streamFontCollection)); | |
| 1108 | 1123 |
| 1109 SkTScopedComPtr<IDWriteFontFamily> fontFamily; | 1124 // Find the first non-simulated font which has the given ttc index. |
| 1110 HRN(streamFontCollection->GetFontFamily(0, &fontFamily)); | 1125 UINT32 familyCount = fontCollection->GetFontFamilyCount(); |
| 1126 for (UINT32 familyIndex = 0; familyIndex < familyCount; ++familyIndex) { |
| 1127 SkTScopedComPtr<IDWriteFontFamily> fontFamily; |
| 1128 HRN(fontCollection->GetFontFamily(familyIndex, &fontFamily)); |
| 1111 | 1129 |
| 1112 SkTScopedComPtr<IDWriteFont> font; | 1130 UINT32 fontCount = fontFamily->GetFontCount(); |
| 1113 HRN(fontFamily->GetFont(0, &font)); | 1131 for (UINT32 fontIndex = 0; fontIndex < fontCount; ++fontIndex) { |
| 1132 SkTScopedComPtr<IDWriteFont> font; |
| 1133 HRN(fontFamily->GetFont(fontIndex, &font)); |
| 1134 if (font->GetSimulations() != DWRITE_FONT_SIMULATIONS_NONE) { |
| 1135 continue; |
| 1136 } |
| 1114 | 1137 |
| 1115 SkTScopedComPtr<IDWriteFontFace> fontFace; | 1138 SkTScopedComPtr<IDWriteFontFace> fontFace; |
| 1116 HRN(font->CreateFontFace(&fontFace)); | 1139 HRN(font->CreateFontFace(&fontFace)); |
| 1117 | 1140 |
| 1118 return SkCreateTypefaceFromDWriteFont(fontFace.get(), font.get(), fontFamily
.get(), | 1141 UINT32 faceIndex = fontFace->GetIndex(); |
| 1119 fontFileLoader.get(), streamFontCollec
tionLoader.get()); | 1142 if (faceIndex == ttcIndex) { |
| 1143 return SkCreateTypefaceFromDWriteFont(fontFace.get(), font.get()
, fontFamily.get(), |
| 1144 autoUnregisterFontFileLoad
er.detatch(), |
| 1145 autoUnregisterFontCollecti
onLoader.detatch()); |
| 1146 } |
| 1147 } |
| 1148 } |
| 1149 |
| 1150 return NULL; |
| 1120 } | 1151 } |
| 1121 | 1152 |
| 1122 SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) { | 1153 SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) { |
| 1123 return create_from_stream(stream); | 1154 return create_from_stream(stream, 0); |
| 1124 } | 1155 } |
| 1125 | 1156 |
| 1126 SkStream* DWriteFontTypeface::onOpenStream(int* ttcIndex) const { | 1157 SkStream* DWriteFontTypeface::onOpenStream(int* ttcIndex) const { |
| 1127 *ttcIndex = 0; | 1158 *ttcIndex = fDWriteFontFace->GetIndex(); |
| 1128 | 1159 |
| 1129 UINT32 numFiles; | 1160 UINT32 numFiles; |
| 1130 HRNM(fDWriteFontFace->GetFiles(&numFiles, NULL), | 1161 HRNM(fDWriteFontFace->GetFiles(&numFiles, NULL), |
| 1131 "Could not get number of font files."); | 1162 "Could not get number of font files."); |
| 1132 if (numFiles != 1) { | 1163 if (numFiles != 1) { |
| 1133 return NULL; | 1164 return NULL; |
| 1134 } | 1165 } |
| 1135 | 1166 |
| 1136 SkTScopedComPtr<IDWriteFontFile> fontFile; | 1167 SkTScopedComPtr<IDWriteFontFile> fontFile; |
| 1137 HRNM(fDWriteFontFace->GetFiles(&numFiles, &fontFile), "Could not get font fi
les."); | 1168 HRNM(fDWriteFontFace->GetFiles(&numFiles, &fontFile), "Could not get font fi
les."); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1183 1) If familyFace is null, use familyName. | 1214 1) If familyFace is null, use familyName. |
| 1184 2) If familyName is null, use familyFace. | 1215 2) If familyName is null, use familyFace. |
| 1185 3) If both are null, return the default font that best matches style | 1216 3) If both are null, return the default font that best matches style |
| 1186 This MUST not return NULL. | 1217 This MUST not return NULL. |
| 1187 */ | 1218 */ |
| 1188 SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, | 1219 SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, |
| 1189 const char familyName[], | 1220 const char familyName[], |
| 1190 SkTypeface::Style style) { | 1221 SkTypeface::Style style) { |
| 1191 HRESULT hr; | 1222 HRESULT hr; |
| 1192 SkTScopedComPtr<IDWriteFontFamily> fontFamily; | 1223 SkTScopedComPtr<IDWriteFontFamily> fontFamily; |
| 1193 SkTScopedComPtr<IDWriteFontCollectionLoader> fontCollectionLoader; | |
| 1194 SkTScopedComPtr<IDWriteFontFileLoader> fontFileLoader; | |
| 1195 if (familyFace) { | 1224 if (familyFace) { |
| 1196 const DWriteFontTypeface* face = static_cast<const DWriteFontTypeface*>(
familyFace); | 1225 const DWriteFontTypeface* face = static_cast<const DWriteFontTypeface*>(
familyFace); |
| 1197 face->fDWriteFontFamily.get()->AddRef(); | 1226 *(&fontFamily) = SkRefComPtr(face->fDWriteFontFamily.get()); |
| 1198 *(&fontFamily) = face->fDWriteFontFamily.get(); | |
| 1199 | |
| 1200 if (face->fDWriteFontCollectionLoader.get() != NULL) { | |
| 1201 face->fDWriteFontCollectionLoader.get()->AddRef(); | |
| 1202 *(&fontCollectionLoader) = face->fDWriteFontCollectionLoader.get(); | |
| 1203 | |
| 1204 face->fDWriteFontFileLoader.get()->AddRef(); | |
| 1205 *(&fontFileLoader) = face->fDWriteFontFileLoader.get(); | |
| 1206 } | |
| 1207 | 1227 |
| 1208 } else if (familyName) { | 1228 } else if (familyName) { |
| 1209 hr = get_by_family_name(familyName, &fontFamily); | 1229 hr = get_by_family_name(familyName, &fontFamily); |
| 1210 } | 1230 } |
| 1211 | 1231 |
| 1212 if (NULL == fontFamily.get()) { | 1232 if (NULL == fontFamily.get()) { |
| 1213 //No good family found, go with default. | 1233 //No good family found, go with default. |
| 1214 SkTScopedComPtr<IDWriteFont> font; | 1234 SkTScopedComPtr<IDWriteFont> font; |
| 1215 hr = get_default_font(&font); | 1235 hr = get_default_font(&font); |
| 1216 hr = font->GetFontFamily(&fontFamily); | 1236 hr = font->GetFontFamily(&fontFamily); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1342 return true; | 1362 return true; |
| 1343 } | 1363 } |
| 1344 | 1364 |
| 1345 template<typename T> | 1365 template<typename T> |
| 1346 class AutoDWriteTable { | 1366 class AutoDWriteTable { |
| 1347 public: | 1367 public: |
| 1348 AutoDWriteTable(IDWriteFontFace* fontFace) | 1368 AutoDWriteTable(IDWriteFontFace* fontFace) |
| 1349 : fFontFace(fontFace) | 1369 : fFontFace(fontFace) |
| 1350 , fExists(FALSE) { | 1370 , fExists(FALSE) { |
| 1351 | 1371 |
| 1352 //fontFace->AddRef(); | |
| 1353 const UINT32 tag = DWRITE_MAKE_OPENTYPE_TAG(T::TAG0, | 1372 const UINT32 tag = DWRITE_MAKE_OPENTYPE_TAG(T::TAG0, |
| 1354 T::TAG1, | 1373 T::TAG1, |
| 1355 T::TAG2, | 1374 T::TAG2, |
| 1356 T::TAG3); | 1375 T::TAG3); |
| 1357 // TODO: need to check for failure | 1376 // Any errors are ignored, user must check fExists anyway. |
| 1358 /*HRESULT hr =*/ fontFace->TryGetFontTable(tag, | 1377 fontFace->TryGetFontTable(tag, |
| 1359 reinterpret_cast<const void **>(&fData), &fSize, &fLock, &fExists); | 1378 reinterpret_cast<const void **>(&fData), &fSize, &fLock, &fExists); |
| 1360 } | 1379 } |
| 1361 ~AutoDWriteTable() { | 1380 ~AutoDWriteTable() { |
| 1362 if (fExists) { | 1381 if (fExists) { |
| 1363 fFontFace->ReleaseFontTable(fLock); | 1382 fFontFace->ReleaseFontTable(fLock); |
| 1364 } | 1383 } |
| 1365 } | 1384 } |
| 1366 const T* operator->() const { return fData; } | 1385 const T* operator->() const { return fData; } |
| 1367 | 1386 |
| 1368 const T* fData; | 1387 const T* fData; |
| 1369 UINT32 fSize; | 1388 UINT32 fSize; |
| 1370 BOOL fExists; | 1389 BOOL fExists; |
| 1371 private: | 1390 private: |
| 1372 //SkTScopedComPtr<IDWriteFontFace> fFontFace; | 1391 // Borrowed reference, the user must ensure the fontFace stays alive. |
| 1373 IDWriteFontFace* fFontFace; | 1392 IDWriteFontFace* fFontFace; |
| 1374 void* fLock; | 1393 void* fLock; |
| 1375 }; | 1394 }; |
| 1376 | 1395 |
| 1377 SkAdvancedTypefaceMetrics* DWriteFontTypeface::onGetAdvancedTypefaceMetrics( | 1396 SkAdvancedTypefaceMetrics* DWriteFontTypeface::onGetAdvancedTypefaceMetrics( |
| 1378 SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo, | 1397 SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo, |
| 1379 const uint32_t* glyphIDs, | 1398 const uint32_t* glyphIDs, |
| 1380 uint32_t glyphIDsCount) const { | 1399 uint32_t glyphIDsCount) const { |
| 1381 | 1400 |
| 1382 SkAdvancedTypefaceMetrics* info = NULL; | 1401 SkAdvancedTypefaceMetrics* info = NULL; |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1666 } | 1685 } |
| 1667 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, | 1686 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, |
| 1668 const SkFontStyle& fontstyle) SK_OVERRI
DE { | 1687 const SkFontStyle& fontstyle) SK_OVERRI
DE { |
| 1669 SkString familyName; | 1688 SkString familyName; |
| 1670 SkFontStyleSet_DirectWrite sset( | 1689 SkFontStyleSet_DirectWrite sset( |
| 1671 this, ((DWriteFontTypeface*)familyMember)->fDWriteFontFamily.get() | 1690 this, ((DWriteFontTypeface*)familyMember)->fDWriteFontFamily.get() |
| 1672 ); | 1691 ); |
| 1673 return sset.matchStyle(fontstyle); | 1692 return sset.matchStyle(fontstyle); |
| 1674 } | 1693 } |
| 1675 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) SK_OV
ERRIDE { | 1694 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) SK_OV
ERRIDE { |
| 1676 return create_from_stream(stream); | 1695 return create_from_stream(stream, ttcIndex); |
| 1677 } | 1696 } |
| 1678 virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) SK_OVERRIDE
{ | 1697 virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) SK_OVERRIDE
{ |
| 1679 SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, (data))); | 1698 SkAutoTUnref<SkStream> stream(SkNEW_ARGS(SkMemoryStream, (data))); |
| 1680 return this->createFromStream(stream, ttcIndex); | 1699 return this->createFromStream(stream, ttcIndex); |
| 1681 } | 1700 } |
| 1682 virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) SK_OVE
RRIDE { | 1701 virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) SK_OVE
RRIDE { |
| 1683 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); | 1702 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); |
| 1684 return this->createFromStream(stream, ttcIndex); | 1703 return this->createFromStream(stream, ttcIndex); |
| 1685 } | 1704 } |
| 1686 }; | 1705 }; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1723 | 1742 |
| 1724 WCHAR localeNameStorage[LOCALE_NAME_MAX_LENGTH]; | 1743 WCHAR localeNameStorage[LOCALE_NAME_MAX_LENGTH]; |
| 1725 WCHAR* localeName = NULL; | 1744 WCHAR* localeName = NULL; |
| 1726 int localeNameLen = GetUserDefaultLocaleName(localeNameStorage, LOCALE_NAME_
MAX_LENGTH); | 1745 int localeNameLen = GetUserDefaultLocaleName(localeNameStorage, LOCALE_NAME_
MAX_LENGTH); |
| 1727 if (localeNameLen) { | 1746 if (localeNameLen) { |
| 1728 localeName = localeNameStorage; | 1747 localeName = localeNameStorage; |
| 1729 }; | 1748 }; |
| 1730 | 1749 |
| 1731 return SkNEW_ARGS(SkFontMgr_DirectWrite, (sysFontCollection.get(), localeNam
e, localeNameLen)); | 1750 return SkNEW_ARGS(SkFontMgr_DirectWrite, (sysFontCollection.get(), localeNam
e, localeNameLen)); |
| 1732 } | 1751 } |
| OLD | NEW |