X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e98e625cbbe269f109b2296a045a657cba00fede..916eabe60eee4adb05387bbf1eaf1915ae5eac18:/src/common/image.cpp diff --git a/src/common/image.cpp b/src/common/image.cpp index b29070e431..be9b0d59f2 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -64,6 +64,7 @@ public: int m_width; int m_height; + wxBitmapType m_type; unsigned char *m_data; bool m_hasMask; @@ -94,6 +95,7 @@ wxImageRefData::wxImageRefData() { m_width = 0; m_height = 0; + m_type = wxBITMAP_TYPE_INVALID; m_data = m_alpha = (unsigned char *) NULL; @@ -1268,7 +1270,6 @@ void wxImage::Paste( const wxImage &image, int x, int y ) (GetMaskGreen()==image.GetMaskGreen()) && (GetMaskBlue()==image.GetMaskBlue())))) { - width *= 3; unsigned char* source_data = image.GetData() + xx*3 + yy*3*image.GetWidth(); int source_step = image.GetWidth()*3; @@ -1276,11 +1277,10 @@ void wxImage::Paste( const wxImage &image, int x, int y ) int target_step = M_IMGDATA->m_width*3; for (int j = 0; j < height; j++) { - memcpy( target_data, source_data, width ); + memcpy( target_data, source_data, width*3 ); source_data += source_step; target_data += target_step; } - return; } // Copy over the alpha channel from the original image @@ -1309,7 +1309,6 @@ void wxImage::Paste( const wxImage &image, int x, int y ) unsigned char g = image.GetMaskGreen(); unsigned char b = image.GetMaskBlue(); - width *= 3; unsigned char* source_data = image.GetData() + xx*3 + yy*3*image.GetWidth(); int source_step = image.GetWidth()*3; @@ -1318,7 +1317,7 @@ void wxImage::Paste( const wxImage &image, int x, int y ) for (int j = 0; j < height; j++) { - for (int i = 0; i < width; i+=3) + for (int i = 0; i < width*3; i+=3) { if ((source_data[i] != r) || (source_data[i+1] != g) || @@ -1459,6 +1458,23 @@ int wxImage::GetHeight() const return M_IMGDATA->m_height; } +wxBitmapType wxImage::GetType() const +{ + wxCHECK_MSG( IsOk(), wxBITMAP_TYPE_INVALID, wxT("invalid image") ); + + return M_IMGDATA->m_type; +} + +void wxImage::SetType(wxBitmapType type) +{ + wxCHECK_RET( IsOk(), "must create the image before setting its type"); + + // type can be wxBITMAP_TYPE_INVALID to reset the image type to default + wxASSERT_MSG( type != wxBITMAP_TYPE_MAX, "invalid bitmap type" ); + + M_IMGDATA->m_type = type; +} + long wxImage::XYToIndex(int x, int y) const { if ( Ok() && @@ -2196,6 +2212,15 @@ int wxImage::GetImageCount( wxInputStream &stream, wxBitmapType type ) } } +bool wxImage::DoLoad(wxImageHandler& handler, wxInputStream& stream, int index) +{ + if ( !handler.LoadFile(this, stream, true/*verbose*/, index) ) + return false; + + M_IMGDATA->m_type = handler.GetType(); + return true; +} + bool wxImage::LoadFile( wxInputStream& stream, wxBitmapType type, int index ) { UnRef(); @@ -2212,12 +2237,8 @@ bool wxImage::LoadFile( wxInputStream& stream, wxBitmapType type, int index ) node = node->GetNext() ) { handler = (wxImageHandler*)node->GetData(); - if ( handler->CanRead(stream) && - handler->LoadFile(this, stream, true/*verbose*/, index) ) - { + if ( handler->CanRead(stream) && DoLoad(*handler, stream, index) ) return true; - } - } wxLogWarning( _("No handler found for image type.") ); @@ -2239,7 +2260,7 @@ bool wxImage::LoadFile( wxInputStream& stream, wxBitmapType type, int index ) return false; } - return handler->LoadFile(this, stream, true/*verbose*/, index); + return DoLoad(*handler, stream, index); } bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype, int index ) @@ -2262,7 +2283,17 @@ bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype, int ind return false; } - return handler->LoadFile( this, stream, true/*verbose*/, index ); + return DoLoad(*handler, stream, index); +} + +bool wxImage::DoSave(wxImageHandler& handler, wxOutputStream& stream) const +{ + wxImage * const self = wx_const_cast(wxImage *, this); + if ( !handler.SaveFile(self, stream) ) + return false; + + M_IMGDATA->m_type = handler.GetType(); + return true; } bool wxImage::SaveFile( wxOutputStream& stream, wxBitmapType type ) const @@ -2276,7 +2307,7 @@ bool wxImage::SaveFile( wxOutputStream& stream, wxBitmapType type ) const return false; } - return handler->SaveFile( (wxImage*)this, stream ); + return DoSave(*handler, stream); } bool wxImage::SaveFile( wxOutputStream& stream, const wxString& mimetype ) const @@ -2289,7 +2320,7 @@ bool wxImage::SaveFile( wxOutputStream& stream, const wxString& mimetype ) const wxLogWarning( _("No image handler for type %s defined."), mimetype.GetData() ); } - return handler->SaveFile( (wxImage*)this, stream ); + return DoSave(*handler, stream); } #endif // wxUSE_STREAMS