support for multiple images in one file

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13306 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2002-01-01 23:13:37 +00:00
parent 05813ada9a
commit 60d43ad883
4 changed files with 91 additions and 37 deletions

View File

@@ -46,7 +46,7 @@ public:
virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=TRUE, int index=0 ); virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=TRUE, int index=0 );
virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=TRUE ); virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=TRUE );
virtual int GetImageCount( wxInputStream& stream ); virtual int GetImagesCount( wxInputStream& stream );
bool CanRead( wxInputStream& stream ) { return DoCanRead(stream); } bool CanRead( wxInputStream& stream ) { return DoCanRead(stream); }
bool CanRead( const wxString& name ); bool CanRead( const wxString& name );
@@ -92,12 +92,12 @@ public:
wxImage(); wxImage();
wxImage( int width, int height ); wxImage( int width, int height );
wxImage( int width, int height, unsigned char* data, bool static_data = FALSE ); wxImage( int width, int height, unsigned char* data, bool static_data = FALSE );
wxImage( const wxString& name, long type = wxBITMAP_TYPE_ANY ); wxImage( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 );
wxImage( const wxString& name, const wxString& mimetype ); wxImage( const wxString& name, const wxString& mimetype, int index = -1 );
#if wxUSE_STREAMS #if wxUSE_STREAMS
wxImage( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY ); wxImage( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 );
wxImage( wxInputStream& stream, const wxString& mimetype ); wxImage( wxInputStream& stream, const wxString& mimetype, int index = -1 );
#endif // wxUSE_STREAMS #endif // wxUSE_STREAMS
wxImage( const wxImage& image ); wxImage( const wxImage& image );
@@ -164,13 +164,15 @@ public:
unsigned char mr, unsigned char mg, unsigned char mb); unsigned char mr, unsigned char mg, unsigned char mb);
static bool CanRead( const wxString& name ); static bool CanRead( const wxString& name );
virtual bool LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY ); static int GetImagesCount( const wxString& name, long type = wxBITMAP_TYPE_ANY );
virtual bool LoadFile( const wxString& name, const wxString& mimetype ); virtual bool LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 );
virtual bool LoadFile( const wxString& name, const wxString& mimetype, int index = -1 );
#if wxUSE_STREAMS #if wxUSE_STREAMS
static bool CanRead( wxInputStream& stream ); static bool CanRead( wxInputStream& stream );
virtual bool LoadFile( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY ); static int GetImagesCount( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY );
virtual bool LoadFile( wxInputStream& stream, const wxString& mimetype ); virtual bool LoadFile( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 );
virtual bool LoadFile( wxInputStream& stream, const wxString& mimetype, int index = -1 );
#endif #endif
virtual bool SaveFile( const wxString& name, int type ); virtual bool SaveFile( const wxString& name, int type );

View File

@@ -40,7 +40,7 @@ public:
virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=TRUE, int index=0 ); virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=TRUE, int index=0 );
virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=TRUE ); virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=TRUE );
virtual bool DoCanRead( wxInputStream& stream ); virtual bool DoCanRead( wxInputStream& stream );
virtual int GetImageCount( wxInputStream& stream ); virtual int GetImagesCount( wxInputStream& stream );
#endif #endif
}; };
#endif #endif

View File

@@ -108,25 +108,25 @@ wxImage::wxImage( int width, int height, unsigned char* data, bool static_data )
Create( width, height, data, static_data ); Create( width, height, data, static_data );
} }
wxImage::wxImage( const wxString& name, long type ) wxImage::wxImage( const wxString& name, long type, int index )
{ {
LoadFile( name, type ); LoadFile( name, type, index );
} }
wxImage::wxImage( const wxString& name, const wxString& mimetype ) wxImage::wxImage( const wxString& name, const wxString& mimetype, int index )
{ {
LoadFile( name, mimetype ); LoadFile( name, mimetype, index );
} }
#if wxUSE_STREAMS #if wxUSE_STREAMS
wxImage::wxImage( wxInputStream& stream, long type ) wxImage::wxImage( wxInputStream& stream, long type, int index )
{ {
LoadFile( stream, type ); LoadFile( stream, type, index );
} }
wxImage::wxImage( wxInputStream& stream, const wxString& mimetype ) wxImage::wxImage( wxInputStream& stream, const wxString& mimetype, int index )
{ {
LoadFile( stream, mimetype ); LoadFile( stream, mimetype, index );
} }
#endif // wxUSE_STREAMS #endif // wxUSE_STREAMS
@@ -890,14 +890,14 @@ bool wxImage::HasOption(const wxString& name) const
return (M_IMGDATA->m_optionNames.Index(name, FALSE) != wxNOT_FOUND); return (M_IMGDATA->m_optionNames.Index(name, FALSE) != wxNOT_FOUND);
} }
bool wxImage::LoadFile( const wxString& filename, long type ) bool wxImage::LoadFile( const wxString& filename, long type, int index )
{ {
#if wxUSE_STREAMS #if wxUSE_STREAMS
if (wxFileExists(filename)) if (wxFileExists(filename))
{ {
wxFileInputStream stream(filename); wxFileInputStream stream(filename);
wxBufferedInputStream bstream( stream ); wxBufferedInputStream bstream( stream );
return LoadFile(bstream, type); return LoadFile(bstream, type, index);
} }
else else
{ {
@@ -910,14 +910,14 @@ bool wxImage::LoadFile( const wxString& filename, long type )
#endif // wxUSE_STREAMS #endif // wxUSE_STREAMS
} }
bool wxImage::LoadFile( const wxString& filename, const wxString& mimetype ) bool wxImage::LoadFile( const wxString& filename, const wxString& mimetype, int index )
{ {
#if wxUSE_STREAMS #if wxUSE_STREAMS
if (wxFileExists(filename)) if (wxFileExists(filename))
{ {
wxFileInputStream stream(filename); wxFileInputStream stream(filename);
wxBufferedInputStream bstream( stream ); wxBufferedInputStream bstream( stream );
return LoadFile(bstream, mimetype); return LoadFile(bstream, mimetype, index);
} }
else else
{ {
@@ -970,23 +970,72 @@ bool wxImage::CanRead( const wxString &name )
#endif #endif
} }
int wxImage::GetImagesCount( const wxString &name, long type )
{
#if wxUSE_STREAMS
wxFileInputStream stream(name);
return GetImagesCount(stream, type);
#else
return 0;
#endif
}
#if wxUSE_STREAMS #if wxUSE_STREAMS
bool wxImage::CanRead( wxInputStream &stream ) bool wxImage::CanRead( wxInputStream &stream )
{ {
wxList &list=GetHandlers(); wxList &list=GetHandlers();
for ( wxList::Node *node = list.GetFirst(); node; node = node->GetNext() ) for ( wxList::Node *node = list.GetFirst(); node; node = node->GetNext() )
{ {
wxImageHandler *handler=(wxImageHandler*)node->GetData(); wxImageHandler *handler=(wxImageHandler*)node->GetData();
if (handler->CanRead( stream )) if (handler->CanRead( stream ))
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
bool wxImage::LoadFile( wxInputStream& stream, long type ) int wxImage::GetImagesCount( wxInputStream &stream, long type )
{
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->GetImagesCount(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->GetImagesCount(stream);
}
else
{
wxLogError(_("Image file is not of type %d."), type);
return 0;
}
}
bool wxImage::LoadFile( wxInputStream& stream, long type, int index )
{ {
UnRef(); UnRef();
@@ -994,15 +1043,15 @@ bool wxImage::LoadFile( wxInputStream& stream, long type )
wxImageHandler *handler; wxImageHandler *handler;
if (type==wxBITMAP_TYPE_ANY) if ( type == wxBITMAP_TYPE_ANY )
{ {
wxList &list=GetHandlers(); wxList &list=GetHandlers();
for ( wxList::Node *node = list.GetFirst(); node; node = node->GetNext() ) for ( wxList::Node *node = list.GetFirst(); node; node = node->GetNext() )
{ {
handler=(wxImageHandler*)node->GetData(); handler=(wxImageHandler*)node->GetData();
if (handler->CanRead( stream )) if ( handler->CanRead(stream) )
return handler->LoadFile( this, stream ); return handler->LoadFile(this, stream, TRUE/*verbose*/, index);
} }
@@ -1019,10 +1068,10 @@ bool wxImage::LoadFile( wxInputStream& stream, long type )
return FALSE; return FALSE;
} }
return handler->LoadFile( this, stream ); return handler->LoadFile(this, stream, TRUE/*verbose*/, index);
} }
bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype ) bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype, int index )
{ {
UnRef(); UnRef();
@@ -1037,7 +1086,7 @@ bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype )
return FALSE; return FALSE;
} }
return handler->LoadFile( this, stream ); return handler->LoadFile( this, stream, index );
} }
bool wxImage::SaveFile( wxOutputStream& stream, int type ) bool wxImage::SaveFile( wxOutputStream& stream, int type )
@@ -1190,7 +1239,7 @@ bool wxImageHandler::SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSE
return FALSE; return FALSE;
} }
int wxImageHandler::GetImageCount( wxInputStream& WXUNUSED(stream) ) int wxImageHandler::GetImagesCount( wxInputStream& WXUNUSED(stream) )
{ {
return 1; return 1;
} }

View File

@@ -157,6 +157,9 @@ TIFFwxOpen(wxOutputStream &stream, const char* name, const char* mode)
bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose, int index ) bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose, int index )
{ {
if (index == -1)
index = 0;
image->Destroy(); image->Destroy();
TIFF *tif = TIFFwxOpen( stream, "image", "r" ); TIFF *tif = TIFFwxOpen( stream, "image", "r" );
@@ -268,7 +271,7 @@ bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos
return TRUE; return TRUE;
} }
int wxTIFFHandler::GetImageCount( wxInputStream& stream ) int wxTIFFHandler::GetImagesCount( wxInputStream& stream )
{ {
TIFF *tif = TIFFwxOpen( stream, "image", "r" ); TIFF *tif = TIFFwxOpen( stream, "image", "r" );