From 9cdb0e1ca6d9cdbe5d40d5a544629d6f21baff2b Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 31 Oct 2012 16:07:51 +0100 Subject: [PATCH] gdi32: Disable anti-aliasing when necessary in the various drivers. --- dlls/gdi32/dibdrv/dc.c | 2 +- dlls/gdi32/dibdrv/dibdrv.h | 1 + dlls/gdi32/dibdrv/graphics.c | 13 +++++++++++++ dlls/gdi32/enhmfdrv/objects.c | 1 + dlls/gdi32/font.c | 8 -------- dlls/gdi32/mfdrv/objects.c | 1 + dlls/wineps.drv/font.c | 2 ++ dlls/winex11.drv/init.c | 12 +++++++++++- 8 files changed, 30 insertions(+), 10 deletions(-) diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c index 0b6013d0170..4d84452665c 100644 --- a/dlls/gdi32/dibdrv/dc.c +++ b/dlls/gdi32/dibdrv/dc.c @@ -484,7 +484,7 @@ const struct gdi_dc_funcs dib_driver = dibdrv_SelectBitmap, /* pSelectBitmap */ dibdrv_SelectBrush, /* pSelectBrush */ NULL, /* pSelectClipPath */ - NULL, /* pSelectFont */ + dibdrv_SelectFont, /* pSelectFont */ NULL, /* pSelectPalette */ dibdrv_SelectPen, /* pSelectPen */ NULL, /* pSetArcDirection */ diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h index 564fe95f1e8..1cd87e3ce1a 100644 --- a/dlls/gdi32/dibdrv/dibdrv.h +++ b/dlls/gdi32/dibdrv/dibdrv.h @@ -141,6 +141,7 @@ extern BOOL dibdrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT extern BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT ellipse_width, INT ellipse_height ) DECLSPEC_HIDDEN; extern HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, const struct brush_pattern *pattern ) DECLSPEC_HIDDEN; +extern HFONT dibdrv_SelectFont( PHYSDEV dev, HFONT font, UINT *aa_flags ) DECLSPEC_HIDDEN; extern HPEN dibdrv_SelectPen( PHYSDEV dev, HPEN hpen, const struct brush_pattern *pattern ) DECLSPEC_HIDDEN; extern COLORREF dibdrv_SetDCBrushColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN; extern COLORREF dibdrv_SetDCPenColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/dibdrv/graphics.c b/dlls/gdi32/dibdrv/graphics.c index 6f936e0cdd4..0b541889d03 100644 --- a/dlls/gdi32/dibdrv/graphics.c +++ b/dlls/gdi32/dibdrv/graphics.c @@ -712,6 +712,19 @@ done: } /*********************************************************************** + * dibdrv_SelectFont + */ +HFONT dibdrv_SelectFont( PHYSDEV dev, HFONT font, UINT *aa_flags ) +{ + dibdrv_physdev *pdev = get_dibdrv_pdev(dev); + + if (pdev->dib.bit_count <= 8) *aa_flags = GGO_BITMAP; /* no anti-aliasing on <= 8bpp */ + + dev = GET_NEXT_PHYSDEV( dev, pSelectFont ); + return dev->funcs->pSelectFont( dev, font, aa_flags ); +} + +/*********************************************************************** * dibdrv_Arc */ BOOL dibdrv_Arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom, diff --git a/dlls/gdi32/enhmfdrv/objects.c b/dlls/gdi32/enhmfdrv/objects.c index 8dd88f6269c..4c85fe743f5 100644 --- a/dlls/gdi32/enhmfdrv/objects.c +++ b/dlls/gdi32/enhmfdrv/objects.c @@ -314,6 +314,7 @@ HFONT EMFDRV_SelectFont( PHYSDEV dev, HFONT hFont, UINT *aa_flags ) if(!EMFDRV_WriteRecord( dev, &emr.emr )) return 0; done: + *aa_flags = GGO_BITMAP; /* no point in anti-aliasing on metafiles */ dev = GET_NEXT_PHYSDEV( dev, pSelectFont ); dev->funcs->pSelectFont( dev, hFont, aa_flags ); return hFont; diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index d5396ffd861..a2d4d3eed9e 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -397,14 +397,6 @@ UINT get_font_aa_flags( HDC hdc, const LOGFONTW *lf ) static int subpixel_enabled = -1; enum smoothing smoothing; - if (GetObjectType( hdc ) == OBJ_MEMDC) - { - BITMAP bm; - GetObjectW( GetCurrentObject( hdc, OBJ_BITMAP ), sizeof(bm), &bm ); - if (bm.bmBitsPixel <= 8) return GGO_BITMAP; - } - else if (GetDeviceCaps( hdc, BITSPIXEL ) <= 8) return GGO_BITMAP; - if (hinter == -1 || subpixel_enabled == -1) { RASTERIZER_STATUS status; diff --git a/dlls/gdi32/mfdrv/objects.c b/dlls/gdi32/mfdrv/objects.c index 07e66b75c58..697644d748f 100644 --- a/dlls/gdi32/mfdrv/objects.c +++ b/dlls/gdi32/mfdrv/objects.c @@ -290,6 +290,7 @@ HFONT MFDRV_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags ) LOGFONTW font; INT16 index; + *aa_flags = GGO_BITMAP; /* no point in anti-aliasing on metafiles */ index = MFDRV_FindObject(dev, hfont); if( index < 0 ) { diff --git a/dlls/wineps.drv/font.c b/dlls/wineps.drv/font.c index f04d069147b..4888af37105 100644 --- a/dlls/wineps.drv/font.c +++ b/dlls/wineps.drv/font.c @@ -47,6 +47,8 @@ HFONT PSDRV_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags ) if (!GetObjectW( hfont, sizeof(lf), &lf )) return 0; + *aa_flags = GGO_BITMAP; /* no anti-aliasing on printer devices */ + TRACE("FaceName = %s Height = %d Italic = %d Weight = %d\n", debugstr_w(lf.lfFaceName), lf.lfHeight, lf.lfItalic, lf.lfWeight); diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index d729fd07a37..7cf318f5ded 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -295,6 +295,16 @@ static INT X11DRV_GetDeviceCaps( PHYSDEV dev, INT cap ) } +/*********************************************************************** + * SelectFont + */ +static HFONT X11DRV_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags ) +{ + if (default_visual.depth <= 8) *aa_flags = GGO_BITMAP; /* no anti-aliasing on <= 8bpp */ + dev = GET_NEXT_PHYSDEV( dev, pSelectFont ); + return dev->funcs->pSelectFont( dev, hfont, aa_flags ); +} + /********************************************************************** * ExtEscape (X11DRV.@) */ @@ -532,7 +542,7 @@ static const struct gdi_dc_funcs x11drv_funcs = NULL, /* pSelectBitmap */ X11DRV_SelectBrush, /* pSelectBrush */ NULL, /* pSelectClipPath */ - NULL, /* pSelectFont */ + X11DRV_SelectFont, /* pSelectFont */ NULL, /* pSelectPalette */ X11DRV_SelectPen, /* pSelectPen */ NULL, /* pSetArcDirection */ -- 2.11.4.GIT