1 moduledirectx.dwrite;
2 //+--------------------------------------------------------------------------3 //4 // Copyright (c) Microsoft Corporation. All rights reserved.5 //6 // Abstract:7 // DirectX Typography Services public API definitions.8 //9 //----------------------------------------------------------------------------10 11 publicimportdirectx.com;
12 publicimportdirectx.dcommon;
13 14 /// <summary>15 /// The type of a font represented by a single font file.16 /// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have17 /// separate enum values for each of the file type.18 /// </summary>19 aliasDWRITE_FONT_FILE_TYPE = int;
20 enum : DWRITE_FONT_FILE_TYPE21 {
22 /// <summary>23 /// Font type is not recognized by the DirectWrite font system.24 /// </summary>25 DWRITE_FONT_FILE_TYPE_UNKNOWN,
26 27 /// <summary>28 /// OpenType font with CFF outlines.29 /// </summary>30 DWRITE_FONT_FILE_TYPE_CFF,
31 32 /// <summary>33 /// OpenType font with TrueType outlines.34 /// </summary>35 DWRITE_FONT_FILE_TYPE_TRUETYPE,
36 37 /// <summary>38 /// OpenType font that contains a TrueType collection.39 /// </summary>40 DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION,
41 42 /// <summary>43 /// Type 1 PFM font.44 /// </summary>45 DWRITE_FONT_FILE_TYPE_TYPE1_PFM,
46 47 /// <summary>48 /// Type 1 PFB font.49 /// </summary>50 DWRITE_FONT_FILE_TYPE_TYPE1_PFB,
51 52 /// <summary>53 /// Vector .FON font.54 /// </summary>55 DWRITE_FONT_FILE_TYPE_VECTOR,
56 57 /// <summary>58 /// Bitmap .FON font.59 /// </summary>60 DWRITE_FONT_FILE_TYPE_BITMAP61 }
62 63 /// <summary>64 /// The file format of a complete font face.65 /// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have66 /// a single enum entry.67 /// </summary>68 aliasDWRITE_FONT_FACE_TYPE = int;
69 enum : DWRITE_FONT_FACE_TYPE70 {
71 /// <summary>72 /// OpenType font face with CFF outlines.73 /// </summary>74 DWRITE_FONT_FACE_TYPE_CFF,
75 76 /// <summary>77 /// OpenType font face with TrueType outlines.78 /// </summary>79 DWRITE_FONT_FACE_TYPE_TRUETYPE,
80 81 /// <summary>82 /// OpenType font face that is a part of a TrueType collection.83 /// </summary>84 DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION,
85 86 /// <summary>87 /// A Type 1 font face.88 /// </summary>89 DWRITE_FONT_FACE_TYPE_TYPE1,
90 91 /// <summary>92 /// A vector .FON format font face.93 /// </summary>94 DWRITE_FONT_FACE_TYPE_VECTOR,
95 96 /// <summary>97 /// A bitmap .FON format font face.98 /// </summary>99 DWRITE_FONT_FACE_TYPE_BITMAP,
100 101 /// <summary>102 /// Font face type is not recognized by the DirectWrite font system.103 /// </summary>104 DWRITE_FONT_FACE_TYPE_UNKNOWN,
105 106 /// <summary>107 /// The font data includes only the CFF table from an OpenType CFF font.108 /// This font face type can be used only for embedded fonts (i.e., custom109 /// font file loaders) and the resulting font face object supports only the110 /// minimum functionality necessary to render glyphs.111 /// </summary>112 DWRITE_FONT_FACE_TYPE_RAW_CFF113 }
114 115 /// <summary>116 /// Specifies algorithmic style simulations to be applied to the font face.117 /// Bold and oblique simulations can be combined via bitwise OR operation.118 /// </summary>119 aliasDWRITE_FONT_SIMULATIONS = int;
120 enum : DWRITE_FONT_SIMULATIONS121 {
122 /// <summary>123 /// No simulations are performed.124 /// </summary>125 DWRITE_FONT_SIMULATIONS_NONE = 0x0000,
126 127 /// <summary>128 /// Algorithmic emboldening is performed.129 /// </summary>130 DWRITE_FONT_SIMULATIONS_BOLD = 0x0001,
131 132 /// <summary>133 /// Algorithmic italicization is performed.134 /// </summary>135 DWRITE_FONT_SIMULATIONS_OBLIQUE = 0x0002136 };
137 138 /*
139 #ifdef DEFINE_ENUM_FLAG_OPERATORS
140 DEFINE_ENUM_FLAG_OPERATORS(DWRITE_FONT_SIMULATIONS);
141 #endif
142 */143 144 /// <summary>145 /// The font weight enumeration describes common values for degree of blackness or thickness of strokes of characters in a font.146 /// Font weight values less than 1 or greater than 999 are considered to be invalid, and they are rejected by font API functions.147 /// </summary>148 aliasDWRITE_FONT_WEIGHT = int;
149 enum : DWRITE_FONT_WEIGHT150 {
151 /// <summary>152 /// Predefined font weight : Thin (100).153 /// </summary>154 DWRITE_FONT_WEIGHT_THIN = 100,
155 156 /// <summary>157 /// Predefined font weight : Extra-light (200).158 /// </summary>159 DWRITE_FONT_WEIGHT_EXTRA_LIGHT = 200,
160 161 /// <summary>162 /// Predefined font weight : Ultra-light (200).163 /// </summary>164 DWRITE_FONT_WEIGHT_ULTRA_LIGHT = 200,
165 166 /// <summary>167 /// Predefined font weight : Light (300).168 /// </summary>169 DWRITE_FONT_WEIGHT_LIGHT = 300,
170 171 /// <summary>172 /// Predefined font weight : Semi-light (350).173 /// </summary>174 DWRITE_FONT_WEIGHT_SEMI_LIGHT = 350,
175 176 /// <summary>177 /// Predefined font weight : Normal (400).178 /// </summary>179 DWRITE_FONT_WEIGHT_NORMAL = 400,
180 181 /// <summary>182 /// Predefined font weight : Regular (400).183 /// </summary>184 DWRITE_FONT_WEIGHT_REGULAR = 400,
185 186 /// <summary>187 /// Predefined font weight : Medium (500).188 /// </summary>189 DWRITE_FONT_WEIGHT_MEDIUM = 500,
190 191 /// <summary>192 /// Predefined font weight : Demi-bold (600).193 /// </summary>194 DWRITE_FONT_WEIGHT_DEMI_BOLD = 600,
195 196 /// <summary>197 /// Predefined font weight : Semi-bold (600).198 /// </summary>199 DWRITE_FONT_WEIGHT_SEMI_BOLD = 600,
200 201 /// <summary>202 /// Predefined font weight : Bold (700).203 /// </summary>204 DWRITE_FONT_WEIGHT_BOLD = 700,
205 206 /// <summary>207 /// Predefined font weight : Extra-bold (800).208 /// </summary>209 DWRITE_FONT_WEIGHT_EXTRA_BOLD = 800,
210 211 /// <summary>212 /// Predefined font weight : Ultra-bold (800).213 /// </summary>214 DWRITE_FONT_WEIGHT_ULTRA_BOLD = 800,
215 216 /// <summary>217 /// Predefined font weight : Black (900).218 /// </summary>219 DWRITE_FONT_WEIGHT_BLACK = 900,
220 221 /// <summary>222 /// Predefined font weight : Heavy (900).223 /// </summary>224 DWRITE_FONT_WEIGHT_HEAVY = 900,
225 226 /// <summary>227 /// Predefined font weight : Extra-black (950).228 /// </summary>229 DWRITE_FONT_WEIGHT_EXTRA_BLACK = 950,
230 231 /// <summary>232 /// Predefined font weight : Ultra-black (950).233 /// </summary>234 DWRITE_FONT_WEIGHT_ULTRA_BLACK = 950235 }
236 237 /// <summary>238 /// The font stretch enumeration describes relative change from the normal aspect ratio239 /// as specified by a font designer for the glyphs in a font.240 /// Values less than 1 or greater than 9 are considered to be invalid, and they are rejected by font API functions.241 /// </summary>242 aliasDWRITE_FONT_STRETCH = int;
243 enum : DWRITE_FONT_STRETCH244 {
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 = 9299 }
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 aliasDWRITE_FONT_STYLE = int;
306 enum : DWRITE_FONT_STYLE307 {
308 /// <summary>309 /// Font slope style : Normal.310 /// </summary>311 DWRITE_FONT_STYLE_NORMAL,
312 313 /// <summary>314 /// Font slope style : Oblique.315 /// </summary>316 DWRITE_FONT_STYLE_OBLIQUE,
317 318 /// <summary>319 /// Font slope style : Italic.320 /// </summary>321 DWRITE_FONT_STYLE_ITALIC322 323 }
324 325 /// <summary>326 /// The informational string enumeration identifies a string in a font.327 /// </summary>328 aliasDWRITE_INFORMATIONAL_STRING_ID = int;
329 enum : DWRITE_INFORMATIONAL_STRING_ID330 {
331 /// <summary>332 /// Unspecified name ID.333 /// </summary>334 DWRITE_INFORMATIONAL_STRING_NONE,
335 336 /// <summary>337 /// Copyright notice provided by the font.338 /// </summary>339 DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE,
340 341 /// <summary>342 /// String containing a version number.343 /// </summary>344 DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS,
345 346 /// <summary>347 /// Trademark information provided by the font.348 /// </summary>349 DWRITE_INFORMATIONAL_STRING_TRADEMARK,
350 351 /// <summary>352 /// Name of the font manufacturer.353 /// </summary>354 DWRITE_INFORMATIONAL_STRING_MANUFACTURER,
355 356 /// <summary>357 /// Name of the font designer.358 /// </summary>359 DWRITE_INFORMATIONAL_STRING_DESIGNER,
360 361 /// <summary>362 /// URL of font designer (with protocol, e.g., http://, ftp://).363 /// </summary>364 DWRITE_INFORMATIONAL_STRING_DESIGNER_URL,
365 366 /// <summary>367 /// Description of the font. Can contain revision information, usage recommendations, history, features, etc.368 /// </summary>369 DWRITE_INFORMATIONAL_STRING_DESCRIPTION,
370 371 /// <summary>372 /// 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.373 /// </summary>374 DWRITE_INFORMATIONAL_STRING_FONT_VENDOR_URL,
375 376 /// <summary>377 /// 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.378 /// </summary>379 DWRITE_INFORMATIONAL_STRING_LICENSE_DESCRIPTION,
380 381 /// <summary>382 /// URL where additional licensing information can be found.383 /// </summary>384 DWRITE_INFORMATIONAL_STRING_LICENSE_INFO_URL,
385 386 /// <summary>387 /// 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 names388 /// (e.g., "Arial", "Arial Narrow", "Arial Black").389 /// </summary>390 DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES,
391 392 /// <summary>393 /// GDI-compatible subfamily name.394 /// </summary>395 DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES,
396 397 /// <summary>398 /// Family name preferred by the designer. This enables font designers to group more than four fonts in a single family without losing compatibility with399 /// GDI. This name is typically only present if it differs from the GDI-compatible family name.400 /// </summary>401 DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES,
402 403 /// <summary>404 /// Subfamily name preferred by the designer. This name is typically only present if it differs from the GDI-compatible subfamily name. 405 /// </summary>406 DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES,
407 408 /// <summary>409 /// 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.410 /// </summary>411 DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT,
412 413 /// <summary>414 /// The full name of the font, e.g. "Arial Bold", from name id 4 in the name table.415 /// </summary>416 DWRITE_INFORMATIONAL_STRING_FULL_NAME,
417 418 /// <summary>419 /// The postscript name of the font, e.g. "GillSans-Bold" from name id 6 in the name table.420 /// </summary>421 DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_NAME,
422 423 /// <summary>424 /// The postscript CID findfont name, from name id 20 in the name table.425 /// </summary>426 DWRITE_INFORMATIONAL_STRING_POSTSCRIPT_CID_NAME427 }
428 429 430 /// <summary>431 /// The DWRITE_FONT_METRICS structure specifies the metrics of a font face that432 /// are applicable to all glyphs within the font face.433 /// </summary>434 structDWRITE_FONT_METRICS435 {
436 /// <summary>437 /// The number of font design units per em unit.438 /// Font files use their own coordinate system of font design units.439 /// A font design unit is the smallest measurable unit in the em square,440 /// an imaginary square that is used to size and align glyphs.441 /// The concept of em square is used as a reference scale factor when defining font size and device transformation semantics.442 /// The size of one em square is also commonly used to compute the paragraph indentation value.443 /// </summary>444 UINT16designUnitsPerEm;
445 446 /// <summary>447 /// Ascent value of the font face in font design units.448 /// Ascent is the distance from the top of font character alignment box to English baseline.449 /// </summary>450 UINT16ascent;
451 452 /// <summary>453 /// Descent value of the font face in font design units.454 /// Descent is the distance from the bottom of font character alignment box to English baseline.455 /// </summary>456 UINT16descent;
457 458 /// <summary>459 /// Line gap in font design units.460 /// Recommended additional white space to add between lines to improve legibility. The recommended line spacing 461 /// (baseline-to-baseline distance) is thus the sum of ascent, descent, and lineGap. The line gap is usually 462 /// positive or zero but can be negative, in which case the recommended line spacing is less than the height463 /// of the character alignment box.464 /// </summary>465 INT16lineGap;
466 467 /// <summary>468 /// Cap height value of the font face in font design units.469 /// Cap height is the distance from English baseline to the top of a typical English capital.470 /// Capital "H" is often used as a reference character for the purpose of calculating the cap height value.471 /// </summary>472 UINT16capHeight;
473 474 /// <summary>475 /// x-height value of the font face in font design units.476 /// x-height is the distance from English baseline to the top of lowercase letter "x", or a similar lowercase character.477 /// </summary>478 UINT16xHeight;
479 480 /// <summary>481 /// The underline position value of the font face in font design units.482 /// Underline position is the position of underline relative to the English baseline.483 /// The value is usually made negative in order to place the underline below the baseline.484 /// </summary>485 INT16underlinePosition;
486 487 /// <summary>488 /// The suggested underline thickness value of the font face in font design units.489 /// </summary>490 UINT16underlineThickness;
491 492 /// <summary>493 /// The strikethrough position value of the font face in font design units.494 /// Strikethrough position is the position of strikethrough relative to the English baseline.495 /// The value is usually made positive in order to place the strikethrough above the baseline.496 /// </summary>497 INT16strikethroughPosition;
498 499 /// <summary>500 /// The suggested strikethrough thickness value of the font face in font design units.501 /// </summary>502 UINT16strikethroughThickness;
503 }
504 505 /// <summary>506 /// The DWRITE_GLYPH_METRICS structure specifies the metrics of an individual glyph.507 /// The units depend on how the metrics are obtained.508 /// </summary>509 structDWRITE_GLYPH_METRICS510 {
511 /// <summary>512 /// Specifies the X offset from the glyph origin to the left edge of the black box.513 /// The glyph origin is the current horizontal writing position.514 /// A negative value means the black box extends to the left of the origin (often true for lowercase italic 'f').515 /// </summary>516 INT32leftSideBearing;
517 518 /// <summary>519 /// Specifies the X offset from the origin of the current glyph to the origin of the next glyph when writing horizontally.520 /// </summary>521 UINT32advanceWidth;
522 523 /// <summary>524 /// Specifies the X offset from the right edge of the black box to the origin of the next glyph when writing horizontally.525 /// The value is negative when the right edge of the black box overhangs the layout box.526 /// </summary>527 INT32rightSideBearing;
528 529 /// <summary>530 /// Specifies the vertical offset from the vertical origin to the top of the black box.531 /// Thus, a positive value adds whitespace whereas a negative value means the glyph overhangs the top of the layout box.532 /// </summary>533 INT32topSideBearing;
534 535 /// <summary>536 /// Specifies the Y offset from the vertical origin of the current glyph to the vertical origin of the next glyph when writing vertically.537 /// (Note that the term "origin" by itself denotes the horizontal origin. The vertical origin is different.538 /// Its Y coordinate is specified by verticalOriginY value,539 /// and its X coordinate is half the advanceWidth to the right of the horizontal origin).540 /// </summary>541 UINT32advanceHeight;
542 543 /// <summary>544 /// Specifies the vertical distance from the black box's bottom edge to the advance height.545 /// Positive when the bottom edge of the black box is within the layout box.546 /// Negative when the bottom edge of black box overhangs the layout box.547 /// </summary>548 INT32bottomSideBearing;
549 550 /// <summary>551 /// Specifies the Y coordinate of a glyph's vertical origin, in the font's design coordinate system.552 /// The y coordinate of a glyph's vertical origin is the sum of the glyph's top side bearing553 /// and the top (i.e. yMax) of the glyph's bounding box.554 /// </summary>555 INT32verticalOriginY;
556 }
557 558 /// <summary>559 /// Optional adjustment to a glyph's position. A glyph offset changes the position of a glyph without affecting560 /// the pen position. Offsets are in logical, pre-transform units.561 /// </summary>562 structDWRITE_GLYPH_OFFSET563 {
564 /// <summary>565 /// Offset in the advance direction of the run. A positive advance offset moves the glyph to the right566 /// (in pre-transform coordinates) if the run is left-to-right or to the left if the run is right-to-left.567 /// </summary>568 FLOATadvanceOffset;
569 570 /// <summary>571 /// Offset in the ascent direction, i.e., the direction ascenders point. A positive ascender offset moves572 /// the glyph up (in pre-transform coordinates).573 /// </summary>574 FLOATascenderOffset;
575 }
576 577 /// <summary>578 /// Specifies the type of DirectWrite factory object.579 /// DirectWrite factory contains internal state such as font loader registration and cached font data.580 /// In most cases it is recommended to use the shared factory object, because it allows multiple components581 /// that use DirectWrite to share internal DirectWrite state and reduce memory usage.582 /// However, there are cases when it is desirable to reduce the impact of a component,583 /// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it584 /// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed585 /// component.586 /// </summary>587 aliasDWRITE_FACTORY_TYPE = int;
588 enum : DWRITE_FACTORY_TYPE589 {
590 /// <summary>591 /// Shared factory allow for re-use of cached font data across multiple in process components.592 /// Such factories also take advantage of cross process font caching components for better performance.593 /// </summary>594 DWRITE_FACTORY_TYPE_SHARED,
595 596 /// <summary>597 /// Objects created from the isolated factory do not interact with internal DirectWrite state from other components.598 /// </summary>599 DWRITE_FACTORY_TYPE_ISOLATED600 }
601 602 // Creates an OpenType tag as a 32bit integer such that603 // the first character in the tag is the lowest byte,604 // (least significant on little endian architectures)605 // which can be used to compare with tags in the font file.606 // This macro is compatible with DWRITE_FONT_FEATURE_TAG.607 //608 // Example: DWRITE_MAKE_OPENTYPE_TAG('c','c','m','p')609 // Dword: 0x706D6363610 // 611 UINT32DWRITE_MAKE_OPENTYPE_TAG(aliasa, aliasb, aliasc, aliasd)()
612 {
613 return614 (cast(UINT32)(cast(UINT8)d << 24)) |
615 (cast(UINT32)(cast(UINT8)c << 16)) |
616 (cast(UINT32)(cast(UINT8)b << 8 )) |
617 (cast(UINT32)(cast(UINT8)a ));
618 }
619 620 /// <summary>621 /// Font file loader interface handles loading font file resources of a particular type from a key.622 /// The font file loader interface is recommended to be implemented by a singleton object.623 /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite factory624 /// inside their constructors and must not unregister themselves in their destructors, because625 /// registration and unregistration operations increment and decrement the object reference count respectively.626 /// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed627 /// outside of the font file loader implementation as a separate step.628 /// </summary>629 mixin( uuid!(IDWriteFontFileLoader, "727cad4e-d6af-4c9e-8a08-d695b11caa49") );
630 interfaceIDWriteFontFileLoader : IUnknown631 {
632 extern(Windows):
633 /// <summary>634 /// Creates a font file stream object that encapsulates an open file resource.635 /// The resource is closed when the last reference to fontFileStream is released.636 /// </summary>637 /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource638 /// within the scope of the font loader being used.</param>639 /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>640 /// <param name="fontFileStream">Pointer to the newly created font file stream.</param>641 /// <returns>642 /// Standard HRESULT error code.643 /// </returns>644 HRESULTCreateStreamFromKey(
645 const(void*) fontFileReferenceKey,
646 UINT32fontFileReferenceKeySize,
647 /*out*/IDWriteFontFileStream* fontFileStream648 );
649 }
650 651 /// <summary>652 /// A built-in implementation of IDWriteFontFileLoader interface that operates on local font files653 /// and exposes local font file information from the font file reference key.654 /// Font file references created using CreateFontFileReference use this font file loader.655 /// </summary>656 mixin( uuid!(IDWriteLocalFontFileLoader, "b2d9f3ec-c9fe-4a11-a2ec-d86208f7c0a2") );
657 interfaceIDWriteLocalFontFileLoader : IDWriteFontFileLoader658 {
659 extern(Windows):
660 /// <summary>661 /// Obtains the length of the absolute file path from the font file reference key.662 /// </summary>663 /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file664 /// within the scope of the font loader being used.</param>665 /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>666 /// <param name="filePathLength">Length of the file path string not including the terminated NULL character.</param>667 /// <returns>668 /// Standard HRESULT error code.669 /// </returns>670 HRESULTGetFilePathLengthFromKey(
671 const(void*) fontFileReferenceKey,
672 UINT32fontFileReferenceKeySize,
673 /*out*/UINT32* filePathLength674 );
675 676 /// <summary>677 /// Obtains the absolute font file path from the font file reference key.678 /// </summary>679 /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file680 /// within the scope of the font loader being used.</param>681 /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>682 /// <param name="filePath">Character array that receives the local file path.</param>683 /// <param name="filePathSize">Size of the filePath array in character count including the terminated NULL character.</param>684 /// <returns>685 /// Standard HRESULT error code.686 /// </returns>687 HRESULTGetFilePathFromKey(
688 const(void*) fontFileReferenceKey,
689 UINT32fontFileReferenceKeySize,
690 /*out*/WCHAR* filePath,
691 UINT32filePathSize692 );
693 694 /// <summary>695 /// Obtains the last write time of the file from the font file reference key.696 /// </summary>697 /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file698 /// within the scope of the font loader being used.</param>699 /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>700 /// <param name="lastWriteTime">Last modified time of the font file.</param>701 /// <returns>702 /// Standard HRESULT error code.703 /// </returns>704 HRESULTGetLastWriteTimeFromKey(
705 const(void*) fontFileReferenceKey,
706 UINT32fontFileReferenceKeySize,
707 /*out*/FILETIME* lastWriteTime708 );
709 }
710 711 /// <summary>712 /// The interface for loading font file data.713 /// </summary>714 mixin( uuid!(IDWriteFontFileStream, "6d4865fe-0ab8-4d91-8f62-5dd6be34a3e0") );
715 interfaceIDWriteFontFileStream : IUnknown716 {
717 extern(Windows):
718 /// <summary>719 /// Reads a fragment from a file.720 /// </summary>721 /// <param name="fragmentStart">Receives the pointer to the start of the font file fragment.</param>722 /// <param name="fileOffset">Offset of the fragment from the beginning of the font file.</param>723 /// <param name="fragmentSize">Size of the fragment in bytes.</param>724 /// <param name="fragmentContext">The client defined context to be passed to the ReleaseFileFragment.</param>725 /// <returns>726 /// Standard HRESULT error code.727 /// </returns>728 /// <remarks>729 /// IMPORTANT: ReadFileFragment() implementations must check whether the requested file fragment730 /// is within the file bounds. Otherwise, an error should be returned from ReadFileFragment.731 /// </remarks>732 HRESULTReadFileFragment(
733 const(void**) fragmentStart,
734 UINT64fileOffset,
735 UINT64fragmentSize,
736 /*out*/void** fragmentContext737 );
738 739 /// <summary>740 /// Releases a fragment from a file.741 /// </summary>742 /// <param name="fragmentContext">The client defined context of a font fragment returned from ReadFileFragment.</param>743 voidReleaseFileFragment(
744 void* fragmentContext745 );
746 747 /// <summary>748 /// Obtains the total size of a file.749 /// </summary>750 /// <param name="fileSize">Receives the total size of the file.</param>751 /// <returns>752 /// Standard HRESULT error code.753 /// </returns>754 /// <remarks>755 /// Implementing GetFileSize() for asynchronously loaded font files may require756 /// downloading the complete file contents, therefore this method should only be used for operations that757 /// either require complete font file to be loaded (e.g., copying a font file) or need to make758 /// decisions based on the value of the file size (e.g., validation against a persisted file size).759 /// </remarks>760 HRESULTGetFileSize(
761 /*out*/UINT64* fileSize762 );
763 764 /// <summary>765 /// Obtains the last modified time of the file. The last modified time is used by DirectWrite font selection algorithms766 /// to determine whether one font resource is more up to date than another one.767 /// </summary>768 /// <param name="lastWriteTime">Receives the last modified time of the file in the format that represents769 /// the number of 100-nanosecond intervals since January 1, 1601 (UTC).</param>770 /// <returns>771 /// Standard HRESULT error code. For resources that don't have a concept of the last modified time, the implementation of772 /// GetLastWriteTime should return E_NOTIMPL.773 /// </returns>774 HRESULTGetLastWriteTime(
775 /*out*/UINT64* lastWriteTime776 );
777 }
778 779 /// <summary>780 /// The interface that represents a reference to a font file.781 /// </summary>782 mixin( uuid!(IDWriteFontFile, "739d886a-cef5-47dc-8769-1a8b41bebbb0") );
783 interfaceIDWriteFontFile : IUnknown784 {
785 extern(Windows):
786 /// <summary>787 /// 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.788 /// </summary>789 /// <param name="fontFileReferenceKey">Pointer to the font file reference key.790 /// IMPORTANT: The pointer value is valid until the font file reference object it is obtained from is released.</param>791 /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>792 /// <returns>793 /// Standard HRESULT error code.794 /// </returns>795 HRESULTGetReferenceKey(
796 const(void**) fontFileReferenceKey,
797 /*out*/UINT32* fontFileReferenceKeySize798 );
799 800 /// <summary>801 /// Obtains the file loader associated with a font file object.802 /// </summary>803 /// <param name="fontFileLoader">The font file loader associated with the font file object.</param>804 /// <returns>805 /// Standard HRESULT error code.806 /// </returns>807 HRESULTGetLoader(
808 /*out*/IDWriteFontFileLoader* fontFileLoader809 );
810 811 /// <summary>812 /// Analyzes a file and returns whether it represents a font, and whether the font type is supported by the font system.813 /// </summary>814 /// <param name="isSupportedFontType">TRUE if the font type is supported by the font system, FALSE otherwise.</param>815 /// <param name="fontFileType">The type of the font file. Note that even if isSupportedFontType is FALSE,816 /// the fontFileType value may be different from DWRITE_FONT_FILE_TYPE_UNKNOWN.</param>817 /// <param name="fontFaceType">The type of the font face that can be constructed from the font file.818 /// Note that even if isSupportedFontType is FALSE, the fontFaceType value may be different from819 /// DWRITE_FONT_FACE_TYPE_UNKNOWN.</param>820 /// <param name="numberOfFaces">Number of font faces contained in the font file.</param>821 /// <returns>822 /// Standard HRESULT error code if there was a processing error during analysis.823 /// </returns>824 /// <remarks>825 /// IMPORTANT: certain font file types are recognized, but not supported by the font system.826 /// For example, the font system will recognize a file as a Type 1 font file,827 /// but will not be able to construct a font face object from it. In such situations, Analyze will set828 /// isSupportedFontType output parameter to FALSE.829 /// </remarks>830 HRESULTAnalyze(
831 /*out*/BOOL* isSupportedFontType,
832 /*out*/DWRITE_FONT_FILE_TYPE* fontFileType,
833 /*out*/DWRITE_FONT_FACE_TYPE* fontFaceType,
834 /*out*/UINT32* numberOfFaces835 );
836 }
837 838 /// <summary>839 /// Represents the internal structure of a device pixel (i.e., the physical arrangement of red,840 /// green, and blue color components) that is assumed for purposes of rendering text.841 /// </summary>842 aliasDWRITE_PIXEL_GEOMETRY = int;
843 enum : DWRITE_PIXEL_GEOMETRY844 {
845 /// <summary>846 /// The red, green, and blue color components of each pixel are assumed to occupy the same point.847 /// </summary>848 DWRITE_PIXEL_GEOMETRY_FLAT,
849 850 /// <summary>851 /// Each pixel comprises three vertical stripes, with red on the left, green in the center, and 852 /// blue on the right. This is the most common pixel geometry for LCD monitors.853 /// </summary>854 DWRITE_PIXEL_GEOMETRY_RGB,
855 856 /// <summary>857 /// Each pixel comprises three vertical stripes, with blue on the left, green in the center, and 858 /// red on the right.859 /// </summary>860 DWRITE_PIXEL_GEOMETRY_BGR861 }
862 863 /// <summary>864 /// Represents a method of rendering glyphs.865 /// </summary>866 aliasDWRITE_RENDERING_MODE = int;
867 enum : DWRITE_RENDERING_MODE868 {
869 /// <summary>870 /// Specifies that the rendering mode is determined automatically based on the font and size.871 /// </summary>872 DWRITE_RENDERING_MODE_DEFAULT,
873 874 /// <summary>875 /// Specifies that no antialiasing is performed. Each pixel is either set to the foreground 876 /// color of the text or retains the color of the background.877 /// </summary>878 DWRITE_RENDERING_MODE_ALIASED,
879 880 /// <summary>881 /// Specifies that antialiasing is performed in the horizontal direction and the appearance882 /// of glyphs is layout-compatible with GDI using CLEARTYPE_QUALITY. Use DWRITE_MEASURING_MODE_GDI_CLASSIC 883 /// to get glyph advances. The antialiasing may be either ClearType or grayscale depending on884 /// the text antialiasing mode.885 /// </summary>886 DWRITE_RENDERING_MODE_GDI_CLASSIC,
887 888 /// <summary>889 /// Specifies that antialiasing is performed in the horizontal direction and the appearance890 /// of glyphs is layout-compatible with GDI using CLEARTYPE_NATURAL_QUALITY. Glyph advances891 /// are close to the font design advances, but are still rounded to whole pixels. Use892 /// DWRITE_MEASURING_MODE_GDI_NATURAL to get glyph advances. The antialiasing may be either893 /// ClearType or grayscale depending on the text antialiasing mode.894 /// </summary>895 DWRITE_RENDERING_MODE_GDI_NATURAL,
896 897 /// <summary>898 /// Specifies that antialiasing is performed in the horizontal direction. This rendering899 /// mode allows glyphs to be positioned with subpixel precision and is therefore suitable900 /// for natural (i.e., resolution-independent) layout. The antialiasing may be either901 /// ClearType or grayscale depending on the text antialiasing mode.902 /// </summary>903 DWRITE_RENDERING_MODE_NATURAL,
904 905 /// <summary>906 /// Similar to natural mode except that antialiasing is performed in both the horizontal907 /// and vertical directions. This is typically used at larger sizes to make curves and908 /// diagonal lines look smoother. The antialiasing may be either ClearType or grayscale909 /// depending on the text antialiasing mode.910 /// </summary>911 DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,
912 913 /// <summary>914 /// Specifies that rendering should bypass the rasterizer and use the outlines directly. 915 /// This is typically used at very large sizes.916 /// </summary>917 DWRITE_RENDERING_MODE_OUTLINE,
918 919 // The following names are obsolete, but are kept as aliases to avoid breaking existing code.920 // Each of these rendering modes may result in either ClearType or grayscale antialiasing 921 // depending on the DWRITE_TEXT_ANTIALIASING_MODE.922 DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC = DWRITE_RENDERING_MODE_GDI_CLASSIC,
923 DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL = DWRITE_RENDERING_MODE_GDI_NATURAL,
924 DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL = DWRITE_RENDERING_MODE_NATURAL,
925 DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC = DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC926 };
927 928 /// <summary>929 /// The DWRITE_MATRIX structure specifies the graphics transform to be applied930 /// to rendered glyphs.931 /// </summary>932 structDWRITE_MATRIX933 {
934 /// <summary>935 /// Horizontal scaling / cosine of rotation936 /// </summary>937 FLOATm11;
938 939 /// <summary>940 /// Vertical shear / sine of rotation941 /// </summary>942 FLOATm12;
943 944 /// <summary>945 /// Horizontal shear / negative sine of rotation946 /// </summary>947 FLOATm21;
948 949 /// <summary>950 /// Vertical scaling / cosine of rotation951 /// </summary>952 FLOATm22;
953 954 /// <summary>955 /// Horizontal shift (always orthogonal regardless of rotation)956 /// </summary>957 FLOATdx;
958 959 /// <summary>960 /// Vertical shift (always orthogonal regardless of rotation)961 /// </summary>962 FLOATdy;
963 }
964 965 /// <summary>966 /// The interface that represents text rendering settings for glyph rasterization and filtering.967 /// </summary>968 mixin( uuid!(IDWriteRenderingParams, "2f0da53a-2add-47cd-82ee-d9ec34688e75") );
969 interfaceIDWriteRenderingParams : IUnknown970 {
971 extern(Windows):
972 /// <summary>973 /// Gets the gamma value used for gamma correction. Valid values must be974 /// greater than zero and cannot exceed 256.975 /// </summary>976 FLOATGetGamma();
977 978 /// <summary>979 /// Gets the amount of contrast enhancement. Valid values are greater than980 /// or equal to zero.981 /// </summary>982 FLOATGetEnhancedContrast();
983 984 /// <summary>985 /// Gets the ClearType level. Valid values range from 0.0f (no ClearType) 986 /// to 1.0f (full ClearType).987 /// </summary>988 FLOATGetClearTypeLevel();
989 990 /// <summary>991 /// Gets the pixel geometry.992 /// </summary>993 DWRITE_PIXEL_GEOMETRYGetPixelGeometry();
994 995 /// <summary>996 /// Gets the rendering mode.997 /// </summary>998 DWRITE_RENDERING_MODEGetRenderingMode();
999 }
1000 1001 // Forward declarations of D2D types1002 //interface ID2D1SimplifiedGeometrySink;1003 1004 aliasIDWriteGeometrySink = directx.d2d1.ID2D1SimplifiedGeometrySink;
1005 1006 /// <summary>1007 /// The interface that represents an absolute reference to a font face.1008 /// It contains font face type, appropriate file references and face identification data.1009 /// Various font data such as metrics, names and glyph outlines is obtained from IDWriteFontFace.1010 /// </summary>1011 mixin( uuid!(IDWriteFontFace, "5f49804d-7024-4d43-bfa9-d25984f53849") );
1012 interfaceIDWriteFontFace : IUnknown1013 {
1014 extern(Windows):
1015 /// <summary>1016 /// Obtains the file format type of a font face.1017 /// </summary>1018 DWRITE_FONT_FACE_TYPEGetType();
1019 1020 /// <summary>1021 /// Obtains the font files representing a font face.1022 /// </summary>1023 /// <param name="numberOfFiles">The number of files representing the font face.</param>1024 /// <param name="fontFiles">User provided array that stores pointers to font files representing the font face.1025 /// This parameter can be NULL if the user is only interested in the number of files representing the font face.1026 /// This API increments reference count of the font file pointers returned according to COM conventions, and the client1027 /// should release them when finished.</param>1028 /// <returns>1029 /// Standard HRESULT error code.1030 /// </returns>1031 HRESULTGetFiles(
1032 /*inout*/UINT32* numberOfFiles,
1033 /*out*/IDWriteFontFile* fontFiles1034 );
1035 1036 /// <summary>1037 /// Obtains the zero-based index of the font face in its font file or files. If the font files contain a single face,1038 /// the return value is zero.1039 /// </summary>1040 UINT32GetIndex();
1041 1042 /// <summary>1043 /// Obtains the algorithmic style simulation flags of a font face.1044 /// </summary>1045 DWRITE_FONT_SIMULATIONSGetSimulations();
1046 1047 /// <summary>1048 /// Determines whether the font is a symbol font.1049 /// </summary>1050 BOOLIsSymbolFont();
1051 1052 /// <summary>1053 /// Obtains design units and common metrics for the font face.1054 /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.1055 /// </summary>1056 /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.1057 /// The metrics returned by this function are in font design units.</param>1058 voidGetMetrics(
1059 /*out*/DWRITE_FONT_METRICS* fontFaceMetrics1060 );
1061 1062 /// <summary>1063 /// Obtains the number of glyphs in the font face.1064 /// </summary>1065 UINT16GetGlyphCount();
1066 1067 /// <summary>1068 /// Obtains ideal glyph metrics in font design units. Design glyphs metrics are used for glyph positioning.1069 /// </summary>1070 /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>1071 /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>1072 /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.1073 /// The metrics returned by this function are in font design units.</param>1074 /// <param name="isSideways">Indicates whether the font is being used in a sideways run.1075 /// This can affect the glyph metrics if the font has oblique simulation1076 /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>1077 /// <returns>1078 /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range1079 /// for the current font face, E_INVALIDARG will be returned.1080 /// </returns>1081 HRESULTGetDesignGlyphMetrics(
1082 const(UINT16)* glyphIndices,
1083 UINT32glyphCount,
1084 /*out*/DWRITE_GLYPH_METRICS* glyphMetrics,
1085 BOOLisSideways = FALSE1086 );
1087 1088 /// <summary>1089 /// Returns the nominal mapping of UTF-32 Unicode code points to glyph indices as defined by the font 'cmap' table.1090 /// Note that this mapping is primarily provided for line layout engines built on top of the physical font API.1091 /// Because of OpenType glyph substitution and line layout character substitution, the nominal conversion does not always correspond1092 /// to how a Unicode string will map to glyph indices when rendering using a particular font face.1093 /// Also, note that Unicode Variation Selectors provide for alternate mappings for character to glyph.1094 /// This call will always return the default variant.1095 /// </summary>1096 /// <param name="codePoints">An array of UTF-32 code points to obtain nominal glyph indices from.</param>1097 /// <param name="codePointCount">The number of elements in the codePoints array.</param>1098 /// <param name="glyphIndices">Array of nominal glyph indices filled by this function.</param>1099 /// <returns>1100 /// Standard HRESULT error code.1101 /// </returns>1102 HRESULTGetGlyphIndices(
1103 const(UINT32)* codePoints,
1104 UINT32codePointCount,
1105 /*out*/UINT16* glyphIndices1106 );
1107 1108 /// <summary>1109 /// Finds the specified OpenType font table if it exists and returns a pointer to it.1110 /// The function accesses the underlying font data via the IDWriteFontFileStream interface1111 /// implemented by the font file loader.1112 /// </summary>1113 /// <param name="openTypeTableTag">Four character tag of table to find.1114 /// Use the DWRITE_MAKE_OPENTYPE_TAG() macro to create it.1115 /// Unlike GDI, it does not support the special TTCF and null tags to access the whole font.</param>1116 /// <param name="tableData">1117 /// Pointer to base of table in memory.1118 /// The pointer is only valid so long as the FontFace used to get the font table still exists1119 /// (not any other FontFace, even if it actually refers to the same physical font).1120 /// </param>1121 /// <param name="tableSize">Byte size of table.</param>1122 /// <param name="tableContext">1123 /// Opaque context which must be freed by calling ReleaseFontTable.1124 /// The context actually comes from the lower level IDWriteFontFileStream,1125 /// which may be implemented by the application or DWrite itself.1126 /// It is possible for a NULL tableContext to be returned, especially if1127 /// the implementation directly memory maps the whole file.1128 /// Nevertheless, always release it later, and do not use it as a test for function success.1129 /// The same table can be queried multiple times,1130 /// but each returned context can be different, so release each separately.1131 /// </param>1132 /// <param name="exists">True if table exists.</param>1133 /// <returns>1134 /// Standard HRESULT error code.1135 /// 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.1136 /// The context does not need to be freed if the table was not found.1137 /// </returns>1138 /// <remarks>1139 /// The context for the same tag may be different for each call,1140 /// so each one must be held and released separately.1141 /// </remarks>1142 HRESULTTryGetFontTable(
1143 UINT32openTypeTableTag,
1144 const(void**) tableData,
1145 /*out*/UINT32* tableSize,
1146 /*out*/void** tableContext,
1147 /*out*/BOOL* exists1148 );
1149 1150 /// <summary>1151 /// Releases the table obtained earlier from TryGetFontTable.1152 /// </summary>1153 /// <param name="tableContext">Opaque context from TryGetFontTable.</param>1154 voidReleaseFontTable(
1155 void* tableContext1156 );
1157 1158 /// <summary>1159 /// Computes the outline of a run of glyphs by calling back to the outline sink interface.1160 /// </summary>1161 /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>1162 /// <param name="glyphIndices">Array of glyph indices.</param>1163 /// <param name="glyphAdvances">Optional array of glyph advances in DIPs.</param>1164 /// <param name="glyphOffsets">Optional array of glyph offsets.</param>1165 /// <param name="glyphCount">Number of glyphs.</param>1166 /// <param name="isSideways">If true, specifies that glyphs are rotated 90 degrees to the left and vertical metrics are used.1167 /// A client can render a vertical run by specifying isSideways = true and rotating the resulting geometry 90 degrees to the1168 /// right using a transform.</param>1169 /// <param name="isRightToLeft">If true, specifies that the advance direction is right to left. By default, the advance direction1170 /// is left to right.</param>1171 /// <param name="geometrySink">Interface the function calls back to draw each element of the geometry.</param>1172 /// <returns>1173 /// Standard HRESULT error code.1174 /// </returns>1175 HRESULTGetGlyphRunOutline(
1176 FLOATemSize,
1177 const(UINT16)* glyphIndices,
1178 const(FLOAT)* glyphAdvances,
1179 const(DWRITE_GLYPH_OFFSET)* glyphOffsets,
1180 UINT32glyphCount,
1181 BOOLisSideways,
1182 BOOLisRightToLeft,
1183 IDWriteGeometrySinkgeometrySink1184 );
1185 1186 /// <summary>1187 /// Determines the recommended rendering mode for the font given the specified size and rendering parameters.1188 /// </summary>1189 /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>1190 /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 1191 /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>1192 /// <param name="measuringMode">Specifies measuring mode that will be used for glyphs in the font.1193 /// Renderer implementations may choose different rendering modes for given measuring modes, but1194 /// best results are seen when the corresponding modes match:1195 /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL1196 /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC1197 /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL1198 /// </param>1199 /// <param name="renderingParams">Rendering parameters object. This parameter is necessary in case the rendering parameters 1200 /// object overrides the rendering mode.</param>1201 /// <param name="renderingMode">Receives the recommended rendering mode to use.</param>1202 /// <returns>1203 /// Standard HRESULT error code.1204 /// </returns>1205 HRESULTGetRecommendedRenderingMode(
1206 FLOATemSize,
1207 FLOATpixelsPerDip,
1208 DWRITE_MEASURING_MODEmeasuringMode,
1209 IDWriteRenderingParamsrenderingParams,
1210 /*out*/DWRITE_RENDERING_MODE* renderingMode1211 );
1212 1213 /// <summary>1214 /// Obtains design units and common metrics for the font face.1215 /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.1216 /// </summary>1217 /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>1218 /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 1219 /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>1220 /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the1221 /// scaling specified by the font size and pixelsPerDip.</param>1222 /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.1223 /// The metrics returned by this function are in font design units.</param>1224 HRESULTGetGdiCompatibleMetrics(
1225 FLOATemSize,
1226 FLOATpixelsPerDip,
1227 const(DWRITE_MATRIX)* transform,
1228 /*out*/DWRITE_FONT_METRICS* fontFaceMetrics1229 );
1230 1231 /// <summary>1232 /// Obtains glyph metrics in font design units with the return values compatible with what GDI would produce.1233 /// Glyphs metrics are used for positioning of individual glyphs.1234 /// </summary>1235 /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>1236 /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 1237 /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>1238 /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the1239 /// scaling specified by the font size and pixelsPerDip.</param>1240 /// <param name="useGdiNatural">1241 /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.1242 /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font1243 /// created with CLEARTYPE_NATURAL_QUALITY.1244 /// </param>1245 /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>1246 /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>1247 /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.1248 /// The metrics returned by this function are in font design units.</param>1249 /// <param name="isSideways">Indicates whether the font is being used in a sideways run.1250 /// This can affect the glyph metrics if the font has oblique simulation1251 /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>1252 /// <returns>1253 /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range1254 /// for the current font face, E_INVALIDARG will be returned.1255 /// </returns>1256 HRESULTGetGdiCompatibleGlyphMetrics(
1257 FLOATemSize,
1258 FLOATpixelsPerDip,
1259 const(DWRITE_MATRIX)* transform,
1260 BOOLuseGdiNatural,
1261 const(UINT16)* glyphIndices,
1262 UINT32glyphCount,
1263 /*out*/DWRITE_GLYPH_METRICS* glyphMetrics,
1264 BOOLisSideways = FALSE1265 );
1266 }
1267 1268 /// <summary>1269 /// The font collection loader interface is used to construct a collection of fonts given a particular type of key.1270 /// The font collection loader interface is recommended to be implemented by a singleton object.1271 /// IMPORTANT: font collection loader implementations must not register themselves with a DirectWrite factory1272 /// inside their constructors and must not unregister themselves in their destructors, because1273 /// registration and unregistration operations increment and decrement the object reference count respectively.1274 /// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed1275 /// outside of the font file loader implementation as a separate step.1276 /// </summary>1277 mixin( uuid!(IDWriteFontCollectionLoader, "cca920e4-52f0-492b-bfa8-29c72ee0a468") );
1278 interfaceIDWriteFontCollectionLoader : IUnknown1279 {
1280 extern(Windows):
1281 /// <summary>1282 /// Creates a font file enumerator object that encapsulates a collection of font files.1283 /// The font system calls back to this interface to create a font collection.1284 /// </summary>1285 /// <param name="factory">Factory associated with the loader.</param>1286 /// <param name="collectionKey">Font collection key that uniquely identifies the collection of font files within1287 /// the scope of the font collection loader being used.</param>1288 /// <param name="collectionKeySize">Size of the font collection key in bytes.</param>1289 /// <param name="fontFileEnumerator">Pointer to the newly created font file enumerator.</param>1290 /// <returns>1291 /// Standard HRESULT error code.1292 /// </returns>1293 HRESULTCreateEnumeratorFromKey(
1294 IDWriteFactoryfactory,
1295 const(void*) collectionKey,
1296 UINT32collectionKeySize,
1297 /*out*/IDWriteFontFileEnumerator* fontFileEnumerator1298 );
1299 }
1300 1301 /// <summary>1302 /// The font file enumerator interface encapsulates a collection of font files. The font system uses this interface1303 /// to enumerate font files when building a font collection.1304 /// </summary>1305 mixin( uuid!(IDWriteFontFileEnumerator, "72755049-5ff7-435d-8348-4be97cfa6c7c") );
1306 interfaceIDWriteFontFileEnumerator : IUnknown1307 {
1308 extern(Windows):
1309 /// <summary>1310 /// Advances to the next font file in the collection. When it is first created, the enumerator is positioned1311 /// before the first element of the collection and the first call to MoveNext advances to the first file.1312 /// </summary>1313 /// <param name="hasCurrentFile">Receives the value TRUE if the enumerator advances to a file, or FALSE if1314 /// the enumerator advanced past the last file in the collection.</param>1315 /// <returns>1316 /// Standard HRESULT error code.1317 /// </returns>1318 HRESULTMoveNext(
1319 /*out*/BOOL* hasCurrentFile1320 );
1321 1322 /// <summary>1323 /// Gets a reference to the current font file.1324 /// </summary>1325 /// <param name="fontFile">Pointer to the newly created font file object.</param>1326 /// <returns>1327 /// Standard HRESULT error code.1328 /// </returns>1329 HRESULTGetCurrentFontFile(
1330 /*out*/IDWriteFontFile* fontFile1331 );
1332 }
1333 1334 /// <summary>1335 /// Represents a collection of strings indexed by locale name.1336 /// </summary>1337 mixin( uuid!(IDWriteLocalizedStrings, "08256209-099a-4b34-b86d-c22b110e7771") );
1338 interfaceIDWriteLocalizedStrings : IUnknown1339 {
1340 extern(Windows):
1341 /// <summary>1342 /// Gets the number of language/string pairs.1343 /// </summary>1344 UINT32GetCount();
1345 1346 /// <summary>1347 /// Gets the index of the item with the specified locale name.1348 /// </summary>1349 /// <param name="localeName">Locale name to look for.</param>1350 /// <param name="index">Receives the zero-based index of the locale name/string pair.</param>1351 /// <param name="exists">Receives TRUE if the locale name exists or FALSE if not.</param>1352 /// <returns>1353 /// Standard HRESULT error code. If the specified locale name does not exist, the return value is S_OK, 1354 /// but *index is UINT_MAX and *exists is FALSE.1355 /// </returns>1356 HRESULTFindLocaleName(
1357 const(WCHAR)* localeName,
1358 /*out*/UINT32* index,
1359 /*out*/BOOL* exists1360 );
1361 1362 /// <summary>1363 /// Gets the length in characters (not including the null terminator) of the locale name with the specified index.1364 /// </summary>1365 /// <param name="index">Zero-based index of the locale name.</param>1366 /// <param name="length">Receives the length in characters, not including the null terminator.</param>1367 /// <returns>1368 /// Standard HRESULT error code.1369 /// </returns>1370 HRESULTGetLocaleNameLength(
1371 UINT32index,
1372 /*out*/UINT32* length1373 );
1374 1375 /// <summary>1376 /// Copies the locale name with the specified index to the specified array.1377 /// </summary>1378 /// <param name="index">Zero-based index of the locale name.</param>1379 /// <param name="localeName">Character array that receives the locale name.</param>1380 /// <param name="size">Size of the array in characters. The size must include space for the terminating1381 /// null character.</param>1382 /// <returns>1383 /// Standard HRESULT error code.1384 /// </returns>1385 HRESULTGetLocaleName(
1386 UINT32index,
1387 /*out*/WCHAR* localeName,
1388 UINT32size1389 );
1390 1391 /// <summary>1392 /// Gets the length in characters (not including the null terminator) of the string with the specified index.1393 /// </summary>1394 /// <param name="index">Zero-based index of the string.</param>1395 /// <param name="length">Receives the length in characters, not including the null terminator.</param>1396 /// <returns>1397 /// Standard HRESULT error code.1398 /// </returns>1399 HRESULTGetStringLength(
1400 UINT32index,
1401 /*out*/UINT32* length1402 );
1403 1404 /// <summary>1405 /// Copies the string with the specified index to the specified array.1406 /// </summary>1407 /// <param name="index">Zero-based index of the string.</param>1408 /// <param name="stringBuffer">Character array that receives the string.</param>1409 /// <param name="size">Size of the array in characters. The size must include space for the terminating1410 /// null character.</param>1411 /// <returns>1412 /// Standard HRESULT error code.1413 /// </returns>1414 HRESULTGetString(
1415 UINT32index,
1416 /*out*/WCHAR* stringBuffer,
1417 UINT32size1418 );
1419 }
1420 1421 /// <summary>1422 /// The IDWriteFontCollection encapsulates a collection of fonts.1423 /// </summary>1424 mixin( uuid!(IDWriteFontCollection, "a84cee02-3eea-4eee-a827-87c1a02a0fcc") );
1425 interfaceIDWriteFontCollection : IUnknown1426 {
1427 extern(Windows):
1428 /// <summary>1429 /// Gets the number of font families in the collection.1430 /// </summary>1431 UINT32GetFontFamilyCount();
1432 1433 /// <summary>1434 /// Creates a font family object given a zero-based font family index.1435 /// </summary>1436 /// <param name="index">Zero-based index of the font family.</param>1437 /// <param name="fontFamily">Receives a pointer the newly created font family object.</param>1438 /// <returns>1439 /// Standard HRESULT error code.1440 /// </returns>1441 HRESULTGetFontFamily(
1442 UINT32index,
1443 /*out*/IDWriteFontFamily* fontFamily1444 );
1445 1446 /// <summary>1447 /// Finds the font family with the specified family name.1448 /// </summary>1449 /// <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>1450 /// <param name="index">Receives the zero-based index of the matching font family if the family name was found or UINT_MAX otherwise.</param>1451 /// <param name="exists">Receives TRUE if the family name exists or FALSE otherwise.</param>1452 /// <returns>1453 /// 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.1454 /// </returns>1455 HRESULTFindFamilyName(
1456 const(WCHAR)* familyName,
1457 /*out*/UINT32* index,
1458 /*out*/BOOL* exists1459 );
1460 1461 /// <summary>1462 /// Gets the font object that corresponds to the same physical font as the specified font face object. The specified physical font must belong 1463 /// to the font collection.1464 /// </summary>1465 /// <param name="fontFace">Font face object that specifies the physical font.</param>1466 /// <param name="font">Receives a pointer to the newly created font object if successful or NULL otherwise.</param>1467 /// <returns>1468 /// Standard HRESULT error code. If the specified physical font is not part of the font collection the return value is DWRITE_E_NOFONT.1469 /// </returns>1470 HRESULTGetFontFromFontFace(
1471 IDWriteFontFacefontFace,
1472 /*out*/IDWriteFont* font1473 );
1474 }
1475 1476 /// <summary>1477 /// The IDWriteFontList interface represents a list of fonts.1478 /// </summary>1479 mixin( uuid!(IDWriteFontList, "1a0d8438-1d97-4ec1-aef9-a2fb86ed6acb") );
1480 interfaceIDWriteFontList : IUnknown1481 {
1482 extern(Windows):
1483 /// <summary>1484 /// Gets the font collection that contains the fonts.1485 /// </summary>1486 /// <param name="fontCollection">Receives a pointer to the font collection object.</param>1487 /// <returns>1488 /// Standard HRESULT error code.1489 /// </returns>1490 HRESULTGetFontCollection(
1491 /*out*/IDWriteFontCollection* fontCollection1492 );
1493 1494 /// <summary>1495 /// Gets the number of fonts in the font list.1496 /// </summary>1497 UINT32GetFontCount();
1498 1499 /// <summary>1500 /// Gets a font given its zero-based index.1501 /// </summary>1502 /// <param name="index">Zero-based index of the font in the font list.</param>1503 /// <param name="font">Receives a pointer to the newly created font object.</param>1504 /// <returns>1505 /// Standard HRESULT error code.1506 /// </returns>1507 HRESULTGetFont(
1508 UINT32index,
1509 /*out*/IDWriteFont* font1510 );
1511 }
1512 1513 /// <summary>1514 /// The IDWriteFontFamily interface represents a set of fonts that share the same design but are differentiated1515 /// by weight, stretch, and style.1516 /// </summary>1517 mixin( uuid!(IDWriteFontFamily, "da20d8ef-812a-4c43-9802-62ec4abd7add") );
1518 interfaceIDWriteFontFamily : IDWriteFontList1519 {
1520 extern(Windows):
1521 /// <summary>1522 /// Creates a localized strings object that contains the family names for the font family, indexed by locale name.1523 /// </summary>1524 /// <param name="names">Receives a pointer to the newly created localized strings object.</param>1525 /// <returns>1526 /// Standard HRESULT error code.1527 /// </returns>1528 HRESULTGetFamilyNames(
1529 /*out*/IDWriteLocalizedStrings* names1530 );
1531 1532 /// <summary>1533 /// Gets the font that best matches the specified properties.1534 /// </summary>1535 /// <param name="weight">Requested font weight.</param>1536 /// <param name="stretch">Requested font stretch.</param>1537 /// <param name="style">Requested font style.</param>1538 /// <param name="matchingFont">Receives a pointer to the newly created font object.</param>1539 /// <returns>1540 /// Standard HRESULT error code.1541 /// </returns>1542 HRESULTGetFirstMatchingFont(
1543 DWRITE_FONT_WEIGHTweight,
1544 DWRITE_FONT_STRETCHstretch,
1545 DWRITE_FONT_STYLEstyle,
1546 /*out*/IDWriteFont* matchingFont1547 );
1548 1549 /// <summary>1550 /// Gets a list of fonts in the font family ranked in order of how well they match the specified properties.1551 /// </summary>1552 /// <param name="weight">Requested font weight.</param>1553 /// <param name="stretch">Requested font stretch.</param>1554 /// <param name="style">Requested font style.</param>1555 /// <param name="matchingFonts">Receives a pointer to the newly created font list object.</param>1556 /// <returns>1557 /// Standard HRESULT error code.1558 /// </returns>1559 HRESULTGetMatchingFonts(
1560 DWRITE_FONT_WEIGHTweight,
1561 DWRITE_FONT_STRETCHstretch,
1562 DWRITE_FONT_STYLEstyle,
1563 IDWriteFontList* matchingFonts1564 );
1565 }
1566 1567 /// <summary>1568 /// The IDWriteFont interface represents a physical font in a font collection.1569 /// </summary>1570 mixin( uuid!(IDWriteFont, "acd16696-8c14-4f5d-877e-fe3fc1d32737") );
1571 interfaceIDWriteFont : IUnknown1572 {
1573 extern(Windows):
1574 /// <summary>1575 /// Gets the font family to which the specified font belongs.1576 /// </summary>1577 /// <param name="fontFamily">Receives a pointer to the font family object.</param>1578 /// <returns>1579 /// Standard HRESULT error code.1580 /// </returns>1581 HRESULTGetFontFamily(
1582 /*out*/IDWriteFontFamily* fontFamily1583 );
1584 1585 /// <summary>1586 /// Gets the weight of the specified font.1587 /// </summary>1588 DWRITE_FONT_WEIGHTGetWeight();
1589 1590 /// <summary>1591 /// Gets the stretch (aka. width) of the specified font.1592 /// </summary>1593 DWRITE_FONT_STRETCHGetStretch();
1594 1595 /// <summary>1596 /// Gets the style (aka. slope) of the specified font.1597 /// </summary>1598 DWRITE_FONT_STYLEGetStyle();
1599 1600 /// <summary>1601 /// Returns TRUE if the font is a symbol font or FALSE if not.1602 /// </summary>1603 BOOLIsSymbolFont();
1604 1605 /// <summary>1606 /// Gets a localized strings collection containing the face names for the font (e.g., Regular or Bold), indexed by locale name.1607 /// </summary>1608 /// <param name="names">Receives a pointer to the newly created localized strings object.</param>1609 /// <returns>1610 /// Standard HRESULT error code.1611 /// </returns>1612 HRESULTGetFaceNames(
1613 /*out*/IDWriteLocalizedStrings* names1614 );
1615 1616 /// <summary>1617 /// Gets a localized strings collection containing the specified informational strings, indexed by locale name.1618 /// </summary>1619 /// <param name="informationalStringID">Identifies the string to get.</param>1620 /// <param name="informationalStrings">Receives a pointer to the newly created localized strings object.</param>1621 /// <param name="exists">Receives the value TRUE if the font contains the specified string ID or FALSE if not.</param>1622 /// <returns>1623 /// Standard HRESULT error code. If the font does not contain the specified string, the return value is S_OK but 1624 /// informationalStrings receives a NULL pointer and exists receives the value FALSE.1625 /// </returns>1626 HRESULTGetInformationalStrings(
1627 DWRITE_INFORMATIONAL_STRING_IDinformationalStringID,
1628 /*out*/IDWriteLocalizedStrings* informationalStrings,
1629 /*out*/BOOL* exists1630 );
1631 1632 /// <summary>1633 /// Gets a value that indicates what simulation are applied to the specified font.1634 /// </summary>1635 DWRITE_FONT_SIMULATIONSGetSimulations();
1636 1637 /// <summary>1638 /// Gets the metrics for the font.1639 /// </summary>1640 /// <param name="fontMetrics">Receives the font metrics.</param>1641 voidGetMetrics(
1642 /*out*/DWRITE_FONT_METRICS* fontMetrics1643 );
1644 1645 /// <summary>1646 /// Determines whether the font supports the specified character.1647 /// </summary>1648 /// <param name="unicodeValue">Unicode (UCS-4) character value.</param>1649 /// <param name="exists">Receives the value TRUE if the font supports the specified character or FALSE if not.</param>1650 /// <returns>1651 /// Standard HRESULT error code.1652 /// </returns>1653 HRESULTHasCharacter(
1654 UINT32unicodeValue,
1655 /*out*/BOOL* exists1656 );
1657 1658 /// <summary>1659 /// Creates a font face object for the font.1660 /// </summary>1661 /// <param name="fontFace">Receives a pointer to the newly created font face object.</param>1662 /// <returns>1663 /// Standard HRESULT error code.1664 /// </returns>1665 HRESULTCreateFontFace(
1666 /*out*/IDWriteFontFace* fontFace1667 );
1668 }
1669 1670 /// <summary>1671 /// Direction for how reading progresses.1672 /// </summary>1673 aliasDWRITE_READING_DIRECTION = int;
1674 enum : DWRITE_READING_DIRECTION1675 {
1676 /// <summary>1677 /// Reading progresses from left to right.1678 /// </summary>1679 DWRITE_READING_DIRECTION_LEFT_TO_RIGHT = 0,
1680 1681 /// <summary>1682 /// Reading progresses from right to left.1683 /// </summary>1684 DWRITE_READING_DIRECTION_RIGHT_TO_LEFT = 1,
1685 1686 /// <summary>1687 /// Reading progresses from top to bottom.1688 /// </summary>1689 DWRITE_READING_DIRECTION_TOP_TO_BOTTOM = 2,
1690 1691 /// <summary>1692 /// Reading progresses from bottom to top.1693 /// </summary>1694 DWRITE_READING_DIRECTION_BOTTOM_TO_TOP = 3,
1695 }
1696 1697 /// <summary>1698 /// Direction for how lines of text are placed relative to one another.1699 /// </summary>1700 aliasDWRITE_FLOW_DIRECTION = int;
1701 enum : DWRITE_FLOW_DIRECTION1702 {
1703 /// <summary>1704 /// Text lines are placed from top to bottom.1705 /// </summary>1706 DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM = 0,
1707 1708 /// <summary>1709 /// Text lines are placed from bottom to top.1710 /// </summary>1711 DWRITE_FLOW_DIRECTION_BOTTOM_TO_TOP = 1,
1712 1713 /// <summary>1714 /// Text lines are placed from left to right.1715 /// </summary>1716 DWRITE_FLOW_DIRECTION_LEFT_TO_RIGHT = 2,
1717 1718 /// <summary>1719 /// Text lines are placed from right to left.1720 /// </summary>1721 DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFT = 3,
1722 }
1723 1724 /// <summary>1725 /// Alignment of paragraph text along the reading direction axis relative to 1726 /// the leading and trailing edge of the layout box.1727 /// </summary>1728 aliasDWRITE_TEXT_ALIGNMENT = int;
1729 enum : DWRITE_TEXT_ALIGNMENT1730 {
1731 /// <summary>1732 /// The leading edge of the paragraph text is aligned to the layout box's leading edge.1733 /// </summary>1734 DWRITE_TEXT_ALIGNMENT_LEADING,
1735 1736 /// <summary>1737 /// The trailing edge of the paragraph text is aligned to the layout box's trailing edge.1738 /// </summary>1739 DWRITE_TEXT_ALIGNMENT_TRAILING,
1740 1741 /// <summary>1742 /// The center of the paragraph text is aligned to the center of the layout box.1743 /// </summary>1744 DWRITE_TEXT_ALIGNMENT_CENTER,
1745 1746 /// <summary>1747 /// Align text to the leading side, and also justify text to fill the lines.1748 /// </summary>1749 DWRITE_TEXT_ALIGNMENT_JUSTIFIED1750 }
1751 1752 /// <summary>1753 /// Alignment of paragraph text along the flow direction axis relative to the1754 /// flow's beginning and ending edge of the layout box.1755 /// </summary>1756 aliasDWRITE_PARAGRAPH_ALIGNMENT = int;
1757 enum : DWRITE_PARAGRAPH_ALIGNMENT1758 {
1759 /// <summary>1760 /// The first line of paragraph is aligned to the flow's beginning edge of the layout box.1761 /// </summary>1762 DWRITE_PARAGRAPH_ALIGNMENT_NEAR,
1763 1764 /// <summary>1765 /// The last line of paragraph is aligned to the flow's ending edge of the layout box.1766 /// </summary>1767 DWRITE_PARAGRAPH_ALIGNMENT_FAR,
1768 1769 /// <summary>1770 /// The center of the paragraph is aligned to the center of the flow of the layout box.1771 /// </summary>1772 DWRITE_PARAGRAPH_ALIGNMENT_CENTER1773 }
1774 1775 /// <summary>1776 /// Word wrapping in multiline paragraph.1777 /// </summary>1778 aliasDWRITE_WORD_WRAPPING = int;
1779 enum : DWRITE_WORD_WRAPPING1780 {
1781 /// <summary>1782 /// Words are broken across lines to avoid text overflowing the layout box.1783 /// </summary>1784 DWRITE_WORD_WRAPPING_WRAP = 0,
1785 1786 /// <summary>1787 /// Words are kept within the same line even when it overflows the layout box.1788 /// This option is often used with scrolling to reveal overflow text. 1789 /// </summary>1790 DWRITE_WORD_WRAPPING_NO_WRAP = 1,
1791 1792 /// <summary>1793 /// Words are broken across lines to avoid text overflowing the layout box.1794 /// Emergency wrapping occurs if the word is larger than the maximum width.1795 /// </summary>1796 DWRITE_WORD_WRAPPING_EMERGENCY_BREAK = 2,
1797 1798 /// <summary>1799 /// Only wrap whole words, never breaking words (emergency wrapping) when the1800 /// layout width is too small for even a single word.1801 /// </summary>1802 DWRITE_WORD_WRAPPING_WHOLE_WORD = 3,
1803 1804 /// <summary>1805 /// Wrap between any valid characters clusters.1806 /// </summary>1807 DWRITE_WORD_WRAPPING_CHARACTER = 4,
1808 };
1809 1810 /// <summary>1811 /// The method used for line spacing in layout.1812 /// </summary>1813 aliasDWRITE_LINE_SPACING_METHOD = int;
1814 enum : DWRITE_LINE_SPACING_METHOD1815 {
1816 /// <summary>1817 /// Line spacing depends solely on the content, growing to accommodate the size of fonts and inline objects.1818 /// </summary>1819 DWRITE_LINE_SPACING_METHOD_DEFAULT,
1820 1821 /// <summary>1822 /// Lines are explicitly set to uniform spacing, regardless of contained font sizes.1823 /// This can be useful to avoid the uneven appearance that can occur from font fallback.1824 /// </summary>1825 DWRITE_LINE_SPACING_METHOD_UNIFORM1826 }
1827 1828 /// <summary>1829 /// Text granularity used to trim text overflowing the layout box.1830 /// </summary>1831 aliasDWRITE_TRIMMING_GRANULARITY = int;
1832 enum : DWRITE_TRIMMING_GRANULARITY1833 {
1834 /// <summary>1835 /// No trimming occurs. Text flows beyond the layout width.1836 /// </summary>1837 DWRITE_TRIMMING_GRANULARITY_NONE,
1838 1839 /// <summary>1840 /// Trimming occurs at character cluster boundary.1841 /// </summary>1842 DWRITE_TRIMMING_GRANULARITY_CHARACTER,
1843 1844 /// <summary>1845 /// Trimming occurs at word boundary.1846 /// </summary>1847 DWRITE_TRIMMING_GRANULARITY_WORD1848 }
1849 1850 /// <summary>1851 /// Typographic feature of text supplied by the font.1852 /// </summary>1853 aliasDWRITE_FONT_FEATURE_TAG = int;
1854 enum : DWRITE_FONT_FEATURE_TAG1855 {
1856 DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS = 0x63726661, // 'afrc'1857 DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS = 0x63703263, // 'c2pc'1858 DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS = 0x63733263, // 'c2sc'1859 DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES = 0x746c6163, // 'calt'1860 DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS = 0x65736163, // 'case'1861 DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION = 0x706d6363, // 'ccmp'1862 DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES = 0x67696c63, // 'clig'1863 DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING = 0x70737063, // 'cpsp'1864 DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH = 0x68777363, // 'cswh'1865 DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING = 0x73727563, // 'curs'1866 DWRITE_FONT_FEATURE_TAG_DEFAULT = 0x746c6664, // 'dflt'1867 DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES = 0x67696c64, // 'dlig'1868 DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS = 0x74707865, // 'expt'1869 DWRITE_FONT_FEATURE_TAG_FRACTIONS = 0x63617266, // 'frac'1870 DWRITE_FONT_FEATURE_TAG_FULL_WIDTH = 0x64697766, // 'fwid'1871 DWRITE_FONT_FEATURE_TAG_HALF_FORMS = 0x666c6168, // 'half'1872 DWRITE_FONT_FEATURE_TAG_HALANT_FORMS = 0x6e6c6168, // 'haln'1873 DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH = 0x746c6168, // 'halt'1874 DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS = 0x74736968, // 'hist'1875 DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES = 0x616e6b68, // 'hkna'1876 DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES = 0x67696c68, // 'hlig'1877 DWRITE_FONT_FEATURE_TAG_HALF_WIDTH = 0x64697768, // 'hwid'1878 DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS = 0x6f6a6f68, // 'hojo'1879 DWRITE_FONT_FEATURE_TAG_JIS04_FORMS = 0x3430706a, // 'jp04'1880 DWRITE_FONT_FEATURE_TAG_JIS78_FORMS = 0x3837706a, // 'jp78'1881 DWRITE_FONT_FEATURE_TAG_JIS83_FORMS = 0x3338706a, // 'jp83'1882 DWRITE_FONT_FEATURE_TAG_JIS90_FORMS = 0x3039706a, // 'jp90'1883 DWRITE_FONT_FEATURE_TAG_KERNING = 0x6e72656b, // 'kern'1884 DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES = 0x6167696c, // 'liga'1885 DWRITE_FONT_FEATURE_TAG_LINING_FIGURES = 0x6d756e6c, // 'lnum'1886 DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS = 0x6c636f6c, // 'locl'1887 DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING = 0x6b72616d, // 'mark'1888 DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK = 0x6b72676d, // 'mgrk'1889 DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING = 0x6b6d6b6d, // 'mkmk'1890 DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS = 0x746c616e, // 'nalt'1891 DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS = 0x6b636c6e, // 'nlck'1892 DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES = 0x6d756e6f, // 'onum'1893 DWRITE_FONT_FEATURE_TAG_ORDINALS = 0x6e64726f, // 'ordn'1894 DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH = 0x746c6170, // 'palt'1895 DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS = 0x70616370, // 'pcap'1896 DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES = 0x6d756e70, // 'pnum'1897 DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS = 0x64697770, // 'pwid'1898 DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS = 0x64697771, // 'qwid'1899 DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES = 0x67696c72, // 'rlig'1900 DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS = 0x79627572, // 'ruby'1901 DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES = 0x746c6173, // 'salt'1902 DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS = 0x666e6973, // 'sinf'1903 DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS = 0x70636d73, // 'smcp'1904 DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS = 0x6c706d73, // 'smpl'1905 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1 = 0x31307373, // 'ss01'1906 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2 = 0x32307373, // 'ss02'1907 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3 = 0x33307373, // 'ss03'1908 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4 = 0x34307373, // 'ss04'1909 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5 = 0x35307373, // 'ss05'1910 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6 = 0x36307373, // 'ss06'1911 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7 = 0x37307373, // 'ss07'1912 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8 = 0x38307373, // 'ss08'1913 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9 = 0x39307373, // 'ss09'1914 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10 = 0x30317373, // 'ss10'1915 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11 = 0x31317373, // 'ss11'1916 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12 = 0x32317373, // 'ss12'1917 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13 = 0x33317373, // 'ss13'1918 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14 = 0x34317373, // 'ss14'1919 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15 = 0x35317373, // 'ss15'1920 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16 = 0x36317373, // 'ss16'1921 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17 = 0x37317373, // 'ss17'1922 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18 = 0x38317373, // 'ss18'1923 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19 = 0x39317373, // 'ss19'1924 DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20 = 0x30327373, // 'ss20'1925 DWRITE_FONT_FEATURE_TAG_SUBSCRIPT = 0x73627573, // 'subs'1926 DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT = 0x73707573, // 'sups'1927 DWRITE_FONT_FEATURE_TAG_SWASH = 0x68737773, // 'swsh'1928 DWRITE_FONT_FEATURE_TAG_TITLING = 0x6c746974, // 'titl'1929 DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS = 0x6d616e74, // 'tnam'1930 DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES = 0x6d756e74, // 'tnum'1931 DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS = 0x64617274, // 'trad'1932 DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS = 0x64697774, // 'twid'1933 DWRITE_FONT_FEATURE_TAG_UNICASE = 0x63696e75, // 'unic'1934 DWRITE_FONT_FEATURE_TAG_VERTICAL_WRITING = 0x74726576, // 'vert'1935 DWRITE_FONT_FEATURE_TAG_VERTICAL_ALTERNATES_AND_ROTATION = 0x32747276, // 'vrt2'1936 DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO = 0x6f72657a, // 'zero'1937 }
1938 1939 /// <summary>1940 /// The DWRITE_TEXT_RANGE structure specifies a range of text positions where format is applied.1941 /// </summary>1942 structDWRITE_TEXT_RANGE1943 {
1944 /// <summary>1945 /// The start text position of the range.1946 /// </summary>1947 UINT32startPosition;
1948 1949 /// <summary>1950 /// The number of text positions in the range.1951 /// </summary>1952 UINT32length;
1953 }
1954 1955 /// <summary>1956 /// The DWRITE_FONT_FEATURE structure specifies properties used to identify and execute typographic feature in the font.1957 /// </summary>1958 structDWRITE_FONT_FEATURE1959 {
1960 /// <summary>1961 /// The feature OpenType name identifier.1962 /// </summary>1963 DWRITE_FONT_FEATURE_TAGnameTag;
1964 1965 /// <summary>1966 /// Execution parameter of the feature.1967 /// </summary>1968 /// <remarks>1969 /// The parameter should be non-zero to enable the feature. Once enabled, a feature can't be disabled again within1970 /// the same range. Features requiring a selector use this value to indicate the selector index. 1971 /// </remarks>1972 UINT32parameter;
1973 }
1974 1975 /// <summary>1976 /// Defines a set of typographic features to be applied during shaping.1977 /// Notice the character range which this feature list spans is specified1978 /// as a separate parameter to GetGlyphs.1979 /// </summary>1980 structDWRITE_TYPOGRAPHIC_FEATURES1981 {
1982 /// <summary>1983 /// Array of font features.1984 /// </summary>1985 DWRITE_FONT_FEATURE* features;
1986 1987 /// <summary>1988 /// The number of features.1989 /// </summary>1990 UINT32featureCount;
1991 }
1992 1993 /// <summary>1994 /// The DWRITE_TRIMMING structure specifies the trimming option for text overflowing the layout box.1995 /// </summary>1996 structDWRITE_TRIMMING1997 {
1998 /// <summary>1999 /// Text granularity of which trimming applies.2000 /// </summary>2001 DWRITE_TRIMMING_GRANULARITYgranularity;
2002 2003 /// <summary>2004 /// Character code used as the delimiter signaling the beginning of the portion of text to be preserved,2005 /// most useful for path ellipsis, where the delimiter would be a slash.2006 /// </summary>2007 UINT32delimiter;
2008 2009 /// <summary>2010 /// How many occurrences of the delimiter to step back.2011 /// </summary>2012 UINT32delimiterCount;
2013 }
2014 2015 2016 /// <summary>2017 /// The format of text used for text layout.2018 /// </summary>2019 /// <remarks>2020 /// This object may not be thread-safe and it may carry the state of text format change.2021 /// </remarks>2022 mixin( uuid!(IDWriteTextFormat, "9c906818-31d7-4fd3-a151-7c5e225db55a") );
2023 interfaceIDWriteTextFormat : IUnknown2024 {
2025 extern(Windows):
2026 /// <summary>2027 /// Set alignment option of text relative to layout box's leading and trailing edge.2028 /// </summary>2029 /// <param name="textAlignment">Text alignment option</param>2030 /// <returns>2031 /// Standard HRESULT error code.2032 /// </returns>2033 HRESULTSetTextAlignment(
2034 DWRITE_TEXT_ALIGNMENTtextAlignment2035 );
2036 2037 /// <summary>2038 /// Set alignment option of paragraph relative to layout box's top and bottom edge.2039 /// </summary>2040 /// <param name="paragraphAlignment">Paragraph alignment option</param>2041 /// <returns>2042 /// Standard HRESULT error code.2043 /// </returns>2044 HRESULTSetParagraphAlignment(
2045 DWRITE_PARAGRAPH_ALIGNMENTparagraphAlignment2046 );
2047 2048 /// <summary>2049 /// Set word wrapping option.2050 /// </summary>2051 /// <param name="wordWrapping">Word wrapping option</param>2052 /// <returns>2053 /// Standard HRESULT error code.2054 /// </returns>2055 HRESULTSetWordWrapping(
2056 DWRITE_WORD_WRAPPINGwordWrapping2057 );
2058 2059 /// <summary>2060 /// Set paragraph reading direction.2061 /// </summary>2062 /// <param name="readingDirection">Text reading direction</param>2063 /// <returns>2064 /// Standard HRESULT error code.2065 /// </returns>2066 /// <remarks>2067 /// The flow direction must be perpendicular to the reading direction.2068 /// Setting both to a vertical direction or both to horizontal yields2069 /// DWRITE_E_FLOWDIRECTIONCONFLICTS when calling GetMetrics or Draw.2070 /// </remark>2071 HRESULTSetReadingDirection(
2072 DWRITE_READING_DIRECTIONreadingDirection2073 );
2074 2075 /// <summary>2076 /// Set paragraph flow direction.2077 /// </summary>2078 /// <param name="flowDirection">Paragraph flow direction</param>2079 /// <returns>2080 /// Standard HRESULT error code.2081 /// </returns>2082 /// <remarks>2083 /// The flow direction must be perpendicular to the reading direction.2084 /// Setting both to a vertical direction or both to horizontal yields2085 /// DWRITE_E_FLOWDIRECTIONCONFLICTS when calling GetMetrics or Draw.2086 /// </remark>2087 HRESULTSetFlowDirection(
2088 DWRITE_FLOW_DIRECTIONflowDirection2089 );
2090 2091 /// <summary>2092 /// Set incremental tab stop position.2093 /// </summary>2094 /// <param name="incrementalTabStop">The incremental tab stop value</param>2095 /// <returns>2096 /// Standard HRESULT error code.2097 /// </returns>2098 HRESULTSetIncrementalTabStop(
2099 FLOATincrementalTabStop2100 );
2101 2102 /// <summary>2103 /// Set trimming options for any trailing text exceeding the layout width2104 /// or for any far text exceeding the layout height.2105 /// </summary>2106 /// <param name="trimmingOptions">Text trimming options.</param>2107 /// <param name="trimmingSign">Application-defined omission sign. This parameter may be NULL if no trimming sign is desired.</param>2108 /// <remarks>2109 /// Any inline object can be used for the trimming sign, but CreateEllipsisTrimmingSign2110 /// provides a typical ellipsis symbol. Trimming is also useful vertically for hiding2111 /// partial lines.2112 /// </remarks>2113 /// <returns>2114 /// Standard HRESULT error code.2115 /// </returns>2116 HRESULTSetTrimming(
2117 const(DWRITE_TRIMMING)* trimmingOptions,
2118 IDWriteInlineObjecttrimmingSign2119 );
2120 2121 /// <summary>2122 /// Set line spacing.2123 /// </summary>2124 /// <param name="lineSpacingMethod">How to determine line height.</param>2125 /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>2126 /// <param name="baseline">Distance from top of line to baseline. A reasonable ratio to lineSpacing is 80%.</param>2127 /// <remarks>2128 /// For the default method, spacing depends solely on the content.2129 /// For uniform spacing, the given line height will override the content.2130 /// </remarks>2131 /// <returns>2132 /// Standard HRESULT error code.2133 /// </returns>2134 HRESULTSetLineSpacing(
2135 DWRITE_LINE_SPACING_METHODlineSpacingMethod,
2136 FLOATlineSpacing,
2137 FLOATbaseline2138 );
2139 2140 /// <summary>2141 /// Get alignment option of text relative to layout box's leading and trailing edge.2142 /// </summary>2143 DWRITE_TEXT_ALIGNMENTGetTextAlignment();
2144 2145 /// <summary>2146 /// Get alignment option of paragraph relative to layout box's top and bottom edge.2147 /// </summary>2148 DWRITE_PARAGRAPH_ALIGNMENTGetParagraphAlignment();
2149 2150 /// <summary>2151 /// Get word wrapping option.2152 /// </summary>2153 DWRITE_WORD_WRAPPINGGetWordWrapping();
2154 2155 /// <summary>2156 /// Get paragraph reading direction.2157 /// </summary>2158 DWRITE_READING_DIRECTIONGetReadingDirection();
2159 2160 /// <summary>2161 /// Get paragraph flow direction.2162 /// </summary>2163 DWRITE_FLOW_DIRECTIONGetFlowDirection();
2164 2165 /// <summary>2166 /// Get incremental tab stop position.2167 /// </summary>2168 FLOATGetIncrementalTabStop();
2169 2170 /// <summary>2171 /// Get trimming options for text overflowing the layout width.2172 /// </summary>2173 /// <param name="trimmingOptions">Text trimming options.</param>2174 /// <param name="trimmingSign">Trimming omission sign. This parameter may be NULL.</param>2175 /// <returns>2176 /// Standard HRESULT error code.2177 /// </returns>2178 HRESULTGetTrimming(
2179 /*out*/DWRITE_TRIMMING* trimmingOptions,
2180 /*out*/IDWriteInlineObject* trimmingSign2181 );
2182 2183 /// <summary>2184 /// Get line spacing.2185 /// </summary>2186 /// <param name="lineSpacingMethod">How line height is determined.</param>2187 /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>2188 /// <param name="baseline">Distance from top of line to baseline.</param>2189 /// <returns>2190 /// Standard HRESULT error code.2191 /// </returns>2192 HRESULTGetLineSpacing(
2193 /*out*/DWRITE_LINE_SPACING_METHOD* lineSpacingMethod,
2194 /*out*/FLOAT* lineSpacing,
2195 /*out*/FLOAT* baseline2196 );
2197 2198 /// <summary>2199 /// Get the font collection.2200 /// </summary>2201 /// <param name="fontCollection">The current font collection.</param>2202 /// <returns>2203 /// Standard HRESULT error code.2204 /// </returns>2205 HRESULTGetFontCollection(
2206 /*out*/IDWriteFontCollection* fontCollection2207 );
2208 2209 /// <summary>2210 /// Get the length of the font family name, in characters, not including the terminating NULL character.2211 /// </summary>2212 UINT32GetFontFamilyNameLength();
2213 2214 /// <summary>2215 /// Get a copy of the font family name.2216 /// </summary>2217 /// <param name="fontFamilyName">Character array that receives the current font family name</param>2218 /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>2219 /// <returns>2220 /// Standard HRESULT error code.2221 /// </returns>2222 HRESULTGetFontFamilyName(
2223 /*out*/WCHAR* fontFamilyName,
2224 UINT32nameSize2225 );
2226 2227 /// <summary>2228 /// Get the font weight.2229 /// </summary>2230 DWRITE_FONT_WEIGHTGetFontWeight();
2231 2232 /// <summary>2233 /// Get the font style.2234 /// </summary>2235 DWRITE_FONT_STYLEGetFontStyle();
2236 2237 /// <summary>2238 /// Get the font stretch.2239 /// </summary>2240 DWRITE_FONT_STRETCHGetFontStretch();
2241 2242 /// <summary>2243 /// Get the font em height.2244 /// </summary>2245 FLOATGetFontSize();
2246 2247 /// <summary>2248 /// Get the length of the locale name, in characters, not including the terminating NULL character.2249 /// </summary>2250 UINT32GetLocaleNameLength();
2251 2252 /// <summary>2253 /// Get a copy of the locale name.2254 /// </summary>2255 /// <param name="localeName">Character array that receives the current locale name</param>2256 /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>2257 /// <returns>2258 /// Standard HRESULT error code.2259 /// </returns>2260 HRESULTGetLocaleName(
2261 /*out*/WCHAR* localeName,
2262 UINT32nameSize2263 );
2264 }
2265 2266 2267 /// <summary>2268 /// Font typography setting.2269 /// </summary>2270 mixin( uuid!(IDWriteTypography, "55f1112b-1dc2-4b3c-9541-f46894ed85b6") );
2271 interfaceIDWriteTypography : IUnknown2272 {
2273 extern(Windows):
2274 /// <summary>2275 /// Add font feature.2276 /// </summary>2277 /// <param name="fontFeature">The font feature to add.</param>2278 /// <returns>2279 /// Standard HRESULT error code.2280 /// </returns>2281 HRESULTAddFontFeature(
2282 DWRITE_FONT_FEATUREfontFeature2283 );
2284 2285 /// <summary>2286 /// Get the number of font features.2287 /// </summary>2288 UINT32GetFontFeatureCount();
2289 2290 /// <summary>2291 /// Get the font feature at the specified index.2292 /// </summary>2293 /// <param name="fontFeatureIndex">The zero-based index of the font feature to get.</param>2294 /// <param name="fontFeature">The font feature.</param>2295 /// <returns>2296 /// Standard HRESULT error code.2297 /// </returns>2298 HRESULTGetFontFeature(
2299 UINT32fontFeatureIndex,
2300 /*out*/DWRITE_FONT_FEATURE* fontFeature2301 );
2302 }
2303 2304 aliasDWRITE_SCRIPT_SHAPES = int;
2305 enum : DWRITE_SCRIPT_SHAPES2306 {
2307 /// <summary>2308 /// No additional shaping requirement. Text is shaped with the writing system default behavior.2309 /// </summary>2310 DWRITE_SCRIPT_SHAPES_DEFAULT = 0,
2311 2312 /// <summary>2313 /// Text should leave no visual on display i.e. control or format control characters.2314 /// </summary>2315 DWRITE_SCRIPT_SHAPES_NO_VISUAL = 12316 }
2317 /*
2318 #ifdef DEFINE_ENUM_FLAG_OPERATORS
2319 DEFINE_ENUM_FLAG_OPERATORS(DWRITE_SCRIPT_SHAPES);
2320 #endif
2321 */2322 2323 /// <summary>2324 /// Association of text and its writing system script as well as some display attributes.2325 /// </summary>2326 structDWRITE_SCRIPT_ANALYSIS2327 {
2328 /// <summary>2329 /// Zero-based index representation of writing system script.2330 /// </summary>2331 UINT16script;
2332 2333 /// <summary>2334 /// Additional shaping requirement of text.2335 /// </summary>2336 DWRITE_SCRIPT_SHAPESshapes;
2337 }
2338 2339 /// <summary>2340 /// Condition at the edges of inline object or text used to determine2341 /// line-breaking behavior.2342 /// </summary>2343 aliasDWRITE_BREAK_CONDITION = int;
2344 enum : DWRITE_BREAK_CONDITION2345 {
2346 /// <summary>2347 /// Whether a break is allowed is determined by the condition of the2348 /// neighboring text span or inline object.2349 /// </summary>2350 DWRITE_BREAK_CONDITION_NEUTRAL,
2351 2352 /// <summary>2353 /// A break is allowed, unless overruled by the condition of the2354 /// neighboring text span or inline object, either prohibited by a2355 /// May Not or forced by a Must.2356 /// </summary>2357 DWRITE_BREAK_CONDITION_CAN_BREAK,
2358 2359 /// <summary>2360 /// There should be no break, unless overruled by a Must condition from2361 /// the neighboring text span or inline object.2362 /// </summary>2363 DWRITE_BREAK_CONDITION_MAY_NOT_BREAK,
2364 2365 /// <summary>2366 /// The break must happen, regardless of the condition of the adjacent2367 /// text span or inline object.2368 /// </summary>2369 DWRITE_BREAK_CONDITION_MUST_BREAK2370 }
2371 2372 /// <summary>2373 /// Line breakpoint characteristics of a character.2374 /// </summary>2375 structDWRITE_LINE_BREAKPOINT2376 {
2377 align(1):
2378 union2379 {
2380 UINT8data_;
2381 }
2382 // TODO: make helper properties2383 /*
2384 /// <summary>
2385 /// Breaking condition before the character.
2386 /// </summary>
2387 UINT8 breakConditionBefore : 2;
2388 2389 /// <summary>
2390 /// Breaking condition after the character.
2391 /// </summary>
2392 UINT8 breakConditionAfter : 2;
2393 2394 /// <summary>
2395 /// The character is some form of whitespace, which may be meaningful
2396 /// for justification.
2397 /// </summary>
2398 UINT8 isWhitespace : 1;
2399 2400 /// <summary>
2401 /// The character is a soft hyphen, often used to indicate hyphenation
2402 /// points inside words.
2403 /// </summary>
2404 UINT8 isSoftHyphen : 1;
2405 2406 UINT8 padding : 2;
2407 */2408 }
2409 2410 /// <summary>2411 /// How to apply number substitution on digits and related punctuation.2412 /// </summary>2413 aliasDWRITE_NUMBER_SUBSTITUTION_METHOD = int;
2414 enum : DWRITE_NUMBER_SUBSTITUTION_METHOD2415 {
2416 /// <summary>2417 /// Specifies that the substitution method should be determined based2418 /// on LOCALE_IDIGITSUBSTITUTION value of the specified text culture.2419 /// </summary>2420 DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE,
2421 2422 /// <summary>2423 /// If the culture is Arabic or Farsi, specifies that the number shape2424 /// depend on the context. Either traditional or nominal number shape2425 /// are used depending on the nearest preceding strong character or (if2426 /// there is none) the reading direction of the paragraph.2427 /// </summary>2428 DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL,
2429 2430 /// <summary>2431 /// Specifies that code points 0x30-0x39 are always rendered as nominal numeral 2432 /// shapes (ones of the European number), i.e., no substitution is performed.2433 /// </summary>2434 DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE,
2435 2436 /// <summary>2437 /// Specifies that number are rendered using the national number shape 2438 /// as specified by the LOCALE_SNATIVEDIGITS value of the specified text culture.2439 /// </summary>2440 DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL,
2441 2442 /// <summary>2443 /// Specifies that number are rendered using the traditional shape2444 /// for the specified culture. For most cultures, this is the same as2445 /// NativeNational. However, NativeNational results in Latin number2446 /// for some Arabic cultures, whereas this value results in Arabic2447 /// number for all Arabic cultures.2448 /// </summary>2449 DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL2450 }
2451 2452 /// <summary>2453 /// Holds the appropriate digits and numeric punctuation for a given locale.2454 /// </summary>2455 mixin( uuid!(IDWriteNumberSubstitution, "14885CC9-BAB0-4f90-B6ED-5C366A2CD03D") );
2456 interfaceIDWriteNumberSubstitution : IUnknown2457 {
2458 extern(Windows):
2459 };
2460 2461 /// <summary>2462 /// Shaping output properties per input character.2463 /// </summary>2464 structDWRITE_SHAPING_TEXT_PROPERTIES2465 {
2466 align(1):
2467 union2468 {
2469 UINT16data_;
2470 }
2471 2472 // TODO: make helper proeprties2473 /*
2474 /// <summary>
2475 /// This character can be shaped independently from the others
2476 /// (usually set for the space character).
2477 /// </summary>
2478 UINT16 isShapedAlone : 1;
2479 2480 /// <summary>
2481 /// Reserved for use by shaping engine.
2482 /// </summary>
2483 UINT16 reserved : 15;
2484 */2485 }
2486 2487 /// <summary>2488 /// Shaping output properties per output glyph.2489 /// </summary>2490 structDWRITE_SHAPING_GLYPH_PROPERTIES2491 {
2492 align(1):
2493 union2494 {
2495 UINT16data_;
2496 }
2497 /*
2498 // TODO: make helper proeprties
2499 /// <summary>
2500 /// Justification class, whether to use spacing, kashidas, or
2501 /// another method. This exists for backwards compatibility
2502 /// with Uniscribe's SCRIPT_JUSTIFY enum.
2503 /// </summary>
2504 UINT16 justification : 4;
2505 2506 /// <summary>
2507 /// Indicates glyph is the first of a cluster.
2508 /// </summary>
2509 UINT16 isClusterStart : 1;
2510 2511 /// <summary>
2512 /// Glyph is a diacritic.
2513 /// </summary>
2514 UINT16 isDiacritic : 1;
2515 2516 /// <summary>
2517 /// Glyph has no width, blank, ZWJ, ZWNJ etc.
2518 /// </summary>
2519 UINT16 isZeroWidthSpace : 1;
2520 2521 /// <summary>
2522 /// Reserved for use by shaping engine.
2523 /// </summary>
2524 UINT16 reserved : 9;
2525 */2526 }
2527 2528 /// <summary>2529 /// The interface implemented by the text analyzer's client to provide text to2530 /// the analyzer. It allows the separation between the logical view of text as2531 /// a continuous stream of characters identifiable by unique text positions,2532 /// and the actual memory layout of potentially discrete blocks of text in the2533 /// client's backing store.2534 ///2535 /// If any of these callbacks returns an error, the analysis functions will2536 /// stop prematurely and return a callback error. Rather than return E_NOTIMPL,2537 /// an application should stub the method and return a constant/null and S_OK.2538 /// </summary>2539 mixin( uuid!(IDWriteTextAnalysisSource, "688e1a58-5094-47c8-adc8-fbcea60ae92b") );
2540 interfaceIDWriteTextAnalysisSource : IUnknown2541 {
2542 extern(Windows):
2543 /// <summary>2544 /// Get a block of text starting at the specified text position.2545 /// Returning NULL indicates the end of text - the position is after2546 /// the last character. This function is called iteratively for2547 /// each consecutive block, tying together several fragmented blocks2548 /// in the backing store into a virtual contiguous string.2549 /// </summary>2550 /// <param name="textPosition">First position of the piece to obtain. All2551 /// positions are in UTF16 code-units, not whole characters, which2552 /// matters when supplementary characters are used.</param>2553 /// <param name="textString">Address that receives a pointer to the text block2554 /// at the specified position.</param>2555 /// <param name="textLength">Number of UTF16 units of the retrieved chunk.2556 /// The returned length is not the length of the block, but the length2557 /// remaining in the block, from the given position until its end.2558 /// So querying for a position that is 75 positions into a 1002559 /// position block would return 25.</param>2560 /// <returns>Pointer to the first character at the given text position.2561 /// NULL indicates no chunk available at the specified position, either2562 /// because textPosition >= the entire text content length or because the2563 /// queried position is not mapped into the app's backing store.</returns>2564 /// <remarks>2565 /// Although apps can implement sparse textual content that only maps part of2566 /// the backing store, the app must map any text that is in the range passed2567 /// to any analysis functions.2568 /// </remarks>2569 HRESULTGetTextAtPosition(
2570 UINT32textPosition,
2571 /*out*/const(WCHAR*)* textString,
2572 /*out*/UINT32* textLength2573 );
2574 2575 /// <summary>2576 /// Get a block of text immediately preceding the specified position.2577 /// </summary>2578 /// <param name="textPosition">Position immediately after the last position of the chunk to obtain.</param>2579 /// <param name="textString">Address that receives a pointer to the text block2580 /// at the specified position.</param>2581 /// <param name="textLength">Number of UTF16 units of the retrieved block.2582 /// The length returned is from the given position to the front of2583 /// the block.</param>2584 /// <returns>Pointer to the first character at (textPosition - textLength).2585 /// NULL indicates no chunk available at the specified position, either2586 /// because textPosition == 0,the textPosition > the entire text content2587 /// length, or the queried position is not mapped into the app's backing2588 /// store.</returns>2589 /// <remarks>2590 /// Although apps can implement sparse textual content that only maps part of2591 /// the backing store, the app must map any text that is in the range passed2592 /// to any analysis functions.2593 /// </remarks>2594 HRESULTGetTextBeforePosition(
2595 UINT32textPosition,
2596 /*out*/const(WCHAR*)* textString,
2597 /*out*/UINT32* textLength2598 );
2599 2600 /// <summary>2601 /// Get paragraph reading direction.2602 /// </summary>2603 DWRITE_READING_DIRECTIONGetParagraphReadingDirection();
2604 2605 /// <summary>2606 /// Get locale name on the range affected by it.2607 /// </summary>2608 /// <param name="textPosition">Position to get the locale name of.</param>2609 /// <param name="textLength">Receives the length from the given position up to the2610 /// next differing locale.</param>2611 /// <param name="localeName">Address that receives a pointer to the locale2612 /// at the specified position.</param>2613 /// <remarks>2614 /// The localeName pointer must remain valid until the next call or until2615 /// the analysis returns.2616 /// </remarks>2617 HRESULTGetLocaleName(
2618 UINT32textPosition,
2619 /*out*/UINT32* textLength,
2620 /*out*/const(WCHAR*)* localeName2621 );
2622 2623 /// <summary>2624 /// Get number substitution on the range affected by it.2625 /// </summary>2626 /// <param name="textPosition">Position to get the number substitution of.</param>2627 /// <param name="textLength">Receives the length from the given position up to the2628 /// next differing number substitution.</param>2629 /// <param name="numberSubstitution">Address that receives a pointer to the number substitution2630 /// at the specified position.</param>2631 /// <remarks>2632 /// Any implementation should return the number substitution with an2633 /// incremented ref count, and the analysis will release when finished2634 /// with it (either before the next call or before it returns). However,2635 /// the sink callback may hold onto it after that.2636 /// </remarks>2637 HRESULTGetNumberSubstitution(
2638 UINT32textPosition,
2639 /*out*/UINT32* textLength,
2640 /*out*/IDWriteNumberSubstitution* numberSubstitution2641 );
2642 }
2643 2644 /// <summary>2645 /// The interface implemented by the text analyzer's client to receive the2646 /// output of a given text analysis. The Text analyzer disregards any current2647 /// state of the analysis sink, therefore a Set method call on a range2648 /// overwrites the previously set analysis result of the same range. 2649 /// </summary>2650 mixin( uuid!(IDWriteTextAnalysisSink, "5810cd44-0ca0-4701-b3fa-bec5182ae4f6") );
2651 interfaceIDWriteTextAnalysisSink : IUnknown2652 {
2653 extern(Windows):
2654 /// <summary>2655 /// Report script analysis for the text range.2656 /// </summary>2657 /// <param name="textPosition">Starting position to report from.</param>2658 /// <param name="textLength">Number of UTF16 units of the reported range.</param>2659 /// <param name="scriptAnalysis">Script analysis of characters in range.</param>2660 /// <returns>2661 /// A successful code or error code to abort analysis.2662 /// </returns>2663 HRESULTSetScriptAnalysis(
2664 UINT32textPosition,
2665 UINT32textLength,
2666 const(DWRITE_SCRIPT_ANALYSIS)* scriptAnalysis2667 );
2668 2669 /// <summary>2670 /// Report line-break opportunities for each character, starting from2671 /// the specified position.2672 /// </summary>2673 /// <param name="textPosition">Starting position to report from.</param>2674 /// <param name="textLength">Number of UTF16 units of the reported range.</param>2675 /// <param name="lineBreakpoints">Breaking conditions for each character.</param>2676 /// <returns>2677 /// A successful code or error code to abort analysis.2678 /// </returns>2679 HRESULTSetLineBreakpoints(
2680 UINT32textPosition,
2681 UINT32textLength,
2682 const(DWRITE_LINE_BREAKPOINT)* lineBreakpoints2683 );
2684 2685 /// <summary>2686 /// Set bidirectional level on the range, called once per each2687 /// level run change (either explicit or resolved implicit).2688 /// </summary>2689 /// <param name="textPosition">Starting position to report from.</param>2690 /// <param name="textLength">Number of UTF16 units of the reported range.</param>2691 /// <param name="explicitLevel">Explicit level from embedded control codes2692 /// RLE/RLO/LRE/LRO/PDF, determined before any additional rules.</param>2693 /// <param name="resolvedLevel">Final implicit level considering the2694 /// explicit level and characters' natural directionality, after all2695 /// Bidi rules have been applied.</param>2696 /// <returns>2697 /// A successful code or error code to abort analysis.2698 /// </returns>2699 HRESULTSetBidiLevel(
2700 UINT32textPosition,
2701 UINT32textLength,
2702 UINT8explicitLevel,
2703 UINT8resolvedLevel2704 );
2705 2706 /// <summary>2707 /// Set number substitution on the range.2708 /// </summary>2709 /// <param name="textPosition">Starting position to report from.</param>2710 /// <param name="textLength">Number of UTF16 units of the reported range.</param>2711 /// <param name="numberSubstitution">The number substitution applicable to2712 /// the returned range of text. The sink callback may hold onto it by2713 /// incrementing its ref count.</param>2714 /// <returns>2715 /// A successful code or error code to abort analysis.2716 /// </returns>2717 /// <remark>2718 /// Unlike script and bidi analysis, where every character passed to the2719 /// analyzer has a result, this will only be called for those ranges where2720 /// substitution is applicable. For any other range, you will simply not2721 /// be called.2722 /// </remark>2723 HRESULTSetNumberSubstitution(
2724 UINT32textPosition,
2725 UINT32textLength,
2726 IDWriteNumberSubstitutionnumberSubstitution2727 );
2728 }
2729 2730 /// <summary>2731 /// Analyzes various text properties for complex script processing.2732 /// </summary>2733 mixin( uuid!(IDWriteTextAnalyzer, "b7e6163e-7f46-43b4-84b3-e4e6249c365d") );
2734 interfaceIDWriteTextAnalyzer : IUnknown2735 {
2736 extern(Windows):
2737 /// <summary>2738 /// Analyzes a text range for script boundaries, reading text attributes2739 /// from the source and reporting the Unicode script ID to the sink 2740 /// callback SetScript.2741 /// </summary>2742 /// <param name="analysisSource">Source object to analyze.</param>2743 /// <param name="textPosition">Starting position within the source object.</param>2744 /// <param name="textLength">Length to analyze.</param>2745 /// <param name="analysisSink">Callback object.</param>2746 /// <returns>2747 /// Standard HRESULT error code.2748 /// </returns>2749 HRESULTAnalyzeScript(
2750 IDWriteTextAnalysisSourceanalysisSource,
2751 UINT32textPosition,
2752 UINT32textLength,
2753 IDWriteTextAnalysisSinkanalysisSink2754 );
2755 2756 /// <summary>2757 /// Analyzes a text range for script directionality, reading attributes2758 /// from the source and reporting levels to the sink callback SetBidiLevel.2759 /// </summary>2760 /// <param name="analysisSource">Source object to analyze.</param>2761 /// <param name="textPosition">Starting position within the source object.</param>2762 /// <param name="textLength">Length to analyze.</param>2763 /// <param name="analysisSink">Callback object.</param>2764 /// <returns>2765 /// Standard HRESULT error code.2766 /// </returns>2767 /// <remarks>2768 /// While the function can handle multiple paragraphs, the text range2769 /// should not arbitrarily split the middle of paragraphs. Otherwise the2770 /// returned levels may be wrong, since the Bidi algorithm is meant to2771 /// apply to the paragraph as a whole.2772 /// </remarks>2773 /// <remarks>2774 /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.2775 /// </remarks>2776 HRESULTAnalyzeBidi(
2777 IDWriteTextAnalysisSourceanalysisSource,
2778 UINT32textPosition,
2779 UINT32textLength,
2780 IDWriteTextAnalysisSinkanalysisSink2781 );
2782 2783 /// <summary>2784 /// Analyzes a text range for spans where number substitution is applicable,2785 /// reading attributes from the source and reporting substitutable ranges2786 /// to the sink callback SetNumberSubstitution.2787 /// </summary>2788 /// <param name="analysisSource">Source object to analyze.</param>2789 /// <param name="textPosition">Starting position within the source object.</param>2790 /// <param name="textLength">Length to analyze.</param>2791 /// <param name="analysisSink">Callback object.</param>2792 /// <returns>2793 /// Standard HRESULT error code.2794 /// </returns>2795 /// <remarks>2796 /// While the function can handle multiple ranges of differing number2797 /// substitutions, the text ranges should not arbitrarily split the2798 /// middle of numbers. Otherwise it will treat the numbers separately2799 /// and will not translate any intervening punctuation.2800 /// </remarks>2801 /// <remarks>2802 /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.2803 /// </remarks>2804 HRESULTAnalyzeNumberSubstitution(
2805 IDWriteTextAnalysisSourceanalysisSource,
2806 UINT32textPosition,
2807 UINT32textLength,
2808 IDWriteTextAnalysisSinkanalysisSink2809 );
2810 2811 /// <summary>2812 /// Analyzes a text range for potential breakpoint opportunities, reading2813 /// attributes from the source and reporting breakpoint opportunities to2814 /// the sink callback SetLineBreakpoints.2815 /// </summary>2816 /// <param name="analysisSource">Source object to analyze.</param>2817 /// <param name="textPosition">Starting position within the source object.</param>2818 /// <param name="textLength">Length to analyze.</param>2819 /// <param name="analysisSink">Callback object.</param>2820 /// <returns>2821 /// Standard HRESULT error code.2822 /// </returns>2823 /// <remarks>2824 /// While the function can handle multiple paragraphs, the text range2825 /// should not arbitrarily split the middle of paragraphs, unless the2826 /// given text span is considered a whole unit. Otherwise the2827 /// returned properties for the first and last characters will2828 /// inappropriately allow breaks.2829 /// </remarks>2830 /// <remarks>2831 /// Special cases include the first, last, and surrogate characters. Any2832 /// text span is treated as if adjacent to inline objects on either side.2833 /// So the rules with contingent-break opportunities are used, where the 2834 /// edge between text and inline objects is always treated as a potential2835 /// break opportunity, dependent on any overriding rules of the adjacent2836 /// objects to prohibit or force the break (see Unicode TR #14).2837 /// Surrogate pairs never break between.2838 /// </remarks>2839 HRESULTAnalyzeLineBreakpoints(
2840 IDWriteTextAnalysisSourceanalysisSource,
2841 UINT32textPosition,
2842 UINT32textLength,
2843 IDWriteTextAnalysisSinkanalysisSink2844 );
2845 2846 /// <summary>2847 /// Parses the input text string and maps it to the set of glyphs and associated glyph data2848 /// according to the font and the writing system's rendering rules.2849 /// </summary>2850 /// <param name="textString">The string to convert to glyphs.</param>2851 /// <param name="textLength">The length of textString.</param>2852 /// <param name="fontFace">The font face to get glyphs from.</param>2853 /// <param name="isSideways">Set to true if the text is intended to be2854 /// drawn vertically.</param>2855 /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>2856 /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>2857 /// <param name="localeName">The locale to use when selecting glyphs.2858 /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.2859 /// If this is NULL then the default mapping based on the script is used.</param>2860 /// <param name="numberSubstitution">Optional number substitution which2861 /// selects the appropriate glyphs for digits and related numeric characters,2862 /// depending on the results obtained from AnalyzeNumberSubstitution. Passing2863 /// null indicates that no substitution is needed and that the digits should2864 /// receive nominal glyphs.</param>2865 /// <param name="features">An array of pointers to the sets of typographic 2866 /// features to use in each feature range.</param>2867 /// <param name="featureRangeLengths">The length of each feature range, in characters. 2868 /// The sum of all lengths should be equal to textLength.</param>2869 /// <param name="featureRanges">The number of feature ranges.</param>2870 /// <param name="maxGlyphCount">The maximum number of glyphs that can be2871 /// returned.</param>2872 /// <param name="clusterMap">The mapping from character ranges to glyph 2873 /// ranges.</param>2874 /// <param name="textProps">Per-character output properties.</param>2875 /// <param name="glyphIndices">Output glyph indices.</param>2876 /// <param name="glyphProps">Per-glyph output properties.</param>2877 /// <param name="actualGlyphCount">The actual number of glyphs returned if2878 /// the call succeeds.</param>2879 /// <returns>2880 /// Standard HRESULT error code.2881 /// </returns>2882 /// <remarks>2883 /// Note that the mapping from characters to glyphs is, in general, many-2884 /// to-many. The recommended estimate for the per-glyph output buffers is2885 /// (3 * textLength / 2 + 16). This is not guaranteed to be sufficient.2886 ///2887 /// The value of the actualGlyphCount parameter is only valid if the call2888 /// succeeds. In the event that maxGlyphCount is not big enough2889 /// E_NOT_SUFFICIENT_BUFFER, which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),2890 /// will be returned. The application should allocate a larger buffer and try again.2891 /// </remarks>2892 HRESULTGetGlyphs(
2893 const(WCHAR)* textString,
2894 UINT32textLength,
2895 IDWriteFontFacefontFace,
2896 BOOLisSideways,
2897 BOOLisRightToLeft,
2898 const(DWRITE_SCRIPT_ANALYSIS)* scriptAnalysis,
2899 const(WCHAR)* localeName,
2900 IDWriteNumberSubstitutionnumberSubstitution,
2901 const(DWRITE_TYPOGRAPHIC_FEATURES*)* features,
2902 const(UINT32)* featureRangeLengths,
2903 UINT32featureRanges,
2904 UINT32maxGlyphCount,
2905 /*out*/UINT16* clusterMap,
2906 /*out*/DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
2907 /*out*/UINT16* glyphIndices,
2908 /*out*/DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProps,
2909 /*out*/UINT32* actualGlyphCount2910 );
2911 2912 /// <summary>2913 /// Place glyphs output from the GetGlyphs method according to the font 2914 /// and the writing system's rendering rules.2915 /// </summary>2916 /// <param name="textString">The original string the glyphs came from.</param>2917 /// <param name="clusterMap">The mapping from character ranges to glyph 2918 /// ranges. Returned by GetGlyphs.</param>2919 /// <param name="textProps">Per-character properties. Returned by 2920 /// GetGlyphs.</param>2921 /// <param name="textLength">The length of textString.</param>2922 /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>2923 /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>2924 /// <param name="glyphCount">The number of glyphs.</param>2925 /// <param name="fontFace">The font face the glyphs came from.</param>2926 /// <param name="fontEmSize">Logical font size in DIP's.</param>2927 /// <param name="isSideways">Set to true if the text is intended to be2928 /// drawn vertically.</param>2929 /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>2930 /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>2931 /// <param name="localeName">The locale to use when selecting glyphs.2932 /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.2933 /// If this is NULL then the default mapping based on the script is used.</param>2934 /// <param name="features">An array of pointers to the sets of typographic 2935 /// features to use in each feature range.</param>2936 /// <param name="featureRangeLengths">The length of each feature range, in characters. 2937 /// The sum of all lengths should be equal to textLength.</param>2938 /// <param name="featureRanges">The number of feature ranges.</param>2939 /// <param name="glyphAdvances">The advance width of each glyph.</param>2940 /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>2941 /// <returns>2942 /// Standard HRESULT error code.2943 /// </returns>2944 HRESULTGetGlyphPlacements(
2945 const(WCHAR)* textString,
2946 const(UINT16)* clusterMap,
2947 DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
2948 UINT32textLength,
2949 const(UINT16)* glyphIndices,
2950 const(DWRITE_SHAPING_GLYPH_PROPERTIES)* glyphProps,
2951 UINT32glyphCount,
2952 IDWriteFontFacefontFace,
2953 FLOATfontEmSize,
2954 BOOLisSideways,
2955 BOOLisRightToLeft,
2956 const(DWRITE_SCRIPT_ANALYSIS)* scriptAnalysis,
2957 const(WCHAR)* localeName,
2958 const(DWRITE_TYPOGRAPHIC_FEATURES*)* features,
2959 const(UINT32)* featureRangeLengths,
2960 UINT32featureRanges,
2961 /*out*/FLOAT* glyphAdvances,
2962 /*out*/DWRITE_GLYPH_OFFSET* glyphOffsets2963 );
2964 2965 /// <summary>2966 /// Place glyphs output from the GetGlyphs method according to the font 2967 /// and the writing system's rendering rules.2968 /// </summary>2969 /// <param name="textString">The original string the glyphs came from.</param>2970 /// <param name="clusterMap">The mapping from character ranges to glyph 2971 /// ranges. Returned by GetGlyphs.</param>2972 /// <param name="textProps">Per-character properties. Returned by 2973 /// GetGlyphs.</param>2974 /// <param name="textLength">The length of textString.</param>2975 /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>2976 /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>2977 /// <param name="glyphCount">The number of glyphs.</param>2978 /// <param name="fontFace">The font face the glyphs came from.</param>2979 /// <param name="fontEmSize">Logical font size in DIP's.</param>2980 /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this 2981 /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>2982 /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the2983 /// scaling specified by the font size and pixelsPerDip.</param>2984 /// <param name="useGdiNatural">2985 /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.2986 /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font2987 /// created with CLEARTYPE_NATURAL_QUALITY.2988 /// </param>2989 /// <param name="isSideways">Set to true if the text is intended to be2990 /// drawn vertically.</param>2991 /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>2992 /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>2993 /// <param name="localeName">The locale to use when selecting glyphs.2994 /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.2995 /// If this is NULL then the default mapping based on the script is used.</param>2996 /// <param name="features">An array of pointers to the sets of typographic 2997 /// features to use in each feature range.</param>2998 /// <param name="featureRangeLengths">The length of each feature range, in characters. 2999 /// The sum of all lengths should be equal to textLength.</param>3000 /// <param name="featureRanges">The number of feature ranges.</param>3001 /// <param name="glyphAdvances">The advance width of each glyph.</param>3002 /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>3003 /// <returns>3004 /// Standard HRESULT error code.3005 /// </returns>3006 HRESULTGetGdiCompatibleGlyphPlacements(
3007 const(WCHAR)* textString,
3008 const(UINT16)* clusterMap,
3009 DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
3010 UINT32textLength,
3011 const(UINT16)* glyphIndices,
3012 const(DWRITE_SHAPING_GLYPH_PROPERTIES)* glyphProps,
3013 UINT32glyphCount,
3014 IDWriteFontFacefontFace,
3015 FLOATfontEmSize,
3016 FLOATpixelsPerDip,
3017 const(DWRITE_MATRIX)* transform,
3018 BOOLuseGdiNatural,
3019 BOOLisSideways,
3020 BOOLisRightToLeft,
3021 const(DWRITE_SCRIPT_ANALYSIS)* scriptAnalysis,
3022 const(WCHAR)* localeName,
3023 const(DWRITE_TYPOGRAPHIC_FEATURES*)* features,
3024 const(UINT32)* featureRangeLengths,
3025 UINT32featureRanges,
3026 /*out*/FLOAT* glyphAdvances,
3027 /*out*/DWRITE_GLYPH_OFFSET* glyphOffsets3028 );
3029 }
3030 3031 /// <summary>3032 /// The DWRITE_GLYPH_RUN structure contains the information needed by renderers3033 /// to draw glyph runs. All coordinates are in device independent pixels (DIPs).3034 /// </summary>3035 structDWRITE_GLYPH_RUN3036 {
3037 /// <summary>3038 /// The physical font face to draw with.3039 /// </summary>3040 IDWriteFontFacefontFace;
3041 3042 /// <summary>3043 /// Logical size of the font in DIPs, not points (equals 1/96 inch).3044 /// </summary>3045 FLOATfontEmSize;
3046 3047 /// <summary>3048 /// The number of glyphs.3049 /// </summary>3050 UINT32glyphCount;
3051 3052 /// <summary>3053 /// The indices to render.3054 /// </summary> 3055 const(UINT16)* glyphIndices;
3056 3057 /// <summary>3058 /// Glyph advance widths.3059 /// </summary>3060 const(FLOAT)* glyphAdvances;
3061 3062 /// <summary>3063 /// Glyph offsets.3064 /// </summary>3065 const(DWRITE_GLYPH_OFFSET)* glyphOffsets;
3066 3067 /// <summary>3068 /// If true, specifies that glyphs are rotated 90 degrees to the left and3069 /// vertical metrics are used. Vertical writing is achieved by specifying3070 /// isSideways = true and rotating the entire run 90 degrees to the right3071 /// via a rotate transform.3072 /// </summary>3073 BOOLisSideways;
3074 3075 /// <summary>3076 /// The implicit resolved bidi level of the run. Odd levels indicate3077 /// right-to-left languages like Hebrew and Arabic, while even levels3078 /// indicate left-to-right languages like English and Japanese (when3079 /// written horizontally). For right-to-left languages, the text origin3080 /// is on the right, and text should be drawn to the left.3081 /// </summary>3082 UINT32bidiLevel;
3083 }
3084 3085 /// <summary>3086 /// The DWRITE_GLYPH_RUN_DESCRIPTION structure contains additional properties3087 /// related to those in DWRITE_GLYPH_RUN.3088 /// </summary>3089 structDWRITE_GLYPH_RUN_DESCRIPTION3090 {
3091 /// <summary>3092 /// The locale name associated with this run.3093 /// </summary>3094 const(WCHAR)* localeName;
3095 3096 /// <summary>3097 /// The text associated with the glyphs.3098 /// </summary>3099 const(WCHAR)* string;
3100 3101 /// <summary>3102 /// The number of characters (UTF16 code-units).3103 /// Note that this may be different than the number of glyphs.3104 /// </summary>3105 UINT32stringLength;
3106 3107 /// <summary>3108 /// An array of indices to the glyph indices array, of the first glyphs of3109 /// all the glyph clusters of the glyphs to render. 3110 /// </summary>3111 const(UINT16)* clusterMap;
3112 3113 /// <summary>3114 /// Corresponding text position in the original string3115 /// this glyph run came from.3116 /// </summary>3117 UINT32textPosition;
3118 }
3119 3120 /// <summary>3121 /// The DWRITE_UNDERLINE structure contains information about the size and3122 /// placement of underlines. All coordinates are in device independent3123 /// pixels (DIPs).3124 /// </summary>3125 structDWRITE_UNDERLINE3126 {
3127 /// <summary>3128 /// Width of the underline, measured parallel to the baseline.3129 /// </summary>3130 FLOATwidth;
3131 3132 /// <summary>3133 /// Thickness of the underline, measured perpendicular to the3134 /// baseline.3135 /// </summary>3136 FLOATthickness;
3137 3138 /// <summary>3139 /// Offset of the underline from the baseline.3140 /// A positive offset represents a position below the baseline and3141 /// a negative offset is above.3142 /// </summary>3143 FLOAToffset;
3144 3145 /// <summary>3146 /// Height of the tallest run where the underline applies.3147 /// </summary>3148 FLOATrunHeight;
3149 3150 /// <summary>3151 /// Reading direction of the text associated with the underline. This 3152 /// value is used to interpret whether the width value runs horizontally 3153 /// or vertically.3154 /// </summary>3155 DWRITE_READING_DIRECTIONreadingDirection;
3156 3157 /// <summary>3158 /// Flow direction of the text associated with the underline. This value3159 /// is used to interpret whether the thickness value advances top to 3160 /// bottom, left to right, or right to left.3161 /// </summary>3162 DWRITE_FLOW_DIRECTIONflowDirection;
3163 3164 /// <summary>3165 /// Locale of the text the underline is being drawn under. Can be3166 /// pertinent where the locale affects how the underline is drawn.3167 /// For example, in vertical text, the underline belongs on the3168 /// left for Chinese but on the right for Japanese.3169 /// This choice is completely left up to higher levels.3170 /// </summary>3171 const(WCHAR)* localeName;
3172 3173 /// <summary>3174 /// The measuring mode can be useful to the renderer to determine how3175 /// underlines are rendered, e.g. rounding the thickness to a whole pixel3176 /// in GDI-compatible modes.3177 /// </summary>3178 DWRITE_MEASURING_MODEmeasuringMode;
3179 }
3180 3181 /// <summary>3182 /// The DWRITE_STRIKETHROUGH structure contains information about the size and3183 /// placement of strikethroughs. All coordinates are in device independent3184 /// pixels (DIPs).3185 /// </summary>3186 structDWRITE_STRIKETHROUGH3187 {
3188 /// <summary>3189 /// Width of the strikethrough, measured parallel to the baseline.3190 /// </summary>3191 FLOATwidth;
3192 3193 /// <summary>3194 /// Thickness of the strikethrough, measured perpendicular to the3195 /// baseline.3196 /// </summary>3197 FLOATthickness;
3198 3199 /// <summary>3200 /// Offset of the strikethrough from the baseline.3201 /// A positive offset represents a position below the baseline and3202 /// a negative offset is above.3203 /// </summary>3204 FLOAToffset;
3205 3206 /// <summary>3207 /// Reading direction of the text associated with the strikethrough. This3208 /// value is used to interpret whether the width value runs horizontally 3209 /// or vertically.3210 /// </summary>3211 DWRITE_READING_DIRECTIONreadingDirection;
3212 3213 /// <summary>3214 /// Flow direction of the text associated with the strikethrough. This 3215 /// value is used to interpret whether the thickness value advances top to3216 /// bottom, left to right, or right to left.3217 /// </summary>3218 DWRITE_FLOW_DIRECTIONflowDirection;
3219 3220 /// <summary>3221 /// Locale of the range. Can be pertinent where the locale affects the style.3222 /// </summary>3223 const(WCHAR)* localeName;
3224 3225 /// <summary>3226 /// The measuring mode can be useful to the renderer to determine how3227 /// underlines are rendered, e.g. rounding the thickness to a whole pixel3228 /// in GDI-compatible modes.3229 /// </summary>3230 DWRITE_MEASURING_MODEmeasuringMode;
3231 }
3232 3233 /// <summary>3234 /// The DWRITE_LINE_METRICS structure contains information about a formatted3235 /// line of text.3236 /// </summary>3237 structDWRITE_LINE_METRICS3238 {
3239 /// <summary>3240 /// The number of total text positions in the line.3241 /// This includes any trailing whitespace and newline characters.3242 /// </summary>3243 UINT32length;
3244 3245 /// <summary>3246 /// The number of whitespace positions at the end of the line. Newline3247 /// sequences are considered whitespace.3248 /// </summary>3249 UINT32trailingWhitespaceLength;
3250 3251 /// <summary>3252 /// The number of characters in the newline sequence at the end of the line.3253 /// If the count is zero, then the line was either wrapped or it is the3254 /// end of the text.3255 /// </summary>3256 UINT32newlineLength;
3257 3258 /// <summary>3259 /// Height of the line as measured from top to bottom.3260 /// </summary>3261 FLOATheight;
3262 3263 /// <summary>3264 /// Distance from the top of the line to its baseline.3265 /// </summary>3266 FLOATbaseline;
3267 3268 /// <summary>3269 /// The line is trimmed.3270 /// </summary>3271 BOOLisTrimmed;
3272 }
3273 3274 3275 /// <summary>3276 /// The DWRITE_CLUSTER_METRICS structure contains information about a glyph cluster.3277 /// </summary>3278 structDWRITE_CLUSTER_METRICS3279 {
3280 align(1):
3281 /// <summary>3282 /// The total advance width of all glyphs in the cluster.3283 /// </summary>3284 FLOATwidth;
3285 3286 /// <summary>3287 /// The number of text positions in the cluster.3288 /// </summary>3289 UINT16length;
3290 3291 union3292 {
3293 UINT16data_;
3294 }
3295 /*
3296 // TODO: make helper proeprties
3297 /// <summary>
3298 /// Indicate whether line can be broken right after the cluster.
3299 /// </summary>
3300 UINT16 canWrapLineAfter : 1;
3301 3302 /// <summary>
3303 /// Indicate whether the cluster corresponds to whitespace character.
3304 /// </summary>
3305 UINT16 isWhitespace : 1;
3306 3307 /// <summary>
3308 /// Indicate whether the cluster corresponds to a newline character.
3309 /// </summary>
3310 UINT16 isNewline : 1;
3311 3312 /// <summary>
3313 /// Indicate whether the cluster corresponds to soft hyphen character.
3314 /// </summary>
3315 UINT16 isSoftHyphen : 1;
3316 3317 /// <summary>
3318 /// Indicate whether the cluster is read from right to left.
3319 /// </summary>
3320 UINT16 isRightToLeft : 1;
3321 3322 UINT16 padding : 11;
3323 */3324 }
3325 3326 3327 /// <summary>3328 /// Overall metrics associated with text after layout.3329 /// All coordinates are in device independent pixels (DIPs).3330 /// </summary>3331 structDWRITE_TEXT_METRICS3332 {
3333 /// <summary>3334 /// Left-most point of formatted text relative to layout box3335 /// (excluding any glyph overhang).3336 /// </summary>3337 FLOATleft;
3338 3339 /// <summary>3340 /// Top-most point of formatted text relative to layout box3341 /// (excluding any glyph overhang).3342 /// </summary>3343 FLOATtop;
3344 3345 /// <summary>3346 /// The width of the formatted text ignoring trailing whitespace3347 /// at the end of each line.3348 /// </summary>3349 FLOATwidth;
3350 3351 /// <summary>3352 /// The width of the formatted text taking into account the3353 /// trailing whitespace at the end of each line.3354 /// </summary>3355 FLOATwidthIncludingTrailingWhitespace;
3356 3357 /// <summary>3358 /// The height of the formatted text. The height of an empty string3359 /// is determined by the size of the default font's line height.3360 /// </summary>3361 FLOATheight;
3362 3363 /// <summary>3364 /// Initial width given to the layout. Depending on whether the text3365 /// was wrapped or not, it can be either larger or smaller than the3366 /// text content width.3367 /// </summary>3368 FLOATlayoutWidth;
3369 3370 /// <summary>3371 /// Initial height given to the layout. Depending on the length of the3372 /// text, it may be larger or smaller than the text content height.3373 /// </summary>3374 FLOATlayoutHeight;
3375 3376 /// <summary>3377 /// The maximum reordering count of any line of text, used3378 /// to calculate the most number of hit-testing boxes needed.3379 /// If the layout has no bidirectional text or no text at all,3380 /// the minimum level is 1.3381 /// </summary>3382 UINT32maxBidiReorderingDepth;
3383 3384 /// <summary>3385 /// Total number of lines.3386 /// </summary>3387 UINT32lineCount;
3388 }
3389 3390 3391 /// <summary>3392 /// Properties describing the geometric measurement of an3393 /// application-defined inline object.3394 /// </summary>3395 structDWRITE_INLINE_OBJECT_METRICS3396 {
3397 /// <summary>3398 /// Width of the inline object.3399 /// </summary>3400 FLOATwidth;
3401 3402 /// <summary>3403 /// Height of the inline object as measured from top to bottom.3404 /// </summary>3405 FLOATheight;
3406 3407 /// <summary>3408 /// Distance from the top of the object to the baseline where it is lined up with the adjacent text.3409 /// If the baseline is at the bottom, baseline simply equals height.3410 /// </summary>3411 FLOATbaseline;
3412 3413 /// <summary>3414 /// Flag indicating whether the object is to be placed upright or alongside the text baseline3415 /// for vertical text.3416 /// </summary>3417 BOOLsupportsSideways;
3418 }
3419 3420 3421 /// <summary>3422 /// The DWRITE_OVERHANG_METRICS structure holds how much any visible pixels3423 /// (in DIPs) overshoot each side of the layout or inline objects.3424 /// </summary>3425 /// <remarks>3426 /// Positive overhangs indicate that the visible area extends outside the layout3427 /// box or inline object, while negative values mean there is whitespace inside.3428 /// The returned values are unaffected by rendering transforms or pixel snapping.3429 /// Additionally, they may not exactly match final target's pixel bounds after3430 /// applying grid fitting and hinting.3431 /// </remarks>3432 structDWRITE_OVERHANG_METRICS3433 {
3434 /// <summary>3435 /// The distance from the left-most visible DIP to its left alignment edge.3436 /// </summary>3437 FLOATleft;
3438 3439 /// <summary>3440 /// The distance from the top-most visible DIP to its top alignment edge.3441 /// </summary>3442 FLOATtop;
3443 3444 /// <summary>3445 /// The distance from the right-most visible DIP to its right alignment edge.3446 /// </summary>3447 FLOATright;
3448 3449 /// <summary>3450 /// The distance from the bottom-most visible DIP to its bottom alignment edge.3451 /// </summary>3452 FLOATbottom;
3453 }
3454 3455 3456 /// <summary>3457 /// Geometry enclosing of text positions.3458 /// </summary>3459 structDWRITE_HIT_TEST_METRICS3460 {
3461 /// <summary>3462 /// First text position within the geometry.3463 /// </summary>3464 UINT32textPosition;
3465 3466 /// <summary>3467 /// Number of text positions within the geometry.3468 /// </summary>3469 UINT32length;
3470 3471 /// <summary>3472 /// Left position of the top-left coordinate of the geometry.3473 /// </summary>3474 FLOATleft;
3475 3476 /// <summary>3477 /// Top position of the top-left coordinate of the geometry.3478 /// </summary>3479 FLOATtop;
3480 3481 /// <summary>3482 /// Geometry's width.3483 /// </summary>3484 FLOATwidth;
3485 3486 /// <summary>3487 /// Geometry's height.3488 /// </summary>3489 FLOATheight;
3490 3491 /// <summary>3492 /// Bidi level of text positions enclosed within the geometry.3493 /// </summary>3494 UINT32bidiLevel;
3495 3496 /// <summary>3497 /// Geometry encloses text?3498 /// </summary>3499 BOOLisText;
3500 3501 /// <summary>3502 /// Range is trimmed.3503 /// </summary>3504 BOOLisTrimmed;
3505 }
3506 3507 3508 3509 /// <summary>3510 /// The IDWriteInlineObject interface wraps an application defined inline graphic,3511 /// allowing DWrite to query metrics as if it was a glyph inline with the text.3512 /// </summary>3513 mixin( uuid!(IDWriteInlineObject, "8339FDE3-106F-47ab-8373-1C6295EB10B3") );
3514 interfaceIDWriteInlineObject : IUnknown3515 {
3516 extern(Windows):
3517 /// <summary>3518 /// The application implemented rendering callback (IDWriteTextRenderer::DrawInlineObject)3519 /// can use this to draw the inline object without needing to cast or query the object3520 /// type. The text layout does not call this method directly.3521 /// </summary>3522 /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>3523 /// <param name="renderer">The renderer passed to IDWriteTextLayout::Draw as the object's containing parent.</param>3524 /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>3525 /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>3526 /// <param name="isSideways">The object should be drawn on its side.</param>3527 /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>3528 /// <param name="clientDrawingEffect">The drawing effect set in IDWriteTextLayout::SetDrawingEffect.</param>3529 /// <returns>3530 /// Standard HRESULT error code.3531 /// </returns>3532 HRESULTDraw(
3533 void* clientDrawingContext,
3534 IDWriteTextRendererrenderer,
3535 FLOAToriginX,
3536 FLOAToriginY,
3537 BOOLisSideways,
3538 BOOLisRightToLeft,
3539 IUnknownclientDrawingEffect3540 );
3541 3542 /// <summary>3543 /// TextLayout calls this callback function to get the measurement of the inline object.3544 /// </summary>3545 /// <param name="metrics">Returned metrics</param>3546 /// <returns>3547 /// Standard HRESULT error code.3548 /// </returns>3549 HRESULTGetMetrics(
3550 /*out*/DWRITE_INLINE_OBJECT_METRICS* metrics3551 );
3552 3553 /// <summary>3554 /// TextLayout calls this callback function to get the visible extents (in DIPs) of the inline object.3555 /// In the case of a simple bitmap, with no padding and no overhang, all the overhangs will3556 /// simply be zeroes.3557 /// </summary>3558 /// <param name="overhangs">Overshoot of visible extents (in DIPs) outside the object.</param>3559 /// <returns>3560 /// Standard HRESULT error code.3561 /// </returns>3562 /// <remarks>3563 /// The overhangs should be returned relative to the reported size of the object3564 /// (DWRITE_INLINE_OBJECT_METRICS::width/height), and should not be baseline3565 /// adjusted. If you have an image that is actually 100x100 DIPs, but you want it3566 /// slightly inset (perhaps it has a glow) by 20 DIPs on each side, you would3567 /// return a width/height of 60x60 and four overhangs of 20 DIPs.3568 /// </remarks>3569 HRESULTGetOverhangMetrics(
3570 /*out*/DWRITE_OVERHANG_METRICS* overhangs3571 );
3572 3573 /// <summary>3574 /// Layout uses this to determine the line breaking behavior of the inline object3575 /// amidst the text.3576 /// </summary>3577 /// <param name="breakConditionBefore">Line-breaking condition between the object and the content immediately preceding it.</param>3578 /// <param name="breakConditionAfter" >Line-breaking condition between the object and the content immediately following it.</param>3579 /// <returns>3580 /// Standard HRESULT error code.3581 /// </returns>3582 HRESULTGetBreakConditions(
3583 /*out*/DWRITE_BREAK_CONDITION* breakConditionBefore,
3584 /*out*/DWRITE_BREAK_CONDITION* breakConditionAfter3585 );
3586 }
3587 3588 /// <summary>3589 /// The IDWritePixelSnapping interface defines the pixel snapping properties of a text renderer.3590 /// </summary>3591 mixin( uuid!(IDWritePixelSnapping, "eaf3a2da-ecf4-4d24-b644-b34f6842024b") );
3592 interfaceIDWritePixelSnapping : IUnknown3593 {
3594 extern(Windows):
3595 /// <summary>3596 /// Determines whether pixel snapping is disabled. The recommended default is FALSE,3597 /// unless doing animation that requires subpixel vertical placement.3598 /// </summary>3599 /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>3600 /// <param name="isDisabled">Receives TRUE if pixel snapping is disabled or FALSE if it not.</param>3601 /// <returns>3602 /// Standard HRESULT error code.3603 /// </returns>3604 HRESULTIsPixelSnappingDisabled(
3605 void* clientDrawingContext,
3606 /*out*/BOOL* isDisabled3607 );
3608 3609 /// <summary>3610 /// Gets the current transform that maps abstract coordinates to DIPs,3611 /// which may disable pixel snapping upon any rotation or shear.3612 /// </summary>3613 /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>3614 /// <param name="transform">Receives the transform.</param>3615 /// <returns>3616 /// Standard HRESULT error code.3617 /// </returns>3618 HRESULTGetCurrentTransform(
3619 void* clientDrawingContext,
3620 /*out*/DWRITE_MATRIX* transform3621 );
3622 3623 /// <summary>3624 /// Gets the number of physical pixels per DIP. A DIP (device-independent pixel) is 1/96 inch,3625 /// so the pixelsPerDip value is the number of logical pixels per inch divided by 96 (yielding3626 /// a value of 1 for 96 DPI and 1.25 for 120).3627 /// </summary>3628 /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>3629 /// <param name="pixelsPerDip">Receives the number of physical pixels per DIP.</param>3630 /// <returns>3631 /// Standard HRESULT error code.3632 /// </returns>3633 HRESULTGetPixelsPerDip(
3634 void* clientDrawingContext,
3635 /*out*/FLOAT* pixelsPerDip3636 );
3637 }
3638 3639 /// <summary>3640 /// The IDWriteTextRenderer interface represents a set of application-defined3641 /// callbacks that perform rendering of text, inline objects, and decorations3642 /// such as underlines.3643 /// </summary>3644 mixin( uuid!(IDWriteTextRenderer, "ef8a8135-5cc6-45fe-8825-c5a0724eb819") );
3645 interfaceIDWriteTextRenderer : IDWritePixelSnapping3646 {
3647 extern(Windows):
3648 /// <summary>3649 /// IDWriteTextLayout::Draw calls this function to instruct the client to3650 /// render a run of glyphs.3651 /// </summary>3652 /// <param name="clientDrawingContext">The context passed to 3653 /// IDWriteTextLayout::Draw.</param>3654 /// <param name="baselineOriginX">X-coordinate of the baseline.</param>3655 /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>3656 /// <param name="measuringMode">Specifies measuring mode for glyphs in the run.3657 /// Renderer implementations may choose different rendering modes for given measuring modes,3658 /// but best results are seen when the rendering mode matches the corresponding measuring mode:3659 /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL3660 /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC3661 /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL3662 /// </param>3663 /// <param name="glyphRun">The glyph run to draw.</param>3664 /// <param name="glyphRunDescription">Properties of the characters 3665 /// associated with this run.</param>3666 /// <param name="clientDrawingEffect">The drawing effect set in3667 /// IDWriteTextLayout::SetDrawingEffect.</param>3668 /// <returns>3669 /// Standard HRESULT error code.3670 /// </returns>3671 HRESULTDrawGlyphRun(
3672 void* clientDrawingContext,
3673 FLOATbaselineOriginX,
3674 FLOATbaselineOriginY,
3675 DWRITE_MEASURING_MODEmeasuringMode,
3676 const(DWRITE_GLYPH_RUN)* glyphRun,
3677 const(DWRITE_GLYPH_RUN_DESCRIPTION)* glyphRunDescription,
3678 IUnknownclientDrawingEffect3679 );
3680 3681 /// <summary>3682 /// IDWriteTextLayout::Draw calls this function to instruct the client to draw3683 /// an underline.3684 /// </summary>3685 /// <param name="clientDrawingContext">The context passed to 3686 /// IDWriteTextLayout::Draw.</param>3687 /// <param name="baselineOriginX">X-coordinate of the baseline.</param>3688 /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>3689 /// <param name="underline">Underline logical information.</param>3690 /// <param name="clientDrawingEffect">The drawing effect set in3691 /// IDWriteTextLayout::SetDrawingEffect.</param>3692 /// <returns>3693 /// Standard HRESULT error code.3694 /// </returns>3695 /// <remarks>3696 /// A single underline can be broken into multiple calls, depending on3697 /// how the formatting changes attributes. If font sizes/styles change3698 /// within an underline, the thickness and offset will be averaged3699 /// weighted according to characters.3700 /// To get the correct top coordinate of the underline rect, add underline::offset3701 /// to the baseline's Y. Otherwise the underline will be immediately under the text.3702 /// The x coordinate will always be passed as the left side, regardless3703 /// of text directionality. This simplifies drawing and reduces the3704 /// problem of round-off that could potentially cause gaps or a double3705 /// stamped alpha blend. To avoid alpha overlap, round the end points3706 /// to the nearest device pixel.3707 /// </remarks>3708 HRESULTDrawUnderline(
3709 void* clientDrawingContext,
3710 FLOATbaselineOriginX,
3711 FLOATbaselineOriginY,
3712 const(DWRITE_UNDERLINE)* underline,
3713 IUnknownclientDrawingEffect3714 );
3715 3716 /// <summary>3717 /// IDWriteTextLayout::Draw calls this function to instruct the client to draw3718 /// a strikethrough.3719 /// </summary>3720 /// <param name="clientDrawingContext">The context passed to 3721 /// IDWriteTextLayout::Draw.</param>3722 /// <param name="baselineOriginX">X-coordinate of the baseline.</param>3723 /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>3724 /// <param name="strikethrough">Strikethrough logical information.</param>3725 /// <param name="clientDrawingEffect">The drawing effect set in3726 /// IDWriteTextLayout::SetDrawingEffect.</param>3727 /// <returns>3728 /// Standard HRESULT error code.3729 /// </returns>3730 /// <remarks>3731 /// A single strikethrough can be broken into multiple calls, depending on3732 /// how the formatting changes attributes. Strikethrough is not averaged3733 /// across font sizes/styles changes.3734 /// To get the correct top coordinate of the strikethrough rect,3735 /// add strikethrough::offset to the baseline's Y.3736 /// Like underlines, the x coordinate will always be passed as the left side,3737 /// regardless of text directionality.3738 /// </remarks>3739 HRESULTDrawStrikethrough(
3740 void* clientDrawingContext,
3741 FLOATbaselineOriginX,
3742 FLOATbaselineOriginY,
3743 const(DWRITE_STRIKETHROUGH)* strikethrough,
3744 IUnknownclientDrawingEffect3745 );
3746 3747 /// <summary>3748 /// IDWriteTextLayout::Draw calls this application callback when it needs to3749 /// draw an inline object.3750 /// </summary>3751 /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>3752 /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>3753 /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>3754 /// <param name="inlineObject">The object set using IDWriteTextLayout::SetInlineObject.</param>3755 /// <param name="isSideways">The object should be drawn on its side.</param>3756 /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>3757 /// <param name="clientDrawingEffect">The drawing effect set in3758 /// IDWriteTextLayout::SetDrawingEffect.</param>3759 /// <returns>3760 /// Standard HRESULT error code.3761 /// </returns>3762 /// <remarks>3763 /// The right-to-left flag is a hint for those cases where it would look3764 /// strange for the image to be shown normally (like an arrow pointing to3765 /// right to indicate a submenu).3766 /// </remarks>3767 HRESULTDrawInlineObject(
3768 void* clientDrawingContext,
3769 FLOAToriginX,
3770 FLOAToriginY,
3771 IDWriteInlineObjectinlineObject,
3772 BOOLisSideways,
3773 BOOLisRightToLeft,
3774 IUnknownclientDrawingEffect3775 );
3776 }
3777 3778 /// <summary>3779 /// The IDWriteTextLayout interface represents a block of text after it has3780 /// been fully analyzed and formatted.3781 ///3782 /// All coordinates are in device independent pixels (DIPs).3783 /// </summary>3784 mixin( uuid!(IDWriteTextLayout, "53737037-6d14-410b-9bfe-0b182bb70961") );
3785 interfaceIDWriteTextLayout : IDWriteTextFormat3786 {
3787 extern(Windows):
3788 /// <summary>3789 /// Set layout maximum width3790 /// </summary>3791 /// <param name="maxWidth">Layout maximum width</param>3792 /// <returns>3793 /// Standard HRESULT error code.3794 /// </returns>3795 HRESULTSetMaxWidth(
3796 FLOATmaxWidth3797 );
3798 3799 /// <summary>3800 /// Set layout maximum height3801 /// </summary>3802 /// <param name="maxHeight">Layout maximum height</param>3803 /// <returns>3804 /// Standard HRESULT error code.3805 /// </returns>3806 HRESULTSetMaxHeight(
3807 FLOATmaxHeight3808 );
3809 3810 /// <summary>3811 /// Set the font collection.3812 /// </summary>3813 /// <param name="fontCollection">The font collection to set</param>3814 /// <param name="textRange">Text range to which this change applies.</param>3815 /// <returns>3816 /// Standard HRESULT error code.3817 /// </returns>3818 HRESULTSetFontCollection(
3819 IDWriteFontCollectionfontCollection,
3820 DWRITE_TEXT_RANGEtextRange3821 );
3822 3823 /// <summary>3824 /// Set null-terminated font family name.3825 /// </summary>3826 /// <param name="fontFamilyName">Font family name</param>3827 /// <param name="textRange">Text range to which this change applies.</param>3828 /// <returns>3829 /// Standard HRESULT error code.3830 /// </returns>3831 HRESULTSetFontFamilyName(
3832 const(WCHAR)* fontFamilyName,
3833 DWRITE_TEXT_RANGEtextRange3834 );
3835 3836 /// <summary>3837 /// Set font weight.3838 /// </summary>3839 /// <param name="fontWeight">Font weight</param>3840 /// <param name="textRange">Text range to which this change applies.</param>3841 /// <returns>3842 /// Standard HRESULT error code.3843 /// </returns>3844 HRESULTSetFontWeight(
3845 DWRITE_FONT_WEIGHTfontWeight,
3846 DWRITE_TEXT_RANGEtextRange3847 );
3848 3849 /// <summary>3850 /// Set font style.3851 /// </summary>3852 /// <param name="fontStyle">Font style</param>3853 /// <param name="textRange">Text range to which this change applies.</param>3854 /// <returns>3855 /// Standard HRESULT error code.3856 /// </returns>3857 HRESULTSetFontStyle(
3858 DWRITE_FONT_STYLEfontStyle,
3859 DWRITE_TEXT_RANGEtextRange3860 );
3861 3862 /// <summary>3863 /// Set font stretch.3864 /// </summary>3865 /// <param name="fontStretch">font stretch</param>3866 /// <param name="textRange">Text range to which this change applies.</param>3867 /// <returns>3868 /// Standard HRESULT error code.3869 /// </returns>3870 HRESULTSetFontStretch(
3871 DWRITE_FONT_STRETCHfontStretch,
3872 DWRITE_TEXT_RANGEtextRange3873 );
3874 3875 /// <summary>3876 /// Set font em height.3877 /// </summary>3878 /// <param name="fontSize">Font em height</param>3879 /// <param name="textRange">Text range to which this change applies.</param>3880 /// <returns>3881 /// Standard HRESULT error code.3882 /// </returns>3883 HRESULTSetFontSize(
3884 FLOATfontSize,
3885 DWRITE_TEXT_RANGEtextRange3886 );
3887 3888 /// <summary>3889 /// Set underline.3890 /// </summary>3891 /// <param name="hasUnderline">The Boolean flag indicates whether underline takes place</param>3892 /// <param name="textRange">Text range to which this change applies.</param>3893 /// <returns>3894 /// Standard HRESULT error code.3895 /// </returns>3896 HRESULTSetUnderline(
3897 BOOLhasUnderline,
3898 DWRITE_TEXT_RANGEtextRange3899 );
3900 3901 /// <summary>3902 /// Set strikethrough.3903 /// </summary>3904 /// <param name="hasStrikethrough">The Boolean flag indicates whether strikethrough takes place</param>3905 /// <param name="textRange">Text range to which this change applies.</param>3906 /// <returns>3907 /// Standard HRESULT error code.3908 /// </returns>3909 HRESULTSetStrikethrough(
3910 BOOLhasStrikethrough,
3911 DWRITE_TEXT_RANGEtextRange3912 );
3913 3914 /// <summary>3915 /// Set application-defined drawing effect.3916 /// </summary>3917 /// <param name="drawingEffect">Pointer to an application-defined drawing effect.</param>3918 /// <param name="textRange">Text range to which this change applies.</param>3919 /// <returns>3920 /// Standard HRESULT error code.3921 /// </returns>3922 /// <remarks>3923 /// This drawing effect is associated with the specified range and will be passed back3924 /// to the application via the callback when the range is drawn at drawing time.3925 /// </remarks>3926 HRESULTSetDrawingEffect(
3927 IUnknowndrawingEffect,
3928 DWRITE_TEXT_RANGEtextRange3929 );
3930 3931 /// <summary>3932 /// Set inline object.3933 /// </summary>3934 /// <param name="inlineObject">Pointer to an application-implemented inline object.</param>3935 /// <param name="textRange">Text range to which this change applies.</param>3936 /// <returns>3937 /// Standard HRESULT error code.3938 /// </returns>3939 /// <remarks>3940 /// This inline object applies to the specified range and will be passed back3941 /// to the application via the DrawInlineObject callback when the range is drawn.3942 /// Any text in that range will be suppressed.3943 /// </remarks>3944 HRESULTSetInlineObject(
3945 IDWriteInlineObjectinlineObject,
3946 DWRITE_TEXT_RANGEtextRange3947 );
3948 3949 /// <summary>3950 /// Set font typography features.3951 /// </summary>3952 /// <param name="typography">Pointer to font typography setting.</param>3953 /// <param name="textRange">Text range to which this change applies.</param>3954 /// <returns>3955 /// Standard HRESULT error code.3956 /// </returns>3957 HRESULTSetTypography(
3958 IDWriteTypographytypography,
3959 DWRITE_TEXT_RANGEtextRange3960 );
3961 3962 /// <summary>3963 /// Set locale name.3964 /// </summary>3965 /// <param name="localeName">Locale name</param>3966 /// <param name="textRange">Text range to which this change applies.</param>3967 /// <returns>3968 /// Standard HRESULT error code.3969 /// </returns>3970 HRESULTSetLocaleName(
3971 const(WCHAR)* localeName,
3972 DWRITE_TEXT_RANGEtextRange3973 );
3974 3975 /// <summary>3976 /// Get layout maximum width3977 /// </summary>3978 FLOATGetMaxWidth();
3979 3980 /// <summary>3981 /// Get layout maximum height3982 /// </summary>3983 FLOATGetMaxHeight();
3984 3985 /// <summary>3986 /// Get the font collection where the current position is at.3987 /// </summary>3988 /// <param name="currentPosition">The current text position.</param>3989 /// <param name="fontCollection">The current font collection</param>3990 /// <param name="textRange">Text range to which this change applies.</param>3991 /// <returns>3992 /// Standard HRESULT error code.3993 /// </returns>3994 HRESULTGetFontCollection(
3995 UINT32currentPosition,
3996 /*out*/IDWriteFontCollection* fontCollection,
3997 /*out*/DWRITE_TEXT_RANGE* textRange = null3998 );
3999 4000 /// <summary>4001 /// Get the length of the font family name where the current position is at.4002 /// </summary>4003 /// <param name="currentPosition">The current text position.</param>4004 /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>4005 /// <param name="textRange">The position range of the current format.</param>4006 /// <returns>4007 /// Standard HRESULT error code.4008 /// </returns>4009 HRESULTGetFontFamilyNameLength(
4010 UINT32currentPosition,
4011 /*out*/UINT32* nameLength,
4012 /*out*/DWRITE_TEXT_RANGE* textRange = null4013 );
4014 4015 /// <summary>4016 /// Copy the font family name where the current position is at.4017 /// </summary>4018 /// <param name="currentPosition">The current text position.</param>4019 /// <param name="fontFamilyName">Character array that receives the current font family name</param>4020 /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>4021 /// <param name="textRange">The position range of the current format.</param>4022 /// <returns>4023 /// Standard HRESULT error code.4024 /// </returns>4025 HRESULTGetFontFamilyName(
4026 UINT32currentPosition,
4027 /*out*/WCHAR* fontFamilyName,
4028 UINT32nameSize,
4029 DWRITE_TEXT_RANGE* textRange = null4030 );
4031 4032 /// <summary>4033 /// Get the font weight where the current position is at.4034 /// </summary>4035 /// <param name="currentPosition">The current text position.</param>4036 /// <param name="fontWeight">The current font weight</param>4037 /// <param name="textRange">The position range of the current format.</param>4038 /// <returns>4039 /// Standard HRESULT error code.4040 /// </returns>4041 HRESULTGetFontWeight(
4042 UINT32currentPosition,
4043 /*out*/DWRITE_FONT_WEIGHT* fontWeight,
4044 /*out*/DWRITE_TEXT_RANGE* textRange = null4045 );
4046 4047 /// <summary>4048 /// Get the font style where the current position is at.4049 /// </summary>4050 /// <param name="currentPosition">The current text position.</param>4051 /// <param name="fontStyle">The current font style</param>4052 /// <param name="textRange">The position range of the current format.</param>4053 /// <returns>4054 /// Standard HRESULT error code.4055 /// </returns>4056 HRESULTGetFontStyle(
4057 UINT32currentPosition,
4058 /*out*/DWRITE_FONT_STYLE* fontStyle,
4059 /*out*/DWRITE_TEXT_RANGE* textRange = null4060 );
4061 4062 /// <summary>4063 /// Get the font stretch where the current position is at.4064 /// </summary>4065 /// <param name="currentPosition">The current text position.</param>4066 /// <param name="fontStretch">The current font stretch</param>4067 /// <param name="textRange">The position range of the current format.</param>4068 /// <returns>4069 /// Standard HRESULT error code.4070 /// </returns>4071 HRESULTGetFontStretch(
4072 UINT32currentPosition,
4073 /*out*/DWRITE_FONT_STRETCH* fontStretch,
4074 /*out*/DWRITE_TEXT_RANGE* textRange = null4075 );
4076 4077 /// <summary>4078 /// Get the font em height where the current position is at.4079 /// </summary>4080 /// <param name="currentPosition">The current text position.</param>4081 /// <param name="fontSize">The current font em height</param>4082 /// <param name="textRange">The position range of the current format.</param>4083 /// <returns>4084 /// Standard HRESULT error code.4085 /// </returns>4086 HRESULTGetFontSize(
4087 UINT32currentPosition,
4088 /*out*/FLOAT* fontSize,
4089 /*out*/DWRITE_TEXT_RANGE* textRange = null4090 );
4091 4092 /// <summary>4093 /// Get the underline presence where the current position is at.4094 /// </summary>4095 /// <param name="currentPosition">The current text position.</param>4096 /// <param name="hasUnderline">The Boolean flag indicates whether text is underlined.</param>4097 /// <param name="textRange">The position range of the current format.</param>4098 /// <returns>4099 /// Standard HRESULT error code.4100 /// </returns>4101 HRESULTGetUnderline(
4102 UINT32currentPosition,
4103 /*out*/BOOL* hasUnderline,
4104 /*out*/DWRITE_TEXT_RANGE* textRange = null4105 );
4106 4107 /// <summary>4108 /// Get the strikethrough presence where the current position is at.4109 /// </summary>4110 /// <param name="currentPosition">The current text position.</param>4111 /// <param name="hasStrikethrough">The Boolean flag indicates whether text has strikethrough.</param>4112 /// <param name="textRange">The position range of the current format.</param>4113 /// <returns>4114 /// Standard HRESULT error code.4115 /// </returns>4116 HRESULTGetStrikethrough(
4117 UINT32currentPosition,
4118 /*out*/BOOL* hasStrikethrough,
4119 /*out*/DWRITE_TEXT_RANGE* textRange = null4120 );
4121 4122 /// <summary>4123 /// Get the application-defined drawing effect where the current position is at.4124 /// </summary>4125 /// <param name="currentPosition">The current text position.</param>4126 /// <param name="drawingEffect">The current application-defined drawing effect.</param>4127 /// <param name="textRange">The position range of the current format.</param>4128 /// <returns>4129 /// Standard HRESULT error code.4130 /// </returns>4131 HRESULTGetDrawingEffect(
4132 UINT32currentPosition,
4133 /*out*/IUnknown* drawingEffect,
4134 /*out*/DWRITE_TEXT_RANGE* textRange = null4135 );
4136 4137 /// <summary>4138 /// Get the inline object at the given position.4139 /// </summary>4140 /// <param name="currentPosition">The given text position.</param>4141 /// <param name="inlineObject">The inline object.</param>4142 /// <param name="textRange">The position range of the current format.</param>4143 /// <returns>4144 /// Standard HRESULT error code.4145 /// </returns>4146 HRESULTGetInlineObject(
4147 UINT32currentPosition,
4148 /*out*/IDWriteInlineObject* inlineObject,
4149 /*out*/DWRITE_TEXT_RANGE* textRange = null4150 );
4151 4152 /// <summary>4153 /// Get the typography setting where the current position is at.4154 /// </summary>4155 /// <param name="currentPosition">The current text position.</param>4156 /// <param name="typography">The current typography setting.</param>4157 /// <param name="textRange">The position range of the current format.</param>4158 /// <returns>4159 /// Standard HRESULT error code.4160 /// </returns>4161 HRESULTGetTypography(
4162 UINT32currentPosition,
4163 /*out*/IDWriteTypography* typography,
4164 /*out*/DWRITE_TEXT_RANGE* textRange = null4165 );
4166 4167 /// <summary>4168 /// Get the length of the locale name where the current position is at.4169 /// </summary>4170 /// <param name="currentPosition">The current text position.</param>4171 /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>4172 /// <param name="textRange">The position range of the current format.</param>4173 /// <returns>4174 /// Standard HRESULT error code.4175 /// </returns>4176 HRESULTGetLocaleNameLength(
4177 UINT32currentPosition,
4178 /*out*/UINT32* nameLength,
4179 /*out*/DWRITE_TEXT_RANGE* textRange = null4180 );
4181 4182 /// <summary>4183 /// Get the locale name where the current position is at.4184 /// </summary>4185 /// <param name="currentPosition">The current text position.</param>4186 /// <param name="localeName">Character array that receives the current locale name</param>4187 /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>4188 /// <param name="textRange">The position range of the current format.</param>4189 /// <returns>4190 /// Standard HRESULT error code.4191 /// </returns>4192 HRESULTGetLocaleName(
4193 UINT32currentPosition,
4194 /*out*/WCHAR* localeName,
4195 UINT32nameSize,
4196 /*out*/DWRITE_TEXT_RANGE* textRange = null4197 );
4198 4199 /// <summary>4200 /// Initiate drawing of the text.4201 /// </summary>4202 /// <param name="clientDrawingContext">An application defined value4203 /// included in rendering callbacks.</param>4204 /// <param name="renderer">The set of application-defined callbacks that do4205 /// the actual rendering.</param>4206 /// <param name="originX">X-coordinate of the layout's left side.</param>4207 /// <param name="originY">Y-coordinate of the layout's top side.</param>4208 /// <returns>4209 /// Standard HRESULT error code.4210 /// </returns>4211 HRESULTDraw(
4212 void* clientDrawingContext,
4213 IDWriteTextRendererrenderer,
4214 FLOAToriginX,
4215 FLOAToriginY4216 );
4217 4218 /// <summary>4219 /// GetLineMetrics returns properties of each line.4220 /// </summary>4221 /// <param name="lineMetrics">The array to fill with line information.</param>4222 /// <param name="maxLineCount">The maximum size of the lineMetrics array.</param>4223 /// <param name="actualLineCount">The actual size of the lineMetrics4224 /// array that is needed.</param>4225 /// <returns>4226 /// Standard HRESULT error code.4227 /// </returns>4228 /// <remarks>4229 /// If maxLineCount is not large enough E_NOT_SUFFICIENT_BUFFER, 4230 /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),4231 /// is returned and *actualLineCount is set to the number of lines4232 /// needed.4233 /// </remarks>4234 HRESULTGetLineMetrics(
4235 /*out*/DWRITE_LINE_METRICS* lineMetrics,
4236 UINT32maxLineCount,
4237 /*out*/UINT32* actualLineCount4238 );
4239 4240 /// <summary>4241 /// GetMetrics retrieves overall metrics for the formatted string.4242 /// </summary>4243 /// <param name="textMetrics">The returned metrics.</param>4244 /// <returns>4245 /// Standard HRESULT error code.4246 /// </returns>4247 /// <remarks>4248 /// Drawing effects like underline and strikethrough do not contribute4249 /// to the text size, which is essentially the sum of advance widths and4250 /// line heights. Additionally, visible swashes and other graphic4251 /// adornments may extend outside the returned width and height.4252 /// </remarks>4253 HRESULTGetMetrics(
4254 /*out*/DWRITE_TEXT_METRICS* textMetrics4255 );
4256 4257 /// <summary>4258 /// GetOverhangMetrics returns the overhangs (in DIPs) of the layout and all4259 /// objects contained in it, including text glyphs and inline objects.4260 /// </summary>4261 /// <param name="overhangs">Overshoots of visible extents (in DIPs) outside the layout.</param>4262 /// <returns>4263 /// Standard HRESULT error code.4264 /// </returns>4265 /// <remarks>4266 /// Any underline and strikethrough do not contribute to the black box4267 /// determination, since these are actually drawn by the renderer, which4268 /// is allowed to draw them in any variety of styles.4269 /// </remarks>4270 HRESULTGetOverhangMetrics(
4271 /*out*/DWRITE_OVERHANG_METRICS* overhangs4272 );
4273 4274 /// <summary>4275 /// Retrieve logical properties and measurement of each cluster.4276 /// </summary>4277 /// <param name="clusterMetrics">The array to fill with cluster information.</param>4278 /// <param name="maxClusterCount">The maximum size of the clusterMetrics array.</param>4279 /// <param name="actualClusterCount">The actual size of the clusterMetrics array that is needed.</param>4280 /// <returns>4281 /// Standard HRESULT error code.4282 /// </returns>4283 /// <remarks>4284 /// If maxClusterCount is not large enough E_NOT_SUFFICIENT_BUFFER, 4285 /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), 4286 /// is returned and *actualClusterCount is set to the number of clusters4287 /// needed.4288 /// </remarks>4289 HRESULTGetClusterMetrics(
4290 /*out*/DWRITE_CLUSTER_METRICS* clusterMetrics,
4291 UINT32maxClusterCount,
4292 /*out*/UINT32* actualClusterCount4293 );
4294 4295 /// <summary>4296 /// Determines the minimum possible width the layout can be set to without4297 /// emergency breaking between the characters of whole words.4298 /// </summary>4299 /// <param name="minWidth">Minimum width.</param>4300 /// <returns>4301 /// Standard HRESULT error code.4302 /// </returns>4303 HRESULTDetermineMinWidth(
4304 /*out*/FLOAT* minWidth4305 );
4306 4307 /// <summary>4308 /// Given a coordinate (in DIPs) relative to the top-left of the layout box,4309 /// this returns the corresponding hit-test metrics of the text string where4310 /// the hit-test has occurred. This is useful for mapping mouse clicks to caret4311 /// positions. When the given coordinate is outside the text string, the function4312 /// sets the output value *isInside to false but returns the nearest character4313 /// position.4314 /// </summary>4315 /// <param name="pointX">X coordinate to hit-test, relative to the top-left location of the layout box.</param>4316 /// <param name="pointY">Y coordinate to hit-test, relative to the top-left location of the layout box.</param>4317 /// <param name="isTrailingHit">Output flag indicating whether the hit-test location is at the leading or the trailing4318 /// side of the character. When the output *isInside value is set to false, this value is set according to the output4319 /// *position value to represent the edge closest to the hit-test location. </param>4320 /// <param name="isInside">Output flag indicating whether the hit-test location is inside the text string.4321 /// When false, the position nearest the text's edge is returned.</param>4322 /// <param name="hitTestMetrics">Output geometry fully enclosing the hit-test location. When the output *isInside value4323 /// is set to false, this structure represents the geometry enclosing the edge closest to the hit-test location.</param>4324 /// <returns>4325 /// Standard HRESULT error code.4326 /// </returns>4327 HRESULTHitTestPoint(
4328 FLOATpointX,
4329 FLOATpointY,
4330 /*out*/BOOL* isTrailingHit,
4331 /*out*/BOOL* isInside,
4332 /*out*/DWRITE_HIT_TEST_METRICS* hitTestMetrics4333 );
4334 4335 /// <summary>4336 /// Given a text position and whether the caret is on the leading or trailing4337 /// edge of that position, this returns the corresponding coordinate (in DIPs)4338 /// relative to the top-left of the layout box. This is most useful for drawing4339 /// the caret's current position, but it could also be used to anchor an IME to the4340 /// typed text or attach a floating menu near the point of interest. It may also be4341 /// used to programmatically obtain the geometry of a particular text position4342 /// for UI automation.4343 /// </summary>4344 /// <param name="textPosition">Text position to get the coordinate of.</param>4345 /// <param name="isTrailingHit">Flag indicating whether the location is of the leading or the trailing side of the specified text position. </param>4346 /// <param name="pointX">Output caret X, relative to the top-left of the layout box.</param>4347 /// <param name="pointY">Output caret Y, relative to the top-left of the layout box.</param>4348 /// <param name="hitTestMetrics">Output geometry fully enclosing the specified text position.</param>4349 /// <returns>4350 /// Standard HRESULT error code.4351 /// </returns>4352 /// <remarks>4353 /// When drawing a caret at the returned X,Y, it should be centered on X4354 /// and drawn from the Y coordinate down. The height will be the size of the4355 /// hit-tested text (which can vary in size within a line).4356 /// Reading direction also affects which side of the character the caret is drawn.4357 /// However, the returned X coordinate will be correct for either case.4358 /// You can get a text length back that is larger than a single character.4359 /// This happens for complex scripts when multiple characters form a single cluster,4360 /// when diacritics join their base character, or when you test a surrogate pair.4361 /// </remarks>4362 HRESULTHitTestTextPosition(
4363 UINT32textPosition,
4364 BOOLisTrailingHit,
4365 /*out*/FLOAT* pointX,
4366 /*out*/FLOAT* pointY,
4367 /*out*/DWRITE_HIT_TEST_METRICS* hitTestMetrics4368 );
4369 4370 /// <summary>4371 /// The application calls this function to get a set of hit-test metrics4372 /// corresponding to a range of text positions. The main usage for this4373 /// is to draw highlighted selection of the text string.4374 ///4375 /// The function returns E_NOT_SUFFICIENT_BUFFER, which is equivalent to 4376 /// HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), when the buffer size of4377 /// hitTestMetrics is too small to hold all the regions calculated by the4378 /// function. In such situation, the function sets the output value4379 /// *actualHitTestMetricsCount to the number of geometries calculated.4380 /// The application is responsible to allocate a new buffer of greater4381 /// size and call the function again.4382 ///4383 /// A good value to use as an initial value for maxHitTestMetricsCount may4384 /// be calculated from the following equation:4385 /// maxHitTestMetricsCount = lineCount * maxBidiReorderingDepth4386 ///4387 /// where lineCount is obtained from the value of the output argument4388 /// *actualLineCount from the function IDWriteTextLayout::GetLineMetrics,4389 /// and the maxBidiReorderingDepth value from the DWRITE_TEXT_METRICS4390 /// structure of the output argument *textMetrics from the function4391 /// IDWriteFactory::CreateTextLayout.4392 /// </summary>4393 /// <param name="textPosition">First text position of the specified range.</param>4394 /// <param name="textLength">Number of positions of the specified range.</param>4395 /// <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>4396 /// <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>4397 /// <param name="hitTestMetrics">Pointer to a buffer of the output geometry fully enclosing the specified position range.</param>4398 /// <param name="maxHitTestMetricsCount">Maximum number of distinct metrics it could hold in its buffer memory.</param>4399 /// <param name="actualHitTestMetricsCount">Actual number of metrics returned or needed.</param>4400 /// <returns>4401 /// Standard HRESULT error code.4402 /// </returns>4403 /// <remarks>4404 /// There are no gaps in the returned metrics. While there could be visual gaps,4405 /// depending on bidi ordering, each range is contiguous and reports all the text,4406 /// including any hidden characters and trimmed text.4407 /// The height of each returned range will be the same within each line, regardless4408 /// of how the font sizes vary.4409 /// </remarks>4410 HRESULTHitTestTextRange(
4411 UINT32textPosition,
4412 UINT32textLength,
4413 FLOAToriginX,
4414 FLOAToriginY,
4415 /*out*/DWRITE_HIT_TEST_METRICS* hitTestMetrics,
4416 UINT32maxHitTestMetricsCount,
4417 /*out*/UINT32* actualHitTestMetricsCount4418 );
4419 }
4420 4421 4422 /// <summary>4423 /// Encapsulates a 32-bit device independent bitmap and device context, which can be used for rendering glyphs.4424 /// </summary>4425 mixin( uuid!(IDWriteBitmapRenderTarget, "5e5a32a3-8dff-4773-9ff6-0696eab77267") );
4426 interfaceIDWriteBitmapRenderTarget : IUnknown4427 {
4428 extern(Windows):
4429 /// <summary>4430 /// Draws a run of glyphs to the bitmap.4431 /// </summary>4432 /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>4433 /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>4434 /// <param name="measuringMode">Specifies measuring mode for glyphs in the run.4435 /// Renderer implementations may choose different rendering modes for different measuring modes, for example4436 /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL,4437 /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC, and4438 /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL.4439 /// </param>4440 /// <param name="glyphRun">Structure containing the properties of the glyph run.</param>4441 /// <param name="renderingParams">Object that controls rendering behavior.</param>4442 /// <param name="textColor">Specifies the foreground color of the text.</param>4443 /// <param name="blackBoxRect">Optional rectangle that receives the bounding box (in pixels not DIPs) of all the pixels affected by 4444 /// drawing the glyph run. The black box rectangle may extend beyond the dimensions of the bitmap.</param>4445 /// <returns>4446 /// Standard HRESULT error code.4447 /// </returns>4448 HRESULTDrawGlyphRun(
4449 FLOATbaselineOriginX,
4450 FLOATbaselineOriginY,
4451 DWRITE_MEASURING_MODEmeasuringMode,
4452 const(DWRITE_GLYPH_RUN)* glyphRun,
4453 IDWriteRenderingParamsrenderingParams,
4454 COLORREFtextColor,
4455 RECT* blackBoxRect = null4456 );
4457 4458 /// <summary>4459 /// Gets a handle to the memory device context.4460 /// </summary>4461 /// <returns>4462 /// Returns the device context handle.4463 /// </returns>4464 /// <remarks>4465 /// An application can use the device context to draw using GDI functions. An application can obtain the bitmap handle4466 /// (HBITMAP) by calling GetCurrentObject. An application that wants information about the underlying bitmap, including4467 /// a pointer to the pixel data, can call GetObject to fill in a DIBSECTION structure. The bitmap is always a 32-bit 4468 /// top-down DIB.4469 /// </remarks>4470 HDCGetMemoryDC();
4471 4472 /// <summary>4473 /// Gets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number4474 /// if pixels per inch divided by 96.4475 /// </summary>4476 /// <returns>4477 /// Returns the number of bitmap pixels per DIP.4478 /// </returns>4479 FLOATGetPixelsPerDip();
4480 4481 /// <summary>4482 /// Sets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number4483 /// if pixels per inch divided by 96.4484 /// </summary>4485 /// <param name="pixelsPerDip">Specifies the number of pixels per DIP.</param>4486 /// <returns>4487 /// Standard HRESULT error code.4488 /// </returns>4489 HRESULTSetPixelsPerDip(
4490 FLOATpixelsPerDip4491 );
4492 4493 /// <summary>4494 /// Gets the transform that maps abstract coordinate to DIPs. By default this is the identity 4495 /// transform. Note that this is unrelated to the world transform of the underlying device4496 /// context.4497 /// </summary>4498 /// <param name="transform">Receives the transform.</param>4499 /// <returns>4500 /// Standard HRESULT error code.4501 /// </returns>4502 HRESULTGetCurrentTransform(
4503 /*out*/DWRITE_MATRIX* transform4504 );
4505 4506 /// <summary>4507 /// Sets the transform that maps abstract coordinate to DIPs. This does not affect the world4508 /// transform of the underlying device context.4509 /// </summary>4510 /// <param name="transform">Specifies the new transform. This parameter can be NULL, in which4511 /// case the identity transform is implied.</param>4512 /// <returns>4513 /// Standard HRESULT error code.4514 /// </returns>4515 HRESULTSetCurrentTransform(
4516 const(DWRITE_MATRIX)* transform4517 );
4518 4519 /// <summary>4520 /// Gets the dimensions of the bitmap.4521 /// </summary>4522 /// <param name="size">Receives the size of the bitmap in pixels.</param>4523 /// <returns>4524 /// Standard HRESULT error code.4525 /// </returns>4526 HRESULTGetSize(
4527 /*out*/SIZE* size4528 );
4529 4530 /// <summary>4531 /// Resizes the bitmap.4532 /// </summary>4533 /// <param name="width">New bitmap width, in pixels.</param>4534 /// <param name="height">New bitmap height, in pixels.</param>4535 /// <returns>4536 /// Standard HRESULT error code.4537 /// </returns>4538 HRESULTResize(
4539 UINT32width,
4540 UINT32height4541 );
4542 }
4543 4544 /// <summary>4545 /// The GDI interop interface provides interoperability with GDI.4546 /// </summary>4547 mixin( uuid!(IDWriteGdiInterop, "1edd9491-9853-4299-898f-6432983b6f3a") );
4548 interfaceIDWriteGdiInterop : IUnknown4549 {
4550 extern(Windows):
4551 /// <summary>4552 /// Creates a font object that matches the properties specified by the LOGFONT structure.4553 /// </summary>4554 /// <param name="logFont">Structure containing a GDI-compatible font description.</param>4555 /// <param name="font">Receives a newly created font object if successful, or NULL in case of error.</param>4556 /// <returns>4557 /// Standard HRESULT error code.4558 /// </returns>4559 HRESULTCreateFontFromLOGFONT(
4560 const(LOGFONTW)* logFont,
4561 /*out*/IDWriteFont* font4562 );
4563 4564 /// <summary>4565 /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.4566 /// </summary>4567 /// <param name="font">Specifies a font in the system font collection.</param>4568 /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>4569 /// <param name="isSystemFont">Contains TRUE if the specified font object is part of the system font collection4570 /// or FALSE otherwise.</param>4571 /// <returns>4572 /// Standard HRESULT error code.4573 /// </returns>4574 HRESULTConvertFontToLOGFONT(
4575 IDWriteFontfont,
4576 /*out*/LOGFONTW* logFont,
4577 /*out*/BOOL* isSystemFont4578 );
4579 4580 /// <summary>4581 /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.4582 /// </summary>4583 /// <param name="font">Specifies a font face.</param>4584 /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>4585 /// <returns>4586 /// Standard HRESULT error code.4587 /// </returns>4588 HRESULTConvertFontFaceToLOGFONT(
4589 IDWriteFontFacefont,
4590 /*out*/LOGFONTW* logFont4591 );
4592 4593 /// <summary>4594 /// Creates a font face object that corresponds to the currently selected HFONT.4595 /// </summary>4596 /// <param name="hdc">Handle to a device context into which a font has been selected. It is assumed that the client4597 /// has already performed font mapping and that the font selected into the DC is the actual font that would be used 4598 /// for rendering glyphs.</param>4599 /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>4600 /// <returns>4601 /// Standard HRESULT error code.4602 /// </returns>4603 HRESULTCreateFontFaceFromHdc(
4604 HDChdc,
4605 /*out*/IDWriteFontFace* fontFace4606 );
4607 4608 /// <summary>4609 /// Creates an object that encapsulates a bitmap and memory DC which can be used for rendering glyphs.4610 /// </summary>4611 /// <param name="hdc">Optional device context used to create a compatible memory DC.</param>4612 /// <param name="width">Width of the bitmap.</param>4613 /// <param name="height">Height of the bitmap.</param>4614 /// <param name="renderTarget">Receives a pointer to the newly created render target.</param>4615 HRESULTCreateBitmapRenderTarget(
4616 HDChdc,
4617 UINT32width,
4618 UINT32height,
4619 /*out*/IDWriteBitmapRenderTarget* renderTarget4620 );
4621 }
4622 4623 /// <summary>4624 /// The DWRITE_TEXTURE_TYPE enumeration identifies a type of alpha texture. An alpha texture is a bitmap of alpha values, each4625 /// representing the darkness (i.e., opacity) of a pixel or subpixel.4626 /// </summary>4627 aliasDWRITE_TEXTURE_TYPE = int;
4628 enum : DWRITE_TEXTURE_TYPE4629 {
4630 /// <summary>4631 /// Specifies an alpha texture for aliased text rendering (i.e., bi-level, where each pixel is either fully opaque or fully transparent),4632 /// with one byte per pixel.4633 /// </summary>4634 DWRITE_TEXTURE_ALIASED_1x1,
4635 4636 /// <summary>4637 /// Specifies an alpha texture for ClearType text rendering, with three bytes per pixel in the horizontal dimension and 4638 /// one byte per pixel in the vertical dimension.4639 /// </summary>4640 DWRITE_TEXTURE_CLEARTYPE_3x14641 }
4642 4643 /// <summary>4644 /// Maximum alpha value in a texture returned by IDWriteGlyphRunAnalysis::CreateAlphaTexture.4645 /// </summary>4646 enumDWRITE_ALPHA_MAX = 255;
4647 4648 /// <summary>4649 /// Interface that encapsulates information used to render a glyph run.4650 /// </summary>4651 mixin( uuid!(IDWriteGlyphRunAnalysis, "7d97dbf7-e085-42d4-81e3-6a883bded118") );
4652 interfaceIDWriteGlyphRunAnalysis : IUnknown4653 {
4654 extern(Windows):
4655 /// <summary>4656 /// Gets the bounding rectangle of the physical pixels affected by the glyph run.4657 /// </summary>4658 /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the4659 /// bounding rectangle includes only bi-level glyphs. Otherwise, the bounding rectangle includes only anti-aliased4660 /// glyphs.</param>4661 /// <param name="textureBounds">Receives the bounding rectangle, or an empty rectangle if there are no glyphs4662 /// if the specified type.</param>4663 /// <returns>4664 /// Standard HRESULT error code.4665 /// </returns>4666 HRESULTGetAlphaTextureBounds(
4667 DWRITE_TEXTURE_TYPEtextureType,
4668 /*out*/RECT* textureBounds4669 );
4670 4671 /// <summary>4672 /// Creates an alpha texture of the specified type.4673 /// </summary>4674 /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the4675 /// texture contains only bi-level glyphs. Otherwise, the texture contains only anti-aliased glyphs.</param>4676 /// <param name="textureBounds">Specifies the bounding rectangle of the texture, which can be different than4677 /// the bounding rectangle returned by GetAlphaTextureBounds.</param>4678 /// <param name="alphaValues">Receives the array of alpha values.</param>4679 /// <param name="bufferSize">Size of the alphaValues array. The minimum size depends on the dimensions of the4680 /// rectangle and the type of texture requested.</param>4681 /// <returns>4682 /// Standard HRESULT error code.4683 /// </returns>4684 HRESULTCreateAlphaTexture(
4685 DWRITE_TEXTURE_TYPEtextureType,
4686 const(RECT)* textureBounds,
4687 /*out*/BYTE* alphaValues,
4688 UINT32bufferSize4689 );
4690 4691 /// <summary>4692 /// Gets properties required for ClearType blending.4693 /// </summary>4694 /// <param name="renderingParams">Rendering parameters object. In most cases, the values returned in the output4695 /// parameters are based on the properties of this object. The exception is if a GDI-compatible rendering mode4696 /// is specified.</param>4697 /// <param name="blendGamma">Receives the gamma value to use for gamma correction.</param>4698 /// <param name="blendEnhancedContrast">Receives the enhanced contrast value.</param>4699 /// <param name="blendClearTypeLevel">Receives the ClearType level.</param>4700 HRESULTGetAlphaBlendParams(
4701 IDWriteRenderingParamsrenderingParams,
4702 /*out*/FLOAT* blendGamma,
4703 /*out*/FLOAT* blendEnhancedContrast,
4704 /*out*/FLOAT* blendClearTypeLevel4705 );
4706 }
4707 4708 /// <summary>4709 /// The root factory interface for all DWrite objects.4710 /// </summary>4711 mixin( uuid!(IDWriteFactory, "b859ee5a-d838-4b5b-a2e8-1adc7d93db48") );
4712 interfaceIDWriteFactory : IUnknown4713 {
4714 extern(Windows):
4715 /// <summary>4716 /// Gets a font collection representing the set of installed fonts.4717 /// </summary>4718 /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>4719 /// <param name="checkForUpdates">If this parameter is nonzero, the function performs an immediate check for changes to the set of4720 /// installed fonts. If this parameter is FALSE, the function will still detect changes if the font cache service is running, but4721 /// there may be some latency. For example, an application might specify TRUE if it has itself just installed a font and wants to 4722 /// be sure the font collection contains that font.</param>4723 /// <returns>4724 /// Standard HRESULT error code.4725 /// </returns>4726 HRESULTGetSystemFontCollection(
4727 /*out*/IDWriteFontCollection* fontCollection,
4728 BOOLcheckForUpdates = FALSE4729 );
4730 4731 /// <summary>4732 /// Creates a font collection using a custom font collection loader.4733 /// </summary>4734 /// <param name="collectionLoader">Application-defined font collection loader, which must have been previously4735 /// registered using RegisterFontCollectionLoader.</param>4736 /// <param name="collectionKey">Key used by the loader to identify a collection of font files.</param>4737 /// <param name="collectionKeySize">Size in bytes of the collection key.</param>4738 /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>4739 /// <returns>4740 /// Standard HRESULT error code.4741 /// </returns>4742 HRESULTCreateCustomFontCollection(
4743 IDWriteFontCollectionLoadercollectionLoader,
4744 const(void*) collectionKey,
4745 UINT32collectionKeySize,
4746 /*out*/IDWriteFontCollection* fontCollection4747 );
4748 4749 /// <summary>4750 /// Registers a custom font collection loader with the factory object.4751 /// </summary>4752 /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>4753 /// <returns>4754 /// Standard HRESULT error code.4755 /// </returns>4756 HRESULTRegisterFontCollectionLoader(
4757 IDWriteFontCollectionLoaderfontCollectionLoader4758 );
4759 4760 /// <summary>4761 /// Unregisters a custom font collection loader that was previously registered using RegisterFontCollectionLoader.4762 /// </summary>4763 /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>4764 /// <returns>4765 /// Standard HRESULT error code.4766 /// </returns>4767 HRESULTUnregisterFontCollectionLoader(
4768 IDWriteFontCollectionLoaderfontCollectionLoader4769 );
4770 4771 /// <summary>4772 /// CreateFontFileReference creates a font file reference object from a local font file.4773 /// </summary>4774 /// <param name="filePath">Absolute file path. Subsequent operations on the constructed object may fail4775 /// if the user provided filePath doesn't correspond to a valid file on the disk.</param>4776 /// <param name="lastWriteTime">Last modified time of the input file path. If the parameter is omitted,4777 /// the function will access the font file to obtain its last write time, so the clients are encouraged to specify this value4778 /// to avoid extra disk access. Subsequent operations on the constructed object may fail4779 /// if the user provided lastWriteTime doesn't match the file on the disk.</param>4780 /// <param name="fontFile">Contains newly created font file reference object, or NULL in case of failure.</param>4781 /// <returns>4782 /// Standard HRESULT error code.4783 /// </returns>4784 HRESULTCreateFontFileReference(
4785 const(WCHAR)* filePath,
4786 const(FILETIME)* lastWriteTime,
4787 /*out*/IDWriteFontFile* fontFile4788 );
4789 4790 /// <summary>4791 /// CreateCustomFontFileReference creates a reference to an application specific font file resource.4792 /// This function enables an application or a document to use a font without having to install it on the system.4793 /// The fontFileReferenceKey has to be unique only in the scope of the fontFileLoader used in this call.4794 /// </summary>4795 /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource4796 /// during the lifetime of fontFileLoader.</param>4797 /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>4798 /// <param name="fontFileLoader">Font file loader that will be used by the font system to load data from the file identified by4799 /// fontFileReferenceKey.</param>4800 /// <param name="fontFile">Contains the newly created font file object, or NULL in case of failure.</param>4801 /// <returns>4802 /// Standard HRESULT error code.4803 /// </returns>4804 /// <remarks>4805 /// This function is provided for cases when an application or a document needs to use a font4806 /// without having to install it on the system. fontFileReferenceKey has to be unique only in the scope4807 /// of the fontFileLoader used in this call.4808 /// </remarks>4809 HRESULTCreateCustomFontFileReference(
4810 const(void*) fontFileReferenceKey,
4811 UINT32fontFileReferenceKeySize,
4812 IDWriteFontFileLoaderfontFileLoader,
4813 /*out*/IDWriteFontFile* fontFile4814 );
4815 4816 /// <summary>4817 /// Creates a font face object.4818 /// </summary>4819 /// <param name="fontFaceType">The file format of the font face.</param>4820 /// <param name="numberOfFiles">The number of font files required to represent the font face.</param>4821 /// <param name="fontFiles">Font files representing the font face. Since IDWriteFontFace maintains its own references4822 /// to the input font file objects, it's OK to release them after this call.</param>4823 /// <param name="faceIndex">The zero based index of a font face in cases when the font files contain a collection of font faces.4824 /// If the font files contain a single face, this value should be zero.</param>4825 /// <param name="fontFaceSimulationFlags">Font face simulation flags for algorithmic emboldening and italicization.</param>4826 /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>4827 /// <returns>4828 /// Standard HRESULT error code.4829 /// </returns>4830 HRESULTCreateFontFace(
4831 DWRITE_FONT_FACE_TYPEfontFaceType,
4832 UINT32numberOfFiles,
4833 const(IDWriteFontFile)* fontFiles,
4834 UINT32faceIndex,
4835 DWRITE_FONT_SIMULATIONSfontFaceSimulationFlags,
4836 /*out*/IDWriteFontFace* fontFace4837 );
4838 4839 /// <summary>4840 /// Creates a rendering parameters object with default settings for the primary monitor.4841 /// </summary>4842 /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>4843 /// <returns>4844 /// Standard HRESULT error code.4845 /// </returns>4846 HRESULTCreateRenderingParams(
4847 /*out*/IDWriteRenderingParams* renderingParams4848 );
4849 4850 /// <summary>4851 /// Creates a rendering parameters object with default settings for the specified monitor.4852 /// </summary>4853 /// <param name="monitor">The monitor to read the default values from.</param>4854 /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>4855 /// <returns>4856 /// Standard HRESULT error code.4857 /// </returns>4858 HRESULTCreateMonitorRenderingParams(
4859 HMONITORmonitor,
4860 /*out*/IDWriteRenderingParams* renderingParams4861 );
4862 4863 /// <summary>4864 /// Creates a rendering parameters object with the specified properties.4865 /// </summary>4866 /// <param name="gamma">The gamma value used for gamma correction, which must be greater than zero and cannot exceed 256.</param>4867 /// <param name="enhancedContrast">The amount of contrast enhancement, zero or greater.</param>4868 /// <param name="clearTypeLevel">The degree of ClearType level, from 0.0f (no ClearType) to 1.0f (full ClearType).</param>4869 /// <param name="pixelGeometry">The geometry of a device pixel.</param>4870 /// <param name="renderingMode">Method of rendering glyphs. In most cases, this should be DWRITE_RENDERING_MODE_DEFAULT to automatically use an appropriate mode.</param>4871 /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>4872 /// <returns>4873 /// Standard HRESULT error code.4874 /// </returns>4875 HRESULTCreateCustomRenderingParams(
4876 FLOATgamma,
4877 FLOATenhancedContrast,
4878 FLOATclearTypeLevel,
4879 DWRITE_PIXEL_GEOMETRYpixelGeometry,
4880 DWRITE_RENDERING_MODErenderingMode,
4881 /*out*/IDWriteRenderingParams* renderingParams4882 );
4883 4884 /// <summary>4885 /// Registers a font file loader with DirectWrite.4886 /// </summary>4887 /// <param name="fontFileLoader">Pointer to the implementation of the IDWriteFontFileLoader for a particular file resource type.</param>4888 /// <returns>4889 /// Standard HRESULT error code.4890 /// </returns>4891 /// <remarks>4892 /// This function registers a font file loader with DirectWrite.4893 /// Font file loader interface handles loading font file resources of a particular type from a key.4894 /// The font file loader interface is recommended to be implemented by a singleton object.4895 /// A given instance can only be registered once.4896 /// Succeeding attempts will return an error that it has already been registered.4897 /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite4898 /// inside their constructors and must not unregister themselves in their destructors, because4899 /// registration and unregistration operations increment and decrement the object reference count respectively.4900 /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed4901 /// outside of the font file loader implementation as a separate step.4902 /// </remarks>4903 HRESULTRegisterFontFileLoader(
4904 IDWriteFontFileLoaderfontFileLoader4905 );
4906 4907 /// <summary>4908 /// Unregisters a font file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.4909 /// </summary>4910 /// <param name="fontFileLoader">Pointer to the file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.</param>4911 /// <returns>4912 /// This function will succeed if the user loader is requested to be removed.4913 /// It will fail if the pointer to the file loader identifies a standard DirectWrite loader,4914 /// or a loader that is never registered or has already been unregistered.4915 /// </returns>4916 /// <remarks>4917 /// This function unregisters font file loader callbacks with the DirectWrite font system.4918 /// The font file loader interface is recommended to be implemented by a singleton object.4919 /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite4920 /// inside their constructors and must not unregister themselves in their destructors, because4921 /// registration and unregistration operations increment and decrement the object reference count respectively.4922 /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed4923 /// outside of the font file loader implementation as a separate step.4924 /// </remarks>4925 HRESULTUnregisterFontFileLoader(
4926 IDWriteFontFileLoaderfontFileLoader4927 );
4928 4929 /// <summary>4930 /// Create a text format object used for text layout.4931 /// </summary>4932 /// <param name="fontFamilyName">Name of the font family</param>4933 /// <param name="fontCollection">Font collection. NULL indicates the system font collection.</param>4934 /// <param name="fontWeight">Font weight</param>4935 /// <param name="fontStyle">Font style</param>4936 /// <param name="fontStretch">Font stretch</param>4937 /// <param name="fontSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>4938 /// <param name="localeName">Locale name</param>4939 /// <param name="textFormat">Contains newly created text format object, or NULL in case of failure.</param>4940 /// <returns>4941 /// Standard HRESULT error code.4942 /// </returns>4943 HRESULTCreateTextFormat(
4944 const(WCHAR)* fontFamilyName,
4945 IDWriteFontCollectionfontCollection,
4946 DWRITE_FONT_WEIGHTfontWeight,
4947 DWRITE_FONT_STYLEfontStyle,
4948 DWRITE_FONT_STRETCHfontStretch,
4949 FLOATfontSize,
4950 const(WCHAR)* localeName,
4951 /*out*/IDWriteTextFormat* textFormat4952 );
4953 4954 /// <summary>4955 /// Create a typography object used in conjunction with text format for text layout.4956 /// </summary>4957 /// <param name="typography">Contains newly created typography object, or NULL in case of failure.</param>4958 /// <returns>4959 /// Standard HRESULT error code.4960 /// </returns>4961 HRESULTCreateTypography(
4962 /*out*/IDWriteTypography* typography4963 );
4964 4965 /// <summary>4966 /// Create an object used for interoperability with GDI.4967 /// </summary>4968 /// <param name="gdiInterop">Receives the GDI interop object if successful, or NULL in case of failure.</param>4969 /// <returns>4970 /// Standard HRESULT error code.4971 /// </returns>4972 HRESULTGetGdiInterop(
4973 /*out*/IDWriteGdiInterop* gdiInterop4974 );
4975 4976 /// <summary>4977 /// CreateTextLayout takes a string, format, and associated constraints4978 /// and produces an object representing the fully analyzed4979 /// and formatted result.4980 /// </summary>4981 /// <param name="string">The string to layout.</param>4982 /// <param name="stringLength">The length of the string.</param>4983 /// <param name="textFormat">The format to apply to the string.</param>4984 /// <param name="maxWidth">Width of the layout box.</param>4985 /// <param name="maxHeight">Height of the layout box.</param>4986 /// <param name="textLayout">The resultant object.</param>4987 /// <returns>4988 /// Standard HRESULT error code.4989 /// </returns>4990 HRESULTCreateTextLayout(
4991 const(WCHAR)* string,
4992 UINT32stringLength,
4993 IDWriteTextFormattextFormat,
4994 FLOATmaxWidth,
4995 FLOATmaxHeight,
4996 /*out*/IDWriteTextLayout* textLayout4997 );
4998 4999 /// <summary>5000 /// CreateGdiCompatibleTextLayout takes a string, format, and associated constraints5001 /// and produces and object representing the result formatted for a particular display resolution5002 /// and measuring mode. The resulting text layout should only be used for the intended resolution,5003 /// and for cases where text scalability is desired, CreateTextLayout should be used instead.5004 /// </summary>5005 /// <param name="string">The string to layout.</param>5006 /// <param name="stringLength">The length of the string.</param>5007 /// <param name="textFormat">The format to apply to the string.</param>5008 /// <param name="layoutWidth">Width of the layout box.</param>5009 /// <param name="layoutHeight">Height of the layout box.</param>5010 /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI device then pixelsPerDip5011 /// is 1. If rendering onto a 120 DPI device then pixelsPerDip is 120/96.</param>5012 /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the5013 /// scaling specified the font size and pixelsPerDip.</param>5014 /// <param name="useGdiNatural">5015 /// When set to FALSE, instructs the text layout to use the same metrics as GDI aliased text.5016 /// When set to TRUE, instructs the text layout to use the same metrics as text measured by GDI using a font5017 /// created with CLEARTYPE_NATURAL_QUALITY.5018 /// </param>5019 /// <param name="textLayout">The resultant object.</param>5020 /// <returns>5021 /// Standard HRESULT error code.5022 /// </returns>5023 HRESULTCreateGdiCompatibleTextLayout(
5024 const(WCHAR)* string,
5025 UINT32stringLength,
5026 IDWriteTextFormattextFormat,
5027 FLOATlayoutWidth,
5028 FLOATlayoutHeight,
5029 FLOATpixelsPerDip,
5030 const(DWRITE_MATRIX)* transform,
5031 BOOLuseGdiNatural,
5032 /*out*/IDWriteTextLayout* textLayout5033 );
5034 5035 /// <summary>5036 /// The application may call this function to create an inline object for trimming, using an ellipsis as the omission sign.5037 /// The ellipsis will be created using the current settings of the format, including base font, style, and any effects.5038 /// Alternate omission signs can be created by the application by implementing IDWriteInlineObject.5039 /// </summary>5040 /// <param name="textFormat">Text format used as a template for the omission sign.</param>5041 /// <param name="trimmingSign">Created omission sign.</param>5042 /// <returns>5043 /// Standard HRESULT error code.5044 /// </returns>5045 HRESULTCreateEllipsisTrimmingSign(
5046 IDWriteTextFormattextFormat,
5047 /*out*/IDWriteInlineObject* trimmingSign5048 );
5049 5050 /// <summary>5051 /// Return an interface to perform text analysis with.5052 /// </summary>5053 /// <param name="textAnalyzer">The resultant object.</param>5054 /// <returns>5055 /// Standard HRESULT error code.5056 /// </returns>5057 HRESULTCreateTextAnalyzer(
5058 /*out*/IDWriteTextAnalyzer* textAnalyzer5059 );
5060 5061 /// <summary>5062 /// Creates a number substitution object using a locale name,5063 /// substitution method, and whether to ignore user overrides (uses NLS5064 /// defaults for the given culture instead).5065 /// </summary>5066 /// <param name="substitutionMethod">Method of number substitution to use.</param>5067 /// <param name="localeName">Which locale to obtain the digits from.</param>5068 /// <param name="ignoreUserOverride">Ignore the user's settings and use the locale defaults</param>5069 /// <param name="numberSubstitution">Receives a pointer to the newly created object.</param>5070 HRESULTCreateNumberSubstitution(
5071 DWRITE_NUMBER_SUBSTITUTION_METHODsubstitutionMethod,
5072 const(WCHAR)* localeName,
5073 BOOLignoreUserOverride,
5074 /*out*/IDWriteNumberSubstitution* numberSubstitution5075 );
5076 5077 /// <summary>5078 /// Creates a glyph run analysis object, which encapsulates information5079 /// used to render a glyph run.5080 /// </summary>5081 /// <param name="glyphRun">Structure specifying the properties of the glyph run.</param>5082 /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI bitmap then pixelsPerDip5083 /// is 1. If rendering onto a 120 DPI bitmap then pixelsPerDip is 120/96.</param>5084 /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the5085 /// scaling specified the emSize and pixelsPerDip.</param>5086 /// <param name="renderingMode">Specifies the rendering mode, which must be one of the raster rendering modes (i.e., not default5087 /// and not outline).</param>5088 /// <param name="measuringMode">Specifies the method to measure glyphs.</param>5089 /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs.</param>5090 /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs.</param>5091 /// <param name="glyphRunAnalysis">Receives a pointer to the newly created object.</param>5092 /// <returns>5093 /// Standard HRESULT error code.5094 /// </returns>5095 HRESULTCreateGlyphRunAnalysis(
5096 const(DWRITE_GLYPH_RUN)* glyphRun,
5097 FLOATpixelsPerDip,
5098 const(DWRITE_MATRIX)* transform,
5099 DWRITE_RENDERING_MODErenderingMode,
5100 DWRITE_MEASURING_MODEmeasuringMode,
5101 FLOATbaselineOriginX,
5102 FLOATbaselineOriginY,
5103 /*out*/IDWriteGlyphRunAnalysis* glyphRunAnalysis5104 );
5105 5106 } // interface IDWriteFactory5107 5108 5109 /// <summary>5110 /// Creates a DirectWrite factory object that is used for subsequent creation of individual DirectWrite objects.5111 /// </summary>5112 /// <param name="factoryType">Identifies whether the factory object will be shared or isolated.</param>5113 /// <param name="iid">Identifies the DirectWrite factory interface, such as __uuidof(IDWriteFactory).</param>5114 /// <param name="factory">Receives the DirectWrite factory object.</param>5115 /// <returns>5116 /// Standard HRESULT error code.5117 /// </returns>5118 /// <remarks>5119 /// Obtains DirectWrite factory object that is used for subsequent creation of individual DirectWrite classes.5120 /// DirectWrite factory contains internal state such as font loader registration and cached font data.5121 /// In most cases it is recommended to use the shared factory object, because it allows multiple components5122 /// that use DirectWrite to share internal DirectWrite state and reduce memory usage.5123 /// However, there are cases when it is desirable to reduce the impact of a component,5124 /// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it5125 /// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed5126 /// component.5127 /// </remarks>5128 exportextern(C) HRESULTDWriteCreateFactory(
5129 DWRITE_FACTORY_TYPEfactoryType,
5130 REFIIDiid,
5131 /*out*/IUnknown* factory5132 );
5133 5134 // Macros used to define DirectWrite error codes.5135 enumFACILITY_DWRITE = 0x898;
5136 enumDWRITE_ERR_BASE = 0x5000;
5137 5138 HRESULTMAKE_DWRITE_HR(aliassev, T)(Tcode) {
5139 returnMAKE_HRESULT(sev, FACILITY_DWRITE, DWRITE_ERR_BASE+code);
5140 }
5141 5142 HRESULTMAKE_DWRITE_HR_ERR(T)(Tcode) {
5143 returnMAKE_DWRITE_HR(1, code);
5144 }
5145 5146 5147 // DWrite errors have moved to winerror.h5148