- int r = data[index];
- index++;
- int g = data[index];
- index++;
- int b = data[index];
- index++;
-
- if (HasMask())
- {
- if ((r == r_mask) && (b == b_mask) && (g == g_mask))
- gdk_image_put_pixel( mask_image, x, y, 1 );
- else
- gdk_image_put_pixel( mask_image, x, y, 0 );
- }
-
- if (HasMask())
- {
- if ((r == r_mask) && (b == b_mask) && (g == g_mask))
- gdk_image_put_pixel( mask_image, x, y, 1 );
- else
- gdk_image_put_pixel( mask_image, x, y, 0 );
- }
-
- switch (bpp)
- {
- case 8:
- {
- int pixel = -1;
- if (wxTheApp->m_colorCube)
- {
- pixel = wxTheApp->m_colorCube[ ((r & 0xf8) << 7) + ((g & 0xf8) << 2) + ((b & 0xf8) >> 3) ];
- }
- else
- {
- GdkColormap *cmap = gtk_widget_get_default_colormap();
- GdkColor *colors = cmap->colors;
- int max = 3 * (65536);
-
- for (int i = 0; i < cmap->size; i++)
- {
- int rdiff = (r << 8) - colors[i].red;
- int gdiff = (g << 8) - colors[i].green;
- int bdiff = (b << 8) - colors[i].blue;
- int sum = ABS (rdiff) + ABS (gdiff) + ABS (bdiff);
- if (sum < max) { pixel = i; max = sum; }
- }
- }
-
- gdk_image_put_pixel( data_image, x, y, pixel );
-
- break;
- }
- case 15:
- {
- guint32 pixel = ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | ((b & 0xf8) >> 3);
- gdk_image_put_pixel( data_image, x, y, pixel );
- break;
- }
- case 16:
- {
- guint32 pixel = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | ((b & 0xf8) >> 3);
- gdk_image_put_pixel( data_image, x, y, pixel );
- break;
- }
- case 32:
- case 24:
- {
- guint32 pixel = 0;
- switch (b_o)
- {
- case RGB: pixel = (r << 16) | (g << 8) | b; break;
- case RBG: pixel = (r << 16) | (b << 8) | g; break;
- case BRG: pixel = (b << 16) | (r << 8) | g; break;
- case BGR: pixel = (b << 16) | (g << 8) | r; break;
- case GRB: pixel = (g << 16) | (r << 8) | b; break;
- case GBR: pixel = (g << 16) | (b << 8) | r; break;
- }
- gdk_image_put_pixel( data_image, x, y, pixel );
- }
- default: break;
- }
- } // for
- } // for
-
- // Blit picture
-
- GdkGC *data_gc = gdk_gc_new( bitmap.GetPixmap() );
-
- gdk_draw_image( bitmap.GetPixmap(), data_gc, data_image, 0, 0, 0, 0, width, height );
-
- gdk_image_destroy( data_image );
- gdk_gc_unref( data_gc );
-
- // Blit mask
-
- if (HasMask())
+ 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::Node *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 == 0)
+ {
+ 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 == 0)
+ {
+ 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 )
+{
+ // make sure that the memory will be freed at the program end
+ sm_handlers.DeleteContents(TRUE);
+
+ // 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 )
+{
+ // make sure that the memory will be freed at the program end
+ sm_handlers.DeleteContents(TRUE);
+
+ // 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);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+wxImageHandler *wxImage::FindHandler( const wxString& name )
+{
+ wxNode *node = sm_handlers.GetFirst();
+ while (node)
+ {
+ wxImageHandler *handler = (wxImageHandler*)node->GetData();
+ if (handler->GetName().Cmp(name) == 0) return handler;
+
+ node = node->GetNext();
+ }
+ return 0;
+}
+
+wxImageHandler *wxImage::FindHandler( const wxString& extension, long bitmapType )
+{
+ wxNode *node = sm_handlers.GetFirst();
+ while (node)
+ {
+ wxImageHandler *handler = (wxImageHandler*)node->GetData();
+ if ( (handler->GetExtension().Cmp(extension) == 0) &&
+ (bitmapType == -1 || handler->GetType() == bitmapType) )
+ return handler;
+ node = node->GetNext();
+ }
+ return 0;
+}
+
+wxImageHandler *wxImage::FindHandler( long bitmapType )
+{
+ wxNode *node = sm_handlers.GetFirst();
+ while (node)
+ {
+ wxImageHandler *handler = (wxImageHandler *)node->GetData();
+ if (handler->GetType() == bitmapType) return handler;
+ node = node->GetNext();
+ }
+ return 0;
+}
+
+wxImageHandler *wxImage::FindHandlerMime( const wxString& mimetype )
+{
+ wxNode *node = sm_handlers.GetFirst();
+ while (node)
+ {
+ wxImageHandler *handler = (wxImageHandler *)node->GetData();
+ if (handler->GetMimeType().IsSameAs(mimetype, FALSE)) return handler;
+ node = node->GetNext();
+ }
+ return 0;
+}
+
+void wxImage::InitStandardHandlers()
+{
+#if wxUSE_STREAMS
+ AddHandler(new wxBMPHandler);
+#endif // wxUSE_STREAMS
+}
+
+void wxImage::CleanUpHandlers()
+{
+ wxNode *node = sm_handlers.GetFirst();
+ while (node)
+ {
+ wxImageHandler *handler = (wxImageHandler *)node->GetData();
+ wxNode *next = node->GetNext();
+ delete handler;
+ delete node;
+ node = next;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// wxImageHandler
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_ABSTRACT_CLASS(wxImageHandler,wxObject)
+
+#if wxUSE_STREAMS
+bool wxImageHandler::LoadFile( wxImage *WXUNUSED(image), wxInputStream& WXUNUSED(stream), bool WXUNUSED(verbose), int WXUNUSED(index) )
+{
+ return FALSE;
+}
+
+bool wxImageHandler::SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSED(stream), bool WXUNUSED(verbose) )
+{
+ return FALSE;
+}
+
+int wxImageHandler::GetImageCount( wxInputStream& WXUNUSED(stream) )
+{
+ return 1;
+}
+
+bool wxImageHandler::CanRead( const wxString& name )
+{
+ if (wxFileExists(name))