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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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;
76 /***********************************************************************
77 * Draw a card. Unlike cdtDrawCard, this version allows you to stretch
78 * card bitmaps to the size you specify (dx, dy). See cdtDraw for info
79 * on card, mode and color parameters.
81 BOOL WINAPI cdtDrawExt(HDC hdc, int x, int y, int dx, int dy, int card, int mode, DWORD color)
86 DWORD rasterOp = SRCCOPY;
87 BOOL roundCornersFlag;
88 COLORREF savedPixels[12];
89 BOOL eraseFlag = FALSE;
92 TRACE("(%p, %d, %d, %d, %d, %d, %d, %ld)\n", hdc, x, y, dx, dy, card, mode, color);
94 roundCornersFlag = !(mode & MODEFLAG_DONT_ROUND_CORNERS) &&
95 (dx == cardWidth) && (dy == cardHeight);
96 mode &= ~MODEFLAG_DONT_ROUND_CORNERS;
98 if((card < 0) || (card > CARD_MAX))
100 FIXME("Unexpected card: %d\n", card);
104 if((mode < MODE_FACEUP) || (mode > MODE_DECKO))
106 FIXME("Unexpected mode: %d\n", mode);
117 rasterOp = NOTSRCCOPY;
120 card = CARD_FREE_MASK;
128 case MODE_INVISIBLEGHOST:
129 card = CARD_FREE_MASK;
133 card = CARD_BACK_THE_X;
136 card = CARD_BACK_THE_O;
140 hMemoryDC = CreateCompatibleDC(hdc);
148 hBrush = CreateSolidBrush(color);
151 rect.right = x + cardWidth - 1;
152 rect.bottom = y + cardHeight - 1;
153 FillRect(hdc, &rect, hBrush);
158 hCardBitmap = cardBitmaps[card];
162 result = SelectObject(hMemoryDC, hCardBitmap);
163 if((result == 0) || (result == HGDI_ERROR))
169 SetBkColor(hdc, color);
173 savedPixels[0] = GetPixel(hdc, x, y);
174 savedPixels[1] = GetPixel(hdc, x + 1, y);
175 savedPixels[2] = GetPixel(hdc, x, y + 1);
176 savedPixels[3] = GetPixel(hdc, x + dx - 1, y);
177 savedPixels[4] = GetPixel(hdc, x + dx - 2, y);
178 savedPixels[5] = GetPixel(hdc, x + dx - 1, y + 1);
179 savedPixels[6] = GetPixel(hdc, x, y + dy - 1);
180 savedPixels[7] = GetPixel(hdc, x + 1, y + dy - 1);
181 savedPixels[8] = GetPixel(hdc, x, y + dy - 2);
182 savedPixels[9] = GetPixel(hdc, x + dx - 1, y + dy - 1);
183 savedPixels[10] = GetPixel(hdc, x + dx - 2, y + dy - 1);
184 savedPixels[11] = GetPixel(hdc, x + dx - 1, y + dy - 2);
187 if((cardWidth == dx) && (cardHeight == dy))
188 BitBlt(hdc, x, y, cardWidth, cardHeight, hMemoryDC, 0, 0, rasterOp);
190 StretchBlt(hdc, x, y, dx, dy, hMemoryDC, 0, 0, cardWidth, cardHeight, rasterOp);
194 SetPixel(hdc, x, y, savedPixels[0]);
195 SetPixel(hdc, x + 1, y, savedPixels[1]);
196 SetPixel(hdc, x, y + 1, savedPixels[2]);
197 SetPixel(hdc, x + dx - 1, y, savedPixels[3]);
198 SetPixel(hdc, x + dx - 2, y, savedPixels[4]);
199 SetPixel(hdc, x + dx - 1, y + 1, savedPixels[5]);
200 SetPixel(hdc, x, y + dy - 1, savedPixels[6]);
201 SetPixel(hdc, x + 1, y + dy - 1, savedPixels[7]);
202 SetPixel(hdc, x, y + dy - 2, savedPixels[8]);
203 SetPixel(hdc, x + dx - 1, y + dy - 1, savedPixels[9]);
204 SetPixel(hdc, x + dx - 2, y + dy - 1, savedPixels[10]);
205 SetPixel(hdc, x + dx - 1, y + dy - 2, savedPixels[11]);
215 /***********************************************************************
216 * Draws a card at position x, y in its default size (as returned by
219 * Mode controls how the card gets drawn:
220 * MODE_FACEUP ; draw card facing up
221 * MODE_FACEDOWN ; draw card facing down
222 * MODE_HILITE ; draw face up, with NOTSRCCOPY
223 * MODE_GHOST ; draw 'ghost' card
224 * MODE_REMOVE ; draw with background color
225 * MODE_INVISIBLEGHOST ; draw 'ghost' card, without clearing background
226 * MODE_DECKX ; draw X
227 * MODE_DECKO ; draw O
229 * The card parameter defines the card graphic to be drawn. If we are
230 * drawing fronts of cards, card should have a value from 0 through 51
231 * to represent the card face. If we are drawing card backs, 53 through
232 * 68 represent different card backs.
234 * When drawing card faces, two lowest bits represent the card suit
235 * (clubs, diamonds, hearts, spades), and the bits above that define the
236 * card value (ace, 2, ..., king). That is,
237 * card = face * 4 + suit.
239 * Color parameter defines the background color, used when drawing some
242 BOOL WINAPI cdtDraw(HDC hdc, int x, int y, int card, int mode, DWORD color)
244 TRACE("(%p, %d, %d, %d, %d, %ld)\n", hdc, x, y, card, mode, color);
246 return cdtDrawExt(hdc, x, y, cardWidth, cardHeight, card, mode, color);
250 /***********************************************************************
251 * Animates the card backs, e.g. blinking lights on the robot, the sun
252 * donning sunglasses, bats flying across the caste, etc.. Works only
253 * for cards of normal size (as drawn with cdtDraw). To draw frames of
254 * the card back animation, start with frame = 0, and increment the
255 * frame by one, until cdtAnimate returns FALSE (to indicate that we
256 * have gone through all frames of animation).
258 BOOL WINAPI cdtAnimate(HDC hdc, int cardback, int x, int y, int frame)
260 TRACE("(%p, %d, %d, %d, %d)\n", hdc, cardback, x, y, frame);
261 FIXME("Implement me.\n");
267 /***********************************************************************
268 * Frees resources reserved by cdtInitialize.
270 void WINAPI cdtTerm()
276 for(i = 0; i <= CARD_MAX; i++)
278 if(cardBitmaps[i] != 0)
279 DeleteObject(cardBitmaps[i]);
285 /***********************************************************************
288 BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
292 case DLL_PROCESS_ATTACH:
294 DisableThreadLibraryCalls( inst );
296 case DLL_PROCESS_DETACH: