sysparams: fix SPI_{G|S}ETFONTSMOOTHING with tests

Rein Klazes wijn at wanadoo.nl
Wed Jan 25 08:26:29 CST 2006


Hi,

This would have fixed bug #4315 as well.

Changelog:
dlls/user		: sysparams.c
dlls/user/tests	: sysparams.c
Add regression tests for  SPI_{G|S}ETFONTSMOOTHING. Make them pass on
Wine.

Rein.
-------------- next part --------------
--- wine/dlls/user/sysparams.c	2006-01-17 09:38:30.000000000 +0100
+++ mywine/dlls/user/sysparams.c	2006-01-17 09:58:36.000000000 +0100
@@ -1898,13 +1898,17 @@ BOOL WINAPI SystemParametersInfoW( UINT 
     WINE_SPI_WARN(SPI_SETANIMATION);		/*     73  WINVER >= 0x400 */
 
     case SPI_GETFONTSMOOTHING:
+    {
+        UINT tmpval;
         ret = get_uint_param( SPI_SETFONTSMOOTHING_IDX,
                               SPI_SETFONTSMOOTHING_REGKEY,
                               SPI_SETFONTSMOOTHING_VALNAME,
-                              &font_smoothing, pvParam );
+                              &font_smoothing, &tmpval );
+        *(UINT *) pvParam = ( tmpval != 0);
         break;
-
+    }
     case SPI_SETFONTSMOOTHING:
+        uiParam = uiParam ? 2 : 0; /* Win NT4/2k/XP behavior */
         ret = set_uint_param( SPI_SETFONTSMOOTHING_IDX,
                               SPI_SETFONTSMOOTHING_REGKEY,
                               SPI_SETFONTSMOOTHING_VALNAME,
--- wine/dlls/user/tests/sysparams.c	2005-12-17 09:44:50.000000000 +0100
+++ mywine/dlls/user/tests/sysparams.c	2006-01-17 10:34:06.000000000 +0100
@@ -39,6 +39,7 @@
 
 static int strict;
 static int dpi;
+static int iswin9x;
 static HDC hdc;
 
 #define eq(received, expected, label, type) \
@@ -118,6 +119,8 @@ static HDC hdc;
 #define SPI_SETSCREENREADER_VALNAME             "On"
 #define SPI_SETSCREENREADER_REGKEY_LEGACY       "Control Panel\\Accessibility"
 #define SPI_SETSCREENREADER_VALNAME_LEGACY      "Blind Access"
+#define SPI_SETFONTSMOOTHING_REGKEY             "Control Panel\\Desktop"
+#define SPI_SETFONTSMOOTHING_VALNAME            "FontSmoothing"
 #define SPI_SETLOWPOWERACTIVE_REGKEY            "Control Panel\\Desktop"
 #define SPI_SETLOWPOWERACTIVE_VALNAME           "LowPowerActive"
 #define SPI_SETPOWEROFFACTIVE_REGKEY            "Control Panel\\Desktop"
@@ -675,7 +678,6 @@ static void test_SPI_SETBORDER( void )  
 {
     BOOL rc;
     UINT old_border;
-    int iswin9x;
     NONCLIENTMETRICSA ncmsave;
     INT CaptionWidth;
 
@@ -689,11 +691,6 @@ static void test_SPI_SETBORDER( void )  
             "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
     ncmsave.iCaptionWidth = CaptionWidth;
 
-    /* The SPI_SETBORDER seems to be buggy on Win9x/ME (looks like you need to
-     * do it twice to make the intended change). So skip parts of the tests on
-     * those platforms */
-    iswin9x = GetVersion() & 0x80000000;
-
     /* These tests hang when XFree86 4.0 for Windows is running (tested on
      *  WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
      * running.
@@ -711,6 +708,9 @@ static void test_SPI_SETBORDER( void )  
     if ( old_border == 7 || old_border == 20 )
         old_border = 1;
 
+    /* The SPI_SETBORDER seems to be buggy on Win9x/ME (looks like you need to
+     * do it twice to make the intended change). So skip parts of the tests on
+     * those platforms */
     if( !iswin9x) {
         test_setborder(1,  1, dpi);
         test_setborder(0,  1, dpi);
@@ -1837,6 +1837,41 @@ static void test_SPI_SETSCREENREADER( vo
     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
 }
 
+static void test_SPI_SETFONTSMOOTHING( void )         /*     75 */
+{
+    BOOL rc;
+    BOOL old_b;
+    const UINT vals[]={0xffffffff,0,1,2};
+    unsigned int i;
+
+    trace("testing SPI_{GET,SET}FONTSMOOTHING\n");
+    if( iswin9x) return; /* 95/98/ME don't seem to implement this fully */ 
+    SetLastError(0xdeadbeef);
+    rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &old_b, 0 );
+    if (!test_error_msg(rc,"SPI_{GET,SET}FONTSMOOTHING"))
+        return;
+
+    for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
+    {
+        UINT v;
+
+        rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, vals[i], 0,
+                                  SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
+        ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
+        test_change_message( SPI_SETFONTSMOOTHING, 0 );
+        test_reg_key( SPI_SETFONTSMOOTHING_REGKEY,
+                      SPI_SETFONTSMOOTHING_VALNAME,
+                      vals[i] ? "2" : "0" );
+
+        rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &v, 0 );
+        ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
+        eq( v, vals[i] ? 1 : 0, "SPI_GETFONTSMOOTHING", "%d" );
+    }
+
+    rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, old_b, 0, SPIF_UPDATEINIFILE );
+    ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
+}
+
 static void test_SPI_SETLOWPOWERACTIVE( void )         /*     85 */
 {
     BOOL rc;
@@ -2160,6 +2195,7 @@ static DWORD WINAPI SysParamsThreadFunc(
     test_SPI_SETSHOWSOUNDS();                   /*     57 */
     test_SPI_SETKEYBOARDPREF();                 /*     69 */
     test_SPI_SETSCREENREADER();                 /*     71 */
+    test_SPI_SETFONTSMOOTHING();                /*     75 */
     test_SPI_SETLOWPOWERACTIVE();               /*     85 */
     test_SPI_SETPOWEROFFACTIVE();               /*     86 */
     test_SPI_SETMOUSEHOVERWIDTH();              /*     99 */
@@ -2405,6 +2441,7 @@ START_TEST(sysparams)
 
     hdc = GetDC(0);
     dpi = GetDeviceCaps( hdc, LOGPIXELSY);
+    iswin9x = GetVersion() & 0x80000000;
 
     /* This test requires interactivity, if we don't have it, give up */
     if (!SystemParametersInfoA( SPI_SETBEEP, TRUE, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ) &&


More information about the wine-patches mailing list