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 }
281