Alexandre Julliard : gdi32: Return more meaningful data in the null driver GetDeviceCaps implementation.

Alexandre Julliard julliard at winehq.org
Thu May 18 15:27:50 CDT 2017


Module: wine
Branch: master
Commit: 0c005a329ebaaa90f8f732a83bd94e5e99c8c13f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0c005a329ebaaa90f8f732a83bd94e5e99c8c13f

Author: Alexandre Julliard <julliard at 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 at 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;
     }
 }
 




More information about the wine-cvs mailing list