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:
Nikolay Sivov 2017-04-19 15:15:24 +03:00 committed by Alexandre Julliard
parent d5bc3c7bce
commit 672ca3d3b8
1 changed files with 52 additions and 59 deletions

View File

@ -182,8 +182,7 @@ struct layout_effective_run {
UINT32 length; /* length in codepoints that this run covers */
UINT32 glyphcount; /* total glyph count in this run */
IUnknown *effect; /* original reference is kept only at range level */
FLOAT origin_x; /* baseline X position */
FLOAT origin_y; /* baseline Y position */
D2D1_POINT_2F origin; /* baseline origin */
FLOAT align_dx; /* adjustment from text alignment */
FLOAT width; /* run width */
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 */
IUnknown *effect; /* original reference is kept only at range level */
FLOAT baseline;
FLOAT origin_x; /* left X position */
FLOAT origin_y; /* left top corner Y position */
D2D1_POINT_2F origin; /* left top corner */
FLOAT align_dx; /* adjustment from text alignment */
FLOAT width; /* object width as it's reported it */
BOOL is_sideways; /* vertical flow direction flag passed to Draw */
@ -306,11 +304,6 @@ struct dwrite_typography {
UINT32 count;
};
struct dwrite_vec {
FLOAT x;
FLOAT y;
};
static const IDWriteTextFormat2Vtbl dwritetextformatvtbl;
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->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_y = 0.0f; /* set after line is built */
inlineobject->origin.x = is_rtl ? origin_x - inlineobject->width : origin_x;
inlineobject->origin.y = 0.0f; /* set after line is built */
inlineobject->align_dx = 0.0f;
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
run width */
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
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->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);
}
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)
{
if (!skiptransform) {
FLOAT vec2[2];
D2D1_POINT_2F vec2;
/* apply transform */
vec->x *= ppdip;
vec->y *= ppdip;
vec2[0] = m->m11 * vec->x + m->m21 * vec->y + m->dx;
vec2[1] = m->m12 * vec->x + m->m22 * vec->y + m->dy;
vec2.x = m->m11 * vec->x + m->m21 * vec->y + m->dx;
vec2.y = m->m12 * vec->x + m->m22 * vec->y + m->dy;
/* snap */
vec2[0] = floorf(vec2[0] + 0.5f);
vec2[1] = floorf(vec2[1] + 0.5f);
vec2.x = floorf(vec2.x + 0.5f);
vec2.y = floorf(vec2.y + 0.5f);
/* 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->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;
}
else {
@ -1530,7 +1523,7 @@ static inline FLOAT layout_get_centered_shift(struct dwrite_textlayout *layout,
FLOAT width, FLOAT det)
{
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);
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;
while (erun && erun->line == line) {
erun->origin_y = pos_y;
erun->origin.y = pos_y;
erun = layout_get_next_erun(layout, erun);
}
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);
}
@ -1878,8 +1871,8 @@ static void layout_add_line(struct dwrite_textlayout *layout, UINT32 first_clust
trimming_sign->object = layout->format.trimmingsign;
trimming_sign->width = sign_metrics.width;
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_y = 0.0f; /* set after line is built */
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->align_dx = 0.0f;
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 */
while (erun && erun->line == line) {
erun->origin_y = pos_y;
erun->origin.y = pos_y;
erun = layout_get_next_erun(layout, erun);
}
/* Same for inline runs */
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);
}
@ -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,
const DWRITE_MATRIX *m)
{
FLOAT vec[2], vec2[2];
D2D1_POINT_2F vec, vec2;
if (!skiptransform) {
/* apply transform */
vec[0] = 0.0f;
vec[1] = coord * ppdip;
vec.x = 0.0f;
vec.y = coord * ppdip;
vec2[0] = m->m11 * vec[0] + m->m21 * vec[1] + m->dx;
vec2[1] = m->m12 * vec[0] + m->m22 * vec[1] + m->dy;
vec2.x = m->m11 * vec.x + m->m21 * vec.y + m->dx;
vec2.y = m->m12 * vec.x + m->m22 * vec.y + m->dy;
/* snap */
vec2[0] = floorf(vec2[0] + 0.5f);
vec2[1] = floorf(vec2[1] + 0.5f);
vec2.x = floorf(vec2.x + 0.5f);
vec2.y = floorf(vec2.y + 0.5f);
/* 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[1] /= ppdip;
vec.y = (-m->m12 * vec2.x + m->m11 * vec2.y - (m->m11 * m->dy - m->m12 * m->dx)) / det;
vec.y /= ppdip;
}
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,
@ -3454,8 +3447,8 @@ static HRESULT WINAPI dwritetextlayout_Draw(IDWriteTextLayout3 *iface,
/* return value is ignored */
IDWriteTextRenderer_DrawGlyphRun(renderer,
context,
run->origin_x + run->align_dx + origin_x,
SNAP_COORD(run->origin_y + origin_y),
run->origin.x + run->align_dx + origin_x,
SNAP_COORD(run->origin.y + origin_y),
This->measuringmode,
&glyph_run,
&descr,
@ -3466,8 +3459,8 @@ static HRESULT WINAPI dwritetextlayout_Draw(IDWriteTextLayout3 *iface,
LIST_FOR_EACH_ENTRY(inlineobject, &This->inlineobjects, struct layout_effective_inline, entry) {
IDWriteTextRenderer_DrawInlineObject(renderer,
context,
inlineobject->origin_x + inlineobject->align_dx + origin_x,
SNAP_COORD(inlineobject->origin_y + origin_y),
inlineobject->origin.x + inlineobject->align_dx + origin_x,
SNAP_COORD(inlineobject->origin.y + origin_y),
inlineobject->object,
inlineobject->is_sideways,
inlineobject->is_rtl,
@ -3479,8 +3472,8 @@ static HRESULT WINAPI dwritetextlayout_Draw(IDWriteTextLayout3 *iface,
IDWriteTextRenderer_DrawUnderline(renderer,
context,
/* 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,
SNAP_COORD(u->run->origin_y + origin_y),
(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),
&u->u,
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) {
IDWriteTextRenderer_DrawStrikethrough(renderer,
context,
s->run->origin_x + s->run->align_dx + origin_x,
SNAP_COORD(s->run->origin_y + origin_y),
s->run->origin.x + s->run->align_dx + origin_x,
SNAP_COORD(s->run->origin.y + origin_y),
&s->s,
s->run->effect);
}
@ -3536,7 +3529,7 @@ static HRESULT WINAPI dwritetextlayout_GetMetrics(IDWriteTextLayout3 *iface, DWR
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)
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
}
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->right += x;
@ -3554,12 +3547,12 @@ static void d2d_rect_offset(D2D_RECT_F *rect, FLOAT x, FLOAT 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));
}
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(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;
UINT32 start_glyph = regular->clustermap[run->start];
const DWRITE_GLYPH_RUN *glyph_run = &regular->run;
DWRITE_FONT_METRICS font_metrics;
D2D_POINT_2F origin = { 0 };
D2D1_POINT_2F origin = { 0 };
UINT32 i;
IDWriteFontFace_GetMetrics(glyph_run->fontFace, &font_metrics);
origin.x = run->origin_x + run->align_dx;
origin.y = run->origin_y;
origin.x = run->origin.x + run->align_dx;
origin.y = run->origin.y;
for (i = 0; i < run->glyphcount; i++) {
D2D_RECT_F glyph_bbox;
D2D1_RECT_F glyph_bbox;
RECT design_bbox;
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 layout_effective_run *run;
D2D_RECT_F bbox = { 0 };
D2D1_RECT_F bbox = { 0 };
HRESULT hr;
TRACE("(%p)->(%p)\n", This, overhangs);
@ -3631,7 +3624,7 @@ static HRESULT WINAPI dwritetextlayout_GetOverhangMetrics(IDWriteTextLayout3 *if
return hr;
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);
d2d_rect_union(&bbox, &run_bbox);