summaryrefslogtreecommitdiff
path: root/agg/inc/agg_span_image_resample.h
diff options
context:
space:
mode:
Diffstat (limited to 'agg/inc/agg_span_image_resample.h')
-rwxr-xr-xagg/inc/agg_span_image_resample.h180
1 files changed, 180 insertions, 0 deletions
diff --git a/agg/inc/agg_span_image_resample.h b/agg/inc/agg_span_image_resample.h
new file mode 100755
index 000000000000..f4dfd57455d7
--- /dev/null
+++ b/agg/inc/agg_span_image_resample.h
@@ -0,0 +1,180 @@
+//----------------------------------------------------------------------------
+// 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_SPAN_IMAGE_RESAMPLE_INCLUDED
+#define AGG_SPAN_IMAGE_RESAMPLE_INCLUDED
+
+#include "agg_span_image_filter.h"
+#include "agg_span_interpolator_linear.h"
+
+
+namespace agg
+{
+
+
+ //=====================================================span_image_resample
+ template<class ColorT, class Interpolator, class Allocator>
+ class span_image_resample :
+ public span_image_filter<ColorT, Interpolator, Allocator>
+ {
+ public:
+ typedef ColorT color_type;
+ typedef Interpolator interpolator_type;
+ typedef Allocator alloc_type;
+ typedef span_image_filter<color_type, interpolator_type, alloc_type> base_type;
+
+ //--------------------------------------------------------------------
+ span_image_resample(alloc_type& alloc) :
+ base_type(alloc),
+ m_scale_limit(20),
+ m_blur_x(image_subpixel_size),
+ m_blur_y(image_subpixel_size)
+ {}
+
+ //--------------------------------------------------------------------
+ span_image_resample(alloc_type& alloc,
+ const rendering_buffer& src,
+ const color_type& back_color,
+ interpolator_type& inter,
+ const image_filter_lut& filter) :
+ base_type(alloc, src, back_color, inter, &filter),
+ m_scale_limit(20),
+ m_blur_x(image_subpixel_size),
+ m_blur_y(image_subpixel_size)
+ {}
+
+
+ //--------------------------------------------------------------------
+ int scale_limit() const { return m_scale_limit; }
+ void scale_limit(int v) { m_scale_limit = v; }
+
+ //--------------------------------------------------------------------
+ double blur_x() const { return double(m_blur_x) / double(image_subpixel_size); }
+ double blur_y() const { return double(m_blur_y) / double(image_subpixel_size); }
+ void blur_x(double v) { m_blur_x = int(v * double(image_subpixel_size) + 0.5); }
+ void blur_y(double v) { m_blur_y = int(v * double(image_subpixel_size) + 0.5); }
+ void blur(double v) { m_blur_x =
+ m_blur_y = int(v * double(image_subpixel_size) + 0.5); }
+
+ protected:
+ int m_scale_limit;
+ int m_blur_x;
+ int m_blur_y;
+ };
+
+
+
+
+
+
+
+
+ //==============================================span_image_resample_affine
+ template<class ColorT, class Allocator>
+ class span_image_resample_affine :
+ public span_image_filter<ColorT, span_interpolator_linear<trans_affine>, Allocator>
+ {
+ public:
+ typedef ColorT color_type;
+ typedef span_interpolator_linear<trans_affine> interpolator_type;
+ typedef Allocator alloc_type;
+ typedef span_image_filter<color_type, interpolator_type, alloc_type> base_type;
+
+ //--------------------------------------------------------------------
+ span_image_resample_affine(alloc_type& alloc) :
+ base_type(alloc),
+ m_scale_limit(200.0),
+ m_blur_x(1.0),
+ m_blur_y(1.0)
+ {}
+
+ //--------------------------------------------------------------------
+ span_image_resample_affine(alloc_type& alloc,
+ const rendering_buffer& src,
+ const color_type& back_color,
+ interpolator_type& inter,
+ const image_filter_lut& filter_) :
+ base_type(alloc, src, back_color, inter, &filter_),
+ m_scale_limit(200.0),
+ m_blur_x(1.0),
+ m_blur_y(1.0)
+ {}
+
+
+ //--------------------------------------------------------------------
+ int scale_limit() const { return int(m_scale_limit); }
+ void scale_limit(int v) { m_scale_limit = v; }
+
+ //--------------------------------------------------------------------
+ double blur_x() const { return m_blur_x; }
+ double blur_y() const { return m_blur_y; }
+ void blur_x(double v) { m_blur_x = v; }
+ void blur_y(double v) { m_blur_y = v; }
+ void blur(double v) { m_blur_x = m_blur_y = v; }
+
+
+ //--------------------------------------------------------------------
+ void prepare(unsigned max_span_len)
+ {
+ base_type::prepare(max_span_len);
+
+ double scale_x;
+ double scale_y;
+
+ base_type::interpolator().transformer().scaling_abs(&scale_x, &scale_y);
+
+ m_rx = image_subpixel_size;
+ m_ry = image_subpixel_size;
+ m_rx_inv = image_subpixel_size;
+ m_ry_inv = image_subpixel_size;
+
+ scale_x *= m_blur_x;
+ scale_y *= m_blur_y;
+
+ if(scale_x * scale_y > m_scale_limit)
+ {
+ scale_x = scale_x * m_scale_limit / (scale_x * scale_y);
+ scale_y = scale_y * m_scale_limit / (scale_x * scale_y);
+ }
+
+ if(scale_x > 1.0001)
+ {
+ if(scale_x > m_scale_limit) scale_x = m_scale_limit;
+ m_rx = int( scale_x * double(image_subpixel_size) + 0.5);
+ m_rx_inv = int(1.0/scale_x * double(image_subpixel_size) + 0.5);
+ }
+
+ if(scale_y > 1.0001)
+ {
+ if(scale_y > m_scale_limit) scale_y = m_scale_limit;
+ m_ry = int( scale_y * double(image_subpixel_size) + 0.5);
+ m_ry_inv = int(1.0/scale_y * double(image_subpixel_size) + 0.5);
+ }
+ }
+
+ protected:
+ int m_rx;
+ int m_ry;
+ int m_rx_inv;
+ int m_ry_inv;
+
+ private:
+ double m_scale_limit;
+ double m_blur_x;
+ double m_blur_y;
+ };
+
+}
+
+#endif