]>
git.saurik.com Git - wxWidgets.git/blob - src/common/imagpnm.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/common/imagpnm.cpp
3 // Purpose: wxImage PNM handler
4 // Author: Sylvain Bougnoux
6 // Copyright: (c) Sylvain Bougnoux
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
10 // For compilers that support precompilation, includes "wx.h".
11 #include "wx/wxprec.h"
17 #if wxUSE_IMAGE && wxUSE_PNM
19 #include "wx/imagpnm.h"
26 #include "wx/txtstrm.h"
28 //-----------------------------------------------------------------------------
30 //-----------------------------------------------------------------------------
32 IMPLEMENT_DYNAMIC_CLASS(wxPNMHandler
,wxImageHandler
)
36 void Skip_Comment(wxInputStream
&stream
)
38 wxTextInputStream
text_stream(stream
);
40 if (stream
.Peek()==wxT('#'))
42 text_stream
.ReadLine();
47 bool wxPNMHandler::LoadFile( wxImage
*image
, wxInputStream
& stream
, bool verbose
, int WXUNUSED(index
) )
49 wxUint32 width
, height
;
59 wxBufferedInputStream
buf_stream(stream
);
60 wxTextInputStream
text_stream(buf_stream
);
62 Skip_Comment(buf_stream
);
63 if (buf_stream
.GetC()==wxT('P')) c
=buf_stream
.GetC();
67 case wxT('2'): // ASCII Grey
68 case wxT('3'): // ASCII RGB
69 case wxT('5'): // RAW Grey
74 wxLogError(_("PNM: File format is not recognized."));
79 text_stream
.ReadLine(); // for the \n
80 Skip_Comment(buf_stream
);
81 text_stream
>> width
>> height
;
82 Skip_Comment(buf_stream
);
83 text_stream
>> maxval
;
85 //cout << line << " " << width << " " << height << " " << maxval << endl;
86 image
->Create( width
, height
);
87 unsigned char *ptr
= image
->GetData();
92 wxLogError( _("PNM: Couldn't allocate memory.") );
98 if (c
=='2') // Ascii GREY
100 wxUint32 value
, size
=width
*height
;
101 for (wxUint32 i
=0; i
<size
; ++i
)
103 value
=text_stream
.Read32();
105 value
= (255 * value
)/maxval
;
106 *ptr
++=(unsigned char)value
; // R
107 *ptr
++=(unsigned char)value
; // G
108 *ptr
++=(unsigned char)value
; // B
113 wxLogError(_("PNM: File seems truncated."));
119 if (c
=='3') // Ascii RBG
121 wxUint32 value
, size
=3*width
*height
;
122 for (wxUint32 i
=0; i
<size
; ++i
)
124 //this is very slow !!!
125 //I wonder how we can make any better ?
126 value
=text_stream
.Read32();
128 value
= (255 * value
)/maxval
;
129 *ptr
++=(unsigned char)value
;
135 wxLogError(_("PNM: File seems truncated."));
141 if (c
=='5') // Raw GREY
143 wxUint32 size
=width
*height
;
145 for (wxUint32 i
=0; i
<size
; ++i
)
147 buf_stream
.Read(&value
,1);
149 value
= (255 * value
)/maxval
;
157 wxLogError(_("PNM: File seems truncated."));
164 if ( c
=='6' ) // Raw RGB
166 buf_stream
.Read(ptr
, 3*width
*height
);
169 for ( unsigned i
= 0; i
< 3*width
*height
; i
++ )
170 ptr
[i
] = (255 * ptr
[i
])/maxval
;
174 image
->SetMask( false );
176 const wxStreamError err
= buf_stream
.GetLastError();
177 return err
== wxSTREAM_NO_ERROR
|| err
== wxSTREAM_EOF
;
180 bool wxPNMHandler::SaveFile( wxImage
*image
, wxOutputStream
& stream
, bool WXUNUSED(verbose
) )
182 wxTextOutputStream
text_stream(stream
);
184 //text_stream << "P6" << endl
185 //<< image->GetWidth() << " " << image->GetHeight() << endl
187 text_stream
<< wxT("P6\n") << image
->GetWidth() << wxT(" ") << image
->GetHeight() << wxT("\n255\n");
188 stream
.Write(image
->GetData(),3*image
->GetWidth()*image
->GetHeight());
190 return stream
.IsOk();
193 bool wxPNMHandler::DoCanRead( wxInputStream
& stream
)
195 Skip_Comment(stream
);
197 // it's ok to modify the stream position here
198 if ( stream
.GetC() == 'P' )
200 switch ( stream
.GetC() )
202 case '2': // ASCII Grey
203 case '3': // ASCII RGB
204 case '5': // RAW Grey
214 #endif // wxUSE_STREAMS
216 #endif // wxUSE_IMAGE && wxUSE_PNM