Home | History | Annotate | Download | only in ports
      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