+#endif // wxUSE_WXDIB
+
+#endif // wxUSE_IMAGE
+
+// ----------------------------------------------------------------------------
+// loading and saving bitmaps
+// ----------------------------------------------------------------------------
+
+bool wxBitmap::LoadFile(const wxString& filename, long type)
+{
+ UnRef();
+
+ wxBitmapHandler *handler = wxDynamicCast(FindHandler(type), wxBitmapHandler);
+
+ if ( handler )
+ {
+ m_refData = new wxBitmapRefData;
+
+ return handler->LoadFile(this, filename, type, -1, -1);
+ }
+#if wxUSE_IMAGE
+ else // no bitmap handler found
+ {
+ wxImage image;
+ if ( image.LoadFile( filename, type ) && image.Ok() )
+ {
+ *this = wxBitmap(image);
+
+ return true;
+ }
+ }
+#endif // wxUSE_IMAGE
+
+ return false;
+}
+
+bool wxBitmap::Create(void *data, long type, int width, int height, int depth)
+{
+ UnRef();
+
+ wxBitmapHandler *handler = wxDynamicCast(FindHandler(type), wxBitmapHandler);
+
+ if ( !handler )
+ {
+ wxLogDebug(wxT("Failed to create bitmap: no bitmap handler for type %ld defined."), type);
+
+ return false;
+ }
+
+ m_refData = new wxBitmapRefData;
+
+ return handler->Create(this, data, type, width, height, depth);
+}
+
+bool wxBitmap::SaveFile(const wxString& filename,
+ int type,
+ const wxPalette *palette)
+{
+ wxBitmapHandler *handler = wxDynamicCast(FindHandler(type), wxBitmapHandler);
+
+ if ( handler )
+ {
+ return handler->SaveFile(this, filename, type, palette);
+ }
+#if wxUSE_IMAGE
+ else // no bitmap handler found
+ {
+ // FIXME what about palette? shouldn't we use it?
+ wxImage image = ConvertToImage();
+ if ( image.Ok() )
+ {
+ return image.SaveFile(filename, type);
+ }
+ }
+#endif // wxUSE_IMAGE
+
+ return false;
+}
+
+// ----------------------------------------------------------------------------
+// sub bitmap extraction
+// ----------------------------------------------------------------------------
+
+wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const
+{
+ wxCHECK_MSG( Ok() &&
+ (rect.x >= 0) && (rect.y >= 0) &&
+ (rect.x+rect.width <= GetWidth()) &&
+ (rect.y+rect.height <= GetHeight()),
+ wxNullBitmap, wxT("Invalid bitmap or bitmap region") );
+
+ wxBitmap ret( rect.width, rect.height, GetDepth() );
+ wxASSERT_MSG( ret.Ok(), wxT("GetSubBitmap error") );
+
+#ifndef __WXMICROWIN__
+ // handle alpha channel, if any
+ if (HasAlpha())
+ ret.UseAlpha();
+
+ // copy bitmap data
+ MemoryHDC dcSrc,
+ dcDst;
+
+ {
+ SelectInHDC selectSrc(dcSrc, GetHbitmap()),
+ selectDst(dcDst, GetHbitmapOf(ret));
+
+ if ( !selectSrc || !selectDst )
+ {
+ wxLogLastError(_T("SelectObjct(hBitmap)"));
+ }
+
+ if ( !::BitBlt(dcDst, 0, 0, rect.width, rect.height,
+ dcSrc, rect.x, rect.y, SRCCOPY) )
+ {
+ wxLogLastError(_T("BitBlt"));
+ }
+ }
+
+ // copy mask if there is one
+ if ( GetMask() )
+ {
+ HBITMAP hbmpMask = ::CreateBitmap(rect.width, rect.height, 1, 1, 0);
+
+ SelectInHDC selectSrc(dcSrc, (HBITMAP) GetMask()->GetMaskBitmap()),
+ selectDst(dcDst, hbmpMask);
+
+ if ( !::BitBlt(dcDst, 0, 0, rect.width, rect.height,
+ dcSrc, rect.x, rect.y, SRCCOPY) )
+ {
+ wxLogLastError(_T("BitBlt"));
+ }
+
+ wxMask *mask = new wxMask((WXHBITMAP) hbmpMask);
+ ret.SetMask(mask);
+ }
+#endif // !__WXMICROWIN__
+
+ return ret;
+}
+
+// ----------------------------------------------------------------------------
+// wxBitmap accessors
+// ----------------------------------------------------------------------------
+
+#if wxUSE_PALETTE
+wxPalette* wxBitmap::GetPalette() const