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
0d0d37bb
Commit
0d0d37bb
authored
Feb 23, 2024
by
Esme Povirk
Committed by
Alexandre Julliard
Feb 26, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdiplus: Pass gdip_format_string_info to font link functions.
parent
f2c92c68
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
25 additions
and
26 deletions
+25
-26
graphics.c
dlls/gdiplus/graphics.c
+25
-26
No files found.
dlls/gdiplus/graphics.c
View file @
0d0d37bb
...
...
@@ -5199,8 +5199,7 @@ GpStatus WINGDIPAPI GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y, INT w
}
/* Populates gdip_font_link_info struct based on the base_font and input string */
static
void
generate_font_link_info
(
GpGraphics
*
graphics
,
WCHAR
*
string
,
DWORD
length
,
GDIPCONST
GpFont
*
base_font
,
struct
gdip_font_link_info
*
font_link_info
)
static
void
generate_font_link_info
(
struct
gdip_format_string_info
*
info
,
DWORD
length
,
GDIPCONST
GpFont
*
base_font
)
{
IUnknown
*
unk
;
IMLangFontLink
*
iMLFL
;
...
...
@@ -5210,21 +5209,21 @@ static void generate_font_link_info(GpGraphics *graphics, WCHAR *string, DWORD l
struct
gdip_font_link_section
*
section
;
DWORD
font_codepages
,
string_codepages
;
list_init
(
&
font_link_info
->
sections
);
font_link_info
->
base_font
=
base_font
;
list_init
(
&
info
->
font_link_info
.
sections
);
info
->
font_link_info
.
base_font
=
base_font
;
GetGlobalFontLinkObject
((
void
**
)
&
unk
);
IUnknown_QueryInterface
(
unk
,
&
IID_IMLangFontLink
,
(
void
**
)
&
iMLFL
);
IUnknown_Release
(
unk
);
get_font_hfont
(
graphics
,
base_font
,
NULL
,
&
hfont
,
NULL
,
NULL
);
IMLangFontLink_GetFontCodePages
(
iMLFL
,
graphics
->
hdc
,
hfont
,
&
font_codepages
);
get_font_hfont
(
info
->
graphics
,
base_font
,
NULL
,
&
hfont
,
NULL
,
NULL
);
IMLangFontLink_GetFontCodePages
(
iMLFL
,
info
->
graphics
->
hdc
,
hfont
,
&
font_codepages
);
while
(
progress
<
length
)
{
section
=
calloc
(
1
,
sizeof
(
*
section
));
section
->
start
=
progress
;
IMLangFontLink_GetStrCodePages
(
iMLFL
,
&
string
[
progress
],
length
-
progress
,
IMLangFontLink_GetStrCodePages
(
iMLFL
,
&
info
->
string
[
progress
],
length
-
progress
,
font_codepages
,
&
string_codepages
,
&
processed
);
if
(
font_codepages
&
string_codepages
)
...
...
@@ -5233,16 +5232,16 @@ static void generate_font_link_info(GpGraphics *graphics, WCHAR *string, DWORD l
}
else
{
IMLangFontLink_MapFont
(
iMLFL
,
graphics
->
hdc
,
string_codepages
,
hfont
,
&
map_hfont
);
old_font
=
SelectObject
(
graphics
->
hdc
,
map_hfont
);
GdipCreateFontFromDC
(
graphics
->
hdc
,
&
gpfont
);
SelectObject
(
graphics
->
hdc
,
old_font
);
IMLangFontLink_MapFont
(
iMLFL
,
info
->
graphics
->
hdc
,
string_codepages
,
hfont
,
&
map_hfont
);
old_font
=
SelectObject
(
info
->
graphics
->
hdc
,
map_hfont
);
GdipCreateFontFromDC
(
info
->
graphics
->
hdc
,
&
gpfont
);
SelectObject
(
info
->
graphics
->
hdc
,
old_font
);
IMLangFontLink_ReleaseFont
(
iMLFL
,
map_hfont
);
section
->
font
=
gpfont
;
}
section
->
end
=
section
->
start
+
processed
;
list_add_tail
(
&
font_link_info
->
sections
,
&
section
->
entry
);
list_add_tail
(
&
info
->
font_link_info
.
sections
,
&
section
->
entry
);
progress
+=
processed
;
}
...
...
@@ -5250,7 +5249,7 @@ static void generate_font_link_info(GpGraphics *graphics, WCHAR *string, DWORD l
IMLangFontLink_Release
(
iMLFL
);
}
static
void
font_link_get_text_extent_point
(
struct
gdip_fo
nt_link_info
*
font_link_info
,
GpGraphics
*
graphics
,
LPCWSTR
string
,
static
void
font_link_get_text_extent_point
(
struct
gdip_fo
rmat_string_info
*
info
,
INT
index
,
int
length
,
int
max_ext
,
LPINT
fit
,
SIZE
*
size
)
{
DWORD
to_measure_length
;
...
...
@@ -5265,16 +5264,16 @@ static void font_link_get_text_extent_point(struct gdip_font_link_info *font_lin
if
(
fit
)
*
fit
=
0
;
LIST_FOR_EACH_ENTRY
(
section
,
&
font_link_info
->
sections
,
struct
gdip_font_link_section
,
entry
)
LIST_FOR_EACH_ENTRY
(
section
,
&
info
->
font_link_info
.
sections
,
struct
gdip_font_link_section
,
entry
)
{
if
(
i
>=
section
->
end
)
continue
;
to_measure_length
=
min
(
length
-
(
i
-
index
),
section
->
end
-
i
);
get_font_hfont
(
graphics
,
section
->
font
,
NULL
,
&
hfont
,
NULL
,
NULL
);
oldhfont
=
SelectObject
(
graphics
->
hdc
,
hfont
);
GetTextExtentExPointW
(
graphics
->
hdc
,
&
string
[
i
],
to_measure_length
,
max_ext
,
&
fitaux
,
NULL
,
&
sizeaux
);
SelectObject
(
graphics
->
hdc
,
oldhfont
);
get_font_hfont
(
info
->
graphics
,
section
->
font
,
NULL
,
&
hfont
,
NULL
,
NULL
);
oldhfont
=
SelectObject
(
info
->
graphics
->
hdc
,
hfont
);
GetTextExtentExPointW
(
info
->
graphics
->
hdc
,
&
info
->
string
[
i
],
to_measure_length
,
max_ext
,
&
fitaux
,
NULL
,
&
sizeaux
);
SelectObject
(
info
->
graphics
->
hdc
,
oldhfont
);
DeleteObject
(
hfont
);
max_ext
-=
sizeaux
.
cx
;
...
...
@@ -5393,10 +5392,10 @@ GpStatus gdip_format_string(GpGraphics *graphics,
halign
=
format
->
align
;
generate_font_link_info
(
graphics
,
stringdup
,
length
,
font
,
&
info
.
font_link_info
);
generate_font_link_info
(
&
info
,
length
,
font
);
while
(
sum
<
length
){
font_link_get_text_extent_point
(
&
info
.
font_link_info
,
graphics
,
stringdup
,
sum
,
length
-
sum
,
nwidth
,
&
fit
,
&
size
);
font_link_get_text_extent_point
(
&
info
,
sum
,
length
-
sum
,
nwidth
,
&
fit
,
&
size
);
fitcpy
=
fit
;
if
(
fit
==
0
)
...
...
@@ -5444,7 +5443,7 @@ GpStatus gdip_format_string(GpGraphics *graphics,
else
lineend
=
fit
;
font_link_get_text_extent_point
(
&
info
.
font_link_info
,
graphics
,
stringdup
,
sum
,
lineend
,
nwidth
,
&
j
,
&
size
);
font_link_get_text_extent_point
(
&
info
,
sum
,
lineend
,
nwidth
,
&
j
,
&
size
);
bounds
.
Width
=
size
.
cx
;
...
...
@@ -5566,10 +5565,10 @@ static GpStatus measure_ranges_callback(struct gdip_format_string_info *info)
range_rect
.
Y
=
info
->
bounds
->
Y
/
args
->
rel_height
;
range_rect
.
Height
=
info
->
bounds
->
Height
/
args
->
rel_height
;
font_link_get_text_extent_point
(
&
info
->
font_link_info
,
info
->
graphics
,
info
->
string
,
info
->
index
,
range_start
-
info
->
index
,
INT_MAX
,
NULL
,
&
range_size
);
font_link_get_text_extent_point
(
info
,
info
->
index
,
range_start
-
info
->
index
,
INT_MAX
,
NULL
,
&
range_size
);
range_rect
.
X
=
(
info
->
bounds
->
X
+
range_size
.
cx
)
/
args
->
rel_width
;
font_link_get_text_extent_point
(
&
info
->
font_link_info
,
info
->
graphics
,
info
->
string
,
info
->
index
,
range_end
-
info
->
index
,
INT_MAX
,
NULL
,
&
range_size
);
font_link_get_text_extent_point
(
info
,
info
->
index
,
range_end
-
info
->
index
,
INT_MAX
,
NULL
,
&
range_size
);
range_rect
.
Width
=
(
info
->
bounds
->
X
+
range_size
.
cx
)
/
args
->
rel_width
-
range_rect
.
X
;
stat
=
GdipCombineRegionRect
(
args
->
regions
[
i
],
&
range_rect
,
CombineModeUnion
);
...
...
@@ -5800,7 +5799,7 @@ static GpStatus draw_string_callback(struct gdip_format_string_info *info)
to_draw_length
=
min
(
info
->
length
-
(
i
-
info
->
index
),
section
->
end
-
i
);
TRACE
(
"index %d, todraw %ld, used %s
\n
"
,
i
,
to_draw_length
,
section
->
font
==
info
->
font_link_info
.
base_font
?
"base font"
:
"map"
);
font_link_get_text_extent_point
(
&
info
->
font_link_info
,
info
->
graphics
,
info
->
string
,
i
,
to_draw_length
,
0
,
NULL
,
&
size
);
font_link_get_text_extent_point
(
info
,
i
,
to_draw_length
,
0
,
NULL
,
&
size
);
stat
=
draw_driver_string
(
info
->
graphics
,
&
info
->
string
[
i
],
to_draw_length
,
section
->
font
,
info
->
format
,
args
->
brush
,
&
position
,
DriverStringOptionsCmapLookup
|
DriverStringOptionsRealizedAdvance
,
NULL
);
...
...
@@ -5826,10 +5825,10 @@ static GpStatus draw_string_callback(struct gdip_format_string_info *info)
SIZE
text_size
;
INT
ofs
=
info
->
underlined_indexes
[
i
]
-
info
->
index
;
font_link_get_text_extent_point
(
&
info
->
font_link_info
,
info
->
graphics
,
info
->
string
,
info
->
index
,
ofs
,
INT_MAX
,
NULL
,
&
text_size
);
font_link_get_text_extent_point
(
info
,
info
->
index
,
ofs
,
INT_MAX
,
NULL
,
&
text_size
);
start_x
=
text_size
.
cx
/
args
->
rel_width
;
font_link_get_text_extent_point
(
&
info
->
font_link_info
,
info
->
graphics
,
info
->
string
,
info
->
index
,
ofs
+
1
,
INT_MAX
,
NULL
,
&
text_size
);
font_link_get_text_extent_point
(
info
,
info
->
index
,
ofs
+
1
,
INT_MAX
,
NULL
,
&
text_size
);
end_x
=
text_size
.
cx
/
args
->
rel_width
;
GdipFillRectangle
(
info
->
graphics
,
(
GpBrush
*
)
args
->
brush
,
position
.
X
+
start_x
,
underline_y
,
end_x
-
start_x
,
underline_height
);
...
...
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