]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/imagpnm.cpp
Several changes and updates
[wxWidgets.git] / src / common / imagpnm.cpp
index d2b3244965c604172535172409f8ddd54dd91ca6..28bf08eba303e2b2d3cc18d26f7631a6cd4b7273 100644 (file)
 #pragma hdrstop
 #endif
 
+#ifndef WX_PRECOMP
+#  include "wx/setup.h"
+#endif
+
+#if wxUSE_PNM
+
 #include "wx/image.h"
 #include "wx/log.h"
 #include "wx/txtstrm.h"
 
-#ifdef __WXMSW__
-#include <windows.h>
-#endif
-
 //-----------------------------------------------------------------------------
 // wxBMPHandler
 //-----------------------------------------------------------------------------
@@ -37,8 +39,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxPNMHandler,wxImageHandler)
 
 #if wxUSE_STREAMS
 
-  //#include <stream.h> // for cout
-
 void Skip_Comment(wxInputStream &stream)
 {
   wxString line;
@@ -64,10 +64,11 @@ bool wxPNMHandler::LoadFile( wxImage *image, wxInputStream& stream, bool WXUNUSE
      * Read the PNM header
      */
 
-    wxTextInputStream text_stream(stream);
+    wxBufferedInputStream buf_stream(stream);
+    wxTextInputStream text_stream(buf_stream);
 
-    Skip_Comment(stream);
-    if (stream.GetC()==_T('P')) c=stream.GetC();
+    Skip_Comment(buf_stream);
+    if (buf_stream.GetC()==_T('P')) c=buf_stream.GetC();
 
     switch (c)
       {
@@ -84,12 +85,12 @@ bool wxPNMHandler::LoadFile( wxImage *image, wxInputStream& stream, bool WXUNUSE
       }
 
     text_stream >> line; // for the \n
-    Skip_Comment(stream);
+    Skip_Comment(buf_stream);
     text_stream >> width >> height ;
-    Skip_Comment(stream); 
+    Skip_Comment(buf_stream); 
     text_stream >> maxval;
 
-    //cout << width << " " << height << " " << maxval << endl;
+    //cout << line << " " << width << " " << height << " " << maxval << endl;
     image->Create( width, height );
     unsigned char *ptr = image->GetData();
     if (!ptr)
@@ -98,7 +99,7 @@ bool wxPNMHandler::LoadFile( wxImage *image, wxInputStream& stream, bool WXUNUSE
        return FALSE;
     }
 
-    if (c=='3') // Ascii RBG
+   if (c=='3') // Ascii RBG
       { 
        wxUint32 value, size=3*width*height;
        for (wxUint32 i=0; i<size; ++i)
@@ -108,7 +109,7 @@ bool wxPNMHandler::LoadFile( wxImage *image, wxInputStream& stream, bool WXUNUSE
            value=text_stream.Read32();
            *ptr++=(unsigned char)value;
 
-           if (stream.LastError()!=wxSTREAM_NOERROR)
+           if (buf_stream.LastError()!=wxSTREAM_NOERROR)
              {
                wxLogError(_T("Loading PNM image : file seems truncated."));
                return FALSE;
@@ -116,11 +117,11 @@ bool wxPNMHandler::LoadFile( wxImage *image, wxInputStream& stream, bool WXUNUSE
          }
       }
     if (c=='6') // Raw RGB
-      stream.Read( ptr, 3*width*height );
+      buf_stream.Read( ptr, 3*width*height );
 
     image->SetMask( FALSE );
 
-    return (stream.LastError()==wxStream_NOERROR || stream.LastError()==wxStream_EOF);
+    return (buf_stream.LastError()==wxStream_NOERROR || buf_stream.LastError()==wxStream_EOF);
 }
 
 bool wxPNMHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool WXUNUSED(verbose) )
@@ -138,10 +139,23 @@ bool wxPNMHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool WXUNUS
 
 bool wxPNMHandler::CanRead( wxInputStream& stream )
 {
-    return FALSE; // VS - temporary - FIXME
+    off_t pos=stream.TellI();
+
+    Skip_Comment(stream);
+
+    if (stream.GetC()==_T('P'))
+      switch (stream.GetC())
+       {
+       case _T('3'): case _T('6'):
+         stream.SeekI(pos);
+         return TRUE;
+       }
+
+    stream.SeekI(pos);
+    return FALSE;
 }
 
 
 #endif // wxUSE_STREAMS
 
-
+#endif // wxUSE_PNM