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
de63a647
Commit
de63a647
authored
Nov 03, 2020
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdi32: Move the default AA flags handling out of freetype.c.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
e4df6f87
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
140 additions
and
172 deletions
+140
-172
driver.c
dlls/gdi32/driver.c
+5
-0
font.c
dlls/gdi32/font.c
+101
-108
freetype.c
dlls/gdi32/freetype.c
+32
-62
gdi_private.h
dlls/gdi32/gdi_private.h
+2
-2
No files found.
dlls/gdi32/driver.c
View file @
de63a647
...
...
@@ -651,6 +651,11 @@ static HBRUSH CDECL nulldrv_SelectBrush( PHYSDEV dev, HBRUSH brush, const struct
return
brush
;
}
static
HFONT
CDECL
nulldrv_SelectFont
(
PHYSDEV
dev
,
HFONT
font
,
UINT
*
aa_flags
)
{
return
font
;
}
static
HPALETTE
CDECL
nulldrv_SelectPalette
(
PHYSDEV
dev
,
HPALETTE
palette
,
BOOL
bkgnd
)
{
return
palette
;
...
...
dlls/gdi32/font.c
View file @
de63a647
...
...
@@ -60,6 +60,10 @@ static const struct font_backend_funcs *font_funcs;
static
const
MAT2
identity
=
{
{
0
,
1
},
{
0
,
0
},
{
0
,
0
},
{
0
,
1
}
};
static
UINT
font_smoothing
=
GGO_BITMAP
;
static
UINT
subpixel_orientation
=
GGO_GRAY4_BITMAP
;
static
BOOL
antialias_fakes
=
TRUE
;
/* Device -> World size conversion */
/* Performs a device to world transformation on the specified width (which
...
...
@@ -1636,6 +1640,7 @@ static void release_gdi_font( struct gdi_font *font )
TRACE
(
"font %p
\n
"
,
font
);
/* add it to the unused list */
EnterCriticalSection
(
&
font_cs
);
list_add_head
(
&
unused_gdi_font_list
,
&
font
->
unused_entry
);
if
(
unused_font_count
>
UNUSED_CACHE_SIZE
)
{
...
...
@@ -1644,9 +1649,9 @@ static void release_gdi_font( struct gdi_font *font )
list_remove
(
&
font
->
entry
);
list_remove
(
&
font
->
unused_entry
);
free_gdi_font
(
font
);
return
;
}
unused_font_count
++
;
else
unused_font_count
++
;
LeaveCriticalSection
(
&
font_cs
);
}
static
void
add_font_list
(
HKEY
hkey
,
const
struct
nls_update_font_list
*
fl
,
int
dpi
)
...
...
@@ -2929,27 +2934,46 @@ static BOOL CDECL font_GetTextMetrics( PHYSDEV dev, TEXTMETRICW *metrics )
*/
static
HFONT
CDECL
font_SelectFont
(
PHYSDEV
dev
,
HFONT
hfont
,
UINT
*
aa_flags
)
{
UINT
default_aa_flags
=
*
aa_flags
;
struct
font_physdev
*
physdev
=
get_font_dev
(
dev
);
struct
gdi_font
*
prev
=
physdev
->
font
;
struct
gdi_font
*
font
=
NULL
,
*
prev
=
physdev
->
font
;
DC
*
dc
=
get_physdev_dc
(
dev
);
if
(
!
default_aa_flags
)
{
PHYSDEV
next
=
GET_NEXT_PHYSDEV
(
dev
,
pSelectFont
);
next
->
funcs
->
pSelectFont
(
next
,
hfont
,
&
default_aa_flags
);
}
if
(
hfont
)
{
LOGFONTW
lf
;
GetObjectW
(
hfont
,
sizeof
(
lf
),
&
lf
);
switch
(
lf
.
lfQuality
)
{
case
NONANTIALIASED_QUALITY
:
if
(
!*
aa_flags
)
*
aa_flags
=
GGO_BITMAP
;
break
;
case
ANTIALIASED_QUALITY
:
if
(
!*
aa_flags
)
*
aa_flags
=
GGO_GRAY4_BITMAP
;
break
;
}
EnterCriticalSection
(
&
font_cs
);
physdev
->
font
=
font_funcs
->
pSelectFont
(
dc
,
hfont
,
aa_flags
,
default_aa_flags
);
font
=
font_funcs
->
pSelectFont
(
dc
,
hfont
);
if
(
font
&&
!*
aa_flags
)
{
*
aa_flags
=
font
->
aa_flags
;
if
(
!*
aa_flags
)
{
if
(
lf
.
lfQuality
==
CLEARTYPE_QUALITY
||
lf
.
lfQuality
==
CLEARTYPE_NATURAL_QUALITY
)
*
aa_flags
=
subpixel_orientation
;
else
*
aa_flags
=
font_smoothing
;
}
*
aa_flags
=
font_funcs
->
get_aa_flags
(
font
,
*
aa_flags
,
antialias_fakes
);
}
TRACE
(
"%p %s %d aa %x
\n
"
,
hfont
,
debugstr_w
(
lf
.
lfFaceName
),
lf
.
lfHeight
,
*
aa_flags
);
LeaveCriticalSection
(
&
font_cs
);
}
else
physdev
->
font
=
NULL
;
/* notification that the font has been changed by another driver */
physdev
->
font
=
font
;
if
(
prev
)
release_gdi_font
(
prev
);
return
physdev
->
font
?
hfont
:
0
;
return
font
?
hfont
:
0
;
}
...
...
@@ -3089,6 +3113,68 @@ const struct gdi_dc_funcs font_driver =
GDI_PRIORITY_FONT_DRV
/* priority */
};
static
DWORD
get_key_value
(
HKEY
key
,
const
WCHAR
*
name
,
DWORD
*
value
)
{
WCHAR
buf
[
12
];
DWORD
count
=
sizeof
(
buf
),
type
,
err
;
err
=
RegQueryValueExW
(
key
,
name
,
NULL
,
&
type
,
(
BYTE
*
)
buf
,
&
count
);
if
(
!
err
)
{
if
(
type
==
REG_DWORD
)
memcpy
(
value
,
buf
,
sizeof
(
*
value
)
);
else
*
value
=
atoiW
(
buf
);
}
return
err
;
}
static
void
init_font_options
(
void
)
{
static
const
WCHAR
antialias_fake_bold_or_italic
[]
=
{
'A'
,
'n'
,
't'
,
'i'
,
'a'
,
'l'
,
'i'
,
'a'
,
's'
,
'F'
,
'a'
,
'k'
,
'e'
,
'B'
,
'o'
,
'l'
,
'd'
,
'O'
,
'r'
,
'I'
,
't'
,
'a'
,
'l'
,
'i'
,
'c'
,
0
};
static
const
WCHAR
true_options
[]
=
{
'y'
,
'Y'
,
't'
,
'T'
,
'1'
,
0
};
static
const
WCHAR
desktopW
[]
=
{
'C'
,
'o'
,
'n'
,
't'
,
'r'
,
'o'
,
'l'
,
' '
,
'P'
,
'a'
,
'n'
,
'e'
,
'l'
,
'\\'
,
'D'
,
'e'
,
's'
,
'k'
,
't'
,
'o'
,
'p'
,
0
};
static
const
WCHAR
smoothing
[]
=
{
'F'
,
'o'
,
'n'
,
't'
,
'S'
,
'm'
,
'o'
,
'o'
,
't'
,
'h'
,
'i'
,
'n'
,
'g'
,
0
};
static
const
WCHAR
smoothing_type
[]
=
{
'F'
,
'o'
,
'n'
,
't'
,
'S'
,
'm'
,
'o'
,
'o'
,
't'
,
'h'
,
'i'
,
'n'
,
'g'
,
'T'
,
'y'
,
'p'
,
'e'
,
0
};
static
const
WCHAR
smoothing_orientation
[]
=
{
'F'
,
'o'
,
'n'
,
't'
,
'S'
,
'm'
,
'o'
,
'o'
,
't'
,
'h'
,
'i'
,
'n'
,
'g'
,
'O'
,
'r'
,
'i'
,
'e'
,
'n'
,
't'
,
'a'
,
't'
,
'i'
,
'o'
,
'n'
,
0
};
HKEY
key
;
DWORD
type
,
size
,
val
;
WCHAR
buffer
[
20
];
size
=
sizeof
(
buffer
);
if
(
!
RegQueryValueExW
(
wine_fonts_key
,
antialias_fake_bold_or_italic
,
NULL
,
&
type
,
(
BYTE
*
)
buffer
,
&
size
)
&&
type
==
REG_SZ
&&
size
>=
1
)
{
antialias_fakes
=
(
strchrW
(
true_options
,
buffer
[
0
])
!=
NULL
);
}
if
(
!
RegOpenKeyW
(
HKEY_CURRENT_USER
,
desktopW
,
&
key
))
{
/* FIXME: handle vertical orientations even though Windows doesn't */
if
(
!
get_key_value
(
key
,
smoothing_orientation
,
&
val
))
{
switch
(
val
)
{
case
0
:
/* FE_FONTSMOOTHINGORIENTATIONBGR */
subpixel_orientation
=
WINE_GGO_HBGR_BITMAP
;
break
;
case
1
:
/* FE_FONTSMOOTHINGORIENTATIONRGB */
subpixel_orientation
=
WINE_GGO_HRGB_BITMAP
;
break
;
}
}
if
(
!
get_key_value
(
key
,
smoothing
,
&
val
)
&&
val
/* enabled */
)
{
if
(
!
get_key_value
(
key
,
smoothing_type
,
&
val
)
&&
val
==
2
/* FE_FONTSMOOTHINGCLEARTYPE */
)
font_smoothing
=
subpixel_orientation
;
else
font_smoothing
=
GGO_GRAY4_BITMAP
;
}
RegCloseKey
(
key
);
}
}
/***********************************************************************
* font_init
*/
...
...
@@ -3098,6 +3184,7 @@ void font_init(void)
KEY_ALL_ACCESS
,
NULL
,
&
wine_fonts_key
,
NULL
))
return
;
init_font_options
();
update_codepage
();
WineEngInit
(
&
font_funcs
);
load_gdi_font_subst
();
...
...
@@ -3206,54 +3293,6 @@ static void FONT_NewTextMetricExWToA(const NEWTEXTMETRICEXW *ptmW, NEWTEXTMETRIC
memcpy
(
&
ptmA
->
ntmFontSig
,
&
ptmW
->
ntmFontSig
,
sizeof
(
FONTSIGNATURE
));
}
static
DWORD
get_key_value
(
HKEY
key
,
const
WCHAR
*
name
,
DWORD
*
value
)
{
WCHAR
buf
[
12
];
DWORD
count
=
sizeof
(
buf
),
type
,
err
;
err
=
RegQueryValueExW
(
key
,
name
,
NULL
,
&
type
,
(
BYTE
*
)
buf
,
&
count
);
if
(
!
err
)
{
if
(
type
==
REG_DWORD
)
memcpy
(
value
,
buf
,
sizeof
(
*
value
)
);
else
*
value
=
atoiW
(
buf
);
}
return
err
;
}
static
UINT
get_subpixel_orientation
(
HKEY
key
)
{
static
const
WCHAR
smoothing_orientation
[]
=
{
'F'
,
'o'
,
'n'
,
't'
,
'S'
,
'm'
,
'o'
,
'o'
,
't'
,
'h'
,
'i'
,
'n'
,
'g'
,
'O'
,
'r'
,
'i'
,
'e'
,
'n'
,
't'
,
'a'
,
't'
,
'i'
,
'o'
,
'n'
,
0
};
DWORD
orient
;
/* FIXME: handle vertical orientations even though Windows doesn't */
if
(
get_key_value
(
key
,
smoothing_orientation
,
&
orient
))
return
GGO_GRAY4_BITMAP
;
switch
(
orient
)
{
case
0
:
/* FE_FONTSMOOTHINGORIENTATIONBGR */
return
WINE_GGO_HBGR_BITMAP
;
case
1
:
/* FE_FONTSMOOTHINGORIENTATIONRGB */
return
WINE_GGO_HRGB_BITMAP
;
}
return
GGO_GRAY4_BITMAP
;
}
static
UINT
get_default_smoothing
(
HKEY
key
)
{
static
const
WCHAR
smoothing
[]
=
{
'F'
,
'o'
,
'n'
,
't'
,
'S'
,
'm'
,
'o'
,
'o'
,
't'
,
'h'
,
'i'
,
'n'
,
'g'
,
0
};
static
const
WCHAR
smoothing_type
[]
=
{
'F'
,
'o'
,
'n'
,
't'
,
'S'
,
'm'
,
'o'
,
'o'
,
't'
,
'h'
,
'i'
,
'n'
,
'g'
,
'T'
,
'y'
,
'p'
,
'e'
,
0
};
DWORD
enabled
,
type
;
if
(
get_key_value
(
key
,
smoothing
,
&
enabled
))
return
0
;
if
(
!
enabled
)
return
GGO_BITMAP
;
if
(
!
get_key_value
(
key
,
smoothing_type
,
&
type
)
&&
type
==
2
/* FE_FONTSMOOTHINGCLEARTYPE */
)
return
get_subpixel_orientation
(
key
);
return
GGO_GRAY4_BITMAP
;
}
/* compute positions for text rendering, in device coords */
static
BOOL
get_char_positions
(
DC
*
dc
,
const
WCHAR
*
str
,
INT
count
,
INT
*
dx
,
SIZE
*
size
)
{
...
...
@@ -3809,52 +3848,6 @@ static BOOL FONT_DeleteObject( HGDIOBJ handle )
/***********************************************************************
* nulldrv_SelectFont
*/
HFONT
CDECL
nulldrv_SelectFont
(
PHYSDEV
dev
,
HFONT
font
,
UINT
*
aa_flags
)
{
static
const
WCHAR
desktopW
[]
=
{
'C'
,
'o'
,
'n'
,
't'
,
'r'
,
'o'
,
'l'
,
' '
,
'P'
,
'a'
,
'n'
,
'e'
,
'l'
,
'\\'
,
'D'
,
'e'
,
's'
,
'k'
,
't'
,
'o'
,
'p'
,
0
};
static
int
orientation
=
-
1
,
smoothing
=
-
1
;
LOGFONTW
lf
;
HKEY
key
;
if
(
*
aa_flags
)
return
0
;
GetObjectW
(
font
,
sizeof
(
lf
),
&
lf
);
switch
(
lf
.
lfQuality
)
{
case
NONANTIALIASED_QUALITY
:
*
aa_flags
=
GGO_BITMAP
;
break
;
case
ANTIALIASED_QUALITY
:
*
aa_flags
=
GGO_GRAY4_BITMAP
;
break
;
case
CLEARTYPE_QUALITY
:
case
CLEARTYPE_NATURAL_QUALITY
:
if
(
orientation
==
-
1
)
{
if
(
RegOpenKeyW
(
HKEY_CURRENT_USER
,
desktopW
,
&
key
))
break
;
orientation
=
get_subpixel_orientation
(
key
);
RegCloseKey
(
key
);
}
*
aa_flags
=
orientation
;
break
;
default:
if
(
smoothing
==
-
1
)
{
if
(
RegOpenKeyW
(
HKEY_CURRENT_USER
,
desktopW
,
&
key
))
break
;
smoothing
=
get_default_smoothing
(
key
);
RegCloseKey
(
key
);
}
*
aa_flags
=
smoothing
;
break
;
}
return
0
;
}
/***********************************************************************
* FONT_EnumInstance
*
* Note: plf is really an ENUMLOGFONTEXW, and ptm is a NEWTEXTMETRICEXW.
...
...
dlls/gdi32/freetype.c
View file @
de63a647
...
...
@@ -323,7 +323,6 @@ static struct list mappings_list = LIST_INIT( mappings_list );
static
UINT
default_aa_flags
;
static
HKEY
hkey_font_cache
;
static
BOOL
antialias_fakes
=
TRUE
;
static
const
WCHAR
font_mutex_nameW
[]
=
{
'_'
,
'_'
,
'W'
,
'I'
,
'N'
,
'E'
,
'_'
,
'F'
,
'O'
,
'N'
,
'T'
,
'_'
,
'M'
,
'U'
,
'T'
,
'E'
,
'X'
,
'_'
,
'_'
,
'\0'
};
...
...
@@ -2248,7 +2247,6 @@ static void reorder_font_list(void)
*/
BOOL
WineEngInit
(
const
struct
font_backend_funcs
**
funcs
)
{
HKEY
hkey
;
DWORD
disposition
;
HANDLE
font_mutex
;
...
...
@@ -2260,23 +2258,6 @@ BOOL WineEngInit( const struct font_backend_funcs **funcs )
*
funcs
=
&
font_funcs
;
if
(
!
RegOpenKeyExW
(
HKEY_CURRENT_USER
,
wine_fonts_key
,
0
,
KEY_READ
,
&
hkey
))
{
static
const
WCHAR
antialias_fake_bold_or_italic
[]
=
{
'A'
,
'n'
,
't'
,
'i'
,
'a'
,
'l'
,
'i'
,
'a'
,
's'
,
'F'
,
'a'
,
'k'
,
'e'
,
'B'
,
'o'
,
'l'
,
'd'
,
'O'
,
'r'
,
'I'
,
't'
,
'a'
,
'l'
,
'i'
,
'c'
,
0
};
static
const
WCHAR
true_options
[]
=
{
'y'
,
'Y'
,
't'
,
'T'
,
'1'
,
0
};
DWORD
type
,
size
;
WCHAR
buffer
[
20
];
size
=
sizeof
(
buffer
);
if
(
!
RegQueryValueExW
(
hkey
,
antialias_fake_bold_or_italic
,
NULL
,
&
type
,
(
BYTE
*
)
buffer
,
&
size
)
&&
type
==
REG_SZ
&&
size
>=
1
)
{
antialias_fakes
=
(
strchrW
(
true_options
,
buffer
[
0
])
!=
NULL
);
}
RegCloseKey
(
hkey
);
}
if
((
font_mutex
=
CreateMutexW
(
NULL
,
FALSE
,
font_mutex_nameW
))
==
NULL
)
{
ERR
(
"Failed to create font mutex
\n
"
);
...
...
@@ -2972,8 +2953,7 @@ static BOOL CDECL freetype_load_font( struct gdi_font *font )
/*************************************************************
* freetype_SelectFont
*/
static
struct
gdi_font
*
CDECL
freetype_SelectFont
(
DC
*
dc
,
HFONT
hfont
,
UINT
*
aa_flags
,
UINT
default_aa_flags
)
static
struct
gdi_font
*
CDECL
freetype_SelectFont
(
DC
*
dc
,
HFONT
hfont
)
{
struct
gdi_font
*
font
;
Face
*
face
,
*
best
,
*
best_bitmap
;
...
...
@@ -3032,7 +3012,7 @@ static struct gdi_font * CDECL freetype_SelectFont( DC *dc, HFONT hfont, UINT *a
/* check the cache first */
if
((
font
=
find_cached_gdi_font
(
&
lf
,
&
dcmat
,
can_use_bitmap
)))
{
TRACE
(
"returning cached gdiFont(%p) for hFont %p
\n
"
,
font
,
hfont
);
goto
done
;
return
font
;
}
/* If lfFaceName is "Symbol" then Windows fixes up lfCharSet to
...
...
@@ -3295,8 +3275,7 @@ found_face:
if
((
cachedfont
=
find_cached_gdi_font
(
&
lf
,
&
dcmat
,
can_use_bitmap
)))
{
TRACE
(
"Found cached font after non-scalable matrix rescale!
\n
"
);
free_gdi_font
(
font
);
font
=
cachedfont
;
goto
done
;
return
cachedfont
;
}
if
(
height
!=
0
)
height
=
diff
;
...
...
@@ -3326,50 +3305,40 @@ found_face:
TRACE
(
"caching: gdiFont=%p hfont=%p
\n
"
,
font
,
hfont
);
cache_gdi_font
(
font
);
done:
if
(
font
)
return
font
;
}
/*************************************************************
* freetype_get_aa_flags
*/
static
UINT
CDECL
freetype_get_aa_flags
(
struct
gdi_font
*
font
,
UINT
aa_flags
,
BOOL
antialias_fakes
)
{
/* fixup the antialiasing flags for that font */
switch
(
aa_flags
)
{
switch
(
lf
.
lfQuality
)
case
WINE_GGO_HRGB_BITMAP
:
case
WINE_GGO_HBGR_BITMAP
:
case
WINE_GGO_VRGB_BITMAP
:
case
WINE_GGO_VBGR_BITMAP
:
if
(
is_subpixel_rendering_enabled
())
break
;
aa_flags
=
GGO_GRAY4_BITMAP
;
/* fall through */
case
GGO_GRAY2_BITMAP
:
case
GGO_GRAY4_BITMAP
:
case
GGO_GRAY8_BITMAP
:
case
WINE_GGO_GRAY16_BITMAP
:
if
((
!
antialias_fakes
||
(
!
font
->
fake_bold
&&
!
font
->
fake_italic
))
&&
is_hinting_enabled
())
{
case
NONANTIALIASED_QUALITY
:
case
ANTIALIASED_QUALITY
:
if
(
!*
aa_flags
)
*
aa_flags
=
default_aa_flags
;
break
;
case
CLEARTYPE_QUALITY
:
case
CLEARTYPE_NATURAL_QUALITY
:
default:
if
(
!*
aa_flags
)
*
aa_flags
=
font
->
aa_flags
;
if
(
!*
aa_flags
)
*
aa_flags
=
default_aa_flags
;
/* fixup the antialiasing flags for that font */
switch
(
*
aa_flags
)
WORD
gasp_flags
;
if
(
get_gasp_flags
(
font
,
&
gasp_flags
)
&&
!
(
gasp_flags
&
GASP_DOGRAY
))
{
case
WINE_GGO_HRGB_BITMAP
:
case
WINE_GGO_HBGR_BITMAP
:
case
WINE_GGO_VRGB_BITMAP
:
case
WINE_GGO_VBGR_BITMAP
:
if
(
is_subpixel_rendering_enabled
())
break
;
*
aa_flags
=
GGO_GRAY4_BITMAP
;
/* fall through */
case
GGO_GRAY2_BITMAP
:
case
GGO_GRAY4_BITMAP
:
case
GGO_GRAY8_BITMAP
:
case
WINE_GGO_GRAY16_BITMAP
:
if
((
!
antialias_fakes
||
(
!
font
->
fake_bold
&&
!
font
->
fake_italic
))
&&
is_hinting_enabled
())
{
WORD
gasp_flags
;
if
(
get_gasp_flags
(
font
,
&
gasp_flags
)
&&
!
(
gasp_flags
&
GASP_DOGRAY
))
{
TRACE
(
"font %s %d aa disabled by GASP
\n
"
,
debugstr_w
(
lf
.
lfFaceName
),
lf
.
lfHeight
);
*
aa_flags
=
GGO_BITMAP
;
}
}
TRACE
(
"font %s %d aa disabled by GASP
\n
"
,
debugstr_w
(
font
->
lf
.
lfFaceName
),
font
->
lf
.
lfHeight
);
aa_flags
=
GGO_BITMAP
;
}
}
TRACE
(
"%p %s %d aa %x
\n
"
,
hfont
,
debugstr_w
(
lf
.
lfFaceName
),
lf
.
lfHeight
,
*
aa_flags
);
}
return
font
;
return
aa_flags
;
}
static
void
FTVectorToPOINTFX
(
FT_Vector
*
vec
,
POINTFX
*
pt
)
...
...
@@ -5131,6 +5100,7 @@ static const struct font_backend_funcs font_funcs =
freetype_remove_font
,
freetype_load_font
,
freetype_get_font_data
,
freetype_get_aa_flags
,
freetype_get_glyph_index
,
freetype_get_default_glyph
,
freetype_get_glyph_outline
,
...
...
dlls/gdi32/gdi_private.h
View file @
de63a647
...
...
@@ -425,7 +425,7 @@ struct gdi_font
struct
font_backend_funcs
{
struct
gdi_font
*
(
CDECL
*
pSelectFont
)(
DC
*
dc
,
HFONT
hfont
,
UINT
*
aa_flags
,
UINT
default_aa_flags
);
struct
gdi_font
*
(
CDECL
*
pSelectFont
)(
DC
*
dc
,
HFONT
hfont
);
INT
(
CDECL
*
add_font
)(
const
WCHAR
*
file
,
DWORD
flags
);
INT
(
CDECL
*
add_mem_font
)(
void
*
ptr
,
SIZE_T
size
,
DWORD
flags
);
...
...
@@ -434,6 +434,7 @@ struct font_backend_funcs
BOOL
(
CDECL
*
load_font
)(
struct
gdi_font
*
gdi_font
);
DWORD
(
CDECL
*
get_font_data
)(
struct
gdi_font
*
gdi_font
,
DWORD
table
,
DWORD
offset
,
void
*
buf
,
DWORD
count
);
UINT
(
CDECL
*
get_aa_flags
)(
struct
gdi_font
*
font
,
UINT
aa_flags
,
BOOL
antialias_fakes
);
BOOL
(
CDECL
*
get_glyph_index
)(
struct
gdi_font
*
gdi_font
,
UINT
*
glyph
,
BOOL
use_encoding
);
UINT
(
CDECL
*
get_default_glyph
)(
struct
gdi_font
*
gdi_font
);
DWORD
(
CDECL
*
get_glyph_outline
)(
struct
gdi_font
*
font
,
UINT
glyph
,
UINT
format
,
...
...
@@ -644,7 +645,6 @@ extern INT CDECL nulldrv_SaveDC( PHYSDEV dev ) DECLSPEC_HIDDEN;
extern
BOOL
CDECL
nulldrv_ScaleViewportExtEx
(
PHYSDEV
dev
,
INT
x_num
,
INT
x_denom
,
INT
y_num
,
INT
y_denom
,
SIZE
*
size
)
DECLSPEC_HIDDEN
;
extern
BOOL
CDECL
nulldrv_ScaleWindowExtEx
(
PHYSDEV
dev
,
INT
x_num
,
INT
x_denom
,
INT
y_num
,
INT
y_denom
,
SIZE
*
size
)
DECLSPEC_HIDDEN
;
extern
BOOL
CDECL
nulldrv_SelectClipPath
(
PHYSDEV
dev
,
INT
mode
)
DECLSPEC_HIDDEN
;
extern
HFONT
CDECL
nulldrv_SelectFont
(
PHYSDEV
dev
,
HFONT
font
,
UINT
*
ggo_flags
)
DECLSPEC_HIDDEN
;
extern
INT
CDECL
nulldrv_SetDIBitsToDevice
(
PHYSDEV
dev
,
INT
x_dst
,
INT
y_dst
,
DWORD
width
,
DWORD
height
,
INT
x_src
,
INT
y_src
,
UINT
start
,
UINT
lines
,
const
void
*
bits
,
BITMAPINFO
*
info
,
UINT
coloruse
)
DECLSPEC_HIDDEN
;
...
...
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