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