/////////////////////////////////////////////////////////////////////////////
-// Name: imagpnm.cpp
+// Name: src/common/imagpnm.cpp
// Purpose: wxImage PNM handler
// Author: Sylvain Bougnoux
// RCS-ID: $Id$
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "imagpnm.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
-#endif
-
-#ifndef WX_PRECOMP
-# include "wx/setup.h"
+ #pragma hdrstop
#endif
#if wxUSE_IMAGE && wxUSE_PNM
#include "wx/imagpnm.h"
-#include "wx/log.h"
-#include "wx/intl.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/intl.h"
+ #include "wx/log.h"
+#endif
+
#include "wx/txtstrm.h"
//-----------------------------------------------------------------------------
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;
+ if (verbose)
+ {
+ wxLogError(_("PNM: File format is not recognized."));
+ }
+ return false;
}
text_stream.ReadLine(); // for the \n
if (!ptr)
{
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();
+ if ( maxval != 255 )
+ value = (255 * value)/maxval;
+ *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)
{
//this is very slow !!!
//I wonder how we can make any better ?
value=text_stream.Read32();
+ if ( maxval != 255 )
+ value = (255 * value)/maxval;
*ptr++=(unsigned char)value;
if ( !buf_stream )
{
- if (verbose) wxLogError(_("PNM: File seems truncated."));
- return FALSE;
+ if (verbose)
+ {
+ wxLogError(_("PNM: File seems truncated."));
+ }
+ return false;
}
}
- }
- if (c=='6') // Raw RGB
- buf_stream.Read( ptr, 3*width*height );
+ }
+ if (c=='5') // Raw GREY
+ {
+ wxUint32 size=width*height;
+ unsigned char value;
+ for (wxUint32 i=0; i<size; ++i)
+ {
+ buf_stream.Read(&value,1);
+ if ( maxval != 255 )
+ value = (255 * value)/maxval;
+ *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);
+ if ( maxval != 255 )
+ {
+ for ( unsigned i = 0; i < 3*width*height; i++ )
+ ptr[i] = (255 * ptr[i])/maxval;
+ }
+ }
- image->SetMask( FALSE );
+ image->SetMask( false );
const wxStreamError err = buf_stream.GetLastError();
return err == wxSTREAM_NO_ERROR || err == wxSTREAM_EOF;
{
Skip_Comment(stream);
+ // it's ok to modify the stream position here
if ( stream.GetC() == 'P' )
{
- switch (stream.GetC())
+ switch ( stream.GetC() )
{
- case '3':
- case '6':
- return TRUE;
+ case '2': // ASCII Grey
+ case '3': // ASCII RGB
+ case '5': // RAW Grey
+ case '6': // RAW RGB
+ return true;
}
}
- return FALSE;
+ return false;
}
#endif // wxUSE_STREAMS
-#endif // wxUSE_PNM
+#endif // wxUSE_IMAGE && wxUSE_PNM