| /* | |
| * Copyright 2014 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef SkDWrite_DEFINED | |
| #define SkDWrite_DEFINED | |
| #include "SkTemplates.h" | |
| #include <dwrite.h> | |
| class SkString; | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // Factory | |
| IDWriteFactory* sk_get_dwrite_factory(); | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // String conversion | |
| /** Prefer to use this type to prevent template proliferation. */ | |
| typedef SkAutoSTMalloc<16, WCHAR> SkSMallocWCHAR; | |
| /** Converts a utf8 string to a WCHAR string. */ | |
| HRESULT sk_cstring_to_wchar(const char* skname, SkSMallocWCHAR* name); | |
| /** Converts a WCHAR string to a utf8 string. */ | |
| HRESULT sk_wchar_to_skstring(WCHAR* name, SkString* skname); | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // Locale | |
| void sk_get_locale_string(IDWriteLocalizedStrings* names, const WCHAR* preferedLocale, | |
| SkString* skname); | |
| typedef decltype(GetUserDefaultLocaleName)* SkGetUserDefaultLocaleNameProc; | |
| HRESULT SkGetGetUserDefaultLocaleNameProc(SkGetUserDefaultLocaleNameProc* proc); | |
| //////////////////////////////////////////////////////////////////////////////// | |
| // Table handling | |
| class AutoDWriteTable { | |
| public: | |
| AutoDWriteTable(IDWriteFontFace* fontFace, UINT32 beTag) : fFontFace(fontFace), fExists(FALSE) { | |
| // Any errors are ignored, user must check fExists anyway. | |
| fontFace->TryGetFontTable(beTag, | |
| reinterpret_cast<const void **>(&fData), &fSize, &fLock, &fExists); | |
| } | |
| ~AutoDWriteTable() { | |
| if (fExists) { | |
| fFontFace->ReleaseFontTable(fLock); | |
| } | |
| } | |
| const uint8_t* fData; | |
| UINT32 fSize; | |
| BOOL fExists; | |
| private: | |
| // Borrowed reference, the user must ensure the fontFace stays alive. | |
| IDWriteFontFace* fFontFace; | |
| void* fLock; | |
| }; | |
| template<typename T> class AutoTDWriteTable : public AutoDWriteTable { | |
| public: | |
| static const UINT32 tag = DWRITE_MAKE_OPENTYPE_TAG(T::TAG0, T::TAG1, T::TAG2, T::TAG3); | |
| AutoTDWriteTable(IDWriteFontFace* fontFace) : AutoDWriteTable(fontFace, tag) { } | |
| const T* get() const { return reinterpret_cast<const T*>(fData); } | |
| const T* operator->() const { return reinterpret_cast<const T*>(fData); } | |
| }; | |
| #endif |