Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
3250a17e
Commit
3250a17e
authored
May 07, 2020
by
Vincent Povirk
Committed by
Alexandre Julliard
May 08, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdiplus: Support character offsets in GDI32_GdipDrawDriverString.
Signed-off-by:
Vincent Povirk
<
vincent@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
79c78b79
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
52 additions
and
14 deletions
+52
-14
graphics.c
dlls/gdiplus/graphics.c
+52
-14
No files found.
dlls/gdiplus/graphics.c
View file @
3250a17e
...
...
@@ -2242,7 +2242,7 @@ void get_log_fontW(const GpFont *font, GpGraphics *graphics, LOGFONTW *lf)
static
void
get_font_hfont
(
GpGraphics
*
graphics
,
GDIPCONST
GpFont
*
font
,
GDIPCONST
GpStringFormat
*
format
,
HFONT
*
hfont
,
GDIPCONST
GpMatrix
*
matrix
)
LOGFONTW
*
lfw_return
,
GDIPCONST
GpMatrix
*
matrix
)
{
HDC
hdc
=
CreateCompatibleDC
(
0
);
GpPointF
pt
[
3
];
...
...
@@ -2300,6 +2300,9 @@ static void get_font_hfont(GpGraphics *graphics, GDIPCONST GpFont *font,
*
hfont
=
CreateFontIndirectW
(
&
lfw
);
if
(
lfw_return
)
*
lfw_return
=
lfw
;
DeleteDC
(
hdc
);
DeleteObject
(
unscaled_font
);
}
...
...
@@ -5371,7 +5374,7 @@ GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics,
if
(
scaled_rect
.
Width
>=
1
<<
23
)
scaled_rect
.
Width
=
1
<<
23
;
if
(
scaled_rect
.
Height
>=
1
<<
23
)
scaled_rect
.
Height
=
1
<<
23
;
get_font_hfont
(
graphics
,
font
,
stringFormat
,
&
gdifont
,
NULL
);
get_font_hfont
(
graphics
,
font
,
stringFormat
,
&
gdifont
,
NULL
,
NULL
);
oldfont
=
SelectObject
(
hdc
,
gdifont
);
for
(
i
=
0
;
i
<
stringFormat
->
range_count
;
i
++
)
...
...
@@ -5505,7 +5508,7 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
if
(
scaled_rect
.
Width
>=
1
<<
23
)
scaled_rect
.
Width
=
1
<<
23
;
if
(
scaled_rect
.
Height
>=
1
<<
23
)
scaled_rect
.
Height
=
1
<<
23
;
get_font_hfont
(
graphics
,
font
,
format
,
&
gdifont
,
NULL
);
get_font_hfont
(
graphics
,
font
,
format
,
&
gdifont
,
NULL
,
NULL
);
oldfont
=
SelectObject
(
hdc
,
gdifont
);
bounds
->
X
=
rect
->
X
;
...
...
@@ -5692,7 +5695,7 @@ GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string
SelectClipRgn
(
hdc
,
rgn
);
}
get_font_hfont
(
graphics
,
font
,
format
,
&
gdifont
,
NULL
);
get_font_hfont
(
graphics
,
font
,
format
,
&
gdifont
,
NULL
,
NULL
);
SelectObject
(
hdc
,
gdifont
);
args
.
graphics
=
graphics
;
...
...
@@ -6990,7 +6993,7 @@ GpStatus WINGDIPAPI GdipMeasureDriverString(GpGraphics *graphics, GDIPCONST UINT
if
(
flags
&
unsupported_flags
)
FIXME
(
"Ignoring flags %x
\n
"
,
flags
&
unsupported_flags
);
get_font_hfont
(
graphics
,
font
,
NULL
,
&
hfont
,
matrix
);
get_font_hfont
(
graphics
,
font
,
NULL
,
&
hfont
,
NULL
,
matrix
);
hdc
=
CreateCompatibleDC
(
0
);
SelectObject
(
hdc
,
hfont
);
...
...
@@ -7075,20 +7078,30 @@ static GpStatus GDI32_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UINT1
GDIPCONST
GpBrush
*
brush
,
GDIPCONST
PointF
*
positions
,
INT
flags
,
GDIPCONST
GpMatrix
*
matrix
)
{
static
const
INT
unsupported_flags
=
~
(
DriverStringOptionsRealizedAdvance
|
DriverStringOptionsCmapLookup
);
INT
save_state
;
GpPointF
pt
;
GpPointF
pt
,
*
real_positions
=
NULL
;
INT
*
eto_positions
=
NULL
;
HFONT
hfont
;
LOGFONTW
lfw
;
UINT
eto_flags
=
0
;
GpStatus
status
;
HRGN
hrgn
;
if
(
flags
&
unsupported_flags
)
FIXME
(
"Ignoring flags %x
\n
"
,
flags
&
unsupported_flags
);
if
(
!
(
flags
&
DriverStringOptionsCmapLookup
))
eto_flags
|=
ETO_GLYPH_INDEX
;
if
(
!
(
flags
&
DriverStringOptionsRealizedAdvance
)
&&
length
>
1
)
{
real_positions
=
heap_alloc
(
sizeof
(
*
real_positions
)
*
length
);
eto_positions
=
heap_alloc
(
sizeof
(
*
eto_positions
)
*
2
*
(
length
-
1
));
if
(
!
real_positions
||
!
eto_positions
)
{
heap_free
(
real_positions
);
heap_free
(
eto_positions
);
return
OutOfMemory
;
}
}
save_state
=
SaveDC
(
graphics
->
hdc
);
SetBkMode
(
graphics
->
hdc
,
TRANSPARENT
);
SetTextColor
(
graphics
->
hdc
,
get_gdi_brush_color
(
brush
));
...
...
@@ -7104,14 +7117,37 @@ static GpStatus GDI32_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UINT1
pt
=
positions
[
0
];
gdip_transform_points
(
graphics
,
WineCoordinateSpaceGdiDevice
,
CoordinateSpaceWorld
,
&
pt
,
1
);
get_font_hfont
(
graphics
,
font
,
format
,
&
hfont
,
matrix
);
get_font_hfont
(
graphics
,
font
,
format
,
&
hfont
,
&
lfw
,
matrix
);
if
(
!
(
flags
&
DriverStringOptionsRealizedAdvance
)
&&
length
>
1
)
{
GpMatrix
rotation
;
INT
i
;
eto_flags
|=
ETO_PDY
;
memcpy
(
real_positions
,
positions
,
sizeof
(
PointF
)
*
length
);
gdip_transform_points
(
graphics
,
WineCoordinateSpaceGdiDevice
,
CoordinateSpaceWorld
,
real_positions
,
length
);
GdipSetMatrixElements
(
&
rotation
,
1
.
0
,
0
.
0
,
0
.
0
,
1
.
0
,
0
.
0
,
0
.
0
);
GdipRotateMatrix
(
&
rotation
,
lfw
.
lfEscapement
/
10
.
0
,
MatrixOrderAppend
);
GdipTransformMatrixPoints
(
&
rotation
,
real_positions
,
length
);
for
(
i
=
0
;
i
<
(
length
-
1
);
i
++
)
{
eto_positions
[
i
*
2
]
=
gdip_round
(
real_positions
[
i
+
1
].
X
)
-
gdip_round
(
real_positions
[
i
].
X
);
eto_positions
[
i
*
2
+
1
]
=
gdip_round
(
real_positions
[
i
].
Y
)
-
gdip_round
(
real_positions
[
i
+
1
].
Y
);
}
}
SelectObject
(
graphics
->
hdc
,
hfont
);
SetTextAlign
(
graphics
->
hdc
,
TA_BASELINE
|
TA_LEFT
);
gdi_transform_acquire
(
graphics
);
ExtTextOutW
(
graphics
->
hdc
,
gdip_round
(
pt
.
X
),
gdip_round
(
pt
.
Y
),
eto_flags
,
NULL
,
text
,
length
,
NULL
);
ExtTextOutW
(
graphics
->
hdc
,
gdip_round
(
pt
.
X
),
gdip_round
(
pt
.
Y
),
eto_flags
,
NULL
,
text
,
length
,
eto_positions
);
gdi_transform_release
(
graphics
);
...
...
@@ -7119,6 +7155,9 @@ static GpStatus GDI32_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UINT1
DeleteObject
(
hfont
);
heap_free
(
real_positions
);
heap_free
(
eto_positions
);
return
Ok
;
}
...
...
@@ -7182,7 +7221,7 @@ static GpStatus SOFTWARE_GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UI
heap_free
(
real_positions
);
}
get_font_hfont
(
graphics
,
font
,
format
,
&
hfont
,
matrix
);
get_font_hfont
(
graphics
,
font
,
format
,
&
hfont
,
NULL
,
matrix
);
hdc
=
CreateCompatibleDC
(
0
);
SelectObject
(
hdc
,
hfont
);
...
...
@@ -7346,7 +7385,6 @@ static GpStatus draw_driver_string(GpGraphics *graphics, GDIPCONST UINT16 *text,
length
=
lstrlenW
(
text
);
if
(
graphics
->
hdc
&&
!
graphics
->
alpha_hdc
&&
((
flags
&
DriverStringOptionsRealizedAdvance
)
||
length
<=
1
)
&&
brush
->
bt
==
BrushTypeSolidColor
&&
(((
GpSolidFill
*
)
brush
)
->
color
&
0xff000000
)
==
0xff000000
)
stat
=
GDI32_GdipDrawDriverString
(
graphics
,
text
,
length
,
font
,
format
,
...
...
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