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, %d)\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, %d)\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 cdtInit.
272 void WINAPI
cdtTerm(void)
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
);