winapi_ui_automation/um/
dwrite.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6//! DirectX Typography Services public API definitions.
7use ctypes::c_void;
8use shared::basetsd::{INT16, INT32, UINT16, UINT32, UINT64, UINT8};
9use shared::guiddef::REFIID;
10use shared::minwindef::{BOOL, BYTE, FILETIME, FLOAT};
11use shared::windef::{COLORREF, HDC, HMONITOR, RECT, SIZE};
12use shared::winerror::SEVERITY_ERROR;
13use um::d2d1::ID2D1SimplifiedGeometrySink;
14use um::dcommon::DWRITE_MEASURING_MODE;
15use um::unknwnbase::{IUnknown, IUnknownVtbl};
16use um::wingdi::LOGFONTW;
17use um::winnt::{HRESULT, WCHAR};
18ENUM!{enum DWRITE_FONT_FILE_TYPE {
19    DWRITE_FONT_FILE_TYPE_UNKNOWN,
20    DWRITE_FONT_FILE_TYPE_CFF,
21    DWRITE_FONT_FILE_TYPE_TRUETYPE,
22    DWRITE_FONT_FILE_TYPE_OPENTYPE_COLLECTION,
23    DWRITE_FONT_FILE_TYPE_TYPE1_PFM,
24    DWRITE_FONT_FILE_TYPE_TYPE1_PFB,
25    DWRITE_FONT_FILE_TYPE_VECTOR,
26    DWRITE_FONT_FILE_TYPE_BITMAP,
27    DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION = DWRITE_FONT_FILE_TYPE_OPENTYPE_COLLECTION,
28}}
29ENUM!{enum DWRITE_FONT_FACE_TYPE {
30    DWRITE_FONT_FACE_TYPE_CFF,
31    DWRITE_FONT_FACE_TYPE_TRUETYPE,
32    DWRITE_FONT_FACE_TYPE_OPENTYPE_COLLECTION,
33    DWRITE_FONT_FACE_TYPE_TYPE1,
34    DWRITE_FONT_FACE_TYPE_VECTOR,
35    DWRITE_FONT_FACE_TYPE_BITMAP,
36    DWRITE_FONT_FACE_TYPE_UNKNOWN,
37    DWRITE_FONT_FACE_TYPE_RAW_CFF,
38    DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION = DWRITE_FONT_FACE_TYPE_OPENTYPE_COLLECTION,
39}}
40ENUM!{enum DWRITE_FONT_SIMULATIONS {
41    DWRITE_FONT_SIMULATIONS_NONE = 0x0000,
42    DWRITE_FONT_SIMULATIONS_BOLD = 0x0001,
43    DWRITE_FONT_SIMULATIONS_OBLIQUE = 0x0002,
44}}
45ENUM!{enum DWRITE_FONT_WEIGHT {
46    DWRITE_FONT_WEIGHT_THIN = 100,
47    DWRITE_FONT_WEIGHT_EXTRA_LIGHT = 200,
48    DWRITE_FONT_WEIGHT_ULTRA_LIGHT = 200,
49    DWRITE_FONT_WEIGHT_LIGHT = 300,
50    DWRITE_FONT_WEIGHT_SEMI_LIGHT = 350,
51    DWRITE_FONT_WEIGHT_NORMAL = 400,
52    DWRITE_FONT_WEIGHT_REGULAR = 400,
53    DWRITE_FONT_WEIGHT_MEDIUM = 500,
54    DWRITE_FONT_WEIGHT_DEMI_BOLD = 600,
55    DWRITE_FONT_WEIGHT_SEMI_BOLD = 600,
56    DWRITE_FONT_WEIGHT_BOLD = 700,
57    DWRITE_FONT_WEIGHT_EXTRA_BOLD = 800,
58    DWRITE_FONT_WEIGHT_ULTRA_BOLD = 800,
59    DWRITE_FONT_WEIGHT_BLACK = 900,
60    DWRITE_FONT_WEIGHT_HEAVY = 900,
61    DWRITE_FONT_WEIGHT_EXTRA_BLACK = 950,
62    DWRITE_FONT_WEIGHT_ULTRA_BLACK = 950,
63}}
64ENUM!{enum DWRITE_FONT_STRETCH {
65    DWRITE_FONT_STRETCH_UNDEFINED = 0,
66    DWRITE_FONT_STRETCH_ULTRA_CONDENSED = 1,
67    DWRITE_FONT_STRETCH_EXTRA_CONDENSED = 2,
68    DWRITE_FONT_STRETCH_CONDENSED = 3,
69    DWRITE_FONT_STRETCH_SEMI_CONDENSED = 4,
70    DWRITE_FONT_STRETCH_NORMAL = 5,
71    DWRITE_FONT_STRETCH_MEDIUM = 5,
72    DWRITE_FONT_STRETCH_SEMI_EXPANDED = 6,
73    DWRITE_FONT_STRETCH_EXPANDED = 7,
74    DWRITE_FONT_STRETCH_EXTRA_EXPANDED = 8,
75    DWRITE_FONT_STRETCH_ULTRA_EXPANDED = 9,
76}}
77ENUM!{enum DWRITE_FONT_STYLE {
78    DWRITE_FONT_STYLE_NORMAL,
79    DWRITE_FONT_STYLE_OBLIQUE,
80    DWRITE_FONT_STYLE_ITALIC,
81}}
82ENUM!{enum DWRITE_INFORMATIONAL_STRING_ID {
83    DWRITE_INFORMATIONAL_STRING_NONE,
84    DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE,
85    DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS,
86    DWRITE_INFORMATIONAL_STRING_TRADEMARK,
87    DWRITE_INFORMATIONAL_STRING_MANUFACTURER,
88    DWRITE_INFORMATIONAL_STRING_DESIGNER,
89    DWRITE_INFORMATIONAL_STRING_DESIGNER_URL,
90    DWRITE_INFORMATIONAL_STRING_DESCRIPTION,
91    DWRITE_INFORMATIONAL_STRING_FONT_VENDOR_URL,
92    DWRITE_INFORMATIONAL_STRING_LICENSE_DESCRIPTION,
93    DWRITE_INFORMATIONAL_STRING_LICENSE_INFO_URL,
94    DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES,
95    DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES,
96    DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES,
97    DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES,
98    DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT,
99    DWRITE_INFORMATIONAL_STRING_FULL_NAME,
100    DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_NAME,
101    DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_CID_NAME,
102    DWRITE_INFORMATIONAL_STRING_WWS_FAMILY_NAME,
103    DWRITE_INFORMATIONAL_STRING_DESIGN_SCRIPT_LANGUAGE_TAG,
104    DWRITE_INFORMATIONAL_STRING_SUPPORTED_SCRIPT_LANGUAGE_TAG,
105}}
106STRUCT!{struct DWRITE_FONT_METRICS {
107    designUnitsPerEm: UINT16,
108    ascent: UINT16,
109    descent: UINT16,
110    lineGap: INT16,
111    capHeight: UINT16,
112    xHeight: UINT16,
113    underlinePosition: INT16,
114    underlineThickness: UINT16,
115    strikethroughPosition: INT16,
116    strikethroughThickness: UINT16,
117}}
118STRUCT!{struct DWRITE_GLYPH_METRICS {
119    leftSideBearing: INT32,
120    advanceWidth: UINT32,
121    rightSideBearing: INT32,
122    topSideBearing: INT32,
123    advanceHeight: UINT32,
124    bottomSideBearing: INT32,
125    verticalOriginY: INT32,
126}}
127STRUCT!{struct DWRITE_GLYPH_OFFSET {
128    advanceOffset: FLOAT,
129    ascenderOffset: FLOAT,
130}}
131ENUM!{enum DWRITE_FACTORY_TYPE {
132    DWRITE_FACTORY_TYPE_SHARED,
133    DWRITE_FACTORY_TYPE_ISOLATED,
134}}
135RIDL!{#[uuid(0x727cad4e, 0xd6af, 0x4c9e, 0x8a, 0x08, 0xd6, 0x95, 0xb1, 0x1c, 0xaa, 0x49)]
136interface IDWriteFontFileLoader(IDWriteFontFileLoaderVtbl): IUnknown(IUnknownVtbl) {
137    fn CreateStreamFromKey(
138        fontFileReferenceKey: *const c_void,
139        fontFileReferenceKeySize: UINT32,
140        fontFileStream: *mut *mut IDWriteFontFileStream,
141    ) -> HRESULT,
142}}
143RIDL!{#[uuid(0xb2d9f3ec, 0xc9fe, 0x4a11, 0xa2, 0xec, 0xd8, 0x62, 0x08, 0xf7, 0xc0, 0xa2)]
144interface IDWriteLocalFontFileLoader(IDWriteLocalFontFileLoaderVtbl):
145    IDWriteFontFileLoader(IDWriteFontFileLoaderVtbl) {
146    fn GetFilePathLengthFromKey(
147        fontFileReferenceKey: *const c_void,
148        fontFileReferenceKeySize: UINT32,
149        filePathLength: *mut UINT32,
150    ) -> HRESULT,
151    fn GetFilePathFromKey(
152        fontFileReferenceKey: *const c_void,
153        fontFileReferenceKeySize: UINT32,
154        filePath: *mut WCHAR,
155        filePathSize: UINT32,
156    ) -> HRESULT,
157    fn GetLastWriteTimeFromKey(
158        fontFileReferenceKey: *const c_void,
159        fontFileReferenceKeySize: UINT32,
160        lastWriteTime: *mut FILETIME,
161    ) -> HRESULT,
162}}
163RIDL!{#[uuid(0x6d4865fe, 0x0ab8, 0x4d91, 0x8f, 0x62, 0x5d, 0xd6, 0xbe, 0x34, 0xa3, 0xe0)]
164interface IDWriteFontFileStream(IDWriteFontFileStreamVtbl): IUnknown(IUnknownVtbl) {
165    fn ReadFileFragment(
166        fragmentStart: *mut *const c_void,
167        fileOffset: UINT64,
168        fragmentSize: UINT64,
169        fragmentContext: *mut *mut c_void,
170    ) -> HRESULT,
171    fn ReleaseFileFragment(
172        fragmentContext: *mut c_void,
173    ) -> (),
174    fn GetFileSize(
175        fileSize: *mut UINT64,
176    ) -> HRESULT,
177    fn GetLastWriteTime(
178        lastWriteTime: *mut UINT64,
179    ) -> HRESULT,
180}}
181ENUM!{enum DWRITE_OUTLINE_THRESHOLD {
182    DWRITE_OUTLINE_THRESHOLD_ANTIALIASED,
183    DWRITE_OUTLINE_THRESHOLD_ALIASED,
184}}
185STRUCT!{struct DWRITE_FONT_METRICS1 {
186    designUnitsPerEm: UINT16,
187    ascent: UINT16,
188    descent: UINT16,
189    lineGap: INT16,
190    capHeight: UINT16,
191    xHeight: UINT16,
192    underlinePosition: INT16,
193    underlineThickness: UINT16,
194    strikethroughPosition: INT16,
195    strikethroughThickness: UINT16,
196    glyphBoxLeft: INT16,
197    glyphBoxTop: INT16,
198    glyphBoxRight: INT16,
199    glyphBoxBottom: INT16,
200    subscriptPositionX: INT16,
201    subscriptPositionY: INT16,
202    subscriptSizeX: INT16,
203    subscriptSizeY: INT16,
204    superscriptPositionX: INT16,
205    superscriptPositionY: INT16,
206    superscriptSizeX: INT16,
207    superscriptSizeY: INT16,
208    hasTypographicMetrics: BOOL,
209}}
210STRUCT!{struct DWRITE_UNICODE_RANGE {
211    first: UINT32,
212    last: UINT32,
213}}
214STRUCT!{struct DWRITE_CARET_METRICS {
215    slopeRise: INT16,
216    slopeRun: INT16,
217    offset: INT16,
218}}
219#[inline]
220pub fn DWRITE_MAKE_OPENTYPE_TAG(a: u8, b: u8, c: u8, d: u8) -> u32 {
221    ((d as u32) << 24) | ((c as u32) << 16) | ((b as u32) << 8) | (a as u32)
222}
223RIDL!{#[uuid(0x739d886a, 0xcef5, 0x47dc, 0x87, 0x69, 0x1a, 0x8b, 0x41, 0xbe, 0xbb, 0xb0)]
224interface IDWriteFontFile(IDWriteFontFileVtbl): IUnknown(IUnknownVtbl) {
225    fn GetReferenceKey(
226        fontFileReferenceKey: *mut *const c_void,
227        fontFileReferenceKeySize: *mut UINT32,
228    ) -> HRESULT,
229    fn GetLoader(
230        fontFileLoader: *mut *mut IDWriteFontFileLoader,
231    ) -> HRESULT,
232    fn Analyze(
233        isSupportedFontType: *mut BOOL,
234        fontFileType: *mut DWRITE_FONT_FILE_TYPE,
235        fontFaceType: *mut DWRITE_FONT_FACE_TYPE,
236        numberOfFaces: *mut UINT32,
237    ) -> HRESULT,
238}}
239ENUM!{enum DWRITE_PIXEL_GEOMETRY {
240    DWRITE_PIXEL_GEOMETRY_FLAT,
241    DWRITE_PIXEL_GEOMETRY_RGB,
242    DWRITE_PIXEL_GEOMETRY_BGR,
243}}
244ENUM!{enum DWRITE_RENDERING_MODE {
245    DWRITE_RENDERING_MODE_DEFAULT,
246    DWRITE_RENDERING_MODE_ALIASED,
247    DWRITE_RENDERING_MODE_GDI_CLASSIC,
248    DWRITE_RENDERING_MODE_GDI_NATURAL,
249    DWRITE_RENDERING_MODE_NATURAL,
250    DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,
251    DWRITE_RENDERING_MODE_OUTLINE,
252    DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC = DWRITE_RENDERING_MODE_GDI_CLASSIC,
253    DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL = DWRITE_RENDERING_MODE_GDI_NATURAL,
254    DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL = DWRITE_RENDERING_MODE_NATURAL,
255    DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC = DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,
256}}
257STRUCT!{struct DWRITE_MATRIX {
258    m11: FLOAT,
259    m12: FLOAT,
260    m21: FLOAT,
261    m22: FLOAT,
262    dx: FLOAT,
263    dy: FLOAT,
264}}
265RIDL!{#[uuid(0x2f0da53a, 0x2add, 0x47cd, 0x82, 0xee, 0xd9, 0xec, 0x34, 0x68, 0x8e, 0x75)]
266interface IDWriteRenderingParams(IDWriteRenderingParamsVtbl): IUnknown(IUnknownVtbl) {
267    fn GetGamma() -> FLOAT,
268    fn GetEnhancedContrast() -> FLOAT,
269    fn GetClearTypeLevel() -> FLOAT,
270    fn GetPixelGeometry() -> DWRITE_PIXEL_GEOMETRY,
271    fn GetRenderingMode() -> DWRITE_RENDERING_MODE,
272}}
273pub type IDWriteGeometrySink = ID2D1SimplifiedGeometrySink;
274RIDL!{#[uuid(0x5f49804d, 0x7024, 0x4d43, 0xbf, 0xa9, 0xd2, 0x59, 0x84, 0xf5, 0x38, 0x49)]
275interface IDWriteFontFace(IDWriteFontFaceVtbl): IUnknown(IUnknownVtbl) {
276    fn GetType() -> DWRITE_FONT_FACE_TYPE,
277    fn GetFiles(
278        numberOfFiles: *mut UINT32,
279        fontFiles: *mut *mut IDWriteFontFile,
280    ) -> HRESULT,
281    fn GetIndex() -> UINT32,
282    fn GetSimulations() -> DWRITE_FONT_SIMULATIONS,
283    fn IsSymbolFont() -> BOOL,
284    fn GetMetrics(
285        fontFaceMetrics: *mut DWRITE_FONT_METRICS,
286    ) -> (),
287    fn GetGlyphCount() -> UINT16,
288    fn GetDesignGlyphMetrics(
289        glyphIndices: *const UINT16,
290        glyphCount: UINT32,
291        glyphMetrics: *mut DWRITE_GLYPH_METRICS,
292        isSideways: BOOL,
293    ) -> HRESULT,
294    fn GetGlyphIndices(
295        codePoints: *const UINT32,
296        codePointCount: UINT32,
297        glyphIndices: *mut UINT16,
298    ) -> HRESULT,
299    fn TryGetFontTable(
300        openTypeTableTag: UINT32,
301        tableData: *mut *const c_void,
302        tableSize: *mut UINT32,
303        tableContext: *mut *mut c_void,
304        exists: *mut BOOL,
305    ) -> HRESULT,
306    fn ReleaseFontTable(
307        tableContext: *mut c_void,
308    ) -> HRESULT,
309    fn GetGlyphRunOutline(
310        emSize: FLOAT,
311        glyphIndices: *const UINT16,
312        glyphAdvances: *const FLOAT,
313        glyphOffsets: *const DWRITE_GLYPH_OFFSET,
314        glyphCount: UINT32,
315        isSideways: BOOL,
316        isRightToLeft: BOOL,
317        geometrySink: *mut IDWriteGeometrySink,
318    ) -> HRESULT,
319    fn GetRecommendedRenderingMode(
320        emSize: FLOAT,
321        pixelsPerDip: FLOAT,
322        measuringMode: DWRITE_MEASURING_MODE,
323        renderingParams: *mut IDWriteRenderingParams,
324        renderingMode: *mut DWRITE_RENDERING_MODE,
325    ) -> HRESULT,
326    fn GetGdiCompatibleMetrics(
327        emSize: FLOAT,
328        pixelsPerDip: FLOAT,
329        transform: *const DWRITE_MATRIX,
330        fontFaceMetrics: *mut DWRITE_FONT_METRICS,
331    ) -> HRESULT,
332    fn GetGdiCompatibleGlyphMetrics(
333        enSize: FLOAT,
334        pixelsPerDip: FLOAT,
335        transform: *const DWRITE_MATRIX,
336        useGdiNatrual: BOOL,
337        glyphIndices: *const UINT16,
338        glyphCount: UINT32,
339        glyphMetrics: *mut DWRITE_GLYPH_METRICS,
340        isSideways: BOOL,
341    ) -> HRESULT,
342}}
343RIDL!{#[uuid(0xa71efdb4, 0x9fdb, 0x4838, 0xad, 0x90, 0xcf, 0xc3, 0xbe, 0x8c, 0x3d, 0xaf)]
344interface IDWriteFontFace1(IDWriteFontFace1Vtbl): IDWriteFontFace(IDWriteFontFaceVtbl) {
345    fn GetMetrics(
346        fontFaceMetrics: *mut DWRITE_FONT_METRICS1,
347    ) -> (),
348    fn GetGdiCompatibleMetrics(
349        emSize: FLOAT,
350        pixelsPerDip: FLOAT,
351        transform: *const DWRITE_MATRIX,
352        fontFaceMetrics: *mut DWRITE_FONT_METRICS1,
353    ) -> HRESULT,
354    fn GetCaretMetrics(
355        caretMetrics: *mut DWRITE_CARET_METRICS,
356    ) -> (),
357    fn GetUnicodeRanges(
358        maxRangeCount: UINT32,
359        unicodeRanges: *mut DWRITE_UNICODE_RANGE,
360        actualRangeCount: *mut UINT32,
361    ) -> HRESULT,
362    fn IsMonoSpacedFont() -> BOOL,
363    fn GetDesignGlyphAdvances(
364        glyphCount: UINT32,
365        glyphIndices: *const UINT16,
366        glyphAdvances: *mut INT32,
367        isSideways: BOOL,
368    ) -> HRESULT,
369    fn GetGdiCompatibleGlyphAdvance(
370        emSize: FLOAT,
371        pixelsPerDip: FLOAT,
372        transform: *const DWRITE_MATRIX,
373        useGdiNatural: BOOL,
374        isSideways: BOOL,
375        glyphCount: UINT32,
376        glyphIndices: *const UINT16,
377        glyphAdvances: *mut INT32,
378    ) -> HRESULT,
379    fn GetKerningPairAdjustments(
380        glyphCount: UINT32,
381        glyphIndices: *const UINT16,
382        glyphAdvanceAdjustments: *mut INT32,
383    ) -> HRESULT,
384    fn HasKerningPairs() -> BOOL,
385    fn GetRecommendedRenderingMode(
386        fontEmSize: FLOAT,
387        dpiX: FLOAT,
388        dpiY: FLOAT,
389        transform: *const DWRITE_MATRIX,
390        isSideways: BOOL,
391        outlineThreshold: DWRITE_OUTLINE_THRESHOLD,
392        measuringMode: DWRITE_MEASURING_MODE,
393        renderingMode: *mut DWRITE_RENDERING_MODE,
394    ) -> HRESULT,
395    fn GetVerticalGlyphVariants(
396        nominalGlyphIndices: *const UINT16,
397        verticalGlyphIndices: *mut UINT16,
398    ) -> HRESULT,
399    fn HasVerticalGlyphVariants() -> BOOL,
400}}
401RIDL!{#[uuid(0xcca920e4, 0x52f0, 0x492b, 0xbf, 0xa8, 0x29, 0xc7, 0x2e, 0xe0, 0xa4, 0x68)]
402interface IDWriteFontCollectionLoader(IDWriteFontCollectionLoaderVtbl):
403        IUnknown(IUnknownVtbl) {
404    fn CreateEnumeratorFromKey(
405        factory: *mut IDWriteFactory,
406        collectionKey: *const c_void,
407        collectionKeySize: UINT32,
408        fontFileEnumerator: *mut *mut IDWriteFontFileEnumerator,
409    ) -> HRESULT,
410}}
411RIDL!{#[uuid(0x72755049, 0x5ff7, 0x435d, 0x83, 0x48, 0x4b, 0xe9, 0x7c, 0xfa, 0x6c, 0x7c)]
412interface IDWriteFontFileEnumerator(IDWriteFontFileEnumeratorVtbl): IUnknown(IUnknownVtbl) {
413    fn MoveNext(
414        hasCurrentFile: *mut BOOL,
415    ) -> HRESULT,
416    fn GetCurrentFontFile(
417        fontFile: *mut *mut IDWriteFontFile,
418    ) -> HRESULT,
419}}
420RIDL!{#[uuid(0x08256209, 0x099a, 0x4b34, 0xb8, 0x6d, 0xc2, 0x2b, 0x11, 0x0e, 0x77, 0x71)]
421interface IDWriteLocalizedStrings(IDWriteLocalizedStringsVtbl): IUnknown(IUnknownVtbl) {
422    fn GetCount() -> UINT32,
423    fn FindLocaleName(
424        localeName: *const WCHAR,
425        index: *mut UINT32,
426        exists: *mut BOOL,
427    ) -> HRESULT,
428    fn GetLocaleNameLength(
429        index: UINT32,
430        length: *mut UINT32,
431    ) -> HRESULT,
432    fn GetLocaleName(
433        index: UINT32,
434        localeName: *mut WCHAR,
435        size: UINT32,
436    ) -> HRESULT,
437    fn GetStringLength(
438        index: UINT32,
439        length: *mut UINT32,
440    ) -> HRESULT,
441    fn GetString(
442        index: UINT32,
443        stringBuffer: *mut WCHAR,
444        size: UINT32,
445    ) -> HRESULT,
446}}
447RIDL!{#[uuid(0xa84cee02, 0x3eea, 0x4eee, 0xa8, 0x27, 0x87, 0xc1, 0xa0, 0x2a, 0x0f, 0xcc)]
448interface IDWriteFontCollection(IDWriteFontCollectionVtbl): IUnknown(IUnknownVtbl) {
449    fn GetFontFamilyCount() -> UINT32,
450    fn GetFontFamily(
451        index: UINT32,
452        fontFamily: *mut *mut IDWriteFontFamily,
453    ) -> HRESULT,
454    fn FindFamilyName(
455        familyName: *const WCHAR,
456        index: *mut UINT32,
457        exists: *mut BOOL,
458    ) -> HRESULT,
459    fn GetFontFromFontFace(
460        fontFace: *mut IDWriteFontFace,
461        font: *mut *mut IDWriteFont,
462    ) -> HRESULT,
463}}
464RIDL!{#[uuid(0x1a0d8438, 0x1d97, 0x4ec1, 0xae, 0xf9, 0xa2, 0xfb, 0x86, 0xed, 0x6a, 0xcb)]
465interface IDWriteFontList(IDWriteFontListVtbl): IUnknown(IUnknownVtbl) {
466    fn GetFontCollection(
467        fontCollection: *mut *mut IDWriteFontCollection,
468    ) -> HRESULT,
469    fn GetFontCount() -> UINT32,
470    fn GetFont(
471        index: UINT32,
472        font: *mut *mut IDWriteFont,
473    ) -> HRESULT,
474}}
475RIDL!{#[uuid(0xda20d8ef, 0x812a, 0x4c43, 0x98, 0x02, 0x62, 0xec, 0x4a, 0xbd, 0x7a, 0xdd)]
476interface IDWriteFontFamily(IDWriteFontFamilyVtbl): IDWriteFontList(IDWriteFontListVtbl) {
477    fn GetFamilyNames(
478        names: *mut *mut IDWriteLocalizedStrings,
479    ) -> HRESULT,
480    fn GetFirstMatchingFont(
481        weight: DWRITE_FONT_WEIGHT,
482        stretch: DWRITE_FONT_STRETCH,
483        style: DWRITE_FONT_STYLE,
484        matchingFont: *mut *mut IDWriteFont,
485    ) -> HRESULT,
486    fn GetMatchingFonts(
487        weight: DWRITE_FONT_WEIGHT,
488        stretch: DWRITE_FONT_STRETCH,
489        style: DWRITE_FONT_STYLE,
490        matchingFonts: *mut *mut IDWriteFontList,
491    ) -> HRESULT,
492}}
493RIDL!{#[uuid(0xacd16696, 0x8c14, 0x4f5d, 0x87, 0x7e, 0xfe, 0x3f, 0xc1, 0xd3, 0x27, 0x37)]
494interface IDWriteFont(IDWriteFontVtbl): IUnknown(IUnknownVtbl) {
495    fn GetFontFamily(
496        fontFamily: *mut *mut IDWriteFontFamily,
497    ) -> HRESULT,
498    fn GetWeight() -> DWRITE_FONT_WEIGHT,
499    fn GetStretch() -> DWRITE_FONT_STRETCH,
500    fn GetStyle() -> DWRITE_FONT_STYLE,
501    fn IsSymbolFont() -> BOOL,
502    fn GetFaceNames(
503        names: *mut *mut IDWriteLocalizedStrings,
504    ) -> HRESULT,
505    fn GetInformationalStrings(
506        informationalStringId: DWRITE_INFORMATIONAL_STRING_ID,
507        informationalStrings: *mut *mut IDWriteLocalizedStrings,
508        exists: *mut BOOL,
509    ) -> HRESULT,
510    fn GetSimulations() -> DWRITE_FONT_SIMULATIONS,
511    fn GetMetrics(
512        fontMetrics: *mut DWRITE_FONT_METRICS,
513    ) -> (),
514    fn HasCharacter(
515        unicodeValue: UINT32,
516        exists: *mut BOOL,
517    ) -> HRESULT,
518    fn CreateFontFace(
519        fontFace: *mut *mut IDWriteFontFace,
520    ) -> HRESULT,
521}}
522ENUM!{enum DWRITE_READING_DIRECTION {
523    DWRITE_READING_DIRECTION_LEFT_TO_RIGHT = 0,
524    DWRITE_READING_DIRECTION_RIGHT_TO_LEFT = 1,
525    DWRITE_READING_DIRECTION_TOP_TO_BOTTOM = 2,
526    DWRITE_READING_DIRECTION_BOTTOM_TO_TOP = 3,
527}}
528ENUM!{enum DWRITE_FLOW_DIRECTION {
529    DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM = 0,
530    DWRITE_FLOW_DIRECTION_BOTTOM_TO_TOP = 1,
531    DWRITE_FLOW_DIRECTION_LEFT_TO_RIGHT = 2,
532    DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFT = 3,
533}}
534ENUM!{enum DWRITE_TEXT_ALIGNMENT {
535    DWRITE_TEXT_ALIGNMENT_LEADING,
536    DWRITE_TEXT_ALIGNMENT_TRAILING,
537    DWRITE_TEXT_ALIGNMENT_CENTER,
538    DWRITE_TEXT_ALIGNMENT_JUSTIFIED,
539}}
540ENUM!{enum DWRITE_PARAGRAPH_ALIGNMENT {
541    DWRITE_PARAGRAPH_ALIGNMENT_NEAR,
542    DWRITE_PARAGRAPH_ALIGNMENT_FAR,
543    DWRITE_PARAGRAPH_ALIGNMENT_CENTER,
544}}
545ENUM!{enum DWRITE_WORD_WRAPPING {
546    DWRITE_WORD_WRAPPING_WRAP = 0,
547    DWRITE_WORD_WRAPPING_NO_WRAP = 1,
548    DWRITE_WORD_WRAPPING_EMERGENCY_BREAK = 2,
549    DWRITE_WORD_WRAPPING_WHOLE_WORD = 3,
550    DWRITE_WORD_WRAPPING_CHARACTER = 4,
551}}
552ENUM!{enum DWRITE_LINE_SPACING_METHOD {
553    DWRITE_LINE_SPACING_METHOD_DEFAULT,
554    DWRITE_LINE_SPACING_METHOD_UNIFORM,
555    DWRITE_LINE_SPACING_METHOD_PROPORTIONAL,
556}}
557ENUM!{enum DWRITE_TRIMMING_GRANULARITY {
558    DWRITE_TRIMMING_GRANULARITY_NONE,
559    DWRITE_TRIMMING_GRANULARITY_CHARACTER,
560    DWRITE_TRIMMING_GRANULARITY_WORD,
561}}
562ENUM!{enum DWRITE_FONT_FEATURE_TAG {
563    DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS = 0x63726661, // 'afrc'
564    DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS = 0x63703263, // 'c2pc'
565    DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS = 0x63733263, // 'c2sc'
566    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES = 0x746c6163, // 'calt'
567    DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS = 0x65736163, // 'case'
568    DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION = 0x706d6363, // 'ccmp'
569    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES = 0x67696c63, // 'clig'
570    DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING = 0x70737063, // 'cpsp'
571    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH = 0x68777363, // 'cswh'
572    DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING = 0x73727563, // 'curs'
573    DWRITE_FONT_FEATURE_TAG_DEFAULT = 0x746c6664, // 'dflt'
574    DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES = 0x67696c64, // 'dlig'
575    DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS = 0x74707865, // 'expt'
576    DWRITE_FONT_FEATURE_TAG_FRACTIONS = 0x63617266, // 'frac'
577    DWRITE_FONT_FEATURE_TAG_FULL_WIDTH = 0x64697766, // 'fwid'
578    DWRITE_FONT_FEATURE_TAG_HALF_FORMS = 0x666c6168, // 'half'
579    DWRITE_FONT_FEATURE_TAG_HALANT_FORMS = 0x6e6c6168, // 'haln'
580    DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH = 0x746c6168, // 'halt'
581    DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS = 0x74736968, // 'hist'
582    DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES = 0x616e6b68, // 'hkna'
583    DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES = 0x67696c68, // 'hlig'
584    DWRITE_FONT_FEATURE_TAG_HALF_WIDTH = 0x64697768, // 'hwid'
585    DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS = 0x6f6a6f68, // 'hojo'
586    DWRITE_FONT_FEATURE_TAG_JIS04_FORMS = 0x3430706a, // 'jp04'
587    DWRITE_FONT_FEATURE_TAG_JIS78_FORMS = 0x3837706a, // 'jp78'
588    DWRITE_FONT_FEATURE_TAG_JIS83_FORMS = 0x3338706a, // 'jp83'
589    DWRITE_FONT_FEATURE_TAG_JIS90_FORMS = 0x3039706a, // 'jp90'
590    DWRITE_FONT_FEATURE_TAG_KERNING = 0x6e72656b, // 'kern'
591    DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES = 0x6167696c, // 'liga'
592    DWRITE_FONT_FEATURE_TAG_LINING_FIGURES = 0x6d756e6c, // 'lnum'
593    DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS = 0x6c636f6c, // 'locl'
594    DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING = 0x6b72616d, // 'mark'
595    DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK = 0x6b72676d, // 'mgrk'
596    DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING = 0x6b6d6b6d, // 'mkmk'
597    DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS = 0x746c616e, // 'nalt'
598    DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS = 0x6b636c6e, // 'nlck'
599    DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES = 0x6d756e6f, // 'onum'
600    DWRITE_FONT_FEATURE_TAG_ORDINALS = 0x6e64726f, // 'ordn'
601    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH = 0x746c6170, // 'palt'
602    DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS = 0x70616370, // 'pcap'
603    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES = 0x6d756e70, // 'pnum'
604    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS = 0x64697770, // 'pwid'
605    DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS = 0x64697771, // 'qwid'
606    DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES = 0x67696c72, // 'rlig'
607    DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS = 0x79627572, // 'ruby'
608    DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES = 0x746c6173, // 'salt'
609    DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS = 0x666e6973, // 'sinf'
610    DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS = 0x70636d73, // 'smcp'
611    DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS = 0x6c706d73, // 'smpl'
612    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1 = 0x31307373, // 'ss01'
613    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2 = 0x32307373, // 'ss02'
614    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3 = 0x33307373, // 'ss03'
615    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4 = 0x34307373, // 'ss04'
616    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5 = 0x35307373, // 'ss05'
617    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6 = 0x36307373, // 'ss06'
618    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7 = 0x37307373, // 'ss07'
619    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8 = 0x38307373, // 'ss08'
620    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9 = 0x39307373, // 'ss09'
621    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10 = 0x30317373, // 'ss10'
622    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11 = 0x31317373, // 'ss11'
623    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12 = 0x32317373, // 'ss12'
624    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13 = 0x33317373, // 'ss13'
625    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14 = 0x34317373, // 'ss14'
626    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15 = 0x35317373, // 'ss15'
627    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16 = 0x36317373, // 'ss16'
628    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17 = 0x37317373, // 'ss17'
629    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18 = 0x38317373, // 'ss18'
630    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19 = 0x39317373, // 'ss19'
631    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20 = 0x30327373, // 'ss20'
632    DWRITE_FONT_FEATURE_TAG_SUBSCRIPT = 0x73627573, // 'subs'
633    DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT = 0x73707573, // 'sups'
634    DWRITE_FONT_FEATURE_TAG_SWASH = 0x68737773, // 'swsh'
635    DWRITE_FONT_FEATURE_TAG_TITLING = 0x6c746974, // 'titl'
636    DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS = 0x6d616e74, // 'tnam'
637    DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES = 0x6d756e74, // 'tnum'
638    DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS = 0x64617274, // 'trad'
639    DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS = 0x64697774, // 'twid'
640    DWRITE_FONT_FEATURE_TAG_UNICASE = 0x63696e75, // 'unic'
641    DWRITE_FONT_FEATURE_TAG_VERTICAL_WRITING = 0x74726576, // 'vert'
642    DWRITE_FONT_FEATURE_TAG_VERTICAL_ALTERNATES_AND_ROTATION = 0x32747276, // 'vrt2'
643    DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO = 0x6f72657a, // 'zero'
644}}
645STRUCT!{struct DWRITE_TEXT_RANGE {
646    startPosition: UINT32,
647    length: UINT32,
648}}
649STRUCT!{struct DWRITE_FONT_FEATURE {
650    nameTag: DWRITE_FONT_FEATURE_TAG,
651    parameter: UINT32,
652}}
653STRUCT!{struct DWRITE_TYPOGRAPHIC_FEATURES {
654    features: *mut DWRITE_FONT_FEATURE,
655    featureCount: UINT32,
656}}
657STRUCT!{struct DWRITE_TRIMMING {
658    granularity: DWRITE_TRIMMING_GRANULARITY,
659    delimiter: UINT32,
660    delimiterCount: UINT32,
661}}
662RIDL!{#[uuid(0x9c906818, 0x31d7, 0x4fd3, 0xa1, 0x51, 0x7c, 0x5e, 0x22, 0x5d, 0xb5, 0x5a)]
663interface IDWriteTextFormat(IDWriteTextFormatVtbl): IUnknown(IUnknownVtbl) {
664    fn SetTextAlignment(
665        textAlignment: DWRITE_TEXT_ALIGNMENT,
666    ) -> HRESULT,
667    fn SetParagraphAlignment(
668        paragraphAlignment: DWRITE_PARAGRAPH_ALIGNMENT,
669    ) -> HRESULT,
670    fn SetWordWrapping(
671        wordWrapping: DWRITE_WORD_WRAPPING,
672    ) -> HRESULT,
673    fn SetReadingDirection(
674        readingDirection: DWRITE_READING_DIRECTION,
675    ) -> HRESULT,
676    fn SetFlowDirection(
677        flowDirection: DWRITE_FLOW_DIRECTION,
678    ) -> HRESULT,
679    fn SetIncrementalTabStop(
680        incrementalTabStop: FLOAT,
681    ) -> HRESULT,
682    fn SetTrimming(
683        trimmingOptions: *const DWRITE_TRIMMING,
684        trimmingSign: *mut IDWriteInlineObject,
685    ) -> HRESULT,
686    fn SetLineSpacing(
687        lineSpacingMethod: DWRITE_LINE_SPACING_METHOD,
688        lineSpacing: FLOAT,
689        baseLine: FLOAT,
690    ) -> HRESULT,
691    fn GetTextAlignment() -> DWRITE_TEXT_ALIGNMENT,
692    fn GetParagraphAlignment() -> DWRITE_PARAGRAPH_ALIGNMENT,
693    fn GetWordWrapping() -> DWRITE_WORD_WRAPPING,
694    fn GetReadingDirection() -> DWRITE_READING_DIRECTION,
695    fn GetFlowDirection() -> DWRITE_FLOW_DIRECTION,
696    fn GetIncrementalTabStop() -> FLOAT,
697    fn GetTrimming(
698        trimmingOptions: *mut DWRITE_TRIMMING,
699        trimmingSign: *mut *mut IDWriteInlineObject,
700    ) -> HRESULT,
701    fn GetLineSpacing(
702        lineSpacingMethod: *mut DWRITE_LINE_SPACING_METHOD,
703        lineSpacing: *mut FLOAT,
704        baseline: *mut FLOAT,
705    ) -> HRESULT,
706    fn GetFontCollection(
707        fontCollection: *mut *mut IDWriteFontCollection,
708    ) -> HRESULT,
709    fn GetFontFamilyNameLength() -> UINT32,
710    fn GetFontFamilyName(
711        fontFamilyName: *mut WCHAR,
712        nameSize: UINT32,
713    ) -> HRESULT,
714    fn GetFontWeight() -> DWRITE_FONT_WEIGHT,
715    fn GetFontStyle() -> DWRITE_FONT_STYLE,
716    fn GetFontStretch() -> DWRITE_FONT_STRETCH,
717    fn GetFontSize() -> FLOAT,
718    fn GetLocaleNameLength() -> UINT32,
719    fn GetLocaleName(
720        localeName: *mut WCHAR,
721        nameSize: UINT32,
722    ) -> HRESULT,
723}}
724RIDL!{#[uuid(0x55f1112b, 0x1dc2, 0x4b3c, 0x95, 0x41, 0xf4, 0x68, 0x94, 0xed, 0x85, 0xb6)]
725interface IDWriteTypography(IDWriteTypographyVtbl): IUnknown(IUnknownVtbl) {
726    fn AddFontFeature(
727        fontFeature: DWRITE_FONT_FEATURE,
728    ) -> HRESULT,
729    fn GetFontFeatureCount() -> UINT32,
730    fn GetFontFeature(
731        fontFeatureIndex: UINT32,
732        fontFeature: *mut DWRITE_FONT_FEATURE,
733    ) -> HRESULT,
734}}
735ENUM!{enum DWRITE_SCRIPT_SHAPES {
736    DWRITE_SCRIPT_SHAPES_DEFAULT = 0,
737    DWRITE_SCRIPT_SHAPES_NO_VISUAL = 1,
738}}
739STRUCT!{struct DWRITE_SCRIPT_ANALYSIS {
740    script: UINT16,
741    shapes: DWRITE_SCRIPT_SHAPES,
742}}
743ENUM!{enum DWRITE_BREAK_CONDITION {
744    DWRITE_BREAK_CONDITION_NEUTRAL,
745    DWRITE_BREAK_CONDITION_CAN_BREAK,
746    DWRITE_BREAK_CONDITION_MAY_NOT_BREAK,
747    DWRITE_BREAK_CONDITION_MUST_BREAK,
748}}
749STRUCT!{struct DWRITE_LINE_BREAKPOINT {
750    bit_fields: UINT8,
751}}
752BITFIELD!{DWRITE_LINE_BREAKPOINT bit_fields: UINT8 [
753    breakConditionBefore set_breakConditionBefore[0..2],
754    breakConditionAfter set_breakConditionAfter[2..4],
755    isWhitespace set_isWhitespace[4..5],
756    isSoftHyphen set_isSoftHyphen[5..6],
757    padding set_padding[6..8],
758]}
759ENUM!{enum DWRITE_NUMBER_SUBSTITUTION_METHOD {
760    DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE,
761    DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL,
762    DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE,
763    DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL,
764    DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL,
765}}
766RIDL!{#[uuid(0x14885cc9, 0xbab0, 0x4f90, 0xb6, 0xed, 0x5c, 0x36, 0x6a, 0x2c, 0xd0, 0x3d)]
767interface IDWriteNumberSubstitution(IDWriteNumberSubstitutionVtbl): IUnknown(IUnknownVtbl) {}}
768STRUCT!{struct DWRITE_SHAPING_TEXT_PROPERTIES {
769    bit_fields: UINT16,
770}}
771BITFIELD!{DWRITE_SHAPING_TEXT_PROPERTIES bit_fields: UINT16 [
772    isShapedAlone set_isShapedAlone[0..1],
773    reserved set_reserved[1..16],
774]}
775STRUCT!{struct DWRITE_SHAPING_GLYPH_PROPERTIES {
776    bit_fields: UINT16,
777}}
778BITFIELD!{DWRITE_SHAPING_GLYPH_PROPERTIES bit_fields: UINT16 [
779    justification set_justification[0..4],
780    isClusterStart set_isClusterStart[4..5],
781    isDiacritic set_isDiacritic[5..6],
782    isZeroWidthSpace set_isZeroWidthSpace[6..7],
783    reserved set_reserved[7..16],
784]}
785RIDL!{#[uuid(0x688e1a58, 0x5094, 0x47c8, 0xad, 0xc8, 0xfb, 0xce, 0xa6, 0x0a, 0xe9, 0x2b)]
786interface IDWriteTextAnalysisSource(IDWriteTextAnalysisSourceVtbl): IUnknown(IUnknownVtbl) {
787    fn GetTextAtPosition(
788        textPosition: UINT32,
789        textString: *mut *const WCHAR,
790        textLength: *mut UINT32,
791    ) -> HRESULT,
792    fn GetTextBeforePosition(
793        textPosition: UINT32,
794        textString: *mut *const WCHAR,
795        textLength: *mut UINT32,
796    ) -> HRESULT,
797    fn GetParagraphReadingDirection() -> DWRITE_READING_DIRECTION,
798    fn GetLocaleName(
799        textPosition: UINT32,
800        textLength: *mut UINT32,
801        localeName: *mut *const WCHAR,
802    ) -> HRESULT,
803    fn GetNumberSubstitution(
804        textPosition: UINT32,
805        textLength: *mut UINT32,
806        numberSubstitution: *mut *mut IDWriteNumberSubstitution,
807    ) -> HRESULT,
808}}
809RIDL!{#[uuid(0x5810cd44, 0x0ca0, 0x4701, 0xb3, 0xfa, 0xbe, 0xc5, 0x18, 0x2a, 0xe4, 0xf6)]
810interface IDWriteTextAnalysisSink(IDWriteTextAnalysisSinkVtbl): IUnknown(IUnknownVtbl) {
811    fn SetScriptAnalysis(
812        textPosition: UINT32,
813        textLength: UINT32,
814        scriptAnalysis: *const DWRITE_SCRIPT_ANALYSIS,
815    ) -> HRESULT,
816    fn SetLineBreakpoints(
817        textPosition: UINT32,
818        textLength: UINT32,
819        lineBreakpoints: *const DWRITE_LINE_BREAKPOINT,
820    ) -> HRESULT,
821    fn SetBidiLevel(
822        textPosition: UINT32,
823        textLength: UINT32,
824        explicitLevel: UINT8,
825        resolvedLevel: UINT8,
826    ) -> HRESULT,
827    fn SetNumberSubstitution(
828        textPosition: UINT32,
829        textLength: UINT32,
830        numberSubstitution: *mut IDWriteNumberSubstitution,
831    ) -> HRESULT,
832}}
833RIDL!{#[uuid(0xb7e6163e, 0x7f46, 0x43b4, 0x84, 0xb3, 0xe4, 0xe6, 0x24, 0x9c, 0x36, 0x5d)]
834interface IDWriteTextAnalyzer(IDWriteTextAnalyzerVtbl): IUnknown(IUnknownVtbl) {
835    fn AnalyzeScript(
836        analysisSource: *mut IDWriteTextAnalysisSource,
837        textPosition: UINT32,
838        textLength: UINT32,
839        analysisSink: *mut IDWriteTextAnalysisSink,
840    ) -> HRESULT,
841    fn AnalyzeBidi(
842        analysisSource: *mut IDWriteTextAnalysisSource,
843        textPosition: UINT32,
844        textLength: UINT32,
845        analysisSink: *mut IDWriteTextAnalysisSink,
846    ) -> HRESULT,
847    fn AnalyzeNumberSubstitution(
848        analysisSource: *mut IDWriteTextAnalysisSource,
849        textPosition: UINT32,
850        textLength: UINT32,
851        analysisSink: *mut IDWriteTextAnalysisSink,
852    ) -> HRESULT,
853    fn AnalyzeLineBreakpoints(
854        analysisSource: *mut IDWriteTextAnalysisSource,
855        textPosition: UINT32,
856        textLength: UINT32,
857        analysisSink: *mut IDWriteTextAnalysisSink,
858    ) -> HRESULT,
859    fn GetGlyphs(
860        textString: *const WCHAR,
861        textLength: UINT32,
862        fontFace: *mut IDWriteFontFace,
863        isSideways: BOOL,
864        isRightToLeft: BOOL,
865        scriptAnalysis: *const DWRITE_SCRIPT_ANALYSIS,
866        localeName: *const WCHAR,
867        numberSubstitution: *mut IDWriteNumberSubstitution,
868        features: *mut *const DWRITE_TYPOGRAPHIC_FEATURES,
869        featureRangeLengths: *const UINT32,
870        featureRanges: UINT32,
871        maxGlyphCount: UINT32,
872        clusterMap: *mut UINT16,
873        textProps: *mut DWRITE_SHAPING_TEXT_PROPERTIES,
874        glyphIndices: *mut UINT16,
875        glyphProps: *mut DWRITE_SHAPING_GLYPH_PROPERTIES,
876        actualGlyphCount: *mut UINT32,
877    ) -> HRESULT,
878    fn GetGlyphPlacements(
879        textString: *const WCHAR,
880        clusterMap: *const UINT16,
881        textProps: *mut DWRITE_SHAPING_TEXT_PROPERTIES,
882        textLength: UINT32,
883        glyphIndices: *const UINT16,
884        glyphProps: *const DWRITE_SHAPING_GLYPH_PROPERTIES,
885        glyphCount: UINT32,
886        fontFace: *mut IDWriteFontFace,
887        fontEmSize: FLOAT,
888        isSideways: BOOL,
889        isRightToLeft: BOOL,
890        scriptAnalysis: *const DWRITE_SCRIPT_ANALYSIS,
891        localeName: *const WCHAR,
892        features: *mut *const DWRITE_TYPOGRAPHIC_FEATURES,
893        featureRangeLengths: *const UINT32,
894        featureRanges: UINT32,
895        glyphAdvances: *mut FLOAT,
896        glyphOffsets: *mut DWRITE_GLYPH_OFFSET,
897    ) -> HRESULT,
898    fn GetGdiCompatibleGlyphPlacements(
899        textString: *const WCHAR,
900        clusterMap: *const UINT16,
901        textProps: *mut DWRITE_SHAPING_TEXT_PROPERTIES,
902        textLength: UINT32,
903        glyphIndices: *const UINT16,
904        glyphProps: *const DWRITE_SHAPING_GLYPH_PROPERTIES,
905        glyphCount: UINT32,
906        fontFace: *mut IDWriteFontFace,
907        fontEmSize: FLOAT,
908        pixelsPerDip: FLOAT,
909        transform: *const DWRITE_MATRIX,
910        useGdiNatrual: BOOL,
911        isSideways: BOOL,
912        isRightToLeft: BOOL,
913        scriptAnalysis: *const DWRITE_SCRIPT_ANALYSIS,
914        localeName: *const WCHAR,
915        features: *mut *const DWRITE_TYPOGRAPHIC_FEATURES,
916        featureRangeLengths: *const UINT32,
917        featureRanges: UINT32,
918        glyphAdvances: *mut FLOAT,
919        glyphOffsets: *mut DWRITE_GLYPH_OFFSET,
920    ) -> HRESULT,
921}}
922STRUCT!{struct DWRITE_GLYPH_RUN {
923    fontFace: *mut IDWriteFontFace,
924    fontEmSize: FLOAT,
925    glyphCount: UINT32,
926    glyphIndices: *const UINT16,
927    glyphAdvances: *const FLOAT,
928    glyphOffsets: *const DWRITE_GLYPH_OFFSET,
929    isSideways: BOOL,
930    bidiLevel: UINT32,
931}}
932STRUCT!{struct DWRITE_GLYPH_RUN_DESCRIPTION {
933    localeName: *const WCHAR,
934    string: *const WCHAR,
935    stringLength: UINT32,
936    clusterMap: *const UINT16,
937    textPosition: UINT32,
938}}
939STRUCT!{struct DWRITE_UNDERLINE {
940    width: FLOAT,
941    thickness: FLOAT,
942    offset: FLOAT,
943    runHeight: FLOAT,
944    readingDirection: DWRITE_READING_DIRECTION,
945    flowDirection: DWRITE_FLOW_DIRECTION,
946    localeName: *const WCHAR,
947    measuringMode: DWRITE_MEASURING_MODE,
948}}
949STRUCT!{struct DWRITE_STRIKETHROUGH {
950    width: FLOAT,
951    thickness: FLOAT,
952    offset: FLOAT,
953    readingDirection: DWRITE_READING_DIRECTION,
954    flowDirection: DWRITE_FLOW_DIRECTION,
955    localeName: *const WCHAR,
956    measuringMode: DWRITE_MEASURING_MODE,
957}}
958STRUCT!{struct DWRITE_LINE_METRICS {
959    length: UINT32,
960    trailingWhitespaceLength: UINT32,
961    newlineLength: UINT32,
962    height: FLOAT,
963    baseline: FLOAT,
964    isTrimmed: BOOL,
965}}
966STRUCT!{struct DWRITE_CLUSTER_METRICS {
967    width: FLOAT,
968    length: UINT16,
969    bit_fields: UINT16,
970}}
971BITFIELD!{DWRITE_CLUSTER_METRICS bit_fields: UINT16 [
972    canWrapLineAfter set_canWrapLineAfter[0..1],
973    isWhitespace set_isWhitespace[1..2],
974    isNewline set_isNewline[2..3],
975    isSoftHyphen set_isSoftHyphen[3..4],
976    isRightToLeft set_isRightToLeft[4..5],
977    padding set_padding[5..16],
978]}
979STRUCT!{struct DWRITE_TEXT_METRICS {
980    left: FLOAT,
981    top: FLOAT,
982    width: FLOAT,
983    widthIncludingTrailingWhitespace: FLOAT,
984    height: FLOAT,
985    layoutWidth: FLOAT,
986    layoutHeight: FLOAT,
987    maxBidiReorderingDepth: UINT32,
988    lineCount: UINT32,
989}}
990STRUCT!{struct DWRITE_INLINE_OBJECT_METRICS {
991    width: FLOAT,
992    height: FLOAT,
993    baseline: FLOAT,
994    supportsSideways: BOOL,
995}}
996STRUCT!{struct DWRITE_OVERHANG_METRICS {
997    left: FLOAT,
998    top: FLOAT,
999    right: FLOAT,
1000    bottom: FLOAT,
1001}}
1002STRUCT!{struct DWRITE_HIT_TEST_METRICS {
1003    textPosition: UINT32,
1004    length: UINT32,
1005    left: FLOAT,
1006    top: FLOAT,
1007    width: FLOAT,
1008    height: FLOAT,
1009    bidiLevel: UINT32,
1010    isText: BOOL,
1011    isTrimmed: BOOL,
1012}}
1013RIDL!{#[uuid(0x8339fde3, 0x106f, 0x47ab, 0x83, 0x73, 0x1c, 0x62, 0x95, 0xeb, 0x10, 0xb3)]
1014interface IDWriteInlineObject(IDWriteInlineObjectVtbl): IUnknown(IUnknownVtbl) {
1015    fn Draw(
1016        clientDrawingContext: *mut c_void,
1017        renderer: *mut IDWriteTextRenderer,
1018        originX: FLOAT,
1019        originY: FLOAT,
1020        isSideways: BOOL,
1021        isRightToLeft: BOOL,
1022        clientDrawingEffect: *mut IUnknown,
1023    ) -> HRESULT,
1024    fn GetMetrics(
1025        metrics: *mut DWRITE_INLINE_OBJECT_METRICS,
1026    ) -> HRESULT,
1027    fn GetOverhangMetrics(
1028        overhangs: *mut DWRITE_OVERHANG_METRICS,
1029    ) -> HRESULT,
1030    fn GetBreakConditions(
1031        breakConditionBefore: *mut DWRITE_BREAK_CONDITION,
1032        breakConditionAfter: *mut DWRITE_BREAK_CONDITION,
1033    ) -> HRESULT,
1034}}
1035RIDL!{#[uuid(0xeaf3a2da, 0xecf4, 0x4d24, 0xb6, 0x44, 0xb3, 0x4f, 0x68, 0x42, 0x02, 0x4b)]
1036interface IDWritePixelSnapping(IDWritePixelSnappingVtbl): IUnknown(IUnknownVtbl) {
1037    fn IsPixelSnappingDisabled(
1038        clientDrawingContext: *mut c_void,
1039        isDisabled: *mut BOOL,
1040    ) -> HRESULT,
1041    fn GetCurrentTransform(
1042        clientDrawingContext: *mut c_void,
1043        transform: *mut DWRITE_MATRIX,
1044    ) -> HRESULT,
1045    fn GetPixelsPerDip(
1046        clientDrawingContext: *mut c_void,
1047        pixelsPerDip: *mut FLOAT,
1048    ) -> HRESULT,
1049}}
1050RIDL!{#[uuid(0xef8a8135, 0x5cc6, 0x45fe, 0x88, 0x25, 0xc5, 0xa0, 0x72, 0x4e, 0xb8, 0x19)]
1051interface IDWriteTextRenderer(IDWriteTextRendererVtbl):
1052        IDWritePixelSnapping(IDWritePixelSnappingVtbl) {
1053    fn DrawGlyphRun(
1054        clientDrawingContext: *mut c_void,
1055        baselineOriginX: FLOAT,
1056        baselineOriginY: FLOAT,
1057        measuringMode: DWRITE_MEASURING_MODE,
1058        glyphRun: *const DWRITE_GLYPH_RUN,
1059        glyphRunDescription: *const DWRITE_GLYPH_RUN_DESCRIPTION,
1060        clientDrawingEffect: *mut IUnknown,
1061    ) -> HRESULT,
1062    fn DrawUnderline(
1063        clientDrawingContext: *mut c_void,
1064        baselineOriginX: FLOAT,
1065        baselineOriginY: FLOAT,
1066        underline: *const DWRITE_UNDERLINE,
1067        clientDrawingEffect: *mut IUnknown,
1068    ) -> HRESULT,
1069    fn DrawStrikethrough(
1070        clientDrawingContext: *mut c_void,
1071        baselineOriginX: FLOAT,
1072        baselineOriginY: FLOAT,
1073        strikethrough: *const DWRITE_STRIKETHROUGH,
1074        clientDrawingEffect: *mut IUnknown,
1075    ) -> HRESULT,
1076    fn DrawInlineObject(
1077        clientDrawingContext: *mut c_void,
1078        baselineOriginX: FLOAT,
1079        baselineOriginY: FLOAT,
1080        inlineObject: *mut IDWriteInlineObject,
1081        isSideways: BOOL,
1082        isRightToLeft: BOOL,
1083        clientDrawingEffect: *mut IUnknown,
1084    ) -> HRESULT,
1085}}
1086RIDL!{#[uuid(0x53737037, 0x6d14, 0x410b, 0x9b, 0xfe, 0x0b, 0x18, 0x2b, 0xb7, 0x09, 0x61)]
1087interface IDWriteTextLayout(IDWriteTextLayoutVtbl):
1088        IDWriteTextFormat(IDWriteTextFormatVtbl) {
1089    fn SetMaxWidth(
1090        maxWidth: FLOAT,
1091    ) -> HRESULT,
1092    fn SetMaxHeight(
1093        maxHeight: FLOAT,
1094    ) -> HRESULT,
1095    fn SetFontCollection(
1096        fontCollection: *mut IDWriteFontCollection,
1097        textRange: DWRITE_TEXT_RANGE,
1098    ) -> HRESULT,
1099    fn SetFontFamilyName(
1100        fontFamilyName: *const WCHAR,
1101        textRange: DWRITE_TEXT_RANGE,
1102    ) -> HRESULT,
1103    fn SetFontWeight(
1104        fontWeight: DWRITE_FONT_WEIGHT,
1105        textRange: DWRITE_TEXT_RANGE,
1106    ) -> HRESULT,
1107    fn SetFontStyle(
1108        fontStyle: DWRITE_FONT_STYLE,
1109        textRange: DWRITE_TEXT_RANGE,
1110    ) -> HRESULT,
1111    fn SetFontStretch(
1112        fontStretch: DWRITE_FONT_STRETCH,
1113        textRange: DWRITE_TEXT_RANGE,
1114    ) -> HRESULT,
1115    fn SetFontSize(
1116        fontSize: FLOAT,
1117        textRange: DWRITE_TEXT_RANGE,
1118    ) -> HRESULT,
1119    fn SetUnderline(
1120        hasUnderline: BOOL,
1121        textRange: DWRITE_TEXT_RANGE,
1122    ) -> HRESULT,
1123    fn SetStrikethrough(
1124        hasStrikethrough: BOOL,
1125        textRange: DWRITE_TEXT_RANGE,
1126    ) -> HRESULT,
1127    fn SetDrawingEffect(
1128        drawingEffect: *mut IUnknown,
1129        textRange: DWRITE_TEXT_RANGE,
1130    ) -> HRESULT,
1131    fn SetInlineObject(
1132        inlineObject: *mut IDWriteInlineObject,
1133        textRange: DWRITE_TEXT_RANGE,
1134    ) -> HRESULT,
1135    fn SetTypography(
1136        typography: *mut IDWriteTypography,
1137        textRange: DWRITE_TEXT_RANGE,
1138    ) -> HRESULT,
1139    fn SetLocaleName(
1140        localeName: *const WCHAR,
1141        textRange: DWRITE_TEXT_RANGE,
1142    ) -> HRESULT,
1143    fn GetMaxWidth() -> FLOAT,
1144    fn GetMaxHeight() -> FLOAT,
1145    fn GetFontCollection(
1146        currentPosition: UINT32,
1147        fontCollection: *mut *mut IDWriteFontCollection,
1148        textRange: *mut DWRITE_TEXT_RANGE,
1149    ) -> HRESULT,
1150    fn GetFontFamilyNameLength(
1151        currentPosition: UINT32,
1152        nameLength: *mut UINT32,
1153        textRange: *mut DWRITE_TEXT_RANGE,
1154    ) -> HRESULT,
1155    fn GetFontFamilyName(
1156        currentPosition: UINT32,
1157        fontFamilyName: *mut WCHAR,
1158        nameSize: UINT32,
1159        textRange: *mut DWRITE_TEXT_RANGE,
1160    ) -> HRESULT,
1161    fn GetFontWeight(
1162        currentPosition: UINT32,
1163        fontWeight: *mut DWRITE_FONT_WEIGHT,
1164        textRange: *mut DWRITE_TEXT_RANGE,
1165    ) -> HRESULT,
1166    fn GetFontStyle(
1167        currentPosition: UINT32,
1168        fontStyle: *mut DWRITE_FONT_STYLE,
1169        textRange: *mut DWRITE_TEXT_RANGE,
1170    ) -> HRESULT,
1171    fn GetFontStretch(
1172        currentPosition: UINT32,
1173        fontStretch: *mut DWRITE_FONT_STRETCH,
1174        textRange: *mut DWRITE_TEXT_RANGE,
1175    ) -> HRESULT,
1176    fn GetFontSize(
1177        currentPosition: UINT32,
1178        fontSize: *mut FLOAT,
1179        textRange: *mut DWRITE_TEXT_RANGE,
1180    ) -> HRESULT,
1181    fn GetUnderline(
1182        currentPosition: UINT32,
1183        hasUnderline: *mut BOOL,
1184        textRange: *mut DWRITE_TEXT_RANGE,
1185    ) -> HRESULT,
1186    fn GetStrikethrough(
1187        currentPosition: UINT32,
1188        hasStrikethrough: *mut BOOL,
1189        textRange: *mut DWRITE_TEXT_RANGE,
1190    ) -> HRESULT,
1191    fn GetDrawingEffect(
1192        currentPosition: UINT32,
1193        drawingEffect: *mut *mut IUnknown,
1194        textRange: *mut DWRITE_TEXT_RANGE,
1195    ) -> HRESULT,
1196    fn GetInlineObject(
1197        currentPosition: UINT32,
1198        inlineObject: *mut *mut IDWriteInlineObject,
1199        textRange: *mut DWRITE_TEXT_RANGE,
1200    ) -> HRESULT,
1201    fn GetTypography(
1202        currentPosition: UINT32,
1203        typography: *mut *mut IDWriteTypography,
1204        textRange: *mut DWRITE_TEXT_RANGE,
1205    ) -> HRESULT,
1206    fn GetLocaleNameLength(
1207        currentPosition: UINT32,
1208        nameLength: *mut UINT32,
1209        textRange: *mut DWRITE_TEXT_RANGE,
1210    ) -> HRESULT,
1211    fn GetLocaleName(
1212        currentPosition: UINT32,
1213        localeName: *mut WCHAR,
1214        nameSize: UINT32,
1215        textRange: *mut DWRITE_TEXT_RANGE,
1216    ) -> HRESULT,
1217    fn Draw(
1218        clientDrawingContext: *mut c_void,
1219        renderer: *mut IDWriteTextRenderer,
1220        originX: FLOAT,
1221        originY: FLOAT,
1222    ) -> HRESULT,
1223    fn GetLineMetrics(
1224        lineMetrics: *mut DWRITE_LINE_METRICS,
1225        maxLineCount: UINT32,
1226        actualLineCount: *mut UINT32,
1227    ) -> HRESULT,
1228    fn GetMetrics(
1229        textMetrics: *mut DWRITE_TEXT_METRICS,
1230    ) -> HRESULT,
1231    fn GetOverhangMetrics(
1232        overhangs: *mut DWRITE_OVERHANG_METRICS,
1233    ) -> HRESULT,
1234    fn GetClusterMetrics(
1235        clusterMetrics: *mut DWRITE_CLUSTER_METRICS,
1236        maxClusterCount: UINT32,
1237        actualClusterCount: *mut UINT32,
1238    ) -> HRESULT,
1239    fn DetermineMinWidth(
1240        minWidth: *mut FLOAT,
1241    ) -> HRESULT,
1242    fn HitTestPoint(
1243        pointX: FLOAT,
1244        pointY: FLOAT,
1245        isTrailingHit: *mut BOOL,
1246        isInside: *mut BOOL,
1247        hitTestMetrics: *mut DWRITE_HIT_TEST_METRICS,
1248    ) -> HRESULT,
1249    fn HitTestTextPosition(
1250        textPosition: UINT32,
1251        isTrailingHit: BOOL,
1252        pointX: *mut FLOAT,
1253        pointY: *mut FLOAT,
1254        hitTestMetrics: *mut DWRITE_HIT_TEST_METRICS,
1255    ) -> HRESULT,
1256    fn HitTestTextRange(
1257        textPosition: UINT32,
1258        textLength: UINT32,
1259        originX: FLOAT,
1260        originY: FLOAT,
1261        hitTestMetrics: *mut DWRITE_HIT_TEST_METRICS,
1262        maxHitTestMetricsCount: UINT32,
1263        actualHitTestMetricsCount: *mut UINT32,
1264    ) -> HRESULT,
1265}}
1266RIDL!{#[uuid(0x5e5a32a3, 0x8dff, 0x4773, 0x9f, 0xf6, 0x06, 0x96, 0xea, 0xb7, 0x72, 0x67)]
1267interface IDWriteBitmapRenderTarget(IDWriteBitmapRenderTargetVtbl): IUnknown(IUnknownVtbl) {
1268    fn DrawGlyphRun(
1269        baselineOriginX: FLOAT,
1270        baselineOriginY: FLOAT,
1271        measuringMode: DWRITE_MEASURING_MODE,
1272        glyphRun: *const DWRITE_GLYPH_RUN,
1273        renderingParams: *mut IDWriteRenderingParams,
1274        textColor: COLORREF,
1275        blackBoxRect: *mut RECT,
1276    ) -> HRESULT,
1277    fn GetMemoryDC() -> HDC,
1278    fn GetPixelsPerDip() -> FLOAT,
1279    fn SetPixelsPerDip(
1280        pixelsPerDip: FLOAT,
1281    ) -> HRESULT,
1282    fn GetCurrentTransform(
1283        transform: *mut DWRITE_MATRIX,
1284    ) -> HRESULT,
1285    fn SetCurrentTransform(
1286        transform: *const DWRITE_MATRIX,
1287    ) -> HRESULT,
1288    fn GetSize(
1289        size: *mut SIZE,
1290    ) -> HRESULT,
1291    fn Resize(
1292        width: UINT32,
1293        height: UINT32,
1294    ) -> HRESULT,
1295}}
1296RIDL!{#[uuid(0x1edd9491, 0x9853, 0x4299, 0x89, 0x8f, 0x64, 0x32, 0x98, 0x3b, 0x6f, 0x3a)]
1297interface IDWriteGdiInterop(IDWriteGdiInteropVtbl): IUnknown(IUnknownVtbl) {
1298    fn CreateFontFromLOGFONT(
1299        logFont: *const LOGFONTW,
1300        font: *mut *mut IDWriteFont,
1301    ) -> HRESULT,
1302    fn ConvertFontToLOGFONT(
1303        font: *mut IDWriteFont,
1304        logFont: *mut LOGFONTW,
1305        isSystemFont: *mut BOOL,
1306    ) -> HRESULT,
1307    fn ConvertFontFaceToLOGFONT(
1308        font: *mut IDWriteFontFace,
1309        logFont: *mut LOGFONTW,
1310    ) -> HRESULT,
1311    fn CreateFontFaceFromHdc(
1312        hdc: HDC,
1313        fontFace: *mut *mut IDWriteFontFace,
1314    ) -> HRESULT,
1315    fn CreateBitmapRenderTarget(
1316        hdc: HDC,
1317        width: UINT32,
1318        height: UINT32,
1319        renderTarget: *mut *mut IDWriteBitmapRenderTarget,
1320    ) -> HRESULT,
1321}}
1322ENUM!{enum DWRITE_TEXTURE_TYPE {
1323    DWRITE_TEXTURE_ALIASED_1x1 = 0,
1324    DWRITE_TEXTURE_CLEARTYPE_3x1 = 1,
1325}}
1326pub const DWRITE_ALPHA_MAX: BYTE = 255;
1327RIDL!{#[uuid(0x7d97dbf7, 0xe085, 0x42d4, 0x81, 0xe3, 0x6a, 0x88, 0x3b, 0xde, 0xd1, 0x18)]
1328interface IDWriteGlyphRunAnalysis(IDWriteGlyphRunAnalysisVtbl): IUnknown(IUnknownVtbl) {
1329    fn GetAlphaTextureBounds(
1330        textureType: DWRITE_TEXTURE_TYPE,
1331        textureBounds: *mut RECT,
1332    ) -> HRESULT,
1333    fn CreateAlphaTexture(
1334        textureType: DWRITE_TEXTURE_TYPE,
1335        textureBounds: *const RECT,
1336        alphaValues: *mut BYTE,
1337        bufferSize: UINT32,
1338    ) -> HRESULT,
1339    fn GetAlphaBlendParams(
1340        renderingParams: *mut IDWriteRenderingParams,
1341        blendGamma: *mut FLOAT,
1342        blendEnhancedContrast: *mut FLOAT,
1343        blendClearTypeLevel: *mut FLOAT,
1344    ) -> HRESULT,
1345}}
1346RIDL!{#[uuid(0xb859ee5a, 0xd838, 0x4b5b, 0xa2, 0xe8, 0x1a, 0xdc, 0x7d, 0x93, 0xdb, 0x48)]
1347interface IDWriteFactory(IDWriteFactoryVtbl): IUnknown(IUnknownVtbl) {
1348    fn GetSystemFontCollection(
1349        fontCollection: *mut *mut IDWriteFontCollection,
1350        checkForUpdates: BOOL,
1351    ) -> HRESULT,
1352    fn CreateCustomFontCollection(
1353        collectionLoader: *mut IDWriteFontCollectionLoader,
1354        collectionKey: *const c_void,
1355        collectionKeySize: UINT32,
1356        fontCollection: *mut *mut IDWriteFontCollection,
1357    ) -> HRESULT,
1358    fn RegisterFontCollectionLoader(
1359        fontCollectionLoader: *mut IDWriteFontCollectionLoader,
1360    ) -> HRESULT,
1361    fn UnregisterFontCollectionLoader(
1362        fontCollectionLoader: *mut IDWriteFontCollectionLoader,
1363    ) -> HRESULT,
1364    fn CreateFontFileReference(
1365        filePath: *const WCHAR,
1366        lastWriteTime: *const FILETIME,
1367        fontFile: *mut *mut IDWriteFontFile,
1368    ) -> HRESULT,
1369    fn CreateCustomFontFileReference(
1370        fontFileReferenceKey: *const c_void,
1371        fontFileReferenceKeySize: UINT32,
1372        fontFileLoader: *mut IDWriteFontFileLoader,
1373        fontFile: *mut *mut IDWriteFontFile,
1374    ) -> HRESULT,
1375    fn CreateFontFace(
1376        fontFaceType: DWRITE_FONT_FACE_TYPE,
1377        numberOfFiles: UINT32,
1378        fontFiles: *const *mut IDWriteFontFile,
1379        faceIndex: UINT32,
1380        fontFaceSimulationFlags: DWRITE_FONT_SIMULATIONS,
1381        fontFace: *mut *mut IDWriteFontFace,
1382    ) -> HRESULT,
1383    fn CreateRenderingParams(
1384        renderingParams: *mut *mut IDWriteRenderingParams,
1385    ) -> HRESULT,
1386    fn CreateMonitorRenderingParams(
1387        monitor: HMONITOR,
1388        renderingParams: *mut *mut IDWriteRenderingParams,
1389    ) -> HRESULT,
1390    fn CreateCustomRenderingParams(
1391        gamma: FLOAT,
1392        enhancedContrast: FLOAT,
1393        clearTypeLevel: FLOAT,
1394        pixelGeometry: DWRITE_PIXEL_GEOMETRY,
1395        renderingMode: DWRITE_RENDERING_MODE,
1396        renderingParams: *mut *mut IDWriteRenderingParams,
1397    ) -> HRESULT,
1398    fn RegisterFontFileLoader(
1399        fontFileLoader: *mut IDWriteFontFileLoader,
1400    ) -> HRESULT,
1401    fn UnregisterFontFileLoader(
1402        fontFileLoader: *mut IDWriteFontFileLoader,
1403    ) -> HRESULT,
1404    fn CreateTextFormat(
1405        fontFamilyName: *const WCHAR,
1406        fontCollection: *mut IDWriteFontCollection,
1407        fontWeight: DWRITE_FONT_WEIGHT,
1408        fontStyle: DWRITE_FONT_STYLE,
1409        fontStretch: DWRITE_FONT_STRETCH,
1410        fontSize: FLOAT,
1411        localeName: *const WCHAR,
1412        textFormat: *mut *mut IDWriteTextFormat,
1413    ) -> HRESULT,
1414    fn CreateTypography(
1415        typography: *mut *mut IDWriteTypography,
1416    ) -> HRESULT,
1417    fn GetGdiInterop(
1418        gdiInterop: *mut *mut IDWriteGdiInterop,
1419    ) -> HRESULT,
1420    fn CreateTextLayout(
1421        string: *const WCHAR,
1422        stringLength: UINT32,
1423        textFormat: *mut IDWriteTextFormat,
1424        maxWidth: FLOAT,
1425        maxHeight: FLOAT,
1426        textLayout: *mut *mut IDWriteTextLayout,
1427    ) -> HRESULT,
1428    fn CreateGdiCompatibleTextLayout(
1429        string: *const WCHAR,
1430        stringLength: UINT32,
1431        textFormat: *mut IDWriteTextFormat,
1432        layoutWidth: FLOAT,
1433        layoutHeight: FLOAT,
1434        pixelsPerDip: FLOAT,
1435        transform: *const DWRITE_MATRIX,
1436        useGdiNatrual: BOOL,
1437        textLayout: *mut *mut IDWriteTextLayout,
1438    ) -> HRESULT,
1439    fn CreateEllipsisTrimmingSign(
1440        textFormat: *mut IDWriteTextFormat,
1441        trimmingSign: *mut *mut IDWriteInlineObject,
1442    ) -> HRESULT,
1443    fn CreateTextAnalyzer(
1444        textAnalyzer: *mut *mut IDWriteTextAnalyzer,
1445    ) -> HRESULT,
1446    fn CreateNumberSubstitution(
1447        substitutionMethod: DWRITE_NUMBER_SUBSTITUTION_METHOD,
1448        localeName: *const WCHAR,
1449        ignoreUserOverride: BOOL,
1450        numberSubstitution: *mut *mut IDWriteNumberSubstitution,
1451    ) -> HRESULT,
1452    fn CreateGlyphRunAnalysis(
1453        glyphRun: *const DWRITE_GLYPH_RUN,
1454        pixelsPerDip: FLOAT,
1455        transform: *const DWRITE_MATRIX,
1456        renderingMode: DWRITE_RENDERING_MODE,
1457        measuringMode: DWRITE_MEASURING_MODE,
1458        baselineOriginX: FLOAT,
1459        baselineOriginY: FLOAT,
1460        glyphRunAnalysis: *mut *mut IDWriteGlyphRunAnalysis,
1461    ) -> HRESULT,
1462}}
1463pub const FACILITY_DWRITE: HRESULT = 0x898;
1464pub const DWRITE_ERR_BASE: HRESULT = 0x5000;
1465#[inline]
1466pub fn MAKE_DWRITE_HR(severity: HRESULT, code: HRESULT) -> HRESULT {
1467    MAKE_HRESULT!(severity, FACILITY_DWRITE, DWRITE_ERR_BASE + code)
1468}
1469#[inline]
1470pub fn MAKE_DWRITE_HR_ERR(code: HRESULT) -> HRESULT {
1471    MAKE_DWRITE_HR(SEVERITY_ERROR, code)
1472}
1473extern "system" {
1474    pub fn DWriteCreateFactory(
1475        factoryType: DWRITE_FACTORY_TYPE, iid: REFIID, factory: *mut *mut IUnknown,
1476    ) -> HRESULT;
1477}