]> git.saurik.com Git - wxWidgets.git/commitdiff
Added PNM image handler
authorSylvain Bougnoux <bougnoux@imra-europe.com>
Wed, 18 Aug 1999 17:31:34 +0000 (17:31 +0000)
committerSylvain Bougnoux <bougnoux@imra-europe.com>
Wed, 18 Aug 1999 17:31:34 +0000 (17:31 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3417 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/imagpnm.cpp [new file with mode: 0644]

diff --git a/src/common/imagpnm.cpp b/src/common/imagpnm.cpp
new file mode 100644 (file)
index 0000000..ffbd4c1
--- /dev/null
@@ -0,0 +1,141 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        imagpnm.cpp
+// Purpose:     wxImage PNM handler
+// Author:      Sylvain Bougnoux
+// RCS-ID:      $Id$
+// Copyright:   (c) Sylvain Bougnoux
+// 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
+#endif
+
+#include "wx/image.h"
+#include "wx/log.h"
+#include "wx/txtstrm.h"
+
+#ifdef __WXMSW__
+#include <windows.h>
+#endif
+
+//-----------------------------------------------------------------------------
+// wxBMPHandler
+//-----------------------------------------------------------------------------
+
+#if !USE_SHARED_LIBRARIES
+IMPLEMENT_DYNAMIC_CLASS(wxPNMHandler,wxImageHandler)
+#endif
+
+#if wxUSE_STREAMS
+
+  //#include <stream.h> // for cout
+
+void Skip_Comment(wxInputStream &stream)
+{
+  wxString line;
+  wxTextInputStream text_stream(stream);
+
+  if (stream.Peek()==_T('#')) 
+    {
+      text_stream >> line;
+      Skip_Comment(stream);
+    }
+}
+
+bool wxPNMHandler::LoadFile( wxImage *image, wxInputStream& stream, bool WXUNUSED(verbose) )
+{
+    wxUint32  width, height;
+    wxUint16  maxval;
+    wxString  line;
+    char      c(0);
+    
+    image->Destroy();
+
+    /*
+     * Read the PNM header
+     */
+
+    wxTextInputStream text_stream(stream);
+
+    Skip_Comment(stream);
+    if (stream.GetC()==_T('P')) c=stream.GetC();
+
+    switch (c)
+      {
+      case _T('2'):
+       wxLogError(_T("Loading Grey Ascii PNM image is not yet implemented."));
+       return FALSE;
+      case _T('5'):
+       wxLogError(_T("Loading Grey Raw PNM image is not yet implemented."));
+       return FALSE;
+      case _T('3'): case _T('6'): break;
+       default :
+       wxLogError(_T("Loading PNM image : file not recognized."));
+       return FALSE;
+      }
+
+    text_stream >> line; // for the \n
+    Skip_Comment(stream);
+    text_stream >> width >> height ;
+    Skip_Comment(stream); 
+    text_stream >> maxval;
+
+    //cout << width << " " << height << " " << maxval << endl;
+    image->Create( width, height );
+    unsigned char *ptr = image->GetData();
+    if (!ptr)
+    {
+        wxLogError( _T("Cannot allocate RAM for RGB data in PNM file.") );
+       return FALSE;
+    }
+
+    if (c=='3') // Ascii RBG
+      { 
+       wxUint32 value, size=3*width*height;
+       for (wxUint32 i=0; i<size; ++i)
+         {
+           //this is very slow !!!
+           //I wonder how we can make any better ?
+           value=text_stream.Read32();
+           *ptr++=(unsigned char)value;
+
+           if (stream.LastError()!=wxSTREAM_NOERROR)
+             {
+               wxLogError(_T("Loading PNM image : file seems truncated."));
+               return FALSE;
+             }
+         }
+      }
+    if (c=='6') // Raw RGB
+      stream.Read( ptr, 3*width*height );
+
+    image->SetMask( FALSE );
+
+    return (stream.LastError()==wxStream_NOERROR || stream.LastError()==wxStream_EOF);
+}
+
+bool wxPNMHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool WXUNUSED(verbose) )
+{
+    wxTextOutputStream text_stream(stream);
+    
+    //text_stream << "P6" << endl 
+    //<< image->GetWidth() << " " << image->GetHeight() << endl 
+    //<< "255" << endl;
+    text_stream << "P6\n" << image->GetWidth() << " " << image->GetHeight() << "\n255\n";
+    stream.Write(image->GetData(),3*image->GetWidth()*image->GetHeight());
+
+    return (stream.LastError()==wxStream_NOERROR);
+}
+
+#endif // wxUSE_STREAMS
+
+