+ 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
+{
+ return GetBitmapData() ? &GetBitmapData()->m_bitmapPalette
+ : (wxPalette *) NULL;
+}
+#endif
+
+wxMask *wxBitmap::GetMask() const
+{
+ return GetBitmapData() ? GetBitmapData()->GetMask() : (wxMask *) NULL;
+}
+
+wxBitmap wxBitmap::GetMaskBitmap() const
+{
+ wxBitmap bmp;
+ wxMask *mask = GetMask();
+ if ( mask )
+ bmp.SetHBITMAP(mask->GetMaskBitmap());
+ return bmp;
+}
+
+#ifdef __WXDEBUG__
+
+wxDC *wxBitmap::GetSelectedInto() const
+{
+ return GetBitmapData() ? GetBitmapData()->m_selectedInto : (wxDC *) NULL;
+}
+
+#endif