claw::graphic::jpeg::reader Class Reference

This class read data from a jpeg file and store it in an image. More...

#include <jpeg.hpp>

List of all members.

Classes

class  grayscale_to_pixel32
 Functor converting a grey level pixel to a ARGB pixel. More...
class  RGB_to_pixel32
 Functor converting a RGB pixel to a ARGB pixel. More...
struct  source_manager
 Source manager that allow us to read from a std::istream. More...

Public Member Functions

 reader (image &img)
 Constructor.
 reader (image &img, std::istream &f)
 Constructor. Load an image from a jpeg file.
void load (std::istream &f)
 Load an image from a jpeg file.

Private Member Functions

template<class Convert >
void read_data (jpeg_decompress_struct &cinfo, const Convert &pixel_convert)
 Decompress a RGB jpeg image.
void read_from_file (std::istream &f)
 Load an image from a jpeg file.
void decompress (std::istream &f, jpeg_decompress_struct &cinfo)
 Decompress the data of a Jpeg file.
void create_decompress_info (jpeg_decompress_struct &cinfo, source_manager &infile) const
 Initialize the jpeg decompression structure.

Private Attributes

imagem_image
 The image in which we store the data we read.

Detailed Description

This class read data from a jpeg file and store it in an image.

Author:
Julien Jorge

Definition at line 79 of file jpeg.hpp.


Constructor & Destructor Documentation

claw::graphic::jpeg::reader::reader ( image img  ) 

Constructor.

Parameters:
img The image in which the data will be stored.

Definition at line 218 of file jpeg_reader.cpp.

00219   : m_image( img )
00220 {
00221 
00222 } // jpeg::reader::reader()

claw::graphic::jpeg::reader::reader ( image img,
std::istream &  f 
)

Constructor. Load an image from a jpeg file.

Parameters:
img The image in which the data will be stored.
f The file from which we read the data.
Postcondition:
img contains the data from f.

Definition at line 231 of file jpeg_reader.cpp.

References load().

00232   : m_image( img )
00233 {
00234   load(f);
00235 } // jpeg::reader::reader()


Member Function Documentation

void claw::graphic::jpeg::reader::create_decompress_info ( jpeg_decompress_struct &  cinfo,
source_manager infile 
) const [private]

Initialize the jpeg decompression structure.

Parameters:
cinfo The structure to initialize.
infile The source manager.

Definition at line 344 of file jpeg_reader.cpp.

References claw__graphic__jpeg__source_manager__fill_input_buffer(), claw__graphic__jpeg__source_manager__init_source(), claw__graphic__jpeg__source_manager__skip_input_data(), claw__graphic__jpeg__source_manager__term_source(), and claw::graphic::jpeg::reader::source_manager::pub.

Referenced by read_from_file().

00345 {
00346   jpeg_create_decompress(&cinfo);
00347 
00348   cinfo.src = &infile.pub;
00349   cinfo.client_data = &infile;
00350 
00351   infile.pub.fill_input_buffer =
00352     claw__graphic__jpeg__source_manager__fill_input_buffer;
00353   infile.pub.skip_input_data =
00354     claw__graphic__jpeg__source_manager__skip_input_data;
00355   infile.pub.init_source = claw__graphic__jpeg__source_manager__init_source;
00356   infile.pub.resync_to_restart = jpeg_resync_to_restart;
00357   infile.pub.term_source = claw__graphic__jpeg__source_manager__term_source;
00358 } // jpeg::reader::create_decompress_info()

void claw::graphic::jpeg::reader::decompress ( std::istream &  f,
jpeg_decompress_struct &  cinfo 
) [private]

Decompress the data of a Jpeg file.

Parameters:
f Jpeg file.
cinfo Info on the decompression process (libjpeg concerned).

Definition at line 298 of file jpeg_reader.cpp.

References CLAW_EXCEPTION, claw::graphic::jpeg::error_manager::error_string, claw::graphic::jpeg__error_manager__error_exit(), claw::graphic::jpeg::error_manager::pub, and claw::graphic::jpeg::error_manager::setjmp_buffer.

Referenced by read_from_file().

00299 {
00300   error_manager jerr;
00301   jpeg_error_mgr* jerr_saved = cinfo.err;
00302 
00303   cinfo.err = jpeg_std_error(&jerr.pub);
00304   jerr.pub.error_exit = jpeg__error_manager__error_exit;
00305 
00306   if ( setjmp(jerr.setjmp_buffer) )
00307     {
00308       jpeg_abort_decompress(&cinfo);
00309       throw CLAW_EXCEPTION(jerr.error_string);
00310     }
00311 
00312   jpeg_read_header(&cinfo, TRUE);
00313   jpeg_start_decompress( &cinfo );
00314 
00315   try
00316     {
00317       m_image.set_size( cinfo.image_width, cinfo.image_height );
00318 
00319       if ( cinfo.out_color_components == 3 )
00320         read_data( cinfo, RGB_to_pixel32() );
00321       else if ( cinfo.out_color_components == 1 )
00322         read_data( cinfo, grayscale_to_pixel32() );
00323       else
00324         throw CLAW_EXCEPTION( "invalid number of colors per channel" );
00325 
00326       jpeg_finish_decompress(&cinfo);
00327     }
00328   catch(...)
00329     {
00330       jpeg_abort_decompress(&cinfo);
00331       throw;
00332     }
00333 
00334   cinfo.err = jerr_saved;
00335 } // jpeg::reader::decompress()

void claw::graphic::jpeg::reader::load ( std::istream &  f  ) 

Load an image from a jpeg file.

Parameters:
f JPEG file.

Definition at line 242 of file jpeg_reader.cpp.

References CLAW_PRECOND, and read_from_file().

Referenced by reader().

00243 {
00244   CLAW_PRECOND( !!f );
00245 
00246   std::istream::pos_type init_pos = f.tellg();
00247 
00248   try
00249     {
00250       read_from_file(f);
00251     }
00252   catch(...)
00253     {
00254       f.clear();
00255       f.seekg( init_pos, std::ios_base::beg );
00256       throw;
00257     }
00258 } // jpeg::reader::load()

template<class Convert >
void claw::graphic::jpeg::reader::read_data ( jpeg_decompress_struct &  cinfo,
const Convert &  pixel_convert 
) [inline, private]

Decompress a RGB jpeg image.

Parameters:
cinfo Informations about the decompression process.
pixel_convert Operator to use to convert pixels from input.

Definition at line 42 of file jpeg_reader.tpp.

References CLAW_EXCEPTION, claw::graphic::jpeg::error_manager::error_string, claw::graphic::jpeg__error_manager__error_exit(), claw::graphic::jpeg::error_manager::pub, and claw::graphic::jpeg::error_manager::setjmp_buffer.

00043 {
00044   const unsigned int pixel_size = cinfo.output_components;
00045   JSAMPLE* buffer = new JSAMPLE[cinfo.output_width * pixel_size];
00046 
00047   error_manager jerr;
00048   jpeg_error_mgr* jerr_saved = cinfo.err;
00049 
00050   cinfo.err = jpeg_std_error(&jerr.pub);
00051   jerr.pub.error_exit = jpeg__error_manager__error_exit;
00052 
00053   if ( setjmp(jerr.setjmp_buffer) )
00054     {
00055       delete[] buffer;
00056       throw CLAW_EXCEPTION(jerr.error_string);
00057     }
00058 
00059   while (cinfo.output_scanline < cinfo.output_height)
00060     {
00061       jpeg_read_scanlines(&cinfo, &buffer, 1);
00062 
00063       scanline::iterator pixel = m_image[cinfo.output_scanline-1].begin();
00064 
00065       for ( unsigned int i=0; i!=pixel_size*m_image.width();
00066             i+=pixel_size, ++pixel )
00067         *pixel = pixel_convert( &buffer[i] );
00068     }
00069 
00070   delete[] buffer;
00071   cinfo.err = jerr_saved;
00072 } // jpeg::reader::read_data()

void claw::graphic::jpeg::reader::read_from_file ( std::istream &  f  )  [private]

Load an image from a jpeg file.

Parameters:
f Jpeg file.

Definition at line 265 of file jpeg_reader.cpp.

References CLAW_EXCEPTION, create_decompress_info(), decompress(), claw::graphic::jpeg::error_manager::error_string, claw::graphic::jpeg__error_manager__error_exit(), claw::graphic::jpeg::error_manager::pub, and claw::graphic::jpeg::error_manager::setjmp_buffer.

Referenced by load().

00266 {
00267   source_manager infile(f);
00268   jpeg_decompress_struct cinfo;
00269   error_manager jerr;
00270 
00271   cinfo.err = jpeg_std_error(&jerr.pub);
00272   
00273   if ( setjmp(jerr.setjmp_buffer) )
00274     throw CLAW_EXCEPTION(jerr.error_string);
00275 
00276   create_decompress_info( cinfo, infile );
00277   jerr.pub.error_exit = jpeg__error_manager__error_exit;
00278   
00279   try
00280     {
00281       decompress(f, cinfo);
00282       jpeg_destroy_decompress(&cinfo);
00283     }
00284   catch(...)
00285     {
00286       jpeg_destroy_decompress(&cinfo);
00287       throw;
00288     }
00289 } // jpeg::reader::read_from_file()


Member Data Documentation

The image in which we store the data we read.

Definition at line 158 of file jpeg.hpp.


The documentation for this class was generated from the following files:

Generated on 9 Nov 2009 for CLAW Library (a C++ Library Absolutely Wonderful) by  doxygen 1.6.1