Commit 5c02c352 authored by Alexandre Julliard's avatar Alexandre Julliard

gdi32: Determine the default anti-aliasing parameters in the null driver SelectFont entry point.

parent 2a208bd2
...@@ -552,11 +552,6 @@ static HBRUSH nulldrv_SelectBrush( PHYSDEV dev, HBRUSH brush, const struct brush ...@@ -552,11 +552,6 @@ static HBRUSH nulldrv_SelectBrush( PHYSDEV dev, HBRUSH brush, const struct brush
return brush; return brush;
} }
static HFONT nulldrv_SelectFont( PHYSDEV dev, HFONT font, UINT *aa_flags )
{
return 0;
}
static HPALETTE nulldrv_SelectPalette( PHYSDEV dev, HPALETTE palette, BOOL bkgnd ) static HPALETTE nulldrv_SelectPalette( PHYSDEV dev, HPALETTE palette, BOOL bkgnd )
{ {
return palette; return palette;
......
...@@ -260,8 +260,6 @@ static void FONT_NewTextMetricExWToA(const NEWTEXTMETRICEXW *ptmW, NEWTEXTMETRIC ...@@ -260,8 +260,6 @@ static void FONT_NewTextMetricExWToA(const NEWTEXTMETRICEXW *ptmW, NEWTEXTMETRIC
memcpy(&ptmA->ntmFontSig, &ptmW->ntmFontSig, sizeof(FONTSIGNATURE)); memcpy(&ptmA->ntmFontSig, &ptmW->ntmFontSig, sizeof(FONTSIGNATURE));
} }
enum smoothing { no_smoothing, aa_smoothing, subpixel_smoothing };
static DWORD get_desktop_value( const WCHAR *name, DWORD *value ) static DWORD get_desktop_value( const WCHAR *name, DWORD *value )
{ {
static const WCHAR desktop[] = {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0}; static const WCHAR desktop[] = {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
...@@ -279,28 +277,6 @@ static DWORD get_desktop_value( const WCHAR *name, DWORD *value ) ...@@ -279,28 +277,6 @@ static DWORD get_desktop_value( const WCHAR *name, DWORD *value )
return err; return err;
} }
static enum smoothing get_default_smoothing( void )
{
static const WCHAR smoothing_type[] = {'F','o','n','t','S','m','o','o','t','h','i','n','g','T','y','p','e',0};
DWORD type, err;
/* FIXME: Ignoring FontSmoothing for now since this is
set to off by default in wine.inf */
err = get_desktop_value( smoothing_type, &type );
if (err) return aa_smoothing;
switch (type)
{
case 1: /* FE_FONTSMOOTHINGSTANDARD */
return aa_smoothing;
case 2: /* FE_FONTSMOOTHINGCLEARTYPE */
return subpixel_smoothing;
}
return aa_smoothing;
}
static UINT get_subpixel_orientation( void ) static UINT get_subpixel_orientation( void )
{ {
static const WCHAR smoothing_orientation[] = {'F','o','n','t','S','m','o','o','t','h','i','n','g', static const WCHAR smoothing_orientation[] = {'F','o','n','t','S','m','o','o','t','h','i','n','g',
...@@ -321,39 +297,28 @@ static UINT get_subpixel_orientation( void ) ...@@ -321,39 +297,28 @@ static UINT get_subpixel_orientation( void )
return GGO_GRAY4_BITMAP; return GGO_GRAY4_BITMAP;
} }
UINT get_font_aa_flags( HDC hdc, const LOGFONTW *lf ) static UINT get_default_smoothing( void )
{ {
enum smoothing smoothing; static const WCHAR smoothing_type[] = {'F','o','n','t','S','m','o','o','t','h','i','n','g','T','y','p','e',0};
DWORD type, err;
switch (lf->lfQuality) /* FIXME: Ignoring FontSmoothing for now since this is
{ set to off by default in wine.inf */
case NONANTIALIASED_QUALITY:
return GGO_BITMAP;
case ANTIALIASED_QUALITY:
smoothing = aa_smoothing;
break;
case CLEARTYPE_QUALITY:
case CLEARTYPE_NATURAL_QUALITY:
smoothing = subpixel_smoothing;
break;
case DEFAULT_QUALITY:
case DRAFT_QUALITY:
case PROOF_QUALITY:
default:
smoothing = get_default_smoothing();
}
switch (smoothing) err = get_desktop_value( smoothing_type, &type );
if (err) return 0;
switch (type)
{ {
case subpixel_smoothing: case 1: /* FE_FONTSMOOTHINGSTANDARD */
return get_subpixel_orientation();
case aa_smoothing:
return GGO_GRAY4_BITMAP; return GGO_GRAY4_BITMAP;
default: case 2: /* FE_FONTSMOOTHINGCLEARTYPE */
return GGO_BITMAP; return get_subpixel_orientation();
} }
return 0;
} }
/*********************************************************************** /***********************************************************************
* GdiGetCodePage (GDI32.@) * GdiGetCodePage (GDI32.@)
*/ */
...@@ -697,6 +662,36 @@ static BOOL FONT_DeleteObject( HGDIOBJ handle ) ...@@ -697,6 +662,36 @@ static BOOL FONT_DeleteObject( HGDIOBJ handle )
/*********************************************************************** /***********************************************************************
* nulldrv_SelectFont
*/
HFONT nulldrv_SelectFont( PHYSDEV dev, HFONT font, UINT *aa_flags )
{
LOGFONTW lf;
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:
*aa_flags = get_subpixel_orientation();
break;
default:
*aa_flags = get_default_smoothing();
break;
}
return 0;
}
/***********************************************************************
* FONT_EnumInstance * FONT_EnumInstance
* *
* Note: plf is really an ENUMLOGFONTEXW, and ptm is a NEWTEXTMETRICEXW. * Note: plf is really an ENUMLOGFONTEXW, and ptm is a NEWTEXTMETRICEXW.
......
...@@ -4953,27 +4953,41 @@ found_face: ...@@ -4953,27 +4953,41 @@ found_face:
done: done:
if (ret) if (ret)
{ {
if (!*aa_flags) *aa_flags = ret->aa_flags; PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectFont );
if (!*aa_flags) *aa_flags = get_font_aa_flags( dev->hdc, &lf );
/* fixup the antialiasing flags for that font */ switch (lf.lfQuality)
switch (*aa_flags)
{ {
case WINE_GGO_HRGB_BITMAP: case NONANTIALIASED_QUALITY:
case WINE_GGO_HBGR_BITMAP: case ANTIALIASED_QUALITY:
case WINE_GGO_VRGB_BITMAP: next->funcs->pSelectFont( dev, hfont, aa_flags );
case WINE_GGO_VBGR_BITMAP: break;
if (is_subpixel_rendering_enabled()) break; case CLEARTYPE_QUALITY:
*aa_flags = GGO_GRAY4_BITMAP; case CLEARTYPE_NATURAL_QUALITY:
/* fall through */ default:
case GGO_GRAY4_BITMAP: if (!*aa_flags) *aa_flags = ret->aa_flags;
if (is_hinting_enabled()) next->funcs->pSelectFont( dev, hfont, aa_flags );
/* fixup the antialiasing flags for that font */
switch (*aa_flags)
{ {
WORD gasp_flags; case WINE_GGO_HRGB_BITMAP:
if (get_gasp_flags( ret, &gasp_flags ) && !(gasp_flags & GASP_DOGRAY)) case WINE_GGO_HBGR_BITMAP:
*aa_flags = GGO_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 (is_hinting_enabled())
{
WORD gasp_flags;
if (get_gasp_flags( ret, &gasp_flags ) && !(gasp_flags & GASP_DOGRAY))
*aa_flags = GGO_BITMAP;
}
} }
break;
} }
dc->gdiFont = ret; dc->gdiFont = ret;
physdev->font = ret; physdev->font = ret;
......
...@@ -278,9 +278,6 @@ extern BOOL DRIVER_GetDriverName( LPCWSTR device, LPWSTR driver, DWORD size ) DE ...@@ -278,9 +278,6 @@ extern BOOL DRIVER_GetDriverName( LPCWSTR device, LPWSTR driver, DWORD size ) DE
/* enhmetafile.c */ /* enhmetafile.c */
extern HENHMETAFILE EMF_Create_HENHMETAFILE(ENHMETAHEADER *emh, BOOL on_disk ) DECLSPEC_HIDDEN; extern HENHMETAFILE EMF_Create_HENHMETAFILE(ENHMETAHEADER *emh, BOOL on_disk ) DECLSPEC_HIDDEN;
/* font.c */
extern UINT get_font_aa_flags( HDC hdc, const LOGFONTW *lf ) DECLSPEC_HIDDEN;
/* freetype.c */ /* freetype.c */
/* Undocumented structure filled in by GdiRealizationInfo */ /* Undocumented structure filled in by GdiRealizationInfo */
...@@ -394,6 +391,7 @@ extern INT nulldrv_SaveDC( PHYSDEV dev ) DECLSPEC_HIDDEN; ...@@ -394,6 +391,7 @@ extern INT nulldrv_SaveDC( PHYSDEV dev ) DECLSPEC_HIDDEN;
extern BOOL nulldrv_ScaleViewportExtEx( PHYSDEV dev, INT x_num, INT x_denom, INT y_num, INT y_denom, SIZE *size ) DECLSPEC_HIDDEN; extern BOOL nulldrv_ScaleViewportExtEx( PHYSDEV dev, INT x_num, INT x_denom, INT y_num, INT y_denom, SIZE *size ) DECLSPEC_HIDDEN;
extern BOOL nulldrv_ScaleWindowExtEx( PHYSDEV dev, INT x_num, INT x_denom, INT y_num, INT y_denom, SIZE *size ) DECLSPEC_HIDDEN; extern BOOL nulldrv_ScaleWindowExtEx( PHYSDEV dev, INT x_num, INT x_denom, INT y_num, INT y_denom, SIZE *size ) DECLSPEC_HIDDEN;
extern BOOL nulldrv_SelectClipPath( PHYSDEV dev, INT mode ) DECLSPEC_HIDDEN; extern BOOL nulldrv_SelectClipPath( PHYSDEV dev, INT mode ) DECLSPEC_HIDDEN;
extern HFONT nulldrv_SelectFont( PHYSDEV dev, HFONT font, UINT *ggo_flags ) DECLSPEC_HIDDEN;
extern INT nulldrv_SetDIBitsToDevice( PHYSDEV dev, INT x_dst, INT y_dst, DWORD width, DWORD height, extern INT nulldrv_SetDIBitsToDevice( PHYSDEV dev, INT x_dst, INT y_dst, DWORD width, DWORD height,
INT x_src, INT y_src, UINT start, UINT lines, INT x_src, INT y_src, UINT start, UINT lines,
const void *bits, BITMAPINFO *info, UINT coloruse ) DECLSPEC_HIDDEN; const void *bits, BITMAPINFO *info, UINT coloruse ) DECLSPEC_HIDDEN;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment