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