diff options
Diffstat (limited to 'agg/source/agg_line_profile_aa.cpp')
-rwxr-xr-x | agg/source/agg_line_profile_aa.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/agg/source/agg_line_profile_aa.cpp b/agg/source/agg_line_profile_aa.cpp new file mode 100755 index 000000000000..1374475b663f --- /dev/null +++ b/agg/source/agg_line_profile_aa.cpp @@ -0,0 +1,117 @@ +//---------------------------------------------------------------------------- +// 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 +//---------------------------------------------------------------------------- + +#include "agg_renderer_outline_aa.h" + +namespace agg +{ + + //--------------------------------------------------------------------- + void line_profile_aa::width(double w) + { + if(w < 0.0) w = 0.0; + + if(w < m_smoother_width) w += w; + else w += m_smoother_width; + + w *= 0.5; + + w -= m_smoother_width; + double s = m_smoother_width; + if(w < 0.0) + { + s += w; + w = 0.0; + } + set(w, s); + } + + + //--------------------------------------------------------------------- + line_profile_aa::value_type* line_profile_aa::profile(double w) + { + m_subpixel_width = int(w * subpixel_size); + unsigned size = m_subpixel_width + subpixel_size * 6; + if(size > m_size) + { + delete [] m_profile; + m_profile = new value_type[m_size = size]; + } + return m_profile; + } + + + //--------------------------------------------------------------------- + void line_profile_aa::set(double center_width, double _smoother_width) + { + double base_val = 1.0; + if(center_width == 0.0) center_width = 1.0 / subpixel_size; + if(_smoother_width == 0.0) _smoother_width = 1.0 / subpixel_size; + + double _width = center_width + _smoother_width; + if(_width < m_min_width) + { + double k = _width / m_min_width; + base_val *= k; + center_width /= k; + _smoother_width /= k; + } + + value_type* ch = profile(center_width + _smoother_width); + + unsigned subpixel_center_width = unsigned(center_width * subpixel_size); + unsigned subpixel_smoother_width = unsigned(_smoother_width * subpixel_size); + + value_type* ch_center = ch + subpixel_size*2; + value_type* ch_smoother = ch_center + subpixel_center_width; + + unsigned i; + + unsigned val = m_gamma[unsigned(base_val * aa_mask)]; + ch = ch_center; + for(i = 0; i < subpixel_center_width; i++) + { + *ch++ = (value_type)val; + } + + for(i = 0; i < subpixel_smoother_width; i++) + { + *ch_smoother++ = + m_gamma[unsigned((base_val - + base_val * + (double(i) / subpixel_smoother_width)) * aa_mask)]; + } + + unsigned n_smoother = profile_size() - + subpixel_smoother_width - + subpixel_center_width - + subpixel_size*2; + + val = m_gamma[0]; + for(i = 0; i < n_smoother; i++) + { + *ch_smoother++ = (value_type)val; + } + + ch = ch_center; + for(i = 0; i < subpixel_size*2; i++) + { + *--ch = *ch_center++; + } + } + + +} + |