diff options
Diffstat (limited to 'agg/inc/agg_pixfmt_amask_adaptor.h')
-rwxr-xr-x | agg/inc/agg_pixfmt_amask_adaptor.h | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/agg/inc/agg_pixfmt_amask_adaptor.h b/agg/inc/agg_pixfmt_amask_adaptor.h new file mode 100755 index 000000000000..7f3d5899b1c6 --- /dev/null +++ b/agg/inc/agg_pixfmt_amask_adaptor.h @@ -0,0 +1,265 @@ +//---------------------------------------------------------------------------- +// Anti-Grain Geometry - Version 2.3 +// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) +// +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. +// This software is provided "as is" without express or implied +// warranty, and with no claim as to its suitability for any purpose. +// +//---------------------------------------------------------------------------- +// Contact: mcseem@antigrain.com +// mcseemagg@yahoo.com +// http://www.antigrain.com +//---------------------------------------------------------------------------- + +#ifndef AGG_PIXFMT_AMASK_ADAPTOR_INCLUDED +#define AGG_PIXFMT_AMASK_ADAPTOR_INCLUDED + + +#include <string.h> +#include "agg_rendering_buffer.h" + + +namespace agg +{ + //==================================================pixfmt_amask_adaptor + template<class PixFmt, class AlphaMask> class pixfmt_amask_adaptor + { + public: + typedef PixFmt pixfmt_type; + typedef typename pixfmt_type::color_type color_type; + typedef AlphaMask amask_type; + typedef typename amask_type::cover_type cover_type; + + private: + enum { span_extra_tail = 256 }; + + void realloc_span(unsigned len) + { + if(len > m_max_len) + { + delete [] m_span; + m_span = new cover_type[m_max_len = len + span_extra_tail]; + } + } + + void init_span(unsigned len) + { + realloc_span(len); + + // ATTN! May work incorrectly if cover_type is more that one byte + memset(m_span, amask_type::cover_full, len * sizeof(cover_type)); + } + + void init_span(unsigned len, const cover_type* covers) + { + realloc_span(len); + memcpy(m_span, covers, len * sizeof(cover_type)); + } + + + public: + ~pixfmt_amask_adaptor() { delete [] m_span; } + + pixfmt_amask_adaptor(pixfmt_type& pixf, const amask_type& mask) : + m_pixf(&pixf), m_mask(&mask), m_span(0), m_max_len(0) + {} + + void attach_pixfmt(pixfmt_type& pixf) { m_pixf = &pixf; } + void attach_alpha_mask(const amask_type& mask) { m_mask = &mask; } + + //-------------------------------------------------------------------- + unsigned width() const { return m_pixf->width(); } + unsigned height() const { return m_pixf->height(); } + + //-------------------------------------------------------------------- + color_type pixel(int x, int y) + { + return m_pixf->pixel(x, y); + } + + //-------------------------------------------------------------------- + void copy_pixel(int x, int y, const color_type& c) + { + m_pixf->blend_pixel(x, y, c, m_mask->pixel(x, y)); + } + + //-------------------------------------------------------------------- + void blend_pixel(int x, int y, const color_type& c, cover_type cover) + { + m_pixf->blend_pixel(x, y, c, m_mask->combine_pixel(x, y, cover)); + } + + //-------------------------------------------------------------------- + void copy_hline(int x, int y, + unsigned len, + const color_type& c) + { + realloc_span(len); + m_mask->fill_hspan(x, y, m_span, len); + m_pixf->blend_solid_hspan(x, y, len, c, m_span); + } + + //-------------------------------------------------------------------- + void blend_hline(int x, int y, + unsigned len, + const color_type& c, + cover_type cover) + { + init_span(len); + m_mask->combine_hspan(x, y, m_span, len); + m_pixf->blend_solid_hspan(x, y, len, c, m_span); + } + + //-------------------------------------------------------------------- + void copy_vline(int x, int y, + unsigned len, + const color_type& c) + { + realloc_span(len); + m_mask->fill_vspan(x, y, m_span, len); + m_pixf->blend_solid_vspan(x, y, len, c, m_span); + } + + //-------------------------------------------------------------------- + void blend_vline(int x, int y, + unsigned len, + const color_type& c, + cover_type cover) + { + init_span(len); + m_mask->combine_vspan(x, y, m_span, len); + m_pixf->blend_solid_vspan(x, y, len, c, m_span); + } + + //-------------------------------------------------------------------- + void copy_from(const rendering_buffer& from, + int xdst, int ydst, + int xsrc, int ysrc, + unsigned len) + { + m_pixf->copy_from(from, xdst, ydst, xsrc, ysrc, len); + } + + + //-------------------------------------------------------------------- + void blend_solid_hspan(int x, int y, + unsigned len, + const color_type& c, + const cover_type* covers) + { + init_span(len, covers); + m_mask->combine_hspan(x, y, m_span, len); + m_pixf->blend_solid_hspan(x, y, len, c, m_span); + } + + + //-------------------------------------------------------------------- + void blend_solid_vspan(int x, int y, + unsigned len, + const color_type& c, + const cover_type* covers) + { + init_span(len, covers); + m_mask->combine_vspan(x, y, m_span, len); + m_pixf->blend_solid_vspan(x, y, len, c, m_span); + } + + + //-------------------------------------------------------------------- + void blend_color_hspan(int x, int y, + unsigned len, + const color_type* colors, + const cover_type* covers, + cover_type cover = cover_full) + { + if(covers) + { + init_span(len, covers); + m_mask->combine_hspan(x, y, m_span, len); + } + else + { + realloc_span(len); + m_mask->fill_hspan(x, y, m_span, len); + } + m_pixf->blend_color_hspan(x, y, len, colors, m_span, cover); + } + + + //-------------------------------------------------------------------- + void blend_color_vspan(int x, int y, + unsigned len, + const color_type* colors, + const cover_type* covers, + cover_type cover = cover_full) + { + if(covers) + { + init_span(len, covers); + m_mask->combine_vspan(x, y, m_span, len); + } + else + { + realloc_span(len); + m_mask->fill_vspan(x, y, m_span, len); + } + m_pixf->blend_color_vspan(x, y, len, colors, m_span, cover); + } + + + //-------------------------------------------------------------------- + void blend_opaque_color_hspan(int x, int y, + unsigned len, + const color_type* colors, + const cover_type* covers, + cover_type cover = cover_full) + { + if(covers) + { + init_span(len, covers); + m_mask->combine_hspan(x, y, m_span, len); + } + else + { + realloc_span(len); + m_mask->fill_hspan(x, y, m_span, len); + } + m_pixf->blend_opaque_color_hspan(x, y, len, colors, m_span, cover); + } + + + //-------------------------------------------------------------------- + void blend_opaque_color_vspan(int x, int y, + unsigned len, + const color_type* colors, + const cover_type* covers, + cover_type cover = cover_full) + { + if(covers) + { + init_span(len, covers); + m_mask->combine_vspan(x, y, m_span, len); + } + else + { + realloc_span(len); + m_mask->fill_vspan(x, y, m_span, len); + } + m_pixf->blend_opaque_color_vspan(x, y, len, colors, m_span, cover); + } + + + private: + pixfmt_type* m_pixf; + const amask_type* m_mask; + + cover_type* m_span; + unsigned m_max_len; + }; + +} + +#endif + |