X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/36abe9d421ebb33873f012a63fbdb210ff771682..3b241537efde9ed3b5b6c1fb0756f00517e0bbd9:/src/common/image.cpp diff --git a/src/common/image.cpp b/src/common/image.cpp index 07ae7ac0ac..cbe275bc19 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -53,7 +53,14 @@ IMPLEMENT_VARIANT_OBJECT_EXPORTED_SHALLOWCMP(wxImage,WXDLLEXPORT) #endif //----------------------------------------------------------------------------- -// wxImage +// global data +//----------------------------------------------------------------------------- + +wxList wxImage::sm_handlers; +wxImage wxNullImage; + +//----------------------------------------------------------------------------- +// wxImageRefData //----------------------------------------------------------------------------- class wxImageRefData: public wxObjectRefData @@ -88,7 +95,7 @@ public: wxArrayString m_optionNames; wxArrayString m_optionValues; - DECLARE_NO_COPY_CLASS(wxImageRefData) + wxDECLARE_NO_COPY_CLASS(wxImageRefData); }; wxImageRefData::wxImageRefData() @@ -117,58 +124,15 @@ wxImageRefData::~wxImageRefData() free( m_alpha ); } -wxList wxImage::sm_handlers; - -wxImage wxNullImage; +//----------------------------------------------------------------------------- +// wxImage //----------------------------------------------------------------------------- #define M_IMGDATA static_cast(m_refData) IMPLEMENT_DYNAMIC_CLASS(wxImage, wxObject) -wxImage::wxImage( int width, int height, bool clear ) -{ - Create( width, height, clear ); -} - -wxImage::wxImage( int width, int height, unsigned char* data, bool static_data ) -{ - Create( width, height, data, static_data ); -} - -wxImage::wxImage( int width, int height, unsigned char* data, unsigned char* alpha, bool static_data ) -{ - Create( width, height, data, alpha, static_data ); -} - -wxImage::wxImage( const wxString& name, wxBitmapType type, int index ) -{ - LoadFile( name, type, index ); -} - -wxImage::wxImage( const wxString& name, const wxString& mimetype, int index ) -{ - LoadFile( name, mimetype, index ); -} - -#if wxUSE_STREAMS -wxImage::wxImage( wxInputStream& stream, wxBitmapType type, int index ) -{ - LoadFile( stream, type, index ); -} - -wxImage::wxImage( wxInputStream& stream, const wxString& mimetype, int index ) -{ - LoadFile( stream, mimetype, index ); -} -#endif // wxUSE_STREAMS - -wxImage::wxImage(const char* const* xpmData) -{ - Create(xpmData); -} - bool wxImage::Create(const char* const* xpmData) { #if wxUSE_XPM @@ -195,13 +159,15 @@ bool wxImage::Create( int width, int height, bool clear ) return false; } - if (clear) - memset(M_IMGDATA->m_data, 0, width*height*3); - M_IMGDATA->m_width = width; M_IMGDATA->m_height = height; M_IMGDATA->m_ok = true; + if (clear) + { + Clear(); + } + return true; } @@ -236,6 +202,7 @@ bool wxImage::Create( int width, int height, unsigned char* data, unsigned char* M_IMGDATA->m_height = height; M_IMGDATA->m_ok = true; M_IMGDATA->m_static = static_data; + M_IMGDATA->m_staticAlpha = static_data; return true; } @@ -245,6 +212,11 @@ void wxImage::Destroy() UnRef(); } +void wxImage::Clear(unsigned char value) +{ + memset(M_IMGDATA->m_data, value, M_IMGDATA->m_width*M_IMGDATA->m_height*3); +} + wxObjectRefData* wxImage::CreateRefData() const { return new wxImageRefData; @@ -1897,16 +1869,28 @@ bool wxImage::SetMaskFromImage(const wxImage& mask, bool wxImage::ConvertAlphaToMask(unsigned char threshold) { - if (!HasAlpha()) + if ( !HasAlpha() ) return true; unsigned char mr, mg, mb; - if (!FindFirstUnusedColour(&mr, &mg, &mb)) + if ( !FindFirstUnusedColour(&mr, &mg, &mb) ) { wxLogError( _("No unused colour in image being masked.") ); return false; } + ConvertAlphaToMask(mr, mg, mb, threshold); + return true; +} + +void wxImage::ConvertAlphaToMask(unsigned char mr, + unsigned char mg, + unsigned char mb, + unsigned char threshold) +{ + if ( !HasAlpha() ) + return; + AllocExclusive(); SetMask(true); @@ -1931,13 +1915,11 @@ bool wxImage::ConvertAlphaToMask(unsigned char threshold) } } - if( !M_IMGDATA->m_staticAlpha ) + if ( !M_IMGDATA->m_staticAlpha ) free(M_IMGDATA->m_alpha); M_IMGDATA->m_alpha = NULL; M_IMGDATA->m_staticAlpha = false; - - return true; } // ---------------------------------------------------------------------------- @@ -2420,10 +2402,12 @@ wxImageHandler *wxImage::FindHandler( const wxString& extension, wxBitmapType bi while (node) { wxImageHandler *handler = (wxImageHandler*)node->GetData(); - if ( (handler->GetExtension().Cmp(extension) == 0) && - ( (bitmapType == wxBITMAP_TYPE_ANY) || (handler->GetType() == bitmapType)) ) + if ((bitmapType == wxBITMAP_TYPE_ANY) || (handler->GetType() == bitmapType)) { - return handler; + if (handler->GetExtension() == extension) + return handler; + if (handler->GetAltExtensions().Index(extension, false) != wxNOT_FOUND) + return handler; } node = node->GetNext(); } @@ -2485,6 +2469,8 @@ wxString wxImage::GetImageExtWildcard() { wxImageHandler* Handler = (wxImageHandler*)Node->GetData(); fmts += wxT("*.") + Handler->GetExtension(); + for (size_t i = 0; i < Handler->GetAltExtensions().size(); i++) + fmts += wxT(";*.") + Handler->GetAltExtensions()[i]; Node = Node->GetNext(); if ( Node ) fmts += wxT(";"); }