Module: wine Branch: master Commit: 0c005a329ebaaa90f8f732a83bd94e5e99c8c13f URL: http://source.winehq.org/git/wine.git/?a=commit;h=0c005a329ebaaa90f8f732a83b...
Author: Alexandre Julliard julliard@winehq.org Date: Thu May 18 12:54:45 2017 +0200
gdi32: Return more meaningful data in the null driver GetDeviceCaps implementation.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdi32/driver.c | 85 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 16 deletions(-)
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c index 18e109e..fe7812c 100644 --- a/dlls/gdi32/driver.c +++ b/dlls/gdi32/driver.c @@ -298,23 +298,76 @@ static BOOL nulldrv_GetCharWidth( PHYSDEV dev, UINT first, UINT last, INT *buffe
static INT nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap ) { - switch (cap) /* return meaningful values for some entries */ + static int screen_dpi; + int bpp; + + switch (cap) { - case HORZRES: return 640; - case VERTRES: return 480; - case BITSPIXEL: return 1; - case PLANES: return 1; - case NUMCOLORS: return 2; - case ASPECTX: return 36; - case ASPECTY: return 36; - case ASPECTXY: return 51; - case LOGPIXELSX: return 72; - case LOGPIXELSY: return 72; - case SIZEPALETTE: return 2; - case TEXTCAPS: return (TC_OP_CHARACTER | TC_OP_STROKE | TC_CP_STROKE | - TC_CR_ANY | TC_SF_X_YINDEP | TC_SA_DOUBLE | TC_SA_INTEGER | - TC_SA_CONTIN | TC_UA_ABLE | TC_SO_ABLE | TC_RA_ABLE | TC_VA_ABLE); - default: return 0; + case DRIVERVERSION: return 0x4000; + case TECHNOLOGY: return DT_RASDISPLAY; + case HORZSIZE: return MulDiv( GetDeviceCaps( dev->hdc, HORZRES ), 254, + GetDeviceCaps( dev->hdc, LOGPIXELSX ) * 10 ); + case VERTSIZE: return MulDiv( GetDeviceCaps( dev->hdc, VERTRES ), 254, + GetDeviceCaps( dev->hdc, LOGPIXELSY ) * 10 ); + case HORZRES: return 640; + case VERTRES: return 480; + case BITSPIXEL: return 32; + case PLANES: return 1; + case NUMBRUSHES: return -1; + case NUMPENS: return -1; + case NUMMARKERS: return 0; + case NUMFONTS: return 0; + case PDEVICESIZE: return 0; + case CURVECAPS: return (CC_CIRCLES | CC_PIE | CC_CHORD | CC_ELLIPSES | CC_WIDE | + CC_STYLED | CC_WIDESTYLED | CC_INTERIORS | CC_ROUNDRECT); + case LINECAPS: return (LC_POLYLINE | LC_MARKER | LC_POLYMARKER | LC_WIDE | + LC_STYLED | LC_WIDESTYLED | LC_INTERIORS); + case POLYGONALCAPS: return (PC_POLYGON | PC_RECTANGLE | PC_WINDPOLYGON | PC_SCANLINE | + PC_WIDE | PC_STYLED | PC_WIDESTYLED | PC_INTERIORS); + case TEXTCAPS: return (TC_OP_CHARACTER | TC_OP_STROKE | TC_CP_STROKE | + TC_CR_ANY | TC_SF_X_YINDEP | TC_SA_DOUBLE | TC_SA_INTEGER | + TC_SA_CONTIN | TC_UA_ABLE | TC_SO_ABLE | TC_RA_ABLE | TC_VA_ABLE); + case CLIPCAPS: return CP_RECTANGLE; + case RASTERCAPS: return (RC_BITBLT | RC_BITMAP64 | RC_GDI20_OUTPUT | RC_DI_BITMAP | RC_DIBTODEV | + RC_BIGFONT | RC_STRETCHBLT | RC_FLOODFILL | RC_STRETCHDIB | RC_DEVBITS | + (GetDeviceCaps( dev->hdc, SIZEPALETTE ) ? RC_PALETTE : 0)); + case ASPECTX: return 36; + case ASPECTY: return 36; + case ASPECTXY: return (int)(hypot( GetDeviceCaps( dev->hdc, ASPECTX ), + GetDeviceCaps( dev->hdc, ASPECTY )) + 0.5); + case CAPS1: return 0; + case SIZEPALETTE: return 0; + case NUMRESERVED: return 20; + case PHYSICALWIDTH: return 0; + case PHYSICALHEIGHT: return 0; + case PHYSICALOFFSETX: return 0; + case PHYSICALOFFSETY: return 0; + case SCALINGFACTORX: return 0; + case SCALINGFACTORY: return 0; + case VREFRESH: return 0; + case DESKTOPVERTRES: return GetDeviceCaps( dev->hdc, VERTRES ); + case DESKTOPHORZRES: return GetDeviceCaps( dev->hdc, HORZRES ); + case BLTALIGNMENT: return 0; + case SHADEBLENDCAPS: return 0; + case COLORMGMTCAPS: return 0; + case LOGPIXELSX: + case LOGPIXELSY: + if (!screen_dpi && !(screen_dpi = get_dpi())) screen_dpi = 96; + return screen_dpi; + case NUMCOLORS: + bpp = GetDeviceCaps( dev->hdc, BITSPIXEL ); + return (bpp > 8) ? -1 : (1 << bpp); + case COLORRES: + /* The observed correspondence between BITSPIXEL and COLORRES is: + * BITSPIXEL: 8 -> COLORRES: 18 + * BITSPIXEL: 16 -> COLORRES: 16 + * BITSPIXEL: 24 -> COLORRES: 24 + * BITSPIXEL: 32 -> COLORRES: 24 */ + bpp = GetDeviceCaps( dev->hdc, BITSPIXEL ); + return (bpp <= 8) ? 18 : min( 24, bpp ); + default: + FIXME("(%p): unsupported capability %d, will return 0\n", dev->hdc, cap ); + return 0; } }