A class to deal with images. More...
#include <image.hpp>
Classes | |
class | base_iterator |
Base class for iterators on an image. More... | |
class | scanline |
One line in the image. More... | |
Public Types | |
typedef rgba_pixel | pixel_type |
typedef base_iterator< image, pixel_type > | iterator |
typedef base_iterator< const image, const pixel_type > | const_iterator |
Public Member Functions | |
image () | |
Constructor. Creates an image without datas. | |
image (unsigned int w, unsigned int h) | |
Constructor. Creates an empty image. | |
image (std::istream &f) | |
Constructor. Reads an image from an input stream. | |
void | swap (image &that) |
Swap the content of two images. | |
unsigned int | width () const |
Gets image's width. | |
unsigned int | height () const |
Gets image's height. | |
scanline & | operator[] (unsigned int i) |
Gets a line of the image. | |
const scanline & | operator[] (unsigned int i) const |
Gets a line of the image. | |
iterator | begin () |
Get an iterator pointing on the first pixel. | |
iterator | end () |
Get an iterator pointing just past the last pixel. | |
const_iterator | begin () const |
Get an iterator pointing on the first pixel. | |
const_iterator | end () const |
Get an iterator pointing just past the last pixel. | |
void | merge (const image &that) |
Merge an image on the current image. | |
void | merge (const image &that, const math::coordinate_2d< int > &pos) |
Merge an image on the current image. | |
void | partial_copy (const image &that, const math::coordinate_2d< int > &pos) |
Copy an image on the current image. | |
void | flip () |
Set the image upside down. | |
void | fill (const math::rectangle< int > r, const pixel_type &c) |
Fill an area of the image with a given color. | |
void | set_size (unsigned int w, unsigned int h) |
Set a new size to the image. | |
void | load (std::istream &f) |
Read the image from a stream. | |
Private Attributes | |
std::vector< scanline > | m_data |
Data of the picture. |
A class to deal with images.
Definition at line 48 of file image.hpp.
typedef base_iterator<const image, const pixel_type> claw::graphic::image::const_iterator |
claw::graphic::image::image | ( | ) |
claw::graphic::image::image | ( | unsigned int | w, |
unsigned int | h | ||
) |
Constructor. Creates an empty image.
w | Image's width. |
h | Image's height. |
Definition at line 128 of file image.cpp.
References set_size().
{ set_size(w, h); } // image::image() [constructor]
claw::graphic::image::image | ( | std::istream & | f ) |
claw::graphic::image::iterator claw::graphic::image::begin | ( | ) |
Get an iterator pointing on the first pixel.
Definition at line 168 of file image.cpp.
Referenced by claw::graphic::image::scanline::begin(), claw::graphic::gif::reader::fill_background(), claw::graphic::gif::reader::make_frames(), merge(), partial_copy(), claw::graphic::gif::reader::read_frame_data(), and claw::graphic::xbm::reader::read_name().
{ return iterator(*this); } // image::begin()
claw::graphic::image::const_iterator claw::graphic::image::begin | ( | ) | const |
Get an iterator pointing on the first pixel.
Definition at line 186 of file image.cpp.
{ return const_iterator(*this); } // image::begin()
claw::graphic::image::const_iterator claw::graphic::image::end | ( | ) | const |
claw::graphic::image::iterator claw::graphic::image::end | ( | ) |
Get an iterator pointing just past the last pixel.
Definition at line 177 of file image.cpp.
References height(), and width().
Referenced by claw::graphic::image::scanline::end(), claw::graphic::gif::reader::fill_background(), claw::graphic::gif::reader::make_frames(), claw::graphic::gif::reader::read_frame_data(), claw::graphic::xbm::reader::read_name(), and claw::graphic::xbm::reader::remove_comments().
void claw::graphic::image::fill | ( | const math::rectangle< int > | r, |
const pixel_type & | c | ||
) |
Fill an area of the image with a given color.
r | The area to fill. |
c | The color to fill with. |
Definition at line 313 of file image.cpp.
References claw::graphic::rgba_pixel::components, height(), claw::math::rectangle< T >::intersection(), claw::math::rectangle< T >::intersects(), and width().
Referenced by claw::graphic::gif::reader::fill_background(), claw::graphic::gif::reader::make_frames(), claw::graphic::gif::reader::read_frame_data(), and claw::graphic::pcx::writer::write_header().
{ math::rectangle<int> my_box(0, 0, width(), height()); if ( my_box.intersects( r ) ) { const math::rectangle<int> intersection( my_box.intersection( r ) ); const double max_comp ( std::numeric_limits<rgba_pixel::component_type>::max() ); for (int y=0; y!=intersection.height; ++y) { scanline::iterator first = (*this)[intersection.position.y + y].begin() + intersection.position.x; const scanline::iterator last = first + intersection.width; for( ; first!=last; ++first ) { const double src_alpha(c.components.alpha); double red = (double)first->components.red + src_alpha * (double)c.components.red / max_comp; double green = (double)first->components.green + src_alpha * (double)c.components.green / max_comp; double blue = (double)first->components.blue + src_alpha * (double)c.components.blue / max_comp; double alpha = (double)first->components.alpha + (max_comp - src_alpha) / max_comp; first->components.red = std::min(red, max_comp); first->components.green = std::min(green, max_comp); first->components.blue = std::min(blue, max_comp); first->components.alpha = std::min(alpha, max_comp); } } } } // image::fill()
void claw::graphic::image::flip | ( | ) |
unsigned int claw::graphic::image::height | ( | ) | const |
Gets image's height.
Definition at line 159 of file image.cpp.
References m_data.
Referenced by claw::graphic::targa::reader::rle_targa_output_buffer< InputBuffer >::completed(), end(), fill(), flip(), claw::graphic::targa::reader::load_color_mapped_raw(), claw::graphic::targa::reader::load_true_color_raw(), merge(), partial_copy(), claw::graphic::targa::reader::rle_targa_output_buffer< InputBuffer >::rle_targa_output_buffer(), and set_size().
{ return m_data.size(); } // image::height()
void claw::graphic::image::load | ( | std::istream & | f ) |
Read the image from a stream.
f | The stream to read from. |
Definition at line 380 of file image.cpp.
Referenced by image(), and claw::graphic::gif::reader::reader().
{ bool ok = false; #ifdef CLAW_JPEG_SUPPORT if (!ok) try { jpeg::reader( *this, f ); ok = true; } catch( ... ) { } #endif // CLAW_JPEG_SUPPORT #ifdef CLAW_PNG_SUPPORT if (!ok) try { png::reader( *this, f ); ok = true; } catch( ... ) { } #endif // CLAW_PNG_SUPPORT if (!ok) try { bitmap::reader( *this, f ); ok = true; } catch( ... ) { } if (!ok) try { targa::reader( *this, f ); ok = true; } catch( ... ) { } if (!ok) try { gif::reader( *this, f ); ok = true; } catch( ... ) { } if (!ok) try { pcx::reader( *this, f ); ok = true; } catch( ... ) { } if (!ok) try { xbm::reader( *this, f ); ok = true; } catch( ... ) { } if (!ok) throw claw::bad_format( "image::load: file format isn't supported." ); } // image::load()
void claw::graphic::image::merge | ( | const image & | that ) |
Merge an image on the current image.
that | The image to merge. |
Definition at line 205 of file image.cpp.
Referenced by claw::graphic::gif::reader::make_frames().
{ merge( that, math::coordinate_2d<int>(0, 0) ); } // image::merge()
void claw::graphic::image::merge | ( | const image & | that, |
const math::coordinate_2d< int > & | pos | ||
) |
Merge an image on the current image.
that | The image to merge. |
pos | The position of the top left corner. |
Definition at line 217 of file image.cpp.
References begin(), claw::math::rectangle< T >::height, height(), claw::math::rectangle< T >::intersection(), claw::math::rectangle< T >::intersects(), claw::math::rectangle< T >::position, claw::math::rectangle< T >::width, width(), claw::math::coordinate_2d< T >::x, and claw::math::coordinate_2d< T >::y.
{ math::rectangle<int> my_box(0, 0, width(), height()); math::rectangle<int> his_box(pos.x, pos.y, that.width(), that.height()); if ( my_box.intersects( his_box ) ) { math::rectangle<int> intersection; unsigned int that_y = pos.y < 0 ? -pos.y : 0; unsigned int that_x = pos.x < 0 ? -pos.x : 0; const double max_comp ( std::numeric_limits<rgba_pixel::component_type>::max() ); intersection = my_box.intersection( his_box ); for (int y=0; y!=intersection.height; ++y) { scanline::const_iterator first = that[y + that_y].begin() + that_x; scanline::const_iterator last = first + intersection.width; scanline::iterator dest = (*this)[y + intersection.position.y].begin() + intersection.position.x; for( ; first!=last; ++first, ++dest ) { const double src_alpha(first->components.alpha); const double dest_alpha(dest->components.alpha); double red = (double)first->components.red + dest_alpha * (double)dest->components.red / max_comp; double green = (double)first->components.green + dest_alpha * (double)dest->components.green / max_comp; double blue = (double)first->components.blue + dest_alpha * (double)dest->components.blue / max_comp; double alpha = src_alpha + (max_comp - dest_alpha) / max_comp; dest->components.red = std::min(red, max_comp); dest->components.green = std::min(green, max_comp); dest->components.blue = std::min(blue, max_comp); dest->components.alpha = std::min(alpha, max_comp); } } } } // image::merge()
claw::graphic::image::scanline & claw::graphic::image::operator[] | ( | unsigned int | i ) | [inline] |
Gets a line of the image.
Definition at line 429 of file image.ipp.
References m_data.
Referenced by claw::graphic::image::scanline::operator[]().
{ return m_data[i]; } // image::operator[]()
const claw::graphic::image::scanline & claw::graphic::image::operator[] | ( | unsigned int | i ) | const [inline] |
void claw::graphic::image::partial_copy | ( | const image & | that, |
const math::coordinate_2d< int > & | pos | ||
) |
Copy an image on the current image.
that | The image to copy. |
pos | The position of the top left corner. |
Definition at line 271 of file image.cpp.
References begin(), claw::math::rectangle< T >::height, height(), claw::math::rectangle< T >::intersection(), claw::math::rectangle< T >::intersects(), claw::math::rectangle< T >::position, claw::math::rectangle< T >::width, width(), claw::math::coordinate_2d< T >::x, and claw::math::coordinate_2d< T >::y.
{ math::rectangle<int> my_box(0, 0, width(), height()); math::rectangle<int> his_box(pos.x, pos.y, that.width(), that.height()); if ( my_box.intersects( his_box ) ) { math::rectangle<int> intersection; unsigned int that_y = pos.y < 0 ? -pos.y : 0; unsigned int that_x = pos.x < 0 ? -pos.x : 0; intersection = my_box.intersection( his_box ); for (int y=0; y!=intersection.height; ++y) { scanline::const_iterator first = that[y + that_y].begin() + that_x; scanline::const_iterator last = first + intersection.width; scanline::iterator dest = (*this)[y + intersection.position.y].begin() + intersection.position.x; std::copy( first, last, dest ); } } } // image::partial_copy()
void claw::graphic::image::set_size | ( | unsigned int | w, |
unsigned int | h | ||
) |
Set a new size to the image.
Definition at line 362 of file image.cpp.
References height(), and m_data.
Referenced by image(), and claw::graphic::gif::reader::read_frame_data().
void claw::graphic::image::swap | ( | image & | that ) |
unsigned int claw::graphic::image::width | ( | ) | const |
Gets image's width.
Definition at line 147 of file image.cpp.
References m_data.
Referenced by claw::graphic::targa::reader::rle_targa_output_buffer< InputBuffer >::adjust_position(), claw::graphic::targa::reader::rle_targa_output_buffer< InputBuffer >::copy(), end(), claw::graphic::targa::reader::rle_targa_output_buffer< InputBuffer >::fill(), fill(), claw::graphic::targa::reader::load_color_mapped_raw(), claw::graphic::targa::reader::load_true_color_raw(), merge(), partial_copy(), and claw::graphic::targa::reader::rle_targa_output_buffer< InputBuffer >::rle_targa_output_buffer().
std::vector<scanline> claw::graphic::image::m_data [private] |
Data of the picture.
Definition at line 208 of file image.hpp.
Referenced by flip(), height(), operator[](), set_size(), swap(), and width().