]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/bitmap.cpp
Fix GetNextItem for virtual wxListCtrl, and improve behavior for wxLIST_NEXT_ALL.
[wxWidgets.git] / src / mac / carbon / bitmap.cpp
index ed9892706ce8ba27964c1bdd7175dc9e13a13d89..1b4dca41c70c3e3084b162a0a7912047806abaea 100644 (file)
@@ -93,8 +93,10 @@ void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bi
 #endif
         else
         {
+#ifndef __LP64__
             info->contentType = kControlContentPictHandle ;
             info->u.picture = bmap->GetPictHandle() ;
+#endif
         }
     }
 }
@@ -151,6 +153,28 @@ void wxBitmapRefData::Init()
     m_hasAlpha = false;
 }
 
+wxBitmapRefData::wxBitmapRefData(const wxBitmapRefData &tocopy)
+{
+    Init();
+    Create(tocopy.m_width, tocopy.m_height, tocopy.m_depth); 
+    
+    if (tocopy.m_bitmapMask)
+        m_bitmapMask = new wxMask(*tocopy.m_bitmapMask);
+
+    unsigned char* dest = (unsigned char*)GetRawAccess();
+    unsigned char* source = (unsigned char*)tocopy.GetRawAccess();
+    size_t numbytes = tocopy.m_width * tocopy.m_height * 4;
+    
+    for (size_t i=0; i<numbytes; i++)
+    {
+        *dest++ = *source++;
+    }
+    
+    UseAlpha(tocopy.m_hasAlpha);
+
+    // TODO:  Copy palette?
+}
+
 wxBitmapRefData::wxBitmapRefData()
 {
     Init() ;
@@ -176,10 +200,11 @@ bool wxBitmapRefData::Create( int w , int h , int d )
 
     m_hBitmap = NULL ;
     Rect rect = { 0 , 0 , m_height , m_width } ;
+#ifndef __LP64__
     verify_noerr( NewGWorldFromPtr( (GWorldPtr*) &m_hBitmap , k32ARGBPixelFormat , &rect , NULL , NULL , 0 ,
         (char*) data , m_bytesPerRow ) ) ;
     wxASSERT_MSG( m_hBitmap , wxT("Unable to create GWorld context") ) ;
-
+#endif
     m_ok = ( m_hBitmap != NULL ) ;
 
     return m_ok ;
@@ -204,9 +229,11 @@ void wxBitmapRefData::UseAlpha( bool use )
 
         memset( data , 0 , size ) ;
         Rect rect = { 0 , 0 , height , width } ;
+#ifndef __LP64__
         verify_noerr( NewGWorldFromPtr( (GWorldPtr*) &m_hMaskBitmap , k32ARGBPixelFormat , &rect , NULL , NULL , 0 ,
             (char*) data , m_maskBytesPerRow ) ) ;
         wxASSERT_MSG( m_hMaskBitmap , wxT("Unable to create GWorld context for alpha mask") ) ;
+#endif
         m_maskMemBuf.UngetWriteBuf(size) ;
 
 #if !wxMAC_USE_CORE_GRAPHICS
@@ -215,7 +242,9 @@ void wxBitmapRefData::UseAlpha( bool use )
     }
     else
     {
+#ifndef __LP64__
         DisposeGWorld( m_hMaskBitmap ) ;
+#endif
         m_hMaskBitmap = NULL ;
         m_maskBytesPerRow = 0 ;
     }
@@ -423,6 +452,7 @@ PicHandle wxBitmapRefData::GetPictHandle()
 {
     if ( m_pictHandle == NULL )
     {
+#ifndef __LP64__
         CGrafPtr origPort = NULL ;
         GDHandle origDev = NULL ;
         GWorldPtr wp = NULL ;
@@ -492,6 +522,7 @@ PicHandle wxBitmapRefData::GetPictHandle()
         SetGWorld( origPort , origDev ) ;
         if ( clipRgn )
             DisposeRgn( clipRgn ) ;
+#endif
     }
 
     return m_pictHandle ;
@@ -551,16 +582,38 @@ CGImageRef wxBitmapRefData::CGImageCreate() const
 
             membuf = new wxMemoryBuffer( m_memBuf ) ;
         }
-
-        CGColorSpaceRef colorSpace = wxMacGetGenericRGBColorSpace();
-        CGDataProviderRef dataProvider =
-            CGDataProviderCreateWithData(
-                membuf , (const void *)membuf->GetData() , imageSize,
-                wxMacMemoryBufferReleaseProc );
-        image =
+        
+        CGDataProviderRef dataProvider = NULL ;
+        if ( m_depth == 1 )
+        {
+            wxMemoryBuffer* maskBuf = new wxMemoryBuffer( m_width * m_height );
+            unsigned char * maskBufData = (unsigned char *) maskBuf->GetData();
+            unsigned char * bufData = (unsigned char *) membuf->GetData() ;
+            // copy one color component
+            for( int i = 0 ; i < m_width * m_height ; ++i )
+                maskBufData[i] = bufData[i*4+3];
+            dataProvider =
+                CGDataProviderCreateWithData(
+                    maskBuf , (const void *) maskBufData , m_width * m_height,
+                    wxMacMemoryBufferReleaseProc );
+            // as we are now passing the mask buffer to the data provider, we have
+            // to release the membuf ourselves
+            delete membuf ;
+
+            image = ::CGImageMaskCreate( w, h, 8, 8, m_width , dataProvider, NULL, false );
+        }
+        else
+        {
+            CGColorSpaceRef colorSpace = wxMacGetGenericRGBColorSpace();
+            dataProvider =
+                CGDataProviderCreateWithData(
+                    membuf , (const void *)membuf->GetData() , imageSize,
+                    wxMacMemoryBufferReleaseProc );
+            image =
             ::CGImageCreate(
                 w, h, 8 , 32 , 4 * m_width , colorSpace, alphaInfo ,
                 dataProvider, NULL , false , kCGRenderingIntentDefault );
+        }
         CGDataProviderRelease( dataProvider);
     }
     else
@@ -652,6 +705,7 @@ void wxBitmapRefData::Free()
         m_iconRef = NULL ;
     }
 
+#ifndef __LP64__
     if ( m_pictHandle )
     {
         KillPicture( m_pictHandle ) ;
@@ -669,7 +723,7 @@ void wxBitmapRefData::Free()
         DisposeGWorld( MAC_WXHBITMAP(m_hMaskBitmap) ) ;
         m_hMaskBitmap = NULL ;
     }
-
+#endif
     if (m_bitmapMask)
     {
         delete m_bitmapMask;
@@ -811,7 +865,7 @@ wxBitmap::wxBitmap(const char bits[], int the_width, int the_height, int no_bits
                 bit = x % 8 ;
                 mask = 1 << bit ;
 
-                if ( !(linestart[index] & mask ) )
+                if ( linestart[index] & mask )
                 {
                     *destination++ = 0xFF ;
                     *destination++ = 0 ;
@@ -851,6 +905,16 @@ wxBitmap::wxBitmap(const wxString& filename, wxBitmapType type)
     LoadFile(filename, type);
 }
 
+wxObjectRefData* wxBitmap::CreateRefData() const
+{
+    return new wxBitmapRefData;
+}
+
+wxObjectRefData* wxBitmap::CloneRefData(const wxObjectRefData* data) const
+{
+    return new wxBitmapRefData(*wx_static_cast(const wxBitmapRefData *, data));
+}
+
 void * wxBitmap::GetRawAccess() const
 {
     wxCHECK_MSG( Ok() , NULL , wxT("invalid bitmap") ) ;
@@ -1196,7 +1260,7 @@ bool wxBitmap::SaveFile( const wxString& filename,
     return success;
 }
 
-bool wxBitmap::Ok() const
+bool wxBitmap::IsOk() const
 {
    return (M_BITMAPDATA && M_BITMAPDATA->Ok());
 }
@@ -1249,33 +1313,25 @@ bool wxBitmap::HasAlpha() const
 
 void wxBitmap::SetWidth(int w)
 {
-    if (!M_BITMAPDATA)
-        m_refData = new wxBitmapRefData;
-
+    AllocExclusive();
     M_BITMAPDATA->SetWidth(w);
 }
 
 void wxBitmap::SetHeight(int h)
 {
-    if (!M_BITMAPDATA)
-        m_refData = new wxBitmapRefData;
-
+    AllocExclusive();
     M_BITMAPDATA->SetHeight(h);
 }
 
 void wxBitmap::SetDepth(int d)
 {
-    if (!M_BITMAPDATA)
-        m_refData = new wxBitmapRefData;
-
+    AllocExclusive();
     M_BITMAPDATA->SetDepth(d);
 }
 
 void wxBitmap::SetOk(bool isOk)
 {
-    if (!M_BITMAPDATA)
-        m_refData = new wxBitmapRefData;
-
+    AllocExclusive();
     M_BITMAPDATA->SetOk(isOk);
 }
 
@@ -1289,18 +1345,14 @@ wxPalette *wxBitmap::GetPalette() const
 
 void wxBitmap::SetPalette(const wxPalette& palette)
 {
-    if (!M_BITMAPDATA)
-        m_refData = new wxBitmapRefData;
-
+    AllocExclusive();
     M_BITMAPDATA->m_bitmapPalette = palette ;
 }
 #endif // wxUSE_PALETTE
 
 void wxBitmap::SetMask(wxMask *mask)
 {
-    if (!M_BITMAPDATA)
-        m_refData = new wxBitmapRefData;
-
+    AllocExclusive();
     // Remove existing mask if there is one.
     delete M_BITMAPDATA->m_bitmapMask;
 
@@ -1321,6 +1373,26 @@ wxMask::wxMask()
     Init() ;
 }
 
+wxMask::wxMask(const wxMask &tocopy)
+{
+    Init();
+
+    m_bytesPerRow = tocopy.m_bytesPerRow;
+    m_width = tocopy.m_width;
+    m_height = tocopy.m_height;
+
+    size_t size = m_bytesPerRow * m_height;
+    unsigned char* dest = (unsigned char*)m_memBuf.GetWriteBuf( size );
+    unsigned char* source = (unsigned char*)tocopy.m_memBuf.GetData();
+    for (size_t i=0; i<size; i++)
+    {
+        *dest++ = *source++;
+    }
+
+    m_memBuf.UngetWriteBuf( size ) ;
+    RealizeNative() ;
+}
+
 // Construct a mask from a bitmap and a colour indicating
 // the transparent area
 wxMask::wxMask( const wxBitmap& bitmap, const wxColour& colour )
@@ -1346,11 +1418,13 @@ wxMask::wxMask( const wxMemoryBuffer& data, int width , int height , int bytesPe
 
 wxMask::~wxMask()
 {
+#ifndef __LP64__
     if ( m_maskBitmap )
     {
         DisposeGWorld( (GWorldPtr)m_maskBitmap ) ;
         m_maskBitmap = NULL ;
     }
+#endif
 }
 
 void wxMask::Init()
@@ -1369,6 +1443,7 @@ void *wxMask::GetRawAccess() const
 
 void wxMask::RealizeNative()
 {
+#ifndef __LP64__
     if ( m_maskBitmap )
     {
        DisposeGWorld( (GWorldPtr)m_maskBitmap ) ;
@@ -1381,6 +1456,7 @@ void wxMask::RealizeNative()
         (GWorldPtr*) &m_maskBitmap , k32ARGBPixelFormat , &rect , NULL , NULL , 0 ,
         (char*) m_memBuf.GetData() , m_bytesPerRow ) ;
     verify_noerr( err ) ;
+#endif
 }
 
 // Create a mask from a mono bitmap (copies the bitmap).