Reactos
at master 280 lines 7.3 kB view raw
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 13extern "C" HINSTANCE WINAPI LoadLibrary16( PSTR ); 14extern "C" void WINAPI FreeLibrary16( HINSTANCE ); 15#endif 16 17#define NUMCARDBITMAPS (52+16) 18 19void PaintRect(HDC hdc, RECT *rect, COLORREF col); 20 21void 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 82void 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 123void 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// 132static 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 168void 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 176HBITMAP 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 248void 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 256HPALETTE 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}