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

#include <jpeg.hpp>

List of all members.


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.

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.

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...


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 
) [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

image& claw::graphic::jpeg::reader::m_image [private]

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 Mon Nov 9 05:07:35 2009 for CLAW Library (a C++ Library Absolutely Wonderful) by  doxygen 1.4.7