1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
/*
* 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 "SkFontStyle.h"
#include "SkTemplates.h"
#include <dwrite.h>
#include <winsdkver.h>
class SkString;
////////////////////////////////////////////////////////////////////////////////
// Factory
#ifndef SK_HAS_DWRITE_1_H
#define SK_HAS_DWRITE_1_H (WINVER_MAXVER >= 0x0602)
#endif
#ifndef SK_HAS_DWRITE_2_H
#define SK_HAS_DWRITE_2_H (WINVER_MAXVER >= 0x0603)
#endif
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.
* @param nameLen the number of WCHARs in the name.
*/
HRESULT sk_wchar_to_skstring(WCHAR* name, int nameLen, SkString* skname);
////////////////////////////////////////////////////////////////////////////////
// Locale
void sk_get_locale_string(IDWriteLocalizedStrings* names, const WCHAR* preferedLocale,
SkString* skname);
typedef int (WINAPI *SkGetUserDefaultLocaleNameProc)(LPWSTR, int);
HRESULT SkGetGetUserDefaultLocaleNameProc(SkGetUserDefaultLocaleNameProc* proc);
////////////////////////////////////////////////////////////////////////////////
// Table handling
class AutoDWriteTable {
public:
AutoDWriteTable(IDWriteFontFace* fontFace, UINT32 beTag) : fExists(FALSE), fFontFace(fontFace) {
// 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); }
};
////////////////////////////////////////////////////////////////////////////////
// Style conversion
struct DWriteStyle {
explicit DWriteStyle(const SkFontStyle& pattern) {
fWeight = (DWRITE_FONT_WEIGHT)pattern.weight();
fWidth = (DWRITE_FONT_STRETCH)pattern.width();
switch (pattern.slant()) {
case SkFontStyle::kUpright_Slant: fSlant = DWRITE_FONT_STYLE_NORMAL ; break;
case SkFontStyle::kItalic_Slant: fSlant = DWRITE_FONT_STYLE_ITALIC ; break;
case SkFontStyle::kOblique_Slant: fSlant = DWRITE_FONT_STYLE_OBLIQUE; break;
default: SkASSERT(false); break;
}
}
DWRITE_FONT_WEIGHT fWeight;
DWRITE_FONT_STRETCH fWidth;
DWRITE_FONT_STYLE fSlant;
};
#endif
|