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