1 /* 2 * Copyright 2014 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkTypeface_win_dw_DEFINED 9 #define SkTypeface_win_dw_DEFINED 10 11 #include "SkAdvancedTypefaceMetrics.h" 12 #include "SkDWrite.h" 13 #include "SkHRESULT.h" 14 #include "SkLeanWindows.h" 15 #include "SkTScopedComPtr.h" 16 #include "SkTypeface.h" 17 #include "SkTypefaceCache.h" 18 19 #include <dwrite.h> 20 #include <dwrite_1.h> 21 #include <dwrite_2.h> 22 #include <dwrite_3.h> 23 24 class SkFontDescriptor; 25 struct SkScalerContextRec; 26 27 static SkFontStyle get_style(IDWriteFont* font) { 28 int weight = font->GetWeight(); 29 int width = font->GetStretch(); 30 SkFontStyle::Slant slant = SkFontStyle::kUpright_Slant; 31 switch (font->GetStyle()) { 32 case DWRITE_FONT_STYLE_NORMAL: slant = SkFontStyle::kUpright_Slant; break; 33 case DWRITE_FONT_STYLE_OBLIQUE: slant = SkFontStyle::kOblique_Slant; break; 34 case DWRITE_FONT_STYLE_ITALIC: slant = SkFontStyle::kItalic_Slant; break; 35 default: SkASSERT(false); break; 36 } 37 return SkFontStyle(weight, width, slant); 38 } 39 40 class DWriteFontTypeface : public SkTypeface { 41 private: 42 DWriteFontTypeface(const SkFontStyle& style, 43 IDWriteFactory* factory, 44 IDWriteFontFace* fontFace, 45 IDWriteFont* font, 46 IDWriteFontFamily* fontFamily, 47 IDWriteFontFileLoader* fontFileLoader = nullptr, 48 IDWriteFontCollectionLoader* fontCollectionLoader = nullptr) 49 : SkTypeface(style, false) 50 , fFactory(SkRefComPtr(factory)) 51 , fDWriteFontCollectionLoader(SkSafeRefComPtr(fontCollectionLoader)) 52 , fDWriteFontFileLoader(SkSafeRefComPtr(fontFileLoader)) 53 , fDWriteFontFamily(SkRefComPtr(fontFamily)) 54 , fDWriteFont(SkRefComPtr(font)) 55 , fDWriteFontFace(SkRefComPtr(fontFace)) 56 { 57 if (!SUCCEEDED(fDWriteFontFace->QueryInterface(&fDWriteFontFace1))) { 58 // IUnknown::QueryInterface states that if it fails, punk will be set to nullptr. 59 // http://blogs.msdn.com/b/oldnewthing/archive/2004/03/26/96777.aspx 60 SkASSERT_RELEASE(nullptr == fDWriteFontFace1.get()); 61 } 62 if (!SUCCEEDED(fDWriteFontFace->QueryInterface(&fDWriteFontFace2))) { 63 SkASSERT_RELEASE(nullptr == fDWriteFontFace2.get()); 64 } 65 if (!SUCCEEDED(fDWriteFontFace->QueryInterface(&fDWriteFontFace4))) { 66 SkASSERT_RELEASE(nullptr == fDWriteFontFace4.get()); 67 } 68 if (!SUCCEEDED(fFactory->QueryInterface(&fFactory2))) { 69 SkASSERT_RELEASE(nullptr == fFactory2.get()); 70 } 71 } 72 73 public: 74 SkTScopedComPtr<IDWriteFactory> fFactory; 75 SkTScopedComPtr<IDWriteFactory2> fFactory2; 76 SkTScopedComPtr<IDWriteFontCollectionLoader> fDWriteFontCollectionLoader; 77 SkTScopedComPtr<IDWriteFontFileLoader> fDWriteFontFileLoader; 78 SkTScopedComPtr<IDWriteFontFamily> fDWriteFontFamily; 79 SkTScopedComPtr<IDWriteFont> fDWriteFont; 80 SkTScopedComPtr<IDWriteFontFace> fDWriteFontFace; 81 SkTScopedComPtr<IDWriteFontFace1> fDWriteFontFace1; 82 SkTScopedComPtr<IDWriteFontFace2> fDWriteFontFace2; 83 SkTScopedComPtr<IDWriteFontFace4> fDWriteFontFace4; 84 85 static DWriteFontTypeface* Create(IDWriteFactory* factory, 86 IDWriteFontFace* fontFace, 87 IDWriteFont* font, 88 IDWriteFontFamily* fontFamily, 89 IDWriteFontFileLoader* fontFileLoader = nullptr, 90 IDWriteFontCollectionLoader* fontCollectionLoader = nullptr) { 91 return new DWriteFontTypeface(get_style(font), factory, fontFace, font, fontFamily, 92 fontFileLoader, fontCollectionLoader); 93 } 94 95 protected: 96 void weak_dispose() const override { 97 if (fDWriteFontCollectionLoader.get()) { 98 HRV(fFactory->UnregisterFontCollectionLoader(fDWriteFontCollectionLoader.get())); 99 } 100 if (fDWriteFontFileLoader.get()) { 101 HRV(fFactory->UnregisterFontFileLoader(fDWriteFontFileLoader.get())); 102 } 103 104 //SkTypefaceCache::Remove(this); 105 INHERITED::weak_dispose(); 106 } 107 108 sk_sp<SkTypeface> onMakeClone(const SkFontArguments&) const override; 109 SkStreamAsset* onOpenStream(int* ttcIndex) const override; 110 SkScalerContext* onCreateScalerContext(const SkScalerContextEffects&, 111 const SkDescriptor*) const override; 112 void onFilterRec(SkScalerContextRec*) const override; 113 void getGlyphToUnicodeMap(SkUnichar* glyphToUnicode) const override; 114 std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override; 115 void onGetFontDescriptor(SkFontDescriptor*, bool*) const override; 116 int onCharsToGlyphs(const void* chars, Encoding encoding, 117 uint16_t glyphs[], int glyphCount) const override; 118 int onCountGlyphs() const override; 119 int onGetUPEM() const override; 120 void onGetFamilyName(SkString* familyName) const override; 121 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; 122 int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[], 123 int coordinateCount) const override; 124 int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], 125 int parameterCount) const override; 126 int onGetTableTags(SkFontTableTag tags[]) const override; 127 size_t onGetTableData(SkFontTableTag, size_t offset, size_t length, void* data) const override; 128 129 private: 130 typedef SkTypeface INHERITED; 131 }; 132 133 #endif 134