]> git.saurik.com Git - wxWidgets.git/commitdiff
support for multiple images in one file
authorVáclav Slavík <vslavik@fastmail.fm>
Tue, 1 Jan 2002 23:13:37 +0000 (23:13 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Tue, 1 Jan 2002 23:13:37 +0000 (23:13 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13306 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/image.h
include/wx/imagtiff.h
src/common/image.cpp
src/common/imagtiff.cpp

index af8b9995fb2309b1754b5a86e83523cbb06c59ca..9cee5d69f8ee6e51e16f61920df670f707cb2cc4 100644 (file)
@@ -46,7 +46,7 @@ public:
     virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=TRUE, int index=0 );
     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( const wxString& name );
@@ -92,12 +92,12 @@ public:
     wxImage();
     wxImage( int width, int height );
     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, const wxString& mimetype );
+    wxImage( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 );
+    wxImage( const wxString& name, const wxString& mimetype, int index = -1 );
 
 #if wxUSE_STREAMS
-    wxImage( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY );
-    wxImage( wxInputStream& stream, const wxString& mimetype );
+    wxImage( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 );
+    wxImage( wxInputStream& stream, const wxString& mimetype, int index = -1 );
 #endif // wxUSE_STREAMS
 
     wxImage( const wxImage& image );
@@ -164,13 +164,15 @@ public:
                           unsigned char mr, unsigned char mg, unsigned char mb);
 
     static bool CanRead( const wxString& name );
-    virtual bool LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY );
-    virtual bool LoadFile( const wxString& name, const wxString& mimetype );
+    static int GetImagesCount( const wxString& name, long type = wxBITMAP_TYPE_ANY );
+    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
     static bool CanRead( wxInputStream& stream );
-    virtual bool LoadFile( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY );
-    virtual bool LoadFile( wxInputStream& stream, const wxString& mimetype );
+    static int GetImagesCount( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY );
+    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
 
     virtual bool SaveFile( const wxString& name, int type );
index 55d3ff0689e6ca4d497efe0e5e8dfbb0e803f6f0..6d25bf9ba3c608443614ca6102fcdafafe6a86f1 100644 (file)
@@ -40,7 +40,7 @@ public:
   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 DoCanRead( wxInputStream& stream );
-  virtual int GetImageCount( wxInputStream& stream );
+  virtual int GetImagesCount( wxInputStream& stream );
 #endif
 };
 #endif
index ee46631c932cde21bfbfb9929b019e0b55533e9e..80ee2992d37d815c1fde1ce76cd6465c43f1e2ce 100644 (file)
@@ -108,25 +108,25 @@ wxImage::wxImage( int width, int height, unsigned char* data, bool 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
-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
 
@@ -890,14 +890,14 @@ bool wxImage::HasOption(const wxString& name) const
     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 (wxFileExists(filename))
     {
         wxFileInputStream stream(filename);
         wxBufferedInputStream bstream( stream );
-        return LoadFile(bstream, type);
+        return LoadFile(bstream, type, index);
     }
     else
     {
@@ -910,14 +910,14 @@ bool wxImage::LoadFile( const wxString& filename, long type )
 #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 (wxFileExists(filename))
     {
         wxFileInputStream stream(filename);
         wxBufferedInputStream bstream( stream );
-        return LoadFile(bstream, mimetype);
+        return LoadFile(bstream, mimetype, index);
     }
     else
     {
@@ -970,23 +970,72 @@ bool wxImage::CanRead( const wxString &name )
 #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
 
 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();
-      if (handler->CanRead( stream ))
-        return TRUE;
+        wxImageHandler *handler=(wxImageHandler*)node->GetData();
+        if (handler->CanRead( stream ))
+            return TRUE;
     }
 
-  return FALSE;
+    return FALSE;
+}
+
+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 )
+bool wxImage::LoadFile( wxInputStream& stream, long type, int index )
 {
     UnRef();
 
@@ -994,15 +1043,15 @@ bool wxImage::LoadFile( wxInputStream& stream, long type )
 
     wxImageHandler *handler;
 
-    if (type==wxBITMAP_TYPE_ANY)
+    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 );
+             if ( handler->CanRead(stream) )
+                 return handler->LoadFile(this, stream, TRUE/*verbose*/, index);
 
         }
 
@@ -1019,10 +1068,10 @@ bool wxImage::LoadFile( wxInputStream& stream, long type )
         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();
 
@@ -1037,7 +1086,7 @@ bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype )
         return FALSE;
     }
 
-    return handler->LoadFile( this, stream );
+    return handler->LoadFile( this, stream, index );
 }
 
 bool wxImage::SaveFile( wxOutputStream& stream, int type )
@@ -1190,7 +1239,7 @@ bool wxImageHandler::SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSE
     return FALSE;
 }
 
-int wxImageHandler::GetImageCount( wxInputStream& WXUNUSED(stream) )
+int wxImageHandler::GetImagesCount( wxInputStream& WXUNUSED(stream) )
 {
     return 1;
 }
index 4cbf865fad0906765a4e08d5fdf8c8c1aa5245c3..cf49f4aa82c51937f84beafeee61f155bf009d2a 100644 (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 )
 {
+    if (index == -1)
+        index = 0;
+
     image->Destroy();
 
     TIFF *tif = TIFFwxOpen( stream, "image", "r" );
@@ -268,7 +271,7 @@ bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos
     return TRUE;
 }
 
-int wxTIFFHandler::GetImageCount( wxInputStream& stream )
+int wxTIFFHandler::GetImagesCount( wxInputStream& stream )
 {
     TIFF *tif = TIFFwxOpen( stream, "image", "r" );