Alexandre Julliard : cards: Avoid GetPixel to draw round corners, use a clip region instead.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Apr 5 13:33:03 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: c205d115c8638da17f3cb60a2e9e324739b3e9dd
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=c205d115c8638da17f3cb60a2e9e324739b3e9dd

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Apr  5 14:05:03 2006 +0200

cards: Avoid GetPixel to draw round corners, use a clip region instead.

---

 dlls/cards/cards.c |   53 ++++++++++++++++++++++++++--------------------------
 1 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/dlls/cards/cards.c b/dlls/cards/cards.c
index c9db204..1ab50a5 100644
--- a/dlls/cards/cards.c
+++ b/dlls/cards/cards.c
@@ -175,35 +175,34 @@ BOOL WINAPI cdtDrawExt(HDC hdc, int x, i
 
 		if(roundCornersFlag)
 		{
-			COLORREF savedPixels[12];
+                    /* NOTE: native uses Get/SetPixel for corners, but that really
+                     * hurts on X11 since it needs a server round-trip for each pixel.
+                     * So we use a clip region instead. */
+                    HRGN saved = CreateRectRgn( 0, 0, 0, 0 );
+                    HRGN line = CreateRectRgn( x + 2, y, x + dx - 2, y + 1 );
+                    HRGN clip = CreateRectRgn( x, y + 2, x + dx, y + dy - 2 );
+
+                    CombineRgn( clip, clip, line, RGN_OR );
+                    SetRectRgn( line, x + 1, y + 1, x + dx - 1, y + 2 );
+                    CombineRgn( clip, clip, line, RGN_OR );
+                    SetRectRgn( line, x + 1, y + dy - 2, x + dx - 1, y + dy - 1 );
+                    CombineRgn( clip, clip, line, RGN_OR );
+                    SetRectRgn( line, x + 2, y + dy - 1, x + dx - 2, y + dy );
+                    CombineRgn( clip, clip, line, RGN_OR );
+                    DeleteObject( line );
+
+                    if (!GetClipRgn( hdc, saved ))
+                    {
+                        DeleteObject( saved );
+                        saved = 0;
+                    }
+                    ExtSelectClipRgn( hdc, clip, RGN_AND );
+                    DeleteObject( clip );
 
-			savedPixels[0] = GetPixel(hdc, x, y);
-			savedPixels[1] = GetPixel(hdc, x + 1, y);
-			savedPixels[2] = GetPixel(hdc, x, y + 1);
-			savedPixels[3] = GetPixel(hdc, x + dx - 1, y);
-			savedPixels[4] = GetPixel(hdc, x + dx - 2, y);
-			savedPixels[5] = GetPixel(hdc, x + dx - 1, y + 1);
-			savedPixels[6] = GetPixel(hdc, x, y + dy - 1);
-			savedPixels[7] = GetPixel(hdc, x + 1, y + dy - 1);
-			savedPixels[8] = GetPixel(hdc, x, y + dy - 2);
-			savedPixels[9] = GetPixel(hdc, x + dx - 1, y + dy - 1);
-			savedPixels[10] = GetPixel(hdc, x + dx - 2, y + dy - 1);
-			savedPixels[11] = GetPixel(hdc, x + dx - 1, y + dy - 2);
+                    do_blt(hdc, x, y, dx, dy, hMemoryDC, rasterOp);
 
-			do_blt(hdc, x, y, dx, dy, hMemoryDC, rasterOp);
-
-			SetPixel(hdc, x, y, savedPixels[0]);
-			SetPixel(hdc, x + 1, y, savedPixels[1]);
-			SetPixel(hdc, x, y + 1, savedPixels[2]);
-			SetPixel(hdc, x + dx - 1, y, savedPixels[3]);
-			SetPixel(hdc, x + dx - 2, y, savedPixels[4]);
-			SetPixel(hdc, x + dx - 1, y + 1, savedPixels[5]);
-			SetPixel(hdc, x, y + dy - 1, savedPixels[6]);
-			SetPixel(hdc, x + 1, y + dy - 1, savedPixels[7]);
-			SetPixel(hdc, x, y + dy - 2, savedPixels[8]);
-			SetPixel(hdc, x + dx - 1, y + dy - 1, savedPixels[9]);
-			SetPixel(hdc, x + dx - 2, y + dy - 1, savedPixels[10]);
-			SetPixel(hdc, x + dx - 1, y + dy - 2, savedPixels[11]);
+                    SelectClipRgn( hdc, saved );
+                    if (saved) DeleteObject( saved );
 		}
 		else
 			do_blt(hdc, x, y, dx, dy, hMemoryDC, rasterOp);




More information about the wine-cvs mailing list