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