#include "xpm.h"
} ;
+#if !USE_SHARED_LIBRARIES
IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject)
IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject)
+#endif
#include <PictUtils.h>
if ( depth < 0 )
{
- // get max pixel depth
- CGrafPtr port ;
- GetCWMgrPort( &port ) ;
- GDHandle maxDevice ;
-
- maxDevice = GetMaxDevice( &port->portRect ) ;
- if ( maxDevice )
- depth = (**((**maxDevice).gdPMap)).pixelSize ;
- else
- depth = 8 ;
+ depth = wxDisplayDepth() ;
}
err = NewGWorld( &port , depth , &rect , NULL , NULL , 0 ) ;
GetGWorld( &origPort , &origDevice ) ;
SetGWorld( M_BITMAPDATA->m_hBitmap , NULL ) ;
-
+ LockPixels( GetGWorldPixMap( (CGrafPtr) M_BITMAPDATA->m_hBitmap ) ) ;
+
// bits is a word aligned array
unsigned char* linestart = (unsigned char*) bits ;
}
}
+ UnlockPixels( GetGWorldPixMap( (CGrafPtr) M_BITMAPDATA->m_hBitmap ) ) ;
SetGWorld( origPort , origDevice ) ;
}
wxMask::wxMask()
{
-/* TODO
m_maskBitmap = 0;
-*/
}
// Construct a mask from a bitmap and a colour indicating
// the transparent area
wxMask::wxMask(const wxBitmap& bitmap, const wxColour& colour)
{
-/* TODO
m_maskBitmap = 0;
-*/
Create(bitmap, colour);
}
// the transparent area
wxMask::wxMask(const wxBitmap& bitmap, int paletteIndex)
{
-/* TODO
m_maskBitmap = 0;
-*/
-
Create(bitmap, paletteIndex);
}
// Construct a mask from a mono bitmap (copies the bitmap).
wxMask::wxMask(const wxBitmap& bitmap)
{
-/* TODO
m_maskBitmap = 0;
-*/
-
Create(bitmap);
}
wxMask::~wxMask()
{
-// TODO: delete mask bitmap
+ if ( m_maskBitmap )
+ {
+ wxMacDestroyGWorld( m_maskBitmap ) ;
+ m_maskBitmap = NULL ;
+ }
}
// Create a mask from a mono bitmap (copies the bitmap).
// the transparent area
bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour)
{
-// TODO
- return FALSE;
+ if ( m_maskBitmap )
+ {
+ wxMacDestroyGWorld( m_maskBitmap ) ;
+ m_maskBitmap = NULL ;
+ }
+ wxASSERT( ((wxBitmapRefData*) bitmap.GetRefData())->m_bitmapType == kMacBitmapTypeGrafWorld ) ;
+ // other types would require a temporary bitmap. not yet implemented
+
+ if (!bitmap.Ok())
+ {
+ return FALSE;
+ }
+
+ m_maskBitmap = wxMacCreateGWorld( bitmap.GetWidth() , bitmap.GetHeight() , 1 ) ;
+ LockPixels( GetGWorldPixMap( (CGrafPtr) m_maskBitmap ) ) ;
+ LockPixels( GetGWorldPixMap( (CGrafPtr) ((wxBitmapRefData*) bitmap.GetRefData())->m_hBitmap ) ) ;
+ RGBColor maskColor = colour.GetPixel() ;
+
+ // this is not very efficient, but I can't think
+ // of a better way of doing it
+ CGrafPtr origPort ;
+ GDHandle origDevice ;
+
+ GetGWorld( &origPort , &origDevice ) ;
+ for (int w = 0; w < bitmap.GetWidth(); w++)
+ {
+ for (int h = 0; h < bitmap.GetHeight(); h++)
+ {
+ RGBColor colors[2] = {
+ { 0xFFFF , 0xFFFF , 0xFFFF } ,
+ { 0, 0 , 0 }
+ } ;
+
+ SetGWorld( ((wxBitmapRefData*) bitmap.GetRefData())->m_hBitmap , NULL ) ;
+ RGBColor col ;
+ GetCPixel( w , h , &col ) ;
+ SetGWorld( m_maskBitmap , NULL ) ;
+ if (col.red == maskColor.red && col.blue == maskColor.blue && col.green == maskColor.green)
+ {
+ SetCPixel( w , h , &colors[0] ) ;
+ }
+ else
+ {
+ SetCPixel( w , h , &colors[1] ) ;
+ }
+ }
+ }
+ UnlockPixels( GetGWorldPixMap( (CGrafPtr) m_maskBitmap ) ) ;
+ UnlockPixels( GetGWorldPixMap( ((wxBitmapRefData*) bitmap.GetRefData())->m_hBitmap ) ) ;
+ SetGWorld( origPort , origDevice ) ;
+
+ return TRUE;
}
/*
if (dc)
{
if (SelectObject(dc, (HBITMAP) M_BITMAPHANDLERDATA->m_hBitmap))
- { /* for following SetPixel */
- /* fill the XImage struct 'by hand' */
+ {
+
ximage.width = M_BITMAPHANDLERDATA->m_width;
ximage.height = M_BITMAPHANDLERDATA->m_height;
ximage.depth = M_BITMAPHANDLERDATA->m_depth;
DeleteDC(dc);
if (errorStatus == XpmSuccess)
- return TRUE; /* no error */
+ return TRUE;
else
return FALSE;
} else return FALSE;
bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth)
{
- XImage * ximage;
+ XImage * ximage = NULL ;
+ XImage * xshapeimage = NULL ;
int ErrorStatus;
XpmAttributes xpmAttr;
xpmAttr.valuemask = XpmReturnInfos; // get infos back
ErrorStatus = XpmCreateImageFromData( GetMainDevice() , (char **)data,
- &ximage, (XImage **) NULL, &xpmAttr);
+ &ximage, &xshapeimage, &xpmAttr);
if (ErrorStatus == XpmSuccess)
{
XImageFree(ximage); // releases the malloc, but does not detroy
// the bitmap
M_BITMAPHANDLERDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
-
+ if ( xshapeimage != NULL )
+ {
+ wxMask* m = new wxMask() ;
+ m->SetMaskBitmap( xshapeimage->gworldptr ) ;
+ M_BITMAPHANDLERDATA->m_bitmapMask = m ;
+ }
return TRUE;
}
else
int desiredWidth, int desiredHeight)
{
// TODO: load colourmap.
-/*
- M_BITMAPHANDLERDATA->m_hBitmap = (WXHBITMAP) ::LoadBitmap(wxGetInstance(), name);
- if (M_BITMAPHANDLERDATA->m_hBitmap)
- {
- M_BITMAPHANDLERDATA->m_ok = TRUE;
- BITMAP bm;
- GetObject((HBITMAP) M_BITMAPHANDLERDATA->m_hBitmap, sizeof(BITMAP), (LPSTR) &bm);
- M_BITMAPHANDLERDATA->m_width = bm.bmWidth;
- M_BITMAPHANDLERDATA->m_height = bm.bmHeight;
- M_BITMAPHANDLERDATA->m_depth = bm.bmBitsPixel;
- return TRUE;
- }
-*/
// it's probably not found
wxLogError("Can't load bitmap '%s' from resources! Check .rc file.", name.c_str());
#if USE_IMAGE_LOADING_IN_MSW
wxPalette *palette = NULL;
bool success = FALSE;
-/*
- if (type & wxBITMAP_DISCARD_COLOURMAP)
- success = wxLoadIntoBitmap(WXSTRINGCAST name, bitmap);
- else
-*/
success = (wxLoadIntoBitmap(WXSTRINGCAST name, bitmap, &palette) != 0);
if (!success && palette)
{
}
-
void wxBitmap::CleanUpHandlers()
{
wxNode *node = sm_handlers.First();
AddHandler( new wxPICTResourceHandler ) ;
AddHandler( new wxICONResourceHandler ) ;
AddHandler(new wxXPMFileHandler);
- AddHandler(new wxXPMDataHandler);
+ AddHandler(new wxXPMDataHandler);
AddHandler(new wxBMPResourceHandler);
AddHandler(new wxBMPFileHandler);
}