172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com/* 272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * Copyright 2014 Google Inc. 372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * 472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * Use of this source code is governed by a BSD-style license that can be 572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com * found in the LICENSE file. 672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com */ 772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 851daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman#ifndef SkDWrite_DEFINED 951daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman#define SkDWrite_DEFINED 1051daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman 1172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com#include "SkTemplates.h" 1272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 1372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com#include <dwrite.h> 1472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 1572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comclass SkString; 1672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 1772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com//////////////////////////////////////////////////////////////////////////////// 1872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com// Factory 1972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 2072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comIDWriteFactory* sk_get_dwrite_factory(); 2172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 2272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com//////////////////////////////////////////////////////////////////////////////// 2372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com// String conversion 2472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 2572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com/** Prefer to use this type to prevent template proliferation. */ 2672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comtypedef SkAutoSTMalloc<16, WCHAR> SkSMallocWCHAR; 2772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 2872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com/** Converts a utf8 string to a WCHAR string. */ 2972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comHRESULT sk_cstring_to_wchar(const char* skname, SkSMallocWCHAR* name); 3072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 3172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com/** Converts a WCHAR string to a utf8 string. */ 3272cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comHRESULT sk_wchar_to_skstring(WCHAR* name, SkString* skname); 3372cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 3472cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com//////////////////////////////////////////////////////////////////////////////// 3572cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com// Locale 3672cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 3772cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comvoid sk_get_locale_string(IDWriteLocalizedStrings* names, const WCHAR* preferedLocale, 3872cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com SkString* skname); 3972cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.com 4072cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comtypedef decltype(GetUserDefaultLocaleName)* SkGetUserDefaultLocaleNameProc; 4172cf4fcafa54cfa04c5ec7cb8eaa3acb144712ddbungeman@google.comHRESULT SkGetGetUserDefaultLocaleNameProc(SkGetUserDefaultLocaleNameProc* proc); 4251daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman 4351daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman//////////////////////////////////////////////////////////////////////////////// 4451daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman// Table handling 4551daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman 4651daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungemanclass AutoDWriteTable { 4751daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungemanpublic: 4851daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman AutoDWriteTable(IDWriteFontFace* fontFace, UINT32 beTag) : fFontFace(fontFace), fExists(FALSE) { 4951daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman // Any errors are ignored, user must check fExists anyway. 5051daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman fontFace->TryGetFontTable(beTag, 5151daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman reinterpret_cast<const void **>(&fData), &fSize, &fLock, &fExists); 5251daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman } 5351daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman ~AutoDWriteTable() { 5451daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman if (fExists) { 5551daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman fFontFace->ReleaseFontTable(fLock); 5651daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman } 5751daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman } 5851daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman 5951daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman const uint8_t* fData; 6051daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman UINT32 fSize; 6151daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman BOOL fExists; 6251daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungemanprivate: 6351daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman // Borrowed reference, the user must ensure the fontFace stays alive. 6451daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman IDWriteFontFace* fFontFace; 6551daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman void* fLock; 6651daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman}; 6751daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungemantemplate<typename T> class AutoTDWriteTable : public AutoDWriteTable { 6851daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungemanpublic: 6951daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman static const UINT32 tag = DWRITE_MAKE_OPENTYPE_TAG(T::TAG0, T::TAG1, T::TAG2, T::TAG3); 7051daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman AutoTDWriteTable(IDWriteFontFace* fontFace) : AutoDWriteTable(fontFace, tag) { } 7151daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman 7251daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman const T* get() const { return reinterpret_cast<const T*>(fData); } 7351daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman const T* operator->() const { return reinterpret_cast<const T*>(fData); } 7451daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman}; 7551daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman 7651daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman#endif 77