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
17e72c81
Commit
17e72c81
authored
Oct 06, 2011
by
Huw Davies
Committed by
Alexandre Julliard
Oct 06, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdi32: Load the font properties from the cache if it exists.
parent
a155292f
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
179 additions
and
0 deletions
+179
-0
freetype.c
dlls/gdi32/freetype.c
+179
-0
No files found.
dlls/gdi32/freetype.c
View file @
17e72c81
...
...
@@ -1145,11 +1145,185 @@ static WCHAR *get_face_name(FT_Face ft_face, FT_UShort name_id, FT_UShort langua
return
ret
;
}
static
LONG
reg_load_dword
(
HKEY
hkey
,
const
WCHAR
*
value
,
DWORD
*
data
)
{
DWORD
type
,
needed
;
LONG
r
=
RegQueryValueExW
(
hkey
,
value
,
NULL
,
&
type
,
NULL
,
&
needed
);
if
(
r
!=
ERROR_SUCCESS
)
return
r
;
if
(
type
!=
REG_DWORD
||
needed
!=
sizeof
(
DWORD
))
return
ERROR_BAD_CONFIGURATION
;
return
RegQueryValueExW
(
hkey
,
value
,
NULL
,
&
type
,
(
BYTE
*
)
data
,
&
needed
);
}
static
inline
LONG
reg_save_dword
(
HKEY
hkey
,
const
WCHAR
*
value
,
DWORD
data
)
{
return
RegSetValueExW
(
hkey
,
value
,
0
,
REG_DWORD
,
(
BYTE
*
)
&
data
,
sizeof
(
DWORD
));
}
static
void
load_face
(
HKEY
hkey_face
,
WCHAR
*
face_name
,
Family
*
family
)
{
DWORD
needed
;
DWORD
num_strikes
,
max_strike_key_len
;
/* If we have a File Name key then this is a real font, not just the parent
key of a bunch of non-scalable strikes */
if
(
RegQueryValueExA
(
hkey_face
,
"File Name"
,
NULL
,
NULL
,
NULL
,
&
needed
)
==
ERROR_SUCCESS
)
{
DWORD
italic
,
bold
;
Face
*
face
;
face
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
face
));
face
->
cached_enum_data
=
NULL
;
face
->
file
=
HeapAlloc
(
GetProcessHeap
(),
0
,
needed
);
RegQueryValueExA
(
hkey_face
,
"File Name"
,
NULL
,
NULL
,
(
BYTE
*
)
face
->
file
,
&
needed
);
face
->
StyleName
=
strdupW
(
face_name
);
face
->
family
=
family
;
if
(
RegQueryValueExW
(
hkey_face
,
face_full_name_value
,
NULL
,
NULL
,
NULL
,
&
needed
)
==
ERROR_SUCCESS
)
{
WCHAR
*
fullName
=
HeapAlloc
(
GetProcessHeap
(),
0
,
needed
);
RegQueryValueExW
(
hkey_face
,
face_full_name_value
,
NULL
,
NULL
,
(
BYTE
*
)
fullName
,
&
needed
);
face
->
FullName
=
fullName
;
}
else
face
->
FullName
=
NULL
;
reg_load_dword
(
hkey_face
,
face_index_value
,
(
DWORD
*
)
&
face
->
face_index
);
reg_load_dword
(
hkey_face
,
face_italic_value
,
&
italic
);
reg_load_dword
(
hkey_face
,
face_bold_value
,
&
bold
);
reg_load_dword
(
hkey_face
,
face_version_value
,
(
DWORD
*
)
&
face
->
font_version
);
reg_load_dword
(
hkey_face
,
face_external_value
,
(
DWORD
*
)
&
face
->
external
);
needed
=
sizeof
(
face
->
fs
);
RegQueryValueExW
(
hkey_face
,
face_font_sig_value
,
NULL
,
NULL
,
(
BYTE
*
)
&
face
->
fs
,
&
needed
);
memset
(
&
face
->
fs_links
,
0
,
sizeof
(
face
->
fs_links
));
if
(
reg_load_dword
(
hkey_face
,
face_height_value
,
(
DWORD
*
)
&
face
->
size
.
height
)
!=
ERROR_SUCCESS
)
{
face
->
scalable
=
TRUE
;
memset
(
&
face
->
size
,
0
,
sizeof
(
face
->
size
));
}
else
{
face
->
scalable
=
FALSE
;
reg_load_dword
(
hkey_face
,
face_width_value
,
(
DWORD
*
)
&
face
->
size
.
width
);
reg_load_dword
(
hkey_face
,
face_size_value
,
(
DWORD
*
)
&
face
->
size
.
size
);
reg_load_dword
(
hkey_face
,
face_x_ppem_value
,
(
DWORD
*
)
&
face
->
size
.
x_ppem
);
reg_load_dword
(
hkey_face
,
face_y_ppem_value
,
(
DWORD
*
)
&
face
->
size
.
y_ppem
);
reg_load_dword
(
hkey_face
,
face_internal_leading_value
,
(
DWORD
*
)
&
face
->
size
.
internal_leading
);
TRACE
(
"Adding bitmap size h %d w %d size %ld x_ppem %ld y_ppem %ld
\n
"
,
face
->
size
.
height
,
face
->
size
.
width
,
face
->
size
.
size
>>
6
,
face
->
size
.
x_ppem
>>
6
,
face
->
size
.
y_ppem
>>
6
);
}
face
->
ntmFlags
=
0
;
if
(
italic
)
face
->
ntmFlags
|=
NTM_ITALIC
;
if
(
bold
)
face
->
ntmFlags
|=
NTM_BOLD
;
if
(
face
->
ntmFlags
==
0
)
face
->
ntmFlags
=
NTM_REGULAR
;
TRACE
(
"fsCsb = %08x %08x/%08x %08x %08x %08x
\n
"
,
face
->
fs
.
fsCsb
[
0
],
face
->
fs
.
fsCsb
[
1
],
face
->
fs
.
fsUsb
[
0
],
face
->
fs
.
fsUsb
[
1
],
face
->
fs
.
fsUsb
[
2
],
face
->
fs
.
fsUsb
[
3
]);
if
(
!
italic
&&
!
bold
)
list_add_head
(
&
family
->
faces
,
&
face
->
entry
);
else
list_add_tail
(
&
family
->
faces
,
&
face
->
entry
);
TRACE
(
"Added font %s %s
\n
"
,
debugstr_w
(
family
->
FamilyName
),
debugstr_w
(
face
->
StyleName
));
}
/* do we have any bitmap strikes? */
RegQueryInfoKeyW
(
hkey_face
,
NULL
,
NULL
,
NULL
,
&
num_strikes
,
&
max_strike_key_len
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
if
(
num_strikes
!=
0
)
{
WCHAR
strike_name
[
10
];
DWORD
strike_index
=
0
;
needed
=
sizeof
(
strike_name
)
/
sizeof
(
WCHAR
);
while
(
RegEnumKeyExW
(
hkey_face
,
strike_index
++
,
strike_name
,
&
needed
,
NULL
,
NULL
,
NULL
,
NULL
)
==
ERROR_SUCCESS
)
{
HKEY
hkey_strike
;
RegOpenKeyExW
(
hkey_face
,
strike_name
,
0
,
KEY_ALL_ACCESS
,
&
hkey_strike
);
load_face
(
hkey_strike
,
face_name
,
family
);
RegCloseKey
(
hkey_strike
);
needed
=
sizeof
(
strike_name
)
/
sizeof
(
WCHAR
);
}
}
}
static
void
load_font_list_from_cache
(
HKEY
hkey_font_cache
)
{
DWORD
max_family_key_len
,
size
;
WCHAR
*
family_name
;
DWORD
family_index
=
0
;
Family
*
family
;
HKEY
hkey_family
;
RegQueryInfoKeyW
(
hkey_font_cache
,
NULL
,
NULL
,
NULL
,
NULL
,
&
max_family_key_len
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
family_name
=
HeapAlloc
(
GetProcessHeap
(),
0
,
(
max_family_key_len
+
1
)
*
sizeof
(
WCHAR
));
size
=
max_family_key_len
+
1
;
while
(
RegEnumKeyExW
(
hkey_font_cache
,
family_index
++
,
family_name
,
&
size
,
NULL
,
NULL
,
NULL
,
NULL
)
==
ERROR_SUCCESS
)
{
WCHAR
*
english_family
=
NULL
;
DWORD
face_index
=
0
;
WCHAR
*
face_name
;
DWORD
max_face_key_len
;
RegOpenKeyExW
(
hkey_font_cache
,
family_name
,
0
,
KEY_ALL_ACCESS
,
&
hkey_family
);
TRACE
(
"opened family key %s
\n
"
,
debugstr_w
(
family_name
));
if
(
RegQueryValueExW
(
hkey_family
,
english_name_value
,
NULL
,
NULL
,
NULL
,
&
size
)
==
ERROR_SUCCESS
)
{
english_family
=
HeapAlloc
(
GetProcessHeap
(),
0
,
size
);
RegQueryValueExW
(
hkey_family
,
english_name_value
,
NULL
,
NULL
,
(
BYTE
*
)
english_family
,
&
size
);
}
family
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
family
));
family
->
FamilyName
=
strdupW
(
family_name
);
family
->
EnglishName
=
english_family
;
list_init
(
&
family
->
faces
);
list_add_tail
(
&
font_list
,
&
family
->
entry
);
if
(
english_family
)
{
FontSubst
*
subst
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
subst
));
subst
->
from
.
name
=
strdupW
(
english_family
);
subst
->
from
.
charset
=
-
1
;
subst
->
to
.
name
=
strdupW
(
family_name
);
subst
->
to
.
charset
=
-
1
;
add_font_subst
(
&
font_subst_list
,
subst
,
0
);
}
RegQueryInfoKeyW
(
hkey_family
,
NULL
,
NULL
,
NULL
,
NULL
,
&
max_face_key_len
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
NULL
);
face_name
=
HeapAlloc
(
GetProcessHeap
(),
0
,
(
max_face_key_len
+
1
)
*
sizeof
(
WCHAR
));
size
=
max_face_key_len
+
1
;
while
(
RegEnumKeyExW
(
hkey_family
,
face_index
++
,
face_name
,
&
size
,
NULL
,
NULL
,
NULL
,
NULL
)
==
ERROR_SUCCESS
)
{
HKEY
hkey_face
;
RegOpenKeyExW
(
hkey_family
,
face_name
,
0
,
KEY_ALL_ACCESS
,
&
hkey_face
);
load_face
(
hkey_face
,
face_name
,
family
);
RegCloseKey
(
hkey_face
);
size
=
max_face_key_len
+
1
;
}
HeapFree
(
GetProcessHeap
(),
0
,
face_name
);
RegCloseKey
(
hkey_family
);
size
=
max_family_key_len
+
1
;
}
HeapFree
(
GetProcessHeap
(),
0
,
family_name
);
}
static
LONG
create_font_cache_key
(
HKEY
*
hkey
,
DWORD
*
disposition
)
{
LONG
ret
;
...
...
@@ -3005,7 +3179,10 @@ BOOL WineEngInit(void)
create_font_cache_key
(
&
hkey_font_cache
,
&
disposition
);
if
(
disposition
==
REG_CREATED_NEW_KEY
)
init_font_list
();
else
load_font_list_from_cache
(
hkey_font_cache
);
RegCloseKey
(
hkey_font_cache
);
...
...
@@ -3013,6 +3190,8 @@ BOOL WineEngInit(void)
LoadSubstList
();
DumpSubstList
();
LoadReplaceList
();
if
(
disposition
==
REG_CREATED_NEW_KEY
)
update_reg_entries
();
update_system_links
();
...
...
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