Initial implementation of cards.dll.
[wine] / dlls / cards / cards.c
1 /*
2  * Cards dll implementation
3  *
4  * Copyright (C) 2004 Sami Nopanen
5  *
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.
10  *
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.
15  *
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
19  */
20
21 #include "config.h"
22
23 #include <stdarg.h>
24
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winuser.h"
28 #include "wingdi.h"
29
30 #include "cards.h"
31 #include "wine/debug.h"
32
33 WINE_DEFAULT_DEBUG_CHANNEL(cards);
34
35
36 void WINAPI cdtTerm(void);
37
38
39 static HINSTANCE hInst;
40 static int cardWidth;
41 static int cardHeight;
42 static HBITMAP cardBitmaps[CARD_MAX + 1];
43
44
45 /***********************************************************************
46  * Initializes the cards.dll library. Loads the card bitmaps from the
47  * resources, and initializes the card size variables.
48  */
49 BOOL WINAPI cdtInit(int *width, int *height)
50 {
51         BITMAP bm;
52         int i;
53
54         TRACE("(%p, %p)\n", width, height);
55
56         for(i = 0; i <= CARD_MAX; i++)
57                 cardBitmaps[i] = 0;
58
59         for(i = 0; i <= CARD_MAX; i++)
60         {
61                 cardBitmaps[i] = LoadBitmapA(hInst, MAKEINTRESOURCEA(i));
62                 if(cardBitmaps[i] == 0)
63                 {
64                         cdtTerm();
65                         return FALSE;
66                 }
67         }
68
69         GetObjectA(cardBitmaps[0], sizeof(BITMAP), &bm);
70         *width = cardWidth = bm.bmWidth;
71         *height = cardHeight = bm.bmHeight;
72         return TRUE;
73 }
74
75
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, type and color parameters.
80  */
81 BOOL WINAPI cdtDrawExt(HDC hdc, int x, int y, int dx, int dy, int card, int type, DWORD color)
82 {
83         HDC hMemoryDC;
84         HBITMAP hCardBitmap;
85         HGDIOBJ result;
86
87         TRACE("(%p, %d, %d, %d, %d, %d, %d, %ld)\n", hdc, x, y, dx, dy, card, type, color);
88
89         if((card < 0) || (card > CARD_MAX))
90         {
91                 FIXME("Unexpected card: %d\n", card);
92                 return 0;
93         }
94
95         if((type < 0) || (type > 2))
96                 FIXME("Unexpected type: %d\n", type);
97
98         hCardBitmap = cardBitmaps[card];
99         if(hCardBitmap == 0)
100                 return FALSE;
101
102         hMemoryDC = CreateCompatibleDC(hdc);
103         if(hMemoryDC == 0)
104                 return FALSE;
105
106         result = SelectObject(hMemoryDC, hCardBitmap);
107         if((result == 0) || (result == HGDI_ERROR))
108         {
109                 DeleteDC(hMemoryDC);
110                 return FALSE;
111         }
112
113         SetBkColor(hdc, color);
114
115         if((cardWidth == dx) && (cardHeight == dy))
116                 BitBlt(hdc, x, y, cardWidth, cardHeight, hMemoryDC, 0, 0, SRCCOPY);
117         else
118                 StretchBlt(hdc, x, y, dx, dy, hMemoryDC, 0, 0, cardWidth, cardHeight, SRCCOPY);
119
120         DeleteDC(hMemoryDC);
121
122         return TRUE;
123 }
124
125
126 /***********************************************************************
127  * Draws a card at position x, y in its default size (as returned by
128  * cdtInit.
129  *
130  * Type parameter controls whether the front (0), back (1), or inverted
131  * front (2) of the card is to be drawn.
132  *
133  * The card parameter defines the card graphic to be drawn. If we are
134  * drawing fronts of cards, card should have a value from 0 through 51
135  * to represent the card face. If we are drawing card backs, 53 through
136  * 68 represent different card backs.
137  *
138  * When drawing card faces, two lowest bits represent the card suit
139  * (clubs, diamonds, hearts, spades), and the bits above that define the
140  * card value (ace, 2, ..., king). That is,
141  *   card = face * 4 + suit.
142  *
143  * Color parameter defines the background color, used when drawing some
144  * card backs.
145  */
146 BOOL WINAPI cdtDraw(HDC hdc, int x, int y, int card, int type, DWORD color)
147 {
148         TRACE("(%p, %d, %d, %d, %d, %ld)\n", hdc, x, y, card, type, color);
149
150         return cdtDrawExt(hdc, x, y, cardWidth, cardHeight, card, type, color);
151 }
152
153
154 /***********************************************************************
155  * Animates the card backs, e.g. blinking lights on the robot, the sun
156  * donning sunglasses, bats flying across the caste, etc.. Works only
157  * for cards of normal size (as drawn with cdtDraw). To draw frames of
158  * the card back animation, start with frame = 0, and increment the
159  * frame by one, until cdtAnimate returns FALSE (to indicate that we
160  * have gone through all frames of animation).
161  */
162 BOOL WINAPI cdtAnimate(HDC hdc, int cardback, int x, int y, int frame)
163 {
164         TRACE("(%p, %d, %d, %d, %d)\n", hdc, cardback, x, y, frame);
165         FIXME("Implement me.");
166
167         return FALSE;
168 }
169
170
171 /***********************************************************************
172  * Frees resources reserved by cdtInitialize.
173  */
174 void WINAPI cdtTerm()
175 {
176         int i;
177
178         TRACE("()\n");
179
180         for(i = 0; i <= CARD_MAX; i++)
181         {
182                 if(cardBitmaps[i] != 0)
183                         DeleteObject(cardBitmaps[i]);
184                 cardBitmaps[i] = 0;
185         }
186 }
187
188
189 /***********************************************************************
190  * DllMain.
191  */
192 BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved)
193 {
194     switch (reason)
195     {
196     case DLL_PROCESS_ATTACH:
197         hInst = inst;
198         DisableThreadLibraryCalls( inst );
199         break;
200     case DLL_PROCESS_DETACH:
201         break;
202     }
203     return TRUE;
204 }