X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/519cb848a8f4c91c73421bb75314754284e593a4..28be2e8a170979d476a5ea4f585505b8a2f5af27:/src/mac/carbon/bitmap.cpp?ds=inline

diff --git a/src/mac/carbon/bitmap.cpp b/src/mac/carbon/bitmap.cpp
index 3a66121d49..65eb2eeb50 100644
--- a/src/mac/carbon/bitmap.cpp
+++ b/src/mac/carbon/bitmap.cpp
@@ -71,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 ) ;
@@ -180,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 ;
@@ -213,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 ) ;
 	   }
@@ -448,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);
 }
 
@@ -467,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).
@@ -508,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;
 }
 
 /*
@@ -674,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; 
@@ -687,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;
@@ -715,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)
     {
@@ -739,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
@@ -771,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());
 
@@ -814,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)
     {
@@ -846,7 +871,6 @@ bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type
 }
 
 
-
 void wxBitmap::CleanUpHandlers()
 {
     wxNode *node = sm_handlers.First();
@@ -865,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);
 }