bitmap and image updates

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4831 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster 1999-12-05 21:23:52 +00:00
parent fd72e0b5e2
commit 58b1642453
2 changed files with 193 additions and 160 deletions

View File

@ -16,6 +16,7 @@
#pragma interface "bitmap.h"
#endif
#include "wx/os2/private.h"
#include "wx/os2/gdiimage.h"
#include "wx/gdicmn.h"
#include "wx/palette.h"
@ -159,17 +160,17 @@ public:
{ return (wxBitmapRefData *)m_refData; }
inline int GetQuality() const
{ return (GetBitmapData() ? GetBitmapData()->m_quality : 0); }
{ return (GetBitmapData() ? GetBitmapData()->m_nQuality : 0); }
void SetQuality(int nQ);
wxPalette* GetPalette() const
{ return (GetBitmapData() ? (& GetBitmapData()->m_bitmapPalette) : (wxPalette*) NULL); }
{ return (GetBitmapData() ? (& GetBitmapData()->m_vBitmapPalette) : (wxPalette*) NULL); }
void SetPalette(const wxPalette& rPalette);
inline wxMask* GetMask() const
{ return (GetBitmapData() ? GetBitmapData()->m_bitmapMask : (wxMask*) NULL); }
{ return (GetBitmapData() ? GetBitmapData()->m_pBitmapMask : (wxMask*) NULL); }
void SetMask(wxMask* pMask) ;
@ -194,17 +195,17 @@ public:
// Implementation
public:
inline void SetHBITMAP(WXHBITMAP hHmp)
{ SetHandle((WXHANDLE)bmp); }
inline void SetHBITMAP(WXHBITMAP hBmp)
{ SetHandle((WXHANDLE)hBmp); }
inline WXHBITMAP GetHBITMAP() const
{ return (WXHBITMAP)GetHandle(); }
inline void SetSelectedInto(wxDC* pDc)
{ if (GetBitmapData()) GetBitmapData()->m_selectedInto = pDc; }
{ if (GetBitmapData()) GetBitmapData()->m_pSelectedInto = pDc; }
inline wxDC* GetSelectedInto() const
{ return (GetBitmapData() ? GetBitmapData()->m_selectedInto : (wxDC*) NULL); }
{ return (GetBitmapData() ? GetBitmapData()->m_pSelectedInto : (wxDC*) NULL); }
// An OS/2 version that probably doesn't do anything like the msw version
wxBitmap GetBitmapForDC(wxDC& rDc) const;
@ -327,9 +328,9 @@ public:
,int nDesiredWidth
,int nDesiredHeight
);
virtual bool Save(wxGDIImage* pImage
const wxString& rName
int lType
virtual bool Save( wxGDIImage* pImage
,const wxString& rName
,int lType
);
private:
DECLARE_DYNAMIC_CLASS(wxBitmapHandler)

View File

@ -182,7 +182,7 @@ wxBitmap::wxBitmap(
vHeader.ulColorEncoding = 0;
vHeader.ulIdentifier = 0;
hPs = ::GpiCreatePS(habMain, hdc, &vSize, GPIA_ASSOC | PU_PELS);
hPs = ::GpiCreatePS(vHabMain, hdc, &vSize, GPIA_ASSOC | PU_PELS);
if (hPs == 0)
{
wxLogLastError("GpiCreatePS Failure");
@ -410,7 +410,7 @@ bool wxBitmap::Create(
));
}
bool wxBitmap::SaveFile(
bool wxBitmap::SaveFile(
const wxString& rFilename
, int lType
, const wxPalette* pPalette
@ -485,7 +485,7 @@ void wxBitmap::SetMask(
}
// Will try something for OS/2 but not really sure how close
// to the msw intent this is.
// to the msw intent this is.
wxBitmap wxBitmap::GetBitmapForDC(
wxDC& rDc
) const
@ -506,9 +506,9 @@ wxBitmap wxBitmap::GetBitmapForDC(
// TODO: Set the points
rDc.m_oldBitmap = (WXHBITMAP)::GpiSetBitMap(hPs, (HBITMAP)vTmpBitmap.GetHBITMAP());
:GpiBitBlt(hPs, hMemoryPS, 4L, vPoint, &vSize, PU_PELS | GPI_ASSOC);
return tmpBitmap;
:GpiBitBlt(hPs, hMemoryPS, 4L, vPoint, ROP_SRCCOPY | BBO_IGNORE);
return(vTmpBitmap);
}
// ----------------------------------------------------------------------------
@ -562,217 +562,249 @@ wxMask::~wxMask()
}
// Create a mask from a mono bitmap (copies the bitmap).
bool wxMask::Create(const wxBitmap& bitmap)
bool wxMask::Create(
const wxBitmap& rBitmap
)
{
if ( m_maskBitmap )
BITMAPINFOHEADER2 vHeader;
DEVOPENSTRUCT vDop = { NULL, "DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL, NULL };
SIZEL vSize = {0, 0};
POINTL vPoint[4];
if (m_hMaskBitmap)
{
::DeleteObject((HBITMAP) m_maskBitmap);
m_maskBitmap = 0;
::GpiDeleteBitmap((HBITMAP) m_hMaskBitmap);
m_hMaskBitmap = 0;
}
if (!bitmap.Ok() || bitmap.GetDepth() != 1)
if (!rBitmap.Ok() || rBitmap.GetDepth() != 1)
{
return FALSE;
return(FALSE);
}
m_maskBitmap = (WXHBITMAP) CreateBitmap(
bitmap.GetWidth(),
bitmap.GetHeight(),
1, 1, 0
);
HDC srcDC = CreateCompatibleDC(0);
SelectObject(srcDC, (HBITMAP) bitmap.GetHBITMAP());
HDC destDC = CreateCompatibleDC(0);
SelectObject(destDC, (HBITMAP) m_maskBitmap);
BitBlt(destDC, 0, 0, bitmap.GetWidth(), bitmap.GetHeight(), srcDC, 0, 0, SRCCOPY);
SelectObject(srcDC, 0);
DeleteDC(srcDC);
SelectObject(destDC, 0);
DeleteDC(destDC);
return TRUE;
vHeader.cbFix = sizeof(vHeader);
vHeader.cx = (USHORT)rBitmap.GetWidth();
vHeader.cy = (USHORT)rBitmap.GetHeight();
vHeader.cPlanes = 1;
vHeader.cBitCount = 1;
m_hMaskBitmap = (WXHBITMAP) ::GpiCreateBitmap( m_hPs
,&vHeader
,0L
,NULL
,NULL
);
HPS srcPS = ::GpiCreatePS(vHabmain, m_hDc, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
::GpiSetBitmap(srcPS, (HBITMAP)rBitmap.GetHBITMAP());
HPS destPS = ::GpiCreatePS(vHabmain, m_hDc, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
::GpiSetBitmap(srcPS, (HBITMAP)m_hMaskBitmap);
// TODO: Set the point array
:GpiBitBlt(destPs, srcPS, 4L, vPoint, ROP_SRCCOPY | BBO_IGNORE);
::GpiDestroyPS(srcPS);
::GpiDestroyPS(destPS);
return(TRUE);
}
// Create a mask from a bitmap and a palette index indicating
// the transparent area
bool wxMask::Create(const wxBitmap& bitmap, int paletteIndex)
bool wxMask::Create(
const wxBitmap& rBitmap
, int nPaletteIndex
)
{
if ( m_maskBitmap )
if (m_hMaskBitmap)
{
::DeleteObject((HBITMAP) m_maskBitmap);
m_maskBitmap = 0;
::GpiDeleteBitmap((HBITMAP) m_hMaskBitmap);
m_hMaskBitmap = 0;
}
if (bitmap.Ok() && bitmap.GetPalette()->Ok())
if (rBitmap.Ok() && rBitmap.GetPalette()->Ok())
{
unsigned char red, green, blue;
if (bitmap.GetPalette()->GetRGB(paletteIndex, &red, &green, &blue))
if (rBitmap.GetPalette()->GetRGB( nPaletteIndex
,&rRed
,&rGreen
,&rBlue
))
{
wxColour transparentColour(red, green, blue);
return Create(bitmap, transparentColour);
wxColour vTransparentColour( rRed
,rGreen
,rBlue
);
return (Create( rBitmap
,vTransparentColour
));
}
}
return FALSE;
return(FALSE);
}
// Create a mask from a bitmap and a colour indicating
// the transparent area
bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour)
bool wxMask::Create(
const wxBitmap& rBitmap
, const wxColour& rColour
)
{
if ( m_maskBitmap )
BITMAPINFOHEADER2 vHeader;
DEVOPENSTRUCT vDop = { NULL, "DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL, NULL };
SIZEL vSize = {0, 0};
POINTL vPoint[4];
if (m_hMaskBitmap)
{
::DeleteObject((HBITMAP) m_maskBitmap);
m_maskBitmap = 0;
::GpiDeleteBitmap((HBITMAP) m_hMaskBitmap);
m_hMaskBitmap = 0;
}
if (!bitmap.Ok())
if (!rBitmap.Ok())
{
return FALSE;
return(FALSE);
}
// scan the bitmap for the transparent colour and set
// the corresponding pixels in the mask to BLACK and
// the rest to WHITE
COLORREF maskColour = RGB(colour.Red(), colour.Green(), colour.Blue());
m_maskBitmap = (WXHBITMAP) ::CreateBitmap(
bitmap.GetWidth(),
bitmap.GetHeight(),
1, 1, 0
COLORREF vMaskColour = OS2RGB(rColour.Red(), rColour.Green(), rColour.Blue());
vHeader.cbFix = sizeof(vHeader);
vHeader.cx = (USHORT)rBitmap.GetWidth();
vHeader.cy = (USHORT)rBitmap.GetHeight();
vHeader.cPlanes = 1;
vHeader.cBitCount = 1;
m_hMaskBitmap = (WXHBITMAP) ::GpiCreateBitmap( m_hPs
,&vHeader
,0L
,NULL
,NULL
);
);
HDC srcDC = ::CreateCompatibleDC(0);
::SelectObject(srcDC, (HBITMAP) bitmap.GetHBITMAP());
HDC destDC = ::CreateCompatibleDC(0);
::SelectObject(destDC, (HBITMAP) m_maskBitmap);
HPS srcPS = ::GpiCreatePS(vHabmain, m_hDc, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
::GpiSetBitmap(srcPS, (HBITMAP)rBitmap.GetHBITMAP());
HPS destPS = ::GpiCreatePS(vHabmain, m_hDc, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
::GpiSetBitmap(srcPS, (HBITMAP)m_hMaskBitmap);
// this is not very efficient, but I can't think
// of a better way of doing it
for (int w = 0; w < bitmap.GetWidth(); w++)
for (int w = 0; w < rBitmap.GetWidth(); w++)
{
for (int h = 0; h < bitmap.GetHeight(); h++)
for (int h = 0; h < rBitmap.GetHeight(); h++)
{
COLORREF col = GetPixel(srcDC, w, h);
if (col == maskColour)
POINTL vPoint;
vPoint.x = w;
vPoint.y = h;
COLORREF col = ::GpiQueryPel(srcPS, w, h);
if (col == vMaskColour)
{
::SetPixel(destDC, w, h, RGB(0, 0, 0));
::GpiSetColor(destPS, CLR_WHITE);
::GpiSetPel(destPS, &vPoint);
}
else
{
::SetPixel(destDC, w, h, RGB(255, 255, 255));
::GpiSetColor(destPS, CLR_BLACK);
::GpiSetPel(destPS, &vPoint);
}
}
}
::SelectObject(srcDC, 0);
::DeleteDC(srcDC);
::SelectObject(destDC, 0);
::DeleteDC(destDC);
return TRUE;
::GpiDestroyPS(srcPS);
::GpiDestroyPS(destPS);
return(TRUE);
}
// ----------------------------------------------------------------------------
// wxBitmapHandler
// ----------------------------------------------------------------------------
bool wxBitmapHandler::Create(wxGDIImage *image,
void *data,
long flags,
int width, int height, int depth)
bool wxBitmapHandler::Create(
wxGDIImage* pImage
, void* pData
, long lFlags
, int nWidth
, int nHeight
, int nDepth
)
{
wxBitmap *bitmap = wxDynamicCast(image, wxBitmap);
wxBitmap* pBitmap = wxDynamicCast( pImage
,wxBitmap
);
return bitmap ? Create(bitmap, data, width, height, depth) : FALSE;
return(pBitmap ? Create( pBitmap
,pData
,nWidth
,nHeight
,nDepth
) : FALSE);
}
bool wxBitmapHandler::Load(wxGDIImage *image,
const wxString& name,
long flags,
int width, int height)
bool wxBitmapHandler::Load(
wxGDIImage* pImage
, const wxString& rName
, long lFlags
, int nWidth
, int nHeight
)
{
wxBitmap *bitmap = wxDynamicCast(image, wxBitmap);
wxBitmap* bitmap = wxDynamicCast( pImage
,wxBitmap
);
return bitmap ? LoadFile(bitmap, name, flags, width, height) : FALSE;
return(pBitmap ? LoadFile( pBitmap
,rName
,lFlags
,nWidth
,nHeight
) : FALSE);
}
bool wxBitmapHandler::Save(wxGDIImage *image,
const wxString& name,
int type)
bool wxBitmapHandler::Save(
wxGDIImage* pImage
, const wxString& rName
, int lType
)
{
wxBitmap *bitmap = wxDynamicCast(image, wxBitmap);
wxBitmap* pBitmap = wxDynamicCast( pImage
,wxBitmap
);
return bitmap ? SaveFile(bitmap, name, type) : FALSE;
return(pBitmap ? SaveFile( pBitmap
,rName
,lType
) : FALSE);
}
bool wxBitmapHandler::Create(wxBitmap *WXUNUSED(bitmap),
void *WXUNUSED(data),
long WXUNUSED(type),
int WXUNUSED(width),
int WXUNUSED(height),
int WXUNUSED(depth))
bool wxBitmapHandler::Create(
wxBitmap* WXUNUSED(pBitmap)
, void* WXUNUSED(pData)
, long WXUNUSED(lType)
, int WXUNUSED(nWidth)
, int WXUNUSED(nHeight)
, int WXUNUSED(nDepth)
)
{
return FALSE;
return(FALSE);
}
bool wxBitmapHandler::LoadFile(wxBitmap *WXUNUSED(bitmap),
const wxString& WXUNUSED(name),
long WXUNUSED(type),
int WXUNUSED(desiredWidth),
int WXUNUSED(desiredHeight))
bool wxBitmapHandler::LoadFile(
wxBitmap* WXUNUSED(pBitmap)
, const wxString& WXUNUSED(rName)
, long WXUNUSED(lType)
, int WXUNUSED(nDesiredWidth)
, int WXUNUSED(nDesiredHeight)
)
{
return FALSE;
return(FALSE(;
}
bool wxBitmapHandler::SaveFile(wxBitmap *WXUNUSED(bitmap),
const wxString& WXUNUSED(name),
int WXUNUSED(type),
const wxPalette *WXUNUSED(palette))
bool wxBitmapHandler::SaveFile(
wxBitmap* WXUNUSED(pBitmap)
, const wxString& WXUNUSED(rName)
, int WXUNUSED(nType)
, const wxPalette* WXUNUSED(pPalette)
)
{
return FALSE;
return(FALSE);
}
// ----------------------------------------------------------------------------
// DIB functions
// ----------------------------------------------------------------------------
bool wxCreateDIB(long xSize, long ySize, long bitsPerPixel,
HPALETTE hPal, LPBITMAPINFO* lpDIBHeader)
{
unsigned long i, headerSize;
LPBITMAPINFO lpDIBheader = NULL;
LPPALETTEENTRY lpPe = NULL;
// Allocate space for a DIB header
headerSize = (sizeof(BITMAPINFOHEADER) + (256 * sizeof(PALETTEENTRY)));
lpDIBheader = (BITMAPINFO *) malloc(headerSize);
lpPe = (PALETTEENTRY *)((BYTE*)lpDIBheader + sizeof(BITMAPINFOHEADER));
GetPaletteEntries(hPal, 0, 256, lpPe);
memset(lpDIBheader, 0x00, sizeof(BITMAPINFOHEADER));
// Fill in the static parts of the DIB header
lpDIBheader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpDIBheader->bmiHeader.biWidth = xSize;
lpDIBheader->bmiHeader.biHeight = ySize;
lpDIBheader->bmiHeader.biPlanes = 1;
// this value must be 1, 4, 8 or 24 so PixelDepth can only be
lpDIBheader->bmiHeader.biBitCount = (WORD)(bitsPerPixel);
lpDIBheader->bmiHeader.biCompression = BI_RGB;
lpDIBheader->bmiHeader.biSizeImage = xSize * abs(ySize) * bitsPerPixel >> 3;
lpDIBheader->bmiHeader.biClrUsed = 256;
// Initialize the DIB palette
for (i = 0; i < 256; i++) {
lpDIBheader->bmiColors[i].rgbReserved = lpPe[i].peFlags;
lpDIBheader->bmiColors[i].rgbRed = lpPe[i].peRed;
lpDIBheader->bmiColors[i].rgbGreen = lpPe[i].peGreen;
lpDIBheader->bmiColors[i].rgbBlue = lpPe[i].peBlue;
}
*lpDIBHeader = lpDIBheader;
return TRUE;
}
void wxFreeDIB(LPBITMAPINFO lpDIBHeader)
{
free(lpDIBHeader);
}