Subversion Repositories Games.Chess Giants

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 pmbaty 1
//+--------------------------------------------------------------------------
2
//
3
//  Copyright (c) Microsoft Corporation.  All rights reserved.
4
//
5
//  Abstract:
6
//     DirectX Typography Services public API definitions.
7
//
8
//----------------------------------------------------------------------------
9
 
10
#ifndef DWRITE_H_INCLUDED
11
#define DWRITE_H_INCLUDED
12
 
13
#if _MSC_VER > 1000
14
#pragma once
15
#endif
16
 
17
#ifndef DWRITE_NO_WINDOWS_H
18
 
19
#include <specstrings.h>
20
#include <unknwn.h>
21
 
22
#endif // DWRITE_NO_WINDOWS_H
23
 
24
#include <dcommon.h>
25
 
26
#ifndef DWRITE_DECLARE_INTERFACE
27
#define DWRITE_DECLARE_INTERFACE(iid) DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE
28
#endif
29
 
30
#ifndef DWRITE_EXPORT
31
#define DWRITE_EXPORT __declspec(dllimport) WINAPI
32
#endif
33
 
34
/// <summary>
35
/// The type of a font represented by a single font file.
36
/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have
37
/// separate enum values for each of the file type.
38
/// </summary>
39
enum DWRITE_FONT_FILE_TYPE
40
{
41
    /// <summary>
42
    /// Font type is not recognized by the DirectWrite font system.
43
    /// </summary>
44
    DWRITE_FONT_FILE_TYPE_UNKNOWN,
45
 
46
    /// <summary>
47
    /// OpenType font with CFF outlines.
48
    /// </summary>
49
    DWRITE_FONT_FILE_TYPE_CFF,
50
 
51
    /// <summary>
52
    /// OpenType font with TrueType outlines.
53
    /// </summary>
54
    DWRITE_FONT_FILE_TYPE_TRUETYPE,
55
 
56
    /// <summary>
57
    /// OpenType font that contains a TrueType collection.
58
    /// </summary>
59
    DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION,
60
 
61
    /// <summary>
62
    /// Type 1 PFM font.
63
    /// </summary>
64
    DWRITE_FONT_FILE_TYPE_TYPE1_PFM,
65
 
66
    /// <summary>
67
    /// Type 1 PFB font.
68
    /// </summary>
69
    DWRITE_FONT_FILE_TYPE_TYPE1_PFB,
70
 
71
    /// <summary>
72
    /// Vector .FON font.
73
    /// </summary>
74
    DWRITE_FONT_FILE_TYPE_VECTOR,
75
 
76
    /// <summary>
77
    /// Bitmap .FON font.
78
    /// </summary>
79
    DWRITE_FONT_FILE_TYPE_BITMAP
80
};
81
 
82
/// <summary>
83
/// The file format of a complete font face.
84
/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have
85
/// a single enum entry.
86
/// </summary>
87
enum DWRITE_FONT_FACE_TYPE
88
{
89
    /// <summary>
90
    /// OpenType font face with CFF outlines.
91
    /// </summary>
92
    DWRITE_FONT_FACE_TYPE_CFF,
93
 
94
    /// <summary>
95
    /// OpenType font face with TrueType outlines.
96
    /// </summary>
97
    DWRITE_FONT_FACE_TYPE_TRUETYPE,
98
 
99
    /// <summary>
100
    /// OpenType font face that is a part of a TrueType collection.
101
    /// </summary>
102
    DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION,
103
 
104
    /// <summary>
105
    /// A Type 1 font face.
106
    /// </summary>
107
    DWRITE_FONT_FACE_TYPE_TYPE1,
108
 
109
    /// <summary>
110
    /// A vector .FON format font face.
111
    /// </summary>
112
    DWRITE_FONT_FACE_TYPE_VECTOR,
113
 
114
    /// <summary>
115
    /// A bitmap .FON format font face.
116
    /// </summary>
117
    DWRITE_FONT_FACE_TYPE_BITMAP,
118
 
119
    /// <summary>
120
    /// Font face type is not recognized by the DirectWrite font system.
121
    /// </summary>
122
    DWRITE_FONT_FACE_TYPE_UNKNOWN
123
};
124
 
125
/// <summary>
126
/// Specifies algorithmic style simulations to be applied to the font face.
127
/// Bold and oblique simulations can be combined via bitwise OR operation.
128
/// </summary>
129
enum DWRITE_FONT_SIMULATIONS
130
{
131
    /// <summary>
132
    /// No simulations are performed.
133
    /// </summary>
134
    DWRITE_FONT_SIMULATIONS_NONE    = 0x0000,
135
 
136
    /// <summary>
137
    /// Algorithmic emboldening is performed.
138
    /// </summary>
139
    DWRITE_FONT_SIMULATIONS_BOLD    = 0x0001,
140
 
141
    /// <summary>
142
    /// Algorithmic italicization is performed.
143
    /// </summary>
144
    DWRITE_FONT_SIMULATIONS_OBLIQUE = 0x0002
145
};
146
 
147
#ifdef DEFINE_ENUM_FLAG_OPERATORS
148
DEFINE_ENUM_FLAG_OPERATORS(DWRITE_FONT_SIMULATIONS);
149
#endif
150
 
151
/// <summary>
152
/// The font weight enumeration describes common values for degree of blackness or thickness of strokes of characters in a font.
153
/// Font weight values less than 1 or greater than 999 are considered to be invalid, and they are rejected by font API functions.
154
/// </summary>
155
enum DWRITE_FONT_WEIGHT
156
{
157
    /// <summary>
158
    /// Predefined font weight : Thin (100).
159
    /// </summary>
160
    DWRITE_FONT_WEIGHT_THIN = 100,
161
 
162
    /// <summary>
163
    /// Predefined font weight : Extra-light (200).
164
    /// </summary>
165
    DWRITE_FONT_WEIGHT_EXTRA_LIGHT = 200,
166
 
167
    /// <summary>
168
    /// Predefined font weight : Ultra-light (200).
169
    /// </summary>
170
    DWRITE_FONT_WEIGHT_ULTRA_LIGHT = 200,
171
 
172
    /// <summary>
173
    /// Predefined font weight : Light (300).
174
    /// </summary>
175
    DWRITE_FONT_WEIGHT_LIGHT = 300,
176
 
177
    /// <summary>
178
    /// Predefined font weight : Normal (400).
179
    /// </summary>
180
    DWRITE_FONT_WEIGHT_NORMAL = 400,
181
 
182
    /// <summary>
183
    /// Predefined font weight : Regular (400).
184
    /// </summary>
185
    DWRITE_FONT_WEIGHT_REGULAR = 400,
186
 
187
    /// <summary>
188
    /// Predefined font weight : Medium (500).
189
    /// </summary>
190
    DWRITE_FONT_WEIGHT_MEDIUM = 500,
191
 
192
    /// <summary>
193
    /// Predefined font weight : Demi-bold (600).
194
    /// </summary>
195
    DWRITE_FONT_WEIGHT_DEMI_BOLD = 600,
196
 
197
    /// <summary>
198
    /// Predefined font weight : Semi-bold (600).
199
    /// </summary>
200
    DWRITE_FONT_WEIGHT_SEMI_BOLD = 600,
201
 
202
    /// <summary>
203
    /// Predefined font weight : Bold (700).
204
    /// </summary>
205
    DWRITE_FONT_WEIGHT_BOLD = 700,
206
 
207
    /// <summary>
208
    /// Predefined font weight : Extra-bold (800).
209
    /// </summary>
210
    DWRITE_FONT_WEIGHT_EXTRA_BOLD = 800,
211
 
212
    /// <summary>
213
    /// Predefined font weight : Ultra-bold (800).
214
    /// </summary>
215
    DWRITE_FONT_WEIGHT_ULTRA_BOLD = 800,
216
 
217
    /// <summary>
218
    /// Predefined font weight : Black (900).
219
    /// </summary>
220
    DWRITE_FONT_WEIGHT_BLACK = 900,
221
 
222
    /// <summary>
223
    /// Predefined font weight : Heavy (900).
224
    /// </summary>
225
    DWRITE_FONT_WEIGHT_HEAVY = 900,
226
 
227
    /// <summary>
228
    /// Predefined font weight : Extra-black (950).
229
    /// </summary>
230
    DWRITE_FONT_WEIGHT_EXTRA_BLACK = 950,
231
 
232
    /// <summary>
233
    /// Predefined font weight : Ultra-black (950).
234
    /// </summary>
235
    DWRITE_FONT_WEIGHT_ULTRA_BLACK = 950
236
};
237
 
238
/// <summary>
239
/// The font stretch enumeration describes relative change from the normal aspect ratio
240
/// as specified by a font designer for the glyphs in a font.
241
/// Values less than 1 or greater than 9 are considered to be invalid, and they are rejected by font API functions.
242
/// </summary>
243
enum DWRITE_FONT_STRETCH
244
{
245
    /// <summary>
246
    /// Predefined font stretch : Not known (0).
247
    /// </summary>
248
    DWRITE_FONT_STRETCH_UNDEFINED = 0,
249
 
250
    /// <summary>
251
    /// Predefined font stretch : Ultra-condensed (1).
252
    /// </summary>
253
    DWRITE_FONT_STRETCH_ULTRA_CONDENSED = 1,
254
 
255
    /// <summary>
256
    /// Predefined font stretch : Extra-condensed (2).
257
    /// </summary>
258
    DWRITE_FONT_STRETCH_EXTRA_CONDENSED = 2,
259
 
260
    /// <summary>
261
    /// Predefined font stretch : Condensed (3).
262
    /// </summary>
263
    DWRITE_FONT_STRETCH_CONDENSED = 3,
264
 
265
    /// <summary>
266
    /// Predefined font stretch : Semi-condensed (4).
267
    /// </summary>
268
    DWRITE_FONT_STRETCH_SEMI_CONDENSED = 4,
269
 
270
    /// <summary>
271
    /// Predefined font stretch : Normal (5).
272
    /// </summary>
273
    DWRITE_FONT_STRETCH_NORMAL = 5,
274
 
275
    /// <summary>
276
    /// Predefined font stretch : Medium (5).
277
    /// </summary>
278
    DWRITE_FONT_STRETCH_MEDIUM = 5,
279
 
280
    /// <summary>
281
    /// Predefined font stretch : Semi-expanded (6).
282
    /// </summary>
283
    DWRITE_FONT_STRETCH_SEMI_EXPANDED = 6,
284
 
285
    /// <summary>
286
    /// Predefined font stretch : Expanded (7).
287
    /// </summary>
288
    DWRITE_FONT_STRETCH_EXPANDED = 7,
289
 
290
    /// <summary>
291
    /// Predefined font stretch : Extra-expanded (8).
292
    /// </summary>
293
    DWRITE_FONT_STRETCH_EXTRA_EXPANDED = 8,
294
 
295
    /// <summary>
296
    /// Predefined font stretch : Ultra-expanded (9).
297
    /// </summary>
298
    DWRITE_FONT_STRETCH_ULTRA_EXPANDED = 9
299
};
300
 
301
/// <summary>
302
/// The font style enumeration describes the slope style of a font face, such as Normal, Italic or Oblique.
303
/// Values other than the ones defined in the enumeration are considered to be invalid, and they are rejected by font API functions.
304
/// </summary>
305
enum DWRITE_FONT_STYLE
306
{
307
    /// <summary>
308
    /// Font slope style : Normal.
309
    /// </summary>
310
    DWRITE_FONT_STYLE_NORMAL,
311
 
312
    /// <summary>
313
    /// Font slope style : Oblique.
314
    /// </summary>
315
    DWRITE_FONT_STYLE_OBLIQUE,
316
 
317
    /// <summary>
318
    /// Font slope style : Italic.
319
    /// </summary>
320
    DWRITE_FONT_STYLE_ITALIC
321
 
322
};
323
 
324
/// <summary>
325
/// The informational string enumeration identifies a string in a font.
326
/// </summary>
327
enum DWRITE_INFORMATIONAL_STRING_ID
328
{
329
    /// <summary>
330
    /// Unspecified name ID.
331
    /// </summary>
332
    DWRITE_INFORMATIONAL_STRING_NONE,
333
 
334
    /// <summary>
335
    /// Copyright notice provided by the font.
336
    /// </summary>
337
    DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE,
338
 
339
    /// <summary>
340
    /// String containing a version number.
341
    /// </summary>
342
    DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS,
343
 
344
    /// <summary>
345
    /// Trademark information provided by the font.
346
    /// </summary>
347
    DWRITE_INFORMATIONAL_STRING_TRADEMARK,
348
 
349
    /// <summary>
350
    /// Name of the font manufacturer.
351
    /// </summary>
352
    DWRITE_INFORMATIONAL_STRING_MANUFACTURER,
353
 
354
    /// <summary>
355
    /// Name of the font designer.
356
    /// </summary>
357
    DWRITE_INFORMATIONAL_STRING_DESIGNER,
358
 
359
    /// <summary>
360
    /// URL of font designer (with protocol, e.g., http://, ftp://).
361
    /// </summary>
362
    DWRITE_INFORMATIONAL_STRING_DESIGNER_URL,
363
 
364
    /// <summary>
365
    /// Description of the font. Can contain revision information, usage recommendations, history, features, etc.
366
    /// </summary>
367
    DWRITE_INFORMATIONAL_STRING_DESCRIPTION,
368
 
369
    /// <summary>
370
    /// URL of font vendor (with protocol, e.g., http://, ftp://). If a unique serial number is embedded in the URL, it can be used to register the font.
371
    /// </summary>
372
    DWRITE_INFORMATIONAL_STRING_FONT_VENDOR_URL,
373
 
374
    /// <summary>
375
    /// Description of how the font may be legally used, or different example scenarios for licensed use. This field should be written in plain language, not legalese.
376
    /// </summary>
377
    DWRITE_INFORMATIONAL_STRING_LICENSE_DESCRIPTION,
378
 
379
    /// <summary>
380
    /// URL where additional licensing information can be found.
381
    /// </summary>
382
    DWRITE_INFORMATIONAL_STRING_LICENSE_INFO_URL,
383
 
384
    /// <summary>
385
    /// GDI-compatible family name. Because GDI allows a maximum of four fonts per family, fonts in the same family may have different GDI-compatible family names
386
    /// (e.g., "Arial", "Arial Narrow", "Arial Black").
387
    /// </summary>
388
    DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES,
389
 
390
    /// <summary>
391
    /// GDI-compatible subfamily name.
392
    /// </summary>
393
    DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES,
394
 
395
    /// <summary>
396
    /// Family name preferred by the designer. This enables font designers to group more than four fonts in a single family without losing compatibility with
397
    /// GDI. This name is typically only present if it differs from the GDI-compatible family name.
398
    /// </summary>
399
    DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES,
400
 
401
    /// <summary>
402
    /// Subfamily name preferred by the designer. This name is typically only present if it differs from the GDI-compatible subfamily name. 
403
    /// </summary>
404
    DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES,
405
 
406
    /// <summary>
407
    /// Sample text. This can be the font name or any other text that the designer thinks is the best example to display the font in.
408
    /// </summary>
409
    DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT
410
};
411
 
412
 
413
/// <summary>
414
/// The DWRITE_FONT_METRICS structure specifies the metrics of a font face that
415
/// are applicable to all glyphs within the font face.
416
/// </summary>
417
struct DWRITE_FONT_METRICS
418
{
419
    /// <summary>
420
    /// The number of font design units per em unit.
421
    /// Font files use their own coordinate system of font design units.
422
    /// A font design unit is the smallest measurable unit in the em square,
423
    /// an imaginary square that is used to size and align glyphs.
424
    /// The concept of em square is used as a reference scale factor when defining font size and device transformation semantics.
425
    /// The size of one em square is also commonly used to compute the paragraph identation value.
426
    /// </summary>
427
    UINT16 designUnitsPerEm;
428
 
429
    /// <summary>
430
    /// Ascent value of the font face in font design units.
431
    /// Ascent is the distance from the top of font character alignment box to English baseline.
432
    /// </summary>
433
    UINT16 ascent;
434
 
435
    /// <summary>
436
    /// Descent value of the font face in font design units.
437
    /// Descent is the distance from the bottom of font character alignment box to English baseline.
438
    /// </summary>
439
    UINT16 descent;
440
 
441
    /// <summary>
442
    /// Line gap in font design units.
443
    /// Recommended additional white space to add between lines to improve legibility. The recommended line spacing 
444
    /// (baseline-to-baseline distance) is thus the sum of ascent, descent, and lineGap. The line gap is usually 
445
    /// positive or zero but can be negative, in which case the recommended line spacing is less than the height
446
    /// of the character alignment box.
447
    /// </summary>
448
    INT16 lineGap;
449
 
450
    /// <summary>
451
    /// Cap height value of the font face in font design units.
452
    /// Cap height is the distance from English baseline to the top of a typical English capital.
453
    /// Capital "H" is often used as a reference character for the purpose of calculating the cap height value.
454
    /// </summary>
455
    UINT16 capHeight;
456
 
457
    /// <summary>
458
    /// x-height value of the font face in font design units.
459
    /// x-height is the distance from English baseline to the top of lowercase letter "x", or a similar lowercase character.
460
    /// </summary>
461
    UINT16 xHeight;
462
 
463
    /// <summary>
464
    /// The underline position value of the font face in font design units.
465
    /// Underline position is the position of underline relative to the English baseline.
466
    /// The value is usually made negative in order to place the underline below the baseline.
467
    /// </summary>
468
    INT16 underlinePosition;
469
 
470
    /// <summary>
471
    /// The suggested underline thickness value of the font face in font design units.
472
    /// </summary>
473
    UINT16 underlineThickness;
474
 
475
    /// <summary>
476
    /// The strikethrough position value of the font face in font design units.
477
    /// Strikethrough position is the position of strikethrough relative to the English baseline.
478
    /// The value is usually made positive in order to place the strikethrough above the baseline.
479
    /// </summary>
480
    INT16 strikethroughPosition;
481
 
482
    /// <summary>
483
    /// The suggested strikethrough thickness value of the font face in font design units.
484
    /// </summary>
485
    UINT16 strikethroughThickness;
486
};
487
 
488
/// <summary>
489
/// The DWRITE_GLYPH_METRICS structure specifies the metrics of an individual glyph.
490
/// The units depend on how the metrics are obtained.
491
/// </summary>
492
struct DWRITE_GLYPH_METRICS
493
{
494
    /// <summary>
495
    /// Specifies the X offset from the glyph origin to the left edge of the black box.
496
    /// The glyph origin is the current horizontal writing position.
497
    /// A negative value means the black box extends to the left of the origin (often true for lowercase italic 'f').
498
    /// </summary>
499
    INT32 leftSideBearing;
500
 
501
    /// <summary>
502
    /// Specifies the X offset from the origin of the current glyph to the origin of the next glyph when writing horizontally.
503
    /// </summary>
504
    UINT32 advanceWidth;
505
 
506
    /// <summary>
507
    /// Specifies the X offset from the right edge of the black box to the origin of the next glyph when writing horizontally.
508
    /// The value is negative when the right edge of the black box overhangs the layout box.
509
    /// </summary>
510
    INT32 rightSideBearing;
511
 
512
    /// <summary>
513
    /// Specifies the vertical offset from the vertical origin to the top of the black box.
514
    /// Thus, a positive value adds whitespace whereas a negative value means the glyph overhangs the top of the layout box.
515
    /// </summary>
516
    INT32 topSideBearing;
517
 
518
    /// <summary>
519
    /// Specifies the Y offset from the vertical origin of the current glyph to the vertical origin of the next glyph when writing vertically.
520
    /// (Note that the term "origin" by itself denotes the horizontal origin. The vertical origin is different.
521
    /// Its Y coordinate is specified by verticalOriginY value,
522
    /// and its X coordinate is half the advanceWidth to the right of the horizontal origin).
523
    /// </summary>
524
    UINT32 advanceHeight;
525
 
526
    /// <summary>
527
    /// Specifies the vertical distance from the black box's bottom edge to the advance height.
528
    /// Positive when the bottom edge of the black box is within the layout box.
529
    /// Negative when the bottom edge of black box overhangs the layout box.
530
    /// </summary>
531
    INT32 bottomSideBearing;
532
 
533
    /// <summary>
534
    /// Specifies the Y coordinate of a glyph's vertical origin, in the font's design coordinate system.
535
    /// The y coordinate of a glyph's vertical origin is the sum of the glyph's top side bearing
536
    /// and the top (i.e. yMax) of the glyph's bounding box.
537
    /// </summary>
538
    INT32 verticalOriginY;
539
};
540
 
541
/// <summary>
542
/// Optional adjustment to a glyph's position. An glyph offset changes the position of a glyph without affecting
543
/// the pen position. Offsets are in logical, pre-transform units.
544
/// </summary>
545
struct DWRITE_GLYPH_OFFSET
546
{
547
    /// <summary>
548
    /// Offset in the advance direction of the run. A positive advance offset moves the glyph to the right
549
    /// (in pre-transform coordinates) if the run is left-to-right or to the left if the run is right-to-left.
550
    /// </summary>
551
    FLOAT advanceOffset;
552
 
553
    /// <summary>
554
    /// Offset in the ascent direction, i.e., the direction ascenders point. A positive ascender offset moves
555
    /// the glyph up (in pre-transform coordinates).
556
    /// </summary>
557
    FLOAT ascenderOffset;
558
};
559
 
560
/// <summary>
561
/// Specifies the type of DirectWrite factory object.
562
/// DirectWrite factory contains internal state such as font loader registration and cached font data.
563
/// In most cases it is recommended to use the shared factory object, because it allows multiple components
564
/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.
565
/// However, there are cases when it is desirable to reduce the impact of a component,
566
/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it
567
/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed
568
/// component.
569
/// </summary>
570
enum DWRITE_FACTORY_TYPE
571
{
572
    /// <summary>
573
    /// Shared factory allow for re-use of cached font data across multiple in process components.
574
    /// Such factories also take advantage of cross process font caching components for better performance.
575
    /// </summary>
576
    DWRITE_FACTORY_TYPE_SHARED,
577
 
578
    /// <summary>
579
    /// Objects created from the isolated factory do not interact with internal DirectWrite state from other components.
580
    /// </summary>
581
    DWRITE_FACTORY_TYPE_ISOLATED
582
};
583
 
584
// Creates an OpenType tag as a 32bit integer such that
585
// the first character in the tag is the lowest byte,
586
// (least significant on little endian architectures)
587
// which can be used to compare with tags in the font file.
588
// This macro is compatible with DWRITE_FONT_FEATURE_TAG.
589
//
590
// Example: DWRITE_MAKE_OPENTYPE_TAG('c','c','m','p')
591
// Dword:   0x706D6363
592
//
593
#define DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d) ( \
594
    (static_cast<UINT32>(static_cast<UINT8>(d)) << 24) | \
595
    (static_cast<UINT32>(static_cast<UINT8>(c)) << 16) | \
596
    (static_cast<UINT32>(static_cast<UINT8>(b)) << 8)  | \
597
     static_cast<UINT32>(static_cast<UINT8>(a)))
598
 
599
interface IDWriteFontFileStream;
600
 
601
/// <summary>
602
/// Font file loader interface handles loading font file resources of a particular type from a key.
603
/// The font file loader interface is recommended to be implemented by a singleton object.
604
/// IMPORTANT: font file loader implementations must not register themselves with DirectWrite factory
605
/// inside their constructors and must not unregister themselves in their destructors, because
606
/// registration and unregistraton operations increment and decrement the object reference count respectively.
607
/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed
608
/// outside of the font file loader implementation as a separate step.
609
/// </summary>
610
interface DWRITE_DECLARE_INTERFACE("727cad4e-d6af-4c9e-8a08-d695b11caa49") IDWriteFontFileLoader : public IUnknown
611
{
612
    /// <summary>
613
    /// Creates a font file stream object that encapsulates an open file resource.
614
    /// The resource is closed when the last reference to fontFileStream is released.
615
    /// </summary>
616
    /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource
617
    /// within the scope of the font loader being used.</param>
618
    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
619
    /// <param name="fontFileStream">Pointer to the newly created font file stream.</param>
620
    /// <returns>
621
    /// Standard HRESULT error code.
622
    /// </returns>
623
    STDMETHOD(CreateStreamFromKey)(
624
        __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
625
        UINT32 fontFileReferenceKeySize,
626
        __out IDWriteFontFileStream** fontFileStream
627
        ) PURE;
628
};
629
 
630
/// <summary>
631
/// A built-in implementation of IDWriteFontFileLoader interface that operates on local font files
632
/// and exposes local font file information from the font file reference key.
633
/// Font file references created using CreateFontFileReference use this font file loader.
634
/// </summary>
635
interface DWRITE_DECLARE_INTERFACE("b2d9f3ec-c9fe-4a11-a2ec-d86208f7c0a2") IDWriteLocalFontFileLoader : public IDWriteFontFileLoader
636
{
637
    /// <summary>
638
    /// Obtains the length of the absolute file path from the font file reference key.
639
    /// </summary>
640
    /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
641
    /// within the scope of the font loader being used.</param>
642
    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
643
    /// <param name="filePathLength">Length of the file path string not including the terminated NULL character.</param>
644
    /// <returns>
645
    /// Standard HRESULT error code.
646
    /// </returns>
647
    STDMETHOD(GetFilePathLengthFromKey)(
648
        __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
649
        UINT32 fontFileReferenceKeySize,
650
        __out UINT32* filePathLength
651
        ) PURE;
652
 
653
    /// <summary>
654
    /// Obtains the absolute font file path from the font file reference key.
655
    /// </summary>
656
    /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
657
    /// within the scope of the font loader being used.</param>
658
    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
659
    /// <param name="filePath">Character array that receives the local file path.</param>
660
    /// <param name="filePathSize">Size of the filePath array in character count including the terminated NULL character.</param>
661
    /// <returns>
662
    /// Standard HRESULT error code.
663
    /// </returns>
664
    STDMETHOD(GetFilePathFromKey)(
665
        __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
666
        UINT32 fontFileReferenceKeySize,
667
        __out_ecount_z(filePathSize) WCHAR* filePath,
668
        UINT32 filePathSize
669
        ) PURE;
670
 
671
    /// <summary>
672
    /// Obtains the last write time of the file from the font file reference key.
673
    /// </summary>
674
    /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
675
    /// within the scope of the font loader being used.</param>
676
    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
677
    /// <param name="lastWriteTime">Last modified time of the font file.</param>
678
    /// <returns>
679
    /// Standard HRESULT error code.
680
    /// </returns>
681
    STDMETHOD(GetLastWriteTimeFromKey)(
682
        __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
683
        UINT32 fontFileReferenceKeySize,
684
        __out FILETIME* lastWriteTime
685
        ) PURE;
686
};
687
 
688
/// <summary>
689
/// The interface for loading font file data.
690
/// </summary>
691
interface DWRITE_DECLARE_INTERFACE("6d4865fe-0ab8-4d91-8f62-5dd6be34a3e0") IDWriteFontFileStream : public IUnknown
692
{
693
    /// <summary>
694
    /// Reads a fragment from a file.
695
    /// </summary>
696
    /// <param name="fragmentStart">Receives the pointer to the start of the font file fragment.</param>
697
    /// <param name="fileOffset">Offset of the fragment from the beginning of the font file.</param>
698
    /// <param name="fragmentSize">Size of the fragment in bytes.</param>
699
    /// <param name="fragmentContext">The client defined context to be passed to the ReleaseFileFragment.</param>
700
    /// <returns>
701
    /// Standard HRESULT error code.
702
    /// </returns>
703
    /// <remarks>
704
    /// IMPORTANT: ReadFileFragment() implementations must check whether the requested file fragment
705
    /// is within the file bounds. Otherwise, an error should be returned from ReadFileFragment.
706
    /// </remarks>
707
    STDMETHOD(ReadFileFragment)(
708
        __deref_out_bcount(fragmentSize) void const** fragmentStart,
709
        UINT64 fileOffset,
710
        UINT64 fragmentSize,
711
        __out void** fragmentContext
712
        ) PURE;
713
 
714
    /// <summary>
715
    /// Releases a fragment from a file.
716
    /// </summary>
717
    /// <param name="fragmentContext">The client defined context of a font fragment returned from ReadFileFragment.</param>
718
    STDMETHOD_(void, ReleaseFileFragment)(
719
        void* fragmentContext
720
        ) PURE;
721
 
722
    /// <summary>
723
    /// Obtains the total size of a file.
724
    /// </summary>
725
    /// <param name="fileSize">Receives the total size of the file.</param>
726
    /// <returns>
727
    /// Standard HRESULT error code.
728
    /// </returns>
729
    /// <remarks>
730
    /// Implementing GetFileSize() for asynchronously loaded font files may require
731
    /// downloading the complete file contents, therefore this method should only be used for operations that
732
    /// either require complete font file to be loaded (e.g., copying a font file) or need to make
733
    /// decisions based on the value of the file size (e.g., validation against a persisted file size).
734
    /// </remarks>
735
    STDMETHOD(GetFileSize)(
736
        __out UINT64* fileSize
737
        ) PURE;
738
 
739
    /// <summary>
740
    /// Obtains the last modified time of the file. The last modified time is used by DirectWrite font selection algorithms
741
    /// to determine whether one font resource is more up to date than another one.
742
    /// </summary>
743
    /// <param name="lastWriteTime">Receives the last modifed time of the file in the format that represents
744
    /// the number of 100-nanosecond intervals since January 1, 1601 (UTC).</param>
745
    /// <returns>
746
    /// Standard HRESULT error code. For resources that don't have a concept of the last modified time, the implementation of
747
    /// GetLastWriteTime should return E_NOTIMPL.
748
    /// </returns>
749
    STDMETHOD(GetLastWriteTime)(
750
        __out UINT64* lastWriteTime
751
        ) PURE;
752
};
753
 
754
/// <summary>
755
/// The interface that represents a reference to a font file.
756
/// </summary>
757
interface DWRITE_DECLARE_INTERFACE("739d886a-cef5-47dc-8769-1a8b41bebbb0") IDWriteFontFile : public IUnknown
758
{
759
    /// <summary>
760
    /// This method obtains the pointer to the reference key of a font file. The pointer is only valid until the object that refers to it is released.
761
    /// </summary>
762
    /// <param name="fontFileReferenceKey">Pointer to the font file reference key.
763
    /// IMPORTANT: The pointer value is valid until the font file reference object it is obtained from is released.</param>
764
    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
765
    /// <returns>
766
    /// Standard HRESULT error code.
767
    /// </returns>
768
    STDMETHOD(GetReferenceKey)(
769
        __deref_out_bcount(*fontFileReferenceKeySize) void const** fontFileReferenceKey,
770
        __out UINT32* fontFileReferenceKeySize
771
        ) PURE;
772
 
773
    /// <summary>
774
    /// Obtains the file loader associated with a font file object.
775
    /// </summary>
776
    /// <param name="fontFileLoader">The font file loader associated with the font file object.</param>
777
    /// <returns>
778
    /// Standard HRESULT error code.
779
    /// </returns>
780
    STDMETHOD(GetLoader)(
781
        __out IDWriteFontFileLoader** fontFileLoader
782
        ) PURE;
783
 
784
    /// <summary>
785
    /// Analyzes a file and returns whether it represents a font, and whether the font type is supported by the font system.
786
    /// </summary>
787
    /// <param name="isSupportedFontType">TRUE if the font type is supported by the font system, FALSE otherwise.</param>
788
    /// <param name="fontFileType">The type of the font file. Note that even if isSupportedFontType is FALSE,
789
    /// the fontFileType value may be different from DWRITE_FONT_FILE_TYPE_UNKNOWN.</param>
790
    /// <param name="fontFaceType">The type of the font face that can be constructed from the font file.
791
    /// Note that even if isSupportedFontType is FALSE, the fontFaceType value may be different from
792
    /// DWRITE_FONT_FACE_TYPE_UNKNOWN.</param>
793
    /// <param name="numberOfFaces">Number of font faces contained in the font file.</param>
794
    /// <returns>
795
    /// Standard HRESULT error code if there was a processing error during analysis.
796
    /// </returns>
797
    /// <remarks>
798
    /// IMPORTANT: certain font file types are recognized, but not supported by the font system.
799
    /// For example, the font system will recognize a file as a Type 1 font file,
800
    /// but will not be able to construct a font face object from it. In such situations, Analyze will set
801
    /// isSupportedFontType output parameter to FALSE.
802
    /// </remarks>
803
    STDMETHOD(Analyze)(
804
        __out BOOL* isSupportedFontType,
805
        __out DWRITE_FONT_FILE_TYPE* fontFileType,
806
        __out_opt DWRITE_FONT_FACE_TYPE* fontFaceType,
807
        __out UINT32* numberOfFaces
808
        ) PURE;
809
};
810
 
811
/// <summary>
812
/// Represents the internal structure of a device pixel (i.e., the physical arrangement of red,
813
/// green, and blue color components) that is assumed for purposes of rendering text.
814
/// </summary>
815
#ifndef DWRITE_PIXEL_GEOMETRY_DEFINED
816
enum DWRITE_PIXEL_GEOMETRY
817
{
818
    /// <summary>
819
    /// The red, green, and blue color components of each pixel are assumed to occupy the same point.
820
    /// </summary>
821
    DWRITE_PIXEL_GEOMETRY_FLAT,
822
 
823
    /// <summary>
824
    /// Each pixel comprises three vertical stripes, with red on the left, green in the center, and 
825
    /// blue on the right. This is the most common pixel geometry for LCD monitors.
826
    /// </summary>
827
    DWRITE_PIXEL_GEOMETRY_RGB,
828
 
829
    /// <summary>
830
    /// Each pixel comprises three vertical stripes, with blue on the left, green in the center, and 
831
    /// red on the right.
832
    /// </summary>
833
    DWRITE_PIXEL_GEOMETRY_BGR
834
};
835
#define DWRITE_PIXEL_GEOMETRY_DEFINED
836
#endif
837
 
838
/// <summary>
839
/// Represents a method of rendering glyphs.
840
/// </summary>
841
enum DWRITE_RENDERING_MODE
842
{
843
    /// <summary>
844
    /// Specifies that the rendering mode is determined automatically based on the font and size.
845
    /// </summary>
846
    DWRITE_RENDERING_MODE_DEFAULT,
847
 
848
    /// <summary>
849
    /// Specifies that no anti-aliasing is performed. Each pixel is either set to the foreground 
850
    /// color of the text or retains the color of the background.
851
    /// </summary>
852
    DWRITE_RENDERING_MODE_ALIASED,
853
 
854
    /// <summary>
855
    /// Specifies ClearType rendering with the same metrics as aliased text. Glyphs can only
856
    /// be positioned on whole-pixel boundaries.
857
    /// </summary>
858
    DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC,
859
 
860
    /// <summary>
861
    /// Specifies ClearType rendering with the same metrics as text rendering using GDI using a font
862
    /// created with CLEARTYPE_NATURAL_QUALITY. Glyph metrics are closer to their ideal values than 
863
    /// with aliased text, but glyphs are still positioned on whole-pixel boundaries.
864
    /// </summary>
865
    DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL,
866
 
867
    /// <summary>
868
    /// Specifies ClearType rendering with anti-aliasing in the horizontal dimension only. This is 
869
    /// typically used with small to medium font sizes (up to 16 ppem).
870
    /// </summary>
871
    DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL,
872
 
873
    /// <summary>
874
    /// Specifies ClearType rendering with anti-aliasing in both horizontal and vertical dimensions. 
875
    /// This is typically used at larger sizes to makes curves and diagonal lines look smoother, at 
876
    /// the expense of some softness.
877
    /// </summary>
878
    DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC,
879
 
880
    /// <summary>
881
    /// Specifies that rendering should bypass the rasterizer and use the outlines directly. This is 
882
    /// typically used at very large sizes.
883
    /// </summary>
884
    DWRITE_RENDERING_MODE_OUTLINE
885
};
886
 
887
/// <summary>
888
/// The DWRITE_MATRIX structure specifies the graphics transform to be applied
889
/// to rendered glyphs.
890
/// </summary>
891
struct DWRITE_MATRIX
892
{
893
    /// <summary>
894
    /// Horizontal scaling / cosine of rotation
895
    /// </summary>
896
    FLOAT m11;
897
 
898
    /// <summary>
899
    /// Vertical shear / sine of rotation
900
    /// </summary>
901
    FLOAT m12;
902
 
903
    /// <summary>
904
    /// Horizontal shear / negative sine of rotation
905
    /// </summary>
906
    FLOAT m21;
907
 
908
    /// <summary>
909
    /// Vertical scaling / cosine of rotation
910
    /// </summary>
911
    FLOAT m22;
912
 
913
    /// <summary>
914
    /// Horizontal shift (always orthogonal regardless of rotation)
915
    /// </summary>
916
    FLOAT dx;
917
 
918
    /// <summary>
919
    /// Vertical shift (always orthogonal regardless of rotation)
920
    /// </summary>
921
    FLOAT dy;
922
};
923
 
924
/// <summary>
925
/// The interface that represents text rendering settings for glyph rasterization and filtering.
926
/// </summary>
927
interface DWRITE_DECLARE_INTERFACE("2f0da53a-2add-47cd-82ee-d9ec34688e75") IDWriteRenderingParams : public IUnknown
928
{
929
    /// <summary>
930
    /// Gets the gamma value used for gamma correction. Valid values must be
931
    /// greater than zero and cannot exceed 256.
932
    /// </summary>
933
    STDMETHOD_(FLOAT, GetGamma)() PURE;
934
 
935
    /// <summary>
936
    /// Gets the amount of contrast enhancement. Valid values are greater than
937
    /// or equal to zero.
938
    /// </summary>
939
    STDMETHOD_(FLOAT, GetEnhancedContrast)() PURE;
940
 
941
    /// <summary>
942
    /// Gets the ClearType level. Valid values range from 0.0f (no ClearType) 
943
    /// to 1.0f (full ClearType).
944
    /// </summary>
945
    STDMETHOD_(FLOAT, GetClearTypeLevel)() PURE;
946
 
947
    /// <summary>
948
    /// Gets the pixel geometry.
949
    /// </summary>
950
    STDMETHOD_(DWRITE_PIXEL_GEOMETRY, GetPixelGeometry)() PURE;
951
 
952
    /// <summary>
953
    /// Gets the rendering mode.
954
    /// </summary>
955
    STDMETHOD_(DWRITE_RENDERING_MODE, GetRenderingMode)() PURE;
956
};
957
 
958
// Forward declarations of D2D types
959
interface ID2D1SimplifiedGeometrySink;
960
 
961
typedef ID2D1SimplifiedGeometrySink IDWriteGeometrySink;
962
 
963
/// <summary>
964
/// The interface that represents an absolute reference to a font face.
965
/// It contains font face type, appropriate file references and face identification data.
966
/// Various font data such as metrics, names and glyph outlines is obtained from IDWriteFontFace.
967
/// </summary>
968
interface DWRITE_DECLARE_INTERFACE("5f49804d-7024-4d43-bfa9-d25984f53849") IDWriteFontFace : public IUnknown
969
{
970
    /// <summary>
971
    /// Obtains the file format type of a font face.
972
    /// </summary>
973
    STDMETHOD_(DWRITE_FONT_FACE_TYPE, GetType)() PURE;
974
 
975
    /// <summary>
976
    /// Obtains the font files representing a font face.
977
    /// </summary>
978
    /// <param name="numberOfFiles">The number of files representing the font face.</param>
979
    /// <param name="fontFiles">User provided array that stores pointers to font files representing the font face.
980
    /// This parameter can be NULL if the user is only interested in the number of files representing the font face.
981
    /// This API increments reference count of the font file pointers returned according to COM conventions, and the client
982
    /// should release them when finished.</param>
983
    /// <returns>
984
    /// Standard HRESULT error code.
985
    /// </returns>
986
    STDMETHOD(GetFiles)(
987
        __inout UINT32* numberOfFiles,
988
        __out_ecount_opt(*numberOfFiles) IDWriteFontFile** fontFiles
989
        ) PURE;
990
 
991
    /// <summary>
992
    /// Obtains the zero-based index of the font face in its font file or files. If the font files contain a single face,
993
    /// the return value is zero.
994
    /// </summary>
995
    STDMETHOD_(UINT32, GetIndex)() PURE;
996
 
997
    /// <summary>
998
    /// Obtains the algorithmic style simulation flags of a font face.
999
    /// </summary>
1000
    STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;
1001
 
1002
    /// <summary>
1003
    /// Determines whether the font is a symbol font.
1004
    /// </summary>
1005
    STDMETHOD_(BOOL, IsSymbolFont)() PURE;
1006
 
1007
    /// <summary>
1008
    /// Obtains design units and common metrics for the font face.
1009
    /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.
1010
    /// </summary>
1011
    /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.
1012
    /// The metrics returned by this function are in font design units.</param>
1013
    STDMETHOD_(void, GetMetrics)(
1014
        __out DWRITE_FONT_METRICS* fontFaceMetrics
1015
        ) PURE;
1016
 
1017
    /// <summary>
1018
    /// Obtains the number of glyphs in the font face.
1019
    /// </summary>
1020
    STDMETHOD_(UINT16, GetGlyphCount)() PURE;
1021
 
1022
    /// <summary>
1023
    /// Obtains ideal glyph metrics in font design units. Design glyphs metrics are used for glyph positioning.
1024
    /// </summary>
1025
    /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>
1026
    /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>
1027
    /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.
1028
    /// The metrics returned by this function are in font design units.</param>
1029
    /// <param name="isSideways">Indicates whether the font is being used in a sideways run.
1030
    /// This can affect the glyph metrics if the font has oblique simulation
1031
    /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>
1032
    /// <returns>
1033
    /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range
1034
    /// for the current font face, E_INVALIDARG will be returned.
1035
    /// </returns>
1036
    STDMETHOD(GetDesignGlyphMetrics)(
1037
        __in_ecount(glyphCount) UINT16 const* glyphIndices,
1038
        UINT32 glyphCount,
1039
        __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,
1040
        BOOL isSideways = FALSE
1041
        ) PURE;
1042
 
1043
    /// <summary>
1044
    /// Returns the nominal mapping of UCS4 Unicode code points to glyph indices as defined by the font 'CMAP' table.
1045
    /// Note that this mapping is primarily provided for line layout engines built on top of the physical font API.
1046
    /// Because of OpenType glyph substitution and line layout character substitution, the nominal conversion does not always correspond
1047
    /// to how a Unicode string will map to glyph indices when rendering using a particular font face.
1048
    /// Also, note that Unicode Variant Selectors provide for alternate mappings for character to glyph.
1049
    /// This call will always return the default variant.
1050
    /// </summary>
1051
    /// <param name="codePoints">An array of USC4 code points to obtain nominal glyph indices from.</param>
1052
    /// <param name="codePointCount">The number of elements in the codePoints array.</param>
1053
    /// <param name="glyphIndices">Array of nominal glyph indices filled by this function.</param>
1054
    /// <returns>
1055
    /// Standard HRESULT error code.
1056
    /// </returns>
1057
    STDMETHOD(GetGlyphIndices)(
1058
        __in_ecount(codePointCount) UINT32 const* codePoints,
1059
        UINT32 codePointCount,
1060
        __out_ecount(codePointCount) UINT16* glyphIndices
1061
        ) PURE;
1062
 
1063
    /// <summary>
1064
    /// Finds the specified OpenType font table if it exists and returns a pointer to it.
1065
    /// The function accesses the underling font data via the IDWriteFontStream interface
1066
    /// implemented by the font file loader.
1067
    /// </summary>
1068
    /// <param name="openTypeTableTag">Four character tag of table to find.
1069
    ///     Use the DWRITE_MAKE_OPENTYPE_TAG() macro to create it.
1070
    ///     Unlike GDI, it does not support the special TTCF and null tags to access the whole font.</param>
1071
    /// <param name="tableData">
1072
    ///     Pointer to base of table in memory.
1073
    ///     The pointer is only valid so long as the FontFace used to get the font table still exists
1074
    ///     (not any other FontFace, even if it actually refers to the same physical font).
1075
    /// </param>
1076
    /// <param name="tableSize">Byte size of table.</param>
1077
    /// <param name="tableContext">
1078
    ///     Opaque context which must be freed by calling ReleaseFontTable.
1079
    ///     The context actually comes from the lower level IDWriteFontFileStream,
1080
    ///     which may be implemented by the application or DWrite itself.
1081
    ///     It is possible for a NULL tableContext to be returned, especially if
1082
    ///     the implementation directly memory maps the whole file.
1083
    ///     Nevertheless, always release it later, and do not use it as a test for function success.
1084
    ///     The same table can be queried multiple times,
1085
    ///     but each returned context can be different, so release each separately.
1086
    /// </param>
1087
    /// <param name="exists">True if table exists.</param>
1088
    /// <returns>
1089
    /// Standard HRESULT error code.
1090
    /// If a table can not be found, the function will not return an error, but the size will be 0, table NULL, and exists = FALSE.
1091
    /// The context does not need to be freed if the table was not found.
1092
    /// </returns>
1093
    /// <remarks>
1094
    /// The context for the same tag may be different for each call,
1095
    /// so each one must be held and released separately.
1096
    /// </remarks>
1097
    STDMETHOD(TryGetFontTable)(
1098
        __in UINT32 openTypeTableTag,
1099
        __deref_out_bcount(*tableSize) const void** tableData,
1100
        __out UINT32* tableSize,
1101
        __out void** tableContext,
1102
        __out BOOL* exists
1103
        ) PURE;
1104
 
1105
    /// <summary>
1106
    /// Releases the table obtained earlier from TryGetFontTable.
1107
    /// </summary>
1108
    /// <param name="tableContext">Opaque context from TryGetFontTable.</param>
1109
    /// <returns>
1110
    /// Standard HRESULT error code.
1111
    /// </returns>
1112
    STDMETHOD_(void, ReleaseFontTable)(
1113
        __in void* tableContext
1114
        ) PURE;
1115
 
1116
    /// <summary>
1117
    /// Computes the outline of a run of glyphs by calling back to the outline sink interface.
1118
    /// </summary>
1119
    /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
1120
    /// <param name="glyphIndices">Array of glyph indices.</param>
1121
    /// <param name="glyphAdvances">Optional array of glyph advances in DIPs.</param>
1122
    /// <param name="glyphOffsets">Optional array of glyph offsets.</param>
1123
    /// <param name="glyphCount">Number of glyphs.</param>
1124
    /// <param name="isSideways">If true, specifies that glyphs are rotated 90 degrees to the left and vertical metrics are used.
1125
    /// A client can render a vertical run by specifying isSideways = true and rotating the resulting geometry 90 degrees to the
1126
    /// right using a transform. The isSideways and isRightToLeft parameters cannot both be true.</param>
1127
    /// <param name="isRightToLeft">If true, specifies that the advance direction is right to left. By default, the advance direction
1128
    /// is left to right.</param>
1129
    /// <param name="geometrySink">Interface the function calls back to draw each element of the geometry.</param>
1130
    /// <returns>
1131
    /// Standard HRESULT error code.
1132
    /// </returns>
1133
    STDMETHOD(GetGlyphRunOutline)(
1134
        FLOAT emSize,
1135
        __in_ecount(glyphCount) UINT16 const* glyphIndices,
1136
        __in_ecount_opt(glyphCount) FLOAT const* glyphAdvances,
1137
        __in_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets,
1138
        UINT32 glyphCount,
1139
        BOOL isSideways,
1140
        BOOL isRightToLeft,
1141
        IDWriteGeometrySink* geometrySink
1142
        ) PURE;
1143
 
1144
    /// <summary>
1145
    /// Determines the recommended rendering mode for the font given the specified size and rendering parameters.
1146
    /// </summary>
1147
    /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
1148
    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 
1149
    /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
1150
    /// <param name="measuringMode">Specifies measuring method that will be used for glyphs in the font.
1151
    /// Renderer implementations may choose different rendering modes for given measuring methods, but
1152
    /// best results are seen when the corresponding modes match:
1153
    /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL
1154
    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC
1155
    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL
1156
    /// </param>
1157
    /// <param name="renderingParams">Rendering parameters object. This parameter is necessary in case the rendering parameters 
1158
    /// object overrides the rendering mode.</param>
1159
    /// <param name="renderingMode">Receives the recommended rendering mode to use.</param>
1160
    /// <returns>
1161
    /// Standard HRESULT error code.
1162
    /// </returns>
1163
    STDMETHOD(GetRecommendedRenderingMode)(
1164
        FLOAT emSize,
1165
        FLOAT pixelsPerDip,
1166
        DWRITE_MEASURING_MODE measuringMode,
1167
        IDWriteRenderingParams* renderingParams,
1168
        __out DWRITE_RENDERING_MODE* renderingMode
1169
        ) PURE;
1170
 
1171
    /// <summary>
1172
    /// Obtains design units and common metrics for the font face.
1173
    /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.
1174
    /// </summary>
1175
    /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
1176
    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 
1177
    /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
1178
    /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
1179
    /// scaling specified by the font size and pixelsPerDip.</param>
1180
    /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.
1181
    /// The metrics returned by this function are in font design units.</param>
1182
    STDMETHOD(GetGdiCompatibleMetrics)(
1183
        FLOAT emSize,
1184
        FLOAT pixelsPerDip,
1185
        __in_opt DWRITE_MATRIX const* transform,
1186
        __out DWRITE_FONT_METRICS* fontFaceMetrics
1187
        ) PURE;
1188
 
1189
 
1190
    /// <summary>
1191
    /// Obtains glyph metrics in font design units with the return values compatible with what GDI would produce.
1192
    /// Glyphs metrics are used for positioning of individual glyphs.
1193
    /// </summary>
1194
    /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
1195
    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 
1196
    /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
1197
    /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
1198
    /// scaling specified by the font size and pixelsPerDip.</param>
1199
    /// <param name="useGdiNatural">
1200
    /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.
1201
    /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font
1202
    /// created with CLEARTYPE_NATURAL_QUALITY.
1203
    /// </param>
1204
    /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>
1205
    /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>
1206
    /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.
1207
    /// The metrics returned by this function are in font design units.</param>
1208
    /// <param name="isSideways">Indicates whether the font is being used in a sideways run.
1209
    /// This can affect the glyph metrics if the font has oblique simulation
1210
    /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>
1211
    /// <returns>
1212
    /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range
1213
    /// for the current font face, E_INVALIDARG will be returned.
1214
    /// </returns>
1215
    STDMETHOD(GetGdiCompatibleGlyphMetrics)(
1216
        FLOAT emSize,
1217
        FLOAT pixelsPerDip,
1218
        __in_opt DWRITE_MATRIX const* transform,
1219
        BOOL useGdiNatural,
1220
        __in_ecount(glyphCount) UINT16 const* glyphIndices,
1221
        UINT32 glyphCount,
1222
        __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,
1223
        BOOL isSideways = FALSE
1224
        ) PURE;
1225
};
1226
 
1227
interface IDWriteFactory;
1228
interface IDWriteFontFileEnumerator;
1229
 
1230
/// <summary>
1231
/// The font collection loader interface is used to construct a collection of fonts given a particular type of key.
1232
/// The font collection loader interface is recommended to be implemented by a singleton object.
1233
/// IMPORTANT: font collection loader implementations must not register themselves with a DirectWrite factory
1234
/// inside their constructors and must not unregister themselves in their destructors, because
1235
/// registration and unregistraton operations increment and decrement the object reference count respectively.
1236
/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed
1237
/// outside of the font file loader implementation as a separate step.
1238
/// </summary>
1239
interface DWRITE_DECLARE_INTERFACE("cca920e4-52f0-492b-bfa8-29c72ee0a468") IDWriteFontCollectionLoader : public IUnknown
1240
{
1241
    /// <summary>
1242
    /// Creates a font file enumerator object that encapsulates a collection of font files.
1243
    /// The font system calls back to this interface to create a font collection.
1244
    /// </summary>
1245
    /// <param name="factory">Factory associated with the loader.</param>
1246
    /// <param name="collectionKey">Font collection key that uniquely identifies the collection of font files within
1247
    /// the scope of the font collection loader being used.</param>
1248
    /// <param name="collectionKeySize">Size of the font collection key in bytes.</param>
1249
    /// <param name="fontFileEnumerator">Pointer to the newly created font file enumerator.</param>
1250
    /// <returns>
1251
    /// Standard HRESULT error code.
1252
    /// </returns>
1253
    STDMETHOD(CreateEnumeratorFromKey)(
1254
        IDWriteFactory* factory,
1255
        __in_bcount(collectionKeySize) void const* collectionKey,
1256
        UINT32 collectionKeySize,
1257
        __out IDWriteFontFileEnumerator** fontFileEnumerator
1258
        ) PURE;
1259
};
1260
 
1261
/// <summary>
1262
/// The font file enumerator interface encapsulates a collection of font files. The font system uses this interface
1263
/// to enumerate font files when building a font collection.
1264
/// </summary>
1265
interface DWRITE_DECLARE_INTERFACE("72755049-5ff7-435d-8348-4be97cfa6c7c") IDWriteFontFileEnumerator : public IUnknown
1266
{
1267
    /// <summary>
1268
    /// Advances to the next font file in the collection. When it is first created, the enumerator is positioned
1269
    /// before the first element of the collection and the first call to MoveNext advances to the first file.
1270
    /// </summary>
1271
    /// <param name="hasCurrentFile">Receives the value TRUE if the enumerator advances to a file, or FALSE if
1272
    /// the enumerator advanced past the last file in the collection.</param>
1273
    /// <returns>
1274
    /// Standard HRESULT error code.
1275
    /// </returns>
1276
    STDMETHOD(MoveNext)(
1277
        __out BOOL* hasCurrentFile
1278
        ) PURE;
1279
 
1280
    /// <summary>
1281
    /// Gets a reference to the current font file.
1282
    /// </summary>
1283
    /// <param name="fontFile">Pointer to the newly created font file object.</param>
1284
    /// <returns>
1285
    /// Standard HRESULT error code.
1286
    /// </returns>
1287
    STDMETHOD(GetCurrentFontFile)(
1288
        __out IDWriteFontFile** fontFile
1289
        ) PURE;
1290
};
1291
 
1292
/// <summary>
1293
/// Represents a collection of strings indexed by locale name.
1294
/// </summary>
1295
interface DWRITE_DECLARE_INTERFACE("08256209-099a-4b34-b86d-c22b110e7771") IDWriteLocalizedStrings : public IUnknown
1296
{
1297
    /// <summary>
1298
    /// Gets the number of language/string pairs.
1299
    /// </summary>
1300
    STDMETHOD_(UINT32, GetCount)() PURE;
1301
 
1302
    /// <summary>
1303
    /// Gets the index of the item with the specified locale name.
1304
    /// </summary>
1305
    /// <param name="localeName">Locale name to look for.</param>
1306
    /// <param name="index">Receives the zero-based index of the locale name/string pair.</param>
1307
    /// <param name="exists">Receives TRUE if the locale name exists or FALSE if not.</param>
1308
    /// <returns>
1309
    /// Standard HRESULT error code. If the specified locale name does not exist, the return value is S_OK, 
1310
    /// but *index is UINT_MAX and *exists is FALSE.
1311
    /// </returns>
1312
    STDMETHOD(FindLocaleName)(
1313
        __in_z WCHAR const* localeName,
1314
        __out UINT32* index,
1315
        __out BOOL* exists
1316
        ) PURE;
1317
 
1318
    /// <summary>
1319
    /// Gets the length in characters (not including the null terminator) of the locale name with the specified index.
1320
    /// </summary>
1321
    /// <param name="index">Zero-based index of the locale name.</param>
1322
    /// <param name="length">Receives the length in characters, not including the null terminator.</param>
1323
    /// <returns>
1324
    /// Standard HRESULT error code.
1325
    /// </returns>
1326
    STDMETHOD(GetLocaleNameLength)(
1327
        UINT32 index,
1328
        __out UINT32* length
1329
        ) PURE;
1330
 
1331
    /// <summary>
1332
    /// Copies the locale name with the specified index to the specified array.
1333
    /// </summary>
1334
    /// <param name="index">Zero-based index of the locale name.</param>
1335
    /// <param name="localeName">Character array that receives the locale name.</param>
1336
    /// <param name="size">Size of the array in characters. The size must include space for the terminating
1337
    /// null character.</param>
1338
    /// <returns>
1339
    /// Standard HRESULT error code.
1340
    /// </returns>
1341
    STDMETHOD(GetLocaleName)(
1342
        UINT32 index,
1343
        __out_ecount_z(size) WCHAR* localeName,
1344
        UINT32 size
1345
        ) PURE;
1346
 
1347
    /// <summary>
1348
    /// Gets the length in characters (not including the null terminator) of the string with the specified index.
1349
    /// </summary>
1350
    /// <param name="index">Zero-based index of the string.</param>
1351
    /// <param name="length">Receives the length in characters, not including the null terminator.</param>
1352
    /// <returns>
1353
    /// Standard HRESULT error code.
1354
    /// </returns>
1355
    STDMETHOD(GetStringLength)(
1356
        UINT32 index,
1357
        __out UINT32* length
1358
        ) PURE;
1359
 
1360
    /// <summary>
1361
    /// Copies the string with the specified index to the specified array.
1362
    /// </summary>
1363
    /// <param name="index">Zero-based index of the string.</param>
1364
    /// <param name="stringBuffer">Character array that receives the string.</param>
1365
    /// <param name="size">Size of the array in characters. The size must include space for the terminating
1366
    /// null character.</param>
1367
    /// <returns>
1368
    /// Standard HRESULT error code.
1369
    /// </returns>
1370
    STDMETHOD(GetString)(
1371
        UINT32 index,
1372
        __out_ecount_z(size) WCHAR* stringBuffer,
1373
        UINT32 size
1374
        ) PURE;
1375
};
1376
 
1377
interface IDWriteFontFamily;
1378
interface IDWriteFont;
1379
 
1380
/// <summary>
1381
/// The IDWriteFontCollection encapsulates a collection of fonts.
1382
/// </summary>
1383
interface DWRITE_DECLARE_INTERFACE("a84cee02-3eea-4eee-a827-87c1a02a0fcc") IDWriteFontCollection : public IUnknown
1384
{
1385
    /// <summary>
1386
    /// Gets the number of font families in the collection.
1387
    /// </summary>
1388
    STDMETHOD_(UINT32, GetFontFamilyCount)() PURE;
1389
 
1390
    /// <summary>
1391
    /// Creates a font family object given a zero-based font family index.
1392
    /// </summary>
1393
    /// <param name="index">Zero-based index of the font family.</param>
1394
    /// <param name="fontFamily">Receives a pointer the newly created font family object.</param>
1395
    /// <returns>
1396
    /// Standard HRESULT error code.
1397
    /// </returns>
1398
    STDMETHOD(GetFontFamily)(
1399
        UINT32 index,
1400
        __out IDWriteFontFamily** fontFamily
1401
        ) PURE;
1402
 
1403
    /// <summary>
1404
    /// Finds the font family with the specified family name.
1405
    /// </summary>
1406
    /// <param name="familyName">Name of the font family. The name is not case-sensitive but must otherwise exactly match a family name in the collection.</param>
1407
    /// <param name="index">Receives the zero-based index of the matching font family if the family name was found or UINT_MAX otherwise.</param>
1408
    /// <param name="exists">Receives TRUE if the family name exists or FALSE otherwise.</param>
1409
    /// <returns>
1410
    /// Standard HRESULT error code. If the specified family name does not exist, the return value is S_OK, but *index is UINT_MAX and *exists is FALSE.
1411
    /// </returns>
1412
    STDMETHOD(FindFamilyName)(
1413
        __in_z WCHAR const* familyName,
1414
        __out UINT32* index,
1415
        __out BOOL* exists
1416
        ) PURE;
1417
 
1418
    /// <summary>
1419
    /// Gets the font object that corresponds to the same physical font as the specified font face object. The specified physical font must belong 
1420
    /// to the font collection.
1421
    /// </summary>
1422
    /// <param name="fontFace">Font face object that specifies the physical font.</param>
1423
    /// <param name="font">Receives a pointer to the newly created font object if successful or NULL otherwise.</param>
1424
    /// <returns>
1425
    /// Standard HRESULT error code. If the specified physical font is not part of the font collection the return value is DWRITE_E_NOFONT.
1426
    /// </returns>
1427
    STDMETHOD(GetFontFromFontFace)(
1428
        IDWriteFontFace* fontFace,
1429
        __out IDWriteFont** font
1430
        ) PURE;
1431
};
1432
 
1433
/// <summary>
1434
/// The IDWriteFontList interface represents a list of fonts.
1435
/// </summary>
1436
interface DWRITE_DECLARE_INTERFACE("1a0d8438-1d97-4ec1-aef9-a2fb86ed6acb") IDWriteFontList : public IUnknown
1437
{
1438
    /// <summary>
1439
    /// Gets the font collection that contains the fonts.
1440
    /// </summary>
1441
    /// <param name="fontCollection">Receives a pointer to the font collection object.</param>
1442
    /// <returns>
1443
    /// Standard HRESULT error code.
1444
    /// </returns>
1445
    STDMETHOD(GetFontCollection)(
1446
        __out IDWriteFontCollection** fontCollection
1447
        ) PURE;
1448
 
1449
    /// <summary>
1450
    /// Gets the number of fonts in the font list.
1451
    /// </summary>
1452
    STDMETHOD_(UINT32, GetFontCount)() PURE;
1453
 
1454
    /// <summary>
1455
    /// Gets a font given its zero-based index.
1456
    /// </summary>
1457
    /// <param name="index">Zero-based index of the font in the font list.</param>
1458
    /// <param name="font">Receives a pointer to the newly created font object.</param>
1459
    /// <returns>
1460
    /// Standard HRESULT error code.
1461
    /// </returns>
1462
    STDMETHOD(GetFont)(
1463
        UINT32 index,
1464
        __out IDWriteFont** font
1465
        ) PURE;
1466
};
1467
 
1468
/// <summary>
1469
/// The IDWriteFontFamily interface represents a set of fonts that share the same design but are differentiated
1470
/// by weight, stretch, and style.
1471
/// </summary>
1472
interface DWRITE_DECLARE_INTERFACE("da20d8ef-812a-4c43-9802-62ec4abd7add") IDWriteFontFamily : public IDWriteFontList
1473
{
1474
    /// <summary>
1475
    /// Creates an localized strings object that contains the family names for the font family, indexed by locale name.
1476
    /// </summary>
1477
    /// <param name="names">Receives a pointer to the newly created localized strings object.</param>
1478
    /// <returns>
1479
    /// Standard HRESULT error code.
1480
    /// </returns>
1481
    STDMETHOD(GetFamilyNames)(
1482
        __out IDWriteLocalizedStrings** names
1483
        ) PURE;
1484
 
1485
    /// <summary>
1486
    /// Gets the font that best matches the specified properties.
1487
    /// </summary>
1488
    /// <param name="weight">Requested font weight.</param>
1489
    /// <param name="stretch">Requested font stretch.</param>
1490
    /// <param name="style">Requested font style.</param>
1491
    /// <param name="matchingFont">Receives a pointer to the newly created font object.</param>
1492
    /// <returns>
1493
    /// Standard HRESULT error code.
1494
    /// </returns>
1495
    STDMETHOD(GetFirstMatchingFont)(
1496
        DWRITE_FONT_WEIGHT  weight,
1497
        DWRITE_FONT_STRETCH stretch,
1498
        DWRITE_FONT_STYLE   style,
1499
        __out IDWriteFont** matchingFont
1500
        ) PURE;
1501
 
1502
    /// <summary>
1503
    /// Gets a list of fonts in the font family ranked in order of how well they match the specified properties.
1504
    /// </summary>
1505
    /// <param name="weight">Requested font weight.</param>
1506
    /// <param name="stretch">Requested font stretch.</param>
1507
    /// <param name="style">Requested font style.</param>
1508
    /// <param name="matchingFonts">Receives a pointer to the newly created font list object.</param>
1509
    /// <returns>
1510
    /// Standard HRESULT error code.
1511
    /// </returns>
1512
    STDMETHOD(GetMatchingFonts)(
1513
        DWRITE_FONT_WEIGHT      weight,
1514
        DWRITE_FONT_STRETCH     stretch,
1515
        DWRITE_FONT_STYLE       style,
1516
        __out IDWriteFontList** matchingFonts
1517
        ) PURE;
1518
};
1519
 
1520
/// <summary>
1521
/// The IDWriteFont interface represents a physical font in a font collection.
1522
/// </summary>
1523
interface DWRITE_DECLARE_INTERFACE("acd16696-8c14-4f5d-877e-fe3fc1d32737") IDWriteFont : public IUnknown
1524
{
1525
    /// <summary>
1526
    /// Gets the font family to which the specified font belongs.
1527
    /// </summary>
1528
    /// <param name="fontFamily">Receives a pointer to the font family object.</param>
1529
    /// <returns>
1530
    /// Standard HRESULT error code.
1531
    /// </returns>
1532
    STDMETHOD(GetFontFamily)(
1533
        __out IDWriteFontFamily** fontFamily
1534
        ) PURE;
1535
 
1536
    /// <summary>
1537
    /// Gets the weight of the specified font.
1538
    /// </summary>
1539
    STDMETHOD_(DWRITE_FONT_WEIGHT, GetWeight)() PURE;
1540
 
1541
    /// <summary>
1542
    /// Gets the stretch (aka. width) of the specified font.
1543
    /// </summary>
1544
    STDMETHOD_(DWRITE_FONT_STRETCH, GetStretch)() PURE;
1545
 
1546
    /// <summary>
1547
    /// Gets the style (aka. slope) of the specified font.
1548
    /// </summary>
1549
    STDMETHOD_(DWRITE_FONT_STYLE, GetStyle)() PURE;
1550
 
1551
    /// <summary>
1552
    /// Returns TRUE if the font is a symbol font or FALSE if not.
1553
    /// </summary>
1554
    STDMETHOD_(BOOL, IsSymbolFont)() PURE;
1555
 
1556
    /// <summary>
1557
    /// Gets a localized strings collection containing the face names for the font (e.g., Regular or Bold), indexed by locale name.
1558
    /// </summary>
1559
    /// <param name="names">Receives a pointer to the newly created localized strings object.</param>
1560
    /// <returns>
1561
    /// Standard HRESULT error code.
1562
    /// </returns>
1563
    STDMETHOD(GetFaceNames)(
1564
        __out IDWriteLocalizedStrings** names
1565
        ) PURE;
1566
 
1567
    /// <summary>
1568
    /// Gets a localized strings collection containing the specified informational strings, indexed by locale name.
1569
    /// </summary>
1570
    /// <param name="informationalStringID">Identifies the string to get.</param>
1571
    /// <param name="informationalStrings">Receives a pointer to the newly created localized strings object.</param>
1572
    /// <param name="exists">Receives the value TRUE if the font contains the specified string ID or FALSE if not.</param>
1573
    /// <returns>
1574
    /// Standard HRESULT error code. If the font does not contain the specified string, the return value is S_OK but 
1575
    /// informationalStrings receives a NULL pointer and exists receives the value FALSE.
1576
    /// </returns>
1577
    STDMETHOD(GetInformationalStrings)(
1578
        DWRITE_INFORMATIONAL_STRING_ID informationalStringID,
1579
        __out IDWriteLocalizedStrings** informationalStrings,
1580
        __out BOOL* exists
1581
        ) PURE;
1582
 
1583
    /// <summary>
1584
    /// Gets a value that indicates what simulation are applied to the specified font.
1585
    /// </summary>
1586
    STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;
1587
 
1588
    /// <summary>
1589
    /// Gets the metrics for the font.
1590
    /// </summary>
1591
    /// <param name="fontMetrics">Receives the font metrics.</param>
1592
    STDMETHOD_(void, GetMetrics)(
1593
        __out DWRITE_FONT_METRICS* fontMetrics
1594
        ) PURE;
1595
 
1596
    /// <summary>
1597
    /// Determines whether the font supports the specified character.
1598
    /// </summary>
1599
    /// <param name="unicodeValue">Unicode (UCS-4) character value.</param>
1600
    /// <param name="exists">Receives the value TRUE if the font supports the specified character or FALSE if not.</param>
1601
    /// <returns>
1602
    /// Standard HRESULT error code.
1603
    /// </returns>
1604
    STDMETHOD(HasCharacter)(
1605
        UINT32 unicodeValue,
1606
        __out BOOL* exists
1607
        ) PURE;
1608
 
1609
    /// <summary>
1610
    /// Creates a font face object for the font.
1611
    /// </summary>
1612
    /// <param name="fontFace">Receives a pointer to the newly created font face object.</param>
1613
    /// <returns>
1614
    /// Standard HRESULT error code.
1615
    /// </returns>
1616
    STDMETHOD(CreateFontFace)(
1617
        __out IDWriteFontFace** fontFace
1618
        ) PURE;
1619
};
1620
 
1621
/// <summary>
1622
/// Direction for how reading progresses.
1623
/// </summary>
1624
enum DWRITE_READING_DIRECTION
1625
{
1626
    /// <summary>
1627
    /// Reading progresses from left to right.
1628
    /// </summary>
1629
    DWRITE_READING_DIRECTION_LEFT_TO_RIGHT,
1630
 
1631
    /// <summary>
1632
    /// Reading progresses from right to left.
1633
    /// </summary>
1634
    DWRITE_READING_DIRECTION_RIGHT_TO_LEFT
1635
};
1636
 
1637
/// <summary>
1638
/// Direction for how lines of text are placed relative to one another.
1639
/// </summary>
1640
enum DWRITE_FLOW_DIRECTION
1641
{
1642
    /// <summary>
1643
    /// Text lines are placed from top to bottom.
1644
    /// </summary>
1645
    DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM
1646
};
1647
 
1648
/// <summary>
1649
/// Alignment of paragraph text along the reading direction axis relative to 
1650
/// the leading and trailing edge of the layout box.
1651
/// </summary>
1652
enum DWRITE_TEXT_ALIGNMENT
1653
{
1654
    /// <summary>
1655
    /// The leading edge of the paragraph text is aligned to the layout box's leading edge.
1656
    /// </summary>
1657
    DWRITE_TEXT_ALIGNMENT_LEADING,
1658
 
1659
    /// <summary>
1660
    /// The trailing edge of the paragraph text is aligned to the layout box's trailing edge.
1661
    /// </summary>
1662
    DWRITE_TEXT_ALIGNMENT_TRAILING,
1663
 
1664
    /// <summary>
1665
    /// The center of the paragraph text is aligned to the center of the layout box.
1666
    /// </summary>
1667
    DWRITE_TEXT_ALIGNMENT_CENTER
1668
};
1669
 
1670
/// <summary>
1671
/// Alignment of paragraph text along the flow direction axis relative to the
1672
/// flow's beginning and ending edge of the layout box.
1673
/// </summary>
1674
enum DWRITE_PARAGRAPH_ALIGNMENT
1675
{
1676
    /// <summary>
1677
    /// The first line of paragraph is aligned to the flow's beginning edge of the layout box.
1678
    /// </summary>
1679
    DWRITE_PARAGRAPH_ALIGNMENT_NEAR,
1680
 
1681
    /// <summary>
1682
    /// The last line of paragraph is aligned to the flow's ending edge of the layout box.
1683
    /// </summary>
1684
    DWRITE_PARAGRAPH_ALIGNMENT_FAR,
1685
 
1686
    /// <summary>
1687
    /// The center of the paragraph is aligned to the center of the flow of the layout box.
1688
    /// </summary>
1689
    DWRITE_PARAGRAPH_ALIGNMENT_CENTER
1690
};
1691
 
1692
/// <summary>
1693
/// Word wrapping in multiline paragraph.
1694
/// </summary>
1695
enum DWRITE_WORD_WRAPPING
1696
{
1697
    /// <summary>
1698
    /// Words are broken across lines to avoid text overflowing the layout box.
1699
    /// </summary>
1700
    DWRITE_WORD_WRAPPING_WRAP,
1701
 
1702
    /// <summary>
1703
    /// Words are kept within the same line even when it overflows the layout box.
1704
    /// This option is often used with scrolling to reveal overflow text. 
1705
    /// </summary>
1706
    DWRITE_WORD_WRAPPING_NO_WRAP
1707
};
1708
 
1709
/// <summary>
1710
/// The method used for line spacing in layout.
1711
/// </summary>
1712
enum DWRITE_LINE_SPACING_METHOD
1713
{
1714
    /// <summary>
1715
    /// Line spacing depends solely on the content, growing to accomodate the size of fonts and inline objects.
1716
    /// </summary>
1717
    DWRITE_LINE_SPACING_METHOD_DEFAULT,
1718
 
1719
    /// <summary>
1720
    /// Lines are explicitly set to uniform spacing, regardless of contained font sizes.
1721
    /// This can be useful to avoid the uneven appearance that can occur from font fallback.
1722
    /// </summary>
1723
    DWRITE_LINE_SPACING_METHOD_UNIFORM
1724
};
1725
 
1726
/// <summary>
1727
/// Text granularity used to trim text overflowing the layout box.
1728
/// </summary>
1729
enum DWRITE_TRIMMING_GRANULARITY
1730
{
1731
    /// <summary>
1732
    /// No trimming occurs. Text flows beyond the layout width.
1733
    /// </summary>
1734
    DWRITE_TRIMMING_GRANULARITY_NONE,
1735
 
1736
    /// <summary>
1737
    /// Trimming occurs at character cluster boundary.
1738
    /// </summary>
1739
    DWRITE_TRIMMING_GRANULARITY_CHARACTER,
1740
 
1741
    /// <summary>
1742
    /// Trimming occurs at word boundary.
1743
    /// </summary>
1744
    DWRITE_TRIMMING_GRANULARITY_WORD   
1745
};
1746
 
1747
/// <summary>
1748
/// Typographic feature of text supplied by the font.
1749
/// </summary>
1750
enum DWRITE_FONT_FEATURE_TAG
1751
{
1752
    DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS               = 0x63726661, // 'afrc'
1753
    DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS       = 0x63703263, // 'c2pc'
1754
    DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS        = 0x63733263, // 'c2sc'
1755
    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES               = 0x746c6163, // 'calt'
1756
    DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS                = 0x65736163, // 'case'
1757
    DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION     = 0x706d6363, // 'ccmp'
1758
    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES                = 0x67696c63, // 'clig'
1759
    DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING                     = 0x70737063, // 'cpsp'
1760
    DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH                    = 0x68777363, // 'cswh'
1761
    DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING                 = 0x73727563, // 'curs'
1762
    DWRITE_FONT_FEATURE_TAG_DEFAULT                             = 0x746c6664, // 'dflt'
1763
    DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES             = 0x67696c64, // 'dlig'
1764
    DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS                        = 0x74707865, // 'expt'
1765
    DWRITE_FONT_FEATURE_TAG_FRACTIONS                           = 0x63617266, // 'frac'
1766
    DWRITE_FONT_FEATURE_TAG_FULL_WIDTH                          = 0x64697766, // 'fwid'
1767
    DWRITE_FONT_FEATURE_TAG_HALF_FORMS                          = 0x666c6168, // 'half'
1768
    DWRITE_FONT_FEATURE_TAG_HALANT_FORMS                        = 0x6e6c6168, // 'haln'
1769
    DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH                = 0x746c6168, // 'halt'
1770
    DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS                    = 0x74736968, // 'hist'
1771
    DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES          = 0x616e6b68, // 'hkna'
1772
    DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES                = 0x67696c68, // 'hlig'
1773
    DWRITE_FONT_FEATURE_TAG_HALF_WIDTH                          = 0x64697768, // 'hwid'
1774
    DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS                    = 0x6f6a6f68, // 'hojo'
1775
    DWRITE_FONT_FEATURE_TAG_JIS04_FORMS                         = 0x3430706a, // 'jp04'
1776
    DWRITE_FONT_FEATURE_TAG_JIS78_FORMS                         = 0x3837706a, // 'jp78'
1777
    DWRITE_FONT_FEATURE_TAG_JIS83_FORMS                         = 0x3338706a, // 'jp83'
1778
    DWRITE_FONT_FEATURE_TAG_JIS90_FORMS                         = 0x3039706a, // 'jp90'
1779
    DWRITE_FONT_FEATURE_TAG_KERNING                             = 0x6e72656b, // 'kern'
1780
    DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES                  = 0x6167696c, // 'liga'
1781
    DWRITE_FONT_FEATURE_TAG_LINING_FIGURES                      = 0x6d756e6c, // 'lnum'
1782
    DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS                     = 0x6c636f6c, // 'locl'
1783
    DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING                    = 0x6b72616d, // 'mark'
1784
    DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK                  = 0x6b72676d, // 'mgrk'
1785
    DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING            = 0x6b6d6b6d, // 'mkmk'
1786
    DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS          = 0x746c616e, // 'nalt'
1787
    DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS                     = 0x6b636c6e, // 'nlck'
1788
    DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES                   = 0x6d756e6f, // 'onum'
1789
    DWRITE_FONT_FEATURE_TAG_ORDINALS                            = 0x6e64726f, // 'ordn'
1790
    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH        = 0x746c6170, // 'palt'
1791
    DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS                     = 0x70616370, // 'pcap'
1792
    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES                = 0x6d756e70, // 'pnum'
1793
    DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS                 = 0x64697770, // 'pwid'
1794
    DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS                      = 0x64697771, // 'qwid'
1795
    DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES                  = 0x67696c72, // 'rlig'
1796
    DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS                 = 0x79627572, // 'ruby'
1797
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES                = 0x746c6173, // 'salt'
1798
    DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS                = 0x666e6973, // 'sinf'
1799
    DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS                      = 0x70636d73, // 'smcp'
1800
    DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS                    = 0x6c706d73, // 'smpl'
1801
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1                     = 0x31307373, // 'ss01'
1802
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2                     = 0x32307373, // 'ss02'
1803
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3                     = 0x33307373, // 'ss03'
1804
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4                     = 0x34307373, // 'ss04'
1805
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5                     = 0x35307373, // 'ss05'
1806
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6                     = 0x36307373, // 'ss06'
1807
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7                     = 0x37307373, // 'ss07'
1808
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8                     = 0x38307373, // 'ss08'
1809
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9                     = 0x39307373, // 'ss09'
1810
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10                    = 0x30317373, // 'ss10'
1811
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11                    = 0x31317373, // 'ss11'
1812
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12                    = 0x32317373, // 'ss12'
1813
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13                    = 0x33317373, // 'ss13'
1814
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14                    = 0x34317373, // 'ss14'
1815
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15                    = 0x35317373, // 'ss15'
1816
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16                    = 0x36317373, // 'ss16'
1817
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17                    = 0x37317373, // 'ss17'
1818
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18                    = 0x38317373, // 'ss18'
1819
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19                    = 0x39317373, // 'ss19'
1820
    DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20                    = 0x30327373, // 'ss20'
1821
    DWRITE_FONT_FEATURE_TAG_SUBSCRIPT                           = 0x73627573, // 'subs'
1822
    DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT                         = 0x73707573, // 'sups'
1823
    DWRITE_FONT_FEATURE_TAG_SWASH                               = 0x68737773, // 'swsh'
1824
    DWRITE_FONT_FEATURE_TAG_TITLING                             = 0x6c746974, // 'titl'
1825
    DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS              = 0x6d616e74, // 'tnam'
1826
    DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES                     = 0x6d756e74, // 'tnum'
1827
    DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS                   = 0x64617274, // 'trad'
1828
    DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS                        = 0x64697774, // 'twid'
1829
    DWRITE_FONT_FEATURE_TAG_UNICASE                             = 0x63696e75, // 'unic'
1830
    DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO                        = 0x6f72657a, // 'zero'
1831
};
1832
 
1833
/// <summary>
1834
/// The DWRITE_TEXT_RANGE structure specifies a range of text positions where format is applied.
1835
/// </summary>
1836
struct DWRITE_TEXT_RANGE
1837
{
1838
    /// <summary>
1839
    /// The start text position of the range.
1840
    /// </summary>
1841
    UINT32 startPosition;
1842
 
1843
    /// <summary>
1844
    /// The number of text positions in the range.
1845
    /// </summary>
1846
    UINT32 length;
1847
};
1848
 
1849
/// <summary>
1850
/// The DWRITE_FONT_FEATURE structure specifies properties used to identify and execute typographic feature in the font.
1851
/// </summary>
1852
struct DWRITE_FONT_FEATURE
1853
{
1854
    /// <summary>
1855
    /// The feature OpenType name identifier.
1856
    /// </summary>
1857
    DWRITE_FONT_FEATURE_TAG nameTag;
1858
 
1859
    /// <summary>
1860
    /// Execution parameter of the feature.
1861
    /// </summary>
1862
    /// <remarks>
1863
    /// The parameter should be non-zero to enable the feature.  Once enabled, a feature can't be disabled again within
1864
    /// the same range.  Features requiring a selector use this value to indicate the selector index. 
1865
    /// </remarks>
1866
    UINT32 parameter;
1867
};
1868
 
1869
/// <summary>
1870
/// Defines a set of typographic features to be applied during shaping.
1871
/// Notice the character range which this feature list spans is specified
1872
/// as a separate parameter to GetGlyphs.
1873
/// </summary>
1874
struct DWRITE_TYPOGRAPHIC_FEATURES
1875
{
1876
    /// <summary>
1877
    /// Array of font features.
1878
    /// </summary>
1879
    __field_ecount(featureCount) DWRITE_FONT_FEATURE* features;
1880
 
1881
    /// <summary>
1882
    /// The number of features.
1883
    /// </summary>
1884
    UINT32 featureCount;
1885
};
1886
 
1887
/// <summary>
1888
/// The DWRITE_TRIMMING structure specifies the trimming option for text overflowing the layout box.
1889
/// </summary>
1890
struct DWRITE_TRIMMING
1891
{
1892
    /// <summary>
1893
    /// Text granularity of which trimming applies.
1894
    /// </summary>
1895
    DWRITE_TRIMMING_GRANULARITY granularity;
1896
 
1897
    /// <summary>
1898
    /// Character code used as the delimiter signaling the beginning of the portion of text to be preserved,
1899
    /// most useful for path ellipsis, where the delimeter would be a slash.
1900
    /// </summary>
1901
    UINT32 delimiter;
1902
 
1903
    /// <summary>
1904
    /// How many occurences of the delimiter to step back.
1905
    /// </summary>
1906
    UINT32 delimiterCount;
1907
};
1908
 
1909
 
1910
interface IDWriteTypography;
1911
interface IDWriteInlineObject;
1912
 
1913
/// <summary>
1914
/// The format of text used for text layout purpose.
1915
/// </summary>
1916
/// <remarks>
1917
/// This object may not be thread-safe and it may carry the state of text format change.
1918
/// </remarks>
1919
interface DWRITE_DECLARE_INTERFACE("9c906818-31d7-4fd3-a151-7c5e225db55a") IDWriteTextFormat : public IUnknown
1920
{
1921
    /// <summary>
1922
    /// Set alignment option of text relative to layout box's leading and trailing edge.
1923
    /// </summary>
1924
    /// <param name="textAlignment">Text alignment option</param>
1925
    /// <returns>
1926
    /// Standard HRESULT error code.
1927
    /// </returns>
1928
    STDMETHOD(SetTextAlignment)(
1929
        DWRITE_TEXT_ALIGNMENT textAlignment
1930
        ) PURE;
1931
 
1932
    /// <summary>
1933
    /// Set alignment option of paragraph relative to layout box's top and bottom edge.
1934
    /// </summary>
1935
    /// <param name="paragraphAlignment">Paragraph alignment option</param>
1936
    /// <returns>
1937
    /// Standard HRESULT error code.
1938
    /// </returns>
1939
    STDMETHOD(SetParagraphAlignment)(
1940
        DWRITE_PARAGRAPH_ALIGNMENT paragraphAlignment
1941
        ) PURE;
1942
 
1943
    /// <summary>
1944
    /// Set word wrapping option.
1945
    /// </summary>
1946
    /// <param name="wordWrapping">Word wrapping option</param>
1947
    /// <returns>
1948
    /// Standard HRESULT error code.
1949
    /// </returns>
1950
    STDMETHOD(SetWordWrapping)(
1951
        DWRITE_WORD_WRAPPING wordWrapping
1952
        ) PURE;
1953
 
1954
    /// <summary>
1955
    /// Set paragraph reading direction.
1956
    /// </summary>
1957
    /// <param name="readingDirection">Text reading direction</param>
1958
    /// <returns>
1959
    /// Standard HRESULT error code.
1960
    /// </returns>
1961
    STDMETHOD(SetReadingDirection)(
1962
        DWRITE_READING_DIRECTION readingDirection
1963
        ) PURE;
1964
 
1965
    /// <summary>
1966
    /// Set paragraph flow direction.
1967
    /// </summary>
1968
    /// <param name="flowDirection">Paragraph flow direction</param>
1969
    /// <returns>
1970
    /// Standard HRESULT error code.
1971
    /// </returns>
1972
    STDMETHOD(SetFlowDirection)(
1973
        DWRITE_FLOW_DIRECTION flowDirection
1974
        ) PURE;
1975
 
1976
    /// <summary>
1977
    /// Set incremental tab stop position.
1978
    /// </summary>
1979
    /// <param name="incrementalTabStop">The incremental tab stop value</param>
1980
    /// <returns>
1981
    /// Standard HRESULT error code.
1982
    /// </returns>
1983
    STDMETHOD(SetIncrementalTabStop)(
1984
        FLOAT incrementalTabStop
1985
        ) PURE;
1986
 
1987
    /// <summary>
1988
    /// Set trimming options for any trailing text exceeding the layout width
1989
    /// or for any far text exceeding the layout height.
1990
    /// </summary>
1991
    /// <param name="trimmingOptions">Text trimming options.</param>
1992
    /// <param name="trimmingSign">Application-defined omission sign. This parameter may be NULL if no trimming sign is desired.</param>
1993
    /// <remarks>
1994
    /// Any inline object can be used for the trimming sign, but CreateEllipsisTrimmingSign
1995
    /// provides a typical ellipsis symbol. Trimming is also useful vertically for hiding
1996
    /// partial lines.
1997
    /// </remarks>
1998
    /// <returns>
1999
    /// Standard HRESULT error code.
2000
    /// </returns>
2001
    STDMETHOD(SetTrimming)(
2002
        __in DWRITE_TRIMMING const* trimmingOptions,
2003
        IDWriteInlineObject* trimmingSign
2004
        ) PURE;
2005
 
2006
    /// <summary>
2007
    /// Set line spacing.
2008
    /// </summary>
2009
    /// <param name="lineSpacingMethod">How to determine line height.</param>
2010
    /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>
2011
    /// <param name="baseline">Distance from top of line to baseline. A reasonable ratio to lineSpacing is 80%.</param>
2012
    /// <remarks>
2013
    /// For the default method, spacing depends solely on the content.
2014
    /// For uniform spacing, the given line height will override the content.
2015
    /// </remarks>
2016
    /// <returns>
2017
    /// Standard HRESULT error code.
2018
    /// </returns>
2019
    STDMETHOD(SetLineSpacing)(
2020
        DWRITE_LINE_SPACING_METHOD lineSpacingMethod,
2021
        FLOAT lineSpacing,
2022
        FLOAT baseline
2023
        ) PURE;
2024
 
2025
    /// <summary>
2026
    /// Get alignment option of text relative to layout box's leading and trailing edge.
2027
    /// </summary>
2028
    STDMETHOD_(DWRITE_TEXT_ALIGNMENT, GetTextAlignment)() PURE;
2029
 
2030
    /// <summary>
2031
    /// Get alignment option of paragraph relative to layout box's top and bottom edge.
2032
    /// </summary>
2033
    STDMETHOD_(DWRITE_PARAGRAPH_ALIGNMENT, GetParagraphAlignment)() PURE;
2034
 
2035
    /// <summary>
2036
    /// Get word wrapping option.
2037
    /// </summary>
2038
    STDMETHOD_(DWRITE_WORD_WRAPPING, GetWordWrapping)() PURE;
2039
 
2040
    /// <summary>
2041
    /// Get paragraph reading direction.
2042
    /// </summary>
2043
    STDMETHOD_(DWRITE_READING_DIRECTION, GetReadingDirection)() PURE;
2044
 
2045
    /// <summary>
2046
    /// Get paragraph flow direction.
2047
    /// </summary>
2048
    STDMETHOD_(DWRITE_FLOW_DIRECTION, GetFlowDirection)() PURE;
2049
 
2050
    /// <summary>
2051
    /// Get incremental tab stop position.
2052
    /// </summary>
2053
    STDMETHOD_(FLOAT, GetIncrementalTabStop)() PURE;
2054
 
2055
    /// <summary>
2056
    /// Get trimming options for text overflowing the layout width.
2057
    /// </summary>
2058
    /// <param name="trimmingOptions">Text trimming options.</param>
2059
    /// <param name="trimmingSign">Trimming omission sign. This parameter may be NULL.</param>
2060
    /// <returns>
2061
    /// Standard HRESULT error code.
2062
    /// </returns>
2063
    STDMETHOD(GetTrimming)(
2064
        __out DWRITE_TRIMMING* trimmingOptions,
2065
        __out IDWriteInlineObject** trimmingSign
2066
        ) PURE;
2067
 
2068
    /// <summary>
2069
    /// Get line spacing.
2070
    /// </summary>
2071
    /// <param name="lineSpacingMethod">How line height is determined.</param>
2072
    /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>
2073
    /// <param name="baseline">Distance from top of line to baseline.</param>
2074
    /// <returns>
2075
    /// Standard HRESULT error code.
2076
    /// </returns>
2077
    STDMETHOD(GetLineSpacing)(
2078
        __out DWRITE_LINE_SPACING_METHOD* lineSpacingMethod,
2079
        __out FLOAT* lineSpacing,
2080
        __out FLOAT* baseline
2081
        ) PURE;
2082
 
2083
    /// <summary>
2084
    /// Get the font collection.
2085
    /// </summary>
2086
    /// <param name="fontCollection">The current font collection.</param>
2087
    /// <returns>
2088
    /// Standard HRESULT error code.
2089
    /// </returns>
2090
    STDMETHOD(GetFontCollection)(
2091
        __out IDWriteFontCollection** fontCollection
2092
        ) PURE;
2093
 
2094
    /// <summary>
2095
    /// Get the length of the font family name, in characters, not including the terminating NULL character.
2096
    /// </summary>
2097
    STDMETHOD_(UINT32, GetFontFamilyNameLength)() PURE;
2098
 
2099
    /// <summary>
2100
    /// Get a copy of the font family name.
2101
    /// </summary>
2102
    /// <param name="fontFamilyName">Character array that receives the current font family name</param>
2103
    /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
2104
    /// <returns>
2105
    /// Standard HRESULT error code.
2106
    /// </returns>
2107
    STDMETHOD(GetFontFamilyName)(
2108
        __out_ecount_z(nameSize) WCHAR* fontFamilyName,
2109
        UINT32 nameSize
2110
        ) PURE;
2111
 
2112
    /// <summary>
2113
    /// Get the font weight.
2114
    /// </summary>
2115
    STDMETHOD_(DWRITE_FONT_WEIGHT, GetFontWeight)() PURE;
2116
 
2117
    /// <summary>
2118
    /// Get the font style.
2119
    /// </summary>
2120
    STDMETHOD_(DWRITE_FONT_STYLE, GetFontStyle)() PURE;
2121
 
2122
    /// <summary>
2123
    /// Get the font stretch.
2124
    /// </summary>
2125
    STDMETHOD_(DWRITE_FONT_STRETCH, GetFontStretch)() PURE;
2126
 
2127
    /// <summary>
2128
    /// Get the font em height.
2129
    /// </summary>
2130
    STDMETHOD_(FLOAT, GetFontSize)() PURE;
2131
 
2132
    /// <summary>
2133
    /// Get the length of the locale name, in characters, not including the terminating NULL character.
2134
    /// </summary>
2135
    STDMETHOD_(UINT32, GetLocaleNameLength)() PURE;
2136
 
2137
    /// <summary>
2138
    /// Get a copy of the locale name.
2139
    /// </summary>
2140
    /// <param name="localeName">Character array that receives the current locale name</param>
2141
    /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
2142
    /// <returns>
2143
    /// Standard HRESULT error code.
2144
    /// </returns>
2145
    STDMETHOD(GetLocaleName)(
2146
        __out_ecount_z(nameSize) WCHAR* localeName,
2147
        UINT32 nameSize
2148
        ) PURE;
2149
};
2150
 
2151
 
2152
/// <summary>
2153
/// Font typography setting.
2154
/// </summary>
2155
interface DWRITE_DECLARE_INTERFACE("55f1112b-1dc2-4b3c-9541-f46894ed85b6") IDWriteTypography : public IUnknown
2156
{
2157
    /// <summary>
2158
    /// Add font feature.
2159
    /// </summary>
2160
    /// <param name="fontFeature">The font feature to add.</param>
2161
    /// <returns>
2162
    /// Standard HRESULT error code.
2163
    /// </returns>
2164
    STDMETHOD(AddFontFeature)(
2165
        DWRITE_FONT_FEATURE fontFeature
2166
        ) PURE;
2167
 
2168
    /// <summary>
2169
    /// Get the number of font features.
2170
    /// </summary>
2171
    STDMETHOD_(UINT32, GetFontFeatureCount)() PURE;
2172
 
2173
    /// <summary>
2174
    /// Get the font feature at the specified index.
2175
    /// </summary>
2176
    /// <param name="fontFeatureIndex">The zero-based index of the font feature to get.</param>
2177
    /// <param name="fontFeature">The font feature.</param>
2178
    /// <returns>
2179
    /// Standard HRESULT error code.
2180
    /// </returns>
2181
    STDMETHOD(GetFontFeature)(
2182
        UINT32 fontFeatureIndex,
2183
        __out DWRITE_FONT_FEATURE* fontFeature
2184
        ) PURE;
2185
};
2186
 
2187
enum DWRITE_SCRIPT_SHAPES
2188
{
2189
    /// <summary>
2190
    /// No additional shaping requirement. Text is shaped with the writing system default behavior.
2191
    /// </summary>
2192
    DWRITE_SCRIPT_SHAPES_DEFAULT = 0,
2193
 
2194
    /// <summary>
2195
    /// Text should leave no visual on display i.e. control or format control characters.
2196
    /// </summary>
2197
    DWRITE_SCRIPT_SHAPES_NO_VISUAL = 1
2198
};
2199
 
2200
#ifdef DEFINE_ENUM_FLAG_OPERATORS
2201
DEFINE_ENUM_FLAG_OPERATORS(DWRITE_SCRIPT_SHAPES);
2202
#endif
2203
 
2204
/// <summary>
2205
/// Association of text and its writing system script as well as some display attributes.
2206
/// </summary>
2207
struct DWRITE_SCRIPT_ANALYSIS
2208
{
2209
    /// <summary>
2210
    /// Zero-based index representation of writing system script.
2211
    /// </summary>
2212
    UINT16 script;
2213
 
2214
    /// <summary>
2215
    /// Additional shaping requirement of text.
2216
    /// </summary>
2217
    DWRITE_SCRIPT_SHAPES shapes;
2218
};
2219
 
2220
/// <summary>
2221
/// Condition at the edges of inline object or text used to determine
2222
/// line-breaking behavior.
2223
/// </summary>
2224
enum DWRITE_BREAK_CONDITION
2225
{
2226
    /// <summary>
2227
    /// Whether a break is allowed is determined by the condition of the
2228
    /// neighboring text span or inline object.
2229
    /// </summary>
2230
    DWRITE_BREAK_CONDITION_NEUTRAL,
2231
 
2232
    /// <summary>
2233
    /// A break is allowed, unless overruled by the condition of the
2234
    /// neighboring text span or inline object, either prohibited by a
2235
    /// May Not or forced by a Must.
2236
    /// </summary>
2237
    DWRITE_BREAK_CONDITION_CAN_BREAK,
2238
 
2239
    /// <summary>
2240
    /// There should be no break, unless overruled by a Must condition from
2241
    /// the neighboring text span or inline object.
2242
    /// </summary>
2243
    DWRITE_BREAK_CONDITION_MAY_NOT_BREAK,
2244
 
2245
    /// <summary>
2246
    /// The break must happen, regardless of the condition of the adjacent
2247
    /// text span or inline object.
2248
    /// </summary>
2249
    DWRITE_BREAK_CONDITION_MUST_BREAK
2250
};
2251
 
2252
/// <summary>
2253
/// Line breakpoint characteristics of a character.
2254
/// </summary>
2255
struct DWRITE_LINE_BREAKPOINT
2256
{
2257
    /// <summary>
2258
    /// Breaking condition before the character.
2259
    /// </summary>
2260
    UINT8 breakConditionBefore  : 2;
2261
 
2262
    /// <summary>
2263
    /// Breaking condition after the character.
2264
    /// </summary>
2265
    UINT8 breakConditionAfter   : 2;
2266
 
2267
    /// <summary>
2268
    /// The character is some form of whitespace, which may be meaningful
2269
    /// for justification.
2270
    /// </summary>
2271
    UINT8 isWhitespace          : 1;
2272
 
2273
    /// <summary>
2274
    /// The character is a soft hyphen, often used to indicate hyphenation
2275
    /// points inside words.
2276
    /// </summary>
2277
    UINT8 isSoftHyphen          : 1;
2278
 
2279
    UINT8 padding               : 2;
2280
};
2281
 
2282
/// <summary>
2283
/// How to apply number substitution on digits and related punctuation.
2284
/// </summary>
2285
enum DWRITE_NUMBER_SUBSTITUTION_METHOD
2286
{
2287
    /// <summary>
2288
    /// Specifies that the substitution method should be determined based
2289
    /// on LOCALE_IDIGITSUBSTITUTION value of the specified text culture.
2290
    /// </summary>
2291
    DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE,
2292
 
2293
    /// <summary>
2294
    /// If the culture is Arabic or Farsi, specifies that the number shape
2295
    /// depend on the context. Either traditional or nominal number shape
2296
    /// are used depending on the nearest preceding strong character or (if
2297
    /// there is none) the reading direction of the paragraph.
2298
    /// </summary>
2299
    DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL,
2300
 
2301
    /// <summary>
2302
    /// Specifies that code points 0x30-0x39 are always rendered as nominal numeral 
2303
    /// shapes (ones of the European number), i.e., no substitution is performed.
2304
    /// </summary>
2305
    DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE,
2306
 
2307
    /// <summary>
2308
    /// Specifies that number are rendered using the national number shape 
2309
    /// as specified by the LOCALE_SNATIVEDIGITS value of the specified text culture.
2310
    /// </summary>
2311
    DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL,
2312
 
2313
    /// <summary>
2314
    /// Specifies that number are rendered using the traditional shape
2315
    /// for the specified culture. For most cultures, this is the same as
2316
    /// NativeNational. However, NativeNational results in Latin number
2317
    /// for some Arabic cultures, whereas this value results in Arabic
2318
    /// number for all Arabic cultures.
2319
    /// </summary>
2320
    DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL
2321
};
2322
 
2323
/// <summary>
2324
/// Holds the appropriate digits and numeric punctuation for a given locale.
2325
/// </summary>
2326
interface DECLSPEC_UUID("14885CC9-BAB0-4f90-B6ED-5C366A2CD03D") DECLSPEC_NOVTABLE IDWriteNumberSubstitution : public IUnknown
2327
{
2328
};
2329
 
2330
/// <summary>
2331
/// Shaping output properties per input character.
2332
/// </summary>
2333
struct DWRITE_SHAPING_TEXT_PROPERTIES
2334
{
2335
    /// <summary>
2336
    /// This character can be shaped independently from the others
2337
    /// (usually set for the space character).
2338
    /// </summary>
2339
    UINT16  isShapedAlone       : 1;
2340
 
2341
    /// <summary>
2342
    /// Reserved for use by shaping engine.
2343
    /// </summary>
2344
    UINT16  reserved            : 15;
2345
};
2346
 
2347
/// <summary>
2348
/// Shaping output properties per output glyph.
2349
/// </summary>
2350
struct DWRITE_SHAPING_GLYPH_PROPERTIES
2351
{
2352
    /// <summary>
2353
    /// Justification class, whether to use spacing, kashidas, or
2354
    /// another method. This exists for backwards compatibility
2355
    /// with Uniscribe's SCRIPT_JUSTIFY enum.
2356
    /// </summary>
2357
    UINT16  justification       : 4;
2358
 
2359
    /// <summary>
2360
    /// Indicates glyph is the first of a cluster.
2361
    /// </summary>
2362
    UINT16  isClusterStart      : 1;
2363
 
2364
    /// <summary>
2365
    /// Glyph is a diacritic.
2366
    /// </summary>
2367
    UINT16  isDiacritic         : 1;
2368
 
2369
    /// <summary>
2370
    /// Glyph has no width, blank, ZWJ, ZWNJ etc.
2371
    /// </summary>
2372
    UINT16  isZeroWidthSpace    : 1;
2373
 
2374
    /// <summary>
2375
    /// Reserved for use by shaping engine.
2376
    /// </summary>
2377
    UINT16  reserved            : 9;
2378
};
2379
 
2380
/// <summary>
2381
/// The interface implemented by the text analyzer's client to provide text to
2382
/// the analyzer. It allows the separation between the logical view of text as
2383
/// a continuous stream of characters identifiable by unique text positions,
2384
/// and the actual memory layout of potentially discrete blocks of text in the
2385
/// client's backing store.
2386
///
2387
/// If any of these callbacks returns an error, the analysis functions will
2388
/// stop prematurely and return a callback error. Rather than return E_NOTIMPL,
2389
/// an application should stub the method and return a constant/null and S_OK.
2390
/// </summary>
2391
interface DECLSPEC_UUID("688e1a58-5094-47c8-adc8-fbcea60ae92b") DECLSPEC_NOVTABLE IDWriteTextAnalysisSource : public IUnknown
2392
{
2393
    /// <summary>
2394
    /// Get a block of text starting at the specified text position.
2395
    /// Returning NULL indicates the end of text - the position is after
2396
    /// the last character. This function is called iteratively for
2397
    /// each consecutive block, tying together several fragmented blocks
2398
    /// in the backing store into a virtual contiguous string.
2399
    /// </summary>
2400
    /// <param name="textPosition">First position of the piece to obtain. All
2401
    ///     positions are in UTF16 code-units, not whole characters, which
2402
    ///     matters when supplementary characters are used.</param>
2403
    /// <param name="textString">Address that receives a pointer to the text block
2404
    ///     at the specified position.</param>
2405
    /// <param name="textLength">Number of UTF16 units of the retrieved chunk.
2406
    ///     The returned length is not the length of the block, but the length
2407
    ///     remaining in the block, from the given position until its end.
2408
    ///     So querying for a position that is 75 positions into a 100
2409
    ///     postition block would return 25.</param>
2410
    /// <returns>Pointer to the first character at the given text position.
2411
    /// NULL indicates no chunk available at the specified position, either
2412
    /// because textPosition >= the entire text content length or because the
2413
    /// queried position is not mapped into the app's backing store.</returns>
2414
    /// <remarks>
2415
    /// Although apps can implement sparse textual content that only maps part of
2416
    /// the backing store, the app must map any text that is in the range passed
2417
    /// to any analysis functions.
2418
    /// </remarks>
2419
    STDMETHOD(GetTextAtPosition)(
2420
        UINT32 textPosition,
2421
        __out WCHAR const** textString,
2422
        __out UINT32* textLength
2423
        ) PURE;
2424
 
2425
    /// <summary>
2426
    /// Get a block of text immediately preceding the specified position.
2427
    /// </summary>
2428
    /// <param name="textPosition">Position immediately after the last position of the chunk to obtain.</param>
2429
    /// <param name="textString">Address that receives a pointer to the text block
2430
    ///     at the specified position.</param>
2431
    /// <param name="textLength">Number of UTF16 units of the retrieved block.
2432
    ///     The length returned is from the given position to the front of
2433
    ///     the block.</param>
2434
    /// <returns>Pointer to the first character at (textPosition - textLength).
2435
    /// NULL indicates no chunk available at the specified position, either
2436
    /// because textPosition == 0,the textPosition > the entire text content
2437
    /// length, or the queried position is not mapped into the app's backing
2438
    /// store.</returns>
2439
    /// <remarks>
2440
    /// Although apps can implement sparse textual content that only maps part of
2441
    /// the backing store, the app must map any text that is in the range passed
2442
    /// to any analysis functions.
2443
    /// </remarks>
2444
    STDMETHOD(GetTextBeforePosition)(
2445
        UINT32 textPosition,
2446
        __out WCHAR const** textString,
2447
        __out UINT32* textLength
2448
        ) PURE;
2449
 
2450
    /// <summary>
2451
    /// Get paragraph reading direction.
2452
    /// </summary>
2453
    STDMETHOD_(DWRITE_READING_DIRECTION, GetParagraphReadingDirection)() PURE;
2454
 
2455
    /// <summary>
2456
    /// Get locale name on the range affected by it.
2457
    /// </summary>
2458
    /// <param name="textPosition">Position to get the locale name of.</param>
2459
    /// <param name="textLength">Receives the length from the given position up to the
2460
    ///     next differing locale.</param>
2461
    /// <param name="localeName">Address that receives a pointer to the locale
2462
    ///     at the specified position.</param>
2463
    /// <remarks>
2464
    /// The localeName pointer must remain valid until the next call or until
2465
    /// the analysis returns.
2466
    /// </remarks>
2467
    STDMETHOD(GetLocaleName)(
2468
        UINT32 textPosition,
2469
        __out UINT32* textLength,
2470
        __out_z WCHAR const** localeName
2471
        ) PURE;
2472
 
2473
    /// <summary>
2474
    /// Get number substitution on the range affected by it.
2475
    /// </summary>
2476
    /// <param name="textPosition">Position to get the number substitution of.</param>
2477
    /// <param name="textLength">Receives the length from the given position up to the
2478
    ///     next differing number substitution.</param>
2479
    /// <param name="numberSubstitution">Address that receives a pointer to the number substitution
2480
    ///     at the specified position.</param>
2481
    /// <remarks>
2482
    /// Any implementation should return the number substitution with an
2483
    /// incremented ref count, and the analysis will release when finished
2484
    /// with it (either before the next call or before it returns). However,
2485
    /// the sink callback may hold onto it after that.
2486
    /// </remarks>
2487
    STDMETHOD(GetNumberSubstitution)(
2488
        UINT32 textPosition,
2489
        __out UINT32* textLength,
2490
        __out IDWriteNumberSubstitution** numberSubstitution
2491
        ) PURE;
2492
};
2493
 
2494
/// <summary>
2495
/// The interface implemented by the text analyzer's client to receive the
2496
/// output of a given text analysis. The Text analyzer disregards any current
2497
/// state of the analysis sink, therefore a Set method call on a range
2498
/// overwrites the previously set analysis result of the same range. 
2499
/// </summary>
2500
interface DECLSPEC_UUID("5810cd44-0ca0-4701-b3fa-bec5182ae4f6") DECLSPEC_NOVTABLE IDWriteTextAnalysisSink : public IUnknown
2501
{
2502
    /// <summary>
2503
    /// Report script analysis for the text range.
2504
    /// </summary>
2505
    /// <param name="textPosition">Starting position to report from.</param>
2506
    /// <param name="textLength">Number of UTF16 units of the reported range.</param>
2507
    /// <param name="scriptAnalysis">Script analysis of characters in range.</param>
2508
    /// <returns>
2509
    /// A successful code or error code to abort analysis.
2510
    /// </returns>
2511
    STDMETHOD(SetScriptAnalysis)(
2512
        UINT32 textPosition,
2513
        UINT32 textLength,
2514
        __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis
2515
        ) PURE;
2516
 
2517
    /// <summary>
2518
    /// Repport line-break opportunities for each character, starting from
2519
    /// the specified position.
2520
    /// </summary>
2521
    /// <param name="textPosition">Starting position to report from.</param>
2522
    /// <param name="textLength">Number of UTF16 units of the reported range.</param>
2523
    /// <param name="lineBreakpoints">Breaking conditions for each character.</param>
2524
    /// <returns>
2525
    /// A successful code or error code to abort analysis.
2526
    /// </returns>
2527
    STDMETHOD(SetLineBreakpoints)(
2528
        UINT32 textPosition,
2529
        UINT32 textLength,
2530
        __in_ecount(textLength) DWRITE_LINE_BREAKPOINT const* lineBreakpoints
2531
        ) PURE;
2532
 
2533
    /// <summary>
2534
    /// Set bidirectional level on the range, called once per each
2535
    /// level run change (either explicit or resolved implicit).
2536
    /// </summary>
2537
    /// <param name="textPosition">Starting position to report from.</param>
2538
    /// <param name="textLength">Number of UTF16 units of the reported range.</param>
2539
    /// <param name="explicitLevel">Explicit level from embedded control codes
2540
    ///     RLE/RLO/LRE/LRO/PDF, determined before any additional rules.</param>
2541
    /// <param name="resolvedLevel">Final implicit level considering the
2542
    ///     explicit level and characters' natural directionality, after all
2543
    ///     Bidi rules have been applied.</param>
2544
    /// <returns>
2545
    /// A successful code or error code to abort analysis.
2546
    /// </returns>
2547
    STDMETHOD(SetBidiLevel)(
2548
        UINT32 textPosition,
2549
        UINT32 textLength,
2550
        UINT8 explicitLevel,
2551
        UINT8 resolvedLevel
2552
        ) PURE;
2553
 
2554
    /// <summary>
2555
    /// Set number substitution on the range.
2556
    /// </summary>
2557
    /// <param name="textPosition">Starting position to report from.</param>
2558
    /// <param name="textLength">Number of UTF16 units of the reported range.</param>
2559
    /// <param name="numberSubstitution">The number substitution applicable to
2560
    ///     the returned range of text. The sink callback may hold onto it by
2561
    ///     incrementing its ref count.</param>
2562
    /// <returns>
2563
    /// A successful code or error code to abort analysis.
2564
    /// </returns>
2565
    /// <remark>
2566
    /// Unlike script and bidi analysis, where every character passed to the
2567
    /// analyzer has a result, this will only be called for those ranges where
2568
    /// substitution is applicable. For any other range, you will simply not
2569
    /// be called.
2570
    /// </remark>
2571
    STDMETHOD(SetNumberSubstitution)(
2572
        UINT32 textPosition,
2573
        UINT32 textLength,
2574
        __notnull IDWriteNumberSubstitution* numberSubstitution
2575
        ) PURE;
2576
};
2577
 
2578
/// <summary>
2579
/// Analyzes various text properties for complex script processing.
2580
/// </summary>
2581
interface DWRITE_DECLARE_INTERFACE("b7e6163e-7f46-43b4-84b3-e4e6249c365d") IDWriteTextAnalyzer : public IUnknown
2582
{
2583
    /// <summary>
2584
    /// Analyzes a text range for script boundaries, reading text attributes
2585
    /// from the source and reporting the Unicode script ID to the sink 
2586
    /// callback SetScript.
2587
    /// </summary>
2588
    /// <param name="analysisSource">Source object to analyze.</param>
2589
    /// <param name="textPosition">Starting position within the source object.</param>
2590
    /// <param name="textLength">Length to analyze.</param>
2591
    /// <param name="analysisSink">Callback object.</param>
2592
    /// <returns>
2593
    /// Standard HRESULT error code.
2594
    /// </returns>
2595
    STDMETHOD(AnalyzeScript)(
2596
        IDWriteTextAnalysisSource* analysisSource,
2597
        UINT32 textPosition,
2598
        UINT32 textLength,
2599
        IDWriteTextAnalysisSink* analysisSink
2600
        ) PURE;
2601
 
2602
    /// <summary>
2603
    /// Analyzes a text range for script directionality, reading attributes
2604
    /// from the source and reporting levels to the sink callback SetBidiLevel.
2605
    /// </summary>
2606
    /// <param name="analysisSource">Source object to analyze.</param>
2607
    /// <param name="textPosition">Starting position within the source object.</param>
2608
    /// <param name="textLength">Length to analyze.</param>
2609
    /// <param name="analysisSink">Callback object.</param>
2610
    /// <returns>
2611
    /// Standard HRESULT error code.
2612
    /// </returns>
2613
    /// <remarks>
2614
    /// While the function can handle multiple paragraphs, the text range
2615
    /// should not arbitrarily split the middle of paragraphs. Otherwise the
2616
    /// returned levels may be wrong, since the Bidi algorithm is meant to
2617
    /// apply to the paragraph as a whole.
2618
    /// </remarks>
2619
    /// <remarks>
2620
    /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.
2621
    /// </remarks>
2622
    STDMETHOD(AnalyzeBidi)(
2623
        IDWriteTextAnalysisSource* analysisSource,
2624
        UINT32 textPosition,
2625
        UINT32 textLength,
2626
        IDWriteTextAnalysisSink* analysisSink
2627
        ) PURE;
2628
 
2629
    /// <summary>
2630
    /// Analyzes a text range for spans where number substitution is applicable,
2631
    /// reading attributes from the source and reporting substitutable ranges
2632
    /// to the sink callback SetNumberSubstitution.
2633
    /// </summary>
2634
    /// <param name="analysisSource">Source object to analyze.</param>
2635
    /// <param name="textPosition">Starting position within the source object.</param>
2636
    /// <param name="textLength">Length to analyze.</param>
2637
    /// <param name="analysisSink">Callback object.</param>
2638
    /// <returns>
2639
    /// Standard HRESULT error code.
2640
    /// </returns>
2641
    /// <remarks>
2642
    /// While the function can handle multiple ranges of differing number
2643
    /// substitutions, the text ranges should not arbitrarily split the
2644
    /// middle of numbers. Otherwise it will treat the numbers separately
2645
    /// and will not translate any intervening punctuation.
2646
    /// </remarks>
2647
    /// <remarks>
2648
    /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.
2649
    /// </remarks>
2650
    STDMETHOD(AnalyzeNumberSubstitution)(
2651
        IDWriteTextAnalysisSource* analysisSource,
2652
        UINT32 textPosition,
2653
        UINT32 textLength,
2654
        IDWriteTextAnalysisSink* analysisSink
2655
        ) PURE;
2656
 
2657
    /// <summary>
2658
    /// Analyzes a text range for potential breakpoint opportunities, reading
2659
    /// attributes from the source and reporting breakpoint opportunities to
2660
    /// the sink callback SetLineBreakpoints.
2661
    /// </summary>
2662
    /// <param name="analysisSource">Source object to analyze.</param>
2663
    /// <param name="textPosition">Starting position within the source object.</param>
2664
    /// <param name="textLength">Length to analyze.</param>
2665
    /// <param name="analysisSink">Callback object.</param>
2666
    /// <returns>
2667
    /// Standard HRESULT error code.
2668
    /// </returns>
2669
    /// <remarks>
2670
    /// While the function can handle multiple paragraphs, the text range
2671
    /// should not arbitrarily split the middle of paragraphs, unless the
2672
    /// given text span is considered a whole unit. Otherwise the
2673
    /// returned properties for the first and last characters will
2674
    /// inappropriately allow breaks.
2675
    /// </remarks>
2676
    /// <remarks>
2677
    /// Special cases include the first, last, and surrogate characters. Any
2678
    /// text span is treated as if adjacent to inline objects on either side.
2679
    /// So the rules with contingent-break opportunities are used, where the 
2680
    /// edge between text and inline objects is always treated as a potential
2681
    /// break opportunity, dependent on any overriding rules of the adjacent
2682
    /// objects to prohibit or force the break (see Unicode TR #14).
2683
    /// Surrogate pairs never break between.
2684
    /// </remarks>
2685
    STDMETHOD(AnalyzeLineBreakpoints)(
2686
        IDWriteTextAnalysisSource* analysisSource,
2687
        UINT32 textPosition,
2688
        UINT32 textLength,
2689
        IDWriteTextAnalysisSink* analysisSink
2690
        ) PURE;
2691
 
2692
    /// <summary>
2693
    /// Parses the input text string and maps it to the set of glyphs and associated glyph data
2694
    /// according to the font and the writing system's rendering rules.
2695
    /// </summary>
2696
    /// <param name="textString">The string to convert to glyphs.</param>
2697
    /// <param name="textLength">The length of textString.</param>
2698
    /// <param name="fontFace">The font face to get glyphs from.</param>
2699
    /// <param name="isSideways">Set to true if the text is intended to be
2700
    /// drawn vertically.</param>
2701
    /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
2702
    /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
2703
    /// <param name="localeName">The locale to use when selecting glyphs.
2704
    /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
2705
    /// If this is NULL then the default mapping based on the script is used.</param>
2706
    /// <param name="numberSubstitution">Optional number substitution which
2707
    /// selects the appropriate glyphs for digits and related numeric characters,
2708
    /// depending on the results obtained from AnalyzeNumberSubstitution. Passing
2709
    /// null indicates that no substitution is needed and that the digits should
2710
    /// receive nominal glyphs.</param>
2711
    /// <param name="features">An array of pointers to the sets of typographic 
2712
    /// features to use in each feature range.</param>
2713
    /// <param name="featureRangeLengths">The length of each feature range, in characters.  
2714
    /// The sum of all lengths should be equal to textLength.</param>
2715
    /// <param name="featureRanges">The number of feature ranges.</param>
2716
    /// <param name="maxGlyphCount">The maximum number of glyphs that can be
2717
    /// returned.</param>
2718
    /// <param name="clusterMap">The mapping from character ranges to glyph 
2719
    /// ranges.</param>
2720
    /// <param name="textProps">Per-character output properties.</param>
2721
    /// <param name="glyphIndices">Output glyph indices.</param>
2722
    /// <param name="glyphProps">Per-glyph output properties.</param>
2723
    /// <param name="actualGlyphCount">The actual number of glyphs returned if
2724
    /// the call succeeds.</param>
2725
    /// <returns>
2726
    /// Standard HRESULT error code.
2727
    /// </returns>
2728
    /// <remarks>
2729
    /// Note that the mapping from characters to glyphs is, in general, many-
2730
    /// to-many.  The recommended estimate for the per-glyph output buffers is
2731
    /// (3 * textLength / 2 + 16).  This is not guaranteed to be sufficient.
2732
    ///
2733
    /// The value of the actualGlyphCount parameter is only valid if the call
2734
    /// succeeds.  In the event that maxGlyphCount is not big enough
2735
    /// E_NOT_SUFFICIENT_BUFFER, which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
2736
    /// will be returned.  The application should allocate a larger buffer and try again.
2737
    /// </remarks>
2738
    STDMETHOD(GetGlyphs)(
2739
        __in_ecount(textLength) WCHAR const* textString,
2740
        UINT32 textLength,
2741
        IDWriteFontFace* fontFace,
2742
        BOOL isSideways,
2743
        BOOL isRightToLeft,
2744
        __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
2745
        __in_z_opt WCHAR const* localeName,
2746
        __maybenull IDWriteNumberSubstitution* numberSubstitution,
2747
        __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
2748
        __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
2749
        UINT32 featureRanges,
2750
        UINT32 maxGlyphCount,
2751
        __out_ecount(textLength) UINT16* clusterMap,
2752
        __out_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
2753
        __out_ecount(maxGlyphCount) UINT16* glyphIndices,
2754
        __out_ecount(maxGlyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProps,
2755
        __out UINT32* actualGlyphCount
2756
        ) PURE;
2757
 
2758
    /// <summary>
2759
    /// Place glyphs output from the GetGlyphs method according to the font 
2760
    /// and the writing system's rendering rules.
2761
    /// </summary>
2762
    /// <param name="textString">The original string the glyphs came from.</param>
2763
    /// <param name="clusterMap">The mapping from character ranges to glyph 
2764
    /// ranges. Returned by GetGlyphs.</param>
2765
    /// <param name="textProps">Per-character properties. Returned by 
2766
    /// GetGlyphs.</param>
2767
    /// <param name="textLength">The length of textString.</param>
2768
    /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>
2769
    /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>
2770
    /// <param name="glyphCount">The number of glyphs.</param>
2771
    /// <param name="fontFace">The font face the glyphs came from.</param>
2772
    /// <param name="fontEmSize">Logical font size in DIP's.</param>
2773
    /// <param name="isSideways">Set to true if the text is intended to be
2774
    /// drawn vertically.</param>
2775
    /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
2776
    /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
2777
    /// <param name="localeName">The locale to use when selecting glyphs.
2778
    /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
2779
    /// If this is NULL then the default mapping based on the script is used.</param>
2780
    /// <param name="features">An array of pointers to the sets of typographic 
2781
    /// features to use in each feature range.</param>
2782
    /// <param name="featureRangeLengths">The length of each feature range, in characters.  
2783
    /// The sum of all lengths should be equal to textLength.</param>
2784
    /// <param name="featureRanges">The number of feature ranges.</param>
2785
    /// <param name="glyphAdvances">The advance width of each glyph.</param>
2786
    /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>
2787
    /// <returns>
2788
    /// Standard HRESULT error code.
2789
    /// </returns>
2790
    STDMETHOD(GetGlyphPlacements)(
2791
        __in_ecount(textLength) WCHAR const* textString,
2792
        __in_ecount(textLength) UINT16 const* clusterMap,
2793
        __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
2794
        UINT32 textLength,
2795
        __in_ecount(glyphCount) UINT16 const* glyphIndices,
2796
        __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
2797
        UINT32 glyphCount,
2798
        IDWriteFontFace * fontFace,
2799
        FLOAT fontEmSize,
2800
        BOOL isSideways,
2801
        BOOL isRightToLeft,
2802
        __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
2803
        __in_z_opt WCHAR const* localeName,
2804
        __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
2805
        __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
2806
        UINT32 featureRanges,
2807
        __out_ecount(glyphCount) FLOAT* glyphAdvances,
2808
        __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets
2809
        ) PURE;
2810
 
2811
    /// <summary>
2812
    /// Place glyphs output from the GetGlyphs method according to the font 
2813
    /// and the writing system's rendering rules.
2814
    /// </summary>
2815
    /// <param name="textString">The original string the glyphs came from.</param>
2816
    /// <param name="clusterMap">The mapping from character ranges to glyph 
2817
    /// ranges. Returned by GetGlyphs.</param>
2818
    /// <param name="textProps">Per-character properties. Returned by 
2819
    /// GetGlyphs.</param>
2820
    /// <param name="textLength">The length of textString.</param>
2821
    /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>
2822
    /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>
2823
    /// <param name="glyphCount">The number of glyphs.</param>
2824
    /// <param name="fontFace">The font face the glyphs came from.</param>
2825
    /// <param name="fontEmSize">Logical font size in DIP's.</param>
2826
    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 
2827
    /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
2828
    /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
2829
    /// scaling specified by the font size and pixelsPerDip.</param>
2830
    /// <param name="useGdiNatural">
2831
    /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.
2832
    /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font
2833
    /// created with CLEARTYPE_NATURAL_QUALITY.
2834
    /// </param>
2835
    /// <param name="isSideways">Set to true if the text is intended to be
2836
    /// drawn vertically.</param>
2837
    /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
2838
    /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
2839
    /// <param name="localeName">The locale to use when selecting glyphs.
2840
    /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
2841
    /// If this is NULL then the default mapping based on the script is used.</param>
2842
    /// <param name="features">An array of pointers to the sets of typographic 
2843
    /// features to use in each feature range.</param>
2844
    /// <param name="featureRangeLengths">The length of each feature range, in characters.  
2845
    /// The sum of all lengths should be equal to textLength.</param>
2846
    /// <param name="featureRanges">The number of feature ranges.</param>
2847
    /// <param name="glyphAdvances">The advance width of each glyph.</param>
2848
    /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>
2849
    /// <returns>
2850
    /// Standard HRESULT error code.
2851
    /// </returns>
2852
    STDMETHOD(GetGdiCompatibleGlyphPlacements)(
2853
        __in_ecount(textLength) WCHAR const* textString,
2854
        __in_ecount(textLength) UINT16 const* clusterMap,
2855
        __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
2856
        UINT32 textLength,
2857
        __in_ecount(glyphCount) UINT16 const* glyphIndices,
2858
        __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
2859
        UINT32 glyphCount,
2860
        IDWriteFontFace * fontFace,
2861
        FLOAT fontEmSize,
2862
        FLOAT pixelsPerDip,
2863
        __in_opt DWRITE_MATRIX const* transform,
2864
        BOOL useGdiNatural,
2865
        BOOL isSideways,
2866
        BOOL isRightToLeft,
2867
        __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
2868
        __in_z_opt WCHAR const* localeName,
2869
        __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
2870
        __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
2871
        UINT32 featureRanges,
2872
        __out_ecount(glyphCount) FLOAT* glyphAdvances,
2873
        __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets
2874
        ) PURE;
2875
};
2876
 
2877
/// <summary>
2878
/// The DWRITE_GLYPH_RUN structure contains the information needed by renderers
2879
/// to draw glyph runs. All coordinates are in device independent pixels (DIPs).
2880
/// </summary>
2881
struct DWRITE_GLYPH_RUN
2882
{
2883
    /// <summary>
2884
    /// The physical font face to draw with.
2885
    /// </summary>
2886
    __notnull IDWriteFontFace* fontFace;
2887
 
2888
    /// <summary>
2889
    /// Logical size of the font in DIPs, not points (equals 1/96 inch).
2890
    /// </summary>
2891
    FLOAT fontEmSize;
2892
 
2893
    /// <summary>
2894
    /// The number of glyphs.
2895
    /// </summary>
2896
    UINT32 glyphCount;
2897
 
2898
    /// <summary>
2899
    /// The indices to render.
2900
    /// </summary>    
2901
    __field_ecount(glyphCount) UINT16 const* glyphIndices;
2902
 
2903
    /// <summary>
2904
    /// Glyph advance widths.
2905
    /// </summary>
2906
    __field_ecount_opt(glyphCount) FLOAT const* glyphAdvances;
2907
 
2908
    /// <summary>
2909
    /// Glyph offsets.
2910
    /// </summary>
2911
    __field_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets;
2912
 
2913
    /// <summary>
2914
    /// If true, specifies that glyphs are rotated 90 degrees to the left and
2915
    /// vertical metrics are used. Vertical writing is achieved by specifying
2916
    /// isSideways = true and rotating the entire run 90 degrees to the right
2917
    /// via a rotate transform.
2918
    /// </summary>
2919
    BOOL isSideways;
2920
 
2921
    /// <summary>
2922
    /// The implicit resolved bidi level of the run. Odd levels indicate
2923
    /// right-to-left languages like Hebrew and Arabic, while even levels
2924
    /// indicate left-to-right languages like English and Japanese (when
2925
    /// written horizontally). For right-to-left languages, the text origin
2926
    /// is on the right, and text should be drawn to the left.
2927
    /// </summary>
2928
    UINT32 bidiLevel;
2929
};
2930
 
2931
/// <summary>
2932
/// The DWRITE_GLYPH_RUN_DESCRIPTION structure contains additional properties
2933
/// related to those in DWRITE_GLYPH_RUN.
2934
/// </summary>
2935
struct DWRITE_GLYPH_RUN_DESCRIPTION
2936
{
2937
    /// <summary>
2938
    /// The locale name associated with this run.
2939
    /// </summary>
2940
    __nullterminated WCHAR const* localeName;
2941
 
2942
    /// <summary>
2943
    /// The text associated with the glyphs.
2944
    /// </summary>
2945
    __field_ecount(stringLength) WCHAR const* string;
2946
 
2947
    /// <summary>
2948
    /// The number of characters (UTF16 code-units).
2949
    /// Note that this may be different than the number of glyphs.
2950
    /// </summary>
2951
    UINT32 stringLength;
2952
 
2953
    /// <summary>
2954
    /// An array of indices to the glyph indices array, of the first glyphs of
2955
    /// all the glyph clusters of the glyphs to render. 
2956
    /// </summary>
2957
    __field_ecount(stringLength) UINT16 const* clusterMap;
2958
 
2959
    /// <summary>
2960
    /// Corresponding text position in the original string
2961
    /// this glyph run came from.
2962
    /// </summary>
2963
    UINT32 textPosition;
2964
};
2965
 
2966
/// <summary>
2967
/// The DWRITE_UNDERLINE structure contains about the size and placement of 
2968
/// underlines. All coordinates are in device independent pixels (DIPs).
2969
/// </summary>
2970
struct DWRITE_UNDERLINE
2971
{
2972
    /// <summary>
2973
    /// Width of the underline, measured parallel to the baseline.
2974
    /// </summary>
2975
    FLOAT width;
2976
 
2977
    /// <summary>
2978
    /// Thickness of the underline, measured perpendicular to the
2979
    /// baseline.
2980
    /// </summary>
2981
    FLOAT thickness;
2982
 
2983
    /// <summary>
2984
    /// Offset of the underline from the baseline.
2985
    /// A positive offset represents a position below the baseline and
2986
    /// a negative offset is above.
2987
    /// </summary>
2988
    FLOAT offset;
2989
 
2990
    /// <summary>
2991
    /// Height of the tallest run where the underline applies.
2992
    /// </summary>
2993
    FLOAT runHeight;
2994
 
2995
    /// <summary>
2996
    /// Reading direction of the text associated with the underline.  This 
2997
    /// value is used to interpret whether the width value runs horizontally 
2998
    /// or vertically.
2999
    /// </summary>
3000
    DWRITE_READING_DIRECTION readingDirection;
3001
 
3002
    /// <summary>
3003
    /// Flow direction of the text associated with the underline.  This value
3004
    /// is used to interpret whether the thickness value advances top to 
3005
    /// bottom, left to right, or right to left.
3006
    /// </summary>
3007
    DWRITE_FLOW_DIRECTION flowDirection;
3008
 
3009
    /// <summary>
3010
    /// Locale of the text the underline is being drawn under. Can be
3011
    /// pertinent where the locale affects how the underline is drawn.
3012
    /// For example, in vertical text, the underline belongs on the
3013
    /// left for Chinese but on the right for Japanese.
3014
    /// This choice is completely left up to higher levels.
3015
    /// </summary>
3016
    __nullterminated WCHAR const* localeName;
3017
 
3018
    /// <summary>
3019
    /// The measuring mode can be useful to the renderer to determine how
3020
    /// underlines are rendered, e.g. rounding the thickness to a whole pixel
3021
    /// in GDI-compatible modes.
3022
    /// </summary>
3023
    DWRITE_MEASURING_MODE measuringMode;
3024
};
3025
 
3026
/// <summary>
3027
/// The DWRITE_STRIKETHROUGH structure contains about the size and placement of 
3028
/// strickthroughs. All coordinates are in device independent pixels (DIPs).
3029
/// </summary>
3030
struct DWRITE_STRIKETHROUGH
3031
{
3032
    /// <summary>
3033
    /// Width of the strikethrough, measured parallel to the baseline.
3034
    /// </summary>
3035
    FLOAT width;
3036
 
3037
    /// <summary>
3038
    /// Thickness of the strikethrough, measured perpendicular to the
3039
    /// baseline.
3040
    /// </summary>
3041
    FLOAT thickness;
3042
 
3043
    /// <summary>
3044
    /// Offset of the stikethrough from the baseline.
3045
    /// A positive offset represents a position below the baseline and
3046
    /// a negative offset is above.
3047
    /// </summary>
3048
    FLOAT offset;
3049
 
3050
    /// <summary>
3051
    /// Reading direction of the text associated with the strikethrough.  This
3052
    /// value is used to interpret whether the width value runs horizontally 
3053
    /// or vertically.
3054
    /// </summary>
3055
    DWRITE_READING_DIRECTION readingDirection;
3056
 
3057
    /// <summary>
3058
    /// Flow direction of the text associated with the strikethrough.  This 
3059
    /// value is used to interpret whether the thickness value advances top to
3060
    /// bottom, left to right, or right to left.
3061
    /// </summary>
3062
    DWRITE_FLOW_DIRECTION flowDirection;
3063
 
3064
    /// <summary>
3065
    /// Locale of the range. Can be pertinent where the locale affects the style.
3066
    /// </summary>
3067
    __nullterminated WCHAR const* localeName;
3068
 
3069
    /// <summary>
3070
    /// The measuring mode can be useful to the renderer to determine how
3071
    /// underlines are rendered, e.g. rounding the thickness to a whole pixel
3072
    /// in GDI-compatible modes.
3073
    /// </summary>
3074
    DWRITE_MEASURING_MODE measuringMode;
3075
};
3076
 
3077
/// <summary>
3078
/// The DWRITE_LINE_METRICS structure contains information about a formatted
3079
/// line of text.
3080
/// </summary>
3081
struct DWRITE_LINE_METRICS
3082
{
3083
    /// <summary>
3084
    /// The number of total text positions in the line.
3085
    /// This includes any trailing whitespace and newline characters.
3086
    /// </summary>
3087
    UINT32 length;
3088
 
3089
    /// <summary>
3090
    /// The number of whitespace positions at the end of the line.  Newline
3091
    /// sequences are considered whitespace.
3092
    /// </summary>
3093
    UINT32 trailingWhitespaceLength;
3094
 
3095
    /// <summary>
3096
    /// The number of characters in the newline sequence at the end of the line.
3097
    /// If the count is zero, then the line was either wrapped or it is the
3098
    /// end of the text.
3099
    /// </summary>
3100
    UINT32 newlineLength;
3101
 
3102
    /// <summary>
3103
    /// Height of the line as measured from top to bottom.
3104
    /// </summary>
3105
    FLOAT height;
3106
 
3107
    /// <summary>
3108
    /// Distance from the top of the line to its baseline.
3109
    /// </summary>
3110
    FLOAT baseline;
3111
 
3112
    /// <summary>
3113
    /// The line is trimmed.
3114
    /// </summary>
3115
    BOOL isTrimmed;
3116
};
3117
 
3118
 
3119
/// <summary>
3120
/// The DWRITE_CLUSTER_METRICS structure contains information about a glyph cluster.
3121
/// </summary>
3122
struct DWRITE_CLUSTER_METRICS
3123
{
3124
    /// <summary>
3125
    /// The total advance width of all glyphs in the cluster.
3126
    /// </summary>
3127
    FLOAT width;
3128
 
3129
    /// <summary>
3130
    /// The number of text positions in the cluster.
3131
    /// </summary>
3132
    UINT16 length;
3133
 
3134
    /// <summary>
3135
    /// Indicate whether line can be broken right after the cluster.
3136
    /// </summary>
3137
    UINT16 canWrapLineAfter : 1;
3138
 
3139
    /// <summary>
3140
    /// Indicate whether the cluster corresponds to whitespace character.
3141
    /// </summary>
3142
    UINT16 isWhitespace : 1;
3143
 
3144
    /// <summary>
3145
    /// Indicate whether the cluster corresponds to a newline character.
3146
    /// </summary>
3147
    UINT16 isNewline : 1;
3148
 
3149
    /// <summary>
3150
    /// Indicate whether the cluster corresponds to soft hyphen character.
3151
    /// </summary>
3152
    UINT16 isSoftHyphen : 1;
3153
 
3154
    /// <summary>
3155
    /// Indicate whether the cluster is read from right to left.
3156
    /// </summary>
3157
    UINT16 isRightToLeft : 1;
3158
 
3159
    UINT16 padding : 11;
3160
};
3161
 
3162
 
3163
/// <summary>
3164
/// Overall metrics associated with text after layout.
3165
/// All coordinates are in device independent pixels (DIPs).
3166
/// </summary>
3167
struct DWRITE_TEXT_METRICS
3168
{
3169
    /// <summary>
3170
    /// Left-most point of formatted text relative to layout box
3171
    /// (excluding any glyph overhang).
3172
    /// </summary>
3173
    FLOAT left;
3174
 
3175
    /// <summary>
3176
    /// Top-most point of formatted text relative to layout box
3177
    /// (excluding any glyph overhang).
3178
    /// </summary>
3179
    FLOAT top;
3180
 
3181
    /// <summary>
3182
    /// The width of the formatted text ignoring trailing whitespace
3183
    /// at the end of each line.
3184
    /// </summary>
3185
    FLOAT width;
3186
 
3187
    /// <summary>
3188
    /// The width of the formatted text taking into account the
3189
    /// trailing whitespace at the end of each line.
3190
    /// </summary>
3191
    FLOAT widthIncludingTrailingWhitespace;
3192
 
3193
    /// <summary>
3194
    /// The height of the formatted text. The height of an empty string
3195
    /// is determined by the size of the default font's line height.
3196
    /// </summary>
3197
    FLOAT height;
3198
 
3199
    /// <summary>
3200
    /// Initial width given to the layout. Depending on whether the text
3201
    /// was wrapped or not, it can be either larger or smaller than the
3202
    /// text content width.
3203
    /// </summary>
3204
    FLOAT layoutWidth;
3205
 
3206
    /// <summary>
3207
    /// Initial height given to the layout. Depending on the length of the
3208
    /// text, it may be larger or smaller than the text content height.
3209
    /// </summary>
3210
    FLOAT layoutHeight;
3211
 
3212
    /// <summary>
3213
    /// The maximum reordering count of any line of text, used
3214
    /// to calculate the most number of hit-testing boxes needed.
3215
    /// If the layout has no bidirectional text or no text at all,
3216
    /// the minimum level is 1.
3217
    /// </summary>
3218
    UINT32 maxBidiReorderingDepth;
3219
 
3220
    /// <summary>
3221
    /// Total number of lines.
3222
    /// </summary>
3223
    UINT32 lineCount;
3224
};
3225
 
3226
 
3227
/// <summary>
3228
/// Properties describing the geometric measurement of an
3229
/// application-defined inline object.
3230
/// </summary>
3231
struct DWRITE_INLINE_OBJECT_METRICS
3232
{
3233
    /// <summary>
3234
    /// Width of the inline object.
3235
    /// </summary>
3236
    FLOAT width;
3237
 
3238
    /// <summary>
3239
    /// Height of the inline object as measured from top to bottom.
3240
    /// </summary>
3241
    FLOAT height;
3242
 
3243
    /// <summary>
3244
    /// Distance from the top of the object to the baseline where it is lined up with the adjacent text.
3245
    /// If the baseline is at the bottom, baseline simply equals height.
3246
    /// </summary>
3247
    FLOAT baseline;
3248
 
3249
    /// <summary>
3250
    /// Flag indicating whether the object is to be placed upright or alongside the text baseline
3251
    /// for vertical text.
3252
    /// </summary>
3253
    BOOL  supportsSideways;
3254
};
3255
 
3256
 
3257
/// <summary>
3258
/// The DWRITE_OVERHANG_METRICS structure holds how much any visible pixels
3259
/// (in DIPs) overshoot each side of the layout or inline objects.
3260
/// </summary>
3261
/// <remarks>
3262
/// Positive overhangs indicate that the visible area extends outside the layout
3263
/// box or inline object, while negative values mean there is whitespace inside.
3264
/// The returned values are unaffected by rendering transforms or pixel snapping.
3265
/// Additionally, they may not exactly match final target's pixel bounds after
3266
/// applying grid fitting and hinting.
3267
/// </remarks>
3268
struct DWRITE_OVERHANG_METRICS
3269
{
3270
    /// <summary>
3271
    /// The distance from the left-most visible DIP to its left alignment edge.
3272
    /// </summary>
3273
    FLOAT left;
3274
 
3275
    /// <summary>
3276
    /// The distance from the top-most visible DIP to its top alignment edge.
3277
    /// </summary>
3278
    FLOAT top;
3279
 
3280
    /// <summary>
3281
    /// The distance from the right-most visible DIP to its right alignment edge.
3282
    /// </summary>
3283
    FLOAT right;
3284
 
3285
    /// <summary>
3286
    /// The distance from the bottom-most visible DIP to its bottom alignment edge.
3287
    /// </summary>
3288
    FLOAT bottom;
3289
};
3290
 
3291
 
3292
/// <summary>
3293
/// Geometry enclosing of text positions.
3294
/// </summary>
3295
struct DWRITE_HIT_TEST_METRICS
3296
{
3297
    /// <summary>
3298
    /// First text position within the geometry.
3299
    /// </summary>
3300
    UINT32 textPosition;
3301
 
3302
    /// <summary>
3303
    /// Number of text positions within the geometry.
3304
    /// </summary>
3305
    UINT32 length;
3306
 
3307
    /// <summary>
3308
    /// Left position of the top-left coordinate of the geometry.
3309
    /// </summary>
3310
    FLOAT left;
3311
 
3312
    /// <summary>
3313
    /// Top position of the top-left coordinate of the geometry.
3314
    /// </summary>
3315
    FLOAT top;
3316
 
3317
    /// <summary>
3318
    /// Geometry's width.
3319
    /// </summary>
3320
    FLOAT width;
3321
 
3322
    /// <summary>
3323
    /// Geometry's height.
3324
    /// </summary>
3325
    FLOAT height;
3326
 
3327
    /// <summary>
3328
    /// Bidi level of text positions enclosed within the geometry.
3329
    /// </summary>
3330
    UINT32 bidiLevel;
3331
 
3332
    /// <summary>
3333
    /// Geometry encloses text?
3334
    /// </summary>
3335
    BOOL isText;
3336
 
3337
    /// <summary>
3338
    /// Range is trimmed.
3339
    /// </summary>
3340
    BOOL isTrimmed;
3341
};
3342
 
3343
 
3344
interface IDWriteTextRenderer;
3345
 
3346
 
3347
/// <summary>
3348
/// The IDWriteInlineObject interface wraps an application defined inline graphic,
3349
/// allowing DWrite to query metrics as if it was a glyph inline with the text.
3350
/// </summary>
3351
interface DWRITE_DECLARE_INTERFACE("8339FDE3-106F-47ab-8373-1C6295EB10B3") IDWriteInlineObject : public IUnknown
3352
{
3353
    /// <summary>
3354
    /// The application implemented rendering callback (IDWriteTextRenderer::DrawInlineObject)
3355
    /// can use this to draw the inline object without needing to cast or query the object
3356
    /// type. The text layout does not call this method directly.
3357
    /// </summary>
3358
    /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
3359
    /// <param name="renderer">The renderer passed to IDWriteTextLayout::Draw as the object's containing parent.</param>
3360
    /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>
3361
    /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>
3362
    /// <param name="isSideways">The object should be drawn on its side.</param>
3363
    /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>
3364
    /// <param name="clientDrawingEffect">The drawing effect set in IDWriteTextLayout::SetDrawingEffect.</param>
3365
    /// <returns>
3366
    /// Standard HRESULT error code.
3367
    /// </returns>
3368
    STDMETHOD(Draw)(
3369
        __maybenull void* clientDrawingContext,
3370
        IDWriteTextRenderer* renderer,
3371
        FLOAT originX,
3372
        FLOAT originY,
3373
        BOOL isSideways,
3374
        BOOL isRightToLeft,
3375
        __maybenull IUnknown* clientDrawingEffect
3376
        ) PURE;
3377
 
3378
    /// <summary>
3379
    /// TextLayout calls this callback function to get the measurement of the inline object.
3380
    /// </summary>
3381
    /// <param name="metrics">Returned metrics</param>
3382
    /// <returns>
3383
    /// Standard HRESULT error code.
3384
    /// </returns>
3385
    STDMETHOD(GetMetrics)(
3386
        __out DWRITE_INLINE_OBJECT_METRICS* metrics
3387
        ) PURE;
3388
 
3389
    /// <summary>
3390
    /// TextLayout calls this callback function to get the visible extents (in DIPs) of the inline object.
3391
    /// In the case of a simple bitmap, with no padding and no overhang, all the overhangs will
3392
    /// simply be zeroes.
3393
    /// </summary>
3394
    /// <param name="overhangs">Overshoot of visible extents (in DIPs) outside the object.</param>
3395
    /// <returns>
3396
    /// Standard HRESULT error code.
3397
    /// </returns>
3398
    /// <remarks>
3399
    /// The overhangs should be returned relative to the reported size of the object
3400
    /// (DWRITE_INLINE_OBJECT_METRICS::width/height), and should not be baseline
3401
    /// adjusted. If you have an image that is actually 100x100 DIPs, but you want it
3402
    /// slightly inset (perhaps it has a glow) by 20 DIPs on each side, you would
3403
    /// return a width/height of 60x60 and four overhangs of 20 DIPs.
3404
    /// </remarks>
3405
    STDMETHOD(GetOverhangMetrics)(
3406
        __out DWRITE_OVERHANG_METRICS* overhangs
3407
        ) PURE;
3408
 
3409
    /// <summary>
3410
    /// Layout uses this to determine the line breaking behavior of the inline object
3411
    /// amidst the text.
3412
    /// </summary>
3413
    /// <param name="breakConditionBefore">Line-breaking condition between the object and the content immediately preceding it.</param>
3414
    /// <param name="breakConditionAfter" >Line-breaking condition between the object and the content immediately following it.</param>
3415
    /// <returns>
3416
    /// Standard HRESULT error code.
3417
    /// </returns>
3418
    STDMETHOD(GetBreakConditions)(
3419
        __out DWRITE_BREAK_CONDITION* breakConditionBefore,
3420
        __out DWRITE_BREAK_CONDITION* breakConditionAfter
3421
        ) PURE;
3422
};
3423
 
3424
/// <summary>
3425
/// The IDWritePixelSnapping interface defines the pixel snapping properties of a text renderer.
3426
/// </summary>
3427
interface DWRITE_DECLARE_INTERFACE("eaf3a2da-ecf4-4d24-b644-b34f6842024b") IDWritePixelSnapping : public IUnknown
3428
{
3429
    /// <summary>
3430
    /// Determines whether pixel snapping is disabled. The recommended default is FALSE,
3431
    /// unless doing animation that requires subpixel vertical placement.
3432
    /// </summary>
3433
    /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
3434
    /// <param name="isDisabled">Receives TRUE if pixel snapping is disabled or FALSE if it not.</param>
3435
    /// <returns>
3436
    /// Standard HRESULT error code.
3437
    /// </returns>
3438
    STDMETHOD(IsPixelSnappingDisabled)(
3439
        __maybenull void* clientDrawingContext,
3440
        __out BOOL* isDisabled
3441
        ) PURE;
3442
 
3443
    /// <summary>
3444
    /// Gets the current transform that maps abstract coordinates to DIPs,
3445
    /// which may disable pixel snapping upon any rotation or shear.
3446
    /// </summary>
3447
    /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
3448
    /// <param name="transform">Receives the transform.</param>
3449
    /// <returns>
3450
    /// Standard HRESULT error code.
3451
    /// </returns>
3452
    STDMETHOD(GetCurrentTransform)(
3453
        __maybenull void* clientDrawingContext,
3454
        __out DWRITE_MATRIX* transform
3455
        ) PURE;
3456
 
3457
    /// <summary>
3458
    /// Gets the number of physical pixels per DIP. A DIP (device-independent pixel) is 1/96 inch,
3459
    /// so the pixelsPerDip value is the number of logical pixels per inch divided by 96 (yielding
3460
    /// a value of 1 for 96 DPI and 1.25 for 120).
3461
    /// </summary>
3462
    /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
3463
    /// <param name="pixelsPerDip">Receives the number of physical pixels per DIP.</param>
3464
    /// <returns>
3465
    /// Standard HRESULT error code.
3466
    /// </returns>
3467
    STDMETHOD(GetPixelsPerDip)(
3468
        __maybenull void* clientDrawingContext,
3469
        __out FLOAT* pixelsPerDip
3470
        ) PURE;
3471
};
3472
 
3473
/// <summary>
3474
/// The IDWriteTextLayout interface represents a set of application-defined
3475
/// callbacks that perform rendering of text, inline objects, and decorations
3476
/// such as underlines.
3477
/// </summary>
3478
interface DWRITE_DECLARE_INTERFACE("ef8a8135-5cc6-45fe-8825-c5a0724eb819") IDWriteTextRenderer : public IDWritePixelSnapping
3479
{
3480
    /// <summary>
3481
    /// IDWriteTextLayout::Draw calls this function to instruct the client to
3482
    /// render a run of glyphs.
3483
    /// </summary>
3484
    /// <param name="clientDrawingContext">The context passed to 
3485
    /// IDWriteTextLayout::Draw.</param>
3486
    /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
3487
    /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
3488
    /// <param name="measuringMode">Specifies measuring method for glyphs in the run.
3489
    /// Renderer implementations may choose different rendering modes for given measuring methods,
3490
    /// but best results are seen when the rendering mode matches the corresponding measuring mode:
3491
    /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL
3492
    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC
3493
    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL
3494
    /// </param>
3495
    /// <param name="glyphRun">The glyph run to draw.</param>
3496
    /// <param name="glyphRunDescription">Properties of the characters 
3497
    /// associated with this run.</param>
3498
    /// <param name="clientDrawingEffect">The drawing effect set in
3499
    /// IDWriteTextLayout::SetDrawingEffect.</param>
3500
    /// <returns>
3501
    /// Standard HRESULT error code.
3502
    /// </returns>
3503
    STDMETHOD(DrawGlyphRun)(
3504
        __maybenull void* clientDrawingContext,
3505
        FLOAT baselineOriginX,
3506
        FLOAT baselineOriginY,
3507
        DWRITE_MEASURING_MODE measuringMode,
3508
        __in DWRITE_GLYPH_RUN const* glyphRun,
3509
        __in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
3510
        __maybenull IUnknown* clientDrawingEffect
3511
        ) PURE;
3512
 
3513
    /// <summary>
3514
    /// IDWriteTextLayout::Draw calls this function to instruct the client to draw
3515
    /// an underline.
3516
    /// </summary>
3517
    /// <param name="clientDrawingContext">The context passed to 
3518
    /// IDWriteTextLayout::Draw.</param>
3519
    /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
3520
    /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
3521
    /// <param name="underline">Underline logical information.</param>
3522
    /// <param name="clientDrawingEffect">The drawing effect set in
3523
    /// IDWriteTextLayout::SetDrawingEffect.</param>
3524
    /// <returns>
3525
    /// Standard HRESULT error code.
3526
    /// </returns>
3527
    /// <remarks>
3528
    /// A single underline can be broken into multiple calls, depending on
3529
    /// how the formatting changes attributes. If font sizes/styles change
3530
    /// within an underline, the thickness and offset will be averaged
3531
    /// weighted according to characters.
3532
    /// To get the correct top coordinate of the underline rect, add underline::offset
3533
    /// to the baseline's Y. Otherwise the underline will be immediately under the text.
3534
    /// The x coordinate will always be passed as the left side, regardless
3535
    /// of text directionality. This simplifies drawing and reduces the
3536
    /// problem of round-off that could potentially cause gaps or a double
3537
    /// stamped alpha blend. To avoid alpha overlap, round the end points
3538
    /// to the nearest device pixel.
3539
    /// </remarks>
3540
    STDMETHOD(DrawUnderline)(
3541
        __maybenull void* clientDrawingContext,
3542
        FLOAT baselineOriginX,
3543
        FLOAT baselineOriginY,
3544
        __in DWRITE_UNDERLINE const* underline,
3545
        __maybenull IUnknown* clientDrawingEffect
3546
        ) PURE;
3547
 
3548
    /// <summary>
3549
    /// IDWriteTextLayout::Draw calls this function to instruct the client to draw
3550
    /// a strikethrough.
3551
    /// </summary>
3552
    /// <param name="clientDrawingContext">The context passed to 
3553
    /// IDWriteTextLayout::Draw.</param>
3554
    /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
3555
    /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
3556
    /// <param name="strikethrough">Strikethrough logical information.</param>
3557
    /// <param name="clientDrawingEffect">The drawing effect set in
3558
    /// IDWriteTextLayout::SetDrawingEffect.</param>
3559
    /// <returns>
3560
    /// Standard HRESULT error code.
3561
    /// </returns>
3562
    /// <remarks>
3563
    /// A single strikethrough can be broken into multiple calls, depending on
3564
    /// how the formatting changes attributes. Strikethrough is not averaged
3565
    /// across font sizes/styles changes.
3566
    /// To get the correct top coordinate of the strikethrough rect,
3567
    /// add strikethrough::offset to the baseline's Y.
3568
    /// Like underlines, the x coordinate will always be passed as the left side,
3569
    /// regardless of text directionality.
3570
    /// </remarks>
3571
    STDMETHOD(DrawStrikethrough)(
3572
        __maybenull void* clientDrawingContext,
3573
        FLOAT baselineOriginX,
3574
        FLOAT baselineOriginY,
3575
        __in DWRITE_STRIKETHROUGH const* strikethrough,
3576
        __maybenull IUnknown* clientDrawingEffect
3577
        ) PURE;
3578
 
3579
    /// <summary>
3580
    /// IDWriteTextLayout::Draw calls this application callback when it needs to
3581
    /// draw an inline object.
3582
    /// </summary>
3583
    /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
3584
    /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>
3585
    /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>
3586
    /// <param name="inlineObject">The object set using IDWriteTextLayout::SetInlineObject.</param>
3587
    /// <param name="isSideways">The object should be drawn on its side.</param>
3588
    /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>
3589
    /// <param name="clientDrawingEffect">The drawing effect set in
3590
    /// IDWriteTextLayout::SetDrawingEffect.</param>
3591
    /// <returns>
3592
    /// Standard HRESULT error code.
3593
    /// </returns>
3594
    /// <remarks>
3595
    /// The right-to-left flag is a hint for those cases where it would look
3596
    /// strange for the image to be shown normally (like an arrow pointing to
3597
    /// right to indicate a submenu).
3598
    /// </remarks>
3599
    STDMETHOD(DrawInlineObject)(
3600
        __maybenull void* clientDrawingContext,
3601
        FLOAT originX,
3602
        FLOAT originY,
3603
        IDWriteInlineObject* inlineObject,
3604
        BOOL isSideways,
3605
        BOOL isRightToLeft,
3606
        __maybenull IUnknown* clientDrawingEffect
3607
        ) PURE;
3608
};
3609
 
3610
/// <summary>
3611
/// The IDWriteTextLayout interface represents a block of text after it has
3612
/// been fully analyzed and formatted.
3613
///
3614
/// All coordinates are in device independent pixels (DIPs).
3615
/// </summary>
3616
interface DWRITE_DECLARE_INTERFACE("53737037-6d14-410b-9bfe-0b182bb70961") IDWriteTextLayout : public IDWriteTextFormat
3617
{
3618
    /// <summary>
3619
    /// Set layout maximum width
3620
    /// </summary>
3621
    /// <param name="maxWidth">Layout maximum width</param>
3622
    /// <returns>
3623
    /// Standard HRESULT error code.
3624
    /// </returns>
3625
    STDMETHOD(SetMaxWidth)(
3626
        FLOAT maxWidth
3627
        ) PURE;
3628
 
3629
    /// <summary>
3630
    /// Set layout maximum height
3631
    /// </summary>
3632
    /// <param name="maxHeight">Layout maximum height</param>
3633
    /// <returns>
3634
    /// Standard HRESULT error code.
3635
    /// </returns>
3636
    STDMETHOD(SetMaxHeight)(
3637
        FLOAT maxHeight
3638
        ) PURE;
3639
 
3640
    /// <summary>
3641
    /// Set the font collection.
3642
    /// </summary>
3643
    /// <param name="fontCollection">The font collection to set</param>
3644
    /// <param name="textRange">Text range to which this change applies.</param>
3645
    /// <returns>
3646
    /// Standard HRESULT error code.
3647
    /// </returns>
3648
    STDMETHOD(SetFontCollection)(
3649
        IDWriteFontCollection* fontCollection,
3650
        DWRITE_TEXT_RANGE textRange
3651
        ) PURE;
3652
 
3653
    /// <summary>
3654
    /// Set null-terminated font family name.
3655
    /// </summary>
3656
    /// <param name="fontFamilyName">Font family name</param>
3657
    /// <param name="textRange">Text range to which this change applies.</param>
3658
    /// <returns>
3659
    /// Standard HRESULT error code.
3660
    /// </returns>
3661
    STDMETHOD(SetFontFamilyName)(
3662
        __in_z WCHAR const* fontFamilyName,
3663
        DWRITE_TEXT_RANGE textRange
3664
        ) PURE;
3665
 
3666
    /// <summary>
3667
    /// Set font weight.
3668
    /// </summary>
3669
    /// <param name="fontWeight">Font weight</param>
3670
    /// <param name="textRange">Text range to which this change applies.</param>
3671
    /// <returns>
3672
    /// Standard HRESULT error code.
3673
    /// </returns>
3674
    STDMETHOD(SetFontWeight)(
3675
        DWRITE_FONT_WEIGHT fontWeight,
3676
        DWRITE_TEXT_RANGE textRange
3677
        ) PURE;
3678
 
3679
    /// <summary>
3680
    /// Set font style.
3681
    /// </summary>
3682
    /// <param name="fontStyle">Font style</param>
3683
    /// <param name="textRange">Text range to which this change applies.</param>
3684
    /// <returns>
3685
    /// Standard HRESULT error code.
3686
    /// </returns>
3687
    STDMETHOD(SetFontStyle)(
3688
        DWRITE_FONT_STYLE fontStyle,
3689
        DWRITE_TEXT_RANGE textRange
3690
        ) PURE;
3691
 
3692
    /// <summary>
3693
    /// Set font stretch.
3694
    /// </summary>
3695
    /// <param name="fontStretch">font stretch</param>
3696
    /// <param name="textRange">Text range to which this change applies.</param>
3697
    /// <returns>
3698
    /// Standard HRESULT error code.
3699
    /// </returns>
3700
    STDMETHOD(SetFontStretch)(
3701
        DWRITE_FONT_STRETCH fontStretch,
3702
        DWRITE_TEXT_RANGE textRange
3703
        ) PURE;
3704
 
3705
    /// <summary>
3706
    /// Set font em height.
3707
    /// </summary>
3708
    /// <param name="fontSize">Font em height</param>
3709
    /// <param name="textRange">Text range to which this change applies.</param>
3710
    /// <returns>
3711
    /// Standard HRESULT error code.
3712
    /// </returns>
3713
    STDMETHOD(SetFontSize)(
3714
        FLOAT fontSize,
3715
        DWRITE_TEXT_RANGE textRange
3716
        ) PURE;
3717
 
3718
    /// <summary>
3719
    /// Set underline.
3720
    /// </summary>
3721
    /// <param name="hasUnderline">The Boolean flag indicates whether underline takes place</param>
3722
    /// <param name="textRange">Text range to which this change applies.</param>
3723
    /// <returns>
3724
    /// Standard HRESULT error code.
3725
    /// </returns>
3726
    STDMETHOD(SetUnderline)(
3727
        BOOL hasUnderline,
3728
        DWRITE_TEXT_RANGE textRange
3729
        ) PURE;
3730
 
3731
    /// <summary>
3732
    /// Set strikethrough.
3733
    /// </summary>
3734
    /// <param name="hasStrikethrough">The Boolean flag indicates whether strikethrough takes place</param>
3735
    /// <param name="textRange">Text range to which this change applies.</param>
3736
    /// <returns>
3737
    /// Standard HRESULT error code.
3738
    /// </returns>
3739
    STDMETHOD(SetStrikethrough)(
3740
        BOOL hasStrikethrough,
3741
        DWRITE_TEXT_RANGE textRange
3742
        ) PURE;
3743
 
3744
    /// <summary>
3745
    /// Set application-defined drawing effect.
3746
    /// </summary>
3747
    /// <param name="drawingEffect">Pointer to an application-defined drawing effect.</param>
3748
    /// <param name="textRange">Text range to which this change applies.</param>
3749
    /// <returns>
3750
    /// Standard HRESULT error code.
3751
    /// </returns>
3752
    /// <remarks>
3753
    /// This drawing effect is associated with the specified range and will be passed back
3754
    /// to the application via the callback when the range is drawn at drawing time.
3755
    /// </remarks>
3756
    STDMETHOD(SetDrawingEffect)(
3757
        IUnknown* drawingEffect,
3758
        DWRITE_TEXT_RANGE textRange
3759
        ) PURE;
3760
 
3761
    /// <summary>
3762
    /// Set inline object.
3763
    /// </summary>
3764
    /// <param name="inlineObject">Pointer to an application-implemented inline object.</param>
3765
    /// <param name="textRange">Text range to which this change applies.</param>
3766
    /// <returns>
3767
    /// Standard HRESULT error code.
3768
    /// </returns>
3769
    /// <remarks>
3770
    /// This inline object applies to the specified range and will be passed back
3771
    /// to the application via the DrawInlineObject callback when the range is drawn.
3772
    /// Any text in that range will be suppressed.
3773
    /// </remarks>
3774
    STDMETHOD(SetInlineObject)(
3775
        IDWriteInlineObject* inlineObject,
3776
        DWRITE_TEXT_RANGE textRange
3777
        ) PURE;
3778
 
3779
    /// <summary>
3780
    /// Set font typography features.
3781
    /// </summary>
3782
    /// <param name="typography">Pointer to font typography setting.</param>
3783
    /// <param name="textRange">Text range to which this change applies.</param>
3784
    /// <returns>
3785
    /// Standard HRESULT error code.
3786
    /// </returns>
3787
    STDMETHOD(SetTypography)(
3788
        IDWriteTypography* typography,
3789
        DWRITE_TEXT_RANGE textRange
3790
        ) PURE;
3791
 
3792
    /// <summary>
3793
    /// Set locale name.
3794
    /// </summary>
3795
    /// <param name="localeName">Locale name</param>
3796
    /// <param name="textRange">Text range to which this change applies.</param>
3797
    /// <returns>
3798
    /// Standard HRESULT error code.
3799
    /// </returns>
3800
    STDMETHOD(SetLocaleName)(
3801
        __in_z WCHAR const* localeName,
3802
        DWRITE_TEXT_RANGE textRange
3803
        ) PURE;
3804
 
3805
    /// <summary>
3806
    /// Get layout maximum width
3807
    /// </summary>
3808
    STDMETHOD_(FLOAT, GetMaxWidth)() PURE;
3809
 
3810
    /// <summary>
3811
    /// Get layout maximum height
3812
    /// </summary>
3813
    STDMETHOD_(FLOAT, GetMaxHeight)() PURE;
3814
 
3815
    /// <summary>
3816
    /// Get the font collection where the current position is at.
3817
    /// </summary>
3818
    /// <param name="currentPosition">The current text position.</param>
3819
    /// <param name="fontCollection">The current font collection</param>
3820
    /// <param name="textRange">Text range to which this change applies.</param>
3821
    /// <returns>
3822
    /// Standard HRESULT error code.
3823
    /// </returns>
3824
    STDMETHOD(GetFontCollection)(
3825
        UINT32 currentPosition,
3826
        __out IDWriteFontCollection** fontCollection,
3827
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3828
        ) PURE;
3829
 
3830
    /// <summary>
3831
    /// Get the length of the font family name where the current position is at.
3832
    /// </summary>
3833
    /// <param name="currentPosition">The current text position.</param>
3834
    /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>
3835
    /// <param name="textRange">The position range of the current format.</param>
3836
    /// <returns>
3837
    /// Standard HRESULT error code.
3838
    /// </returns>
3839
    STDMETHOD(GetFontFamilyNameLength)(
3840
        UINT32 currentPosition,
3841
        __out UINT32* nameLength,
3842
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3843
        ) PURE;
3844
 
3845
    /// <summary>
3846
    /// Copy the font family name where the current position is at.
3847
    /// </summary>
3848
    /// <param name="currentPosition">The current text position.</param>
3849
    /// <param name="fontFamilyName">Character array that receives the current font family name</param>
3850
    /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
3851
    /// <param name="textRange">The position range of the current format.</param>
3852
    /// <returns>
3853
    /// Standard HRESULT error code.
3854
    /// </returns>
3855
    STDMETHOD(GetFontFamilyName)(
3856
        UINT32 currentPosition,
3857
        __out_ecount_z(nameSize) WCHAR* fontFamilyName,
3858
        UINT32 nameSize,
3859
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3860
        ) PURE;
3861
 
3862
    /// <summary>
3863
    /// Get the font weight where the current position is at.
3864
    /// </summary>
3865
    /// <param name="currentPosition">The current text position.</param>
3866
    /// <param name="fontWeight">The current font weight</param>
3867
    /// <param name="textRange">The position range of the current format.</param>
3868
    /// <returns>
3869
    /// Standard HRESULT error code.
3870
    /// </returns>
3871
    STDMETHOD(GetFontWeight)(
3872
        UINT32 currentPosition,
3873
        __out DWRITE_FONT_WEIGHT* fontWeight,
3874
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3875
        ) PURE;
3876
 
3877
    /// <summary>
3878
    /// Get the font style where the current position is at.
3879
    /// </summary>
3880
    /// <param name="currentPosition">The current text position.</param>
3881
    /// <param name="fontStyle">The current font style</param>
3882
    /// <param name="textRange">The position range of the current format.</param>
3883
    /// <returns>
3884
    /// Standard HRESULT error code.
3885
    /// </returns>
3886
    STDMETHOD(GetFontStyle)(
3887
        UINT32 currentPosition,
3888
        __out DWRITE_FONT_STYLE* fontStyle,
3889
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3890
        ) PURE;
3891
 
3892
    /// <summary>
3893
    /// Get the font stretch where the current position is at.
3894
    /// </summary>
3895
    /// <param name="currentPosition">The current text position.</param>
3896
    /// <param name="fontStretch">The current font stretch</param>
3897
    /// <param name="textRange">The position range of the current format.</param>
3898
    /// <returns>
3899
    /// Standard HRESULT error code.
3900
    /// </returns>
3901
    STDMETHOD(GetFontStretch)(
3902
        UINT32 currentPosition,
3903
        __out DWRITE_FONT_STRETCH* fontStretch,
3904
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3905
        ) PURE;
3906
 
3907
    /// <summary>
3908
    /// Get the font em height where the current position is at.
3909
    /// </summary>
3910
    /// <param name="currentPosition">The current text position.</param>
3911
    /// <param name="fontSize">The current font em height</param>
3912
    /// <param name="textRange">The position range of the current format.</param>
3913
    /// <returns>
3914
    /// Standard HRESULT error code.
3915
    /// </returns>
3916
    STDMETHOD(GetFontSize)(
3917
        UINT32 currentPosition,
3918
        __out FLOAT* fontSize,
3919
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3920
        ) PURE;
3921
 
3922
    /// <summary>
3923
    /// Get the underline presence where the current position is at.
3924
    /// </summary>
3925
    /// <param name="currentPosition">The current text position.</param>
3926
    /// <param name="hasUnderline">The Boolean flag indicates whether text is underlined.</param>
3927
    /// <param name="textRange">The position range of the current format.</param>
3928
    /// <returns>
3929
    /// Standard HRESULT error code.
3930
    /// </returns>
3931
    STDMETHOD(GetUnderline)(
3932
        UINT32 currentPosition,
3933
        __out BOOL* hasUnderline,
3934
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3935
        ) PURE;
3936
 
3937
    /// <summary>
3938
    /// Get the strikethrough presence where the current position is at.
3939
    /// </summary>
3940
    /// <param name="currentPosition">The current text position.</param>
3941
    /// <param name="hasStrikethrough">The Boolean flag indicates whether text has strikethrough.</param>
3942
    /// <param name="textRange">The position range of the current format.</param>
3943
    /// <returns>
3944
    /// Standard HRESULT error code.
3945
    /// </returns>
3946
    STDMETHOD(GetStrikethrough)(
3947
        UINT32 currentPosition,
3948
        __out BOOL* hasStrikethrough,
3949
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3950
        ) PURE;
3951
 
3952
    /// <summary>
3953
    /// Get the application-defined drawing effect where the current position is at.
3954
    /// </summary>
3955
    /// <param name="currentPosition">The current text position.</param>
3956
    /// <param name="drawingEffect">The current application-defined drawing effect.</param>
3957
    /// <param name="textRange">The position range of the current format.</param>
3958
    /// <returns>
3959
    /// Standard HRESULT error code.
3960
    /// </returns>
3961
    STDMETHOD(GetDrawingEffect)(
3962
        UINT32 currentPosition,
3963
        __out IUnknown** drawingEffect,
3964
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3965
        ) PURE;
3966
 
3967
    /// <summary>
3968
    /// Get the inline object at the given position.
3969
    /// </summary>
3970
    /// <param name="currentPosition">The given text position.</param>
3971
    /// <param name="inlineObject">The inline object.</param>
3972
    /// <param name="textRange">The position range of the current format.</param>
3973
    /// <returns>
3974
    /// Standard HRESULT error code.
3975
    /// </returns>
3976
    STDMETHOD(GetInlineObject)(
3977
        UINT32 currentPosition,
3978
        __out IDWriteInlineObject** inlineObject,
3979
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3980
        ) PURE;
3981
 
3982
    /// <summary>
3983
    /// Get the typography setting where the current position is at.
3984
    /// </summary>
3985
    /// <param name="currentPosition">The current text position.</param>
3986
    /// <param name="typography">The current typography setting.</param>
3987
    /// <param name="textRange">The position range of the current format.</param>
3988
    /// <returns>
3989
    /// Standard HRESULT error code.
3990
    /// </returns>
3991
    STDMETHOD(GetTypography)(
3992
        UINT32 currentPosition,
3993
        __out IDWriteTypography** typography,
3994
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
3995
        ) PURE;
3996
 
3997
    /// <summary>
3998
    /// Get the length of the locale name where the current position is at.
3999
    /// </summary>
4000
    /// <param name="currentPosition">The current text position.</param>
4001
    /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>
4002
    /// <param name="textRange">The position range of the current format.</param>
4003
    /// <returns>
4004
    /// Standard HRESULT error code.
4005
    /// </returns>
4006
    STDMETHOD(GetLocaleNameLength)(
4007
        UINT32 currentPosition,
4008
        __out UINT32* nameLength,
4009
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
4010
        ) PURE;
4011
 
4012
    /// <summary>
4013
    /// Get the locale name where the current position is at.
4014
    /// </summary>
4015
    /// <param name="currentPosition">The current text position.</param>
4016
    /// <param name="localeName">Character array that receives the current locale name</param>
4017
    /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
4018
    /// <param name="textRange">The position range of the current format.</param>
4019
    /// <returns>
4020
    /// Standard HRESULT error code.
4021
    /// </returns>
4022
    STDMETHOD(GetLocaleName)(
4023
        UINT32 currentPosition,
4024
        __out_ecount_z(nameSize) WCHAR* localeName,
4025
        UINT32 nameSize,
4026
        __out_opt DWRITE_TEXT_RANGE* textRange = NULL
4027
        ) PURE;
4028
 
4029
    /// <summary>
4030
    /// Initiate drawing of the text.
4031
    /// </summary>
4032
    /// <param name="clientDrawingContext">An application defined value
4033
    /// included in rendering callbacks.</param>
4034
    /// <param name="renderer">The set of application-defined callbacks that do
4035
    /// the actual rendering.</param>
4036
    /// <param name="originX">X-coordinate of the layout's left side.</param>
4037
    /// <param name="originY">Y-coordinate of the layout's top side.</param>
4038
    /// <returns>
4039
    /// Standard HRESULT error code.
4040
    /// </returns>
4041
    STDMETHOD(Draw)(
4042
        __maybenull void* clientDrawingContext,
4043
        IDWriteTextRenderer* renderer,
4044
        FLOAT originX,
4045
        FLOAT originY
4046
        ) PURE;
4047
 
4048
    /// <summary>
4049
    /// GetLineMetrics returns properties of each line.
4050
    /// </summary>
4051
    /// <param name="lineMetrics">The array to fill with line information.</param>
4052
    /// <param name="maxLineCount">The maximum size of the lineMetrics array.</param>
4053
    /// <param name="actualLineCount">The actual size of the lineMetrics
4054
    /// array that is needed.</param>
4055
    /// <returns>
4056
    /// Standard HRESULT error code.
4057
    /// </returns>
4058
    /// <remarks>
4059
    /// If maxLineCount is not large enough E_NOT_SUFFICIENT_BUFFER, 
4060
    /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
4061
    /// is returned and *actualLineCount is set to the number of lines
4062
    /// needed.
4063
    /// </remarks>
4064
    STDMETHOD(GetLineMetrics)(
4065
        __out_ecount_opt(maxLineCount) DWRITE_LINE_METRICS* lineMetrics,
4066
        UINT32 maxLineCount,
4067
        __out UINT32* actualLineCount
4068
        ) PURE;
4069
 
4070
    /// <summary>
4071
    /// GetMetrics retrieves overall metrics for the formatted string.
4072
    /// </summary>
4073
    /// <param name="textMetrics">The returned metrics.</param>
4074
    /// <returns>
4075
    /// Standard HRESULT error code.
4076
    /// </returns>
4077
    /// <remarks>
4078
    /// Drawing effects like underline and strikethrough do not contribute
4079
    /// to the text size, which is essentially the sum of advance widths and
4080
    /// line heights. Additionally, visible swashes and other graphic
4081
    /// adornments may extend outside the returned width and height.
4082
    /// </remarks>
4083
    STDMETHOD(GetMetrics)(
4084
        __out DWRITE_TEXT_METRICS* textMetrics
4085
        ) PURE;
4086
 
4087
    /// <summary>
4088
    /// GetOverhangMetrics returns the overhangs (in DIPs) of the layout and all
4089
    /// objects contained in it, including text glyphs and inline objects.
4090
    /// </summary>
4091
    /// <param name="overhangs">Overshoots of visible extents (in DIPs) outside the layout.</param>
4092
    /// <returns>
4093
    /// Standard HRESULT error code.
4094
    /// </returns>
4095
    /// <remarks>
4096
    /// Any underline and strikethrough do not contribute to the black box
4097
    /// determination, since these are actually drawn by the renderer, which
4098
    /// is allowed to draw them in any variety of styles.
4099
    /// </remarks>
4100
    STDMETHOD(GetOverhangMetrics)(
4101
        __out DWRITE_OVERHANG_METRICS* overhangs
4102
        ) PURE;
4103
 
4104
    /// <summary>
4105
    /// Retrieve logical properties and measurement of each cluster.
4106
    /// </summary>
4107
    /// <param name="clusterMetrics">The array to fill with cluster information.</param>
4108
    /// <param name="maxClusterCount">The maximum size of the clusterMetrics array.</param>
4109
    /// <param name="actualClusterCount">The actual size of the clusterMetrics array that is needed.</param>
4110
    /// <returns>
4111
    /// Standard HRESULT error code.
4112
    /// </returns>
4113
    /// <remarks>
4114
    /// If maxClusterCount is not large enough E_NOT_SUFFICIENT_BUFFER, 
4115
    /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), 
4116
    /// is returned and *actualClusterCount is set to the number of clusters
4117
    /// needed.
4118
    /// </remarks>
4119
    STDMETHOD(GetClusterMetrics)(
4120
        __out_ecount_opt(maxClusterCount) DWRITE_CLUSTER_METRICS* clusterMetrics,
4121
        UINT32 maxClusterCount,
4122
        __out UINT32* actualClusterCount
4123
        ) PURE;
4124
 
4125
    /// <summary>
4126
    /// Determines the minimum possible width the layout can be set to without
4127
    /// emergency breaking between the characters of whole words.
4128
    /// </summary>
4129
    /// <param name="minWidth">Minimum width.</param>
4130
    /// <returns>
4131
    /// Standard HRESULT error code.
4132
    /// </returns>
4133
    STDMETHOD(DetermineMinWidth)(
4134
        __out FLOAT* minWidth
4135
        ) PURE;
4136
 
4137
    /// <summary>
4138
    /// Given a coordinate (in DIPs) relative to the top-left of the layout box,
4139
    /// this returns the corresponding hit-test metrics of the text string where
4140
    /// the hit-test has occurred. This is useful for mapping mouse clicks to caret
4141
    /// positions. When the given coordinate is outside the text string, the function
4142
    /// sets the output value *isInside to false but returns the nearest character
4143
    /// position.
4144
    /// </summary>
4145
    /// <param name="pointX">X coordinate to hit-test, relative to the top-left location of the layout box.</param>
4146
    /// <param name="pointY">Y coordinate to hit-test, relative to the top-left location of the layout box.</param>
4147
    /// <param name="isTrailingHit">Output flag indicating whether the hit-test location is at the leading or the trailing
4148
    ///     side of the character. When the output *isInside value is set to false, this value is set according to the output
4149
    ///     *position value to represent the edge closest to the hit-test location. </param>
4150
    /// <param name="isInside">Output flag indicating whether the hit-test location is inside the text string.
4151
    ///     When false, the position nearest the text's edge is returned.</param>
4152
    /// <param name="hitTestMetrics">Output geometry fully enclosing the hit-test location. When the output *isInside value
4153
    ///     is set to false, this structure represents the geometry enclosing the edge closest to the hit-test location.</param>
4154
    /// <returns>
4155
    /// Standard HRESULT error code.
4156
    /// </returns>
4157
    STDMETHOD(HitTestPoint)(
4158
        FLOAT pointX,
4159
        FLOAT pointY,
4160
        __out BOOL* isTrailingHit,
4161
        __out BOOL* isInside,
4162
        __out DWRITE_HIT_TEST_METRICS* hitTestMetrics
4163
        ) PURE;
4164
 
4165
    /// <summary>
4166
    /// Given a text position and whether the caret is on the leading or trailing
4167
    /// edge of that position, this returns the corresponding coordinate (in DIPs)
4168
    /// relative to the top-left of the layout box. This is most useful for drawing
4169
    /// the caret's current position, but it could also be used to anchor an IME to the
4170
    /// typed text or attach a floating menu near the point of interest. It may also be
4171
    /// used to programmatically obtain the geometry of a particular text position
4172
    /// for UI automation.
4173
    /// </summary>
4174
    /// <param name="textPosition">Text position to get the coordinate of.</param>
4175
    /// <param name="isTrailingHit">Flag indicating whether the location is of the leading or the trailing side of the specified text position. </param>
4176
    /// <param name="pointX">Output caret X, relative to the top-left of the layout box.</param>
4177
    /// <param name="pointY">Output caret Y, relative to the top-left of the layout box.</param>
4178
    /// <param name="hitTestMetrics">Output geometry fully enclosing the specified text position.</param>
4179
    /// <returns>
4180
    /// Standard HRESULT error code.
4181
    /// </returns>
4182
    /// <remarks>
4183
    /// When drawing a caret at the returned X,Y, it should should be centered on X
4184
    /// and drawn from the Y coordinate down. The height will be the size of the
4185
    /// hit-tested text (which can vary in size within a line).
4186
    /// Reading direction also affects which side of the character the caret is drawn.
4187
    /// However, the returned X coordinate will be correct for either case.
4188
    /// You can get a text length back that is larger than a single character.
4189
    /// This happens for complex scripts when multiple characters form a single cluster,
4190
    /// when diacritics join their base character, or when you test a surrogate pair.
4191
    /// </remarks>
4192
    STDMETHOD(HitTestTextPosition)(
4193
        UINT32 textPosition,
4194
        BOOL isTrailingHit,
4195
        __out FLOAT* pointX,
4196
        __out FLOAT* pointY,
4197
        __out DWRITE_HIT_TEST_METRICS* hitTestMetrics
4198
        ) PURE;
4199
 
4200
    /// <summary>
4201
    /// The application calls this function to get a set of hit-test metrics
4202
    /// corresponding to a range of text positions. The main usage for this
4203
    /// is to draw highlighted selection of the text string.
4204
    ///
4205
    /// The function returns E_NOT_SUFFICIENT_BUFFER, which is equivalent to 
4206
    /// HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), when the buffer size of
4207
    /// hitTestMetrics is too small to hold all the regions calculated by the
4208
    /// function. In such situation, the function sets the output value
4209
    /// *actualHitTestMetricsCount to the number of geometries calculated.
4210
    /// The application is responsible to allocate a new buffer of greater
4211
    /// size and call the function again.
4212
    ///
4213
    /// A good value to use as an initial value for maxHitTestMetricsCount may
4214
    /// be calculated from the following equation:
4215
    ///     maxHitTestMetricsCount = lineCount * maxBidiReorderingDepth
4216
    ///
4217
    /// where lineCount is obtained from the value of the output argument
4218
    /// *actualLineCount from the function IDWriteTextLayout::GetLineMetrics,
4219
    /// and the maxBidiReorderingDepth value from the DWRITE_TEXT_METRICS
4220
    /// structure of the output argument *textMetrics from the function
4221
    /// IDWriteFactory::CreateTextLayout.
4222
    /// </summary>
4223
    /// <param name="textPosition">First text position of the specified range.</param>
4224
    /// <param name="textLength">Number of positions of the specified range.</param>
4225
    /// <param name="originX">Offset of the X origin (left of the layout box) which is added to each of the hit-test metrics returned.</param>
4226
    /// <param name="originY">Offset of the Y origin (top of the layout box) which is added to each of the hit-test metrics returned.</param>
4227
    /// <param name="hitTestMetrics">Pointer to a buffer of the output geometry fully enclosing the specified position range.</param>
4228
    /// <param name="maxHitTestMetricsCount">Maximum number of distinct metrics it could hold in its buffer memory.</param>
4229
    /// <param name="actualHitTestMetricsCount">Actual number of metrics returned or needed.</param>
4230
    /// <returns>
4231
    /// Standard HRESULT error code.
4232
    /// </returns>
4233
    /// <remarks>
4234
    /// There are no gaps in the returned metrics. While there could be visual gaps,
4235
    /// depending on bidi ordering, each range is contiguous and reports all the text,
4236
    /// including any hidden characters and trimmed text.
4237
    /// The height of each returned range will be the same within each line, regardless
4238
    /// of how the font sizes vary.
4239
    /// </remarks>
4240
    STDMETHOD(HitTestTextRange)(
4241
        UINT32 textPosition,
4242
        UINT32 textLength,
4243
        FLOAT originX,
4244
        FLOAT originY,
4245
        __out_ecount_opt(maxHitTestMetricsCount) DWRITE_HIT_TEST_METRICS* hitTestMetrics,
4246
        UINT32 maxHitTestMetricsCount,
4247
        __out UINT32* actualHitTestMetricsCount
4248
        ) PURE;
4249
};
4250
 
4251
/// <summary>
4252
/// Encapsulates a 32-bit device independent bitmap and device context, which can be used for rendering glyphs.
4253
/// </summary>
4254
interface DWRITE_DECLARE_INTERFACE("5e5a32a3-8dff-4773-9ff6-0696eab77267") IDWriteBitmapRenderTarget : public IUnknown
4255
{
4256
    /// <summary>
4257
    /// Draws a run of glyphs to the bitmap.
4258
    /// </summary>
4259
    /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>
4260
    /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>
4261
    /// <param name="measuringMode">Specifies measuring method for glyphs in the run.
4262
    /// Renderer implementations may choose different rendering modes for different measuring methods, for example
4263
    /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL,
4264
    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC, and
4265
    /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL.
4266
    /// </param>
4267
    /// <param name="glyphRun">Structure containing the properties of the glyph run.</param>
4268
    /// <param name="renderingParams">Object that controls rendering behavior.</param>
4269
    /// <param name="textColor">Specifies the foreground color of the text.</param>
4270
    /// <param name="blackBoxRect">Optional rectangle that receives the bounding box (in pixels not DIPs) of all the pixels affected by 
4271
    /// drawing the glyph run. The black box rectangle may extend beyond the dimensions of the bitmap.</param>
4272
    /// <returns>
4273
    /// Standard HRESULT error code.
4274
    /// </returns>
4275
    STDMETHOD(DrawGlyphRun)(
4276
        FLOAT baselineOriginX,
4277
        FLOAT baselineOriginY,
4278
        DWRITE_MEASURING_MODE measuringMode,
4279
        __in DWRITE_GLYPH_RUN const* glyphRun,
4280
        IDWriteRenderingParams* renderingParams,
4281
        COLORREF textColor,
4282
        __out_opt RECT* blackBoxRect = NULL
4283
        ) PURE;
4284
 
4285
    /// <summary>
4286
    /// Gets a handle to the memory device context.
4287
    /// </summary>
4288
    /// <returns>
4289
    /// Returns the device context handle.
4290
    /// </returns>
4291
    /// <remarks>
4292
    /// An application can use the device context to draw using GDI functions. An application can obtain the bitmap handle
4293
    /// (HBITMAP) by calling GetCurrentObject. An application that wants information about the underlying bitmap, including
4294
    /// a pointer to the pixel data, can call GetObject to fill in a DIBSECTION structure. The bitmap is always a 32-bit 
4295
    /// top-down DIB.
4296
    /// </remarks>
4297
    STDMETHOD_(HDC, GetMemoryDC)() PURE;
4298
 
4299
    /// <summary>
4300
    /// Gets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number
4301
    /// if pixels per inch divided by 96.
4302
    /// </summary>
4303
    /// <returns>
4304
    /// Returns the number of bitmap pixels per DIP.
4305
    /// </returns>
4306
    STDMETHOD_(FLOAT, GetPixelsPerDip)() PURE;
4307
 
4308
    /// <summary>
4309
    /// Sets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number
4310
    /// if pixels per inch divided by 96.
4311
    /// </summary>
4312
    /// <param name="pixelsPerDip">Specifies the number of pixels per DIP.</param>
4313
    /// <returns>
4314
    /// Standard HRESULT error code.
4315
    /// </returns>
4316
    STDMETHOD(SetPixelsPerDip)(
4317
        FLOAT pixelsPerDip
4318
        ) PURE;
4319
 
4320
    /// <summary>
4321
    /// Gets the transform that maps abstract coordinate to DIPs. By default this is the identity 
4322
    /// transform. Note that this is unrelated to the world transform of the underlying device
4323
    /// context.
4324
    /// </summary>
4325
    /// <param name="transform">Receives the transform.</param>
4326
    /// <returns>
4327
    /// Standard HRESULT error code.
4328
    /// </returns>
4329
    STDMETHOD(GetCurrentTransform)(
4330
        __out DWRITE_MATRIX* transform
4331
        ) PURE;
4332
 
4333
    /// <summary>
4334
    /// Sets the transform that maps abstract coordinate to DIPs. This does not affect the world
4335
    /// transform of the underlying device context.
4336
    /// </summary>
4337
    /// <param name="transform">Specifies the new transform. This parameter can be NULL, in which
4338
    /// case the identity transform is implied.</param>
4339
    /// <returns>
4340
    /// Standard HRESULT error code.
4341
    /// </returns>
4342
    STDMETHOD(SetCurrentTransform)(
4343
        __in_opt DWRITE_MATRIX const* transform
4344
        ) PURE;
4345
 
4346
    /// <summary>
4347
    /// Gets the dimensions of the bitmap.
4348
    /// </summary>
4349
    /// <param name="size">Receives the size of the bitmap in pixels.</param>
4350
    /// <returns>
4351
    /// Standard HRESULT error code.
4352
    /// </returns>
4353
    STDMETHOD(GetSize)(
4354
        __out SIZE* size
4355
        ) PURE;
4356
 
4357
    /// <summary>
4358
    /// Resizes the bitmap.
4359
    /// </summary>
4360
    /// <param name="width">New bitmap width, in pixels.</param>
4361
    /// <param name="height">New bitmap height, in pixels.</param>
4362
    /// <returns>
4363
    /// Standard HRESULT error code.
4364
    /// </returns>
4365
    STDMETHOD(Resize)(
4366
        UINT32 width,
4367
        UINT32 height
4368
        ) PURE;
4369
};
4370
 
4371
/// <summary>
4372
/// The GDI interop interface provides interoperability with GDI.
4373
/// </summary>
4374
interface DWRITE_DECLARE_INTERFACE("1edd9491-9853-4299-898f-6432983b6f3a") IDWriteGdiInterop : public IUnknown
4375
{
4376
    /// <summary>
4377
    /// Creates a font object that matches the properties specified by the LOGFONT structure.
4378
    /// </summary>
4379
    /// <param name="logFont">Structure containing a GDI-compatible font description.</param>
4380
    /// <param name="font">Receives a newly created font object if successful, or NULL in case of error.</param>
4381
    /// <returns>
4382
    /// Standard HRESULT error code.
4383
    /// </returns>
4384
    STDMETHOD(CreateFontFromLOGFONT)(
4385
        __in LOGFONTW const* logFont,
4386
        __out IDWriteFont** font
4387
        ) PURE;
4388
 
4389
    /// <summary>
4390
    /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.
4391
    /// </summary>
4392
    /// <param name="font">Specifies a font in the system font collection.</param>
4393
    /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>
4394
    /// <param name="isSystemFont">Contains TRUE if the specified font object is part of the system font collection
4395
    /// or FALSE otherwise.</param>
4396
    /// <returns>
4397
    /// Standard HRESULT error code.
4398
    /// </returns>
4399
    STDMETHOD(ConvertFontToLOGFONT)(
4400
        IDWriteFont* font,
4401
        __out LOGFONTW* logFont,
4402
        __out BOOL* isSystemFont
4403
        ) PURE;
4404
 
4405
    /// <summary>
4406
    /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.
4407
    /// </summary>
4408
    /// <param name="font">Specifies a font face.</param>
4409
    /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>
4410
    /// <returns>
4411
    /// Standard HRESULT error code.
4412
    /// </returns>
4413
    STDMETHOD(ConvertFontFaceToLOGFONT)(
4414
        IDWriteFontFace* font,
4415
        __out LOGFONTW* logFont
4416
        ) PURE;
4417
 
4418
    /// <summary>
4419
    /// Creates a font face object that corresponds to the currently selected HFONT.
4420
    /// </summary>
4421
    /// <param name="hdc">Handle to a device context into which a font has been selected. It is assumed that the client
4422
    /// has already performed font mapping and that the font selected into the DC is the actual font that would be used 
4423
    /// for rendering glyphs.</param>
4424
    /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>
4425
    /// <returns>
4426
    /// Standard HRESULT error code.
4427
    /// </returns>
4428
    STDMETHOD(CreateFontFaceFromHdc)(
4429
        HDC hdc,
4430
        __out IDWriteFontFace** fontFace
4431
        ) PURE;
4432
 
4433
    /// <summary>
4434
    /// Creates an object that encapsulates a bitmap and memory DC which can be used for rendering glyphs.
4435
    /// </summary>
4436
    /// <param name="hdc">Optional device context used to create a compatible memory DC.</param>
4437
    /// <param name="width">Width of the bitmap.</param>
4438
    /// <param name="height">Height of the bitmap.</param>
4439
    /// <param name="renderTarget">Receives a pointer to the newly created render target.</param>
4440
    STDMETHOD(CreateBitmapRenderTarget)(
4441
        __in_opt HDC hdc,
4442
        UINT32 width,
4443
        UINT32 height,
4444
        __out IDWriteBitmapRenderTarget** renderTarget
4445
        ) PURE;
4446
};
4447
 
4448
/// <summary>
4449
/// The DWRITE_TEXTURE_TYPE enumeration identifies a type of alpha texture. An alpha texture is a bitmap of alpha values, each
4450
/// representing the darkness (i.e., opacity) of a pixel or subpixel.
4451
/// </summary>
4452
enum DWRITE_TEXTURE_TYPE
4453
{
4454
    /// <summary>
4455
    /// Specifies an alpha texture for aliased text rendering (i.e., bi-level, where each pixel is either fully opaque or fully transparent),
4456
    /// with one byte per pixel.
4457
    /// </summary>
4458
    DWRITE_TEXTURE_ALIASED_1x1,
4459
 
4460
    /// <summary>
4461
    /// Specifies an alpha texture for ClearType text rendering, with three bytes per pixel in the horizontal dimension and 
4462
    /// one byte per pixel in the vertical dimension.
4463
    /// </summary>
4464
    DWRITE_TEXTURE_CLEARTYPE_3x1
4465
};
4466
 
4467
/// <summary>
4468
/// Maximum alpha value in a texture returned by IDWriteGlyphRunAnalysis::CreateAlphaTexture.
4469
/// </summary>
4470
#define DWRITE_ALPHA_MAX 255
4471
 
4472
/// <summary>
4473
/// Interface that encapsulates information used to render a glyph run.
4474
/// </summary>
4475
interface DWRITE_DECLARE_INTERFACE("7d97dbf7-e085-42d4-81e3-6a883bded118") IDWriteGlyphRunAnalysis : public IUnknown
4476
{
4477
    /// <summary>
4478
    /// Gets the bounding rectangle of the physical pixels affected by the glyph run.
4479
    /// </summary>
4480
    /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the
4481
    /// bounding rectangle includes only bi-level glyphs. Otherwise, the bounding rectangle includes only anti-aliased
4482
    /// glyphs.</param>
4483
    /// <param name="textureBounds">Receives the bounding rectangle, or an empty rectangle if there are no glyphs
4484
    /// if the specified type.</param>
4485
    /// <returns>
4486
    /// Standard HRESULT error code.
4487
    /// </returns>
4488
    STDMETHOD(GetAlphaTextureBounds)(
4489
        DWRITE_TEXTURE_TYPE textureType,
4490
        __out RECT* textureBounds
4491
        ) PURE;
4492
 
4493
    /// <summary>
4494
    /// Creates an alpha texture of the specified type.
4495
    /// </summary>
4496
    /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the
4497
    /// texture contains only bi-level glyphs. Otherwise, the texture contains only anti-aliased glyphs.</param>
4498
    /// <param name="textureBounds">Specifies the bounding rectangle of the texture, which can be different than
4499
    /// the bounding rectangle returned by GetAlphaTextureBounds.</param>
4500
    /// <param name="alphaValues">Receives the array of alpha values.</param>
4501
    /// <param name="bufferSize">Size of the alphaValues array. The minimum size depends on the dimensions of the
4502
    /// rectangle and the type of texture requested.</param>
4503
    /// <returns>
4504
    /// Standard HRESULT error code.
4505
    /// </returns>
4506
    STDMETHOD(CreateAlphaTexture)(
4507
        DWRITE_TEXTURE_TYPE textureType,
4508
        __in RECT const* textureBounds,
4509
        __out_bcount(bufferSize) BYTE* alphaValues,
4510
        UINT32 bufferSize
4511
        ) PURE;
4512
 
4513
    /// <summary>
4514
    /// Gets properties required for ClearType blending.
4515
    /// </summary>
4516
    /// <param name="renderingParams">Rendering parameters object. In most cases, the values returned in the output
4517
    /// parameters are based on the properties of this object. The exception is if a GDI-compatible rendering mode
4518
    /// is specified.</param>
4519
    /// <param name="blendGamma">Receives the gamma value to use for gamma correction.</param>
4520
    /// <param name="blendEnhancedContrast">Receives the enhanced contrast value.</param>
4521
    /// <param name="blendClearTypeLevel">Receives the ClearType level.</param>
4522
    STDMETHOD(GetAlphaBlendParams)(
4523
        IDWriteRenderingParams* renderingParams,
4524
        __out FLOAT* blendGamma,
4525
        __out FLOAT* blendEnhancedContrast,
4526
        __out FLOAT* blendClearTypeLevel
4527
        ) PURE;
4528
};
4529
 
4530
/// <summary>
4531
/// The root factory interface for all DWrite objects.
4532
/// </summary>
4533
interface DWRITE_DECLARE_INTERFACE("b859ee5a-d838-4b5b-a2e8-1adc7d93db48") IDWriteFactory : public IUnknown
4534
{
4535
    /// <summary>
4536
    /// Gets a font collection representing the set of installed fonts.
4537
    /// </summary>
4538
    /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>
4539
    /// <param name="checkForUpdates">If this parameter is nonzero, the function performs an immediate check for changes to the set of
4540
    /// installed fonts. If this parameter is FALSE, the function will still detect changes if the font cache service is running, but
4541
    /// there may be some latency. For example, an application might specify TRUE if it has itself just installed a font and wants to 
4542
    /// be sure the font collection contains that font.</param>
4543
    /// <returns>
4544
    /// Standard HRESULT error code.
4545
    /// </returns>
4546
    STDMETHOD(GetSystemFontCollection)(
4547
        __out IDWriteFontCollection** fontCollection,
4548
        BOOL checkForUpdates = FALSE
4549
        ) PURE;
4550
 
4551
    /// <summary>
4552
    /// Creates a font collection using a custom font collection loader.
4553
    /// </summary>
4554
    /// <param name="collectionLoader">Application-defined font collection loader, which must have been previously
4555
    /// registered using RegisterFontCollectionLoader.</param>
4556
    /// <param name="collectionKey">Key used by the loader to identify a collection of font files.</param>
4557
    /// <param name="collectionKeySize">Size in bytes of the collection key.</param>
4558
    /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>
4559
    /// <returns>
4560
    /// Standard HRESULT error code.
4561
    /// </returns>
4562
    STDMETHOD(CreateCustomFontCollection)(
4563
        IDWriteFontCollectionLoader* collectionLoader,
4564
        __in_bcount(collectionKeySize) void const* collectionKey,
4565
        UINT32 collectionKeySize,
4566
        __out IDWriteFontCollection** fontCollection
4567
        ) PURE;
4568
 
4569
    /// <summary>
4570
    /// Registers a custom font collection loader with the factory object.
4571
    /// </summary>
4572
    /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>
4573
    /// <returns>
4574
    /// Standard HRESULT error code.
4575
    /// </returns>
4576
    STDMETHOD(RegisterFontCollectionLoader)(
4577
        IDWriteFontCollectionLoader* fontCollectionLoader
4578
        ) PURE;
4579
 
4580
    /// <summary>
4581
    /// Unregisters a custom font collection loader that was previously registered using RegisterFontCollectionLoader.
4582
    /// </summary>
4583
    /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>
4584
    /// <returns>
4585
    /// Standard HRESULT error code.
4586
    /// </returns>
4587
    STDMETHOD(UnregisterFontCollectionLoader)(
4588
        IDWriteFontCollectionLoader* fontCollectionLoader
4589
        ) PURE;
4590
 
4591
    /// <summary>
4592
    /// CreateFontFileReference creates a font file reference object from a local font file.
4593
    /// </summary>
4594
    /// <param name="filePath">Absolute file path. Subsequent operations on the constructed object may fail
4595
    /// if the user provided filePath doesn't correspond to a valid file on the disk.</param>
4596
    /// <param name="lastWriteTime">Last modified time of the input file path. If the parameter is omitted,
4597
    /// the function will access the font file to obtain its last write time, so the clients are encouraged to specify this value
4598
    /// to avoid extra disk access. Subsequent operations on the constructed object may fail
4599
    /// if the user provided lastWriteTime doesn't match the file on the disk.</param>
4600
    /// <param name="fontFile">Contains newly created font file reference object, or NULL in case of failure.</param>
4601
    /// <returns>
4602
    /// Standard HRESULT error code.
4603
    /// </returns>
4604
    STDMETHOD(CreateFontFileReference)(
4605
        __in_z WCHAR const* filePath,
4606
        __in_opt FILETIME const* lastWriteTime,
4607
        __out IDWriteFontFile** fontFile
4608
        ) PURE;
4609
 
4610
    /// <summary>
4611
    /// CreateCustomFontFileReference creates a reference to an application specific font file resource.
4612
    /// This function enables an application or a document to use a font without having to install it on the system.
4613
    /// The fontFileReferenceKey has to be unique only in the scope of the fontFileLoader used in this call.
4614
    /// </summary>
4615
    /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource
4616
    /// during the lifetime of fontFileLoader.</param>
4617
    /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
4618
    /// <param name="fontFileLoader">Font file loader that will be used by the font system to load data from the file identified by
4619
    /// fontFileReferenceKey.</param>
4620
    /// <param name="fontFile">Contains the newly created font file object, or NULL in case of failure.</param>
4621
    /// <returns>
4622
    /// Standard HRESULT error code.
4623
    /// </returns>
4624
    /// <remarks>
4625
    /// This function is provided for cases when an application or a document needs to use a font
4626
    /// without having to install it on the system. fontFileReferenceKey has to be unique only in the scope
4627
    /// of the fontFileLoader used in this call.
4628
    /// </remarks>
4629
    STDMETHOD(CreateCustomFontFileReference)(
4630
        __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
4631
        UINT32 fontFileReferenceKeySize,
4632
        IDWriteFontFileLoader* fontFileLoader,
4633
        __out IDWriteFontFile** fontFile
4634
        ) PURE;
4635
 
4636
    /// <summary>
4637
    /// Creates a font face object.
4638
    /// </summary>
4639
    /// <param name="fontFaceType">The file format of the font face.</param>
4640
    /// <param name="numberOfFiles">The number of font files require to represent the font face.</param>
4641
    /// <param name="fontFiles">Font files representing the font face. Since IDWriteFontFace maintains its own references
4642
    /// to the input font file objects, it's OK to release them after this call.</param>
4643
    /// <param name="faceIndex">The zero based index of a font face in cases when the font files contain a collection of font faces.
4644
    /// If the font files contain a single face, this value should be zero.</param>
4645
    /// <param name="fontFaceSimulationFlags">Font face simulation flags for algorithmic emboldening and italicization.</param>
4646
    /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>
4647
    /// <returns>
4648
    /// Standard HRESULT error code.
4649
    /// </returns>
4650
    STDMETHOD(CreateFontFace)(
4651
        DWRITE_FONT_FACE_TYPE fontFaceType,
4652
        UINT32 numberOfFiles,
4653
        __in_ecount(numberOfFiles) IDWriteFontFile* const* fontFiles,
4654
        UINT32 faceIndex,
4655
        DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags,
4656
        __out IDWriteFontFace** fontFace
4657
        ) PURE;
4658
 
4659
    /// <summary>
4660
    /// Creates a rendering parameters object with default settings for the primary monitor.
4661
    /// </summary>
4662
    /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
4663
    /// <returns>
4664
    /// Standard HRESULT error code.
4665
    /// </returns>
4666
    STDMETHOD(CreateRenderingParams)(
4667
        __out IDWriteRenderingParams** renderingParams
4668
        ) PURE;
4669
 
4670
    /// <summary>
4671
    /// Creates a rendering parameters object with default settings for the specified monitor.
4672
    /// </summary>
4673
    /// <param name="monitor">The monitor to read the default values from.</param>
4674
    /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
4675
    /// <returns>
4676
    /// Standard HRESULT error code.
4677
    /// </returns>
4678
    STDMETHOD(CreateMonitorRenderingParams)(
4679
        HMONITOR monitor,
4680
        __out IDWriteRenderingParams** renderingParams
4681
        ) PURE;
4682
 
4683
    /// <summary>
4684
    /// Creates a rendering parameters object with the specified properties.
4685
    /// </summary>
4686
    /// <param name="gamma">The gamma value used for gamma correction, which must be greater than zero and cannot exceed 256.</param>
4687
    /// <param name="enhancedContrast">The amount of contrast enhancement, zero or greater.</param>
4688
    /// <param name="clearTypeLevel">The degree of ClearType level, from 0.0f (no ClearType) to 1.0f (full ClearType).</param>
4689
    /// <param name="pixelGeometry">The geometry of a device pixel.</param>
4690
    /// <param name="renderingMode">Method of rendering glyphs. In most cases, this should be DWRITE_RENDERING_MODE_DEFAULT to automatically use an appropriate mode.</param>
4691
    /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
4692
    /// <returns>
4693
    /// Standard HRESULT error code.
4694
    /// </returns>
4695
    STDMETHOD(CreateCustomRenderingParams)(
4696
        FLOAT gamma,
4697
        FLOAT enhancedContrast,
4698
        FLOAT clearTypeLevel,
4699
        DWRITE_PIXEL_GEOMETRY pixelGeometry,
4700
        DWRITE_RENDERING_MODE renderingMode,
4701
        __out IDWriteRenderingParams** renderingParams
4702
        ) PURE;
4703
 
4704
    /// <summary>
4705
    /// Registers a font file loader with DirectWrite.
4706
    /// </summary>
4707
    /// <param name="fontFileLoader">Pointer to the implementation of the IDWriteFontFileLoader for a particular file resource type.</param>
4708
    /// <returns>
4709
    /// Standard HRESULT error code.
4710
    /// </returns>
4711
    /// <remarks>
4712
    /// This function registers a font file loader with DirectWrite.
4713
    /// Font file loader interface handles loading font file resources of a particular type from a key.
4714
    /// The font file loader interface is recommended to be implemented by a singleton object.
4715
    /// A given instance can only be registered once.
4716
    /// Succeeding attempts will return an error that it has already been registered.
4717
    /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite
4718
    /// inside their constructors and must not unregister themselves in their destructors, because
4719
    /// registration and unregistraton operations increment and decrement the object reference count respectively.
4720
    /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed
4721
    /// outside of the font file loader implementation as a separate step.
4722
    /// </remarks>
4723
    STDMETHOD(RegisterFontFileLoader)(
4724
        IDWriteFontFileLoader* fontFileLoader
4725
        ) PURE;
4726
 
4727
    /// <summary>
4728
    /// Unregisters a font file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.
4729
    /// </summary>
4730
    /// <param name="fontFileLoader">Pointer to the file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.</param>
4731
    /// <returns>
4732
    /// This function will succeed if the user loader is requested to be removed.
4733
    /// It will fail if the pointer to the file loader identifies a standard DirectWrite loader,
4734
    /// or a loader that is never registered or has already been unregistered.
4735
    /// </returns>
4736
    /// <remarks>
4737
    /// This function unregisters font file loader callbacks with the DirectWrite font system.
4738
    /// The font file loader interface is recommended to be implemented by a singleton object.
4739
    /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite
4740
    /// inside their constructors and must not unregister themselves in their destructors, because
4741
    /// registration and unregistraton operations increment and decrement the object reference count respectively.
4742
    /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed
4743
    /// outside of the font file loader implementation as a separate step.
4744
    /// </remarks>
4745
    STDMETHOD(UnregisterFontFileLoader)(
4746
        IDWriteFontFileLoader* fontFileLoader
4747
        ) PURE;
4748
 
4749
    /// <summary>
4750
    /// Create a text format object used for text layout.
4751
    /// </summary>
4752
    /// <param name="fontFamilyName">Name of the font family</param>
4753
    /// <param name="fontCollection">Font collection. NULL indicates the system font collection.</param>
4754
    /// <param name="fontWeight">Font weight</param>
4755
    /// <param name="fontStyle">Font style</param>
4756
    /// <param name="fontStretch">Font stretch</param>
4757
    /// <param name="fontSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
4758
    /// <param name="localeName">Locale name</param>
4759
    /// <param name="textFormat">Contains newly created text format object, or NULL in case of failure.</param>
4760
    /// <returns>
4761
    /// Standard HRESULT error code.
4762
    /// </returns>
4763
    STDMETHOD(CreateTextFormat)(
4764
        __in_z WCHAR const* fontFamilyName,
4765
        __maybenull IDWriteFontCollection* fontCollection,
4766
        DWRITE_FONT_WEIGHT fontWeight,
4767
        DWRITE_FONT_STYLE fontStyle,
4768
        DWRITE_FONT_STRETCH fontStretch,
4769
        FLOAT fontSize,
4770
        __in_z WCHAR const* localeName,
4771
        __out IDWriteTextFormat** textFormat
4772
        ) PURE;
4773
 
4774
    /// <summary>
4775
    /// Create a typography object used in conjunction with text format for text layout.
4776
    /// </summary>
4777
    /// <param name="typography">Contains newly created typography object, or NULL in case of failure.</param>
4778
    /// <returns>
4779
    /// Standard HRESULT error code.
4780
    /// </returns>
4781
    STDMETHOD(CreateTypography)(
4782
        __out IDWriteTypography** typography
4783
        ) PURE;
4784
 
4785
    /// <summary>
4786
    /// Create an object used for interoperability with GDI.
4787
    /// </summary>
4788
    /// <param name="gdiInterop">Receives the GDI interop object if successful, or NULL in case of failure.</param>
4789
    /// <returns>
4790
    /// Standard HRESULT error code.
4791
    /// </returns>
4792
    STDMETHOD(GetGdiInterop)(
4793
        __out IDWriteGdiInterop** gdiInterop
4794
        ) PURE;
4795
 
4796
    /// <summary>
4797
    /// CreateTextLayout takes a string, format, and associated constraints
4798
    /// and produces and object representing the fully analyzed
4799
    /// and formatted result.
4800
    /// </summary>
4801
    /// <param name="string">The string to layout.</param>
4802
    /// <param name="stringLength">The length of the string.</param>
4803
    /// <param name="textFormat">The format to apply to the string.</param>
4804
    /// <param name="maxWidth">Width of the layout box.</param>
4805
    /// <param name="maxHeight">Height of the layout box.</param>
4806
    /// <param name="textLayout">The resultant object.</param>
4807
    /// <returns>
4808
    /// Standard HRESULT error code.
4809
    /// </returns>
4810
    STDMETHOD(CreateTextLayout)(
4811
        __in_ecount(stringLength) WCHAR const* string,
4812
        UINT32 stringLength,
4813
        IDWriteTextFormat* textFormat,
4814
        FLOAT maxWidth,
4815
        FLOAT maxHeight,
4816
        __out IDWriteTextLayout** textLayout
4817
        ) PURE;
4818
 
4819
    /// <summary>
4820
    /// CreateGdiCompatibleTextLayout takes a string, format, and associated constraints
4821
    /// and produces and object representing the result formatted for a particular display resolution
4822
    /// and measuring method. The resulting text layout should only be used for the intended resolution,
4823
    /// and for cases where text scalability is desired, CreateTextLayout should be used instead.
4824
    /// </summary>
4825
    /// <param name="string">The string to layout.</param>
4826
    /// <param name="stringLength">The length of the string.</param>
4827
    /// <param name="textFormat">The format to apply to the string.</param>
4828
    /// <param name="layoutWidth">Width of the layout box.</param>
4829
    /// <param name="layoutHeight">Height of the layout box.</param>
4830
    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI device then pixelsPerDip
4831
    /// is 1. If rendering onto a 120 DPI device then pixelsPerDip is 120/96.</param>
4832
    /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
4833
    /// scaling specified the font size and pixelsPerDip.</param>
4834
    /// <param name="useGdiNatural">
4835
    /// When set to FALSE, instructs the text layout to use the same metrics as GDI aliased text.
4836
    /// When set to TRUE, instructs the text layout to use the same metrics as text measured by GDI using a font
4837
    /// created with CLEARTYPE_NATURAL_QUALITY.
4838
    /// </param>
4839
    /// <param name="textLayout">The resultant object.</param>
4840
    /// <returns>
4841
    /// Standard HRESULT error code.
4842
    /// </returns>
4843
    STDMETHOD(CreateGdiCompatibleTextLayout)(
4844
        __in_ecount(stringLength) WCHAR const* string,
4845
        UINT32 stringLength,
4846
        IDWriteTextFormat* textFormat,
4847
        FLOAT layoutWidth,
4848
        FLOAT layoutHeight,
4849
        FLOAT pixelsPerDip,
4850
        __in_opt DWRITE_MATRIX const* transform,
4851
        BOOL useGdiNatural,
4852
        __out IDWriteTextLayout** textLayout
4853
        ) PURE;
4854
 
4855
    /// <summary>
4856
    /// The application may call this function to create an inline object for trimming, using an ellipsis as the omission sign.
4857
    /// The ellipsis will be created using the current settings of the format, including base font, style, and any effects.
4858
    /// Alternate omission signs can be created by the application by implementing IDWriteInlineObject.
4859
    /// </summary>
4860
    /// <param name="textFormat">Text format used as a template for the omission sign.</param>
4861
    /// <param name="trimmingSign">Created omission sign.</param>
4862
    /// <returns>
4863
    /// Standard HRESULT error code.
4864
    /// </returns>
4865
    STDMETHOD(CreateEllipsisTrimmingSign)(
4866
        IDWriteTextFormat* textFormat,
4867
        __out IDWriteInlineObject** trimmingSign
4868
        ) PURE;
4869
 
4870
    /// <summary>
4871
    /// Return an interface to perform text analysis with.
4872
    /// </summary>
4873
    /// <param name="textAnalyzer">The resultant object.</param>
4874
    /// <returns>
4875
    /// Standard HRESULT error code.
4876
    /// </returns>
4877
    STDMETHOD(CreateTextAnalyzer)(
4878
        __out IDWriteTextAnalyzer** textAnalyzer
4879
        ) PURE;
4880
 
4881
    /// <summary>
4882
    /// Creates a number substitution object using a locale name,
4883
    /// substitution method, and whether to ignore user overrides (uses NLS
4884
    /// defaults for the given culture instead).
4885
    /// </summary>
4886
    /// <param name="substitutionMethod">Method of number substitution to use.</param>
4887
    /// <param name="localeName">Which locale to obtain the digits from.</param>
4888
    /// <param name="ignoreUserOverride">Ignore the user's settings and use the locale defaults</param>
4889
    /// <param name="numberSubstitution">Receives a pointer to the newly created object.</param>
4890
    STDMETHOD(CreateNumberSubstitution)(
4891
        __in DWRITE_NUMBER_SUBSTITUTION_METHOD substitutionMethod,
4892
        __in_z WCHAR const* localeName,
4893
        __in BOOL ignoreUserOverride,
4894
        __out IDWriteNumberSubstitution** numberSubstitution
4895
        ) PURE;
4896
 
4897
    /// <summary>
4898
    /// Creates a glyph run analysis object, which encapsulates information
4899
    /// used to render a glyph run.
4900
    /// </summary>
4901
    /// <param name="glyphRun">Structure specifying the properties of the glyph run.</param>
4902
    /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI bitmap then pixelsPerDip
4903
    /// is 1. If rendering onto a 120 DPI bitmap then pixelsPerDip is 120/96.</param>
4904
    /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
4905
    /// scaling specified the emSize and pixelsPerDip.</param>
4906
    /// <param name="renderingMode">Specifies the rendering mode, which must be one of the raster rendering modes (i.e., not default
4907
    /// and not outline).</param>
4908
    /// <param name="measuringMode">Specifies the method to measure glyphs.</param>
4909
    /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs.</param>
4910
    /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs.</param>
4911
    /// <param name="glyphRunAnalysis">Receives a pointer to the newly created object.</param>
4912
    /// <returns>
4913
    /// Standard HRESULT error code.
4914
    /// </returns>
4915
    STDMETHOD(CreateGlyphRunAnalysis)(
4916
        __in DWRITE_GLYPH_RUN const* glyphRun,
4917
        FLOAT pixelsPerDip,
4918
        __in_opt DWRITE_MATRIX const* transform,
4919
        DWRITE_RENDERING_MODE renderingMode,
4920
        DWRITE_MEASURING_MODE measuringMode,
4921
        FLOAT baselineOriginX,
4922
        FLOAT baselineOriginY,
4923
        __out IDWriteGlyphRunAnalysis** glyphRunAnalysis
4924
        ) PURE;
4925
 
4926
}; // interface IDWriteFactory
4927
 
4928
/// <summary>
4929
/// Creates a DirectWrite factory object that is used for subsequent creation of individual DirectWrite objects.
4930
/// </summary>
4931
/// <param name="factoryType">Identifies whether the factory object will be shared or isolated.</param>
4932
/// <param name="iid">Identifies the DirectWrite factory interface, such as __uuidof(IDWriteFactory).</param>
4933
/// <param name="factory">Receives the DirectWrite factory object.</param>
4934
/// <returns>
4935
/// Standard HRESULT error code.
4936
/// </returns>
4937
/// <remarks>
4938
/// Obtains DirectWrite factory object that is used for subsequent creation of individual DirectWrite classes.
4939
/// DirectWrite factory contains internal state such as font loader registration and cached font data.
4940
/// In most cases it is recommended to use the shared factory object, because it allows multiple components
4941
/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.
4942
/// However, there are cases when it is desirable to reduce the impact of a component,
4943
/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it
4944
/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed
4945
/// component.
4946
/// </remarks>
4947
EXTERN_C HRESULT DWRITE_EXPORT DWriteCreateFactory(
4948
    __in DWRITE_FACTORY_TYPE factoryType,
4949
    __in REFIID iid,
4950
    __out IUnknown **factory
4951
    );
4952
 
4953
// Macros used to define DirectWrite error codes.
4954
#define FACILITY_DWRITE 0x898
4955
#define DWRITE_ERR_BASE 0x5000
4956
#define MAKE_DWRITE_HR(severity, code) MAKE_HRESULT(severity, FACILITY_DWRITE, (DWRITE_ERR_BASE + code))
4957
#define MAKE_DWRITE_HR_ERR(code) MAKE_DWRITE_HR(SEVERITY_ERROR, code)
4958
 
4959
/// <summary>
4960
/// Indicates an error in an input file such as a font file.
4961
/// </summary>
4962
#define DWRITE_E_FILEFORMAT             MAKE_DWRITE_HR_ERR(0x000)
4963
 
4964
/// <summary>
4965
/// Indicates an error originating in DirectWrite code, which is not expected to occur but is safe to recover from.
4966
/// </summary>
4967
#define DWRITE_E_UNEXPECTED             MAKE_DWRITE_HR_ERR(0x001)
4968
 
4969
/// <summary>
4970
/// Indicates the specified font does not exist.
4971
/// </summary>
4972
#define DWRITE_E_NOFONT                 MAKE_DWRITE_HR_ERR(0x002)
4973
 
4974
/// <summary>
4975
/// A font file could not be opened because the file, directory, network location, drive, or other storage
4976
/// location does not exist or is unavailable.
4977
/// </summary>
4978
#define DWRITE_E_FILENOTFOUND           MAKE_DWRITE_HR_ERR(0x003)
4979
 
4980
/// <summary>
4981
/// A font file exists but could not be opened due to access denied, sharing violation, or similar error.
4982
/// </summary>
4983
#define DWRITE_E_FILEACCESS             MAKE_DWRITE_HR_ERR(0x004)
4984
 
4985
/// <summary>
4986
/// A font collection is obsolete due to changes in the system.
4987
/// </summary>
4988
#define DWRITE_E_FONTCOLLECTIONOBSOLETE MAKE_DWRITE_HR_ERR(0x005)
4989
 
4990
/// <summary>
4991
/// The given interface is already registered.
4992
/// </summary>
4993
#define DWRITE_E_ALREADYREGISTERED      MAKE_DWRITE_HR_ERR(0x006)
4994
 
4995
#endif /* DWRITE_H_INCLUDED */