]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/bitmap.cpp
no message
[wxWidgets.git] / src / mac / carbon / bitmap.cpp
index f88e89343b877ac50fd61e818928d3322401b302..5974622370f232596b176f21e01d3bfa73f667f9 100644 (file)
@@ -1,11 +1,11 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        bitmap.cpp
 // Purpose:     wxBitmap
-// Author:      AUTHOR
+// Author:      Stefan Csomor
 // Modified by:
-// Created:     ??/??/98
+// Created:     1998-01-01
 // RCS-ID:      $Id$
-// Copyright:   (c) AUTHOR
+// Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -218,8 +218,8 @@ CIconHandle wxMacCreateCIcon(GWorldPtr image , GWorldPtr mask , short dstDepth ,
 
     if ( mask )
     {
-       Rect r ;
-       GetPortBounds( image , &r ) ;
+        Rect r ;
+        GetPortBounds( image , &r ) ;
       LockPixels(GetGWorldPixMap(mask) ) ;
       CopyBits(GetPortBitMapForCopyBits(mask) ,
           &(**icon).iconBMap , &r , &r, srcCopy , nil ) ;
@@ -229,8 +229,8 @@ CIconHandle wxMacCreateCIcon(GWorldPtr image , GWorldPtr mask , short dstDepth ,
     }
     else
     {
-       Rect r ;
-       GetPortBounds( image , &r ) ;
+        Rect r ;
+        GetPortBounds( image , &r ) ;
         LockPixels(GetGWorldPixMap(image));
       CopyBits(GetPortBitMapForCopyBits(image) ,
           &(**icon).iconBMap , &r , &r, srcCopy , nil ) ;
@@ -275,7 +275,7 @@ PicHandle wxMacCreatePict(GWorldPtr wp, GWorldPtr mask)
   if ( clipRgn )
     GetRegionBounds( clipRgn , &portRect ) ;   
   else
-       GetPortBounds( wp , &portRect ) ;
+      GetPortBounds( wp , &portRect ) ;
   pict = OpenPicture(&portRect);   
   if(pict)  
   {
@@ -283,7 +283,7 @@ PicHandle wxMacCreatePict(GWorldPtr wp, GWorldPtr mask)
     RGBBackColor( &white ) ;
     
     if ( clipRgn )
-       SetClip( clipRgn ) ;
+        SetClip( clipRgn ) ;
     
     LockPixels( GetGWorldPixMap( wp ) ) ;
     CopyBits(GetPortBitMapForCopyBits(wp),          
@@ -296,7 +296,7 @@ PicHandle wxMacCreatePict(GWorldPtr wp, GWorldPtr mask)
   }
   SetGWorld( origPort , origDev ) ;
   if ( clipRgn )
-       DisposeRgn( clipRgn ) ;
+      DisposeRgn( clipRgn ) ;
   return pict;                  
 }
 
@@ -335,19 +335,19 @@ void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bi
                 info->contentType = kControlContentPictHandle ;
                 if ( bitmap.GetMask() )
                 {
-                                   info->u.picture = wxMacCreatePict( MAC_WXHBITMAP(bmap->m_hBitmap) , MAC_WXHBITMAP(bitmap.GetMask()->GetMaskBitmap() ) ) ;
+                    info->u.picture = wxMacCreatePict( MAC_WXHBITMAP(bmap->m_hBitmap) , MAC_WXHBITMAP(bitmap.GetMask()->GetMaskBitmap() ) ) ;
                }
                 else
                 {
-                                   info->u.picture = wxMacCreatePict( MAC_WXHBITMAP(bmap->m_hBitmap) , NULL ) ;
+                    info->u.picture = wxMacCreatePict( MAC_WXHBITMAP(bmap->m_hBitmap) , NULL ) ;
                 }
             }
         }
-               else if ( bmap->m_bitmapType == kMacBitmapTypeIcon )
-               {
-               info->contentType = kControlContentCIconHandle ;
-               info->u.cIconHandle = MAC_WXHICON(bmap->m_hIcon) ;
-               }
+        else if ( bmap->m_bitmapType == kMacBitmapTypeIcon )
+        {
+            info->contentType = kControlContentCIconHandle ;
+            info->u.cIconHandle = MAC_WXHICON(bmap->m_hIcon) ;
+        }
     }
 }
 
@@ -369,46 +369,46 @@ wxBitmapRefData::wxBitmapRefData()
 // TODO move this to a public function of Bitmap Ref
 static void DisposeBitmapRefData(wxBitmapRefData *data)
 {
-       if ( !data )
-               return ;
-               
-       switch (data->m_bitmapType)
-       {
-           case kMacBitmapTypePict :
-               {
-                   if ( data->m_hPict )
-                   {
-                       KillPicture( MAC_WXHMETAFILE( data->m_hPict ) ) ;
-                       data->m_hPict = NULL ;
-                   }
-               }
-               break ;
-           case kMacBitmapTypeGrafWorld :
-               {
-                   if ( data->m_hBitmap )
-                   {
-                       wxMacDestroyGWorld( MAC_WXHBITMAP(data->m_hBitmap) ) ;
-                       data->m_hBitmap = NULL ;
-                   }
-               }
-               break ;
-           case kMacBitmapTypeIcon :
-               if ( data->m_hIcon )
-               {
-                   DisposeCIcon( MAC_WXHICON(data->m_hIcon) ) ;
-                   data->m_hIcon = NULL ;
-               }
-           
-           default :
-               // unkown type ?
-               break ;
-       }
+    if ( !data )
+        return ;
+        
+    switch (data->m_bitmapType)
+    {
+        case kMacBitmapTypePict :
+            {
+                if ( data->m_hPict )
+                {
+                    KillPicture( MAC_WXHMETAFILE( data->m_hPict ) ) ;
+                    data->m_hPict = NULL ;
+                }
+            }
+            break ;
+        case kMacBitmapTypeGrafWorld :
+            {
+                if ( data->m_hBitmap )
+                {
+                    wxMacDestroyGWorld( MAC_WXHBITMAP(data->m_hBitmap) ) ;
+                    data->m_hBitmap = NULL ;
+                }
+            }
+            break ;
+        case kMacBitmapTypeIcon :
+            if ( data->m_hIcon )
+            {
+                DisposeCIcon( MAC_WXHICON(data->m_hIcon) ) ;
+                data->m_hIcon = NULL ;
+            }
+        
+        default :
+            // unkown type ?
+            break ;
+    }
     
-       if (data->m_bitmapMask)
-       {
-               delete data->m_bitmapMask;
-               data->m_bitmapMask = NULL;
-       }
+    if (data->m_bitmapMask)
+    {
+        delete data->m_bitmapMask;
+        data->m_bitmapMask = NULL;
+    }
 }
 
 wxBitmapRefData::~wxBitmapRefData()
@@ -565,7 +565,7 @@ wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const
            RGBColor  color;
 
            mask = (GWorldPtr) GetMask()->GetMaskBitmap();
-           submask = wxMacCreateGWorld(rect.width, rect.height, 1);
+           submask = wxMacCreateGWorld(rect.width, rect.height, GetMask()->GetDepth() );
            LockPixels(GetGWorldPixMap(mask));
            LockPixels(GetGWorldPixMap(submask));
 
@@ -642,8 +642,8 @@ void wxBitmap::SetHBITMAP(WXHBITMAP bmp)
 {
     if (!M_BITMAPDATA)
         m_refData = new wxBitmapRefData;
-       else
-       DisposeBitmapRefData( M_BITMAPDATA ) ;
+    else
+        DisposeBitmapRefData( M_BITMAPDATA ) ;
     
     M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
     M_BITMAPDATA->m_hBitmap = bmp ;
@@ -654,8 +654,8 @@ void wxBitmap::SetHICON(WXHICON ico)
 {
     if (!M_BITMAPDATA)
         m_refData = new wxBitmapRefData;
-       else
-       DisposeBitmapRefData( M_BITMAPDATA ) ;
+    else
+        DisposeBitmapRefData( M_BITMAPDATA ) ;
     
     M_BITMAPDATA->m_bitmapType = kMacBitmapTypeIcon ;
     M_BITMAPDATA->m_hIcon = ico ;
@@ -666,8 +666,8 @@ void wxBitmap::SetPict(WXHMETAFILE pict)
 {
     if (!M_BITMAPDATA)
         m_refData = new wxBitmapRefData;
-       else
-       DisposeBitmapRefData( M_BITMAPDATA ) ;
+    else
+        DisposeBitmapRefData( M_BITMAPDATA ) ;
     
     M_BITMAPDATA->m_bitmapType = kMacBitmapTypePict ;
     M_BITMAPDATA->m_hPict = pict ;
@@ -694,7 +694,7 @@ bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type)
             return true;
         }
     }
-    wxLogWarning("no bitmap handler for type %d defined.", type);
+    wxLogWarning(wxT("no bitmap handler for type %d defined."), type);
     return false;
 }
 
@@ -707,7 +707,7 @@ bool wxBitmap::Create(void *data, wxBitmapType type, int width, int height, int
     wxBitmapHandler *handler = FindHandler(type);
 
     if ( handler == NULL ) {
-        wxLogWarning("no bitmap handler for type %d defined.", type);
+        wxLogWarning(wxT("no bitmap handler for type %d defined."), type);
 
         return FALSE;
     }
@@ -755,7 +755,33 @@ wxBitmap::wxBitmap(const wxImage& image, int depth)
         destinationBase += ((**pixMap).rowBytes & 0x7fff);  
         destination = (unsigned char*) destinationBase ;    
     }  
-    if ( image.HasMask() )
+    if ( image.HasAlpha() )
+    {
+      unsigned char *alpha = image.GetAlpha(); 
+      
+      wxColour maskcolor(image.GetMaskRed(), image.GetMaskGreen(), image.GetMaskBlue());
+      RGBColor color ;
+      wxBitmap maskBitmap ;
+
+      maskBitmap.Create( width, height, 24);
+      LockPixels( GetGWorldPixMap( (GWorldPtr) maskBitmap.GetHBITMAP()) );
+      SetGWorld( (GWorldPtr) maskBitmap.GetHBITMAP(), NULL);
+
+      for (int y = 0; y < height; y++)
+      {
+          for (int x = 0; x < width; x++)
+          {
+              memset( &color , 255 - *alpha , sizeof( color ) );
+              SetCPixel(x,y, &color);
+
+              alpha += 1 ;
+          }
+      }  // for height
+      SetGWorld( (GWorldPtr) GetHBITMAP(), NULL);
+      SetMask(new wxMask( maskBitmap ));
+      UnlockPixels( GetGWorldPixMap( (GWorldPtr) maskBitmap.GetHBITMAP()) );
+    }
+    else if ( image.HasMask() )
     {
       data = image.GetData(); 
       
@@ -777,7 +803,7 @@ wxBitmap::wxBitmap(const wxImage& image, int depth)
                 SetCPixel(x,y, &white);
               }
               else {
-                      SetCPixel(x,y, &black);
+                SetCPixel(x,y, &black);
               }
               data += 3 ;
           }
@@ -820,26 +846,26 @@ wxImage wxBitmap::ConvertToImage() const
     GetGWorld( &origPort, &origDevice );
     if ( GetBitmapType() != kMacBitmapTypeGrafWorld )
     {
-       tempPort = wxMacCreateGWorld( width , height , -1) ;
+        tempPort = wxMacCreateGWorld( width , height , -1) ;
     }
     else
     {
-       tempPort =  (GWorldPtr) GetHBITMAP() ;
-       }
-       LockPixels(GetGWorldPixMap(tempPort));
-       SetGWorld( tempPort, NULL);
-       if ( GetBitmapType() == kMacBitmapTypePict || GetBitmapType() == kMacBitmapTypeIcon )
-       {
+        tempPort =  (GWorldPtr) GetHBITMAP() ;
+    }
+    LockPixels(GetGWorldPixMap(tempPort));
+    SetGWorld( tempPort, NULL);
+    if ( GetBitmapType() == kMacBitmapTypePict || GetBitmapType() == kMacBitmapTypeIcon )
+    {
         Rect bitmaprect = { 0 , 0 , height, width };
-       if ( GetBitmapType() == kMacBitmapTypeIcon )
-       {
-               ::PlotCIconHandle( &bitmaprect , atNone , ttNone , MAC_WXHICON(GetHICON()) ) ;
-               maskRgn = NewRgn() ;
-               BitMapToRegion( maskRgn , &(**(MAC_WXHICON(GetHICON()))).iconMask ) ; 
+        if ( GetBitmapType() == kMacBitmapTypeIcon )
+        {
+            ::PlotCIconHandle( &bitmaprect , atNone , ttNone , MAC_WXHICON(GetHICON()) ) ;
+            maskRgn = NewRgn() ;
+            BitMapToRegion( maskRgn , &(**(MAC_WXHICON(GetHICON()))).iconMask ) ; 
         }
-       else
-               ::DrawPicture( (PicHandle) GetPict(), &bitmaprect ) ;
-       }
+         else
+             ::DrawPicture( (PicHandle) GetPict(), &bitmaprect ) ;
+    }
     // Copy data into image
     index = 0;
     for (int yy = 0; yy < height; yy++)
@@ -854,28 +880,28 @@ wxImage wxBitmap::ConvertToImage() const
             data[index + 1] = g;
             data[index + 2] = b;
             if ( maskRgn )
-            {  
-               Point pt ;
-               pt.h = xx ;
-               pt.v = yy ;
-               if ( !PtInRgn( pt , maskRgn ) )
-               {
+            {    
+                Point pt ;
+                pt.h = xx ;
+                pt.v = yy ;
+                if ( !PtInRgn( pt , maskRgn ) )
+                {
                     data[index    ] = mask_r;
                     data[index + 1] = mask_g;
                     data[index + 2] = mask_b;
-               }
+                }
             }
             else
             {
-                   if (mask)
-                   {
-                       if (mask->PointMasked(xx,yy))
-                       {
-                           data[index    ] = mask_r;
-                           data[index + 1] = mask_g;
-                           data[index + 2] = mask_b;
-                       }
-                   }
+                if (mask)
+                {
+                    if (mask->PointMasked(xx,yy))
+                    {
+                        data[index    ] = mask_r;
+                        data[index + 1] = mask_g;
+                        data[index + 2] = mask_b;
+                    }
+                }
             }
             index += 3;
         }
@@ -891,11 +917,11 @@ wxImage wxBitmap::ConvertToImage() const
     SetGWorld(origPort, origDevice);
     if ( GetBitmapType() != kMacBitmapTypeGrafWorld )
     {
-       wxMacDestroyGWorld( tempPort ) ;
+        wxMacDestroyGWorld( tempPort ) ;
     }
     if ( maskRgn )
     {
-       DisposeRgn( maskRgn ) ;
+        DisposeRgn( maskRgn ) ;
     }
 
     return image;
@@ -918,7 +944,7 @@ bool wxBitmap::SaveFile(const wxString& filename, wxBitmapType type,
         return image.SaveFile(filename, type);
     }
     
-    wxLogWarning("no bitmap handler for type %d defined.", type);
+    wxLogWarning(wxT("no bitmap handler for type %d defined."), type);
     return false;
 }
 
@@ -1038,33 +1064,33 @@ WXHBITMAP wxBitmap::GetHBITMAP() const
 
 WXHMETAFILE wxBitmap::GetPict( bool *created ) const
 {
-       wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") );
+    wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") );
    
-       PicHandle picture = NULL ;       // This is the returned picture
-       if ( created )
-               (*created) = false ;
-       // If bitmap already in Pict format return pointer
-       if(M_BITMAPDATA->m_bitmapType == kMacBitmapTypePict) {
-          return M_BITMAPDATA->m_hPict;
-       }
-       else if(M_BITMAPDATA->m_bitmapType != kMacBitmapTypeGrafWorld) {
-          // Invalid bitmap
-          return NULL;
-       }
-       else
-       {
-               if ( GetMask() )
-               {
-                   picture = wxMacCreatePict( MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap) , MAC_WXHBITMAP(GetMask()->GetMaskBitmap() ) ) ;
-               }
-               else
-               {
-                   picture = wxMacCreatePict( MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap) , NULL ) ;
-               }
-               if ( created && picture )
-                       (*created) = true ;
+    PicHandle picture = NULL ;       // This is the returned picture
+    if ( created )
+        (*created) = false ;
+    // If bitmap already in Pict format return pointer
+    if(M_BITMAPDATA->m_bitmapType == kMacBitmapTypePict) {
+       return M_BITMAPDATA->m_hPict;
     }
-       return picture ;
+    else if(M_BITMAPDATA->m_bitmapType != kMacBitmapTypeGrafWorld) {
+       // Invalid bitmap
+       return NULL;
+    }
+    else
+    {
+        if ( GetMask() )
+        {
+            picture = wxMacCreatePict( MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap) , MAC_WXHBITMAP(GetMask()->GetMaskBitmap() ) ) ;
+        }
+        else
+        {
+            picture = wxMacCreatePict( MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap) , NULL ) ;
+        }
+        if ( created && picture )
+            (*created) = true ;
+    }
+     return picture ;
 }
 
 /*
@@ -1122,10 +1148,8 @@ bool wxMask::Create(const wxBitmap& bitmap)
 
    wxCHECK_MSG( bitmap.Ok(), false, wxT("Invalid bitmap"));
 
-   wxCHECK_MSG(bitmap.GetDepth() == 1, false,
-               wxT("Cannot create mask from colour bitmap"));
-
-   m_maskBitmap = wxMacCreateGWorld(bitmap.GetWidth(), bitmap.GetHeight(), 1);
+    m_depth = bitmap.GetDepth() ;
+   m_maskBitmap = wxMacCreateGWorld(bitmap.GetWidth(), bitmap.GetHeight(), bitmap.GetDepth() );
    Rect rect = { 0,0, bitmap.GetHeight(), bitmap.GetWidth() };
 
    LockPixels( GetGWorldPixMap( (GWorldPtr) m_maskBitmap) );
@@ -1163,7 +1187,8 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour)
     
     wxCHECK_MSG( bitmap.Ok(), false, wxT("Illigal bitmap"));
 
-    m_maskBitmap = wxMacCreateGWorld( bitmap.GetWidth() , bitmap.GetHeight() , 1 ); 
+    m_maskBitmap = wxMacCreateGWorld( bitmap.GetWidth() , bitmap.GetHeight() , 1 );
+    m_depth = 1 ; 
     LockPixels( GetGWorldPixMap(  (GWorldPtr) m_maskBitmap ) );
     LockPixels( GetGWorldPixMap(  (GWorldPtr) bitmap.GetHBITMAP() ) );
     RGBColor maskColor = MAC_WXCOLORREF(colour.GetPixel());
@@ -1257,8 +1282,8 @@ class WXDLLEXPORT wxPICTResourceHandler: public wxBitmapHandler
 public:
     inline wxPICTResourceHandler()
     {
-        m_name = "Macintosh Pict resource";
-        m_extension = "";
+        m_name = wxT("Macintosh Pict resource");
+        m_extension = wxEmptyString;
         m_type = wxBITMAP_TYPE_PICT_RESOURCE;
     };
 
@@ -1271,14 +1296,8 @@ bool  wxPICTResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, lo
           int desiredWidth, int desiredHeight)
 {
     Str255 theName ;
-    
-#if TARGET_CARBON
-    c2pstrcpy( (StringPtr) theName , name ) ;
-#else
-    strcpy( (char *) theName , name ) ;
-    c2pstr( (char *)theName ) ;
-#endif
-    
+    wxMacStringToPascal( name , theName ) ;
+   
     PicHandle thePict = (PicHandle ) GetNamedResource( 'PICT' , theName ) ;
     if ( thePict )
     {