///////////////////////////////////////////////////////////////////////////// // Name: dibutils.h // Purpose: Utilities for DIBs // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Microsoft, Julian Smart // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// /*************************************************************************** (C) Copyright 1994 Microsoft Corp. All rights reserved. You have a royalty-free right to use, modify, reproduce and distribute the Sample Files (and/or any modified version) in any way you find useful, provided that you agree that Microsoft has no warranty obligations or liability for any Sample Application Files which are modified. **************************************************************************/ /*************************************************************************** Functions for handling Device Independent Bitmaps and clearing the System Palette. **************************************************************************/ #ifndef SAMPLES_UTILS_H #define SAMPLES_UTILS_H #ifdef __GNUG__ #pragma interface "dibutils.h" #endif typedef LPBITMAPINFOHEADER PDIB; typedef HANDLE HDIB; /*************************************************************************** External function declarations **************************************************************************/ void ClearSystemPalette(void); PDIB DibOpenFile(LPSTR szFile); int DibWriteFile(LPSTR szFile, LPBITMAPINFOHEADER lpbi); BOOL DibSetUsage(PDIB pdib, HPALETTE hpal,UINT wUsage); PDIB DibCreate(int bits, int dx, int dy); BOOL DibMapToPalette(PDIB pdib, HPALETTE hpal); HPALETTE MakePalette(const BITMAPINFO FAR* Info, UINT flags); /**************************************************************************** Internal function declarations ***************************************************************************/ PDIB DibReadBitmapInfo(HFILE fh); /**************************************************************************** DIB macros. ***************************************************************************/ #ifdef WIN32 #define HandleFromDib(lpbi) GlobalHandle(lpbi) #else #define HandleFromDib(lpbi) (HANDLE)GlobalHandle(SELECTOROF(lpbi)) #endif #define DibFromHandle(h) (PDIB)GlobalLock(h) #define DibFree(pdib) GlobalFreePtr(pdib) #define WIDTHBYTES(i) ((unsigned)((i+31)&(~31))/8) /* ULONG aligned ! */ #define DibWidth(lpbi) (UINT)(((LPBITMAPINFOHEADER)(lpbi))->biWidth) #define DibHeight(lpbi) (UINT)(((LPBITMAPINFOHEADER)(lpbi))->biHeight) #define DibBitCount(lpbi) (UINT)(((LPBITMAPINFOHEADER)(lpbi))->biBitCount) #define DibCompression(lpbi) (DWORD)(((LPBITMAPINFOHEADER)(lpbi))->biCompression) #define DibWidthBytesN(lpbi, n) (UINT)WIDTHBYTES((UINT)(lpbi)->biWidth * (UINT)(n)) #define DibWidthBytes(lpbi) DibWidthBytesN(lpbi, (lpbi)->biBitCount) #define DibSizeImage(lpbi) ((lpbi)->biSizeImage == 0 \ ? ((DWORD)(UINT)DibWidthBytes(lpbi) * (DWORD)(UINT)(lpbi)->biHeight) \ : (lpbi)->biSizeImage) #define DibSize(lpbi) ((lpbi)->biSize + (lpbi)->biSizeImage + (int)(lpbi)->biClrUsed * sizeof(RGBQUAD)) #define DibPaletteSize(lpbi) (DibNumColors(lpbi) * sizeof(RGBQUAD)) #define DibFlipY(lpbi, y) ((int)(lpbi)->biHeight-1-(y)) //HACK for NT BI_BITFIELDS DIBs #ifdef WIN32 #define DibPtr(lpbi) ((lpbi)->biCompression == BI_BITFIELDS \ ? (LPVOID)(DibColors(lpbi) + 3) \ : (LPVOID)(DibColors(lpbi) + (UINT)(lpbi)->biClrUsed)) #else #define DibPtr(lpbi) (LPVOID)(DibColors(lpbi) + (UINT)(lpbi)->biClrUsed) #endif #define DibColors(lpbi) ((RGBQUAD FAR *)((LPBYTE)(lpbi) + (int)(lpbi)->biSize)) #define DibNumColors(lpbi) ((lpbi)->biClrUsed == 0 && (lpbi)->biBitCount <= 8 \ ? (int)(1 << (int)(lpbi)->biBitCount) \ : (int)(lpbi)->biClrUsed) #define DibXYN(lpbi,pb,x,y,n) (LPVOID)( \ (BYTE _huge *)(pb) + \ (UINT)((UINT)(x) * (UINT)(n) / 8u) + \ ((DWORD)DibWidthBytesN(lpbi,n) * (DWORD)(UINT)(y))) #define DibXY(lpbi,x,y) DibXYN(lpbi,DibPtr(lpbi),x,y,(lpbi)->biBitCount) #define FixBitmapInfo(lpbi) if ((lpbi)->biSizeImage == 0) \ (lpbi)->biSizeImage = DibSizeImage(lpbi); \ if ((lpbi)->biClrUsed == 0) \ (lpbi)->biClrUsed = DibNumColors(lpbi); \ if ((lpbi)->biCompression == BI_BITFIELDS && (lpbi)->biClrUsed == 0) \ ; // (lpbi)->biClrUsed = 3; #define DibInfo(pDIB) ((BITMAPINFO FAR *)(pDIB)) /***************************************************************************/ #ifndef BI_BITFIELDS #define BI_BITFIELDS 3 #endif #ifndef HALFTONE #define HALFTONE COLORONCOLOR #endif #endif