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
daef5061
Commit
daef5061
authored
Sep 02, 2014
by
Aric Stewart
Committed by
Alexandre Julliard
Sep 02, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dwrite: Store font data in its own structure.
parent
f49c7409
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
53 additions
and
35 deletions
+53
-35
font.c
dlls/dwrite/font.c
+53
-35
No files found.
dlls/dwrite/font.c
View file @
daef5061
...
...
@@ -125,6 +125,16 @@ typedef struct
#define MS_OS2_TAG MS_MAKE_TAG('O','S','/','2')
#define MS_POST_TAG MS_MAKE_TAG('p','o','s','t')
struct
dwrite_font_data
{
DWRITE_FONT_STYLE
style
;
DWRITE_FONT_STRETCH
stretch
;
DWRITE_FONT_WEIGHT
weight
;
DWRITE_FONT_SIMULATIONS
simulations
;
DWRITE_FONT_METRICS
metrics
;
WCHAR
*
facename
;
};
struct
dwrite_fontcollection
{
IDWriteFontCollection
IDWriteFontCollection_iface
;
LONG
ref
;
...
...
@@ -148,11 +158,8 @@ struct dwrite_font {
BOOL
is_system
;
IDWriteFontFamily
*
family
;
IDWriteFontFace
*
face
;
DWRITE_FONT_STYLE
style
;
DWRITE_FONT_STRETCH
stretch
;
DWRITE_FONT_WEIGHT
weight
;
DWRITE_FONT_METRICS
metrics
;
WCHAR
*
facename
;
struct
dwrite_font_data
*
data
;
};
#define DWRITE_FONTTABLE_MAGIC 0xededfafa
...
...
@@ -528,10 +535,10 @@ static HRESULT create_system_fontface(struct dwrite_font *font, IDWriteFontFace
This
->
is_system
=
TRUE
;
memset
(
&
This
->
logfont
,
0
,
sizeof
(
This
->
logfont
));
This
->
logfont
.
lfItalic
=
font
->
style
==
DWRITE_FONT_STYLE_ITALIC
;
This
->
logfont
.
lfItalic
=
font
->
data
->
style
==
DWRITE_FONT_STYLE_ITALIC
;
/* weight values from DWRITE_FONT_WEIGHT match values used for LOGFONT */
This
->
logfont
.
lfWeight
=
font
->
weight
;
strcpyW
(
This
->
logfont
.
lfFaceName
,
font
->
facename
);
This
->
logfont
.
lfWeight
=
font
->
data
->
weight
;
strcpyW
(
This
->
logfont
.
lfFaceName
,
font
->
data
->
facename
);
*
face
=
&
This
->
IDWriteFontFace_iface
;
...
...
@@ -583,7 +590,8 @@ static ULONG WINAPI dwritefont_Release(IDWriteFont *iface)
{
if
(
This
->
face
)
IDWriteFontFace_Release
(
This
->
face
);
IDWriteFontFamily_Release
(
This
->
family
);
heap_free
(
This
->
facename
);
heap_free
(
This
->
data
->
facename
);
heap_free
(
This
->
data
);
heap_free
(
This
);
}
...
...
@@ -604,21 +612,21 @@ static DWRITE_FONT_WEIGHT WINAPI dwritefont_GetWeight(IDWriteFont *iface)
{
struct
dwrite_font
*
This
=
impl_from_IDWriteFont
(
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
return
This
->
weight
;
return
This
->
data
->
weight
;
}
static
DWRITE_FONT_STRETCH
WINAPI
dwritefont_GetStretch
(
IDWriteFont
*
iface
)
{
struct
dwrite_font
*
This
=
impl_from_IDWriteFont
(
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
return
This
->
stretch
;
return
This
->
data
->
stretch
;
}
static
DWRITE_FONT_STYLE
WINAPI
dwritefont_GetStyle
(
IDWriteFont
*
iface
)
{
struct
dwrite_font
*
This
=
impl_from_IDWriteFont
(
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
return
This
->
style
;
return
This
->
data
->
style
;
}
static
BOOL
WINAPI
dwritefont_IsSymbolFont
(
IDWriteFont
*
iface
)
...
...
@@ -646,8 +654,8 @@ static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont *iface,
static
DWRITE_FONT_SIMULATIONS
WINAPI
dwritefont_GetSimulations
(
IDWriteFont
*
iface
)
{
struct
dwrite_font
*
This
=
impl_from_IDWriteFont
(
iface
);
FIXME
(
"(%p): stub
\n
"
,
This
);
return
DWRITE_FONT_SIMULATIONS_NONE
;
TRACE
(
"(%p)
\n
"
,
This
);
return
This
->
data
->
simulations
;
}
static
void
WINAPI
dwritefont_GetMetrics
(
IDWriteFont
*
iface
,
DWRITE_FONT_METRICS
*
metrics
)
...
...
@@ -655,7 +663,7 @@ static void WINAPI dwritefont_GetMetrics(IDWriteFont *iface, DWRITE_FONT_METRICS
struct
dwrite_font
*
This
=
impl_from_IDWriteFont
(
iface
);
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
metrics
);
*
metrics
=
This
->
metrics
;
*
metrics
=
This
->
data
->
metrics
;
}
static
HRESULT
WINAPI
dwritefont_HasCharacter
(
IDWriteFont
*
iface
,
UINT32
value
,
BOOL
*
exists
)
...
...
@@ -1011,10 +1019,10 @@ static void get_font_properties(struct dwrite_font *font, HDC hdc)
LONG
size
;
/* default stretch and weight to normal */
font
->
stretch
=
DWRITE_FONT_STRETCH_NORMAL
;
font
->
weight
=
DWRITE_FONT_WEIGHT_NORMAL
;
font
->
data
->
stretch
=
DWRITE_FONT_STRETCH_NORMAL
;
font
->
data
->
weight
=
DWRITE_FONT_WEIGHT_NORMAL
;
memset
(
&
font
->
metrics
,
0
,
sizeof
(
font
->
metrics
));
memset
(
&
font
->
data
->
metrics
,
0
,
sizeof
(
font
->
data
->
metrics
));
size
=
GetFontData
(
hdc
,
MS_OS2_TAG
,
0
,
NULL
,
0
);
if
(
size
!=
GDI_ERROR
)
...
...
@@ -1026,31 +1034,31 @@ static void get_font_properties(struct dwrite_font *font, HDC hdc)
/* DWRITE_FONT_STRETCH enumeration values directly match font data values */
if
(
GET_BE_WORD
(
tt_os2
.
usWidthClass
)
<=
DWRITE_FONT_STRETCH_ULTRA_EXPANDED
)
font
->
stretch
=
GET_BE_WORD
(
tt_os2
.
usWidthClass
);
font
->
weight
=
GET_BE_WORD
(
tt_os2
.
usWeightClass
);
TRACE
(
"stretch=%d, weight=%d
\n
"
,
font
->
stretch
,
font
->
weight
);
font
->
metrics
.
ascent
=
GET_BE_WORD
(
tt_os2
.
sTypoAscender
);
font
->
metrics
.
descent
=
GET_BE_WORD
(
tt_os2
.
sTypoDescender
);
font
->
metrics
.
lineGap
=
GET_BE_WORD
(
tt_os2
.
sTypoLineGap
);
font
->
metrics
.
capHeight
=
GET_BE_WORD
(
tt_os2
.
sCapHeight
);
font
->
metrics
.
xHeight
=
GET_BE_WORD
(
tt_os2
.
sxHeight
);
font
->
metrics
.
strikethroughPosition
=
GET_BE_WORD
(
tt_os2
.
yStrikeoutPosition
);
font
->
metrics
.
strikethroughThickness
=
GET_BE_WORD
(
tt_os2
.
yStrikeoutSize
);
font
->
data
->
stretch
=
GET_BE_WORD
(
tt_os2
.
usWidthClass
);
font
->
data
->
weight
=
GET_BE_WORD
(
tt_os2
.
usWeightClass
);
TRACE
(
"stretch=%d, weight=%d
\n
"
,
font
->
data
->
stretch
,
font
->
data
->
weight
);
font
->
data
->
metrics
.
ascent
=
GET_BE_WORD
(
tt_os2
.
sTypoAscender
);
font
->
data
->
metrics
.
descent
=
GET_BE_WORD
(
tt_os2
.
sTypoDescender
);
font
->
data
->
metrics
.
lineGap
=
GET_BE_WORD
(
tt_os2
.
sTypoLineGap
);
font
->
data
->
metrics
.
capHeight
=
GET_BE_WORD
(
tt_os2
.
sCapHeight
);
font
->
data
->
metrics
.
xHeight
=
GET_BE_WORD
(
tt_os2
.
sxHeight
);
font
->
data
->
metrics
.
strikethroughPosition
=
GET_BE_WORD
(
tt_os2
.
yStrikeoutPosition
);
font
->
data
->
metrics
.
strikethroughThickness
=
GET_BE_WORD
(
tt_os2
.
yStrikeoutSize
);
}
memset
(
&
tt_head
,
0
,
sizeof
(
tt_head
));
if
(
GetFontData
(
hdc
,
MS_HEAD_TAG
,
0
,
&
tt_head
,
sizeof
(
tt_head
))
!=
GDI_ERROR
)
{
font
->
metrics
.
designUnitsPerEm
=
GET_BE_WORD
(
tt_head
.
unitsPerEm
);
font
->
data
->
metrics
.
designUnitsPerEm
=
GET_BE_WORD
(
tt_head
.
unitsPerEm
);
}
memset
(
&
tt_post
,
0
,
sizeof
(
tt_post
));
if
(
GetFontData
(
hdc
,
MS_POST_TAG
,
0
,
&
tt_post
,
sizeof
(
tt_post
))
!=
GDI_ERROR
)
{
font
->
metrics
.
underlinePosition
=
GET_BE_WORD
(
tt_post
.
underlinePosition
);
font
->
metrics
.
underlineThickness
=
GET_BE_WORD
(
tt_post
.
underlineThickness
);
font
->
data
->
metrics
.
underlinePosition
=
GET_BE_WORD
(
tt_post
.
underlinePosition
);
font
->
data
->
metrics
.
underlineThickness
=
GET_BE_WORD
(
tt_post
.
underlineThickness
);
}
}
...
...
@@ -1069,10 +1077,17 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
This
=
heap_alloc
(
sizeof
(
struct
dwrite_font
));
if
(
!
This
)
return
E_OUTOFMEMORY
;
This
->
data
=
heap_alloc
(
sizeof
(
struct
dwrite_font_data
));
if
(
!
This
->
data
)
{
heap_free
(
This
);
return
E_OUTOFMEMORY
;
}
hfont
=
CreateFontIndirectW
(
logfont
);
if
(
!
hfont
)
{
heap_free
(
This
->
data
);
heap_free
(
This
);
return
DWRITE_E_NOFONT
;
}
...
...
@@ -1084,6 +1099,7 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
otm
=
heap_alloc
(
ret
);
if
(
!
otm
)
{
heap_free
(
This
->
data
);
heap_free
(
This
);
DeleteDC
(
hdc
);
DeleteObject
(
hfont
);
...
...
@@ -1105,6 +1121,7 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
heap_free
(
otm
);
if
(
hr
!=
S_OK
)
{
heap_free
(
This
->
data
);
heap_free
(
This
);
return
hr
;
}
...
...
@@ -1114,8 +1131,9 @@ HRESULT create_font_from_logfont(const LOGFONTW *logfont, IDWriteFont **font)
This
->
face
=
NULL
;
This
->
is_system
=
TRUE
;
This
->
family
=
family
;
This
->
style
=
logfont
->
lfItalic
?
DWRITE_FONT_STYLE_ITALIC
:
DWRITE_FONT_STYLE_NORMAL
;
This
->
facename
=
heap_strdupW
(
logfont
->
lfFaceName
);
This
->
data
->
simulations
=
DWRITE_FONT_SIMULATIONS_NONE
;
This
->
data
->
style
=
logfont
->
lfItalic
?
DWRITE_FONT_STYLE_ITALIC
:
DWRITE_FONT_STYLE_NORMAL
;
This
->
data
->
facename
=
heap_strdupW
(
logfont
->
lfFaceName
);
*
font
=
&
This
->
IDWriteFont_iface
;
...
...
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