dwrite: Consistently use common point and rect types.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d5bc3c7bce
commit
672ca3d3b8
|
@ -182,8 +182,7 @@ struct layout_effective_run {
|
||||||
UINT32 length; /* length in codepoints that this run covers */
|
UINT32 length; /* length in codepoints that this run covers */
|
||||||
UINT32 glyphcount; /* total glyph count in this run */
|
UINT32 glyphcount; /* total glyph count in this run */
|
||||||
IUnknown *effect; /* original reference is kept only at range level */
|
IUnknown *effect; /* original reference is kept only at range level */
|
||||||
FLOAT origin_x; /* baseline X position */
|
D2D1_POINT_2F origin; /* baseline origin */
|
||||||
FLOAT origin_y; /* baseline Y position */
|
|
||||||
FLOAT align_dx; /* adjustment from text alignment */
|
FLOAT align_dx; /* adjustment from text alignment */
|
||||||
FLOAT width; /* run width */
|
FLOAT width; /* run width */
|
||||||
UINT16 *clustermap; /* effective clustermap, allocated separately, is not reused from nominal map */
|
UINT16 *clustermap; /* effective clustermap, allocated separately, is not reused from nominal map */
|
||||||
|
@ -196,8 +195,7 @@ struct layout_effective_inline {
|
||||||
IDWriteInlineObject *object; /* inline object, set explicitly or added when trimming a line */
|
IDWriteInlineObject *object; /* inline object, set explicitly or added when trimming a line */
|
||||||
IUnknown *effect; /* original reference is kept only at range level */
|
IUnknown *effect; /* original reference is kept only at range level */
|
||||||
FLOAT baseline;
|
FLOAT baseline;
|
||||||
FLOAT origin_x; /* left X position */
|
D2D1_POINT_2F origin; /* left top corner */
|
||||||
FLOAT origin_y; /* left top corner Y position */
|
|
||||||
FLOAT align_dx; /* adjustment from text alignment */
|
FLOAT align_dx; /* adjustment from text alignment */
|
||||||
FLOAT width; /* object width as it's reported it */
|
FLOAT width; /* object width as it's reported it */
|
||||||
BOOL is_sideways; /* vertical flow direction flag passed to Draw */
|
BOOL is_sideways; /* vertical flow direction flag passed to Draw */
|
||||||
|
@ -306,11 +304,6 @@ struct dwrite_typography {
|
||||||
UINT32 count;
|
UINT32 count;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct dwrite_vec {
|
|
||||||
FLOAT x;
|
|
||||||
FLOAT y;
|
|
||||||
};
|
|
||||||
|
|
||||||
static const IDWriteTextFormat2Vtbl dwritetextformatvtbl;
|
static const IDWriteTextFormat2Vtbl dwritetextformatvtbl;
|
||||||
|
|
||||||
static void release_format_data(struct dwrite_textformat_data *data)
|
static void release_format_data(struct dwrite_textformat_data *data)
|
||||||
|
@ -1217,8 +1210,8 @@ static HRESULT layout_add_effective_run(struct dwrite_textlayout *layout, const
|
||||||
|
|
||||||
inlineobject->object = r->u.object.object;
|
inlineobject->object = r->u.object.object;
|
||||||
inlineobject->width = get_cluster_range_width(layout, first_cluster, first_cluster + cluster_count);
|
inlineobject->width = get_cluster_range_width(layout, first_cluster, first_cluster + cluster_count);
|
||||||
inlineobject->origin_x = is_rtl ? origin_x - inlineobject->width : origin_x;
|
inlineobject->origin.x = is_rtl ? origin_x - inlineobject->width : origin_x;
|
||||||
inlineobject->origin_y = 0.0f; /* set after line is built */
|
inlineobject->origin.y = 0.0f; /* set after line is built */
|
||||||
inlineobject->align_dx = 0.0f;
|
inlineobject->align_dx = 0.0f;
|
||||||
inlineobject->baseline = r->baseline;
|
inlineobject->baseline = r->baseline;
|
||||||
|
|
||||||
|
@ -1260,11 +1253,11 @@ static HRESULT layout_add_effective_run(struct dwrite_textlayout *layout, const
|
||||||
/* Check if run direction matches paragraph direction, if it doesn't adjust by
|
/* Check if run direction matches paragraph direction, if it doesn't adjust by
|
||||||
run width */
|
run width */
|
||||||
if (layout_is_erun_rtl(run) ^ is_rtl)
|
if (layout_is_erun_rtl(run) ^ is_rtl)
|
||||||
run->origin_x = is_rtl ? origin_x - run->width : origin_x + run->width;
|
run->origin.x = is_rtl ? origin_x - run->width : origin_x + run->width;
|
||||||
else
|
else
|
||||||
run->origin_x = origin_x;
|
run->origin.x = origin_x;
|
||||||
|
|
||||||
run->origin_y = 0.0f; /* set after line is built */
|
run->origin.y = 0.0f; /* set after line is built */
|
||||||
run->align_dx = 0.0f;
|
run->align_dx = 0.0f;
|
||||||
run->line = line;
|
run->line = line;
|
||||||
|
|
||||||
|
@ -1443,28 +1436,28 @@ static inline BOOL should_skip_transform(const DWRITE_MATRIX *m, FLOAT *det)
|
||||||
return (!memcmp(m, &identity, sizeof(*m)) || fabsf(*det) <= 1e-10f);
|
return (!memcmp(m, &identity, sizeof(*m)) || fabsf(*det) <= 1e-10f);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void layout_apply_snapping(struct dwrite_vec *vec, BOOL skiptransform, FLOAT ppdip,
|
static inline void layout_apply_snapping(D2D1_POINT_2F *vec, BOOL skiptransform, FLOAT ppdip,
|
||||||
const DWRITE_MATRIX *m, FLOAT det)
|
const DWRITE_MATRIX *m, FLOAT det)
|
||||||
{
|
{
|
||||||
if (!skiptransform) {
|
if (!skiptransform) {
|
||||||
FLOAT vec2[2];
|
D2D1_POINT_2F vec2;
|
||||||
|
|
||||||
/* apply transform */
|
/* apply transform */
|
||||||
vec->x *= ppdip;
|
vec->x *= ppdip;
|
||||||
vec->y *= ppdip;
|
vec->y *= ppdip;
|
||||||
|
|
||||||
vec2[0] = m->m11 * vec->x + m->m21 * vec->y + m->dx;
|
vec2.x = m->m11 * vec->x + m->m21 * vec->y + m->dx;
|
||||||
vec2[1] = m->m12 * vec->x + m->m22 * vec->y + m->dy;
|
vec2.y = m->m12 * vec->x + m->m22 * vec->y + m->dy;
|
||||||
|
|
||||||
/* snap */
|
/* snap */
|
||||||
vec2[0] = floorf(vec2[0] + 0.5f);
|
vec2.x = floorf(vec2.x + 0.5f);
|
||||||
vec2[1] = floorf(vec2[1] + 0.5f);
|
vec2.y = floorf(vec2.y + 0.5f);
|
||||||
|
|
||||||
/* apply inverted transform, we don't care about X component at this point */
|
/* apply inverted transform, we don't care about X component at this point */
|
||||||
vec->x = (m->m22 * vec2[0] - m->m21 * vec2[1] + m->m21 * m->dy - m->m22 * m->dx) / det;
|
vec->x = (m->m22 * vec2.x - m->m21 * vec2.y + m->m21 * m->dy - m->m22 * m->dx) / det;
|
||||||
vec->x /= ppdip;
|
vec->x /= ppdip;
|
||||||
|
|
||||||
vec->y = (-m->m12 * vec2[0] + m->m11 * vec2[1] - (m->m11 * m->dy - m->m12 * m->dx)) / det;
|
vec->y = (-m->m12 * vec2.x + m->m11 * vec2.y - (m->m11 * m->dy - m->m12 * m->dx)) / det;
|
||||||
vec->y /= ppdip;
|
vec->y /= ppdip;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1530,7 +1523,7 @@ static inline FLOAT layout_get_centered_shift(struct dwrite_textlayout *layout,
|
||||||
FLOAT width, FLOAT det)
|
FLOAT width, FLOAT det)
|
||||||
{
|
{
|
||||||
if (is_layout_gdi_compatible(layout)) {
|
if (is_layout_gdi_compatible(layout)) {
|
||||||
struct dwrite_vec vec = { layout->metrics.layoutWidth - width, 0.0f};
|
D2D1_POINT_2F vec = { layout->metrics.layoutWidth - width, 0.0f};
|
||||||
layout_apply_snapping(&vec, skiptransform, layout->ppdip, &layout->transform, det);
|
layout_apply_snapping(&vec, skiptransform, layout->ppdip, &layout->transform, det);
|
||||||
return floorf(vec.x / 2.0f);
|
return floorf(vec.x / 2.0f);
|
||||||
}
|
}
|
||||||
|
@ -1627,12 +1620,12 @@ static void layout_apply_par_alignment(struct dwrite_textlayout *layout)
|
||||||
FLOAT pos_y = origin_y + layout->linemetrics[line].baseline;
|
FLOAT pos_y = origin_y + layout->linemetrics[line].baseline;
|
||||||
|
|
||||||
while (erun && erun->line == line) {
|
while (erun && erun->line == line) {
|
||||||
erun->origin_y = pos_y;
|
erun->origin.y = pos_y;
|
||||||
erun = layout_get_next_erun(layout, erun);
|
erun = layout_get_next_erun(layout, erun);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (inrun && inrun->line == line) {
|
while (inrun && inrun->line == line) {
|
||||||
inrun->origin_y = pos_y - inrun->baseline;
|
inrun->origin.y = pos_y - inrun->baseline;
|
||||||
inrun = layout_get_next_inline_run(layout, inrun);
|
inrun = layout_get_next_inline_run(layout, inrun);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1878,8 +1871,8 @@ static void layout_add_line(struct dwrite_textlayout *layout, UINT32 first_clust
|
||||||
trimming_sign->object = layout->format.trimmingsign;
|
trimming_sign->object = layout->format.trimmingsign;
|
||||||
trimming_sign->width = sign_metrics.width;
|
trimming_sign->width = sign_metrics.width;
|
||||||
origin_x += is_rtl ? -get_cluster_range_width(layout, start, i) : get_cluster_range_width(layout, start, i);
|
origin_x += is_rtl ? -get_cluster_range_width(layout, start, i) : get_cluster_range_width(layout, start, i);
|
||||||
trimming_sign->origin_x = is_rtl ? origin_x - trimming_sign->width : origin_x;
|
trimming_sign->origin.x = is_rtl ? origin_x - trimming_sign->width : origin_x;
|
||||||
trimming_sign->origin_y = 0.0f; /* set after line is built */
|
trimming_sign->origin.y = 0.0f; /* set after line is built */
|
||||||
trimming_sign->align_dx = 0.0f;
|
trimming_sign->align_dx = 0.0f;
|
||||||
trimming_sign->baseline = sign_metrics.baseline;
|
trimming_sign->baseline = sign_metrics.baseline;
|
||||||
|
|
||||||
|
@ -1930,13 +1923,13 @@ static void layout_set_line_positions(struct dwrite_textlayout *layout)
|
||||||
|
|
||||||
/* For all runs on this line */
|
/* For all runs on this line */
|
||||||
while (erun && erun->line == line) {
|
while (erun && erun->line == line) {
|
||||||
erun->origin_y = pos_y;
|
erun->origin.y = pos_y;
|
||||||
erun = layout_get_next_erun(layout, erun);
|
erun = layout_get_next_erun(layout, erun);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Same for inline runs */
|
/* Same for inline runs */
|
||||||
while (inrun && inrun->line == line) {
|
while (inrun && inrun->line == line) {
|
||||||
inrun->origin_y = pos_y - inrun->baseline;
|
inrun->origin.y = pos_y - inrun->baseline;
|
||||||
inrun = layout_get_next_inline_run(layout, inrun);
|
inrun = layout_get_next_inline_run(layout, inrun);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3360,28 +3353,28 @@ static HRESULT WINAPI dwritetextlayout_layout_GetLocaleName(IDWriteTextLayout3 *
|
||||||
static inline FLOAT renderer_apply_snapping(FLOAT coord, BOOL skiptransform, FLOAT ppdip, FLOAT det,
|
static inline FLOAT renderer_apply_snapping(FLOAT coord, BOOL skiptransform, FLOAT ppdip, FLOAT det,
|
||||||
const DWRITE_MATRIX *m)
|
const DWRITE_MATRIX *m)
|
||||||
{
|
{
|
||||||
FLOAT vec[2], vec2[2];
|
D2D1_POINT_2F vec, vec2;
|
||||||
|
|
||||||
if (!skiptransform) {
|
if (!skiptransform) {
|
||||||
/* apply transform */
|
/* apply transform */
|
||||||
vec[0] = 0.0f;
|
vec.x = 0.0f;
|
||||||
vec[1] = coord * ppdip;
|
vec.y = coord * ppdip;
|
||||||
|
|
||||||
vec2[0] = m->m11 * vec[0] + m->m21 * vec[1] + m->dx;
|
vec2.x = m->m11 * vec.x + m->m21 * vec.y + m->dx;
|
||||||
vec2[1] = m->m12 * vec[0] + m->m22 * vec[1] + m->dy;
|
vec2.y = m->m12 * vec.x + m->m22 * vec.y + m->dy;
|
||||||
|
|
||||||
/* snap */
|
/* snap */
|
||||||
vec2[0] = floorf(vec2[0] + 0.5f);
|
vec2.x = floorf(vec2.x + 0.5f);
|
||||||
vec2[1] = floorf(vec2[1] + 0.5f);
|
vec2.y = floorf(vec2.y + 0.5f);
|
||||||
|
|
||||||
/* apply inverted transform, we don't care about X component at this point */
|
/* apply inverted transform, we don't care about X component at this point */
|
||||||
vec[1] = (-m->m12 * vec2[0] + m->m11 * vec2[1] - (m->m11 * m->dy - m->m12 * m->dx)) / det;
|
vec.y = (-m->m12 * vec2.x + m->m11 * vec2.y - (m->m11 * m->dy - m->m12 * m->dx)) / det;
|
||||||
vec[1] /= ppdip;
|
vec.y /= ppdip;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
vec[1] = floorf(coord * ppdip + 0.5f) / ppdip;
|
vec.y = floorf(coord * ppdip + 0.5f) / ppdip;
|
||||||
|
|
||||||
return vec[1];
|
return vec.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI dwritetextlayout_Draw(IDWriteTextLayout3 *iface,
|
static HRESULT WINAPI dwritetextlayout_Draw(IDWriteTextLayout3 *iface,
|
||||||
|
@ -3454,8 +3447,8 @@ static HRESULT WINAPI dwritetextlayout_Draw(IDWriteTextLayout3 *iface,
|
||||||
/* return value is ignored */
|
/* return value is ignored */
|
||||||
IDWriteTextRenderer_DrawGlyphRun(renderer,
|
IDWriteTextRenderer_DrawGlyphRun(renderer,
|
||||||
context,
|
context,
|
||||||
run->origin_x + run->align_dx + origin_x,
|
run->origin.x + run->align_dx + origin_x,
|
||||||
SNAP_COORD(run->origin_y + origin_y),
|
SNAP_COORD(run->origin.y + origin_y),
|
||||||
This->measuringmode,
|
This->measuringmode,
|
||||||
&glyph_run,
|
&glyph_run,
|
||||||
&descr,
|
&descr,
|
||||||
|
@ -3466,8 +3459,8 @@ static HRESULT WINAPI dwritetextlayout_Draw(IDWriteTextLayout3 *iface,
|
||||||
LIST_FOR_EACH_ENTRY(inlineobject, &This->inlineobjects, struct layout_effective_inline, entry) {
|
LIST_FOR_EACH_ENTRY(inlineobject, &This->inlineobjects, struct layout_effective_inline, entry) {
|
||||||
IDWriteTextRenderer_DrawInlineObject(renderer,
|
IDWriteTextRenderer_DrawInlineObject(renderer,
|
||||||
context,
|
context,
|
||||||
inlineobject->origin_x + inlineobject->align_dx + origin_x,
|
inlineobject->origin.x + inlineobject->align_dx + origin_x,
|
||||||
SNAP_COORD(inlineobject->origin_y + origin_y),
|
SNAP_COORD(inlineobject->origin.y + origin_y),
|
||||||
inlineobject->object,
|
inlineobject->object,
|
||||||
inlineobject->is_sideways,
|
inlineobject->is_sideways,
|
||||||
inlineobject->is_rtl,
|
inlineobject->is_rtl,
|
||||||
|
@ -3479,8 +3472,8 @@ static HRESULT WINAPI dwritetextlayout_Draw(IDWriteTextLayout3 *iface,
|
||||||
IDWriteTextRenderer_DrawUnderline(renderer,
|
IDWriteTextRenderer_DrawUnderline(renderer,
|
||||||
context,
|
context,
|
||||||
/* horizontal underline always grows from left to right, width is always added to origin regardless of run direction */
|
/* horizontal underline always grows from left to right, width is always added to origin regardless of run direction */
|
||||||
(is_run_rtl(u->run) ? u->run->origin_x - u->run->width : u->run->origin_x) + u->run->align_dx + origin_x,
|
(is_run_rtl(u->run) ? u->run->origin.x - u->run->width : u->run->origin.x) + u->run->align_dx + origin_x,
|
||||||
SNAP_COORD(u->run->origin_y + origin_y),
|
SNAP_COORD(u->run->origin.y + origin_y),
|
||||||
&u->u,
|
&u->u,
|
||||||
u->run->effect);
|
u->run->effect);
|
||||||
}
|
}
|
||||||
|
@ -3489,8 +3482,8 @@ static HRESULT WINAPI dwritetextlayout_Draw(IDWriteTextLayout3 *iface,
|
||||||
LIST_FOR_EACH_ENTRY(s, &This->strikethrough, struct layout_strikethrough, entry) {
|
LIST_FOR_EACH_ENTRY(s, &This->strikethrough, struct layout_strikethrough, entry) {
|
||||||
IDWriteTextRenderer_DrawStrikethrough(renderer,
|
IDWriteTextRenderer_DrawStrikethrough(renderer,
|
||||||
context,
|
context,
|
||||||
s->run->origin_x + s->run->align_dx + origin_x,
|
s->run->origin.x + s->run->align_dx + origin_x,
|
||||||
SNAP_COORD(s->run->origin_y + origin_y),
|
SNAP_COORD(s->run->origin.y + origin_y),
|
||||||
&s->s,
|
&s->s,
|
||||||
s->run->effect);
|
s->run->effect);
|
||||||
}
|
}
|
||||||
|
@ -3536,7 +3529,7 @@ static HRESULT WINAPI dwritetextlayout_GetMetrics(IDWriteTextLayout3 *iface, DWR
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scale_glyph_bbox(RECT *bbox, FLOAT emSize, UINT16 units_per_em, D2D_RECT_F *ret)
|
static void scale_glyph_bbox(RECT *bbox, FLOAT emSize, UINT16 units_per_em, D2D1_RECT_F *ret)
|
||||||
{
|
{
|
||||||
#define SCALE(x) ((FLOAT)x * emSize / (FLOAT)units_per_em)
|
#define SCALE(x) ((FLOAT)x * emSize / (FLOAT)units_per_em)
|
||||||
ret->left = SCALE(bbox->left);
|
ret->left = SCALE(bbox->left);
|
||||||
|
@ -3546,7 +3539,7 @@ static void scale_glyph_bbox(RECT *bbox, FLOAT emSize, UINT16 units_per_em, D2D_
|
||||||
#undef SCALE
|
#undef SCALE
|
||||||
}
|
}
|
||||||
|
|
||||||
static void d2d_rect_offset(D2D_RECT_F *rect, FLOAT x, FLOAT y)
|
static void d2d_rect_offset(D2D1_RECT_F *rect, FLOAT x, FLOAT y)
|
||||||
{
|
{
|
||||||
rect->left += x;
|
rect->left += x;
|
||||||
rect->right += x;
|
rect->right += x;
|
||||||
|
@ -3554,12 +3547,12 @@ static void d2d_rect_offset(D2D_RECT_F *rect, FLOAT x, FLOAT y)
|
||||||
rect->bottom += y;
|
rect->bottom += y;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL d2d_rect_is_empty(const D2D_RECT_F *rect)
|
static BOOL d2d_rect_is_empty(const D2D1_RECT_F *rect)
|
||||||
{
|
{
|
||||||
return ((rect->left >= rect->right) || (rect->top >= rect->bottom));
|
return ((rect->left >= rect->right) || (rect->top >= rect->bottom));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void d2d_rect_union(D2D_RECT_F *dst, const D2D_RECT_F *src)
|
static void d2d_rect_union(D2D1_RECT_F *dst, const D2D1_RECT_F *src)
|
||||||
{
|
{
|
||||||
if (d2d_rect_is_empty(dst)) {
|
if (d2d_rect_is_empty(dst)) {
|
||||||
if (d2d_rect_is_empty(src)) {
|
if (d2d_rect_is_empty(src)) {
|
||||||
|
@ -3579,21 +3572,21 @@ static void d2d_rect_union(D2D_RECT_F *dst, const D2D_RECT_F *src)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void layout_get_erun_bbox(struct dwrite_textlayout *layout, struct layout_effective_run *run, D2D_RECT_F *bbox)
|
static void layout_get_erun_bbox(struct dwrite_textlayout *layout, struct layout_effective_run *run, D2D1_RECT_F *bbox)
|
||||||
{
|
{
|
||||||
const struct regular_layout_run *regular = &run->run->u.regular;
|
const struct regular_layout_run *regular = &run->run->u.regular;
|
||||||
UINT32 start_glyph = regular->clustermap[run->start];
|
UINT32 start_glyph = regular->clustermap[run->start];
|
||||||
const DWRITE_GLYPH_RUN *glyph_run = ®ular->run;
|
const DWRITE_GLYPH_RUN *glyph_run = ®ular->run;
|
||||||
DWRITE_FONT_METRICS font_metrics;
|
DWRITE_FONT_METRICS font_metrics;
|
||||||
D2D_POINT_2F origin = { 0 };
|
D2D1_POINT_2F origin = { 0 };
|
||||||
UINT32 i;
|
UINT32 i;
|
||||||
|
|
||||||
IDWriteFontFace_GetMetrics(glyph_run->fontFace, &font_metrics);
|
IDWriteFontFace_GetMetrics(glyph_run->fontFace, &font_metrics);
|
||||||
|
|
||||||
origin.x = run->origin_x + run->align_dx;
|
origin.x = run->origin.x + run->align_dx;
|
||||||
origin.y = run->origin_y;
|
origin.y = run->origin.y;
|
||||||
for (i = 0; i < run->glyphcount; i++) {
|
for (i = 0; i < run->glyphcount; i++) {
|
||||||
D2D_RECT_F glyph_bbox;
|
D2D1_RECT_F glyph_bbox;
|
||||||
RECT design_bbox;
|
RECT design_bbox;
|
||||||
|
|
||||||
freetype_get_design_glyph_bbox((IDWriteFontFace4 *)glyph_run->fontFace, font_metrics.designUnitsPerEm,
|
freetype_get_design_glyph_bbox((IDWriteFontFace4 *)glyph_run->fontFace, font_metrics.designUnitsPerEm,
|
||||||
|
@ -3614,7 +3607,7 @@ static HRESULT WINAPI dwritetextlayout_GetOverhangMetrics(IDWriteTextLayout3 *if
|
||||||
{
|
{
|
||||||
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout3(iface);
|
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout3(iface);
|
||||||
struct layout_effective_run *run;
|
struct layout_effective_run *run;
|
||||||
D2D_RECT_F bbox = { 0 };
|
D2D1_RECT_F bbox = { 0 };
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("(%p)->(%p)\n", This, overhangs);
|
TRACE("(%p)->(%p)\n", This, overhangs);
|
||||||
|
@ -3631,7 +3624,7 @@ static HRESULT WINAPI dwritetextlayout_GetOverhangMetrics(IDWriteTextLayout3 *if
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(run, &This->eruns, struct layout_effective_run, entry) {
|
LIST_FOR_EACH_ENTRY(run, &This->eruns, struct layout_effective_run, entry) {
|
||||||
D2D_RECT_F run_bbox;
|
D2D1_RECT_F run_bbox;
|
||||||
|
|
||||||
layout_get_erun_bbox(This, run, &run_bbox);
|
layout_get_erun_bbox(This, run, &run_bbox);
|
||||||
d2d_rect_union(&bbox, &run_bbox);
|
d2d_rect_union(&bbox, &run_bbox);
|
||||||
|
|
Loading…
Reference in New Issue