]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/iconbndl.cpp
correct bug with using uninitialized end variable (unused variable warnings are not...
[wxWidgets.git] / src / common / iconbndl.cpp
index ff0f8275732de22ca31575a9156476b902631087..8fa0ccd441d5f665d6832fcb47305d5bf293a71a 100644 (file)
     #include "wx/intl.h"
     #include "wx/bitmap.h"
     #include "wx/image.h"
+    #include "wx/stream.h"
 #endif
 
+#include "wx/wfstream.h"
+
 #include "wx/arrimpl.cpp"
 WX_DEFINE_OBJARRAY(wxIconArray)
 
@@ -60,6 +63,14 @@ wxIconBundle::wxIconBundle(const wxString& file, wxBitmapType type)
     AddIcon(file, type);
 }
 
+#if wxUSE_STREAMS
+wxIconBundle::wxIconBundle(wxInputStream& stream, wxBitmapType type)
+            : wxGDIObject()
+{
+    AddIcon(stream, type);
+}
+#endif // wxUSE_STREAMS
+
 wxIconBundle::wxIconBundle(const wxIcon& icon)
             : wxGDIObject()
 {
@@ -81,6 +92,53 @@ void wxIconBundle::DeleteIcons()
     UnRef();
 }
 
+namespace
+{
+
+// Adds icon from 'input' to the bundle. Shows 'errorMessage' on failure
+// (it must contain "%d", because it is used to report # of image in the file
+// that failed to load):
+void DoAddIcon(wxIconBundle& bundle,
+               wxInputStream& input,
+               wxBitmapType type,
+               const wxString& errorMessage)
+{
+    wxImage image;
+
+    const wxFileOffset posOrig = input.TellI();
+
+    const size_t count = wxImage::GetImageCount(input, type);
+    for ( size_t i = 0; i < count; ++i )
+    {
+        if ( i )
+        {
+            // the call to LoadFile() for the first sub-image updated the
+            // stream position but we need to start reading the subsequent
+            // sub-image at the image beginning too
+            input.SeekI(posOrig);
+        }
+
+        if ( !image.LoadFile(input, type, i) )
+        {
+            wxLogError(errorMessage, i);
+            continue;
+        }
+
+        if ( type == wxBITMAP_TYPE_ANY )
+        {
+            // store the type so that we don't need to try all handlers again
+            // for the subsequent images, they should all be of the same type
+            type = image.GetType();
+        }
+
+        wxIcon tmp;
+        tmp.CopyFromBitmap(wxBitmap(image));
+        bundle.AddIcon(tmp);
+    }
+}
+
+} // anonymous namespace
+
 void wxIconBundle::AddIcon(const wxString& file, wxBitmapType type)
 {
 #ifdef __WXMAC__
@@ -96,28 +154,21 @@ void wxIconBundle::AddIcon(const wxString& file, wxBitmapType type)
     }
 #endif // __WXMAC__
 
-#if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB)
-    wxImage image;
-
-    const size_t count = wxImage::GetImageCount( file, type );
-    for ( size_t i = 0; i < count; ++i )
-    {
-        if ( !image.LoadFile( file, type, i ) )
-        {
-            wxLogError( _("Failed to load image %d from file '%s'."),
-                        i, file.c_str() );
-            continue;
-        }
+    wxFFileInputStream stream(file);
+    DoAddIcon
+    (
+        *this,
+        stream, type,
+        wxString::Format(_("Failed to load image %%d from file '%s'."), file)
+    );
+}
 
-        wxIcon tmp;
-        tmp.CopyFromBitmap(wxBitmap(image));
-        AddIcon(tmp);
-    }
-#else // !wxUSE_IMAGE
-    wxUnusedVar(file);
-    wxUnusedVar(type);
-#endif // wxUSE_IMAGE/!wxUSE_IMAGE
+#if wxUSE_STREAMS
+void wxIconBundle::AddIcon(wxInputStream& stream, wxBitmapType type)
+{
+    DoAddIcon(*this, stream, type, _("Failed to load image %d from stream."));
 }
+#endif // wxUSE_STREAMS
 
 wxIcon wxIconBundle::GetIcon(const wxSize& size) const
 {