Alexandre Julliard : winex11: Store the anti-aliasing flags in the device instead of the font cache.
Alexandre Julliard
julliard at winehq.org
Mon Nov 5 13:32:24 CST 2012
Module: wine
Branch: master
Commit: 548e1264540e4ecc30b8ad55bd6146fd7d3df51e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=548e1264540e4ecc30b8ad55bd6146fd7d3df51e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Nov 5 16:48:47 2012 +0100
winex11: Store the anti-aliasing flags in the device instead of the font cache.
---
dlls/winex11.drv/xrender.c | 64 +++++++++++++++++--------------------------
1 files changed, 25 insertions(+), 39 deletions(-)
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index b9d27fa..bafc622 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -146,7 +146,6 @@ typedef struct
typedef struct
{
LFANDSIZE lfsz;
- AA_Type aa_default;
gsCacheEntryFormat * format[AA_MAXVALUE];
INT count;
INT next;
@@ -158,6 +157,7 @@ struct xrender_physdev
X11DRV_PDEVICE *x11dev;
HRGN region;
enum wxr_format format;
+ UINT aa_flags;
int cache_index;
BOOL update_clip;
Picture pict;
@@ -789,10 +789,8 @@ static AA_Type aa_type_from_flags( UINT aa_flags )
{
switch (aa_flags & 0x7f)
{
- case 0:
case GGO_BITMAP:
return AA_None;
- case GGO_GRAY4_BITMAP:
case WINE_GGO_GRAY16_BITMAP:
return AA_Grey;
case WINE_GGO_HRGB_BITMAP:
@@ -860,6 +858,21 @@ static HFONT xrenderdrv_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags )
ret = next->funcs->pSelectFont( next, hfont, aa_flags );
if (!ret) return 0;
+ switch (*aa_flags)
+ {
+ case GGO_GRAY2_BITMAP:
+ case GGO_GRAY4_BITMAP:
+ case GGO_GRAY8_BITMAP:
+ physdev->aa_flags = WINE_GGO_GRAY16_BITMAP;
+ break;
+ case 0:
+ physdev->aa_flags = GGO_BITMAP;
+ break;
+ default:
+ physdev->aa_flags = *aa_flags;
+ break;
+ }
+
TRACE("h=%d w=%d weight=%d it=%d charset=%d name=%s\n",
lfsz.lf.lfHeight, lfsz.lf.lfWidth, lfsz.lf.lfWeight,
lfsz.lf.lfItalic, lfsz.lf.lfCharSet, debugstr_w(lfsz.lf.lfFaceName));
@@ -883,7 +896,6 @@ static HFONT xrenderdrv_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags )
if (physdev->cache_index != -1)
dec_ref_cache( physdev->cache_index );
physdev->cache_index = GetCacheEntry( &lfsz );
- glyphsetCache[physdev->cache_index].aa_default = aa_type_from_flags( *aa_flags );
LeaveCriticalSection(&xrender_cs);
return ret;
}
@@ -1014,7 +1026,7 @@ static void xrenderdrv_SetDeviceClipping( PHYSDEV dev, HRGN rgn )
*
* Helper to ExtTextOut. Must be called inside xrender_cs
*/
-static void UploadGlyph(struct xrender_physdev *physDev, int glyph, AA_Type format)
+static void UploadGlyph(struct xrender_physdev *physDev, int glyph)
{
unsigned int buflen;
char *buf;
@@ -1023,40 +1035,17 @@ static void UploadGlyph(struct xrender_physdev *physDev, int glyph, AA_Type form
XGlyphInfo gi;
gsCacheEntry *entry = glyphsetCache + physDev->cache_index;
gsCacheEntryFormat *formatEntry;
- UINT ggo_format = GGO_GLYPH_INDEX;
+ UINT ggo_format = GGO_GLYPH_INDEX | physDev->aa_flags;
+ AA_Type format = aa_type_from_flags( physDev->aa_flags );
enum wxr_format wxr_format;
static const char zero[4];
static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} };
- switch(format) {
- case AA_Grey:
- ggo_format |= WINE_GGO_GRAY16_BITMAP;
- break;
- case AA_RGB:
- ggo_format |= WINE_GGO_HRGB_BITMAP;
- break;
- case AA_BGR:
- ggo_format |= WINE_GGO_HBGR_BITMAP;
- break;
- case AA_VRGB:
- ggo_format |= WINE_GGO_VRGB_BITMAP;
- break;
- case AA_VBGR:
- ggo_format |= WINE_GGO_VBGR_BITMAP;
- break;
-
- default:
- ERR("aa = %d - not implemented\n", format);
- case AA_None:
- ggo_format |= GGO_BITMAP;
- break;
- }
-
buflen = GetGlyphOutlineW(physDev->dev.hdc, glyph, ggo_format, &gm, 0, NULL, &identity);
if(buflen == GDI_ERROR) {
if(format != AA_None) {
format = AA_None;
- entry->aa_default = AA_None;
+ physDev->aa_flags = GGO_BITMAP;
ggo_format = GGO_GLYPH_INDEX | GGO_BITMAP;
buflen = GetGlyphOutlineW(physDev->dev.hdc, glyph, ggo_format, &gm, 0, NULL, &identity);
}
@@ -1318,7 +1307,6 @@ static BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
struct xrender_physdev *physdev = get_xrender_dev( dev );
gsCacheEntry *entry;
gsCacheEntryFormat *formatEntry;
- AA_Type aa_type = AA_None;
unsigned int idx;
Picture pict, tile_pict = 0;
XGlyphElt16 *elts;
@@ -1354,17 +1342,15 @@ static BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
EnterCriticalSection(&xrender_cs);
entry = glyphsetCache + physdev->cache_index;
- aa_type = entry->aa_default;
- formatEntry = entry->format[aa_type];
+ formatEntry = entry->format[aa_type_from_flags( physdev->aa_flags )];
for(idx = 0; idx < count; idx++) {
if( !formatEntry ) {
- UploadGlyph(physdev, wstr[idx], aa_type);
- /* re-evaluate antialias since aa_default may have changed */
- aa_type = entry->aa_default;
- formatEntry = entry->format[aa_type];
+ UploadGlyph(physdev, wstr[idx]);
+ /* re-evaluate format entry since aa_flags may have changed */
+ formatEntry = entry->format[aa_type_from_flags( physdev->aa_flags )];
} else if( wstr[idx] >= formatEntry->nrealized || formatEntry->realized[wstr[idx]] == FALSE) {
- UploadGlyph(physdev, wstr[idx], aa_type);
+ UploadGlyph(physdev, wstr[idx]);
}
}
if (!formatEntry)
More information about the wine-cvs
mailing list