mirror of
https://github.com/reactos/reactos.git
synced 2024-11-20 06:15:26 +00:00
280 lines
7.1 KiB
C++
280 lines
7.1 KiB
C++
//
|
|
// CardLib - Card bitmap support
|
|
//
|
|
// Freeware
|
|
// Copyright J Brown 2001
|
|
//
|
|
|
|
#include "cardlib.h"
|
|
|
|
#ifndef __REACTOS__
|
|
#pragma comment( lib, "..\\CardLib\\cards16.lib" )
|
|
|
|
extern "C" HINSTANCE WINAPI LoadLibrary16( PSTR );
|
|
extern "C" void WINAPI FreeLibrary16( HINSTANCE );
|
|
#endif
|
|
|
|
#define NUMCARDBITMAPS (52+16)
|
|
|
|
void PaintRect(HDC hdc, RECT *rect, COLORREF col);
|
|
|
|
void LoadCardBitmapsFromLibrary(HINSTANCE hCardDll, int *pwidth, int *pheight)
|
|
{
|
|
HBITMAP hBitmap;
|
|
HDC hdcCard = NULL;
|
|
HANDLE hOld;
|
|
int i, xpos;
|
|
int width, height;
|
|
BITMAP bmp;
|
|
|
|
for(i = 0; i < NUMCARDBITMAPS; i++)
|
|
{
|
|
//convert into the range used by the cdt_xxx functions
|
|
int val;
|
|
|
|
if(i < 52) val = (i % 4) * 13 + (i/4);
|
|
else val = i;
|
|
|
|
hBitmap = LoadBitmap(hCardDll, MAKEINTRESOURCE(val + 1));
|
|
GetObject(hBitmap, sizeof(bmp), &bmp);
|
|
|
|
width = bmp.bmWidth;
|
|
height = bmp.bmHeight;
|
|
|
|
if(i == 0) //if first time through, create BIG bitmap..
|
|
{
|
|
HDC hdc = GetDC(0);
|
|
__hdcCardBitmaps = CreateCompatibleDC(hdc);
|
|
__hbmCardBitmaps = CreateCompatibleBitmap(hdc, width * NUMCARDBITMAPS, height);
|
|
SelectObject(__hdcCardBitmaps, __hbmCardBitmaps);
|
|
|
|
hdcCard = CreateCompatibleDC(0);
|
|
|
|
ReleaseDC(0, hdc);
|
|
}
|
|
|
|
hOld = SelectObject(hdcCard, hBitmap);
|
|
BitBlt(__hdcCardBitmaps, i*width, 0, width, height, hdcCard, 0, 0, SRCCOPY);
|
|
SelectObject(hdcCard, hOld);
|
|
|
|
//Now draw a black border around each card...
|
|
xpos = i*width;
|
|
MoveToEx(__hdcCardBitmaps, xpos+2, 0, 0);
|
|
LineTo(__hdcCardBitmaps, xpos+width - 3, 0);
|
|
LineTo(__hdcCardBitmaps, xpos+width - 1, 2);
|
|
LineTo(__hdcCardBitmaps, xpos+width - 1, height - 3); //vertical
|
|
LineTo(__hdcCardBitmaps, xpos+width - 3, height - 1);
|
|
LineTo(__hdcCardBitmaps, xpos+2, height - 1);
|
|
LineTo(__hdcCardBitmaps, xpos+0, height - 3);
|
|
LineTo(__hdcCardBitmaps, xpos+0, 2);
|
|
LineTo(__hdcCardBitmaps, xpos+2, 0);
|
|
|
|
DeleteObject(hBitmap);
|
|
}
|
|
|
|
DeleteDC(hdcCard);
|
|
|
|
*pwidth = width;
|
|
*pheight = height;
|
|
|
|
}
|
|
|
|
void LoadCardBitmaps(void)
|
|
{
|
|
HINSTANCE hCardDll;
|
|
|
|
|
|
//If Windows NT/2000/XP
|
|
if(GetVersion() < 0x80000000)
|
|
{
|
|
hCardDll = LoadLibrary(TEXT("cards.dll"));
|
|
|
|
if(hCardDll == 0)
|
|
{
|
|
MessageBox(0, TEXT("Error loading cards.dll (32bit)"), TEXT("Shed"), MB_OK | MB_ICONEXCLAMATION);
|
|
PostQuitMessage(0);
|
|
return;
|
|
}
|
|
|
|
LoadCardBitmapsFromLibrary(hCardDll, &__cardwidth, &__cardheight);
|
|
|
|
FreeLibrary(hCardDll);
|
|
}
|
|
#ifndef __REACTOS__
|
|
//Else, Win9X
|
|
else
|
|
{
|
|
hCardDll = LoadLibrary16("cards.dll");
|
|
|
|
if(hCardDll == 0)
|
|
{
|
|
MessageBox(0, "Error loading cards.dll (16bit)", "Shed", MB_OK | MB_ICONEXCLAMATION);
|
|
PostQuitMessage(0);
|
|
return;
|
|
}
|
|
|
|
LoadCardBitmapsFromLibrary(hCardDll, &__cardwidth, &__cardheight);
|
|
|
|
FreeLibrary16(hCardDll);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void FreeCardBitmaps()
|
|
{
|
|
DeleteObject (__hbmCardBitmaps);
|
|
DeleteDC (__hdcCardBitmaps);
|
|
}
|
|
//
|
|
// Paint a checkered rectangle, with each alternate
|
|
// pixel being assigned a different colour
|
|
//
|
|
static void DrawCheckedRect(HDC hdc, RECT *rect, COLORREF fg, COLORREF bg)
|
|
{
|
|
static WORD wCheckPat[8] =
|
|
{
|
|
0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555
|
|
};
|
|
|
|
HBITMAP hbmp;
|
|
HBRUSH hbr, hbrold;
|
|
COLORREF fgold, bgold;
|
|
|
|
hbmp = CreateBitmap(8, 8, 1, 1, wCheckPat);
|
|
hbr = CreatePatternBrush(hbmp);
|
|
|
|
//UnrealizeObject(hbr);
|
|
|
|
SetBrushOrgEx(hdc, rect->left, rect->top, 0);
|
|
|
|
hbrold = (HBRUSH)SelectObject(hdc, hbr);
|
|
|
|
fgold = SetTextColor(hdc, fg);
|
|
bgold = SetBkColor(hdc, bg);
|
|
|
|
PatBlt(hdc, rect->left, rect->top,
|
|
rect->right - rect->left,
|
|
rect->bottom - rect->top,
|
|
PATCOPY);
|
|
|
|
SetBkColor(hdc, bgold);
|
|
SetTextColor(hdc, fgold);
|
|
|
|
SelectObject(hdc, hbrold);
|
|
DeleteObject(hbr);
|
|
DeleteObject(hbmp);
|
|
}
|
|
|
|
void GetSinkCols(COLORREF crBase, COLORREF *fg, COLORREF *bg, COLORREF *sh1, COLORREF *sh2)
|
|
{
|
|
if(bg) *bg = crBase;
|
|
if(fg) *fg = ColorScaleRGB(crBase, RGB(255,255,255), 0.2);//RGB(49, 99, 140);
|
|
if(sh1) *sh1 = ColorScaleRGB(crBase, RGB(0,0,0), 0.4);
|
|
if(sh2) *sh2 = ColorScaleRGB(crBase, RGB(0,0,0), 0.2);
|
|
}
|
|
|
|
HBITMAP CreateSinkBmp(HDC hdcCompat, HDC hdc, COLORREF col, int width, int height)
|
|
{
|
|
HANDLE hold, hpold;
|
|
HBITMAP hbm = CreateCompatibleBitmap(hdcCompat, width, height);
|
|
|
|
HPEN hpfg, hpbg, hpsh, hpsh2;
|
|
|
|
RECT rect;
|
|
COLORREF fg, bg, shadow, shadow2;
|
|
|
|
GetSinkCols(col, &fg, &bg, &shadow, &shadow2);
|
|
|
|
hold = SelectObject(hdc, hbm);
|
|
|
|
//fill with a solid base colour
|
|
SetRect(&rect, 0,0,width,height);
|
|
PaintRect(hdc, &rect, MAKE_PALETTERGB(bg));
|
|
|
|
//draw the outline
|
|
hpfg = CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(fg));
|
|
hpbg = CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(bg));
|
|
hpsh = CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(shadow));
|
|
hpsh2= CreatePen(PS_SOLID, 0, MAKE_PALETTERGB(shadow2));
|
|
|
|
hpold = SelectObject(hdc, hpsh);
|
|
MoveToEx(hdc, 2, 0, NULL);
|
|
LineTo (hdc, width-3,0);
|
|
LineTo (hdc, width-1, 2);
|
|
|
|
SelectObject(hdc, hpold);
|
|
hpold = SelectObject(hdc, hpsh2);
|
|
LineTo (hdc, width-1, height-3); //vertical
|
|
LineTo (hdc, width-3, height-1);
|
|
LineTo (hdc, 2, height-1);
|
|
LineTo (hdc, 0, height-3);
|
|
SelectObject(hdc, hpold);
|
|
hpold = SelectObject(hdc, hpsh);
|
|
|
|
//MoveToEx( hdc, 0, height-3,0);
|
|
LineTo (hdc, 0, 2);
|
|
LineTo (hdc, 2, 0);
|
|
|
|
SelectObject(hdc, hpold);
|
|
|
|
//draw the highlight (vertical)
|
|
hpold = SelectObject(hdc, hpfg);
|
|
MoveToEx(hdc, width - 2, 3, NULL);
|
|
LineTo (hdc, width - 2, height - 2);
|
|
|
|
//(horz)
|
|
MoveToEx(hdc, width - 3, height-2, NULL);
|
|
LineTo (hdc, 3, height-2);
|
|
SelectObject(hdc, hpold);
|
|
|
|
//draw the background
|
|
InflateRect(&rect, -2, -2);
|
|
DrawCheckedRect(hdc, &rect, MAKE_PALETTERGB(bg), MAKE_PALETTERGB(fg));
|
|
|
|
//overwrite the top-left background pixel
|
|
SetPixel(hdc, 2, 2, MAKE_PALETTERGB(bg));
|
|
|
|
DeleteObject(hpsh);
|
|
DeleteObject(hpsh2);
|
|
DeleteObject(hpfg);
|
|
DeleteObject(hpbg);
|
|
|
|
|
|
return hbm;
|
|
}
|
|
|
|
|
|
|
|
void CopyColor(PALETTEENTRY *pe, COLORREF col)
|
|
{
|
|
pe->peBlue = GetBValue(col);
|
|
pe->peGreen = GetGValue(col);
|
|
pe->peRed = GetRValue(col);
|
|
pe->peFlags = 0;
|
|
}
|
|
|
|
HPALETTE MakePaletteFromCols(COLORREF cols[], int nNumColours)
|
|
{
|
|
LOGPALETTE *lp;
|
|
HPALETTE hPalette;
|
|
|
|
// Allocate memory for the logical palette
|
|
lp = (LOGPALETTE *)HeapAlloc(
|
|
GetProcessHeap(), 0, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * nNumColours);
|
|
|
|
lp->palNumEntries = (WORD)nNumColours;
|
|
lp->palVersion = 0x300;
|
|
|
|
//copy the colours into the logical palette format
|
|
for(int i = 0; i < nNumColours; i++)
|
|
{
|
|
CopyColor(&lp->palPalEntry[i], cols[i]);
|
|
}
|
|
|
|
// create palette!
|
|
hPalette = CreatePalette(lp);
|
|
|
|
HeapFree(GetProcessHeap(), 0, lp);
|
|
|
|
return hPalette;
|
|
}
|