X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad81651f00edc6f489d9b6a0839d316a964fd521..cd212ee42521a28c8947cf287940121cde7cde8f:/src/mac/bitmap.cpp?ds=inline diff --git a/src/mac/bitmap.cpp b/src/mac/bitmap.cpp index d14b15ba7f..65eb2eeb50 100644 --- a/src/mac/bitmap.cpp +++ b/src/mac/bitmap.cpp @@ -25,8 +25,10 @@ extern "C" #include "xpm.h" } ; +#if !USE_SHARED_LIBRARIES IMPLEMENT_DYNAMIC_CLASS(wxBitmap, wxGDIObject) IMPLEMENT_DYNAMIC_CLASS(wxMask, wxObject) +#endif #include @@ -69,16 +71,7 @@ GWorldPtr wxMacCreateGWorld( int height , int width , int depth ) 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 ) ; @@ -178,7 +171,8 @@ wxBitmap::wxBitmap(const char bits[], int the_width, int the_height, int no_bits 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 ; @@ -211,6 +205,7 @@ wxBitmap::wxBitmap(const char bits[], int the_width, int the_height, int no_bits } } + UnlockPixels( GetGWorldPixMap( (CGrafPtr) M_BITMAPDATA->m_hBitmap ) ) ; SetGWorld( origPort , origDevice ) ; } @@ -446,18 +441,14 @@ wxBitmapHandler *wxBitmap::FindHandler(long bitmapType) 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); } @@ -465,26 +456,24 @@ wxMask::wxMask(const wxBitmap& bitmap, const wxColour& 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). @@ -506,8 +495,58 @@ bool wxMask::Create(const wxBitmap& bitmap, int paletteIndex) // 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; } /* @@ -672,8 +711,8 @@ bool wxXPMFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type 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; @@ -685,7 +724,7 @@ bool wxXPMFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type DeleteDC(dc); if (errorStatus == XpmSuccess) - return TRUE; /* no error */ + return TRUE; else return FALSE; } else return FALSE; @@ -713,13 +752,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxXPMDataHandler, wxBitmapHandler) 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) { @@ -737,7 +777,12 @@ bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int widt 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 @@ -769,19 +814,6 @@ bool wxBMPResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long 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()); @@ -812,11 +844,6 @@ bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long fla #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) { @@ -844,7 +871,6 @@ bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type } - void wxBitmap::CleanUpHandlers() { wxNode *node = sm_handlers.First(); @@ -863,7 +889,7 @@ void wxBitmap::InitStandardHandlers() AddHandler( new wxPICTResourceHandler ) ; AddHandler( new wxICONResourceHandler ) ; AddHandler(new wxXPMFileHandler); - AddHandler(new wxXPMDataHandler); + AddHandler(new wxXPMDataHandler); AddHandler(new wxBMPResourceHandler); AddHandler(new wxBMPFileHandler); }