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
35c84cdd
Commit
35c84cdd
authored
Mar 30, 2012
by
Kusanagi Kouichi
Committed by
Alexandre Julliard
Mar 30, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdi32: Use helper functions when loading font from cache.
parent
40427f1a
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
105 additions
and
116 deletions
+105
-116
freetype.c
dlls/gdi32/freetype.c
+105
-116
No files found.
dlls/gdi32/freetype.c
View file @
35c84cdd
...
...
@@ -1190,6 +1190,109 @@ static WCHAR *get_face_name(FT_Face ft_face, FT_UShort name_id, FT_UShort langua
return
ret
;
}
static
inline
BOOL
faces_equal
(
const
Face
*
f1
,
const
Face
*
f2
)
{
if
(
strcmpiW
(
f1
->
StyleName
,
f2
->
StyleName
))
return
FALSE
;
if
(
f1
->
scalable
)
return
TRUE
;
if
(
f2
->
size
.
y_ppem
!=
f2
->
size
.
y_ppem
)
return
FALSE
;
return
!
memcmp
(
&
f1
->
fs
,
&
f2
->
fs
,
sizeof
(
f1
->
fs
)
);
}
static
inline
void
free_face
(
Face
*
face
)
{
HeapFree
(
GetProcessHeap
(),
0
,
face
->
file
);
HeapFree
(
GetProcessHeap
(),
0
,
face
->
StyleName
);
HeapFree
(
GetProcessHeap
(),
0
,
face
->
FullName
);
HeapFree
(
GetProcessHeap
(),
0
,
face
->
cached_enum_data
);
HeapFree
(
GetProcessHeap
(),
0
,
face
);
}
static
inline
void
free_family
(
Family
*
family
)
{
Face
*
face
,
*
cursor2
;
LIST_FOR_EACH_ENTRY_SAFE
(
face
,
cursor2
,
&
family
->
faces
,
Face
,
entry
)
{
list_remove
(
&
face
->
entry
);
free_face
(
face
);
}
HeapFree
(
GetProcessHeap
(),
0
,
family
->
FamilyName
);
HeapFree
(
GetProcessHeap
(),
0
,
family
->
EnglishName
);
HeapFree
(
GetProcessHeap
(),
0
,
family
);
}
static
inline
int
style_order
(
const
Face
*
face
)
{
switch
(
face
->
ntmFlags
&
(
NTM_REGULAR
|
NTM_BOLD
|
NTM_ITALIC
))
{
case
NTM_REGULAR
:
return
0
;
case
NTM_BOLD
:
return
1
;
case
NTM_ITALIC
:
return
2
;
case
NTM_BOLD
|
NTM_ITALIC
:
return
3
;
default:
WARN
(
"Don't know how to order font %s %s with flags 0x%08x
\n
"
,
debugstr_w
(
face
->
family
->
FamilyName
),
debugstr_w
(
face
->
StyleName
),
face
->
ntmFlags
);
return
9999
;
}
}
static
BOOL
insert_face_in_family_list
(
Face
*
face
,
Family
*
family
)
{
Face
*
cursor
;
LIST_FOR_EACH_ENTRY
(
cursor
,
&
family
->
faces
,
Face
,
entry
)
{
if
(
faces_equal
(
face
,
cursor
))
{
TRACE
(
"Already loaded font %s %s original version is %lx, this version is %lx
\n
"
,
debugstr_w
(
family
->
FamilyName
),
debugstr_w
(
face
->
StyleName
),
cursor
->
font_version
,
face
->
font_version
);
if
(
face
->
font_version
<=
cursor
->
font_version
)
{
TRACE
(
"Original font is newer so skipping this one
\n
"
);
return
FALSE
;
}
else
{
TRACE
(
"Replacing original with this one
\n
"
);
list_add_before
(
&
cursor
->
entry
,
&
face
->
entry
);
face
->
family
=
family
;
list_remove
(
&
cursor
->
entry
);
free_face
(
cursor
);
return
TRUE
;
}
}
if
(
style_order
(
face
)
<
style_order
(
cursor
))
break
;
}
list_add_before
(
&
cursor
->
entry
,
&
face
->
entry
);
face
->
family
=
family
;
return
TRUE
;
}
/****************************************************************
* NB This function stores the ptrs to the strings to save copying.
* Don't free them after calling.
*/
static
Family
*
create_family
(
WCHAR
*
name
,
WCHAR
*
english_name
)
{
Family
*
const
family
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
family
)
);
family
->
FamilyName
=
name
;
family
->
EnglishName
=
english_name
;
list_init
(
&
family
->
faces
);
family
->
replacement
=
&
family
->
faces
;
return
family
;
}
static
LONG
reg_load_dword
(
HKEY
hkey
,
const
WCHAR
*
value
,
DWORD
*
data
)
{
DWORD
type
,
needed
;
...
...
@@ -1222,7 +1325,6 @@ static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family)
RegQueryValueExA
(
hkey_face
,
"File Name"
,
NULL
,
NULL
,
(
BYTE
*
)
face
->
file
,
&
needed
);
face
->
StyleName
=
strdupW
(
face_name
);
face
->
family
=
family
;
face
->
vertical
=
(
family
->
FamilyName
[
0
]
==
'@'
);
if
(
RegQueryValueExW
(
hkey_face
,
face_full_name_value
,
NULL
,
NULL
,
NULL
,
&
needed
)
==
ERROR_SUCCESS
)
...
...
@@ -1272,10 +1374,7 @@ static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family)
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
);
insert_face_in_family_list
(
face
,
family
);
TRACE
(
"Added font %s %s
\n
"
,
debugstr_w
(
family
->
FamilyName
),
debugstr_w
(
face
->
StyleName
));
}
...
...
@@ -1330,11 +1429,7 @@ static void load_font_list_from_cache(HKEY hkey_font_cache)
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
);
family
->
replacement
=
&
family
->
faces
;
family
=
create_family
(
strdupW
(
family_name
),
english_family
);
list_add_tail
(
&
font_list
,
&
family
->
entry
);
if
(
english_family
)
...
...
@@ -1443,30 +1538,6 @@ static void add_face_to_cache(Face *face)
RegCloseKey
(
hkey_font_cache
);
}
static
inline
int
TestStyles
(
DWORD
flags
,
DWORD
styles
)
{
return
(
flags
&
styles
)
==
styles
;
}
static
inline
int
style_order
(
Face
*
face
)
{
if
(
TestStyles
(
face
->
ntmFlags
,
NTM_BOLD
|
NTM_ITALIC
))
return
3
;
if
(
TestStyles
(
face
->
ntmFlags
,
NTM_ITALIC
))
return
2
;
if
(
TestStyles
(
face
->
ntmFlags
,
NTM_BOLD
))
return
1
;
if
(
TestStyles
(
face
->
ntmFlags
,
NTM_REGULAR
))
return
0
;
WARN
(
"Don't know how to order font %s %s with flags 0x%08x
\n
"
,
debugstr_w
(
face
->
family
->
FamilyName
),
debugstr_w
(
face
->
StyleName
),
face
->
ntmFlags
);
return
9999
;
}
static
WCHAR
*
prepend_at
(
WCHAR
*
family
)
{
WCHAR
*
str
;
...
...
@@ -1505,21 +1576,6 @@ static void get_family_names( FT_Face ft_face, WCHAR **name, WCHAR **english, BO
}
}
/****************************************************************
* NB This function stores the ptrs to the strings to save copying.
* Don't free them after calling.
*/
static
Family
*
create_family
(
WCHAR
*
name
,
WCHAR
*
english_name
)
{
Family
*
family
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
family
)
);
family
->
FamilyName
=
name
;
family
->
EnglishName
=
english_name
;
list_init
(
&
family
->
faces
);
family
->
replacement
=
&
family
->
faces
;
return
family
;
}
static
Family
*
get_family
(
FT_Face
ft_face
,
BOOL
vertical
)
{
Family
*
family
;
...
...
@@ -1653,29 +1709,6 @@ static inline void get_fontsig( FT_Face ft_face, FONTSIGNATURE *fs )
}
}
static
inline
void
free_face
(
Face
*
face
)
{
HeapFree
(
GetProcessHeap
(),
0
,
face
->
file
);
HeapFree
(
GetProcessHeap
(),
0
,
face
->
StyleName
);
HeapFree
(
GetProcessHeap
(),
0
,
face
->
FullName
);
HeapFree
(
GetProcessHeap
(),
0
,
face
->
cached_enum_data
);
HeapFree
(
GetProcessHeap
(),
0
,
face
);
}
static
inline
void
free_family
(
Family
*
family
)
{
Face
*
face
,
*
cursor2
;
LIST_FOR_EACH_ENTRY_SAFE
(
face
,
cursor2
,
&
family
->
faces
,
Face
,
entry
)
{
list_remove
(
&
face
->
entry
);
free_face
(
face
);
}
HeapFree
(
GetProcessHeap
(),
0
,
family
->
FamilyName
);
HeapFree
(
GetProcessHeap
(),
0
,
family
->
EnglishName
);
HeapFree
(
GetProcessHeap
(),
0
,
family
);
}
#define ADDFONT_EXTERNAL_FONT 0x01
#define ADDFONT_FORCE_BITMAP 0x02
#define ADDFONT_ADD_TO_CACHE 0x04
...
...
@@ -1738,50 +1771,6 @@ static Face *create_face( FT_Face ft_face, FT_Long face_index, const char *file,
return
face
;
}
static
inline
BOOL
faces_equal
(
Face
*
f1
,
Face
*
f2
)
{
if
(
strcmpiW
(
f1
->
StyleName
,
f2
->
StyleName
))
return
FALSE
;
if
(
f1
->
scalable
)
return
TRUE
;
if
(
f2
->
size
.
y_ppem
!=
f2
->
size
.
y_ppem
)
return
FALSE
;
return
!
memcmp
(
&
f1
->
fs
,
&
f2
->
fs
,
sizeof
(
f1
->
fs
)
);
}
static
BOOL
insert_face_in_family_list
(
Face
*
face
,
Family
*
family
)
{
Face
*
cursor
;
LIST_FOR_EACH_ENTRY
(
cursor
,
&
family
->
faces
,
Face
,
entry
)
{
if
(
faces_equal
(
face
,
cursor
))
{
TRACE
(
"Already loaded font %s %s original version is %lx, this version is %lx
\n
"
,
debugstr_w
(
family
->
FamilyName
),
debugstr_w
(
face
->
StyleName
),
cursor
->
font_version
,
face
->
font_version
);
if
(
face
->
font_version
<=
cursor
->
font_version
)
{
TRACE
(
"Original font is newer so skipping this one
\n
"
);
return
FALSE
;
}
else
{
TRACE
(
"Replacing original with this one
\n
"
);
list_add_before
(
&
cursor
->
entry
,
&
face
->
entry
);
face
->
family
=
family
;
list_remove
(
&
cursor
->
entry
);
free_face
(
cursor
);
return
TRUE
;
}
}
if
(
style_order
(
face
)
<
style_order
(
cursor
))
break
;
}
list_add_before
(
&
cursor
->
entry
,
&
face
->
entry
);
face
->
family
=
family
;
return
TRUE
;
}
static
void
AddFaceToList
(
FT_Face
ft_face
,
const
char
*
file
,
void
*
font_data_ptr
,
DWORD
font_data_size
,
FT_Long
face_index
,
DWORD
flags
,
BOOL
vertical
)
{
...
...
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