|
|
//
// image.cpp
//
// utilities for images and imagelists
//
//#include "pch.hxx"
//#include "resource.h"
//#include "globals.h"
//#include "util.h"
#include "_apipch.h"
//extern HINSTANCE hinstMapiX;
//
// TileImage
//
// This function tiles a bitmap in lprcDest, using lpptOrigin as the origin
//
#define ILT_PARTIALBLT_LEFT 0
#define ILT_PARTIALBLT_TOP 1
#define ILT_PARTIALBLT_RIGHT 2
#define ILT_PARTIALBLT_BOTTOM 3
void TileImage(HBITMAP hbmp, HDC hdc, LPPOINT lpptOrigin, LPRECT lprcDest) { BOOL fFirstRow, fFirstCol; int nRows, nCols, nSaveCols, offset; int rgOffsetPartialBlt[4]; POINT ptTileOrigin, ptDraw, ptDest, ptSrc; SIZE sizeImage, sizeRect, sizeBlt; HDC hdcBmp=0; HBITMAP hbmpOrig=0; BITMAP bm;
if(!hdc) return;
if(!(hdcBmp = CreateCompatibleDC(hdc))) goto fail;
if(!(hbmpOrig = SelectObject(hdcBmp, hbmp))) goto fail; GetObject(hbmp, sizeof(BITMAP), &bm); sizeImage.cx = bm.bmWidth; sizeImage.cy = bm.bmHeight;
// Generate the true origin with the tile
lpptOrigin->x %= sizeImage.cx; lpptOrigin->y %= sizeImage.cy;
// We will start the tile so that the origin lines up
ptTileOrigin.x = lprcDest->left - lpptOrigin->x; ptTileOrigin.y = lprcDest->top - lpptOrigin->y;
// Figure out how many rows and columns wo need
sizeRect.cx = lprcDest->right - ptTileOrigin.x; sizeRect.cy = lprcDest->bottom - ptTileOrigin.y;
nRows = sizeRect.cy / sizeImage.cy; nRows += (sizeRect.cy % sizeImage.cy) ? 1 : 0; nSaveCols = sizeRect.cx / sizeImage.cx; nSaveCols += (sizeRect.cx % sizeImage.cx) ? 1 : 0;
// Generate the partial blt offsets
rgOffsetPartialBlt[ILT_PARTIALBLT_TOP] = lprcDest->top - ptTileOrigin.y; rgOffsetPartialBlt[ILT_PARTIALBLT_LEFT] = lprcDest->left - ptTileOrigin.x; if (sizeImage.cy >= sizeRect.cy) rgOffsetPartialBlt[ILT_PARTIALBLT_BOTTOM] = sizeImage.cy - sizeRect.cy; else if(sizeRect.cy % sizeImage.cy) rgOffsetPartialBlt[ILT_PARTIALBLT_BOTTOM] = sizeImage.cy - (sizeRect.cy % sizeImage.cy); else rgOffsetPartialBlt[ILT_PARTIALBLT_BOTTOM] = 0; if (sizeImage.cx >= sizeRect.cx) rgOffsetPartialBlt[ILT_PARTIALBLT_RIGHT] = sizeImage.cx - sizeRect.cx; else if(sizeRect.cx % sizeImage.cx) rgOffsetPartialBlt[ILT_PARTIALBLT_RIGHT] = sizeImage.cx - (sizeRect.cx % sizeImage.cx); else rgOffsetPartialBlt[ILT_PARTIALBLT_RIGHT] = 0;
// Draw the tiles
ptDraw.y = ptTileOrigin.y; fFirstRow = TRUE; while (nRows--) { ptDraw.x = ptTileOrigin.x; nCols = nSaveCols; fFirstCol = TRUE; while (nCols--) { ptDest = ptDraw; sizeBlt = sizeImage; ptSrc.x = ptSrc.y = 0; // Handle partial boundary Blts
if (fFirstRow && rgOffsetPartialBlt[ILT_PARTIALBLT_TOP] != 0) { offset = rgOffsetPartialBlt[ILT_PARTIALBLT_TOP]; ptDest.y += offset; sizeBlt.cy -= offset; ptSrc.y += offset; } if (nRows == 0 && rgOffsetPartialBlt[ILT_PARTIALBLT_BOTTOM] != 0) sizeBlt.cy -= rgOffsetPartialBlt[ILT_PARTIALBLT_BOTTOM]; if (fFirstCol && rgOffsetPartialBlt[ILT_PARTIALBLT_LEFT] != 0) { offset = rgOffsetPartialBlt[ILT_PARTIALBLT_LEFT]; ptDest.x += offset; sizeBlt.cx -= offset; ptSrc.x += offset; } if (nCols == 0 && rgOffsetPartialBlt[ILT_PARTIALBLT_RIGHT] != 0) sizeBlt.cx -= rgOffsetPartialBlt[ILT_PARTIALBLT_RIGHT]; // Just do it
BitBlt(hdc, ptDest.x, ptDest.y, sizeBlt.cx, sizeBlt.cy, hdcBmp, ptSrc.x, ptSrc.y, SRCCOPY); ptDraw.x += sizeImage.cx; fFirstCol = FALSE; } ptDraw.y += sizeImage.cy; fFirstRow = FALSE; }
fail: if(hdcBmp) { if(hbmpOrig) SelectObject(hdcBmp, hbmpOrig); DeleteDC(hdcBmp); } }
//
// shared image list..
//
static HIMAGELIST g_himlAthSm = NULL; static HIMAGELIST g_himlAthLg = NULL; static HIMAGELIST g_himlAthSt = NULL;
HIMAGELIST InitImageList(int cx, int cy, LPSTR szbm, int cicon) { HBITMAP hbm; HIMAGELIST himl;
himl = ImageList_Create(cx, cy, ILC_MASK, cicon, 0);
if (himl != NULL) { hbm = LoadBitmap(hinstMapiX, szbm);
ImageList_AddMasked(himl, hbm, RGB_TRANSPARENT);
DeleteObject((HGDIOBJ)hbm); }
return(himl); }
void FreeImageLists(void) { if (g_himlAthSm != NULL) { ImageList_Destroy(g_himlAthSm); g_himlAthSm = NULL; }
if (g_himlAthLg != NULL) { ImageList_Destroy(g_himlAthLg); g_himlAthLg = NULL; }
if (g_himlAthSt != NULL) { ImageList_Destroy(g_himlAthSt); g_himlAthSt = NULL; } }
BOOL LoadBitmapAndPalette(int idbmp, HBITMAP *phbmp, HPALETTE *phpal) { int i, n; HBITMAP hbmp; HPALETTE hpal; HDC hdcBitmap; DWORD adw[257]; BOOL fret = FALSE;
hdcBitmap = NULL; *phbmp = NULL; *phpal = NULL;
hbmp = (HBITMAP)LoadImage(hinstMapiX, MAKEINTRESOURCE(idbmp), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); if (hbmp == NULL) goto DoneLoadBitmap;
hdcBitmap = CreateCompatibleDC(NULL); if (hdcBitmap == NULL) goto DoneLoadBitmap; SelectObject(hdcBitmap, (HGDIOBJ)hbmp); n = GetDIBColorTable(hdcBitmap, 0, 256, (LPRGBQUAD)&adw[1]); for (i = 1; i <= n; i++) adw[i] = RGB(GetBValue(adw[i]), GetGValue(adw[i]), GetRValue(adw[i])); adw[0] = MAKELONG(0x300, n); hpal = CreatePalette((LPLOGPALETTE)&adw[0]); if (hpal == NULL) goto DoneLoadBitmap;
*phbmp = hbmp; *phpal = hpal;
fret = TRUE;
DoneLoadBitmap: if (hdcBitmap != NULL) DeleteDC(hdcBitmap);
return(fret); }
|