Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef PNGPP_READER_HPP_INCLUDED
00032 #define PNGPP_READER_HPP_INCLUDED
00033
00034 #include <cassert>
00035 #include "io_base.hpp"
00036
00037 namespace png
00038 {
00039
00064 template< class istream >
00065 class reader
00066 : public io_base
00067 {
00068 public:
00073 explicit reader(istream& stream)
00074 : io_base(png_create_read_struct(PNG_LIBPNG_VER_STRING,
00075 static_cast< io_base* >(this),
00076 raise_error,
00077 0))
00078 {
00079 png_set_read_fn(m_png, & stream, read_data);
00080 }
00081
00082 ~reader()
00083 {
00084 png_destroy_read_struct(& m_png,
00085 m_info.get_png_info_ptr(),
00086 m_end_info.get_png_info_ptr());
00087 }
00088
00093 void read_png()
00094 {
00095 if (setjmp(png_jmpbuf(m_png)))
00096 {
00097 throw error(m_error);
00098 }
00099 png_read_png(m_png,
00100 m_info.get_png_info(),
00101 0,
00102 0);
00103 }
00104
00108 void read_info()
00109 {
00110 if (setjmp(png_jmpbuf(m_png)))
00111 {
00112 throw error(m_error);
00113 }
00114 m_info.read();
00115 }
00116
00120 void read_row(byte* bytes)
00121 {
00122 if (setjmp(png_jmpbuf(m_png)))
00123 {
00124 throw error(m_error);
00125 }
00126 png_read_row(m_png, bytes, 0);
00127 }
00128
00132 void read_end_info()
00133 {
00134 if (setjmp(png_jmpbuf(m_png)))
00135 {
00136 throw error(m_error);
00137 }
00138 m_end_info.read();
00139 }
00140
00141 void update_info()
00142 {
00143 m_info.update();
00144 }
00145
00146 private:
00147 static void read_data(png_struct* png, byte* data, size_t length)
00148 {
00149 io_base* io = static_cast< io_base* >(png_get_error_ptr(png));
00150 reader* rd = static_cast< reader* >(io);
00151 rd->reset_error();
00152 istream* stream = reinterpret_cast< istream* >(png_get_io_ptr(png));
00153 try
00154 {
00155 stream->read(reinterpret_cast< char* >(data), length);
00156 if (!stream->good())
00157 {
00158 rd->set_error("istream::read() failed");
00159 }
00160 }
00161 catch (std::exception const& error)
00162 {
00163 rd->set_error(error.what());
00164 }
00165 catch (...)
00166 {
00167 assert(!"read_data: caught something wrong");
00168 rd->set_error("read_data: caught something wrong");
00169 }
00170 if (rd->is_error())
00171 {
00172 rd->raise_error();
00173 }
00174 }
00175 };
00176
00177 }
00178
00179 #endif // PNGPP_READER_HPP_INCLUDED