[CRT] spawn: define a unicode environment when needed
[reactos.git] / sdk / lib / 3rdparty / cardlib / cardbitmaps.cpp
1 //
2 // CardLib - Card bitmap support
3 //
4 // Freeware
5 // Copyright J Brown 2001
6 //
7
8 #include "cardlib.h"
9
10 #ifndef __REACTOS__
11 #pragma comment( lib, "..\\CardLib\\cards16.lib" )
12
13 extern "C" HINSTANCE WINAPI LoadLibrary16( PSTR );
14 extern "C" void WINAPI FreeLibrary16( HINSTANCE );
15 #endif
16
17 #define NUMCARDBITMAPS (52+16)
18
19 void PaintRect(HDC hdc, RECT *rect, COLORREF col);
20
21 void LoadCardBitmapsFromLibrary(HINSTANCE hCardDll, int *pwidth, int *pheight)
22 {
23 HBITMAP hBitmap;
24 HDC hdcCard = NULL;
25 HANDLE hOld;
26 int i, xpos;
27 int width, height;
28 BITMAP bmp;
29
30 for(i = 0; i < NUMCARDBITMAPS; i++)
31 {
32 //convert into the range used by the cdt_xxx functions
33 int val;
34
35 if(i < 52) val = (i % 4) * 13 + (i/4);
36 else val = i;
37
38 hBitmap = LoadBitmap(hCardDll, MAKEINTRESOURCE(val + 1));
39 GetObject(hBitmap, sizeof(bmp), &bmp);
40
41 width = bmp.bmWidth;
42 height = bmp.bmHeight;
43
44 if(i == 0) //if first time through, create BIG bitmap..
45 {
46 HDC hdc = GetDC(0);
47 __hdcCardBitmaps = CreateCompatibleDC(hdc);
48 __hbmCardBitmaps = CreateCompatibleBitmap(hdc, width * NUMCARDBITMAPS, height);
49 SelectObject(__hdcCardBitmaps, __hbmCardBitmaps);
50
51 hdcCard = CreateCompatibleDC(0);
52
53 ReleaseDC(0, hdc);
54 }
55
56 hOld = SelectObject(hdcCard, hBitmap);
57 BitBlt(__hdcCardBitmaps, i*width, 0, width, height, hdcCard, 0, 0, SRCCOPY);
58 SelectObject(hdcCard, hOld);
59
60 //Now draw a black border around each card...
61 xpos = i*width;
62 MoveToEx(__hdcCardBitmaps, xpos+2, 0, 0);
63 LineTo(__hdcCardBitmaps, xpos+width - 3, 0);
64 LineTo(__hdcCardBitmaps, xpos+width - 1, 2);
65 LineTo(__hdcCardBitmaps, xpos+width - 1, height - 3); //vertical
66 LineTo(__hdcCardBitmaps, xpos+width - 3, height - 1);
67 LineTo(__hdcCardBitmaps, xpos+2, height - 1);
68 LineTo(__hdcCardBitmaps, xpos+0, height - 3);
69 LineTo(__hdcCardBitmaps, xpos+0, 2);
70 LineTo(__hdcCardBitmaps, xpos+2, 0);
71
72 DeleteObject(hBitmap);
73 }
74
75 DeleteDC(hdcCard);
76
77 *pwidth = width;
78 *pheight = height;
79
80 }
81
82 void LoadCardBitmaps(void)
83 {
84 HINSTANCE hCardDll;
85
86
87 //If Windows NT/2000/XP
88 if(GetVersion() < 0x80000000)
89 {
90 hCardDll = LoadLibrary(TEXT("cards.dll"));
91
92 if(hCardDll == 0)
93 {
94 MessageBox(0, TEXT("Error loading cards.dll (32bit)"), TEXT("Shed"), MB_OK | MB_ICONEXCLAMATION);
95 PostQuitMessage(0);
96 return;
97 }
98
99 LoadCardBitmapsFromLibrary(hCardDll, &__cardwidth, &__cardheight);
100
101 FreeLibrary(hCardDll);
102 }
103 #ifndef __REACTOS__
104 //Else, Win9X
105 else
106 {
107 hCardDll = LoadLibrary16("cards.dll");
108
109 if(hCardDll == 0)
110 {
111 MessageBox(0, "Error loading cards.dll (16bit)", "Shed", MB_OK | MB_ICONEXCLAMATION);
112 PostQuitMessage(0);
113 return;
114 }
115
116 LoadCardBitmapsFromLibrary(hCardDll, &__cardwidth, &__cardheight);
117
118 FreeLibrary16(hCardDll);
119 }
120 #endif
121 }
122
123 void FreeCardBitmaps()
124 {
125 DeleteObject (__hbmCardBitmaps);
126 DeleteDC (__hdcCardBitmaps);
127 }
128 //
129 // Paint a checkered rectangle, with each alternate
130 // pixel being assigned a different colour
131 //
132 static void DrawCheckedRect(HDC hdc, RECT *rect, COLORREF fg, COLORREF bg)
133 {
134 static WORD wCheckPat[8] =
135 {
136 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555
137 };
138
139 HBITMAP hbmp;
140 HBRUSH hbr, hbrold;
141 COLORREF fgold, bgold;
142
143 hbmp = CreateBitmap(8, 8, 1, 1, wCheckPat);
144 hbr = CreatePatternBrush(hbmp);
145
146 //UnrealizeObject(hbr);
147
148 SetBrushOrgEx(hdc, rect->left, rect->top, 0);
149
150 hbrold = (HBRUSH)SelectObject(hdc, hbr);
151
152 fgold = SetTextColor(hdc, fg);
153 bgold = SetBkColor(hdc, bg);
154
155 PatBlt(hdc, rect->left, rect->top,
156 rect->right - rect->left,
157 rect->bottom - rect->top,
158 PATCOPY);
159
160 SetBkColor(hdc, bgold);
161 SetTextColor(hdc, fgold);
162
163 SelectObject(hdc, hbrold);
164 DeleteObject(hbr);
165 DeleteObject(hbmp);
166 }
167
168 void GetSinkCols(COLORREF crBase, COLORREF *fg, COLORREF *bg, COLORREF *sh1, COLORREF *sh2)
169 {
170 if(bg) *bg = crBase;
171 if(fg) *fg = ColorScaleRGB(crBase, RGB(255,255,255), 0.2);//RGB(49, 99, 140);
172 if(sh1) *sh1 = ColorScaleRGB(crBase, RGB(0,0,0), 0.4);
173 if(sh2) *sh2 = ColorScaleRGB(crBase, RGB(0,0,0), 0.2);
174 }
175
176 HBITMAP CreateSinkBmp(HDC hdcCompat, HDC hdc, COLORREF col, int width, int height)
177 {
178 HANDLE hold, hpold;
179 HBITMAP hbm = CreateCompatibleBitmap(hdcCompat, width, height);
180
181 HPEN hpfg, hpbg, hpsh, hpsh2;
182
183 RECT rect;
184 COLORREF fg, bg, shadow, shadow2;
185
186 GetSinkCols(col, &fg, &bg, &shadow, &shadow2);
187
188 hold = SelectObject(hdc, hbm);
189
190 //fill with a solid base colour
191 SetRect(&rect, 0,0,width,height);
192 PaintRect(hdc, &rect, MAKE_PALETTERGB(bg));
193
194 //draw the outline
195 hpfg = CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(fg));
196 hpbg = CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(bg));
197 hpsh = CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(shadow));
198 hpsh2= CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(shadow2));
199
200 hpold = SelectObject(hdc, hpsh);
201 MoveToEx(hdc, 2, 0, NULL);
202 LineTo (hdc, width-3,0);
203 LineTo (hdc, width-1, 2);
204
205 SelectObject(hdc, hpold);
206 hpold = SelectObject(hdc, hpsh2);
207 LineTo (hdc, width-1, height-3); //vertical
208 LineTo (hdc, width-3, height-1);
209 LineTo (hdc, 2, height-1);
210 LineTo (hdc, 0, height-3);
211 SelectObject(hdc, hpold);
212 hpold = SelectObject(hdc, hpsh);
213
214 //MoveToEx( hdc, 0, height-3,0);
215 LineTo (hdc, 0, 2);
216 LineTo (hdc, 2, 0);
217
218 SelectObject(hdc, hpold);
219
220 //draw the highlight (vertical)
221 hpold = SelectObject(hdc, hpfg);
222 MoveToEx(hdc, width - 2, 3, NULL);
223 LineTo (hdc, width - 2, height - 2);
224
225 //(horz)
226 MoveToEx(hdc, width - 3, height-2, NULL);
227 LineTo (hdc, 3, height-2);
228 SelectObject(hdc, hpold);
229
230 //draw the background
231 InflateRect(&rect, -2, -2);
232 DrawCheckedRect(hdc, &rect, MAKE_PALETTERGB(bg), MAKE_PALETTERGB(fg));
233
234 //overwrite the top-left background pixel
235 SetPixel(hdc, 2, 2, MAKE_PALETTERGB(bg));
236
237 DeleteObject(hpsh);
238 DeleteObject(hpsh2);
239 DeleteObject(hpfg);
240 DeleteObject(hpbg);
241
242
243 return hbm;
244 }
245
246
247
248 void CopyColor(PALETTEENTRY *pe, COLORREF col)
249 {
250 pe->peBlue = GetBValue(col);
251 pe->peGreen = GetGValue(col);
252 pe->peRed = GetRValue(col);
253 pe->peFlags = 0;
254 }
255
256 HPALETTE MakePaletteFromCols(COLORREF cols[], int nNumColours)
257 {
258 LOGPALETTE *lp;
259 HPALETTE hPalette;
260
261 // Allocate memory for the logical palette
262 lp = (LOGPALETTE *)HeapAlloc(
263 GetProcessHeap(), 0, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * nNumColours);
264
265 lp->palNumEntries = (WORD)nNumColours;
266 lp->palVersion = 0x300;
267
268 //copy the colours into the logical palette format
269 for(int i = 0; i < nNumColours; i++)
270 {
271 CopyColor(&lp->palPalEntry[i], cols[i]);
272 }
273
274 // create palette!
275 hPalette = CreatePalette(lp);
276
277 HeapFree(GetProcessHeap(), 0, lp);
278
279 return hPalette;
280 }