Removed dibutils
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19733 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1,115 +0,0 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// 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 licence
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#ifndef _DIBUTILS_H
|
|
||||||
#define _DIBUTILS_H
|
|
||||||
|
|
||||||
#ifdef __GNUG__
|
|
||||||
#pragma interface "dibutils.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef LPBITMAPINFOHEADER PDIB;
|
|
||||||
typedef HANDLE HDIB;
|
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
External function declarations
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
PDIB wxDibOpenFile(LPTSTR szFile);
|
|
||||||
int wxDibWriteFile(LPTSTR szFile, LPBITMAPINFOHEADER lpbi);
|
|
||||||
BOOL wxDibSetUsage(PDIB pdib, HPALETTE hpal,UINT wUsage);
|
|
||||||
PDIB wxDibCreate(int bits, int dx, int dy);
|
|
||||||
BOOL wxDibMapToPalette(PDIB pdib, HPALETTE hpal);
|
|
||||||
HPALETTE wxMakePalette(const BITMAPINFO FAR* Info, UINT flags);
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
Internal function declarations
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
PDIB wxDibReadBitmapInfo(HFILE fh);
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
DIB macros.
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#define wxHandleFromDib(lpbi) GlobalHandle(lpbi)
|
|
||||||
#else
|
|
||||||
#define wxHandleFromDib(lpbi) (HANDLE)GlobalHandle(SELECTOROF(lpbi))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define wxDibFromHandle(h) (PDIB)GlobalLock(h)
|
|
||||||
|
|
||||||
#define wxDibFree(pdib) GlobalFreePtr(pdib)
|
|
||||||
|
|
||||||
#define wxWIDTHBYTES(i) ((unsigned)((i+31)&(~31))/8) /* ULONG aligned ! */
|
|
||||||
|
|
||||||
#define wxDibWidth(lpbi) (UINT)(((LPBITMAPINFOHEADER)(lpbi))->biWidth)
|
|
||||||
#define wxDibHeight(lpbi) (UINT)(((LPBITMAPINFOHEADER)(lpbi))->biHeight)
|
|
||||||
#define wxDibBitCount(lpbi) (UINT)(((LPBITMAPINFOHEADER)(lpbi))->biBitCount)
|
|
||||||
#define wxDibCompression(lpbi) (DWORD)(((LPBITMAPINFOHEADER)(lpbi))->biCompression)
|
|
||||||
|
|
||||||
#define wxDibWidthBytesN(lpbi, n) (UINT)wxWIDTHBYTES((UINT)(lpbi)->biWidth * (UINT)(n))
|
|
||||||
#define wxDibWidthBytes(lpbi) wxDibWidthBytesN(lpbi, (lpbi)->biBitCount)
|
|
||||||
|
|
||||||
#define wxDibSizeImage(lpbi) ((lpbi)->biSizeImage == 0 \
|
|
||||||
? ((DWORD)(UINT)wxDibWidthBytes(lpbi) * (DWORD)(UINT)(lpbi)->biHeight) \
|
|
||||||
: (lpbi)->biSizeImage)
|
|
||||||
|
|
||||||
#define wxDibSize(lpbi) ((lpbi)->biSize + (lpbi)->biSizeImage + (int)(lpbi)->biClrUsed * sizeof(RGBQUAD))
|
|
||||||
#define wxDibPaletteSize(lpbi) (wxDibNumColors(lpbi) * sizeof(RGBQUAD))
|
|
||||||
|
|
||||||
#define wxDibFlipY(lpbi, y) ((int)(lpbi)->biHeight-1-(y))
|
|
||||||
|
|
||||||
//HACK for NT BI_BITFIELDS DIBs
|
|
||||||
#ifdef __WIN32__
|
|
||||||
#define wxDibPtr(lpbi) ((lpbi)->biCompression == BI_BITFIELDS \
|
|
||||||
? (LPVOID)(wxDibColors(lpbi) + 3) \
|
|
||||||
: (LPVOID)(wxDibColors(lpbi) + (UINT)(lpbi)->biClrUsed))
|
|
||||||
#else
|
|
||||||
#define wxDibPtr(lpbi) (LPVOID)(wxDibColors(lpbi) + (UINT)(lpbi)->biClrUsed)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define wxDibColors(lpbi) ((RGBQUAD FAR *)((LPBYTE)(lpbi) + (int)(lpbi)->biSize))
|
|
||||||
|
|
||||||
#define wxDibNumColors(lpbi) ((lpbi)->biClrUsed == 0 && (lpbi)->biBitCount <= 8 \
|
|
||||||
? (int)(1 << (int)(lpbi)->biBitCount) \
|
|
||||||
: (int)(lpbi)->biClrUsed)
|
|
||||||
|
|
||||||
#define wxDibXYN(lpbi,pb,x,y,n) (LPVOID)( \
|
|
||||||
(BYTE _huge *)(pb) + \
|
|
||||||
(UINT)((UINT)(x) * (UINT)(n) / 8u) + \
|
|
||||||
((DWORD)wxDibWidthBytesN(lpbi,n) * (DWORD)(UINT)(y)))
|
|
||||||
|
|
||||||
#define wxDibXY(lpbi,x,y) wxDibXYN(lpbi,wxDibPtr(lpbi),x,y,(lpbi)->biBitCount)
|
|
||||||
|
|
||||||
#define wxFixBitmapInfo(lpbi) if ((lpbi)->biSizeImage == 0) \
|
|
||||||
(lpbi)->biSizeImage = wxDibSizeImage(lpbi); \
|
|
||||||
if ((lpbi)->biClrUsed == 0) \
|
|
||||||
(lpbi)->biClrUsed = wxDibNumColors(lpbi);
|
|
||||||
|
|
||||||
// if ((lpbi)->biCompression == BI_BITFIELDS && (lpbi)->biClrUsed == 0)
|
|
||||||
// ; // (lpbi)->biClrUsed = 3;
|
|
||||||
|
|
||||||
#define wxDibInfo(pDIB) ((BITMAPINFO FAR *)(pDIB))
|
|
||||||
|
|
||||||
/***************************************************************************/
|
|
||||||
|
|
||||||
#ifndef BI_BITFIELDS
|
|
||||||
#define BI_BITFIELDS 3
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HALFTONE
|
|
||||||
#define HALFTONE COLORONCOLOR
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
// _DIBUTILS_H
|
|
@@ -1,664 +0,0 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Name: dibutils.cpp
|
|
||||||
// Purpose: Utilities for DIBs
|
|
||||||
// Author: Julian Smart
|
|
||||||
// Modified by:
|
|
||||||
// Created: 04/01/98
|
|
||||||
// RCS-ID: $Id$
|
|
||||||
// Copyright: (c) Microsoft, Julian Smart
|
|
||||||
// Licence: wxWindows licence
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#ifdef __GNUG__
|
|
||||||
#pragma implementation "dibutils.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// For compilers that support precompilation, includes "wx.h".
|
|
||||||
#include "wx/wxprec.h"
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
#pragma hdrstop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef WX_PRECOMP
|
|
||||||
#include "wx/setup.h"
|
|
||||||
#include "wx/defs.h"
|
|
||||||
#include "wx/string.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <windowsx.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "wx/msw/dibutils.h"
|
|
||||||
|
|
||||||
#if defined(__WIN32__)
|
|
||||||
#if !defined(__MWERKS__) && !defined(__SALFORDC__)
|
|
||||||
#include <memory.h> // for _fmemcpy()
|
|
||||||
#endif
|
|
||||||
#define _huge
|
|
||||||
#ifndef hmemcpy
|
|
||||||
#define hmemcpy memcpy
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define BFT_ICON 0x4349 /* 'IC' */
|
|
||||||
#define BFT_BITMAP 0x4d42 /* 'BM' */
|
|
||||||
#define BFT_CURSOR 0x5450 /* 'PT(' */
|
|
||||||
|
|
||||||
#ifndef SEEK_CUR
|
|
||||||
/* flags for _lseek */
|
|
||||||
#define SEEK_CUR 1
|
|
||||||
#define SEEK_END 2
|
|
||||||
#define SEEK_SET 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Copied from PNGhandler for coompilation with MingW32, RR */
|
|
||||||
|
|
||||||
#ifndef GlobalAllocPtr
|
|
||||||
#define GlobalPtrHandle(lp) \
|
|
||||||
((HGLOBAL)GlobalHandle(lp))
|
|
||||||
|
|
||||||
#define GlobalLockPtr(lp) \
|
|
||||||
((BOOL)GlobalLock(GlobalPtrHandle(lp)))
|
|
||||||
#define GlobalUnlockPtr(lp) \
|
|
||||||
GlobalUnlock(GlobalPtrHandle(lp))
|
|
||||||
|
|
||||||
#define GlobalAllocPtr(flags, cb) \
|
|
||||||
(GlobalLock(GlobalAlloc((flags), (cb))))
|
|
||||||
#define GlobalReAllocPtr(lp, cbNew, flags) \
|
|
||||||
(GlobalUnlockPtr(lp), GlobalLock(GlobalReAlloc(GlobalPtrHandle(lp) , (cbNew), (flags))))
|
|
||||||
#define GlobalFreePtr(lp) \
|
|
||||||
(GlobalUnlockPtr(lp), (BOOL)GlobalFree(GlobalPtrHandle(lp)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Open a DIB file and return a MEMORY DIB, a memory handle containing..
|
|
||||||
*
|
|
||||||
* BITMAP INFO bi
|
|
||||||
* palette data
|
|
||||||
* bits....
|
|
||||||
*/
|
|
||||||
|
|
||||||
int wxDibWriteFile(LPTSTR szFile, LPBITMAPINFOHEADER lpbi)
|
|
||||||
{
|
|
||||||
HFILE fh;
|
|
||||||
OFSTRUCT of;
|
|
||||||
|
|
||||||
fh = OpenFile(wxConvFile.cWX2MB(szFile), &of, OF_WRITE | OF_CREATE);
|
|
||||||
|
|
||||||
if (!fh) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
long size = wxDibSize(lpbi);
|
|
||||||
|
|
||||||
// write file header
|
|
||||||
BITMAPFILEHEADER bmf;
|
|
||||||
bmf.bfType = BFT_BITMAP;
|
|
||||||
bmf.bfSize = sizeof(bmf) + size;
|
|
||||||
bmf.bfReserved1 = 0;
|
|
||||||
bmf.bfReserved2 = 0;
|
|
||||||
bmf.bfOffBits = sizeof(bmf) + (char FAR*)(wxDibPtr(lpbi)) - (char FAR*)lpbi;
|
|
||||||
#if 1 // defined( __WATCOMC__) || defined(__VISUALC__) || defined(__SC__) || defined(__SALFORDC__) || defined(__MWERKS__) || wxUSE_NORLANDER_HEADERS
|
|
||||||
#define HWRITE_2ND_ARG_TYPE LPCSTR
|
|
||||||
#else // don't know who needs this...
|
|
||||||
#define HWRITE_2ND_ARG_TYPE LPBYTE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ( _hwrite(fh, (HWRITE_2ND_ARG_TYPE)(&bmf), sizeof(bmf)) < 0 ||
|
|
||||||
_hwrite(fh, (HWRITE_2ND_ARG_TYPE)lpbi, size) < 0 )
|
|
||||||
{
|
|
||||||
_lclose(fh);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef HWRITE_2ND_ARG_TYPE
|
|
||||||
|
|
||||||
_lclose(fh);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
PDIB wxDibOpenFile(LPTSTR szFile)
|
|
||||||
{
|
|
||||||
HFILE fh;
|
|
||||||
DWORD dwLen;
|
|
||||||
DWORD dwBits;
|
|
||||||
PDIB pdib;
|
|
||||||
LPVOID p;
|
|
||||||
OFSTRUCT of;
|
|
||||||
|
|
||||||
#if defined(__WIN32__)
|
|
||||||
#define GetCurrentInstance() GetModuleHandle(NULL)
|
|
||||||
#else
|
|
||||||
#define GetCurrentInstance() (HINSTANCE)SELECTOROF((LPVOID)&of)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fh = OpenFile(wxConvFile.cWX2MB(szFile), &of, OF_READ);
|
|
||||||
|
|
||||||
if (fh == -1)
|
|
||||||
{
|
|
||||||
HRSRC h;
|
|
||||||
|
|
||||||
// TODO: Unicode version
|
|
||||||
#ifdef __WIN16__
|
|
||||||
h = FindResource(GetCurrentInstance(), szFile, RT_BITMAP);
|
|
||||||
#elif wxUSE_UNICODE
|
|
||||||
h = FindResourceW(GetCurrentInstance(), szFile, RT_BITMAP);
|
|
||||||
#else
|
|
||||||
h = FindResourceA(GetCurrentInstance(), szFile, RT_BITMAP);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__WIN32__)
|
|
||||||
//!!! can we call GlobalFree() on this? is it the right format.
|
|
||||||
//!!! can we write to this resource?
|
|
||||||
if (h)
|
|
||||||
return (PDIB)LockResource(LoadResource(GetCurrentInstance(), h));
|
|
||||||
#else
|
|
||||||
if (h)
|
|
||||||
fh = AccessResource(GetCurrentInstance(), h);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fh == -1)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
pdib = wxDibReadBitmapInfo(fh);
|
|
||||||
|
|
||||||
if (!pdib)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* How much memory do we need to hold the DIB */
|
|
||||||
|
|
||||||
dwBits = pdib->biSizeImage;
|
|
||||||
dwLen = pdib->biSize + wxDibPaletteSize(pdib) + dwBits;
|
|
||||||
|
|
||||||
/* Can we get more memory? */
|
|
||||||
|
|
||||||
p = GlobalReAllocPtr(pdib,dwLen,0);
|
|
||||||
|
|
||||||
if (!p)
|
|
||||||
{
|
|
||||||
GlobalFreePtr(pdib);
|
|
||||||
pdib = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pdib = (PDIB)p;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdib)
|
|
||||||
{
|
|
||||||
/* read in the bits */
|
|
||||||
_hread(fh, (LPBYTE)pdib + (UINT)pdib->biSize + wxDibPaletteSize(pdib), dwBits);
|
|
||||||
}
|
|
||||||
|
|
||||||
_lclose(fh);
|
|
||||||
|
|
||||||
return pdib;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ReadDibBitmapInfo()
|
|
||||||
*
|
|
||||||
* Will read a file in DIB format and return a global HANDLE to its
|
|
||||||
* BITMAPINFO. This function will work with both "old" and "new"
|
|
||||||
* bitmap formats, but will always return a "new" BITMAPINFO.
|
|
||||||
*/
|
|
||||||
|
|
||||||
PDIB wxDibReadBitmapInfo(HFILE fh)
|
|
||||||
{
|
|
||||||
DWORD off;
|
|
||||||
int size;
|
|
||||||
int i;
|
|
||||||
int nNumColors;
|
|
||||||
|
|
||||||
RGBQUAD FAR *pRgb;
|
|
||||||
BITMAPINFOHEADER bi;
|
|
||||||
BITMAPCOREHEADER bc;
|
|
||||||
BITMAPFILEHEADER bf;
|
|
||||||
PDIB pdib;
|
|
||||||
|
|
||||||
if (fh == -1)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
off = _llseek(fh,0L,SEEK_CUR);
|
|
||||||
|
|
||||||
if (sizeof(bf) != _lread(fh,(LPSTR)&bf,sizeof(bf)))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* do we have a RC HEADER?
|
|
||||||
*/
|
|
||||||
if (bf.bfType != BFT_BITMAP)
|
|
||||||
{
|
|
||||||
bf.bfOffBits = 0L;
|
|
||||||
_llseek(fh,off,SEEK_SET);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sizeof(bi) != _lread(fh,(LPSTR)&bi,sizeof(bi)))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* what type of bitmap info is this?
|
|
||||||
*/
|
|
||||||
switch (size = (int)bi.biSize)
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case sizeof(BITMAPINFOHEADER):
|
|
||||||
break;
|
|
||||||
|
|
||||||
case sizeof(BITMAPCOREHEADER):
|
|
||||||
bc = *(BITMAPCOREHEADER*)&bi;
|
|
||||||
bi.biSize = sizeof(BITMAPINFOHEADER);
|
|
||||||
bi.biWidth = (DWORD)bc.bcWidth;
|
|
||||||
bi.biHeight = (DWORD)bc.bcHeight;
|
|
||||||
bi.biPlanes = (WORD)bc.bcPlanes;
|
|
||||||
bi.biBitCount = (WORD)bc.bcBitCount;
|
|
||||||
bi.biCompression = BI_RGB;
|
|
||||||
bi.biSizeImage = 0;
|
|
||||||
bi.biXPelsPerMeter = 0;
|
|
||||||
bi.biYPelsPerMeter = 0;
|
|
||||||
bi.biClrUsed = 0;
|
|
||||||
bi.biClrImportant = 0;
|
|
||||||
|
|
||||||
_llseek(fh,(LONG)sizeof(BITMAPCOREHEADER)-sizeof(BITMAPINFOHEADER),SEEK_CUR);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
nNumColors = wxDibNumColors(&bi);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (bi.biSizeImage == 0)
|
|
||||||
bi.biSizeImage = DibSizeImage(&bi);
|
|
||||||
|
|
||||||
if (bi.biClrUsed == 0)
|
|
||||||
bi.biClrUsed = wxDibNumColors(&bi);
|
|
||||||
#else
|
|
||||||
wxFixBitmapInfo(&bi);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pdib = (PDIB)GlobalAllocPtr(GMEM_MOVEABLE,(LONG)bi.biSize + nNumColors * sizeof(RGBQUAD));
|
|
||||||
|
|
||||||
if (!pdib)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
*pdib = bi;
|
|
||||||
|
|
||||||
pRgb = wxDibColors(pdib);
|
|
||||||
|
|
||||||
if (nNumColors)
|
|
||||||
{
|
|
||||||
if (size == sizeof(BITMAPCOREHEADER))
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* convert a old color table (3 byte entries) to a new
|
|
||||||
* color table (4 byte entries)
|
|
||||||
*/
|
|
||||||
_lread(fh,(LPVOID)pRgb,nNumColors * sizeof(RGBTRIPLE));
|
|
||||||
|
|
||||||
for (i=nNumColors-1; i>=0; i--)
|
|
||||||
{
|
|
||||||
RGBQUAD rgb;
|
|
||||||
|
|
||||||
rgb.rgbRed = ((RGBTRIPLE FAR *)pRgb)[i].rgbtRed;
|
|
||||||
rgb.rgbBlue = ((RGBTRIPLE FAR *)pRgb)[i].rgbtBlue;
|
|
||||||
rgb.rgbGreen = ((RGBTRIPLE FAR *)pRgb)[i].rgbtGreen;
|
|
||||||
rgb.rgbReserved = (BYTE)0;
|
|
||||||
|
|
||||||
pRgb[i] = rgb;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_lread(fh,(LPVOID)pRgb,nNumColors * sizeof(RGBQUAD));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bf.bfOffBits != 0L)
|
|
||||||
_llseek(fh,off + bf.bfOffBits,SEEK_SET);
|
|
||||||
|
|
||||||
return pdib;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* DibSetUsage(hdib,hpal,wUsage)
|
|
||||||
*
|
|
||||||
* Modifies the color table of the passed DIB for use with the wUsage
|
|
||||||
* parameter specifed.
|
|
||||||
*
|
|
||||||
* if wUsage is DIB_PAL_COLORS the DIB color table is set to 0-256
|
|
||||||
* if wUsage is DIB_RGB_COLORS the DIB color table is set to the RGB values
|
|
||||||
* in the passed palette
|
|
||||||
*/
|
|
||||||
|
|
||||||
BOOL wxDibSetUsage(PDIB pdib, HPALETTE hpal,UINT wUsage)
|
|
||||||
{
|
|
||||||
PALETTEENTRY ape[256];
|
|
||||||
RGBQUAD FAR * pRgb;
|
|
||||||
WORD FAR * pw;
|
|
||||||
int nColors;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
if (hpal == NULL)
|
|
||||||
hpal = (HPALETTE)GetStockObject(DEFAULT_PALETTE);
|
|
||||||
|
|
||||||
if (!pdib)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
nColors = wxDibNumColors(pdib);
|
|
||||||
|
|
||||||
if (nColors == 3 && wxDibCompression(pdib) == BI_BITFIELDS)
|
|
||||||
nColors = 0;
|
|
||||||
|
|
||||||
if (nColors > 0)
|
|
||||||
{
|
|
||||||
pRgb = wxDibColors(pdib);
|
|
||||||
|
|
||||||
switch (wUsage)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Set the DIB color table to palette indexes
|
|
||||||
//
|
|
||||||
case DIB_PAL_COLORS:
|
|
||||||
for (pw = (WORD FAR*)pRgb,n=0; n<nColors; n++,pw++)
|
|
||||||
*pw = n;
|
|
||||||
break;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Set the DIB color table to RGBQUADS
|
|
||||||
//
|
|
||||||
default:
|
|
||||||
case DIB_RGB_COLORS:
|
|
||||||
nColors = (nColors < 256) ? nColors: 256;
|
|
||||||
|
|
||||||
GetPaletteEntries(hpal,0,nColors,ape);
|
|
||||||
|
|
||||||
for (n=0; n<nColors; n++)
|
|
||||||
{
|
|
||||||
pRgb[n].rgbRed = ape[n].peRed;
|
|
||||||
pRgb[n].rgbGreen = ape[n].peGreen;
|
|
||||||
pRgb[n].rgbBlue = ape[n].peBlue;
|
|
||||||
pRgb[n].rgbReserved = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* DibCreate(bits, dx, dy)
|
|
||||||
*
|
|
||||||
* Creates a new packed DIB with the given dimensions and the
|
|
||||||
* given number of bits per pixel
|
|
||||||
*/
|
|
||||||
|
|
||||||
PDIB wxDibCreate(int bits, int dx, int dy)
|
|
||||||
{
|
|
||||||
LPBITMAPINFOHEADER lpbi ;
|
|
||||||
DWORD dwSizeImage;
|
|
||||||
int i;
|
|
||||||
DWORD FAR *pdw;
|
|
||||||
|
|
||||||
dwSizeImage = dy*(DWORD)((dx*bits/8+3)&~3);
|
|
||||||
|
|
||||||
lpbi = (PDIB)GlobalAllocPtr(GHND,sizeof(BITMAPINFOHEADER)+dwSizeImage + 1024);
|
|
||||||
|
|
||||||
if (lpbi == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
lpbi->biSize = sizeof(BITMAPINFOHEADER) ;
|
|
||||||
lpbi->biWidth = dx;
|
|
||||||
lpbi->biHeight = dy;
|
|
||||||
lpbi->biPlanes = 1;
|
|
||||||
lpbi->biBitCount = bits ;
|
|
||||||
lpbi->biCompression = BI_RGB ;
|
|
||||||
lpbi->biSizeImage = dwSizeImage;
|
|
||||||
lpbi->biXPelsPerMeter = 0 ;
|
|
||||||
lpbi->biYPelsPerMeter = 0 ;
|
|
||||||
lpbi->biClrUsed = 0 ;
|
|
||||||
lpbi->biClrImportant = 0 ;
|
|
||||||
|
|
||||||
if (bits == 4)
|
|
||||||
lpbi->biClrUsed = 16;
|
|
||||||
|
|
||||||
else if (bits == 8)
|
|
||||||
lpbi->biClrUsed = 256;
|
|
||||||
|
|
||||||
pdw = (DWORD FAR *)((LPBYTE)lpbi+(int)lpbi->biSize);
|
|
||||||
|
|
||||||
for (i=0; i<(int)lpbi->biClrUsed/16; i++)
|
|
||||||
{
|
|
||||||
*pdw++ = 0x00000000; // 0000 black
|
|
||||||
*pdw++ = 0x00800000; // 0001 dark red
|
|
||||||
*pdw++ = 0x00008000; // 0010 dark green
|
|
||||||
*pdw++ = 0x00808000; // 0011 mustard
|
|
||||||
*pdw++ = 0x00000080; // 0100 dark blue
|
|
||||||
*pdw++ = 0x00800080; // 0101 purple
|
|
||||||
*pdw++ = 0x00008080; // 0110 dark turquoise
|
|
||||||
*pdw++ = 0x00C0C0C0; // 1000 gray
|
|
||||||
*pdw++ = 0x00808080; // 0111 dark gray
|
|
||||||
*pdw++ = 0x00FF0000; // 1001 red
|
|
||||||
*pdw++ = 0x0000FF00; // 1010 green
|
|
||||||
*pdw++ = 0x00FFFF00; // 1011 yellow
|
|
||||||
*pdw++ = 0x000000FF; // 1100 blue
|
|
||||||
*pdw++ = 0x00FF00FF; // 1101 pink (magenta)
|
|
||||||
*pdw++ = 0x0000FFFF; // 1110 cyan
|
|
||||||
*pdw++ = 0x00FFFFFF; // 1111 white
|
|
||||||
}
|
|
||||||
|
|
||||||
return (PDIB)lpbi;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void xlatClut8(BYTE FAR *pb, DWORD dwSize, BYTE FAR *xlat)
|
|
||||||
{
|
|
||||||
DWORD dw;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
for (dw = 0; dw < dwSize; dw++, ((BYTE _huge *&)pb)++)
|
|
||||||
#else
|
|
||||||
for (dw = 0; dw < dwSize; dw++, ((BYTE _huge *)pb)++)
|
|
||||||
#endif
|
|
||||||
*pb = xlat[*pb];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void xlatClut4(BYTE FAR *pb, DWORD dwSize, BYTE FAR *xlat)
|
|
||||||
{
|
|
||||||
DWORD dw;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
for (dw = 0; dw < dwSize; dw++, ((BYTE _huge *&)pb)++)
|
|
||||||
#else
|
|
||||||
for (dw = 0; dw < dwSize; dw++, ((BYTE _huge *)pb)++)
|
|
||||||
#endif
|
|
||||||
*pb = (BYTE)(xlat[*pb & 0x0F] | (xlat[(*pb >> 4) & 0x0F] << 4));
|
|
||||||
}
|
|
||||||
|
|
||||||
#define RLE_ESCAPE 0
|
|
||||||
#define RLE_EOL 0
|
|
||||||
#define RLE_EOF 1
|
|
||||||
#define RLE_JMP 2
|
|
||||||
|
|
||||||
static void xlatRle8(BYTE FAR *pb, DWORD WXUNUSED(dwSize), BYTE FAR *xlat)
|
|
||||||
{
|
|
||||||
BYTE cnt;
|
|
||||||
BYTE b;
|
|
||||||
BYTE _huge *prle = pb;
|
|
||||||
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
cnt = *prle++;
|
|
||||||
b = *prle;
|
|
||||||
|
|
||||||
if (cnt == RLE_ESCAPE)
|
|
||||||
{
|
|
||||||
prle++;
|
|
||||||
|
|
||||||
switch (b)
|
|
||||||
{
|
|
||||||
case RLE_EOF:
|
|
||||||
return;
|
|
||||||
|
|
||||||
case RLE_EOL:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RLE_JMP:
|
|
||||||
prle++; // skip dX
|
|
||||||
prle++; // skip dY
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
cnt = b;
|
|
||||||
for (b=0; b<cnt; b++,prle++)
|
|
||||||
*prle = xlat[*prle];
|
|
||||||
|
|
||||||
if (cnt & 1)
|
|
||||||
prle++;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*prle++ = xlat[b];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void xlatRle4(BYTE FAR *WXUNUSED(pb), DWORD WXUNUSED(dwSize), BYTE FAR *WXUNUSED(xlat))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static void hmemmove(BYTE _huge *d, BYTE _huge *s, LONG len)
|
|
||||||
{
|
|
||||||
d += len-1;
|
|
||||||
s += len-1;
|
|
||||||
|
|
||||||
while (len--)
|
|
||||||
*d-- = *s--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* DibMapToPalette(pdib, hpal)
|
|
||||||
*
|
|
||||||
* Map the colors of the DIB, using GetNearestPaletteIndex, to
|
|
||||||
* the colors of the given palette.
|
|
||||||
*/
|
|
||||||
|
|
||||||
BOOL wxDibMapToPalette(PDIB pdib, HPALETTE hpal)
|
|
||||||
{
|
|
||||||
LPBITMAPINFOHEADER lpbi;
|
|
||||||
PALETTEENTRY pe;
|
|
||||||
int n;
|
|
||||||
int nDibColors;
|
|
||||||
int nPalColors=0;
|
|
||||||
BYTE FAR * lpBits;
|
|
||||||
RGBQUAD FAR * lpRgb;
|
|
||||||
BYTE xlat[256];
|
|
||||||
DWORD SizeImage;
|
|
||||||
|
|
||||||
if (!hpal || !pdib)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
lpbi = (LPBITMAPINFOHEADER)pdib;
|
|
||||||
lpRgb = wxDibColors(pdib);
|
|
||||||
|
|
||||||
GetObject(hpal,sizeof(int),(LPSTR)&nPalColors);
|
|
||||||
nDibColors = wxDibNumColors(pdib);
|
|
||||||
|
|
||||||
if ((SizeImage = lpbi->biSizeImage) == 0)
|
|
||||||
SizeImage = wxDibSizeImage(lpbi);
|
|
||||||
|
|
||||||
//
|
|
||||||
// build a xlat table. from the current DIB colors to the given
|
|
||||||
// palette.
|
|
||||||
//
|
|
||||||
for (n=0; n<nDibColors; n++)
|
|
||||||
xlat[n] = (BYTE)GetNearestPaletteIndex(hpal,RGB(lpRgb[n].rgbRed,lpRgb[n].rgbGreen,lpRgb[n].rgbBlue));
|
|
||||||
|
|
||||||
lpBits = (LPBYTE)wxDibPtr(lpbi);
|
|
||||||
lpbi->biClrUsed = nPalColors;
|
|
||||||
|
|
||||||
//
|
|
||||||
// re-size the DIB
|
|
||||||
//
|
|
||||||
if (nPalColors > nDibColors)
|
|
||||||
{
|
|
||||||
GlobalReAllocPtr(lpbi, lpbi->biSize + nPalColors*sizeof(RGBQUAD) + SizeImage, 0);
|
|
||||||
hmemmove((BYTE _huge *)wxDibPtr(lpbi), (BYTE _huge *)lpBits, SizeImage);
|
|
||||||
lpBits = (LPBYTE)wxDibPtr(lpbi);
|
|
||||||
}
|
|
||||||
else if (nPalColors < nDibColors)
|
|
||||||
{
|
|
||||||
hmemcpy(wxDibPtr(lpbi), lpBits, SizeImage);
|
|
||||||
GlobalReAllocPtr(lpbi, lpbi->biSize + nPalColors*sizeof(RGBQUAD) + SizeImage, 0);
|
|
||||||
lpBits = (LPBYTE)wxDibPtr(lpbi);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// translate the DIB bits
|
|
||||||
//
|
|
||||||
switch (lpbi->biCompression)
|
|
||||||
{
|
|
||||||
case BI_RLE8:
|
|
||||||
xlatRle8(lpBits, SizeImage, xlat);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BI_RLE4:
|
|
||||||
xlatRle4(lpBits, SizeImage, xlat);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BI_RGB:
|
|
||||||
if (lpbi->biBitCount == 8)
|
|
||||||
xlatClut8(lpBits, SizeImage, xlat);
|
|
||||||
else
|
|
||||||
xlatClut4(lpBits, SizeImage, xlat);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Now copy the RGBs in the logical palette to the dib color table
|
|
||||||
//
|
|
||||||
for (n=0; n<nPalColors; n++)
|
|
||||||
{
|
|
||||||
GetPaletteEntries(hpal,n,1,&pe);
|
|
||||||
|
|
||||||
lpRgb[n].rgbRed = pe.peRed;
|
|
||||||
lpRgb[n].rgbGreen = pe.peGreen;
|
|
||||||
lpRgb[n].rgbBlue = pe.peBlue;
|
|
||||||
lpRgb[n].rgbReserved = (BYTE)0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
HPALETTE wxMakePalette(const BITMAPINFO FAR* Info, UINT flags)
|
|
||||||
{
|
|
||||||
HPALETTE hPalette;
|
|
||||||
const RGBQUAD FAR* rgb = Info->bmiColors;
|
|
||||||
|
|
||||||
WORD nColors = (WORD)Info->bmiHeader.biClrUsed;
|
|
||||||
if (nColors) {
|
|
||||||
LOGPALETTE* logPal = (LOGPALETTE*)
|
|
||||||
new BYTE[sizeof(LOGPALETTE) + (nColors-1)*sizeof(PALETTEENTRY)];
|
|
||||||
|
|
||||||
logPal->palVersion = 0x300; // Windows 3.0 version
|
|
||||||
logPal->palNumEntries = nColors;
|
|
||||||
for (WORD n = 0; n < nColors; n++) {
|
|
||||||
logPal->palPalEntry[n].peRed = rgb[n].rgbRed;
|
|
||||||
logPal->palPalEntry[n].peGreen = rgb[n].rgbGreen;
|
|
||||||
logPal->palPalEntry[n].peBlue = rgb[n].rgbBlue;
|
|
||||||
logPal->palPalEntry[n].peFlags = (BYTE)flags;
|
|
||||||
}
|
|
||||||
hPalette = ::CreatePalette(logPal);
|
|
||||||
delete logPal;
|
|
||||||
} else
|
|
||||||
hPalette = 0;
|
|
||||||
|
|
||||||
return hPalette;
|
|
||||||
}
|
|
||||||
|
|
Reference in New Issue
Block a user