Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
672ca3d3
Commit
672ca3d3
authored
Apr 19, 2017
by
Nikolay Sivov
Committed by
Alexandre Julliard
Apr 19, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dwrite: Consistently use common point and rect types.
Signed-off-by:
Nikolay Sivov
<
nsivov@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
d5bc3c7b
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
52 additions
and
59 deletions
+52
-59
layout.c
dlls/dwrite/layout.c
+52
-59
No files found.
dlls/dwrite/layout.c
View file @
672ca3d3
...
...
@@ -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
.
0
f
;
/* set after line is built */
inlineobject
->
origin
.
x
=
is_rtl
?
origin_x
-
inlineobject
->
width
:
origin_x
;
inlineobject
->
origin
.
y
=
0
.
0
f
;
/* set after line is built */
inlineobject
->
align_dx
=
0
.
0
f
;
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
.
0
f
;
/* set after line is built */
run
->
origin
.
y
=
0
.
0
f
;
/* set after line is built */
run
->
align_dx
=
0
.
0
f
;
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-10
f
);
}
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
.
5
f
);
vec2
[
1
]
=
floorf
(
vec2
[
1
]
+
0
.
5
f
);
vec2
.
x
=
floorf
(
vec2
.
x
+
0
.
5
f
);
vec2
.
y
=
floorf
(
vec2
.
y
+
0
.
5
f
);
/* 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
.
0
f
};
D2D1_POINT_2F
vec
=
{
layout
->
metrics
.
layoutWidth
-
width
,
0
.
0
f
};
layout_apply_snapping
(
&
vec
,
skiptransform
,
layout
->
ppdip
,
&
layout
->
transform
,
det
);
return
floorf
(
vec
.
x
/
2
.
0
f
);
}
...
...
@@ -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
.
0
f
;
/* set after line is built */
trimming_sign
->
origin
.
x
=
is_rtl
?
origin_x
-
trimming_sign
->
width
:
origin_x
;
trimming_sign
->
origin
.
y
=
0
.
0
f
;
/* set after line is built */
trimming_sign
->
align_dx
=
0
.
0
f
;
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
.
0
f
;
vec
[
1
]
=
coord
*
ppdip
;
vec
.
x
=
0
.
0
f
;
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
.
5
f
);
vec2
[
1
]
=
floorf
(
vec2
[
1
]
+
0
.
5
f
);
vec2
.
x
=
floorf
(
vec2
.
x
+
0
.
5
f
);
vec2
.
y
=
floorf
(
vec2
.
y
+
0
.
5
f
);
/* 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
.
5
f
)
/
ppdip
;
vec
.
y
=
floorf
(
coord
*
ppdip
+
0
.
5
f
)
/
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
,
D2D
1
_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
(
D2D
1
_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
D2D
1
_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
(
D2D
1_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
,
D2D
1
_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
};
D2D
1
_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
;
D2D
1
_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
};
D2D
1
_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
;
D2D
1
_RECT_F
run_bbox
;
layout_get_erun_bbox
(
This
,
run
,
&
run_bbox
);
d2d_rect_union
(
&
bbox
,
&
run_bbox
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment