1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2  * This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 /*
7  * New DirectWrite interfaces based on Win10 Fall Creators Update versions
8  * of dwrite_3.h and dcommon.h (from SDK 10.0.17061.0). This particular
9  * subset of declarations is intended to be just sufficient to compile the
10  * Gecko DirectWrite font code; it omits many other new interfaces, etc.
11  */
12 
13 #ifndef DWRITE_EXTRA_H
14 #define DWRITE_EXTRA_H
15 
16 #pragma once
17 
18 interface IDWriteFontResource;
19 interface IDWriteFontFaceReference1;
20 
21 enum DWRITE_GLYPH_IMAGE_FORMATS {
22   DWRITE_GLYPH_IMAGE_FORMATS_NONE = 0x00000000,
23   DWRITE_GLYPH_IMAGE_FORMATS_TRUETYPE = 0x00000001,
24   DWRITE_GLYPH_IMAGE_FORMATS_CFF = 0x00000002,
25   DWRITE_GLYPH_IMAGE_FORMATS_COLR = 0x00000004,
26   DWRITE_GLYPH_IMAGE_FORMATS_SVG = 0x00000008,
27   DWRITE_GLYPH_IMAGE_FORMATS_PNG = 0x00000010,
28   DWRITE_GLYPH_IMAGE_FORMATS_JPEG = 0x00000020,
29   DWRITE_GLYPH_IMAGE_FORMATS_TIFF = 0x00000040,
30   DWRITE_GLYPH_IMAGE_FORMATS_PREMULTIPLIED_B8G8R8A8 = 0x00000080,
31 };
32 
33 #ifdef DEFINE_ENUM_FLAG_OPERATORS
34 DEFINE_ENUM_FLAG_OPERATORS(DWRITE_GLYPH_IMAGE_FORMATS);
35 #endif
36 
37 #define DWRITE_MAKE_FONT_AXIS_TAG(a, b, c, d) \
38   (static_cast<DWRITE_FONT_AXIS_TAG>(DWRITE_MAKE_OPENTYPE_TAG(a, b, c, d)))
39 
40 enum DWRITE_FONT_AXIS_TAG : UINT32 {
41   DWRITE_FONT_AXIS_TAG_WEIGHT = DWRITE_MAKE_FONT_AXIS_TAG('w', 'g', 'h', 't'),
42   DWRITE_FONT_AXIS_TAG_WIDTH = DWRITE_MAKE_FONT_AXIS_TAG('w', 'd', 't', 'h'),
43   DWRITE_FONT_AXIS_TAG_SLANT = DWRITE_MAKE_FONT_AXIS_TAG('s', 'l', 'n', 't'),
44   DWRITE_FONT_AXIS_TAG_OPTICAL_SIZE =
45       DWRITE_MAKE_FONT_AXIS_TAG('o', 'p', 's', 'z'),
46   DWRITE_FONT_AXIS_TAG_ITALIC = DWRITE_MAKE_FONT_AXIS_TAG('i', 't', 'a', 'l'),
47 };
48 
49 enum DWRITE_FONT_AXIS_ATTRIBUTES {
50   DWRITE_FONT_AXIS_ATTRIBUTES_NONE = 0x0000,
51   DWRITE_FONT_AXIS_ATTRIBUTES_VARIABLE = 0x0001,
52   DWRITE_FONT_AXIS_ATTRIBUTES_HIDDEN = 0x0002,
53 };
54 
55 struct DWRITE_FONT_AXIS_VALUE {
56   DWRITE_FONT_AXIS_TAG axisTag;
57   FLOAT value;
58 };
59 
60 struct DWRITE_FONT_AXIS_RANGE {
61   DWRITE_FONT_AXIS_TAG axisTag;
62   FLOAT minValue;
63   FLOAT maxValue;
64 };
65 
66 struct DWRITE_GLYPH_IMAGE_DATA {
67   const void* imageData;
68   UINT32 imageDataSize;
69   UINT32 uniqueDataId;
70   UINT32 pixelsPerEm;
71   D2D1_SIZE_U pixelSize;
72   D2D1_POINT_2L horizontalLeftOrigin;
73   D2D1_POINT_2L horizontalRightOrigin;
74   D2D1_POINT_2L verticalTopOrigin;
75   D2D1_POINT_2L verticalBottomOrigin;
76 };
77 
78 interface DWRITE_DECLARE_INTERFACE("27F2A904-4EB8-441D-9678-0563F53E3E2F")
79     IDWriteFontFace4 : public IDWriteFontFace3 {
80   STDMETHOD_(DWRITE_GLYPH_IMAGE_FORMATS, GetGlyphImageFormats)() PURE;
81   STDMETHOD(GetGlyphImageFormats)
82   (UINT16 glyphId, UINT32 pixelsPerEmFirst, UINT32 pixelsPerEmLast,
83    _Out_ DWRITE_GLYPH_IMAGE_FORMATS * glyphImageFormats) PURE;
84   STDMETHOD(GetGlyphImageData)
85   (_In_ UINT16 glyphId, UINT32 pixelsPerEm,
86    DWRITE_GLYPH_IMAGE_FORMATS glyphImageFormat,
87    _Out_ DWRITE_GLYPH_IMAGE_DATA * glyphData,
88    _Outptr_result_maybenull_ void** glyphDataContext) PURE;
89   STDMETHOD_(void, ReleaseGlyphImageData)(void* glyphDataContext) PURE;
90 };
91 
92 interface DWRITE_DECLARE_INTERFACE("98EFF3A5-B667-479A-B145-E2FA5B9FDC29")
93     IDWriteFontFace5 : public IDWriteFontFace4 {
94   STDMETHOD_(UINT32, GetFontAxisValueCount)() PURE;
95   STDMETHOD(GetFontAxisValues)
96   (_Out_writes_(fontAxisValueCount) DWRITE_FONT_AXIS_VALUE * fontAxisValues,
97    UINT32 fontAxisValueCount) PURE;
98   STDMETHOD_(BOOL, HasVariations)() PURE;
99   STDMETHOD(GetFontResource)
100   (_COM_Outptr_ IDWriteFontResource * *fontResource) PURE;
101   STDMETHOD_(BOOL, Equals)(IDWriteFontFace * fontFace) PURE;
102 };
103 
104 interface DWRITE_DECLARE_INTERFACE("1F803A76-6871-48E8-987F-B975551C50F2")
105     IDWriteFontResource : public IUnknown {
106   STDMETHOD(GetFontFile)(_COM_Outptr_ IDWriteFontFile * *fontFile) PURE;
107   STDMETHOD_(UINT32, GetFontFaceIndex)() PURE;
108   STDMETHOD_(UINT32, GetFontAxisCount)() PURE;
109   STDMETHOD(GetDefaultFontAxisValues)
110   (_Out_writes_(fontAxisValueCount) DWRITE_FONT_AXIS_VALUE * fontAxisValues,
111    UINT32 fontAxisValueCount) PURE;
112   STDMETHOD(GetFontAxisRanges)
113   (_Out_writes_(fontAxisRangeCount) DWRITE_FONT_AXIS_RANGE * fontAxisRanges,
114    UINT32 fontAxisRangeCount) PURE;
115   STDMETHOD_(DWRITE_FONT_AXIS_ATTRIBUTES, GetFontAxisAttributes)
116   (UINT32 axisIndex) PURE;
117   STDMETHOD(GetAxisNames)
118   (UINT32 axisIndex, _COM_Outptr_ IDWriteLocalizedStrings * *names) PURE;
119   STDMETHOD_(UINT32, GetAxisValueNameCount)(UINT32 axisIndex) PURE;
120   STDMETHOD(GetAxisValueNames)
121   (UINT32 axisIndex, UINT32 axisValueIndex,
122    _Out_ DWRITE_FONT_AXIS_RANGE * fontAxisRange,
123    _COM_Outptr_ IDWriteLocalizedStrings * *names) PURE;
124   STDMETHOD_(BOOL, HasVariations)() PURE;
125   STDMETHOD(CreateFontFace)
126   (DWRITE_FONT_SIMULATIONS fontSimulations,
127    _In_reads_(fontAxisValueCount) DWRITE_FONT_AXIS_VALUE const* fontAxisValues,
128    UINT32 fontAxisValueCount, _COM_Outptr_ IDWriteFontFace5** fontFace) PURE;
129   STDMETHOD(CreateFontFaceReference)
130   (DWRITE_FONT_SIMULATIONS fontSimulations,
131    _In_reads_(fontAxisValueCount) DWRITE_FONT_AXIS_VALUE const* fontAxisValues,
132    UINT32 fontAxisValueCount,
133    _COM_Outptr_ IDWriteFontFaceReference1** fontFaceReference) PURE;
134 };
135 
136 #endif /* DWRITE_EXTRA_H */
137