2 * Text format and layout
4 * Copyright 2012 Nikolay Sivov for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
29 #include "dwrite_private.h"
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(dwrite
);
35 struct dwrite_textformat_data
{
41 DWRITE_FONT_WEIGHT weight
;
42 DWRITE_FONT_STYLE style
;
43 DWRITE_FONT_STRETCH stretch
;
47 IDWriteFontCollection
*collection
;
50 struct dwrite_textlayout
{
51 IDWriteTextLayout IDWriteTextLayout_iface
;
56 struct dwrite_textformat_data format
;
59 struct dwrite_textformat
{
60 IDWriteTextFormat IDWriteTextFormat_iface
;
62 struct dwrite_textformat_data format
;
65 static const IDWriteTextFormatVtbl dwritetextformatvtbl
;
67 static void release_format_data(struct dwrite_textformat_data
*data
)
69 if (data
->collection
) IDWriteFontCollection_Release(data
->collection
);
70 heap_free(data
->family_name
);
71 heap_free(data
->locale
);
74 static inline struct dwrite_textlayout
*impl_from_IDWriteTextLayout(IDWriteTextLayout
*iface
)
76 return CONTAINING_RECORD(iface
, struct dwrite_textlayout
, IDWriteTextLayout_iface
);
79 static inline struct dwrite_textformat
*impl_from_IDWriteTextFormat(IDWriteTextFormat
*iface
)
81 return CONTAINING_RECORD(iface
, struct dwrite_textformat
, IDWriteTextFormat_iface
);
84 static inline struct dwrite_textformat
*unsafe_impl_from_IDWriteTextFormat(IDWriteTextFormat
*iface
)
86 return iface
->lpVtbl
== &dwritetextformatvtbl
? impl_from_IDWriteTextFormat(iface
) : NULL
;
89 static HRESULT WINAPI
dwritetextlayout_QueryInterface(IDWriteTextLayout
*iface
, REFIID riid
, void **obj
)
91 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
93 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), obj
);
95 if (IsEqualIID(riid
, &IID_IUnknown
) ||
96 IsEqualIID(riid
, &IID_IDWriteTextFormat
) ||
97 IsEqualIID(riid
, &IID_IDWriteTextLayout
))
100 IDWriteTextLayout_AddRef(iface
);
106 return E_NOINTERFACE
;
109 static ULONG WINAPI
dwritetextlayout_AddRef(IDWriteTextLayout
*iface
)
111 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
112 ULONG ref
= InterlockedIncrement(&This
->ref
);
113 TRACE("(%p)->(%d)\n", This
, ref
);
117 static ULONG WINAPI
dwritetextlayout_Release(IDWriteTextLayout
*iface
)
119 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
120 ULONG ref
= InterlockedDecrement(&This
->ref
);
122 TRACE("(%p)->(%d)\n", This
, ref
);
126 release_format_data(&This
->format
);
127 heap_free(This
->str
);
134 static HRESULT WINAPI
dwritetextlayout_SetTextAlignment(IDWriteTextLayout
*iface
, DWRITE_TEXT_ALIGNMENT alignment
)
136 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
137 FIXME("(%p)->(%d): stub\n", This
, alignment
);
141 static HRESULT WINAPI
dwritetextlayout_SetParagraphAlignment(IDWriteTextLayout
*iface
, DWRITE_PARAGRAPH_ALIGNMENT alignment
)
143 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
144 FIXME("(%p)->(%d): stub\n", This
, alignment
);
148 static HRESULT WINAPI
dwritetextlayout_SetWordWrapping(IDWriteTextLayout
*iface
, DWRITE_WORD_WRAPPING wrapping
)
150 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
151 FIXME("(%p)->(%d): stub\n", This
, wrapping
);
155 static HRESULT WINAPI
dwritetextlayout_SetReadingDirection(IDWriteTextLayout
*iface
, DWRITE_READING_DIRECTION direction
)
157 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
158 FIXME("(%p)->(%d): stub\n", This
, direction
);
162 static HRESULT WINAPI
dwritetextlayout_SetFlowDirection(IDWriteTextLayout
*iface
, DWRITE_FLOW_DIRECTION direction
)
164 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
165 FIXME("(%p)->(%d): stub\n", This
, direction
);
169 static HRESULT WINAPI
dwritetextlayout_SetIncrementalTabStop(IDWriteTextLayout
*iface
, FLOAT tabstop
)
171 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
172 FIXME("(%p)->(%f): stub\n", This
, tabstop
);
176 static HRESULT WINAPI
dwritetextlayout_SetTrimming(IDWriteTextLayout
*iface
, DWRITE_TRIMMING
const *trimming
,
177 IDWriteInlineObject
*trimming_sign
)
179 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
180 FIXME("(%p)->(%p %p): stub\n", This
, trimming
, trimming_sign
);
184 static HRESULT WINAPI
dwritetextlayout_SetLineSpacing(IDWriteTextLayout
*iface
, DWRITE_LINE_SPACING_METHOD spacing
,
185 FLOAT line_spacing
, FLOAT baseline
)
187 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
188 FIXME("(%p)->(%d %f %f): stub\n", This
, spacing
, line_spacing
, baseline
);
192 static DWRITE_TEXT_ALIGNMENT WINAPI
dwritetextlayout_GetTextAlignment(IDWriteTextLayout
*iface
)
194 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
195 FIXME("(%p): stub\n", This
);
196 return DWRITE_TEXT_ALIGNMENT_LEADING
;
199 static DWRITE_PARAGRAPH_ALIGNMENT WINAPI
dwritetextlayout_GetParagraphAlignment(IDWriteTextLayout
*iface
)
201 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
202 FIXME("(%p): stub\n", This
);
203 return DWRITE_PARAGRAPH_ALIGNMENT_NEAR
;
206 static DWRITE_WORD_WRAPPING WINAPI
dwritetextlayout_GetWordWrapping(IDWriteTextLayout
*iface
)
208 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
209 FIXME("(%p): stub\n", This
);
210 return DWRITE_WORD_WRAPPING_NO_WRAP
;
213 static DWRITE_READING_DIRECTION WINAPI
dwritetextlayout_GetReadingDirection(IDWriteTextLayout
*iface
)
215 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
216 FIXME("(%p): stub\n", This
);
217 return DWRITE_READING_DIRECTION_LEFT_TO_RIGHT
;
220 static DWRITE_FLOW_DIRECTION WINAPI
dwritetextlayout_GetFlowDirection(IDWriteTextLayout
*iface
)
222 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
223 FIXME("(%p): stub\n", This
);
224 return DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM
;
227 static FLOAT WINAPI
dwritetextlayout_GetIncrementalTabStop(IDWriteTextLayout
*iface
)
229 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
230 FIXME("(%p): stub\n", This
);
234 static HRESULT WINAPI
dwritetextlayout_GetTrimming(IDWriteTextLayout
*iface
, DWRITE_TRIMMING
*options
,
235 IDWriteInlineObject
**trimming_sign
)
237 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
238 FIXME("(%p)->(%p %p): stub\n", This
, options
, trimming_sign
);
242 static HRESULT WINAPI
dwritetextlayout_GetLineSpacing(IDWriteTextLayout
*iface
, DWRITE_LINE_SPACING_METHOD
*method
,
243 FLOAT
*spacing
, FLOAT
*baseline
)
245 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
246 FIXME("(%p)->(%p %p %p): stub\n", This
, method
, spacing
, baseline
);
250 static HRESULT WINAPI
dwritetextlayout_GetFontCollection(IDWriteTextLayout
*iface
, IDWriteFontCollection
**collection
)
252 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
253 FIXME("(%p)->(%p): stub\n", This
, collection
);
257 static UINT32 WINAPI
dwritetextlayout_GetFontFamilyNameLength(IDWriteTextLayout
*iface
)
259 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
260 FIXME("(%p): stub\n", This
);
264 static HRESULT WINAPI
dwritetextlayout_GetFontFamilyName(IDWriteTextLayout
*iface
, WCHAR
*name
, UINT32 size
)
266 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
267 FIXME("(%p)->(%p %u): stub\n", This
, name
, size
);
271 static DWRITE_FONT_WEIGHT WINAPI
dwritetextlayout_GetFontWeight(IDWriteTextLayout
*iface
)
273 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
274 FIXME("(%p): stub\n", This
);
275 return DWRITE_FONT_WEIGHT_NORMAL
;
278 static DWRITE_FONT_STYLE WINAPI
dwritetextlayout_GetFontStyle(IDWriteTextLayout
*iface
)
280 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
281 FIXME("(%p): stub\n", This
);
282 return DWRITE_FONT_STYLE_NORMAL
;
285 static DWRITE_FONT_STRETCH WINAPI
dwritetextlayout_GetFontStretch(IDWriteTextLayout
*iface
)
287 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
288 FIXME("(%p): stub\n", This
);
289 return DWRITE_FONT_STRETCH_NORMAL
;
292 static FLOAT WINAPI
dwritetextlayout_GetFontSize(IDWriteTextLayout
*iface
)
294 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
295 FIXME("(%p): stub\n", This
);
299 static UINT32 WINAPI
dwritetextlayout_GetLocaleNameLength(IDWriteTextLayout
*iface
)
301 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
302 TRACE("(%p)\n", This
);
303 return This
->format
.locale_len
;
306 static HRESULT WINAPI
dwritetextlayout_GetLocaleName(IDWriteTextLayout
*iface
, WCHAR
*name
, UINT32 size
)
308 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
310 TRACE("(%p)->(%p %u)\n", This
, name
, size
);
312 if (size
<= This
->format
.locale_len
) return E_NOT_SUFFICIENT_BUFFER
;
313 strcpyW(name
, This
->format
.locale
);
317 static HRESULT WINAPI
dwritetextlayout_SetMaxWidth(IDWriteTextLayout
*iface
, FLOAT maxWidth
)
319 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
320 FIXME("(%p)->(%f): stub\n", This
, maxWidth
);
324 static HRESULT WINAPI
dwritetextlayout_SetMaxHeight(IDWriteTextLayout
*iface
, FLOAT maxHeight
)
326 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
327 FIXME("(%p)->(%f): stub\n", This
, maxHeight
);
331 static HRESULT WINAPI
dwritetextlayout_SetFontCollection(IDWriteTextLayout
*iface
, IDWriteFontCollection
* collection
, DWRITE_TEXT_RANGE range
)
333 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
334 FIXME("(%p)->(%p %u:%u): stub\n", This
, collection
, range
.startPosition
, range
.length
);
338 static HRESULT WINAPI
dwritetextlayout_SetFontFamilyName(IDWriteTextLayout
*iface
, WCHAR
const *name
, DWRITE_TEXT_RANGE range
)
340 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
341 FIXME("(%p)->(%s %u:%u): stub\n", This
, debugstr_w(name
), range
.startPosition
, range
.length
);
345 static HRESULT WINAPI
dwritetextlayout_SetFontWeight(IDWriteTextLayout
*iface
, DWRITE_FONT_WEIGHT weight
, DWRITE_TEXT_RANGE range
)
347 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
348 FIXME("(%p)->(%d %u:%u): stub\n", This
, weight
, range
.startPosition
, range
.length
);
352 static HRESULT WINAPI
dwritetextlayout_SetFontStyle(IDWriteTextLayout
*iface
, DWRITE_FONT_STYLE style
, DWRITE_TEXT_RANGE range
)
354 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
355 FIXME("(%p)->(%d %u:%u): stub\n", This
, style
, range
.startPosition
, range
.length
);
359 static HRESULT WINAPI
dwritetextlayout_SetFontStretch(IDWriteTextLayout
*iface
, DWRITE_FONT_STRETCH stretch
, DWRITE_TEXT_RANGE range
)
361 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
362 FIXME("(%p)->(%d %u:%u): stub\n", This
, stretch
, range
.startPosition
, range
.length
);
366 static HRESULT WINAPI
dwritetextlayout_SetFontSize(IDWriteTextLayout
*iface
, FLOAT size
, DWRITE_TEXT_RANGE range
)
368 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
369 FIXME("(%p)->(%f %u:%u): stub\n", This
, size
, range
.startPosition
, range
.length
);
373 static HRESULT WINAPI
dwritetextlayout_SetUnderline(IDWriteTextLayout
*iface
, BOOL underline
, DWRITE_TEXT_RANGE range
)
375 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
376 FIXME("(%p)->(%d %u:%u): stub\n", This
, underline
, range
.startPosition
, range
.length
);
380 static HRESULT WINAPI
dwritetextlayout_SetStrikethrough(IDWriteTextLayout
*iface
, BOOL strikethrough
, DWRITE_TEXT_RANGE range
)
382 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
383 FIXME("(%p)->(%d %u:%u): stub\n", This
, strikethrough
, range
.startPosition
, range
.length
);
387 static HRESULT WINAPI
dwritetextlayout_SetDrawingEffect(IDWriteTextLayout
*iface
, IUnknown
* effect
, DWRITE_TEXT_RANGE range
)
389 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
390 FIXME("(%p)->(%p %u:%u): stub\n", This
, effect
, range
.startPosition
, range
.length
);
394 static HRESULT WINAPI
dwritetextlayout_SetInlineObject(IDWriteTextLayout
*iface
, IDWriteInlineObject
*object
, DWRITE_TEXT_RANGE range
)
396 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
397 FIXME("(%p)->(%p %u:%u): stub\n", This
, object
, range
.startPosition
, range
.length
);
401 static HRESULT WINAPI
dwritetextlayout_SetTypography(IDWriteTextLayout
*iface
, IDWriteTypography
* typography
, DWRITE_TEXT_RANGE range
)
403 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
404 FIXME("(%p)->(%p %u:%u): stub\n", This
, typography
, range
.startPosition
, range
.length
);
408 static HRESULT WINAPI
dwritetextlayout_SetLocaleName(IDWriteTextLayout
*iface
, WCHAR
const* locale
, DWRITE_TEXT_RANGE range
)
410 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
411 FIXME("(%p)->(%s %u:%u): stub\n", This
, debugstr_w(locale
), range
.startPosition
, range
.length
);
415 static FLOAT WINAPI
dwritetextlayout_GetMaxWidth(IDWriteTextLayout
*iface
)
417 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
418 FIXME("(%p): stub\n", This
);
422 static FLOAT WINAPI
dwritetextlayout_GetMaxHeight(IDWriteTextLayout
*iface
)
424 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
425 FIXME("(%p): stub\n", This
);
429 static HRESULT WINAPI
dwritetextlayout_layout_GetFontCollection(IDWriteTextLayout
*iface
, UINT32 pos
,
430 IDWriteFontCollection
** collection
, DWRITE_TEXT_RANGE
*range
)
432 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
433 FIXME("(%p)->(%p %p): stub\n", This
, collection
, range
);
437 static HRESULT WINAPI
dwritetextlayout_layout_GetFontFamilyNameLength(IDWriteTextLayout
*iface
,
438 UINT32 pos
, UINT32
* len
, DWRITE_TEXT_RANGE
*range
)
440 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
441 FIXME("(%p)->(%d %p %p): stub\n", This
, pos
, len
, range
);
445 static HRESULT WINAPI
dwritetextlayout_layout_GetFontFamilyName(IDWriteTextLayout
*iface
,
446 UINT32 position
, WCHAR
* name
, UINT32 name_size
, DWRITE_TEXT_RANGE
*range
)
448 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
449 FIXME("(%p)->(%u %p %u %p): stub\n", This
, position
, name
, name_size
, range
);
453 static HRESULT WINAPI
dwritetextlayout_layout_GetFontWeight(IDWriteTextLayout
*iface
,
454 UINT32 position
, DWRITE_FONT_WEIGHT
*weight
, DWRITE_TEXT_RANGE
*range
)
456 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
457 FIXME("(%p)->(%u %p %p): stub\n", This
, position
, weight
, range
);
461 static HRESULT WINAPI
dwritetextlayout_layout_GetFontStyle(IDWriteTextLayout
*iface
,
462 UINT32 currentPosition
, DWRITE_FONT_STYLE
*style
, DWRITE_TEXT_RANGE
*range
)
464 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
465 FIXME("(%p)->(%u %p %p): stub\n", This
, currentPosition
, style
, range
);
469 static HRESULT WINAPI
dwritetextlayout_layout_GetFontStretch(IDWriteTextLayout
*iface
,
470 UINT32 position
, DWRITE_FONT_STRETCH
*stretch
, DWRITE_TEXT_RANGE
*range
)
472 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
473 FIXME("(%p)->(%u %p %p): stub\n", This
, position
, stretch
, range
);
477 static HRESULT WINAPI
dwritetextlayout_layout_GetFontSize(IDWriteTextLayout
*iface
,
478 UINT32 position
, FLOAT
*size
, DWRITE_TEXT_RANGE
*range
)
480 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
481 FIXME("(%p)->(%u %p %p): stub\n", This
, position
, size
, range
);
485 static HRESULT WINAPI
dwritetextlayout_GetUnderline(IDWriteTextLayout
*iface
,
486 UINT32 position
, BOOL
*has_underline
, DWRITE_TEXT_RANGE
*range
)
488 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
489 FIXME("(%p)->(%u %p %p): stub\n", This
, position
, has_underline
, range
);
493 static HRESULT WINAPI
dwritetextlayout_GetStrikethrough(IDWriteTextLayout
*iface
,
494 UINT32 position
, BOOL
*has_strikethrough
, DWRITE_TEXT_RANGE
*range
)
496 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
497 FIXME("(%p)->(%u %p %p): stub\n", This
, position
, has_strikethrough
, range
);
501 static HRESULT WINAPI
dwritetextlayout_GetDrawingEffect(IDWriteTextLayout
*iface
,
502 UINT32 position
, IUnknown
**effect
, DWRITE_TEXT_RANGE
*range
)
504 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
505 FIXME("(%p)->(%u %p %p): stub\n", This
, position
, effect
, range
);
509 static HRESULT WINAPI
dwritetextlayout_GetInlineObject(IDWriteTextLayout
*iface
,
510 UINT32 position
, IDWriteInlineObject
**object
, DWRITE_TEXT_RANGE
*range
)
512 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
513 FIXME("(%p)->(%u %p %p): stub\n", This
, position
, object
, range
);
517 static HRESULT WINAPI
dwritetextlayout_GetTypography(IDWriteTextLayout
*iface
,
518 UINT32 position
, IDWriteTypography
** typography
, DWRITE_TEXT_RANGE
*range
)
520 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
521 FIXME("(%p)->(%u %p %p): stub\n", This
, position
, typography
, range
);
525 static HRESULT WINAPI
dwritetextlayout_layout_GetLocaleNameLength(IDWriteTextLayout
*iface
,
526 UINT32 position
, UINT32
* length
, DWRITE_TEXT_RANGE
*range
)
528 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
529 FIXME("(%p)->(%u %p %p): stub\n", This
, position
, length
, range
);
533 static HRESULT WINAPI
dwritetextlayout_layout_GetLocaleName(IDWriteTextLayout
*iface
,
534 UINT32 position
, WCHAR
* name
, UINT32 name_size
, DWRITE_TEXT_RANGE
*range
)
536 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
537 FIXME("(%p)->(%u %p %u %p): stub\n", This
, position
, name
, name_size
, range
);
541 static HRESULT WINAPI
dwritetextlayout_Draw(IDWriteTextLayout
*iface
,
542 void *context
, IDWriteTextRenderer
* renderer
, FLOAT originX
, FLOAT originY
)
544 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
545 FIXME("(%p)->(%p %p %f %f): stub\n", This
, context
, renderer
, originX
, originY
);
549 static HRESULT WINAPI
dwritetextlayout_GetLineMetrics(IDWriteTextLayout
*iface
,
550 DWRITE_LINE_METRICS
*metrics
, UINT32 max_count
, UINT32
*actual_count
)
552 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
553 FIXME("(%p)->(%p %u %p): stub\n", This
, metrics
, max_count
, actual_count
);
557 static HRESULT WINAPI
dwritetextlayout_GetMetrics(IDWriteTextLayout
*iface
, DWRITE_TEXT_METRICS
*metrics
)
559 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
560 FIXME("(%p)->(%p): stub\n", This
, metrics
);
564 static HRESULT WINAPI
dwritetextlayout_GetOverhangMetrics(IDWriteTextLayout
*iface
, DWRITE_OVERHANG_METRICS
*overhangs
)
566 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
567 FIXME("(%p)->(%p): stub\n", This
, overhangs
);
571 static HRESULT WINAPI
dwritetextlayout_GetClusterMetrics(IDWriteTextLayout
*iface
,
572 DWRITE_CLUSTER_METRICS
*metrics
, UINT32 max_count
, UINT32
* act_count
)
574 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
575 FIXME("(%p)->(%p %u %p): stub\n", This
, metrics
, max_count
, act_count
);
579 static HRESULT WINAPI
dwritetextlayout_DetermineMinWidth(IDWriteTextLayout
*iface
, FLOAT
* min_width
)
581 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
582 FIXME("(%p)->(%p): stub\n", This
, min_width
);
586 static HRESULT WINAPI
dwritetextlayout_HitTestPoint(IDWriteTextLayout
*iface
,
587 FLOAT pointX
, FLOAT pointY
, BOOL
* is_trailinghit
, BOOL
* is_inside
, DWRITE_HIT_TEST_METRICS
*metrics
)
589 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
590 FIXME("(%p)->(%f %f %p %p %p): stub\n", This
, pointX
, pointY
, is_trailinghit
, is_inside
, metrics
);
594 static HRESULT WINAPI
dwritetextlayout_HitTestTextPosition(IDWriteTextLayout
*iface
,
595 UINT32 textPosition
, BOOL is_trailinghit
, FLOAT
* pointX
, FLOAT
* pointY
, DWRITE_HIT_TEST_METRICS
*metrics
)
597 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
598 FIXME("(%p)->(%u %d %p %p %p): stub\n", This
, textPosition
, is_trailinghit
, pointX
, pointY
, metrics
);
602 static HRESULT WINAPI
dwritetextlayout_HitTestTextRange(IDWriteTextLayout
*iface
,
603 UINT32 textPosition
, UINT32 textLength
, FLOAT originX
, FLOAT originY
,
604 DWRITE_HIT_TEST_METRICS
*metrics
, UINT32 max_metricscount
, UINT32
* actual_metricscount
)
606 struct dwrite_textlayout
*This
= impl_from_IDWriteTextLayout(iface
);
607 FIXME("(%p)->(%u %u %f %f %p %u %p): stub\n", This
, textPosition
, textLength
, originX
, originY
, metrics
,
608 max_metricscount
, actual_metricscount
);
612 static const IDWriteTextLayoutVtbl dwritetextlayoutvtbl
= {
613 dwritetextlayout_QueryInterface
,
614 dwritetextlayout_AddRef
,
615 dwritetextlayout_Release
,
616 dwritetextlayout_SetTextAlignment
,
617 dwritetextlayout_SetParagraphAlignment
,
618 dwritetextlayout_SetWordWrapping
,
619 dwritetextlayout_SetReadingDirection
,
620 dwritetextlayout_SetFlowDirection
,
621 dwritetextlayout_SetIncrementalTabStop
,
622 dwritetextlayout_SetTrimming
,
623 dwritetextlayout_SetLineSpacing
,
624 dwritetextlayout_GetTextAlignment
,
625 dwritetextlayout_GetParagraphAlignment
,
626 dwritetextlayout_GetWordWrapping
,
627 dwritetextlayout_GetReadingDirection
,
628 dwritetextlayout_GetFlowDirection
,
629 dwritetextlayout_GetIncrementalTabStop
,
630 dwritetextlayout_GetTrimming
,
631 dwritetextlayout_GetLineSpacing
,
632 dwritetextlayout_GetFontCollection
,
633 dwritetextlayout_GetFontFamilyNameLength
,
634 dwritetextlayout_GetFontFamilyName
,
635 dwritetextlayout_GetFontWeight
,
636 dwritetextlayout_GetFontStyle
,
637 dwritetextlayout_GetFontStretch
,
638 dwritetextlayout_GetFontSize
,
639 dwritetextlayout_GetLocaleNameLength
,
640 dwritetextlayout_GetLocaleName
,
641 dwritetextlayout_SetMaxWidth
,
642 dwritetextlayout_SetMaxHeight
,
643 dwritetextlayout_SetFontCollection
,
644 dwritetextlayout_SetFontFamilyName
,
645 dwritetextlayout_SetFontWeight
,
646 dwritetextlayout_SetFontStyle
,
647 dwritetextlayout_SetFontStretch
,
648 dwritetextlayout_SetFontSize
,
649 dwritetextlayout_SetUnderline
,
650 dwritetextlayout_SetStrikethrough
,
651 dwritetextlayout_SetDrawingEffect
,
652 dwritetextlayout_SetInlineObject
,
653 dwritetextlayout_SetTypography
,
654 dwritetextlayout_SetLocaleName
,
655 dwritetextlayout_GetMaxWidth
,
656 dwritetextlayout_GetMaxHeight
,
657 dwritetextlayout_layout_GetFontCollection
,
658 dwritetextlayout_layout_GetFontFamilyNameLength
,
659 dwritetextlayout_layout_GetFontFamilyName
,
660 dwritetextlayout_layout_GetFontWeight
,
661 dwritetextlayout_layout_GetFontStyle
,
662 dwritetextlayout_layout_GetFontStretch
,
663 dwritetextlayout_layout_GetFontSize
,
664 dwritetextlayout_GetUnderline
,
665 dwritetextlayout_GetStrikethrough
,
666 dwritetextlayout_GetDrawingEffect
,
667 dwritetextlayout_GetInlineObject
,
668 dwritetextlayout_GetTypography
,
669 dwritetextlayout_layout_GetLocaleNameLength
,
670 dwritetextlayout_layout_GetLocaleName
,
671 dwritetextlayout_Draw
,
672 dwritetextlayout_GetLineMetrics
,
673 dwritetextlayout_GetMetrics
,
674 dwritetextlayout_GetOverhangMetrics
,
675 dwritetextlayout_GetClusterMetrics
,
676 dwritetextlayout_DetermineMinWidth
,
677 dwritetextlayout_HitTestPoint
,
678 dwritetextlayout_HitTestTextPosition
,
679 dwritetextlayout_HitTestTextRange
682 static void layout_format_from_textformat(struct dwrite_textlayout
*layout
, IDWriteTextFormat
*format
)
684 struct dwrite_textformat
*f
;
686 memset(&layout
->format
, 0, sizeof(layout
->format
));
688 if ((f
= unsafe_impl_from_IDWriteTextFormat(format
)))
690 layout
->format
= f
->format
;
691 layout
->format
.locale
= heap_strdupW(f
->format
.locale
);
692 layout
->format
.family_name
= heap_strdupW(f
->format
.family_name
);
696 UINT32 locale_len
, family_len
;
698 layout
->format
.weight
= IDWriteTextFormat_GetFontWeight(format
);
699 layout
->format
.style
= IDWriteTextFormat_GetFontStyle(format
);
700 layout
->format
.stretch
= IDWriteTextFormat_GetFontStretch(format
);
701 layout
->format
.size
= IDWriteTextFormat_GetFontSize(format
);
703 /* locale name and length */
704 locale_len
= IDWriteTextFormat_GetLocaleNameLength(format
);
705 layout
->format
.locale
= heap_alloc((locale_len
+1)*sizeof(WCHAR
));
706 IDWriteTextFormat_GetLocaleName(format
, layout
->format
.locale
, locale_len
+1);
707 layout
->format
.locale_len
= locale_len
;
709 /* font family name and length */
710 family_len
= IDWriteTextFormat_GetFontFamilyNameLength(format
);
711 layout
->format
.family_name
= heap_alloc((family_len
+1)*sizeof(WCHAR
));
712 IDWriteTextFormat_GetFontFamilyName(format
, layout
->format
.family_name
, family_len
+1);
713 layout
->format
.family_len
= family_len
;
716 IDWriteTextFormat_GetFontCollection(format
, &layout
->format
.collection
);
719 HRESULT
create_textlayout(const WCHAR
*str
, UINT32 len
, IDWriteTextFormat
*format
, IDWriteTextLayout
**layout
)
721 struct dwrite_textlayout
*This
;
725 This
= heap_alloc(sizeof(struct dwrite_textlayout
));
726 if (!This
) return E_OUTOFMEMORY
;
728 This
->IDWriteTextLayout_iface
.lpVtbl
= &dwritetextlayoutvtbl
;
730 This
->str
= heap_strdupnW(str
, len
);
732 layout_format_from_textformat(This
, format
);
734 *layout
= &This
->IDWriteTextLayout_iface
;
739 static HRESULT WINAPI
dwritetextformat_QueryInterface(IDWriteTextFormat
*iface
, REFIID riid
, void **obj
)
741 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
743 TRACE("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), obj
);
745 if (IsEqualIID(riid
, &IID_IUnknown
) ||
746 IsEqualIID(riid
, &IID_IDWriteTextFormat
))
749 IDWriteTextFormat_AddRef(iface
);
755 return E_NOINTERFACE
;
758 static ULONG WINAPI
dwritetextformat_AddRef(IDWriteTextFormat
*iface
)
760 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
761 ULONG ref
= InterlockedIncrement(&This
->ref
);
762 TRACE("(%p)->(%d)\n", This
, ref
);
766 static ULONG WINAPI
dwritetextformat_Release(IDWriteTextFormat
*iface
)
768 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
769 ULONG ref
= InterlockedDecrement(&This
->ref
);
771 TRACE("(%p)->(%d)\n", This
, ref
);
775 release_format_data(&This
->format
);
782 static HRESULT WINAPI
dwritetextformat_SetTextAlignment(IDWriteTextFormat
*iface
, DWRITE_TEXT_ALIGNMENT alignment
)
784 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
785 FIXME("(%p)->(%d): stub\n", This
, alignment
);
789 static HRESULT WINAPI
dwritetextformat_SetParagraphAlignment(IDWriteTextFormat
*iface
, DWRITE_PARAGRAPH_ALIGNMENT alignment
)
791 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
792 FIXME("(%p)->(%d): stub\n", This
, alignment
);
796 static HRESULT WINAPI
dwritetextformat_SetWordWrapping(IDWriteTextFormat
*iface
, DWRITE_WORD_WRAPPING wrapping
)
798 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
799 FIXME("(%p)->(%d): stub\n", This
, wrapping
);
803 static HRESULT WINAPI
dwritetextformat_SetReadingDirection(IDWriteTextFormat
*iface
, DWRITE_READING_DIRECTION direction
)
805 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
806 FIXME("(%p)->(%d): stub\n", This
, direction
);
810 static HRESULT WINAPI
dwritetextformat_SetFlowDirection(IDWriteTextFormat
*iface
, DWRITE_FLOW_DIRECTION direction
)
812 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
813 FIXME("(%p)->(%d): stub\n", This
, direction
);
817 static HRESULT WINAPI
dwritetextformat_SetIncrementalTabStop(IDWriteTextFormat
*iface
, FLOAT tabstop
)
819 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
820 FIXME("(%p)->(%f): stub\n", This
, tabstop
);
824 static HRESULT WINAPI
dwritetextformat_SetTrimming(IDWriteTextFormat
*iface
, DWRITE_TRIMMING
const *trimming
,
825 IDWriteInlineObject
*trimming_sign
)
827 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
828 FIXME("(%p)->(%p %p): stub\n", This
, trimming
, trimming_sign
);
832 static HRESULT WINAPI
dwritetextformat_SetLineSpacing(IDWriteTextFormat
*iface
, DWRITE_LINE_SPACING_METHOD spacing
,
833 FLOAT line_spacing
, FLOAT baseline
)
835 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
836 FIXME("(%p)->(%d %f %f): stub\n", This
, spacing
, line_spacing
, baseline
);
840 static DWRITE_TEXT_ALIGNMENT WINAPI
dwritetextformat_GetTextAlignment(IDWriteTextFormat
*iface
)
842 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
843 FIXME("(%p): stub\n", This
);
844 return DWRITE_TEXT_ALIGNMENT_LEADING
;
847 static DWRITE_PARAGRAPH_ALIGNMENT WINAPI
dwritetextformat_GetParagraphAlignment(IDWriteTextFormat
*iface
)
849 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
850 FIXME("(%p): stub\n", This
);
851 return DWRITE_PARAGRAPH_ALIGNMENT_NEAR
;
854 static DWRITE_WORD_WRAPPING WINAPI
dwritetextformat_GetWordWrapping(IDWriteTextFormat
*iface
)
856 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
857 FIXME("(%p): stub\n", This
);
858 return DWRITE_WORD_WRAPPING_NO_WRAP
;
861 static DWRITE_READING_DIRECTION WINAPI
dwritetextformat_GetReadingDirection(IDWriteTextFormat
*iface
)
863 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
864 FIXME("(%p): stub\n", This
);
865 return DWRITE_READING_DIRECTION_LEFT_TO_RIGHT
;
868 static DWRITE_FLOW_DIRECTION WINAPI
dwritetextformat_GetFlowDirection(IDWriteTextFormat
*iface
)
870 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
871 FIXME("(%p): stub\n", This
);
872 return DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM
;
875 static FLOAT WINAPI
dwritetextformat_GetIncrementalTabStop(IDWriteTextFormat
*iface
)
877 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
878 FIXME("(%p): stub\n", This
);
882 static HRESULT WINAPI
dwritetextformat_GetTrimming(IDWriteTextFormat
*iface
, DWRITE_TRIMMING
*options
,
883 IDWriteInlineObject
**trimming_sign
)
885 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
886 FIXME("(%p)->(%p %p): stub\n", This
, options
, trimming_sign
);
890 static HRESULT WINAPI
dwritetextformat_GetLineSpacing(IDWriteTextFormat
*iface
, DWRITE_LINE_SPACING_METHOD
*method
,
891 FLOAT
*spacing
, FLOAT
*baseline
)
893 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
894 FIXME("(%p)->(%p %p %p): stub\n", This
, method
, spacing
, baseline
);
898 static HRESULT WINAPI
dwritetextformat_GetFontCollection(IDWriteTextFormat
*iface
, IDWriteFontCollection
**collection
)
900 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
902 TRACE("(%p)->(%p)\n", This
, collection
);
904 *collection
= This
->format
.collection
;
905 IDWriteFontCollection_AddRef(*collection
);
910 static UINT32 WINAPI
dwritetextformat_GetFontFamilyNameLength(IDWriteTextFormat
*iface
)
912 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
913 TRACE("(%p)\n", This
);
914 return This
->format
.family_len
;
917 static HRESULT WINAPI
dwritetextformat_GetFontFamilyName(IDWriteTextFormat
*iface
, WCHAR
*name
, UINT32 size
)
919 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
921 TRACE("(%p)->(%p %u)\n", This
, name
, size
);
923 if (size
<= This
->format
.family_len
) return E_NOT_SUFFICIENT_BUFFER
;
924 strcpyW(name
, This
->format
.family_name
);
928 static DWRITE_FONT_WEIGHT WINAPI
dwritetextformat_GetFontWeight(IDWriteTextFormat
*iface
)
930 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
931 TRACE("(%p)\n", This
);
932 return This
->format
.weight
;
935 static DWRITE_FONT_STYLE WINAPI
dwritetextformat_GetFontStyle(IDWriteTextFormat
*iface
)
937 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
938 TRACE("(%p)\n", This
);
939 return This
->format
.style
;
942 static DWRITE_FONT_STRETCH WINAPI
dwritetextformat_GetFontStretch(IDWriteTextFormat
*iface
)
944 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
945 TRACE("(%p)\n", This
);
946 return This
->format
.stretch
;
949 static FLOAT WINAPI
dwritetextformat_GetFontSize(IDWriteTextFormat
*iface
)
951 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
952 TRACE("(%p)\n", This
);
953 return This
->format
.size
;
956 static UINT32 WINAPI
dwritetextformat_GetLocaleNameLength(IDWriteTextFormat
*iface
)
958 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
959 TRACE("(%p)\n", This
);
960 return This
->format
.locale_len
;
963 static HRESULT WINAPI
dwritetextformat_GetLocaleName(IDWriteTextFormat
*iface
, WCHAR
*name
, UINT32 size
)
965 struct dwrite_textformat
*This
= impl_from_IDWriteTextFormat(iface
);
967 TRACE("(%p)->(%p %u)\n", This
, name
, size
);
969 if (size
<= This
->format
.locale_len
) return E_NOT_SUFFICIENT_BUFFER
;
970 strcpyW(name
, This
->format
.locale
);
974 static const IDWriteTextFormatVtbl dwritetextformatvtbl
= {
975 dwritetextformat_QueryInterface
,
976 dwritetextformat_AddRef
,
977 dwritetextformat_Release
,
978 dwritetextformat_SetTextAlignment
,
979 dwritetextformat_SetParagraphAlignment
,
980 dwritetextformat_SetWordWrapping
,
981 dwritetextformat_SetReadingDirection
,
982 dwritetextformat_SetFlowDirection
,
983 dwritetextformat_SetIncrementalTabStop
,
984 dwritetextformat_SetTrimming
,
985 dwritetextformat_SetLineSpacing
,
986 dwritetextformat_GetTextAlignment
,
987 dwritetextformat_GetParagraphAlignment
,
988 dwritetextformat_GetWordWrapping
,
989 dwritetextformat_GetReadingDirection
,
990 dwritetextformat_GetFlowDirection
,
991 dwritetextformat_GetIncrementalTabStop
,
992 dwritetextformat_GetTrimming
,
993 dwritetextformat_GetLineSpacing
,
994 dwritetextformat_GetFontCollection
,
995 dwritetextformat_GetFontFamilyNameLength
,
996 dwritetextformat_GetFontFamilyName
,
997 dwritetextformat_GetFontWeight
,
998 dwritetextformat_GetFontStyle
,
999 dwritetextformat_GetFontStretch
,
1000 dwritetextformat_GetFontSize
,
1001 dwritetextformat_GetLocaleNameLength
,
1002 dwritetextformat_GetLocaleName
1005 HRESULT
create_textformat(const WCHAR
*family_name
, IDWriteFontCollection
*collection
, DWRITE_FONT_WEIGHT weight
, DWRITE_FONT_STYLE style
,
1006 DWRITE_FONT_STRETCH stretch
, FLOAT size
, const WCHAR
*locale
, IDWriteTextFormat
**format
)
1008 struct dwrite_textformat
*This
;
1012 This
= heap_alloc(sizeof(struct dwrite_textformat
));
1013 if (!This
) return E_OUTOFMEMORY
;
1015 This
->IDWriteTextFormat_iface
.lpVtbl
= &dwritetextformatvtbl
;
1017 This
->format
.family_name
= heap_strdupW(family_name
);
1018 This
->format
.family_len
= strlenW(family_name
);
1019 This
->format
.locale
= heap_strdupW(locale
);
1020 This
->format
.locale_len
= strlenW(locale
);
1021 This
->format
.weight
= weight
;
1022 This
->format
.style
= style
;
1023 This
->format
.size
= size
;
1024 This
->format
.stretch
= stretch
;
1028 This
->format
.collection
= collection
;
1029 IDWriteFontCollection_AddRef(collection
);
1033 HRESULT hr
= get_system_fontcollection(&This
->format
.collection
);
1036 IDWriteTextFormat_Release(&This
->IDWriteTextFormat_iface
);
1041 *format
= &This
->IDWriteTextFormat_iface
;