X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8208e181cb576ec6cda37624923f95a59af43072..523050b607cfb5e6f9dfcb1544eb4f49ec1978cd:/src/mac/bitmap.cpp

diff --git a/src/mac/bitmap.cpp b/src/mac/bitmap.cpp
index 1ae5a445d4..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 <PictUtils.h>
 
@@ -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 ) ;
 	   }
@@ -514,6 +509,8 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour)
     }
 
 	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
@@ -545,6 +542,8 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour)
             }
         }
     }
+	UnlockPixels( GetGWorldPixMap( (CGrafPtr) m_maskBitmap ) ) ;
+	UnlockPixels( GetGWorldPixMap( ((wxBitmapRefData*) bitmap.GetRefData())->m_hBitmap ) ) ;
 	SetGWorld( origPort , origDevice ) ;
 
     return TRUE;
@@ -712,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; 
@@ -725,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;
@@ -753,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)
     {
@@ -777,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
@@ -809,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());
 
@@ -852,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)
     {
@@ -884,7 +871,6 @@ bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type
 }
 
 
-
 void wxBitmap::CleanUpHandlers()
 {
     wxNode *node = sm_handlers.First();
@@ -903,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);
 }