- // create a wxMask object
- wxMask *mask = new wxMask();
- mask->SetMaskBitmap( (WXHBITMAP) hbitmap );
- bitmap.SetMask( mask );
- // It will be deleted when the wxBitmap object is deleted (as of 01/1999)
- /* The following can also be used but is slow to run
- wxColour colour( GetMaskRed(), GetMaskGreen(), GetMaskBlue());
- wxMask *mask = new wxMask( bitmap, colour );
- bitmap.SetMask( mask );
- */
- }
-
- // free allocated resources
- ::SelectObject( memdc, 0 );
- ::DeleteDC( memdc );
- ::ReleaseDC(NULL, hdc);
- free(lpDIBh);
- free(lpBits);
-
- // check the wxBitmap object
- if( bitmap.GetHBITMAP() )
- bitmap.SetOk( TRUE );
+
+ wxLogWarning( _("No handler found for image type.") );
+ return false;
+ }
+
+ handler = FindHandler(type);
+
+ if (handler == 0)
+ {
+ wxLogWarning( _("No image handler for type %d defined."), type );
+
+ return false;
+ }
+
+ return handler->LoadFile(this, stream, true/*verbose*/, index);
+}
+
+bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype, int index )
+{
+ UnRef();
+
+ m_refData = new wxImageRefData;
+
+ wxImageHandler *handler = FindHandlerMime(mimetype);
+
+ if (handler == 0)
+ {
+ wxLogWarning( _("No image handler for type %s defined."), mimetype.GetData() );
+
+ return false;
+ }
+
+ return handler->LoadFile( this, stream, true/*verbose*/, index );
+}
+
+bool wxImage::SaveFile( wxOutputStream& stream, int type ) const
+{
+ wxCHECK_MSG( Ok(), false, wxT("invalid image") );
+
+ wxImageHandler *handler = FindHandler(type);
+ if ( !handler )
+ {
+ wxLogWarning( _("No image handler for type %d defined."), type );
+
+ return false;
+ }
+
+ return handler->SaveFile( (wxImage*)this, stream );
+}
+
+bool wxImage::SaveFile( wxOutputStream& stream, const wxString& mimetype ) const
+{
+ wxCHECK_MSG( Ok(), false, wxT("invalid image") );
+
+ wxImageHandler *handler = FindHandlerMime(mimetype);
+ if ( !handler )
+ {
+ wxLogWarning( _("No image handler for type %s defined."), mimetype.GetData() );
+
+ return false;
+ }
+
+ return handler->SaveFile( (wxImage*)this, stream );
+}
+#endif // wxUSE_STREAMS
+
+void wxImage::AddHandler( wxImageHandler *handler )
+{
+ // Check for an existing handler of the type being added.
+ if (FindHandler( handler->GetType() ) == 0)
+ {
+ sm_handlers.Append( handler );
+ }
+ else
+ {
+ // This is not documented behaviour, merely the simplest 'fix'
+ // for preventing duplicate additions. If someone ever has
+ // a good reason to add and remove duplicate handlers (and they
+ // may) we should probably refcount the duplicates.
+ // also an issue in InsertHandler below.
+
+ wxLogDebug( _T("Adding duplicate image handler for '%s'"),
+ handler->GetName().c_str() );
+ delete handler;
+ }
+}
+
+void wxImage::InsertHandler( wxImageHandler *handler )
+{
+ // Check for an existing handler of the type being added.
+ if (FindHandler( handler->GetType() ) == 0)
+ {
+ sm_handlers.Insert( handler );
+ }
+ else
+ {
+ // see AddHandler for additional comments.
+ wxLogDebug( _T("Inserting duplicate image handler for '%s'"),
+ handler->GetName().c_str() );
+ delete handler;
+ }
+}
+
+bool wxImage::RemoveHandler( const wxString& name )
+{
+ wxImageHandler *handler = FindHandler(name);
+ if (handler)
+ {
+ sm_handlers.DeleteObject(handler);
+ delete handler;
+ return true;
+ }