X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad81651f00edc6f489d9b6a0839d316a964fd521..5fa150e233fa449ee270ac26ecf074f5c40acb1e:/src/common/imagpnm.cpp?ds=sidebyside diff --git a/src/common/imagpnm.cpp b/src/common/imagpnm.cpp index 3c34cbc822..4c1a6205c9 100644 --- a/src/common/imagpnm.cpp +++ b/src/common/imagpnm.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: imagpnm.cpp +// Name: src/common/imagpnm.cpp // Purpose: wxImage PNM handler // Author: Sylvain Bougnoux // RCS-ID: $Id$ @@ -7,27 +7,22 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -/* - We don't put pragma implement in this file because it is already present in - src/common/image.cpp -*/ - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif +#if wxUSE_IMAGE && wxUSE_PNM + +#include "wx/imagpnm.h" + #ifndef WX_PRECOMP -# include "wx/setup.h" + #include "wx/intl.h" + #include "wx/log.h" #endif -#if wxUSE_PNM - -#include "wx/image.h" -#include "wx/log.h" -#include "wx/intl.h" #include "wx/txtstrm.h" //----------------------------------------------------------------------------- @@ -40,12 +35,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxPNMHandler,wxImageHandler) void Skip_Comment(wxInputStream &stream) { - wxTextInputStream text_stream(stream); + wxTextInputStream text_stream(stream); - if (stream.Peek()==wxT('#')) + if (stream.Peek()==wxT('#')) { - text_stream.ReadLine(); - Skip_Comment(stream); + text_stream.ReadLine(); + Skip_Comment(stream); } } @@ -69,17 +64,13 @@ bool wxPNMHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose switch (c) { - case wxT('2'): - if (verbose) wxLogError(_("Loading Grey Ascii PNM image is not yet implemented.")); - return FALSE; - case wxT('5'): - if (verbose) wxLogError(_("Loading Grey Raw PNM image is not yet implemented.")); - return FALSE; - case wxT('3'): - case wxT('6'): break; + case wxT('2'): // ASCII Grey + case wxT('3'): // ASCII RGB + case wxT('5'): // RAW Grey + case wxT('6'): break; default: if (verbose) wxLogError(_("PNM: File format is not recognized.")); - return FALSE; + return false; } text_stream.ReadLine(); // for the \n @@ -95,11 +86,28 @@ bool wxPNMHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose { if (verbose) wxLogError( _("PNM: Couldn't allocate memory.") ); - return FALSE; + return false; } - if (c=='3') // Ascii RBG - { + + if (c=='2') // Ascii GREY + { + wxUint32 value, size=width*height; + for (wxUint32 i=0; i<size; ++i) + { + value=text_stream.Read32(); + *ptr++=(unsigned char)value; // R + *ptr++=(unsigned char)value; // G + *ptr++=(unsigned char)value; // B + if ( !buf_stream ) + { + if (verbose) wxLogError(_("PNM: File seems truncated.")); + return false; + } + } + } + if (c=='3') // Ascii RBG + { wxUint32 value, size=3*width*height; for (wxUint32 i=0; i<size; ++i) { @@ -108,19 +116,37 @@ bool wxPNMHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose value=text_stream.Read32(); *ptr++=(unsigned char)value; - if (buf_stream.LastError()!=wxSTREAM_NOERROR) + if ( !buf_stream ) { if (verbose) wxLogError(_("PNM: File seems truncated.")); - return FALSE; + return false; } } - } + } + if (c=='5') // Raw GREY + { + wxUint32 size=width*height; + unsigned char value; + for (wxUint32 i=0; i<size; ++i) + { + buf_stream.Read(&value,1); + *ptr++=value; // R + *ptr++=value; // G + *ptr++=value; // B + if ( !buf_stream ) + { + if (verbose) wxLogError(_("PNM: File seems truncated.")); + return false; + } + } + } if (c=='6') // Raw RGB buf_stream.Read( ptr, 3*width*height ); - image->SetMask( FALSE ); + image->SetMask( false ); - return (buf_stream.LastError()==wxStream_NOERROR || buf_stream.LastError()==wxStream_EOF); + const wxStreamError err = buf_stream.GetLastError(); + return err == wxSTREAM_NO_ERROR || err == wxSTREAM_EOF; } bool wxPNMHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool WXUNUSED(verbose) ) @@ -130,34 +156,32 @@ bool wxPNMHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool WXUNUS //text_stream << "P6" << endl //<< image->GetWidth() << " " << image->GetHeight() << endl //<< "255" << endl; - text_stream << "P6\n" << image->GetWidth() << " " << image->GetHeight() << "\n255\n"; + text_stream << wxT("P6\n") << image->GetWidth() << wxT(" ") << image->GetHeight() << wxT("\n255\n"); stream.Write(image->GetData(),3*image->GetWidth()*image->GetHeight()); - return (stream.LastError()==wxStream_NOERROR); + return stream.IsOk(); } bool wxPNMHandler::DoCanRead( wxInputStream& stream ) { - off_t pos = stream.TellI(); - Skip_Comment(stream); if ( stream.GetC() == 'P' ) { - switch (stream.GetC()) + switch ( stream.GetC() ) { - case '3': - case '6': - stream.SeekI(pos); - return TRUE; + case '2': // ASCII Grey + case '3': // ASCII RGB + case '5': // RAW Grey + case '6': // RAW RGB + return true; } } - stream.SeekI(pos); - return FALSE; + return false; } #endif // wxUSE_STREAMS -#endif // wxUSE_PNM +#endif // wxUSE_IMAGE && wxUSE_PNM