Classes | Public Member Functions | Private Member Functions | Private Attributes

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.

  : m_image( img )
{

} // 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().

  : m_image( img )
{
  load(f);
} // 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::reader::source_manager::pub.

Referenced by read_from_file().

{
  jpeg_create_decompress(&cinfo);

  cinfo.src = &infile.pub;
  cinfo.client_data = &infile;

  infile.pub.fill_input_buffer =
    claw__graphic__jpeg__source_manager__fill_input_buffer;
  infile.pub.skip_input_data =
    claw__graphic__jpeg__source_manager__skip_input_data;
  infile.pub.init_source = claw__graphic__jpeg__source_manager__init_source;
  infile.pub.resync_to_restart = jpeg_resync_to_restart;
  infile.pub.term_source = claw__graphic__jpeg__source_manager__term_source;
} // 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::pub, and claw::graphic::jpeg::error_manager::setjmp_buffer.

Referenced by read_from_file().

{
  error_manager jerr;
  jpeg_error_mgr* jerr_saved = cinfo.err;

  cinfo.err = jpeg_std_error(&jerr.pub);
  jerr.pub.error_exit = jpeg__error_manager__error_exit;

  if ( setjmp(jerr.setjmp_buffer) )
    {
      jpeg_abort_decompress(&cinfo);
      throw CLAW_EXCEPTION(jerr.error_string);
    }

  jpeg_read_header(&cinfo, TRUE);
  jpeg_start_decompress( &cinfo );

  try
    {
      m_image.set_size( cinfo.image_width, cinfo.image_height );

      if ( cinfo.out_color_components == 3 )
        read_data( cinfo, RGB_to_pixel32() );
      else if ( cinfo.out_color_components == 1 )
        read_data( cinfo, grayscale_to_pixel32() );
      else
        throw CLAW_EXCEPTION( "invalid number of colors per channel" );

      jpeg_finish_decompress(&cinfo);
    }
  catch(...)
    {
      jpeg_abort_decompress(&cinfo);
      throw;
    }

  cinfo.err = jerr_saved;
} // 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().

{
  CLAW_PRECOND( !!f );

  std::istream::pos_type init_pos = f.tellg();

  try
    {
      read_from_file(f);
    }
  catch(...)
    {
      f.clear();
      f.seekg( init_pos, std::ios_base::beg );
      throw;
    }
} // 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::pub, and claw::graphic::jpeg::error_manager::setjmp_buffer.

{
  const unsigned int pixel_size = cinfo.output_components;
  JSAMPLE* buffer = new JSAMPLE[cinfo.output_width * pixel_size];

  error_manager jerr;
  jpeg_error_mgr* jerr_saved = cinfo.err;

  cinfo.err = jpeg_std_error(&jerr.pub);
  jerr.pub.error_exit = jpeg__error_manager__error_exit;

  if ( setjmp(jerr.setjmp_buffer) )
    {
      delete[] buffer;
      throw CLAW_EXCEPTION(jerr.error_string);
    }

  while (cinfo.output_scanline < cinfo.output_height)
    {
      jpeg_read_scanlines(&cinfo, &buffer, 1);

      scanline::iterator pixel = m_image[cinfo.output_scanline-1].begin();

      for ( unsigned int i=0; i!=pixel_size*m_image.width();
            i+=pixel_size, ++pixel )
        *pixel = pixel_convert( &buffer[i] );
    }

  delete[] buffer;
  cinfo.err = jerr_saved;
} // 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::pub, and claw::graphic::jpeg::error_manager::setjmp_buffer.

Referenced by load().

{
  source_manager infile(f);
  jpeg_decompress_struct cinfo;
  error_manager jerr;

  cinfo.err = jpeg_std_error(&jerr.pub);
  
  if ( setjmp(jerr.setjmp_buffer) )
    throw CLAW_EXCEPTION(jerr.error_string);

  create_decompress_info( cinfo, infile );
  jerr.pub.error_exit = jpeg__error_manager__error_exit;
  
  try
    {
      decompress(f, cinfo);
      jpeg_destroy_decompress(&cinfo);
    }
  catch(...)
    {
      jpeg_destroy_decompress(&cinfo);
      throw;
    }
} // 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: