diff --git a/docs/changes.txt b/docs/changes.txt index 651413a6d6..b52b768f23 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -143,6 +143,7 @@ All (GUI): - Use platform-specific stock icons for wxEditableListBox buttons. - Add support for the events from multimedia keys (Jens Göpfert). - Improve wxAUI appearance in high contrast themes (Zane U. Ji). +- Allow suppressing warnings from wxImage::LoadFile(). wxGTK: diff --git a/include/wx/image.h b/include/wx/image.h index 0f95c001d2..c7e7a87e82 100644 --- a/include/wx/image.h +++ b/include/wx/image.h @@ -408,6 +408,22 @@ public: // colour given. bool ConvertColourToAlpha( unsigned char r, unsigned char g, unsigned char b ); + // Methods for controlling LoadFile() behaviour. Currently they allow to + // specify whether the function should log warnings if there are any + // problems with the image file not completely preventing it from being + // loaded. By default the warnings are logged, but this can be disabled + // either globally or for a particular image object. + enum + { + Load_Verbose = 1 + }; + + static void SetDefaultLoadFlags(int flags); + static int GetDefaultLoadFlags(); + + void SetLoadFlags(int flags); + int GetLoadFlags() const; + static bool CanRead( const wxString& name ); static int GetImageCount( const wxString& name, wxBitmapType type = wxBITMAP_TYPE_ANY ); virtual bool LoadFile( const wxString& name, wxBitmapType type = wxBITMAP_TYPE_ANY, int index = -1 ); diff --git a/interface/wx/image.h b/interface/wx/image.h index 475ee794d8..eb5fabb4da 100644 --- a/interface/wx/image.h +++ b/interface/wx/image.h @@ -1373,6 +1373,12 @@ public: /** Loads an image from an input stream. + If the file can't be loaded, this function returns false and logs an + error using wxLogError(). If the file can be loaded but some problems + were detected while doing it, it can also call wxLogWarning() to notify + about these problems. If this is undesirable, use SetLoadFlags() to + reset @c Load_Verbose flag and suppress these warnings. + @param stream Opened input stream from which to load the image. Currently, the stream must support seeking. @@ -1605,6 +1611,47 @@ public: void SetData(unsigned char* data, int new_width, int new_height, bool static_data = false); + /** + Sets the default value for the flags used for loading image files. + + This method changes the global value of the flags used for all the + subsequently created wxImage objects by default. It doesn't affect the + already existing objects. + + By default, the global flags include @c Load_Verbose flag value. + + @see LoadFile(), SetLoadFlags(), GetDefaultLoadFlags() + + @since 3.1.0 + */ + static void SetDefaultLoadFlags(int flags); + + /** + Sets the flags used for loading image files by this object. + + The flags will affect any future calls to LoadFile() for this object. + To change the flags for all image objects, call SetDefaultLoadFlags() + before creating any of them. + + Currently the only defined flag is @c Load_Verbose which determines if + the non-fatal (i.e. not preventing the file from being loaded + completely) problems should result in the calls to wxLogWarning() + function. It is recommended to customize handling of these warnings by + e.g. defining a custom log target (see @ref overview_log), but if such + warnings should be completely suppressed, clearing this flag provides a + simple way to do it, for example: + @code + wxImage image; + image.SetLoadFlags(image.GetLoadFlags() & ~wxImage::Load_Verbose); + image.LoadFile(...); + @endcode + + @see LoadFile(), SetLoadFlags(), GetLoadFlags() + + @since 3.1.0 + */ + void SetLoadFlags(int flags); + /** Specifies whether there is a mask or not. @@ -1852,6 +1899,15 @@ public: */ static bool CanRead(wxInputStream& stream); + /** + Returns the currently used default file load flags. + + See SetDefaultLoadFlags() for more information about these flags. + + @since 3.1.0 + */ + static int GetDefaultLoadFlags(); + //@{ /** If the image file contains more than one image and the image handler is @@ -1909,6 +1965,15 @@ public: */ static wxString GetImageExtWildcard(); + /** + Returns the file load flags used for this object. + + See SetLoadFlags() for more information about these flags. + + @since 3.1.0 + */ + int GetLoadFlags() const; + /** Converts a color in RGB color space to HSV color space. */ diff --git a/src/common/image.cpp b/src/common/image.cpp index 79a076338f..f28abb2e66 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -87,6 +87,10 @@ public: // same as m_static but for m_alpha bool m_staticAlpha; + // global and per-object flags determining LoadFile() behaviour + int m_loadFlags; + static int sm_defaultLoadFlags; + #if wxUSE_PALETTE wxPalette m_palette; #endif // wxUSE_PALETTE @@ -97,6 +101,9 @@ public: wxDECLARE_NO_COPY_CLASS(wxImageRefData); }; +// For compatibility, if nothing else, loading is verbose by default. +int wxImageRefData::sm_defaultLoadFlags = wxImage::Load_Verbose; + wxImageRefData::wxImageRefData() { m_width = 0; @@ -113,6 +120,8 @@ wxImageRefData::wxImageRefData() m_ok = false; m_static = m_staticAlpha = false; + + m_loadFlags = sm_defaultLoadFlags; } wxImageRefData::~wxImageRefData() @@ -2341,6 +2350,30 @@ bool wxImage::HasOption(const wxString& name) const // image I/O // ---------------------------------------------------------------------------- +/* static */ +void wxImage::SetDefaultLoadFlags(int flags) +{ + wxImageRefData::sm_defaultLoadFlags = flags; +} + +/* static */ +int wxImage::GetDefaultLoadFlags() +{ + return wxImageRefData::sm_defaultLoadFlags; +} + +void wxImage::SetLoadFlags(int flags) +{ + AllocExclusive(); + + M_IMGDATA->m_loadFlags = flags; +} + +int wxImage::GetLoadFlags() const +{ + return M_IMGDATA ? M_IMGDATA->m_loadFlags : wxImageRefData::sm_defaultLoadFlags; +} + // Under Windows we can load wxImage not only from files but also from // resources. #if defined(__WINDOWS__) && wxUSE_WXDIB && wxUSE_IMAGE @@ -2629,7 +2662,8 @@ bool wxImage::DoLoad(wxImageHandler& handler, wxInputStream& stream, int index) if ( stream.IsSeekable() ) posOld = stream.TellI(); - if ( !handler.LoadFile(this, stream, true/*verbose*/, index) ) + if ( !handler.LoadFile(this, stream, + (M_IMGDATA->m_loadFlags & Load_Verbose) != 0, index) ) { if ( posOld != wxInvalidOffset ) stream.SeekI(posOld);