1 /* 2 * ReactOS Cards 3 * 4 * Copyright (C) 2003 Filip Navara <xnavara@volny.org> 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21 #include <stdarg.h> 22 #include <windef.h> 23 #include <wingdi.h> 24 #include <winuser.h> 25 26 #include "cards.h" 27 28 HBITMAP g_CardBitmaps[MAX_CARD_BITMAPS]; 29 HINSTANCE g_hModule = 0; 30 31 /* 32 * Redundant function from 16-bit Windows time 33 */ 34 BOOL WINAPI WEP(DWORD Unknown) 35 { 36 UNREFERENCED_PARAMETER(Unknown); 37 return TRUE; 38 } 39 40 /* 41 * Initialize card library and return cards width and height 42 */ 43 BOOL WINAPI cdtInit(INT *Width, INT *Height) 44 { 45 DWORD dwIndex; 46 47 /* Report card width and height to user */ 48 *Width = CARD_WIDTH; 49 *Height = CARD_HEIGHT; 50 51 /* Load images */ 52 for (dwIndex = 0; dwIndex < MAX_CARD_BITMAPS; ++dwIndex) 53 g_CardBitmaps[dwIndex] = 54 (HBITMAP)LoadBitmapA(g_hModule, MAKEINTRESOURCEA(dwIndex + 1)); 55 56 return TRUE; 57 } 58 59 /* 60 * Terminate card library 61 */ 62 VOID WINAPI cdtTerm(VOID) 63 { 64 DWORD dwIndex; 65 66 /* Unload images */ 67 for (dwIndex = 0; dwIndex < MAX_CARD_BITMAPS; dwIndex++) 68 DeleteObject(g_CardBitmaps[dwIndex]); 69 } 70 71 /* 72 * Render card with no stretching 73 */ 74 BOOL WINAPI cdtDraw(HDC hdc, INT x, INT y, INT card, INT type, COLORREF color) 75 { 76 return cdtDrawExt(hdc, x, y, CARD_WIDTH, CARD_HEIGHT, card, type, color); 77 } 78 79 /* 80 * internal 81 */ 82 static __inline VOID BltCard(HDC hdc, INT x, INT y, INT dx, INT dy, HDC hdcCard, DWORD dwRasterOp, BOOL bStretch) 83 { 84 if (bStretch) 85 { 86 StretchBlt(hdc, x, y, dx, dy, hdcCard, 0, 0, CARD_WIDTH, CARD_HEIGHT, dwRasterOp); 87 } 88 else 89 { 90 BitBlt(hdc, x, y, dx, dy, hdcCard, 0, 0, dwRasterOp); 91 /* 92 * This is need when using Microsoft images, because they use two-color red/white images for 93 * red cards and thus needs fix-up of the edge to black color. 94 */ 95 #if 0 96 if (ISREDCARD(card)) 97 { 98 PatBlt(hdc, x, y + 2, 1, dy - 4, BLACKNESS); 99 PatBlt(hdc, x + dx - 1, y + 2, 1, dy - 4, BLACKNESS); 100 PatBlt(hdc, x + 2, y, dx - 4, 1, BLACKNESS); 101 PatBlt(hdc, x + 2, y + dy - 1, dx - 4, 1, BLACKNESS); 102 SetPixel(hdc, x + 1, y + 1, 0); 103 SetPixel(hdc, x + dx - 2, y + 1, 0); 104 SetPixel(hdc, x + 1, y + dy - 2, 0); 105 SetPixel(hdc, x + dx - 2, y + dy - 2, 0); 106 } 107 #endif 108 } 109 } 110 111 /* 112 * Render card 113 * 114 * Parameters: 115 * hdc - Handle of destination device context 116 * x - Position left 117 * y - Position right 118 * dx - Destination width 119 * dy - Destination height 120 * card - Image id (meaning depend on type) 121 * type - One of edt* constants 122 * color - Background color (?) 123 */ 124 BOOL WINAPI cdtDrawExt(HDC hdc, INT x, INT y, INT dx, INT dy, INT card, INT type, COLORREF color) 125 { 126 DWORD dwRasterOp = SRCCOPY; 127 BOOL bSaveEdges = TRUE; 128 BOOL bStretch = FALSE; 129 130 if (type & ectSAVEEDGESMASK) 131 { 132 type &= ~ectSAVEEDGESMASK; 133 bSaveEdges = FALSE; 134 } 135 136 if (dx != CARD_WIDTH || dy != CARD_HEIGHT) 137 { 138 bStretch = TRUE; 139 bSaveEdges = FALSE; 140 } 141 142 switch (type) 143 { 144 case ectINVERTED: 145 dwRasterOp = NOTSRCCOPY; 146 case ectFACES: 147 card = (card % 4) * 13 + (card / 4); 148 break; 149 case ectBACKS: 150 --card; 151 break; 152 case ectEMPTYNOBG: 153 dwRasterOp = SRCAND; 154 case ectEMPTY: 155 card = 52; 156 break; 157 case ectERASE: 158 break; 159 case ectREDX: 160 card = 66; 161 break; 162 case ectGREENO: 163 card = 67; 164 break; 165 default: 166 return FALSE; 167 } 168 169 if (type == ectEMPTY || type == ectERASE) 170 { 171 POINT pPoint; 172 HBRUSH hBrush, hOldBrush; 173 174 hBrush = CreateSolidBrush(color); 175 GetDCOrgEx(hdc, &pPoint); 176 SetBrushOrgEx(hdc, pPoint.x, pPoint.y, 0); 177 hOldBrush = SelectObject(hdc, hBrush); 178 PatBlt(hdc, x, y, dx, dy, PATCOPY); 179 SelectObject(hdc, hOldBrush); 180 DeleteObject(hBrush); 181 } 182 if (type != ectERASE) 183 { 184 HDC hdcCard; 185 COLORREF OldBkColor; 186 187 hdcCard = CreateCompatibleDC(hdc); 188 SelectObject(hdcCard, g_CardBitmaps[card]); 189 OldBkColor = SetBkColor(hdc, (type == ectFACES) ? 0xFFFFFF : color); 190 if (bSaveEdges) 191 { 192 COLORREF SavedPixels[12]; 193 SavedPixels[0] = GetPixel(hdc, x, y); 194 SavedPixels[1] = GetPixel(hdc, x + 1, y); 195 SavedPixels[2] = GetPixel(hdc, x, y + 1); 196 SavedPixels[3] = GetPixel(hdc, x + dx - 1, y); 197 SavedPixels[4] = GetPixel(hdc, x + dx - 2, y); 198 SavedPixels[5] = GetPixel(hdc, x + dx - 1, y + 1); 199 SavedPixels[6] = GetPixel(hdc, x, y + dy - 1); 200 SavedPixels[7] = GetPixel(hdc, x + 1, y + dy - 1); 201 SavedPixels[8] = GetPixel(hdc, x, y + dy - 2); 202 SavedPixels[9] = GetPixel(hdc, x + dx - 1, y + dy - 1); 203 SavedPixels[10] = GetPixel(hdc, x + dx - 2, y + dy - 1); 204 SavedPixels[11] = GetPixel(hdc, x + dx - 1, y + dy - 2); 205 206 BltCard(hdc, x, y, dx, dy, hdcCard, dwRasterOp, bStretch); 207 208 SetPixel(hdc, x, y, SavedPixels[0]); 209 SetPixel(hdc, x + 1, y, SavedPixels[1]); 210 SetPixel(hdc, x, y + 1, SavedPixels[2]); 211 SetPixel(hdc, x + dx - 1, y, SavedPixels[3]); 212 SetPixel(hdc, x + dx - 2, y, SavedPixels[4]); 213 SetPixel(hdc, x + dx - 1, y + 1, SavedPixels[5]); 214 SetPixel(hdc, x, y + dy - 1, SavedPixels[6]); 215 SetPixel(hdc, x + 1, y + dy - 1, SavedPixels[7]); 216 SetPixel(hdc, x, y + dy - 2, SavedPixels[8]); 217 SetPixel(hdc, x + dx - 1, y + dy - 1, SavedPixels[9]); 218 SetPixel(hdc, x + dx - 2, y + dy - 1, SavedPixels[10]); 219 SetPixel(hdc, x + dx - 1, y + dy - 2, SavedPixels[11]); 220 } 221 else 222 { 223 BltCard(hdc, x, y, dx, dy, hdcCard, dwRasterOp, bStretch); 224 } 225 SetBkColor(hdc, OldBkColor); 226 DeleteDC(hdcCard); 227 } 228 229 return TRUE; 230 } 231 232 233 /*********************************************************************** 234 * cdtAnimate (CARDS.@) 235 * 236 * Animate card background, we don't use it 237 */ 238 BOOL WINAPI cdtAnimate(HDC hdc, int cardback, int x, int y, int frame) 239 { 240 UNREFERENCED_PARAMETER(frame); 241 UNREFERENCED_PARAMETER(y); 242 UNREFERENCED_PARAMETER(x); 243 UNREFERENCED_PARAMETER(cardback); 244 UNREFERENCED_PARAMETER(hdc); 245 return TRUE; 246 } 247 248 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 249 { 250 UNREFERENCED_PARAMETER(lpvReserved); 251 252 if (fdwReason == DLL_PROCESS_ATTACH) 253 g_hModule = hinstDLL; 254 255 return TRUE; 256 } 257