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 "SkTScopedComPtr.h" 15 #include "SkTypeface.h" 16 #include "SkTypefaceCache.h" 17 #include "SkTypes.h" 18 19 #include <dwrite.h> 20 #if SK_HAS_DWRITE_1_H 21 # include <dwrite_1.h> 22 #endif 23 24 class SkFontDescriptor; 25 struct SkScalerContextRec; 26 27 static SkTypeface::Style get_style(IDWriteFont* font) { 28 int style = SkTypeface::kNormal; 29 DWRITE_FONT_WEIGHT weight = font->GetWeight(); 30 if (DWRITE_FONT_WEIGHT_DEMI_BOLD <= weight) { 31 style |= SkTypeface::kBold; 32 } 33 DWRITE_FONT_STYLE angle = font->GetStyle(); 34 if (DWRITE_FONT_STYLE_OBLIQUE == angle || DWRITE_FONT_STYLE_ITALIC == angle) { 35 style |= SkTypeface::kItalic; 36 } 37 return static_cast<SkTypeface::Style>(style); 38 } 39 40 class DWriteFontTypeface : public SkTypeface { 41 private: 42 DWriteFontTypeface(SkTypeface::Style style, SkFontID fontID, 43 IDWriteFactory* factory, 44 IDWriteFontFace* fontFace, 45 IDWriteFont* font, 46 IDWriteFontFamily* fontFamily, 47 IDWriteFontFileLoader* fontFileLoader = NULL, 48 IDWriteFontCollectionLoader* fontCollectionLoader = NULL) 49 : SkTypeface(style, fontID, 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 SK_HAS_DWRITE_1_H 58 if (!SUCCEEDED(fDWriteFontFace->QueryInterface(&fDWriteFontFace1))) { 59 // IUnknown::QueryInterface states that if it fails, punk will be set to NULL. 60 // http://blogs.msdn.com/b/oldnewthing/archive/2004/03/26/96777.aspx 61 SK_ALWAYSBREAK(NULL == fDWriteFontFace1.get()); 62 } 63 #endif 64 } 65 66 public: 67 SkTScopedComPtr<IDWriteFactory> fFactory; 68 SkTScopedComPtr<IDWriteFontCollectionLoader> fDWriteFontCollectionLoader; 69 SkTScopedComPtr<IDWriteFontFileLoader> fDWriteFontFileLoader; 70 SkTScopedComPtr<IDWriteFontFamily> fDWriteFontFamily; 71 SkTScopedComPtr<IDWriteFont> fDWriteFont; 72 SkTScopedComPtr<IDWriteFontFace> fDWriteFontFace; 73 #if SK_HAS_DWRITE_1_H 74 SkTScopedComPtr<IDWriteFontFace1> fDWriteFontFace1; 75 #endif 76 77 static DWriteFontTypeface* Create(IDWriteFactory* factory, 78 IDWriteFontFace* fontFace, 79 IDWriteFont* font, 80 IDWriteFontFamily* fontFamily, 81 IDWriteFontFileLoader* fontFileLoader = NULL, 82 IDWriteFontCollectionLoader* fontCollectionLoader = NULL) { 83 SkTypeface::Style style = get_style(font); 84 SkFontID fontID = SkTypefaceCache::NewFontID(); 85 return SkNEW_ARGS(DWriteFontTypeface, (style, fontID, 86 factory, fontFace, font, fontFamily, 87 fontFileLoader, fontCollectionLoader)); 88 } 89 90 protected: 91 virtual void weak_dispose() const SK_OVERRIDE { 92 if (fDWriteFontCollectionLoader.get()) { 93 HRV(fFactory->UnregisterFontCollectionLoader(fDWriteFontCollectionLoader.get())); 94 } 95 if (fDWriteFontFileLoader.get()) { 96 HRV(fFactory->UnregisterFontFileLoader(fDWriteFontFileLoader.get())); 97 } 98 99 //SkTypefaceCache::Remove(this); 100 INHERITED::weak_dispose(); 101 } 102 103 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; 104 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK_OVERRIDE; 105 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; 106 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( 107 SkAdvancedTypefaceMetrics::PerGlyphInfo, 108 const uint32_t*, uint32_t) const SK_OVERRIDE; 109 virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE; 110 virtual int onCharsToGlyphs(const void* chars, Encoding encoding, 111 uint16_t glyphs[], int glyphCount) const SK_OVERRIDE; 112 virtual int onCountGlyphs() const SK_OVERRIDE; 113 virtual int onGetUPEM() const SK_OVERRIDE; 114 virtual void onGetFamilyName(SkString* familyName) const SK_OVERRIDE; 115 virtual SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const SK_OVERRIDE; 116 virtual int onGetTableTags(SkFontTableTag tags[]) const SK_OVERRIDE; 117 virtual size_t onGetTableData(SkFontTableTag, size_t offset, 118 size_t length, void* data) const SK_OVERRIDE; 119 120 private: 121 typedef SkTypeface INHERITED; 122 }; 123 124 #endif 125