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 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 ~DWriteFontTypeface() { | 472 ~DWriteFontTypeface() { |
473 if (fDWriteFontCollectionLoader.get() == NULL) return; | 473 if (fDWriteFontCollectionLoader.get() == NULL) return; |
474 | 474 |
475 IDWriteFactory* factory; | 475 IDWriteFactory* factory; |
476 HRVM(get_dwrite_factory(&factory), "Could not get factory."); | 476 HRVM(get_dwrite_factory(&factory), "Could not get factory."); |
477 HRV(factory->UnregisterFontCollectionLoader(fDWriteFontCollectionLoader.
get())); | 477 HRV(factory->UnregisterFontCollectionLoader(fDWriteFontCollectionLoader.
get())); |
478 HRV(factory->UnregisterFontFileLoader(fDWriteFontFileLoader.get())); | 478 HRV(factory->UnregisterFontFileLoader(fDWriteFontFileLoader.get())); |
479 } | 479 } |
480 | 480 |
481 protected: | 481 protected: |
| 482 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; |
482 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; | 483 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; |
483 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; | 484 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; |
484 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( | 485 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( |
485 SkAdvancedTypefaceMetrics::PerGlyphInfo, | 486 SkAdvancedTypefaceMetrics::PerGlyphInfo, |
486 const uint32_t*, uint32_t) const SK_OVERRIDE; | 487 const uint32_t*, uint32_t) const SK_OVERRIDE; |
487 }; | 488 }; |
488 | 489 |
489 class SkScalerContext_Windows : public SkScalerContext { | 490 class SkScalerContext_Windows : public SkScalerContext { |
490 public: | 491 public: |
491 SkScalerContext_Windows(DWriteFontTypeface*, const SkDescriptor* desc); | 492 SkScalerContext_Windows(DWriteFontTypeface*, const SkDescriptor* desc); |
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
985 const bool isAA = !isLCD(fRec); | 986 const bool isAA = !isLCD(fRec); |
986 | 987 |
987 //Create the mask. | 988 //Create the mask. |
988 const void* bits = fOffscreen.draw(glyph, isBW); | 989 const void* bits = fOffscreen.draw(glyph, isBW); |
989 if (!bits) { | 990 if (!bits) { |
990 sk_bzero(glyph.fImage, glyph.computeImageSize()); | 991 sk_bzero(glyph.fImage, glyph.computeImageSize()); |
991 return; | 992 return; |
992 } | 993 } |
993 | 994 |
994 //Copy the mask into the glyph. | 995 //Copy the mask into the glyph. |
995 int width = glyph.fWidth; | |
996 size_t dstRB = glyph.rowBytes(); | |
997 const uint8_t* src = (const uint8_t*)bits; | 996 const uint8_t* src = (const uint8_t*)bits; |
998 if (isBW) { | 997 if (isBW) { |
999 bilevel_to_bw(src, glyph); | 998 bilevel_to_bw(src, glyph); |
1000 } else if (isAA) { | 999 } else if (isAA) { |
1001 if (fPreBlend.isApplicable()) { | 1000 if (fPreBlend.isApplicable()) { |
1002 rgb_to_a8<true>(src, glyph, fPreBlend.fG); | 1001 rgb_to_a8<true>(src, glyph, fPreBlend.fG); |
1003 } else { | 1002 } else { |
1004 rgb_to_a8<false>(src, glyph, fPreBlend.fG); | 1003 rgb_to_a8<false>(src, glyph, fPreBlend.fG); |
1005 } | 1004 } |
1006 } else if (SkMask::kLCD16_Format == glyph.fMaskFormat) { | 1005 } else if (SkMask::kLCD16_Format == glyph.fMaskFormat) { |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1127 | 1126 |
1128 SkTScopedComPtr<IDWriteFontFace> fontFace; | 1127 SkTScopedComPtr<IDWriteFontFace> fontFace; |
1129 HRN(font->CreateFontFace(&fontFace)); | 1128 HRN(font->CreateFontFace(&fontFace)); |
1130 | 1129 |
1131 return SkCreateTypefaceFromDWriteFont(fontFace.get(), font.get(), fontFamily
.get(), | 1130 return SkCreateTypefaceFromDWriteFont(fontFace.get(), font.get(), fontFamily
.get(), |
1132 fontFileLoader.get(), streamFontCollec
tionLoader.get()); | 1131 fontFileLoader.get(), streamFontCollec
tionLoader.get()); |
1133 } | 1132 } |
1134 | 1133 |
1135 SkStream* SkFontHost::OpenStream(SkFontID uniqueID) { | 1134 SkStream* SkFontHost::OpenStream(SkFontID uniqueID) { |
1136 DWriteFontTypeface* typeface = GetDWriteFontByID(uniqueID); | 1135 DWriteFontTypeface* typeface = GetDWriteFontByID(uniqueID); |
1137 if (NULL == typeface) { | 1136 return typeface ? typeface->openStream(NULL) : NULL; |
1138 return NULL; | 1137 } |
1139 } | 1138 |
| 1139 SkStream* DWriteFontTypeface::onOpenStream(int* ttcIndex) const { |
| 1140 *ttcIndex = 0; |
1140 | 1141 |
1141 UINT32 numFiles; | 1142 UINT32 numFiles; |
1142 HRNM(typeface->fDWriteFontFace->GetFiles(&numFiles, NULL), | 1143 HRNM(fDWriteFontFace->GetFiles(&numFiles, NULL), |
1143 "Could not get number of font files."); | 1144 "Could not get number of font files."); |
1144 if (numFiles != 1) { | 1145 if (numFiles != 1) { |
1145 return NULL; | 1146 return NULL; |
1146 } | 1147 } |
1147 | 1148 |
1148 SkTScopedComPtr<IDWriteFontFile> fontFile; | 1149 SkTScopedComPtr<IDWriteFontFile> fontFile; |
1149 HRNM(typeface->fDWriteFontFace->GetFiles(&numFiles, &fontFile), "Could not g
et font files."); | 1150 HRNM(fDWriteFontFace->GetFiles(&numFiles, &fontFile), "Could not get font fi
les."); |
1150 | 1151 |
1151 const void* fontFileKey; | 1152 const void* fontFileKey; |
1152 UINT32 fontFileKeySize; | 1153 UINT32 fontFileKeySize; |
1153 HRNM(fontFile->GetReferenceKey(&fontFileKey, &fontFileKeySize), | 1154 HRNM(fontFile->GetReferenceKey(&fontFileKey, &fontFileKeySize), |
1154 "Could not get font file reference key."); | 1155 "Could not get font file reference key."); |
1155 | 1156 |
1156 SkTScopedComPtr<IDWriteFontFileLoader> fontFileLoader; | 1157 SkTScopedComPtr<IDWriteFontFileLoader> fontFileLoader; |
1157 HRNM(fontFile->GetLoader(&fontFileLoader), "Could not get font file loader."
); | 1158 HRNM(fontFile->GetLoader(&fontFileLoader), "Could not get font file loader."
); |
1158 | 1159 |
1159 SkTScopedComPtr<IDWriteFontFileStream> fontFileStream; | 1160 SkTScopedComPtr<IDWriteFontFileStream> fontFileStream; |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1374 public: | 1375 public: |
1375 AutoDWriteTable(IDWriteFontFace* fontFace) | 1376 AutoDWriteTable(IDWriteFontFace* fontFace) |
1376 : fFontFace(fontFace) | 1377 : fFontFace(fontFace) |
1377 , fExists(FALSE) { | 1378 , fExists(FALSE) { |
1378 | 1379 |
1379 //fontFace->AddRef(); | 1380 //fontFace->AddRef(); |
1380 const UINT32 tag = DWRITE_MAKE_OPENTYPE_TAG(T::TAG0, | 1381 const UINT32 tag = DWRITE_MAKE_OPENTYPE_TAG(T::TAG0, |
1381 T::TAG1, | 1382 T::TAG1, |
1382 T::TAG2, | 1383 T::TAG2, |
1383 T::TAG3); | 1384 T::TAG3); |
1384 HRESULT hr = fontFace->TryGetFontTable(tag, | 1385 // TODO: need to check for failure |
| 1386 /*HRESULT hr =*/ fontFace->TryGetFontTable(tag, |
1385 reinterpret_cast<const void **>(&fData), &fSize, &fLock, &fExists); | 1387 reinterpret_cast<const void **>(&fData), &fSize, &fLock, &fExists); |
1386 } | 1388 } |
1387 ~AutoDWriteTable() { | 1389 ~AutoDWriteTable() { |
1388 if (fExists) { | 1390 if (fExists) { |
1389 fFontFace->ReleaseFontTable(fLock); | 1391 fFontFace->ReleaseFontTable(fLock); |
1390 } | 1392 } |
1391 } | 1393 } |
1392 const T* operator->() const { return fData; } | 1394 const T* operator->() const { return fData; } |
1393 | 1395 |
1394 const T* fData; | 1396 const T* fData; |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1554 getAdvanceData(fDWriteFontFace.get(), | 1556 getAdvanceData(fDWriteFontFace.get(), |
1555 glyphCount, | 1557 glyphCount, |
1556 glyphIDs, | 1558 glyphIDs, |
1557 glyphIDsCount, | 1559 glyphIDsCount, |
1558 getWidthAdvance)); | 1560 getWidthAdvance)); |
1559 } | 1561 } |
1560 } | 1562 } |
1561 | 1563 |
1562 return info; | 1564 return info; |
1563 } | 1565 } |
OLD | NEW |