xref: /reactos/dll/win32/cards/cards.c (revision c2c66aff)
1 /*
2  * ReactOS Cards
3  *
4  * Copyright (C) 2003  Filip Navara <xnavara@volny.org>
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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20 
21 #include <stdarg.h>
22 #include <windef.h>
23 #include <wingdi.h>
24 #include <winuser.h>
25 
26 #include "cards.h"
27 
28 HBITMAP g_CardBitmaps[MAX_CARD_BITMAPS];
29 HINSTANCE g_hModule = 0;
30 
31 /*
32  * Redundant function from 16-bit Windows time
33  */
WEP(DWORD Unknown)34 BOOL WINAPI WEP(DWORD Unknown)
35 {
36     UNREFERENCED_PARAMETER(Unknown);
37     return TRUE;
38 }
39 
40 /*
41  * Initialize card library and return cards width and height
42  */
cdtInit(INT * Width,INT * Height)43 BOOL WINAPI cdtInit(INT *Width, INT *Height)
44 {
45     DWORD dwIndex;
46 
47     /* Report card width and height to user */
48     *Width = CARD_WIDTH;
49     *Height = CARD_HEIGHT;
50 
51     /* Load images */
52     for (dwIndex = 0; dwIndex < MAX_CARD_BITMAPS; ++dwIndex)
53         g_CardBitmaps[dwIndex] =
54             (HBITMAP)LoadBitmapA(g_hModule, MAKEINTRESOURCEA(dwIndex + 1));
55 
56     return TRUE;
57 }
58 
59 /*
60  * Terminate card library
61  */
cdtTerm(VOID)62 VOID WINAPI cdtTerm(VOID)
63 {
64     DWORD dwIndex;
65 
66     /* Unload images */
67     for (dwIndex = 0; dwIndex < MAX_CARD_BITMAPS; dwIndex++)
68         DeleteObject(g_CardBitmaps[dwIndex]);
69 }
70 
71 /*
72  * Render card with no stretching
73  */
cdtDraw(HDC hdc,INT x,INT y,INT card,INT type,COLORREF color)74 BOOL WINAPI cdtDraw(HDC hdc, INT x, INT y, INT card, INT type, COLORREF color)
75 {
76     return cdtDrawExt(hdc, x, y, CARD_WIDTH, CARD_HEIGHT, card, type, color);
77 }
78 
79 /*
80  * internal
81  */
BltCard(HDC hdc,INT x,INT y,INT dx,INT dy,HDC hdcCard,DWORD dwRasterOp,BOOL bStretch)82 static __inline VOID BltCard(HDC hdc, INT x, INT y, INT dx, INT dy, HDC hdcCard, DWORD dwRasterOp, BOOL bStretch)
83 {
84     if (bStretch)
85     {
86         StretchBlt(hdc, x, y, dx, dy, hdcCard, 0, 0, CARD_WIDTH, CARD_HEIGHT, dwRasterOp);
87     }
88     else
89     {
90         BitBlt(hdc, x, y, dx, dy, hdcCard, 0, 0, dwRasterOp);
91 /*
92  * This is need when using Microsoft images, because they use two-color red/white images for
93  * red cards and thus needs fix-up of the edge to black color.
94  */
95 #if 0
96         if (ISREDCARD(card))
97         {
98             PatBlt(hdc, x, y + 2, 1, dy - 4, BLACKNESS);
99             PatBlt(hdc, x + dx - 1, y + 2, 1, dy - 4, BLACKNESS);
100             PatBlt(hdc, x + 2, y, dx - 4, 1, BLACKNESS);
101             PatBlt(hdc, x + 2, y + dy - 1, dx - 4, 1, BLACKNESS);
102             SetPixel(hdc, x + 1, y + 1, 0);
103             SetPixel(hdc, x + dx - 2, y + 1, 0);
104             SetPixel(hdc, x + 1, y + dy - 2, 0);
105             SetPixel(hdc, x + dx - 2, y + dy - 2, 0);
106         }
107 #endif
108     }
109 }
110 
111 /*
112  * Render card
113  *
114  * Parameters:
115  *    hdc - Handle of destination device context
116  *    x - Position left
117  *    y - Position right
118  *    dx - Destination width
119  *    dy - Destination height
120  *    card - Image id (meaning depend on type)
121  *    type - One of edt* constants
122  *    color - Background color (?)
123  */
cdtDrawExt(HDC hdc,INT x,INT y,INT dx,INT dy,INT card,INT type,COLORREF color)124 BOOL WINAPI cdtDrawExt(HDC hdc, INT x, INT y, INT dx, INT dy, INT card, INT type, COLORREF color)
125 {
126     DWORD dwRasterOp = SRCCOPY;
127     BOOL bSaveEdges = TRUE;
128     BOOL bStretch = FALSE;
129 
130     if (type & ectSAVEEDGESMASK)
131     {
132         type &= ~ectSAVEEDGESMASK;
133         bSaveEdges = FALSE;
134     }
135 
136     if (dx != CARD_WIDTH || dy != CARD_HEIGHT)
137     {
138         bStretch = TRUE;
139         bSaveEdges = FALSE;
140     }
141 
142     switch (type)
143     {
144         case ectINVERTED:
145             dwRasterOp = NOTSRCCOPY;
146         case ectFACES:
147             card = (card % 4) * 13 + (card / 4);
148             break;
149         case ectBACKS:
150             --card;
151             break;
152         case ectEMPTYNOBG:
153             dwRasterOp = SRCAND;
154         case ectEMPTY:
155             card = 52;
156             break;
157         case ectERASE:
158             break;
159         case ectREDX:
160             card = 66;
161             break;
162         case ectGREENO:
163             card = 67;
164             break;
165         default:
166             return FALSE;
167     }
168 
169     if (type == ectEMPTY || type == ectERASE)
170     {
171         POINT pPoint;
172         HBRUSH hBrush, hOldBrush;
173 
174         hBrush = CreateSolidBrush(color);
175         GetDCOrgEx(hdc, &pPoint);
176         SetBrushOrgEx(hdc, pPoint.x, pPoint.y, 0);
177         hOldBrush = SelectObject(hdc, hBrush);
178         PatBlt(hdc, x, y, dx, dy, PATCOPY);
179         SelectObject(hdc, hOldBrush);
180         DeleteObject(hBrush);
181     }
182     if (type != ectERASE)
183     {
184         HDC hdcCard;
185         COLORREF OldBkColor;
186 
187         hdcCard = CreateCompatibleDC(hdc);
188         SelectObject(hdcCard, g_CardBitmaps[card]);
189         OldBkColor = SetBkColor(hdc, (type == ectFACES) ? 0xFFFFFF : color);
190         if (bSaveEdges)
191         {
192             COLORREF SavedPixels[12];
193             SavedPixels[0]  = GetPixel(hdc, x, y);
194             SavedPixels[1]  = GetPixel(hdc, x + 1, y);
195             SavedPixels[2]  = GetPixel(hdc, x, y + 1);
196             SavedPixels[3]  = GetPixel(hdc, x + dx - 1, y);
197             SavedPixels[4]  = GetPixel(hdc, x + dx - 2, y);
198             SavedPixels[5]  = GetPixel(hdc, x + dx - 1, y + 1);
199             SavedPixels[6]  = GetPixel(hdc, x, y + dy - 1);
200             SavedPixels[7]  = GetPixel(hdc, x + 1, y + dy - 1);
201             SavedPixels[8]  = GetPixel(hdc, x, y + dy - 2);
202             SavedPixels[9]  = GetPixel(hdc, x + dx - 1, y + dy - 1);
203             SavedPixels[10] = GetPixel(hdc, x + dx - 2, y + dy - 1);
204             SavedPixels[11] = GetPixel(hdc, x + dx - 1, y + dy - 2);
205 
206             BltCard(hdc, x, y, dx, dy, hdcCard, dwRasterOp, bStretch);
207 
208             SetPixel(hdc, x, y, SavedPixels[0]);
209             SetPixel(hdc, x + 1, y, SavedPixels[1]);
210             SetPixel(hdc, x, y + 1, SavedPixels[2]);
211             SetPixel(hdc, x + dx - 1, y, SavedPixels[3]);
212             SetPixel(hdc, x + dx - 2, y, SavedPixels[4]);
213             SetPixel(hdc, x + dx - 1, y + 1, SavedPixels[5]);
214             SetPixel(hdc, x, y + dy - 1, SavedPixels[6]);
215             SetPixel(hdc, x + 1, y + dy - 1, SavedPixels[7]);
216             SetPixel(hdc, x, y + dy - 2, SavedPixels[8]);
217             SetPixel(hdc, x + dx - 1, y + dy - 1, SavedPixels[9]);
218             SetPixel(hdc, x + dx - 2, y + dy - 1, SavedPixels[10]);
219             SetPixel(hdc, x + dx - 1, y + dy - 2, SavedPixels[11]);
220         }
221         else
222         {
223             BltCard(hdc, x, y, dx, dy, hdcCard, dwRasterOp, bStretch);
224         }
225         SetBkColor(hdc, OldBkColor);
226         DeleteDC(hdcCard);
227     }
228 
229     return TRUE;
230 }
231 
232 
233 /***********************************************************************
234  *             cdtAnimate   (CARDS.@)
235  *
236  * Animate card background, we don't use it
237  */
cdtAnimate(HDC hdc,int cardback,int x,int y,int frame)238 BOOL WINAPI cdtAnimate(HDC hdc, int cardback, int x, int y, int frame)
239 {
240     UNREFERENCED_PARAMETER(frame);
241     UNREFERENCED_PARAMETER(y);
242     UNREFERENCED_PARAMETER(x);
243     UNREFERENCED_PARAMETER(cardback);
244     UNREFERENCED_PARAMETER(hdc);
245     return TRUE;
246 }
247 
DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)248 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
249 {
250     UNREFERENCED_PARAMETER(lpvReserved);
251 
252     if (fdwReason == DLL_PROCESS_ATTACH)
253         g_hModule = hinstDLL;
254 
255     return TRUE;
256 }
257