2 * Cards dll implementation
4 * Copyright (C) 2004 Sami Nopanen
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
31 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(cards);
36 void WINAPI cdtTerm(void);
39 static HINSTANCE hInst;
41 static int cardHeight;
42 static HBITMAP cardBitmaps[CARD_MAX + 1];
45 /***********************************************************************
46 * Initializes the cards.dll library. Loads the card bitmaps from the
47 * resources, and initializes the card size variables.
49 BOOL WINAPI cdtInit(int *width, int *height)
54 TRACE("(%p, %p)\n", width, height);
56 for(i = 0; i <= CARD_MAX; i++)
59 for(i = 0; i <= CARD_MAX; i++)
61 cardBitmaps[i] = LoadBitmapA(hInst, MAKEINTRESOURCEA(i));
62 if(cardBitmaps[i] == 0)
69 GetObjectA(cardBitmaps[0], sizeof(BITMAP), &bm);
70 *width = cardWidth = bm.bmWidth;
71 *height = cardHeight = bm.bmHeight;
75 static DWORD do_blt(HDC hdc, int x, int y, int dx, int dy, HDC hMemoryDC, DWORD rasterOp )
77 if((cardWidth == dx) && (cardHeight == dy))
78 return BitBlt(hdc, x, y, cardWidth, cardHeight, hMemoryDC, 0, 0, rasterOp);
79 return StretchBlt(hdc, x, y, dx, dy, hMemoryDC, 0, 0, cardWidth, cardHeight, rasterOp);
82 /***********************************************************************
83 * Draw a card. Unlike cdtDrawCard, this version allows you to stretch
84 * card bitmaps to the size you specify (dx, dy). See cdtDraw for info
85 * on card, mode and color parameters.
87 BOOL WINAPI cdtDrawExt(HDC hdc, int x, int y, int dx, int dy, int card, int mode, DWORD color)
92 DWORD rasterOp = SRCCOPY;
93 BOOL roundCornersFlag;
94 BOOL eraseFlag = FALSE;
97 TRACE("(%p, %d, %d, %d, %d, %d, %d, %ld)\n", hdc, x, y, dx, dy, card, mode, color);
99 roundCornersFlag = !(mode & MODEFLAG_DONT_ROUND_CORNERS) &&
100 (dx == cardWidth) && (dy == cardHeight);
101 mode &= ~MODEFLAG_DONT_ROUND_CORNERS;
103 if((card < 0) || (card > CARD_MAX))
105 FIXME("Unexpected card: %d\n", card);
109 if((mode < MODE_FACEUP) || (mode > MODE_DECKO))
111 FIXME("Unexpected mode: %d\n", mode);
122 rasterOp = NOTSRCCOPY;
125 card = CARD_FREE_MASK;
133 case MODE_INVISIBLEGHOST:
134 card = CARD_FREE_MASK;
138 card = CARD_BACK_THE_X;
141 card = CARD_BACK_THE_O;
145 hMemoryDC = CreateCompatibleDC(hdc);
153 hBrush = CreateSolidBrush(color);
156 rect.right = x + cardWidth - 1;
157 rect.bottom = y + cardHeight - 1;
158 FillRect(hdc, &rect, hBrush);
163 hCardBitmap = cardBitmaps[card];
167 result = SelectObject(hMemoryDC, hCardBitmap);
168 if((result == 0) || (result == HGDI_ERROR))
174 SetBkColor(hdc, color);
178 /* NOTE: native uses Get/SetPixel for corners, but that really
179 * hurts on X11 since it needs a server round-trip for each pixel.
180 * So we use a clip region instead. */
181 HRGN saved = CreateRectRgn( 0, 0, 0, 0 );
182 HRGN line = CreateRectRgn( x + 2, y, x + dx - 2, y + 1 );
183 HRGN clip = CreateRectRgn( x, y + 2, x + dx, y + dy - 2 );
185 CombineRgn( clip, clip, line, RGN_OR );
186 SetRectRgn( line, x + 1, y + 1, x + dx - 1, y + 2 );
187 CombineRgn( clip, clip, line, RGN_OR );
188 SetRectRgn( line, x + 1, y + dy - 2, x + dx - 1, y + dy - 1 );
189 CombineRgn( clip, clip, line, RGN_OR );
190 SetRectRgn( line, x + 2, y + dy - 1, x + dx - 2, y + dy );
191 CombineRgn( clip, clip, line, RGN_OR );
192 DeleteObject( line );
194 if (!GetClipRgn( hdc, saved ))
196 DeleteObject( saved );
199 ExtSelectClipRgn( hdc, clip, RGN_AND );
200 DeleteObject( clip );
202 do_blt(hdc, x, y, dx, dy, hMemoryDC, rasterOp);
204 SelectClipRgn( hdc, saved );
205 if (saved) DeleteObject( saved );
208 do_blt(hdc, x, y, dx, dy, hMemoryDC, rasterOp);
217 /***********************************************************************
218 * Draws a card at position x, y in its default size (as returned by
221 * Mode controls how the card gets drawn:
222 * MODE_FACEUP ; draw card facing up
223 * MODE_FACEDOWN ; draw card facing down
224 * MODE_HILITE ; draw face up, with NOTSRCCOPY
225 * MODE_GHOST ; draw 'ghost' card
226 * MODE_REMOVE ; draw with background color
227 * MODE_INVISIBLEGHOST ; draw 'ghost' card, without clearing background
228 * MODE_DECKX ; draw X
229 * MODE_DECKO ; draw O
231 * The card parameter defines the card graphic to be drawn. If we are
232 * drawing fronts of cards, card should have a value from 0 through 51
233 * to represent the card face. If we are drawing card backs, 53 through
234 * 68 represent different card backs.
236 * When drawing card faces, two lowest bits represent the card suit
237 * (clubs, diamonds, hearts, spades), and the bits above that define the
238 * card value (ace, 2, ..., king). That is,
239 * card = face * 4 + suit.
241 * Color parameter defines the background color, used when drawing some
244 BOOL WINAPI cdtDraw(HDC hdc, int x, int y, int card, int mode, DWORD color)
246 TRACE("(%p, %d, %d, %d, %d, %ld)\n", hdc, x, y, card, mode, color);
248 return cdtDrawExt(hdc, x, y, cardWidth, cardHeight, card, mode, color);
252 /***********************************************************************
253 * Animates the card backs, e.g. blinking lights on the robot, the sun
254 * donning sunglasses, bats flying across the caste, etc.. Works only
255 * for cards of normal size (as drawn with cdtDraw). To draw frames of
256 * the card back animation, start with frame = 0, and increment the
257 * frame by one, until cdtAnimate returns FALSE (to indicate that we
258 * have gone through all frames of animation).
260 BOOL WINAPI cdtAnimate(HDC hdc, int cardback, int x, int y, int frame)
262 TRACE("(%p, %d, %d, %d, %d)\n", hdc, cardback, x, y, frame);
263 FIXME("Implement me.\n");
269 /***********************************************************************
270 * Frees resources reserved by cdtInitialize.
272 void WINAPI cdtTerm()
278 for(i = 0; i <= CARD_MAX; i++)
280 if(cardBitmaps[i] != 0)
281 DeleteObject(cardBitmaps[i]);
287 /***********************************************************************
290 BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
294 case DLL_PROCESS_ATTACH:
296 DisableThreadLibraryCalls( inst );
298 case DLL_PROCESS_DETACH: