From cee875e32996e5c5eb8b788cfe84e2bf2a078f53 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sun, 29 Mar 2009 21:19:40 +0000 Subject: [PATCH] add support for loading wxIconBundles from streams git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59929 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/iconbndl.h | 12 +++++-- interface/wx/iconbndl.h | 26 ++++++++++++--- src/common/iconbndl.cpp | 74 ++++++++++++++++++++++++++++++----------- 3 files changed, 86 insertions(+), 26 deletions(-) diff --git a/include/wx/iconbndl.h b/include/wx/iconbndl.h index f32db6f3e3..8af8773a59 100644 --- a/include/wx/iconbndl.h +++ b/include/wx/iconbndl.h @@ -19,6 +19,8 @@ #include "wx/dynarray.h" +class WXDLLIMPEXP_FWD_BASE wxInputStream; + WX_DECLARE_EXPORTED_OBJARRAY(wxIcon, wxIconArray); // this class can't load bitmaps of type wxBITMAP_TYPE_ICO_RESOURCE, @@ -31,7 +33,10 @@ public: wxIconBundle(); // initializes the bundle with the icon(s) found in the file - wxIconBundle(const wxString& file, wxBitmapType type); + wxIconBundle(const wxString& file, wxBitmapType type = wxBITMAP_TYPE_ANY); +#if wxUSE_STREAMS + wxIconBundle(wxInputStream& stream, wxBitmapType type = wxBITMAP_TYPE_ANY); +#endif // initializes the bundle with a single icon wxIconBundle(const wxIcon& icon); @@ -41,7 +46,10 @@ public: // adds all the icons contained in the file to the collection, // if the collection already contains icons with the same // width and height, they are replaced - void AddIcon(const wxString& file, wxBitmapType type); + void AddIcon(const wxString& file, wxBitmapType type = wxBITMAP_TYPE_ANY); +#if wxUSE_STREAMS + void AddIcon(wxInputStream& stream, wxBitmapType type = wxBITMAP_TYPE_ANY); +#endif // adds the icon to the collection, if the collection already // contains an icon with the same width and height, it is diff --git a/interface/wx/iconbndl.h b/interface/wx/iconbndl.h index 9e35cc0dde..aecfe287f5 100644 --- a/interface/wx/iconbndl.h +++ b/interface/wx/iconbndl.h @@ -29,7 +29,14 @@ public: /** Initializes the bundle with the icon(s) found in the file. */ - wxIconBundle(const wxString& file, wxBitmapType type); + wxIconBundle(const wxString& file, wxBitmapType type = wxBITMAP_TYPE_ANY); + + /** + Initializes the bundle with the icon(s) found in the stream. + + @since 2.9.0 + */ + wxIconBundle(wxInputStream& stream, wxBitmapType type = wxBITMAP_TYPE_ANY); /** Initializes the bundle with a single icon. @@ -47,11 +54,20 @@ public: virtual ~wxIconBundle(); /** - Adds all the icons contained in the file to the bundle; if the collection - already contains icons with the same width and height, they are replaced - by the new ones. + Adds all the icons contained in the file to the bundle; if the + collection already contains icons with the same width and height, they + are replaced by the new ones. + */ + void AddIcon(const wxString& file, wxBitmapType type = wxBITMAP_TYPE_ANY); + + /** + Adds all the icons contained in the stream to the bundle; if the + collection already contains icons with the same width and height, they + are replaced by the new ones. + + @since 2.9.0 */ - void AddIcon(const wxString& file, wxBitmapType type); + void AddIcon(wxInputStream& stream, wxBitmapType type = wxBITMAP_TYPE_ANY); /** Adds the icon to the collection; if the collection already diff --git a/src/common/iconbndl.cpp b/src/common/iconbndl.cpp index ff0f827573..825a6431e6 100644 --- a/src/common/iconbndl.cpp +++ b/src/common/iconbndl.cpp @@ -23,6 +23,7 @@ #include "wx/intl.h" #include "wx/bitmap.h" #include "wx/image.h" + #include "wx/stream.h" #endif #include "wx/arrimpl.cpp" @@ -60,6 +61,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,44 +90,71 @@ void wxIconBundle::DeleteIcons() UnRef(); } -void wxIconBundle::AddIcon(const wxString& file, wxBitmapType type) +namespace { -#ifdef __WXMAC__ - // Deal with standard icons - if ( type == wxBITMAP_TYPE_ICON_RESOURCE ) - { - wxIcon tmp(file, type); - if (tmp.Ok()) - { - AddIcon(tmp); - return; - } - } -#endif // __WXMAC__ +// 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): +template +void DoAddIcon(wxIconBundle& bundle, + T& input, wxBitmapType type, + const wxString& errorMessage) +{ #if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB) wxImage image; - const size_t count = wxImage::GetImageCount( file, type ); + const size_t count = wxImage::GetImageCount(input, type); for ( size_t i = 0; i < count; ++i ) { - if ( !image.LoadFile( file, type, i ) ) + if ( !image.LoadFile(input, type, i) ) { - wxLogError( _("Failed to load image %d from file '%s'."), - i, file.c_str() ); + wxLogError(errorMessage, i); continue; } wxIcon tmp; tmp.CopyFromBitmap(wxBitmap(image)); - AddIcon(tmp); + bundle.AddIcon(tmp); } #else // !wxUSE_IMAGE - wxUnusedVar(file); + wxUnusedVar(input); wxUnusedVar(type); #endif // wxUSE_IMAGE/!wxUSE_IMAGE } +} // anonymous namespace + +void wxIconBundle::AddIcon(const wxString& file, wxBitmapType type) +{ +#ifdef __WXMAC__ + // Deal with standard icons + if ( type == wxBITMAP_TYPE_ICON_RESOURCE ) + { + wxIcon tmp(file, type); + if (tmp.Ok()) + { + AddIcon(tmp); + return; + } + } +#endif // __WXMAC__ + + DoAddIcon + ( + *this, + file, type, + wxString::Format(_("Failed to load image %%d from file '%s'."), file) + ); +} + +#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 { const size_t count = GetIconCount(); -- 2.45.2