]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/common/imagpnm.cpp
1. corrected (but the fix is ugly) the multiple def button problem
[wxWidgets.git] / src / common / imagpnm.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: imagpnm.cpp
3// Purpose: wxImage PNM handler
4// Author: Sylvain Bougnoux
5// RCS-ID: $Id$
6// Copyright: (c) Sylvain Bougnoux
7// Licence: wxWindows licence
8/////////////////////////////////////////////////////////////////////////////
9
10/*
11 We don't put pragma implement in this file because it is already present in
12 src/common/image.cpp
13*/
14
15// For compilers that support precompilation, includes "wx.h".
16#include "wx/wxprec.h"
17
18#ifdef __BORLANDC__
19#pragma hdrstop
20#endif
21
22#ifndef WX_PRECOMP
23# include "wx/setup.h"
24#endif
25
26#if wxUSE_PNM
27
28#include "wx/image.h"
29#include "wx/log.h"
30#include "wx/txtstrm.h"
31
32//-----------------------------------------------------------------------------
33// wxBMPHandler
34//-----------------------------------------------------------------------------
35
36#if !USE_SHARED_LIBRARIES
37IMPLEMENT_DYNAMIC_CLASS(wxPNMHandler,wxImageHandler)
38#endif
39
40#if wxUSE_STREAMS
41
42void Skip_Comment(wxInputStream &stream)
43{
44 wxString line;
45 wxTextInputStream text_stream(stream);
46
47 if (stream.Peek()==wxT('#'))
48 {
49 text_stream >> line;
50 Skip_Comment(stream);
51 }
52}
53
54bool wxPNMHandler::LoadFile( wxImage *image, wxInputStream& stream, bool WXUNUSED(verbose) )
55{
56 wxUint32 width, height;
57 wxUint16 maxval;
58 wxString line;
59 char c(0);
60
61 image->Destroy();
62
63 /*
64 * Read the PNM header
65 */
66
67 wxBufferedInputStream buf_stream(stream);
68 wxTextInputStream text_stream(buf_stream);
69
70 Skip_Comment(buf_stream);
71 if (buf_stream.GetC()==wxT('P')) c=buf_stream.GetC();
72
73 switch (c)
74 {
75 case wxT('2'):
76 wxLogError(wxT("Loading Grey Ascii PNM image is not yet implemented."));
77 return FALSE;
78 case wxT('5'):
79 wxLogError(wxT("Loading Grey Raw PNM image is not yet implemented."));
80 return FALSE;
81 case wxT('3'): case wxT('6'): break;
82 default :
83 wxLogError(wxT("Loading PNM image : file not recognized."));
84 return FALSE;
85 }
86
87 text_stream >> line; // for the \n
88 Skip_Comment(buf_stream);
89 text_stream >> width >> height ;
90 Skip_Comment(buf_stream);
91 text_stream >> maxval;
92
93 //cout << line << " " << width << " " << height << " " << maxval << endl;
94 image->Create( width, height );
95 unsigned char *ptr = image->GetData();
96 if (!ptr)
97 {
98 wxLogError( wxT("Cannot allocate RAM for RGB data in PNM file.") );
99 return FALSE;
100 }
101
102 if (c=='3') // Ascii RBG
103 {
104 wxUint32 value, size=3*width*height;
105 for (wxUint32 i=0; i<size; ++i)
106 {
107 //this is very slow !!!
108 //I wonder how we can make any better ?
109 value=text_stream.Read32();
110 *ptr++=(unsigned char)value;
111
112 if (buf_stream.LastError()!=wxSTREAM_NOERROR)
113 {
114 wxLogError(wxT("Loading PNM image : file seems truncated."));
115 return FALSE;
116 }
117 }
118 }
119 if (c=='6') // Raw RGB
120 buf_stream.Read( ptr, 3*width*height );
121
122 image->SetMask( FALSE );
123
124 return (buf_stream.LastError()==wxStream_NOERROR || buf_stream.LastError()==wxStream_EOF);
125}
126
127bool wxPNMHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool WXUNUSED(verbose) )
128{
129 wxTextOutputStream text_stream(stream);
130
131 //text_stream << "P6" << endl
132 //<< image->GetWidth() << " " << image->GetHeight() << endl
133 //<< "255" << endl;
134 text_stream << "P6\n" << image->GetWidth() << " " << image->GetHeight() << "\n255\n";
135 stream.Write(image->GetData(),3*image->GetWidth()*image->GetHeight());
136
137 return (stream.LastError()==wxStream_NOERROR);
138}
139
140bool wxPNMHandler::DoCanRead( wxInputStream& stream )
141{
142 off_t pos = stream.TellI();
143
144 Skip_Comment(stream);
145
146 if ( stream.GetC() == 'P' )
147 {
148 switch (stream.GetC())
149 {
150 case '3':
151 case '6':
152 stream.SeekI(pos);
153 return TRUE;
154 }
155 }
156
157 stream.SeekI(pos);
158 return FALSE;
159}
160
161
162#endif // wxUSE_STREAMS
163
164#endif // wxUSE_PNM