+ }
+
+ free(M_IMGDATA->m_alpha);
+ M_IMGDATA->m_alpha = NULL;
+
+ return true;
+}
+
+// ----------------------------------------------------------------------------
+// Palette functions
+// ----------------------------------------------------------------------------
+
+#if wxUSE_PALETTE
+
+bool wxImage::HasPalette() const
+{
+ if (!Ok())
+ return false;
+
+ return M_IMGDATA->m_palette.Ok();
+}
+
+const wxPalette& wxImage::GetPalette() const
+{
+ wxCHECK_MSG( Ok(), wxNullPalette, wxT("invalid image") );
+
+ return M_IMGDATA->m_palette;
+}
+
+void wxImage::SetPalette(const wxPalette& palette)
+{
+ wxCHECK_RET( Ok(), wxT("invalid image") );
+
+ M_IMGDATA->m_palette = palette;
+}
+
+#endif // wxUSE_PALETTE
+
+// ----------------------------------------------------------------------------
+// Option functions (arbitrary name/value mapping)
+// ----------------------------------------------------------------------------
+
+void wxImage::SetOption(const wxString& name, const wxString& value)
+{
+ wxCHECK_RET( Ok(), wxT("invalid image") );
+
+ int idx = M_IMGDATA->m_optionNames.Index(name, false);
+ if (idx == wxNOT_FOUND)
+ {
+ M_IMGDATA->m_optionNames.Add(name);
+ M_IMGDATA->m_optionValues.Add(value);
+ }
+ else
+ {
+ M_IMGDATA->m_optionNames[idx] = name;
+ M_IMGDATA->m_optionValues[idx] = value;
+ }
+}
+
+void wxImage::SetOption(const wxString& name, int value)
+{
+ wxString valStr;
+ valStr.Printf(wxT("%d"), value);
+ SetOption(name, valStr);
+}
+
+wxString wxImage::GetOption(const wxString& name) const
+{
+ wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid image") );
+
+ int idx = M_IMGDATA->m_optionNames.Index(name, false);
+ if (idx == wxNOT_FOUND)
+ return wxEmptyString;
+ else
+ return M_IMGDATA->m_optionValues[idx];
+}
+
+int wxImage::GetOptionInt(const wxString& name) const
+{
+ return wxAtoi(GetOption(name));
+}
+
+bool wxImage::HasOption(const wxString& name) const
+{
+ wxCHECK_MSG( Ok(), false, wxT("invalid image") );
+
+ return (M_IMGDATA->m_optionNames.Index(name, false) != wxNOT_FOUND);
+}
+
+// ----------------------------------------------------------------------------
+// image I/O
+// ----------------------------------------------------------------------------
+
+bool wxImage::LoadFile( const wxString& filename, long type, int index )
+{
+#if wxUSE_STREAMS
+ if (wxFileExists(filename))
+ {
+ wxFileInputStream stream(filename);
+ wxBufferedInputStream bstream( stream );
+ return LoadFile(bstream, type, index);
+ }
+ else
+ {
+ wxLogError( _("Can't load image from file '%s': file does not exist."), filename.c_str() );
+
+ return false;
+ }
+#else // !wxUSE_STREAMS
+ return false;
+#endif // wxUSE_STREAMS
+}
+
+bool wxImage::LoadFile( const wxString& filename, const wxString& mimetype, int index )
+{
+#if wxUSE_STREAMS
+ if (wxFileExists(filename))
+ {
+ wxFileInputStream stream(filename);
+ wxBufferedInputStream bstream( stream );
+ return LoadFile(bstream, mimetype, index);
+ }
+ else
+ {
+ wxLogError( _("Can't load image from file '%s': file does not exist."), filename.c_str() );
+
+ return false;
+ }
+#else // !wxUSE_STREAMS
+ return false;
+#endif // wxUSE_STREAMS
+}
+
+
+
+bool wxImage::SaveFile( const wxString& filename ) const
+{
+ wxString ext = filename.AfterLast('.').Lower();
+
+ wxImageHandler * pHandler = FindHandler(ext, -1);
+ if (pHandler)
+ {
+ SaveFile(filename, pHandler->GetType());
+ return true;
+ }
+
+ wxLogError(_("Can't save image to file '%s': unknown extension."), filename.c_str());
+
+ return false;
+}
+
+bool wxImage::SaveFile( const wxString& filename, int type ) const
+{
+#if wxUSE_STREAMS
+ wxCHECK_MSG( Ok(), false, wxT("invalid image") );
+
+ ((wxImage*)this)->SetOption(wxIMAGE_OPTION_FILENAME, filename);
+
+ wxFileOutputStream stream(filename);
+
+ if ( stream.IsOk() )
+ {
+ wxBufferedOutputStream bstream( stream );
+ return SaveFile(bstream, type);
+ }
+#endif // wxUSE_STREAMS
+
+ return false;
+}
+
+bool wxImage::SaveFile( const wxString& filename, const wxString& mimetype ) const
+{
+#if wxUSE_STREAMS
+ wxCHECK_MSG( Ok(), false, wxT("invalid image") );
+
+ ((wxImage*)this)->SetOption(wxIMAGE_OPTION_FILENAME, filename);
+
+ wxFileOutputStream stream(filename);
+
+ if ( stream.IsOk() )
+ {
+ wxBufferedOutputStream bstream( stream );
+ return SaveFile(bstream, mimetype);
+ }
+#endif // wxUSE_STREAMS
+
+ return false;
+}
+
+bool wxImage::CanRead( const wxString &name )
+{
+#if wxUSE_STREAMS
+ wxFileInputStream stream(name);
+ return CanRead(stream);
+#else
+ return false;
+#endif
+}
+
+int wxImage::GetImageCount( const wxString &name, long type )
+{
+#if wxUSE_STREAMS
+ wxFileInputStream stream(name);
+ if (stream.Ok())
+ return GetImageCount(stream, type);
+#endif
+
+ return 0;
+}
+
+#if wxUSE_STREAMS
+
+bool wxImage::CanRead( wxInputStream &stream )
+{
+ const wxList& list = GetHandlers();
+
+ for ( wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext() )
+ {
+ wxImageHandler *handler=(wxImageHandler*)node->GetData();
+ if (handler->CanRead( stream ))
+ return true;
+ }
+
+ return false;
+}
+
+int wxImage::GetImageCount( wxInputStream &stream, long type )
+{
+ wxImageHandler *handler;
+
+ if ( type == wxBITMAP_TYPE_ANY )
+ {
+ wxList &list=GetHandlers();
+
+ for (wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext())
+ {
+ handler=(wxImageHandler*)node->GetData();
+ if ( handler->CanRead(stream) )
+ return handler->GetImageCount(stream);
+
+ }
+
+ wxLogWarning(_("No handler found for image type."));
+ return 0;
+ }
+
+ handler = FindHandler(type);
+
+ if ( !handler )
+ {
+ wxLogWarning(_("No image handler for type %d defined."), type);
+ return false;
+ }
+
+ if ( handler->CanRead(stream) )
+ {
+ return handler->GetImageCount(stream);
+ }
+ else
+ {
+ wxLogError(_("Image file is not of type %d."), type);
+ return 0;
+ }
+}
+
+bool wxImage::LoadFile( wxInputStream& stream, long type, int index )
+{
+ UnRef();
+
+ m_refData = new wxImageRefData;
+
+ wxImageHandler *handler;
+
+ if ( type == wxBITMAP_TYPE_ANY )
+ {
+ wxList &list=GetHandlers();
+
+ for ( wxList::compatibility_iterator node = list.GetFirst(); node; node = node->GetNext() )
+ {
+ handler=(wxImageHandler*)node->GetData();
+ if ( handler->CanRead(stream) )
+ return handler->LoadFile(this, stream, true/*verbose*/, index);
+
+ }
+
+ 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
+
+// ----------------------------------------------------------------------------
+// image I/O handlers
+// ----------------------------------------------------------------------------
+
+void wxImage::AddHandler( wxImageHandler *handler )
+{
+ // Check for an existing handler of the type being added.
+ if (FindHandler( handler->GetType() ) == 0)
+ {
+ sm_handlers.Append( handler );
+ }