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