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
c1f8a0bf
Commit
c1f8a0bf
authored
Nov 01, 2012
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdi32: Avoid some redundant registry calls while loading the font cache.
parent
3d013afe
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
45 additions
and
65 deletions
+45
-65
freetype.c
dlls/gdi32/freetype.c
+45
-65
No files found.
dlls/gdi32/freetype.c
View file @
c1f8a0bf
...
...
@@ -1298,11 +1298,15 @@ static Family *create_family( WCHAR *name, WCHAR *english_name )
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
);
DWORD
type
,
size
=
sizeof
(
DWORD
);
if
(
RegQueryValueExW
(
hkey
,
value
,
NULL
,
&
type
,
(
BYTE
*
)
data
,
&
size
)
||
type
!=
REG_DWORD
||
size
!=
sizeof
(
DWORD
))
{
*
data
=
0
;
return
ERROR_BAD_CONFIGURATION
;
}
return
ERROR_SUCCESS
;
}
static
inline
LONG
reg_save_dword
(
HKEY
hkey
,
const
WCHAR
*
value
,
DWORD
data
)
...
...
@@ -1310,30 +1314,26 @@ 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
)
static
void
load_face
(
HKEY
hkey_face
,
WCHAR
*
face_name
,
Family
*
family
,
void
*
buffer
,
DWORD
buffer_size
)
{
DWORD
needed
;
DWORD
num_strikes
,
max_strike_key_len
;
DWORD
needed
,
strike_index
=
0
;
HKEY
hkey_strike
;
/* 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
)
needed
=
buffer_size
;
if
(
RegQueryValueExA
(
hkey_face
,
"File Name"
,
NULL
,
NULL
,
buffer
,
&
needed
)
==
ERROR_SUCCESS
)
{
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
->
file
=
strdupA
(
buffer
);
face
->
StyleName
=
strdupW
(
face_name
);
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
;
}
needed
=
buffer_size
;
if
(
RegQueryValueExW
(
hkey_face
,
face_full_name_value
,
NULL
,
NULL
,
buffer
,
&
needed
)
==
ERROR_SUCCESS
)
face
->
FullName
=
strdupW
(
buffer
);
else
face
->
FullName
=
NULL
;
...
...
@@ -1374,57 +1374,41 @@ static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family)
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
;
/* load bitmap strikes */
needed
=
sizeof
(
strike_name
)
/
sizeof
(
WCHAR
);
while
(
RegEnumKeyExW
(
hkey_face
,
strike_index
++
,
strike_name
,
&
needed
,
NULL
,
NULL
,
NULL
,
NULL
)
==
ERROR_SUCCESS
)
needed
=
buffer_size
;
while
(
!
RegEnumKeyExW
(
hkey_face
,
strike_index
++
,
buffer
,
&
needed
,
NULL
,
NULL
,
NULL
,
NULL
))
{
if
(
!
RegOpenKeyExW
(
hkey_face
,
buffer
,
0
,
KEY_ALL_ACCESS
,
&
hkey_strike
))
{
HKEY
hkey_strike
;
RegOpenKeyExW
(
hkey_face
,
strike_name
,
0
,
KEY_ALL_ACCESS
,
&
hkey_strike
);
load_face
(
hkey_strike
,
face_name
,
family
);
load_face
(
hkey_strike
,
face_name
,
family
,
buffer
,
buffer_size
);
RegCloseKey
(
hkey_strike
);
needed
=
sizeof
(
strike_name
)
/
sizeof
(
WCHAR
);
}
needed
=
buffer_size
;
}
}
static
void
load_font_list_from_cache
(
HKEY
hkey_font_cache
)
{
DWORD
max_family_key_len
,
size
;
WCHAR
*
family_name
;
DWORD
family_index
=
0
;
DWORD
size
,
family_index
=
0
;
Family
*
family
;
HKEY
hkey_family
;
WCHAR
buffer
[
4096
];
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
)
size
=
sizeof
(
buffer
);
while
(
!
RegEnumKeyExW
(
hkey_font_cache
,
family_index
++
,
buffer
,
&
size
,
NULL
,
NULL
,
NULL
,
NULL
))
{
WCHAR
*
english_family
=
NULL
;
WCHAR
*
family_name
=
strdupW
(
buffer
);
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
);
}
size
=
sizeof
(
buffer
);
if
(
!
RegQueryValueExW
(
hkey_family
,
english_name_value
,
NULL
,
NULL
,
(
BYTE
*
)
buffer
,
&
size
))
english_family
=
strdupW
(
buffer
);
family
=
create_family
(
strdupW
(
family_name
)
,
english_family
);
family
=
create_family
(
family_name
,
english_family
);
list_add_tail
(
&
font_list
,
&
family
->
entry
);
if
(
english_family
)
...
...
@@ -1437,27 +1421,23 @@ static void load_font_list_from_cache(HKEY hkey_font_cache)
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
)
size
=
sizeof
(
buffer
);
while
(
!
RegEnumKeyExW
(
hkey_family
,
face_index
++
,
buffer
,
&
size
,
NULL
,
NULL
,
NULL
,
NULL
))
{
WCHAR
*
face_name
=
strdupW
(
buffer
);
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
;
if
(
!
RegOpenKeyExW
(
hkey_family
,
face_name
,
0
,
KEY_ALL_ACCESS
,
&
hkey_face
))
{
load_face
(
hkey_face
,
face_name
,
family
,
buffer
,
sizeof
(
buffer
));
RegCloseKey
(
hkey_face
);
}
HeapFree
(
GetProcessHeap
(),
0
,
face_name
);
size
=
sizeof
(
buffer
);
}
HeapFree
(
GetProcessHeap
(),
0
,
face_name
);
RegCloseKey
(
hkey_family
);
size
=
max_family_key_len
+
1
;
size
=
sizeof
(
buffer
)
;
}
HeapFree
(
GetProcessHeap
(),
0
,
family_name
);
}
static
LONG
create_font_cache_key
(
HKEY
*
hkey
,
DWORD
*
disposition
)
...
...
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