static void test_dc_attributes(void)
{
HDC hdc, old_hdc;
- INT rop, def_rop;
+ HDC hdcs[20];
+ INT i, rop, def_rop, found_dc;
/* test cache DC */
ok( rop == def_rop, "wrong ROP2 %d after release\n", rop );
SetROP2( hdc, R2_WHITE );
ReleaseDC( hwnd_cache, hdc );
+ old_hdc = hdc;
- hdc = GetDCEx( hwnd_cache, 0, DCX_USESTYLE | DCX_NORESETATTRS );
- rop = GetROP2( hdc );
- /* Win9x seems to silently ignore DCX_NORESETATTRS */
- ok( rop == def_rop || rop == R2_WHITE, "wrong ROP2 %d\n", rop );
-
- SetROP2( hdc, R2_WHITE );
- rop = GetROP2( hdc );
- ok( rop == R2_WHITE, "wrong ROP2 %d\n", rop );
-
- ReleaseDC( hwnd_cache, hdc );
- hdc = GetDCEx( hwnd_cache, 0, DCX_USESTYLE | DCX_NORESETATTRS );
- rop = GetROP2( hdc );
- ok( rop == def_rop || rop == R2_WHITE, "wrong ROP2 %d after release\n", rop );
- ReleaseDC( hwnd_cache, hdc );
-
- hdc = GetDCEx( hwnd_cache, 0, DCX_USESTYLE );
- rop = GetROP2( hdc );
- ok( rop == def_rop, "wrong ROP2 %d after release\n", rop );
- ReleaseDC( hwnd_cache, hdc );
+ found_dc = 0;
+ for (i = 0; i < 20; i++)
+ {
+ hdc = hdcs[i] = GetDCEx( hwnd_cache, 0, DCX_USESTYLE | DCX_NORESETATTRS );
+ if (!hdc) break;
+ rop = GetROP2( hdc );
+ if (hdc == old_hdc)
+ todo_wine ok( rop == def_rop, "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
+ else
+ ok( rop == def_rop, "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
+ if (hdc == old_hdc)
+ {
+ found_dc = 1;
+ SetROP2( hdc, R2_WHITE );
+ }
+ }
+ if (!found_dc)
+ {
+ trace( "hdc %p not found in cache using %p\n", old_hdc, hdcs[0] );
+ old_hdc = hdcs[0];
+ SetROP2( old_hdc, R2_WHITE );
+ }
+ while (i >= 0) ReleaseDC( hwnd_cache, hdcs[--i] );
+
+ for (i = 0; i < 20; i++)
+ {
+ hdc = hdcs[i] = GetDCEx( hwnd_cache, 0, DCX_USESTYLE | DCX_NORESETATTRS );
+ if (!hdc) break;
+ rop = GetROP2( hdc );
+ if (hdc == old_hdc)
+ ok( rop == R2_WHITE || broken( rop == def_rop), /* win9x doesn't support DCX_NORESETATTRS */
+ "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
+ else
+ ok( rop == def_rop, "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
+ }
+ while (i >= 0) ReleaseDC( hwnd_cache, hdcs[--i] );
+
+ for (i = 0; i < 20; i++)
+ {
+ hdc = hdcs[i] = GetDCEx( hwnd_cache, 0, DCX_USESTYLE );
+ if (!hdc) break;
+ rop = GetROP2( hdc );
+ if (hdc == old_hdc)
+ {
+ todo_wine ok( rop == R2_WHITE || broken( rop == def_rop),
+ "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
+ SetROP2( old_hdc, def_rop );
+ }
+ else
+ ok( rop == def_rop, "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
+ }
+ while (i >= 0) ReleaseDC( hwnd_cache, hdcs[--i] );
/* test own DC */