1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2014 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkDWrite_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkDWrite_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontStyle.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTemplates.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #include <dwrite.h> 15*c8dee2aaSAndroid Build Coastguard Worker #include <winsdkver.h> 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker class SkString; 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////// 20*c8dee2aaSAndroid Build Coastguard Worker // Factory 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker IDWriteFactory* sk_get_dwrite_factory(); 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////// 25*c8dee2aaSAndroid Build Coastguard Worker // String conversion 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker /** Prefer to use this type to prevent template proliferation. */ 28*c8dee2aaSAndroid Build Coastguard Worker typedef skia_private::AutoSTMalloc<16, WCHAR> SkSMallocWCHAR; 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker /** Converts a utf8 string to a WCHAR string. */ 31*c8dee2aaSAndroid Build Coastguard Worker HRESULT sk_cstring_to_wchar(const char* skname, SkSMallocWCHAR* name); 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker /** Converts a WCHAR string to a utf8 string. 34*c8dee2aaSAndroid Build Coastguard Worker * @param nameLen the number of WCHARs in the name. 35*c8dee2aaSAndroid Build Coastguard Worker */ 36*c8dee2aaSAndroid Build Coastguard Worker HRESULT sk_wchar_to_skstring(WCHAR* name, int nameLen, SkString* skname); 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////// 39*c8dee2aaSAndroid Build Coastguard Worker // Locale 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker HRESULT sk_get_locale_string(IDWriteLocalizedStrings* names, const WCHAR* preferedLocale, 42*c8dee2aaSAndroid Build Coastguard Worker SkString* skname); 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker typedef int (WINAPI *SkGetUserDefaultLocaleNameProc)(LPWSTR, int); 45*c8dee2aaSAndroid Build Coastguard Worker HRESULT SkGetGetUserDefaultLocaleNameProc(SkGetUserDefaultLocaleNameProc* proc); 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////// 48*c8dee2aaSAndroid Build Coastguard Worker // Table handling 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker class AutoDWriteTable { 51*c8dee2aaSAndroid Build Coastguard Worker public: AutoDWriteTable(IDWriteFontFace * fontFace,UINT32 beTag)52*c8dee2aaSAndroid Build Coastguard Worker AutoDWriteTable(IDWriteFontFace* fontFace, UINT32 beTag) : fExists(FALSE), fFontFace(fontFace) { 53*c8dee2aaSAndroid Build Coastguard Worker // Any errors are ignored, user must check fExists anyway. 54*c8dee2aaSAndroid Build Coastguard Worker fontFace->TryGetFontTable(beTag, 55*c8dee2aaSAndroid Build Coastguard Worker reinterpret_cast<const void **>(&fData), &fSize, &fLock, &fExists); 56*c8dee2aaSAndroid Build Coastguard Worker } ~AutoDWriteTable()57*c8dee2aaSAndroid Build Coastguard Worker ~AutoDWriteTable() { 58*c8dee2aaSAndroid Build Coastguard Worker if (fExists) { 59*c8dee2aaSAndroid Build Coastguard Worker fFontFace->ReleaseFontTable(fLock); 60*c8dee2aaSAndroid Build Coastguard Worker } 61*c8dee2aaSAndroid Build Coastguard Worker } 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker const uint8_t* fData; 64*c8dee2aaSAndroid Build Coastguard Worker UINT32 fSize; 65*c8dee2aaSAndroid Build Coastguard Worker BOOL fExists; 66*c8dee2aaSAndroid Build Coastguard Worker private: 67*c8dee2aaSAndroid Build Coastguard Worker // Borrowed reference, the user must ensure the fontFace stays alive. 68*c8dee2aaSAndroid Build Coastguard Worker IDWriteFontFace* fFontFace; 69*c8dee2aaSAndroid Build Coastguard Worker void* fLock; 70*c8dee2aaSAndroid Build Coastguard Worker }; 71*c8dee2aaSAndroid Build Coastguard Worker template<typename T> class AutoTDWriteTable : public AutoDWriteTable { 72*c8dee2aaSAndroid Build Coastguard Worker public: 73*c8dee2aaSAndroid Build Coastguard Worker static const UINT32 tag = DWRITE_MAKE_OPENTYPE_TAG(T::TAG0, T::TAG1, T::TAG2, T::TAG3); AutoTDWriteTable(IDWriteFontFace * fontFace)74*c8dee2aaSAndroid Build Coastguard Worker AutoTDWriteTable(IDWriteFontFace* fontFace) : AutoDWriteTable(fontFace, tag) { } 75*c8dee2aaSAndroid Build Coastguard Worker get()76*c8dee2aaSAndroid Build Coastguard Worker const T* get() const { return reinterpret_cast<const T*>(fData); } 77*c8dee2aaSAndroid Build Coastguard Worker const T* operator->() const { return reinterpret_cast<const T*>(fData); } 78*c8dee2aaSAndroid Build Coastguard Worker }; 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////////// 81*c8dee2aaSAndroid Build Coastguard Worker // Style conversion 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker struct DWriteStyle { DWriteStyleDWriteStyle84*c8dee2aaSAndroid Build Coastguard Worker explicit DWriteStyle(const SkFontStyle& pattern) { 85*c8dee2aaSAndroid Build Coastguard Worker fWeight = (DWRITE_FONT_WEIGHT)pattern.weight(); 86*c8dee2aaSAndroid Build Coastguard Worker fWidth = (DWRITE_FONT_STRETCH)pattern.width(); 87*c8dee2aaSAndroid Build Coastguard Worker switch (pattern.slant()) { 88*c8dee2aaSAndroid Build Coastguard Worker case SkFontStyle::kUpright_Slant: fSlant = DWRITE_FONT_STYLE_NORMAL ; break; 89*c8dee2aaSAndroid Build Coastguard Worker case SkFontStyle::kItalic_Slant: fSlant = DWRITE_FONT_STYLE_ITALIC ; break; 90*c8dee2aaSAndroid Build Coastguard Worker case SkFontStyle::kOblique_Slant: fSlant = DWRITE_FONT_STYLE_OBLIQUE; break; 91*c8dee2aaSAndroid Build Coastguard Worker default: SkASSERT(false); break; 92*c8dee2aaSAndroid Build Coastguard Worker } 93*c8dee2aaSAndroid Build Coastguard Worker } 94*c8dee2aaSAndroid Build Coastguard Worker DWRITE_FONT_WEIGHT fWeight; 95*c8dee2aaSAndroid Build Coastguard Worker DWRITE_FONT_STRETCH fWidth; 96*c8dee2aaSAndroid Build Coastguard Worker DWRITE_FONT_STYLE fSlant; 97*c8dee2aaSAndroid Build Coastguard Worker }; 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker #endif 100