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
35f5e651
Commit
35f5e651
authored
Oct 21, 2020
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdi32: Move the font realization information out of freetype.c.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
6c94c0b0
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
50 additions
and
56 deletions
+50
-56
font.c
dlls/gdi32/font.c
+18
-1
freetype.c
dlls/gdi32/freetype.c
+27
-53
gdi_private.h
dlls/gdi32/gdi_private.h
+5
-2
No files found.
dlls/gdi32/font.c
View file @
35f5e651
...
...
@@ -944,13 +944,30 @@ static DWORD CDECL font_GetFontData( PHYSDEV dev, DWORD table, DWORD offset, voi
static
BOOL
CDECL
font_GetFontRealizationInfo
(
PHYSDEV
dev
,
void
*
ptr
)
{
struct
font_physdev
*
physdev
=
get_font_dev
(
dev
);
struct
font_realization_info
*
info
=
ptr
;
if
(
!
physdev
->
font
)
{
dev
=
GET_NEXT_PHYSDEV
(
dev
,
pGetFontRealizationInfo
);
return
dev
->
funcs
->
pGetFontRealizationInfo
(
dev
,
ptr
);
}
return
font_funcs
->
pGetFontRealizationInfo
(
physdev
->
font
,
ptr
);
TRACE
(
"(%p, %p)
\n
"
,
physdev
->
font
,
info
);
info
->
flags
=
1
;
if
(
physdev
->
font
->
scalable
)
info
->
flags
|=
2
;
info
->
cache_num
=
physdev
->
font
->
cache_num
;
info
->
instance_id
=
physdev
->
font
->
handle
;
if
(
info
->
size
==
sizeof
(
*
info
))
{
info
->
unk
=
0
;
info
->
face_index
=
physdev
->
font
->
face_index
;
info
->
simulations
=
0
;
if
(
physdev
->
font
->
fake_bold
)
info
->
simulations
|=
0x1
;
if
(
physdev
->
font
->
fake_italic
)
info
->
simulations
|=
0x2
;
}
return
TRUE
;
}
...
...
dlls/gdi32/freetype.c
View file @
35f5e651
...
...
@@ -330,8 +330,6 @@ struct tagGdiFont {
/* the following members can be accessed without locking, they are never modified after creation */
FT_Face
ft_face
;
struct
font_mapping
*
mapping
;
BOOL
fake_italic
;
BOOL
fake_bold
;
BYTE
underline
;
BYTE
strikeout
;
INT
orientation
;
...
...
@@ -3959,6 +3957,7 @@ static LONG load_VDMX(GdiFont*, LONG);
static
FT_Face
OpenFontFace
(
GdiFont
*
font
,
Face
*
face
,
LONG
width
,
LONG
height
)
{
struct
gdi_font
*
gdi_font
=
font
->
gdi_font
;
FT_Error
err
;
FT_Face
ft_face
;
void
*
data_ptr
;
...
...
@@ -3993,6 +3992,8 @@ static FT_Face OpenFontFace(GdiFont *font, Face *face, LONG width, LONG height)
/* set it here, as load_VDMX needs it */
font
->
ft_face
=
ft_face
;
gdi_font
->
scalable
=
FT_IS_SCALABLE
(
ft_face
);
gdi_font
->
face_index
=
face
->
face_index
;
if
(
FT_IS_SCALABLE
(
ft_face
))
{
FT_ULong
len
;
...
...
@@ -4785,7 +4786,7 @@ static struct gdi_font * CDECL freetype_SelectFont( DC *dc, HFONT hfont, UINT *a
GetObjectW
(
hfont
,
sizeof
(
lf
),
&
lf
);
lf
.
lfWidth
=
abs
(
lf
.
lfWidth
);
can_use_bitmap
=
GetDeviceCaps
(
dc
->
hSelf
,
TEXTCAPS
)
&
TC_RA_ABLE
;
can_use_bitmap
=
!!
(
GetDeviceCaps
(
dc
->
hSelf
,
TEXTCAPS
)
&
TC_RA_ABLE
)
;
TRACE
(
"%s, h=%d, it=%d, weight=%d, PandF=%02x, charset=%d orient %d escapement %d
\n
"
,
debugstr_w
(
lf
.
lfFaceName
),
lf
.
lfHeight
,
lf
.
lfItalic
,
...
...
@@ -5085,8 +5086,8 @@ found:
}
if
(
best
)
face
=
best
->
scalable
?
best
:
best_bitmap
;
re
t
->
fake_italic
=
(
it
&&
!
(
face
->
ntmFlags
&
NTM_ITALIC
));
re
t
->
fake_bold
=
(
bd
&&
!
(
face
->
ntmFlags
&
NTM_BOLD
));
gdi_fon
t
->
fake_italic
=
(
it
&&
!
(
face
->
ntmFlags
&
NTM_ITALIC
));
gdi_fon
t
->
fake_bold
=
(
bd
&&
!
(
face
->
ntmFlags
&
NTM_BOLD
));
found_face:
height
=
lf
.
lfHeight
;
...
...
@@ -5215,7 +5216,7 @@ done:
case
GGO_GRAY4_BITMAP
:
case
GGO_GRAY8_BITMAP
:
case
WINE_GGO_GRAY16_BITMAP
:
if
((
!
antialias_fakes
||
(
!
ret
->
fake_bold
&&
!
re
t
->
fake_italic
))
&&
is_hinting_enabled
())
if
((
!
antialias_fakes
||
(
!
gdi_font
->
fake_bold
&&
!
gdi_fon
t
->
fake_italic
))
&&
is_hinting_enabled
())
{
WORD
gasp_flags
;
if
(
get_gasp_flags
(
ret
,
&
gasp_flags
)
&&
!
(
gasp_flags
&
GASP_DOGRAY
))
...
...
@@ -5933,7 +5934,7 @@ static BOOL get_transform_matrices( GdiFont *font, BOOL vertical, const MAT2 *us
}
/* Slant transform */
if
(
font
->
fake_italic
)
if
(
gdi_
font
->
fake_italic
)
{
FT_Matrix
slant_mat
;
slant_mat
.
xx
=
(
1
<<
16
);
...
...
@@ -6056,6 +6057,8 @@ static FT_Vector get_advance_metric(GdiFont *incoming_font, GdiFont *font,
const
FT_Glyph_Metrics
*
metrics
,
const
FT_Matrix
*
transMat
,
BOOL
vertical_metrics
)
{
struct
gdi_font
*
incoming_gdi_font
=
incoming_font
->
gdi_font
;
struct
gdi_font
*
gdi_font
=
font
->
gdi_font
;
FT_Vector
adv
;
FT_Fixed
base_advance
,
em_scale
=
0
;
BOOL
fixed_pitch_full
=
FALSE
;
...
...
@@ -6072,7 +6075,7 @@ static FT_Vector get_advance_metric(GdiFont *incoming_font, GdiFont *font,
they have double halfwidth character width. E.g. if the font is 19 ppem,
we return 20 (not 19) for fullwidth characters as we return 10 for
halfwidth characters. */
if
(
FT_IS_SCALABLE
(
incoming_font
->
ft_face
)
&&
if
(
incoming_gdi_font
->
scalable
&&
(
incoming_font
->
potm
||
get_outline_text_metrics
(
incoming_font
))
&&
!
(
incoming_font
->
potm
->
otmTextMetrics
.
tmPitchAndFamily
&
TMPF_FIXED_PITCH
))
{
UINT
avg_advance
;
...
...
@@ -6097,7 +6100,7 @@ static FT_Vector get_advance_metric(GdiFont *incoming_font, GdiFont *font,
}
}
if
(
font
->
fake_bold
)
{
if
(
gdi_
font
->
fake_bold
)
{
if
(
!
transMat
)
adv
.
x
+=
1
<<
6
;
else
{
...
...
@@ -6845,7 +6848,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
}
metrics
=
ft_face
->
glyph
->
metrics
;
if
(
font
->
fake_bold
)
{
if
(
gdi_
font
->
fake_bold
)
{
if
(
!
get_bold_glyph_outline
(
ft_face
->
glyph
,
font
->
ppem
,
&
metrics
)
&&
metrics
.
width
)
metrics
.
width
+=
1
<<
6
;
}
...
...
@@ -6890,7 +6893,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
switch
(
format
)
{
case
GGO_BITMAP
:
needed
=
get_mono_glyph_bitmap
(
ft_face
->
glyph
,
bbox
,
font
->
fake_bold
,
needed
=
get_mono_glyph_bitmap
(
ft_face
->
glyph
,
bbox
,
gdi_
font
->
fake_bold
,
needsTransform
,
matrices
,
buflen
,
buf
);
break
;
...
...
@@ -6898,7 +6901,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
case
GGO_GRAY4_BITMAP
:
case
GGO_GRAY8_BITMAP
:
case
WINE_GGO_GRAY16_BITMAP
:
needed
=
get_antialias_glyph_bitmap
(
ft_face
->
glyph
,
bbox
,
format
,
font
->
fake_bold
,
needed
=
get_antialias_glyph_bitmap
(
ft_face
->
glyph
,
bbox
,
format
,
gdi_
font
->
fake_bold
,
needsTransform
,
matrices
,
buflen
,
buf
);
break
;
...
...
@@ -6906,7 +6909,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
case
WINE_GGO_HBGR_BITMAP
:
case
WINE_GGO_VRGB_BITMAP
:
case
WINE_GGO_VBGR_BITMAP
:
needed
=
get_subpixel_glyph_bitmap
(
ft_face
->
glyph
,
bbox
,
format
,
font
->
fake_bold
,
needed
=
get_subpixel_glyph_bitmap
(
ft_face
->
glyph
,
bbox
,
format
,
gdi_
font
->
fake_bold
,
needsTransform
,
matrices
,
&
gm
,
buflen
,
buf
);
break
;
...
...
@@ -7016,7 +7019,7 @@ static BOOL get_bitmap_text_metrics(GdiFont *font)
TM
.
tmCharSet
=
gdi_font
->
charset
;
}
if
(
font
->
fake_bold
)
if
(
gdi_
font
->
fake_bold
)
TM
.
tmWeight
=
FW_BOLD
;
#undef TM
...
...
@@ -7050,9 +7053,9 @@ static void scale_font_metrics(const GdiFont *font, LPTEXTMETRICW ptm)
SCALE_Y
(
ptm
->
tmExternalLeading
);
SCALE_X
(
ptm
->
tmOverhang
);
if
(
font
->
fake_bold
)
if
(
gdi_
font
->
fake_bold
)
{
if
(
!
FT_IS_SCALABLE
(
font
->
ft_face
)
)
if
(
!
gdi_font
->
scalable
)
ptm
->
tmOverhang
++
;
ptm
->
tmAveCharWidth
++
;
ptm
->
tmMaxCharWidth
++
;
...
...
@@ -7273,7 +7276,7 @@ static BOOL get_outline_text_metrics(GdiFont *font)
}
TM
.
tmMaxCharWidth
=
SCALE_X
(
ft_face
->
bbox
.
xMax
-
ft_face
->
bbox
.
xMin
);
TM
.
tmWeight
=
FW_REGULAR
;
if
(
font
->
fake_bold
)
if
(
gdi_
font
->
fake_bold
)
TM
.
tmWeight
=
FW_BOLD
;
else
{
...
...
@@ -7322,7 +7325,7 @@ static BOOL get_outline_text_metrics(GdiFont *font)
TM
.
tmBreakChar
=
pOS2
->
usFirstCharIndex
;
TM
.
tmDefaultChar
=
TM
.
tmBreakChar
-
1
;
}
TM
.
tmItalic
=
font
->
fake_italic
?
255
:
((
ft_face
->
style_flags
&
FT_STYLE_FLAG_ITALIC
)
?
255
:
0
);
TM
.
tmItalic
=
gdi_
font
->
fake_italic
?
255
:
((
ft_face
->
style_flags
&
FT_STYLE_FLAG_ITALIC
)
?
255
:
0
);
TM
.
tmUnderlined
=
font
->
underline
;
TM
.
tmStruckOut
=
font
->
strikeout
;
...
...
@@ -7403,9 +7406,9 @@ static BOOL get_outline_text_metrics(GdiFont *font)
font
->
potm
->
otmFiller
=
0
;
memcpy
(
&
font
->
potm
->
otmPanoseNumber
,
pOS2
->
panose
,
PANOSE_COUNT
);
font
->
potm
->
otmfsSelection
=
pOS2
->
fsSelection
;
if
(
font
->
fake_italic
)
if
(
gdi_
font
->
fake_italic
)
font
->
potm
->
otmfsSelection
|=
1
;
if
(
font
->
fake_bold
)
if
(
gdi_
font
->
fake_bold
)
font
->
potm
->
otmfsSelection
|=
1
<<
5
;
/* Only return valid bits that define embedding and subsetting restrictions */
font
->
potm
->
otmfsType
=
pOS2
->
fsType
&
0x30e
;
...
...
@@ -7508,7 +7511,7 @@ static UINT CDECL freetype_GetOutlineTextMetrics( struct gdi_font *gdi_font, UIN
TRACE
(
"font=%p
\n
"
,
font
);
if
(
!
FT_IS_SCALABLE
(
font
->
ft_face
)
)
return
0
;
if
(
!
gdi_font
->
scalable
)
return
0
;
EnterCriticalSection
(
&
freetype_cs
);
...
...
@@ -7559,8 +7562,8 @@ static BOOL load_child_font(GdiFont *font, CHILD_FONT *child)
return
FALSE
;
}
child
->
font
->
fake_italic
=
italic
&&
!
(
child_face
->
ntmFlags
&
NTM_ITALIC
);
child
->
font
->
fake_bold
=
bold
&&
!
(
child_face
->
ntmFlags
&
NTM_BOLD
);
child
->
font
->
gdi_font
->
fake_italic
=
italic
&&
!
(
child_face
->
ntmFlags
&
NTM_ITALIC
);
child
->
font
->
gdi_font
->
fake_bold
=
bold
&&
!
(
child_face
->
ntmFlags
&
NTM_BOLD
);
child
->
font
->
gdi_font
->
lf
=
gdi_font
->
lf
;
child
->
font
->
gdi_font
->
matrix
=
gdi_font
->
matrix
;
child
->
font
->
gdi_font
->
can_use_bitmap
=
gdi_font
->
can_use_bitmap
;
...
...
@@ -7651,7 +7654,7 @@ static BOOL CDECL freetype_GetCharWidthInfo( struct gdi_font *gdi_font, struct c
TRACE
(
"%p, %p
\n
"
,
font
,
info
);
if
(
FT_IS_SCALABLE
(
font
->
ft_face
)
&&
if
(
gdi_font
->
scalable
&&
(
pHori
=
pFT_Get_Sfnt_Table
(
font
->
ft_face
,
ft_sfnt_hhea
)))
{
FT_Fixed
em_scale
;
...
...
@@ -7867,34 +7870,6 @@ static BOOL CDECL freetype_FontIsLinked( struct gdi_font *font )
return
ret
;
}
/*************************************************************
* freetype_GetFontRealizationInfo
*/
static
BOOL
CDECL
freetype_GetFontRealizationInfo
(
struct
gdi_font
*
gdi_font
,
struct
font_realization_info
*
info
)
{
GdiFont
*
font
=
get_font_ptr
(
gdi_font
);
TRACE
(
"(%p, %p)
\n
"
,
font
,
info
);
info
->
flags
=
1
;
if
(
FT_IS_SCALABLE
(
font
->
ft_face
))
info
->
flags
|=
2
;
info
->
cache_num
=
gdi_font
->
cache_num
;
info
->
instance_id
=
gdi_font
->
handle
;
if
(
info
->
size
==
sizeof
(
*
info
))
{
info
->
unk
=
0
;
info
->
face_index
=
font
->
ft_face
->
face_index
;
info
->
simulations
=
0
;
if
(
font
->
fake_bold
)
info
->
simulations
|=
0x1
;
if
(
font
->
fake_italic
)
info
->
simulations
|=
0x2
;
}
return
TRUE
;
}
/*************************************************************************
* freetype_GetFontFileData
*/
...
...
@@ -8174,7 +8149,6 @@ static const struct font_backend_funcs font_funcs =
freetype_GetCharWidth
,
freetype_GetCharWidthInfo
,
freetype_GetFontData
,
freetype_GetFontRealizationInfo
,
freetype_GetFontUnicodeRanges
,
freetype_GetGlyphIndices
,
freetype_GetGlyphOutline
,
...
...
dlls/gdi32/gdi_private.h
View file @
35f5e651
...
...
@@ -318,7 +318,11 @@ struct gdi_font
FONTSIGNATURE
fs
;
LOGFONTW
lf
;
FMAT2
matrix
;
BOOL
can_use_bitmap
;
UINT
face_index
;
BOOL
can_use_bitmap
:
1
;
BOOL
fake_italic
:
1
;
BOOL
fake_bold
:
1
;
BOOL
scalable
:
1
;
WCHAR
*
name
;
struct
font_fileinfo
*
fileinfo
;
};
...
...
@@ -332,7 +336,6 @@ struct font_backend_funcs
BOOL
(
CDECL
*
pGetCharWidth
)(
struct
gdi_font
*
font
,
UINT
first
,
UINT
last
,
INT
*
buffer
);
BOOL
(
CDECL
*
pGetCharWidthInfo
)(
struct
gdi_font
*
font
,
struct
char_width_info
*
info
);
DWORD
(
CDECL
*
pGetFontData
)(
struct
gdi_font
*
font
,
DWORD
table
,
DWORD
offset
,
void
*
buf
,
DWORD
size
);
BOOL
(
CDECL
*
pGetFontRealizationInfo
)(
struct
gdi_font
*
font
,
struct
font_realization_info
*
info
);
DWORD
(
CDECL
*
pGetFontUnicodeRanges
)(
struct
gdi_font
*
font
,
GLYPHSET
*
glyphset
);
DWORD
(
CDECL
*
pGetGlyphIndices
)(
struct
gdi_font
*
font
,
const
WCHAR
*
str
,
INT
count
,
WORD
*
gi
,
DWORD
flags
);
DWORD
(
CDECL
*
pGetGlyphOutline
)(
struct
gdi_font
*
font
,
UINT
glyph
,
UINT
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