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