/* * ReactOS Cards * * Copyright (C) 2003 Filip Navara * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "windef.h" #include "winbase.h" #include "wingdi.h" #include "winuser.h" #include "cards.h" HBITMAP g_CardBitmaps[MAX_CARD_BITMAPS]; HINSTANCE g_hModule = 0; /* * Redundant function from 16-bit Windows time */ BOOL WINAPI WEP(DWORD Unknown) { return TRUE; } /* * Initialize card library and return cards width and height */ BOOL WINAPI cdtInit(INT *Width, INT *Height) { DWORD dwIndex; /* Report card width and height to user */ *Width = CARD_WIDTH; *Height = CARD_HEIGHT; /* Load images */ for (dwIndex = 0; dwIndex < MAX_CARD_BITMAPS; ++dwIndex) g_CardBitmaps[dwIndex] = (HBITMAP)LoadBitmapA(g_hModule, MAKEINTRESOURCEA(dwIndex + 1)); return TRUE; } /* * Terminate card library */ VOID WINAPI cdtTerm(VOID) { DWORD dwIndex; /* Unload images */ for (dwIndex = 0; dwIndex < MAX_CARD_BITMAPS; dwIndex++) DeleteObject(g_CardBitmaps[dwIndex]); } /* * Render card with no stretching */ BOOL WINAPI cdtDraw(HDC hdc, INT x, INT y, INT card, INT type, COLORREF color) { return cdtDrawExt(hdc, x, y, CARD_WIDTH, CARD_HEIGHT, card, type, color); } /* * Render card * * Parameters: * hdc - Handle of destination device context * x - Position left * y - Position right * dx - Destination width * dy - Destination height * card - Image id (meaning depend on type) * type - One of edt* constants * color - Background color (?) */ BOOL WINAPI cdtDrawExt(HDC hdc, INT x, INT y, INT dx, INT dy, INT card, INT type, COLORREF color) { HDC hdcCard; COLORREF SavedPixels[12]; DWORD dwRasterOp = SRCCOPY, OldBkColor; BOOL bSaveEdges = TRUE; BOOL bStretch = FALSE; if (type & ectSAVEEDGESMASK) { type &= ~ectSAVEEDGESMASK; bSaveEdges = FALSE; } if (dx != CARD_WIDTH || dy != CARD_HEIGHT) { bStretch = TRUE; bSaveEdges = FALSE; } switch (type) { case ectINVERTED: dwRasterOp = NOTSRCCOPY; case ectFACES: card = (card % 4) * 13 + (card / 4); break; case ectBACKS: --card; break; case ectEMPTYNOBG: dwRasterOp = SRCAND; case ectEMPTY: card = 52; break; case ectERASE: break; case ectREDX: card = 66; break; case ectGREENO: card = 67; break; default: return FALSE; } if (type == ectEMPTY || type == ectERASE) { POINT pPoint; HBRUSH hBrush; hBrush = CreateSolidBrush(color); GetDCOrgEx(hdc, &pPoint); SetBrushOrgEx(hdc, pPoint.x, pPoint.y, 0); SelectObject(hdc, hBrush); PatBlt(hdc, x, y, dx, dy, PATCOPY); } if (type != ectERASE) { hdcCard = CreateCompatibleDC(hdc); SelectObject(hdcCard, g_CardBitmaps[card]); OldBkColor = SetBkColor(hdc, (type == ectFACES) ? 0xFFFFFF : color); if (bSaveEdges) { SavedPixels[0] = GetPixel(hdc, x, y); SavedPixels[1] = GetPixel(hdc, x + 1, y); SavedPixels[2] = GetPixel(hdc, x, y + 1); SavedPixels[3] = GetPixel(hdc, x + dx - 1, y); SavedPixels[4] = GetPixel(hdc, x + dx - 2, y); SavedPixels[5] = GetPixel(hdc, x + dx - 1, y + 1); SavedPixels[6] = GetPixel(hdc, x, y + dy - 1); SavedPixels[7] = GetPixel(hdc, x + 1, y + dy - 1); SavedPixels[8] = GetPixel(hdc, x, y + dy - 2); SavedPixels[9] = GetPixel(hdc, x + dx - 1, y + dy - 1); SavedPixels[10] = GetPixel(hdc, x + dx - 2, y + dy - 1); SavedPixels[11] = GetPixel(hdc, x + dx - 1, y + dy - 2); } if (bStretch) { StretchBlt(hdc, x, y, dx, dy, hdcCard, 0, 0, CARD_WIDTH, CARD_HEIGHT, dwRasterOp); } else { BitBlt(hdc, x, y, dx, dy, hdcCard, 0, 0, dwRasterOp); /* * This is need when using Microsoft images, because they use two-color red/white images for * red cards and thus needs fix-up of the edge to black color. */ #if 0 if (ISREDCARD(card)) { PatBlt(hdc, x, y + 2, 1, dy - 4, BLACKNESS); PatBlt(hdc, x + dx - 1, y + 2, 1, dy - 4, BLACKNESS); PatBlt(hdc, x + 2, y, dx - 4, 1, BLACKNESS); PatBlt(hdc, x + 2, y + dy - 1, dx - 4, 1, BLACKNESS); SetPixel(hdc, x + 1, y + 1, 0); SetPixel(hdc, x + dx - 2, y + 1, 0); SetPixel(hdc, x + 1, y + dy - 2, 0); SetPixel(hdc, x + dx - 2, y + dy - 2, 0); } #endif } if (bSaveEdges) { SetPixel(hdc, x, y, SavedPixels[0]); SetPixel(hdc, x + 1, y, SavedPixels[1]); SetPixel(hdc, x, y + 1, SavedPixels[2]); SetPixel(hdc, x + dx - 1, y, SavedPixels[3]); SetPixel(hdc, x + dx - 2, y, SavedPixels[4]); SetPixel(hdc, x + dx - 1, y + 1, SavedPixels[5]); SetPixel(hdc, x, y + dy - 1, SavedPixels[6]); SetPixel(hdc, x + 1, y + dy - 1, SavedPixels[7]); SetPixel(hdc, x, y + dy - 2, SavedPixels[8]); SetPixel(hdc, x + dx - 1, y + dy - 1, SavedPixels[9]); SetPixel(hdc, x + dx - 2, y + dy - 1, SavedPixels[10]); SetPixel(hdc, x + dx - 1, y + dy - 2, SavedPixels[11]); } SetBkColor(hdc, OldBkColor); DeleteDC(hdcCard); } return TRUE; } /*********************************************************************** * cdtAnimate (CARDS.@) * * Animate card background, we don't use it */ BOOL WINAPI cdtAnimate(HDC hdc, int cardback, int x, int y, int frame) { return TRUE; } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) g_hModule = hinstDLL; return TRUE; }