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
29 #include "wine/debug.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(cards
);
34 void WINAPI
cdtTerm(void);
37 static HINSTANCE hInst
;
39 static int cardHeight
;
40 static HBITMAP cardBitmaps
[CARD_MAX
+ 1];
43 /***********************************************************************
44 * Initializes the cards.dll library. Loads the card bitmaps from the
45 * resources, and initializes the card size variables.
47 BOOL WINAPI
cdtInit(int *width
, int *height
)
52 TRACE("(%p, %p)\n", width
, height
);
54 for(i
= 0; i
<= CARD_MAX
; i
++)
57 for(i
= 0; i
<= CARD_MAX
; i
++)
59 cardBitmaps
[i
] = LoadBitmapA(hInst
, MAKEINTRESOURCEA(i
));
60 if(cardBitmaps
[i
] == 0)
67 GetObjectA(cardBitmaps
[0], sizeof(BITMAP
), &bm
);
68 *width
= cardWidth
= bm
.bmWidth
;
69 *height
= cardHeight
= bm
.bmHeight
;
73 static DWORD
do_blt(HDC hdc
, int x
, int y
, int dx
, int dy
, HDC hMemoryDC
, DWORD rasterOp
)
75 if((cardWidth
== dx
) && (cardHeight
== dy
))
76 return BitBlt(hdc
, x
, y
, cardWidth
, cardHeight
, hMemoryDC
, 0, 0, rasterOp
);
77 return StretchBlt(hdc
, x
, y
, dx
, dy
, hMemoryDC
, 0, 0, cardWidth
, cardHeight
, rasterOp
);
80 /***********************************************************************
81 * Draw a card. Unlike cdtDrawCard, this version allows you to stretch
82 * card bitmaps to the size you specify (dx, dy). See cdtDraw for info
83 * on card, mode and color parameters.
85 BOOL WINAPI
cdtDrawExt(HDC hdc
, int x
, int y
, int dx
, int dy
, int card
, int mode
, DWORD color
)
90 DWORD rasterOp
= SRCCOPY
;
91 BOOL roundCornersFlag
;
92 BOOL eraseFlag
= FALSE
;
95 TRACE("(%p, %d, %d, %d, %d, %d, %d, %d)\n", hdc
, x
, y
, dx
, dy
, card
, mode
, color
);
97 roundCornersFlag
= !(mode
& MODEFLAG_DONT_ROUND_CORNERS
) &&
98 (dx
== cardWidth
) && (dy
== cardHeight
);
99 mode
&= ~MODEFLAG_DONT_ROUND_CORNERS
;
101 if((card
< 0) || (card
> CARD_MAX
))
103 FIXME("Unexpected card: %d\n", card
);
107 if((mode
< MODE_FACEUP
) || (mode
> MODE_DECKO
))
109 FIXME("Unexpected mode: %d\n", mode
);
120 rasterOp
= NOTSRCCOPY
;
123 card
= CARD_FREE_MASK
;
131 case MODE_INVISIBLEGHOST
:
132 card
= CARD_FREE_MASK
;
136 card
= CARD_BACK_THE_X
;
139 card
= CARD_BACK_THE_O
;
143 hMemoryDC
= CreateCompatibleDC(hdc
);
151 hBrush
= CreateSolidBrush(color
);
152 SetRect(&rect
, x
, y
, x
+ cardWidth
- 1, 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 /* NOTE: native uses Get/SetPixel for corners, but that really
174 * hurts on X11 since it needs a server round-trip for each pixel.
175 * So we use a clip region instead. */
176 HRGN saved
= CreateRectRgn( 0, 0, 0, 0 );
177 HRGN line
= CreateRectRgn( x
+ 2, y
, x
+ dx
- 2, y
+ 1 );
178 HRGN clip
= CreateRectRgn( x
, y
+ 2, x
+ dx
, y
+ dy
- 2 );
180 CombineRgn( clip
, clip
, line
, RGN_OR
);
181 SetRectRgn( line
, x
+ 1, y
+ 1, x
+ dx
- 1, y
+ 2 );
182 CombineRgn( clip
, clip
, line
, RGN_OR
);
183 SetRectRgn( line
, x
+ 1, y
+ dy
- 2, x
+ dx
- 1, y
+ dy
- 1 );
184 CombineRgn( clip
, clip
, line
, RGN_OR
);
185 SetRectRgn( line
, x
+ 2, y
+ dy
- 1, x
+ dx
- 2, y
+ dy
);
186 CombineRgn( clip
, clip
, line
, RGN_OR
);
187 DeleteObject( line
);
189 if (!GetClipRgn( hdc
, saved
))
191 DeleteObject( saved
);
194 ExtSelectClipRgn( hdc
, clip
, RGN_AND
);
195 DeleteObject( clip
);
197 do_blt(hdc
, x
, y
, dx
, dy
, hMemoryDC
, rasterOp
);
199 SelectClipRgn( hdc
, saved
);
200 if (saved
) DeleteObject( saved
);
203 do_blt(hdc
, x
, y
, dx
, dy
, hMemoryDC
, rasterOp
);
212 /***********************************************************************
213 * Draws a card at position x, y in its default size (as returned by
216 * Mode controls how the card gets drawn:
217 * MODE_FACEUP ; draw card facing up
218 * MODE_FACEDOWN ; draw card facing down
219 * MODE_HILITE ; draw face up, with NOTSRCCOPY
220 * MODE_GHOST ; draw 'ghost' card
221 * MODE_REMOVE ; draw with background color
222 * MODE_INVISIBLEGHOST ; draw 'ghost' card, without clearing background
223 * MODE_DECKX ; draw X
224 * MODE_DECKO ; draw O
226 * The card parameter defines the card graphic to be drawn. If we are
227 * drawing fronts of cards, card should have a value from 0 through 51
228 * to represent the card face. If we are drawing card backs, 53 through
229 * 68 represent different card backs.
231 * When drawing card faces, two lowest bits represent the card suit
232 * (clubs, diamonds, hearts, spades), and the bits above that define the
233 * card value (ace, 2, ..., king). That is,
234 * card = face * 4 + suit.
236 * Color parameter defines the background color, used when drawing some
239 BOOL WINAPI
cdtDraw(HDC hdc
, int x
, int y
, int card
, int mode
, DWORD color
)
241 TRACE("(%p, %d, %d, %d, %d, %d)\n", hdc
, x
, y
, card
, mode
, color
);
243 return cdtDrawExt(hdc
, x
, y
, cardWidth
, cardHeight
, card
, mode
, color
);
247 /***********************************************************************
248 * Animates the card backs, e.g. blinking lights on the robot, the sun
249 * donning sunglasses, bats flying across the caste, etc.. Works only
250 * for cards of normal size (as drawn with cdtDraw). To draw frames of
251 * the card back animation, start with frame = 0, and increment the
252 * frame by one, until cdtAnimate returns FALSE (to indicate that we
253 * have gone through all frames of animation).
255 BOOL WINAPI
cdtAnimate(HDC hdc
, int cardback
, int x
, int y
, int frame
)
257 TRACE("(%p, %d, %d, %d, %d)\n", hdc
, cardback
, x
, y
, frame
);
258 FIXME("Implement me.\n");
264 /***********************************************************************
265 * Frees resources reserved by cdtInit.
267 void WINAPI
cdtTerm(void)
273 for(i
= 0; i
<= CARD_MAX
; i
++)
275 if(cardBitmaps
[i
] != 0)
276 DeleteObject(cardBitmaps
[i
]);
282 /***********************************************************************
285 BOOL WINAPI
DllMain(HINSTANCE inst
, DWORD reason
, LPVOID reserved
)
289 case DLL_PROCESS_ATTACH
:
291 DisableThreadLibraryCalls( inst
);