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 "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