+wxBitmapDataObject::wxBitmapDataObject()
+{
+ m_pngData = (void*)NULL;
+ m_pngSize = 0;
+}
+
+wxBitmapDataObject::wxBitmapDataObject( const wxBitmap& bitmap )
+{
+ m_pngData = (void*)NULL;
+ m_pngSize = 0;
+ m_bitmap = bitmap;
+ DoConvertToPng();
+}
+
+wxBitmapDataObject::~wxBitmapDataObject()
+{
+ if (m_pngData)
+ delete[] m_pngData;
+}
+
+void wxBitmapDataObject::SetBitmap( const wxBitmap &bitmap )
+{
+ if (m_pngData)
+ delete[] m_pngData;
+ m_pngData = (void*)NULL;
+ m_pngSize = 0;
+
+ m_bitmap = bitmap;
+ DoConvertToPng();
+}
+
+size_t wxBitmapDataObject::GetDataSize(const wxDataFormat& format) const
+{
+ if (format != wxDF_BITMAP) return 0;
+
+ return m_pngSize;
+}
+
+bool wxBitmapDataObject::GetDataHere(const wxDataFormat& format, void *buf) const
+{
+ if (format != wxDF_BITMAP) return FALSE;
+
+ if (m_pngSize > 0)
+ {
+ memcpy(buf, m_pngData, m_pngSize);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+bool wxBitmapDataObject::SetData(const wxDataFormat& format, const void *buf)
+{
+ if (m_pngData) delete[] m_pngData;
+ m_pngData = (void*) NULL;
+ m_pngSize = 0;
+ m_bitmap = wxNullBitmap;
+
+ return FALSE;
+}
+
+void wxBitmapDataObject::SetPngData(const void *buf, size_t size)
+{
+ if (m_pngData) delete[] m_pngData;
+ m_pngSize = size;
+ m_pngData = (void*) new char[m_pngSize];
+
+ memcpy( m_pngData, buf, m_pngSize );
+
+ wxMemoryInputStream mstream( (char*) m_pngData, m_pngSize );
+ wxImage image;
+ wxPNGHandler handler;
+ handler.LoadFile( &image, mstream );
+ m_bitmap = image.ConvertToBitmap();
+}
+
+void wxBitmapDataObject::DoConvertToPng()
+{
+ if (!m_bitmap.Ok()) return;
+
+ wxImage image( m_bitmap );
+ wxPNGHandler handler;
+
+ wxCountingOutputStream count;
+ handler.SaveFile( &image, count );
+ m_pngSize = count.GetSize() + 100; // sometimes the size seems to vary ???
+ m_pngData = (void*) new char[m_pngSize];
+
+ wxMemoryOutputStream mstream( (char*) m_pngData, m_pngSize );
+ handler.SaveFile( &image, mstream );
+}
+