|
CLAW Library (a C++ Library Absolutely Wonderful) 1.5.5
|
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. | |
| 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 209 of file image.hpp.
Referenced by flip(), height(), operator[](), set_size(), swap(), and width().
1.7.3