]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement deep copy of wxBitmapRefData
authorRobin Dunn <robin@alldunn.com>
Wed, 1 Nov 2006 03:23:35 +0000 (03:23 +0000)
committerRobin Dunn <robin@alldunn.com>
Wed, 1 Nov 2006 03:23:35 +0000 (03:23 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42890 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/mac/carbon/bitmap.h
include/wx/mac/carbon/private.h
src/mac/carbon/bitmap.cpp

index 865ee73a905fb28b752ed03d8a9dbafc381204e3..418586576b1dfbd1a166dbc1772f6ed591c74704 100644 (file)
@@ -34,11 +34,13 @@ class WXDLLEXPORT wxPixelDataBase;
 class WXDLLEXPORT wxMask: public wxObject
 {
     DECLARE_DYNAMIC_CLASS(wxMask)
-    DECLARE_NO_COPY_CLASS(wxMask)
 
 public:
     wxMask();
 
+    // Copy constructor
+    wxMask(const wxMask& mask);
+
     // Construct a mask from a bitmap and a colour indicating
     // the transparent area
     wxMask(const wxBitmap& bitmap, const wxColour& colour);
@@ -181,6 +183,11 @@ public:
     // makes sure that no cached images will be constructed until terminated
     void *BeginRawAccess() ;
     void EndRawAccess() ;
+
+protected:
+    // ref counting code
+    virtual wxObjectRefData *CreateRefData() const;
+    virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const;
 };
 #endif
   // _WX_BITMAP_H_
index 50cdec1becc3bff06f5230da0253d7fcd1d0a7c7..1990703794c9a76c68a27c1705b53794b8408392 100644 (file)
@@ -1168,13 +1168,13 @@ void wxMacMemoryBufferReleaseProc(void *info, const void *data, size_t size);
 
 class WXDLLEXPORT wxBitmapRefData: public wxGDIRefData
 {
-    DECLARE_NO_COPY_CLASS(wxBitmapRefData)
-
     friend class WXDLLEXPORT wxIcon;
     friend class WXDLLEXPORT wxCursor;
 public:
     wxBitmapRefData(int width , int height , int depth);
     wxBitmapRefData();
+    wxBitmapRefData(const wxBitmapRefData &tocopy);
+
     virtual ~wxBitmapRefData();
 
     void Free();
index 4c0a49334f344e01c6cc66a4d5ae1ee789a8ab05..1b4dca41c70c3e3084b162a0a7912047806abaea 100644 (file)
@@ -153,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() ;
@@ -883,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") ) ;
@@ -1341,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 )