Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

image_filters2.cpp

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <math.h>
00004 #include <time.h>
00005 #include "agg_rendering_buffer.h"
00006 #include "agg_rasterizer_scanline_aa.h"
00007 #include "agg_ellipse.h"
00008 #include "agg_trans_affine.h"
00009 #include "agg_conv_transform.h"
00010 #include "agg_scanline_u.h"
00011 #include "agg_scanline_p.h"
00012 #include "agg_renderer_scanline.h"
00013 #include "agg_pixfmt_rgba.h"
00014 #include "agg_gamma_lut.h"
00015 #include "agg_span_allocator.h"
00016 #include "agg_span_image_filter_rgba.h"
00017 #include "agg_span_interpolator_linear.h"
00018 #include "agg_image_accessors.h"
00019 #include "ctrl/agg_slider_ctrl.h"
00020 #include "ctrl/agg_rbox_ctrl.h"
00021 #include "ctrl/agg_cbox_ctrl.h"
00022 #include "platform/agg_platform_support.h"
00023 
00024 enum flip_y_e { flip_y = true };
00025 
00026 enum { l = 255 };
00027 static agg::int8u g_image[] = 
00028 {
00029    0,l,0,l,  0,0,l,l,  l,l,l,l,  l,0,0,l,
00030    l,0,0,l,  0,0,0,l,  l,l,l,l,  l,l,l,l,
00031    l,l,l,l,  l,l,l,l,  0,0,l,l,  l,0,0,l,
00032    0,0,l,l,  l,l,l,l,  0,0,0,l,  0,l,0,l
00033 };
00034 
00035 class the_application : public agg::platform_support
00036 {
00037     typedef agg::pixfmt_bgra32 pixfmt;
00038     typedef agg::pixfmt_bgra32_pre pixfmt_pre;
00039     typedef agg::renderer_base<pixfmt> renderer_base;
00040     typedef agg::renderer_base<pixfmt_pre> renderer_base_pre;
00041 
00042     agg::slider_ctrl<agg::rgba> m_gamma;
00043     agg::slider_ctrl<agg::rgba> m_radius;
00044     agg::rbox_ctrl<agg::rgba>   m_filters;
00045     agg::cbox_ctrl<agg::rgba>   m_normalize;
00046 
00047     double  m_cur_angle;
00048     int     m_cur_filter;
00049     int     m_num_steps;
00050     double  m_num_pix;
00051     clock_t m_time1;
00052     clock_t m_time2;
00053 
00054 public:
00055     the_application(agg::pix_format_e format, bool flip_y) :
00056         agg::platform_support(format, flip_y),
00057         m_gamma (115,  5,    500-5, 11,     !flip_y),
00058         m_radius(115,  5+15, 500-5, 11+15,  !flip_y),
00059         m_filters(0.0, 0.0, 110.0, 210.0, !flip_y),
00060         m_normalize  (8.0, 215.0, "Normalize Filter", !flip_y),
00061         m_cur_angle(0.0),
00062         m_cur_filter(1),
00063         m_num_steps(0),
00064         m_num_pix(0.0),
00065         m_time1(0),
00066         m_time2(0)
00067     {
00068         add_ctrl(m_gamma);
00069         add_ctrl(m_radius);
00070         add_ctrl(m_filters);
00071         add_ctrl(m_normalize);
00072         m_normalize.text_size(7.5);
00073         m_normalize.status(true);
00074 
00075         m_radius.label("Filter Radius=%.3f");
00076         m_radius.range(2.0, 8.0);
00077         m_radius.value(4.0);
00078 
00079         m_gamma.label("Gamma=%.3f");
00080         m_gamma.range(0.5, 3.0);
00081         m_gamma.value(1.0);
00082 
00083         m_filters.add_item("simple (NN)");
00084         m_filters.add_item("bilinear");
00085         m_filters.add_item("bicubic");
00086         m_filters.add_item("spline16");
00087         m_filters.add_item("spline36");
00088         m_filters.add_item("hanning");
00089         m_filters.add_item("hamming");
00090         m_filters.add_item("hermite");
00091         m_filters.add_item("kaiser");
00092         m_filters.add_item("quadric");
00093         m_filters.add_item("catrom");
00094         m_filters.add_item("gaussian");
00095         m_filters.add_item("bessel");
00096         m_filters.add_item("mitchell");
00097         m_filters.add_item("sinc");
00098         m_filters.add_item("lanczos");
00099         m_filters.add_item("blackman");
00100         m_filters.cur_item(1);
00101 
00102         m_filters.border_width(0, 0);
00103         m_filters.background_color(agg::rgba(0.0, 0.0, 0.0, 0.1));
00104         m_filters.text_size(6.0);
00105         m_filters.text_thickness(0.85);
00106     }
00107 
00108     virtual ~the_application()
00109     {
00110     }
00111 
00112     virtual void on_draw()
00113     {
00114         pixfmt pixf(rbuf_window());
00115         renderer_base rb(pixf);
00116 
00117         rb.clear(agg::rgba(1.0, 1.0, 1.0));
00118         rb.copy_from(rbuf_img(0), 0, 110, 35);
00119 
00120         agg::rasterizer_scanline_aa<> ras;
00121         agg::scanline_u8 sl;
00122 
00123         agg::rendering_buffer img_rbuf(g_image, 4, 4, 4*4);
00124 
00125         double para[] = { 200, 40, 200+300, 40, 200+300, 40+300, 200, 40+300 };
00126         agg::trans_affine img_mtx(para, 0,0,4,4);
00127 
00128         typedef agg::span_interpolator_linear<> interpolator_type;
00129         interpolator_type interpolator(img_mtx); 
00130         agg::span_allocator<agg::rgba8> sa;
00131 
00132         pixfmt img_pixf(img_rbuf);
00133         typedef agg::image_accessor_clone<pixfmt> img_source_type;
00134         img_source_type source(img_pixf);
00135 
00136         ras.reset();
00137         ras.move_to_d(para[0], para[1]);
00138         ras.line_to_d(para[2], para[3]);
00139         ras.line_to_d(para[4], para[5]);
00140         ras.line_to_d(para[6], para[7]);
00141 
00142         switch(m_filters.cur_item())
00143         {
00144         case 0:
00145             {
00146                 typedef agg::span_image_filter_rgba_nn<img_source_type,
00147                                                        interpolator_type> span_gen_type;
00148 
00149                 span_gen_type sg(source, interpolator);
00150                 agg::render_scanlines_aa(ras, sl, rb, sa, sg);
00151             }
00152             break;
00153 
00154         case 1:
00155         case 2:
00156         case 3:
00157         case 4:
00158         case 5:
00159         case 6:
00160         case 7:
00161         case 8:  
00162         case 9:  
00163         case 10: 
00164         case 11: 
00165         case 12: 
00166         case 13: 
00167         case 14: 
00168         case 15: 
00169         case 16: 
00170             {
00171                 agg::image_filter_lut filter;
00172                 bool norm = m_normalize.status();
00173                 switch(m_filters.cur_item())
00174                 {
00175                 case 1:  filter.calculate(agg::image_filter_bilinear(),                 norm); break; 
00176                 case 2:  filter.calculate(agg::image_filter_bicubic(),                  norm); break; 
00177                 case 3:  filter.calculate(agg::image_filter_spline16(),                 norm); break; 
00178                 case 4:  filter.calculate(agg::image_filter_spline36(),                 norm); break; 
00179                 case 5:  filter.calculate(agg::image_filter_hanning(),                  norm); break; 
00180                 case 6:  filter.calculate(agg::image_filter_hamming(),                  norm); break; 
00181                 case 7:  filter.calculate(agg::image_filter_hermite(),                  norm); break; 
00182                 case 8:  filter.calculate(agg::image_filter_kaiser(),                   norm); break; 
00183                 case 9:  filter.calculate(agg::image_filter_quadric(),                  norm); break; 
00184                 case 10: filter.calculate(agg::image_filter_catrom(),                   norm); break; 
00185                 case 11: filter.calculate(agg::image_filter_gaussian(),                 norm); break; 
00186                 case 12: filter.calculate(agg::image_filter_bessel(),                   norm); break; 
00187                 case 13: filter.calculate(agg::image_filter_mitchell(),                 norm); break; 
00188                 case 14: filter.calculate(agg::image_filter_sinc(m_radius.value()),     norm); break; 
00189                 case 15: filter.calculate(agg::image_filter_lanczos(m_radius.value()),  norm); break; 
00190                 case 16: filter.calculate(agg::image_filter_blackman(m_radius.value()), norm); break; 
00191                 }
00192 
00193                 typedef agg::span_image_filter_rgba<img_source_type,
00194                                                     interpolator_type> span_gen_type;
00195 
00196                 span_gen_type sg(source, interpolator, filter);
00197                 agg::render_scanlines_aa(ras, sl, rb, sa, sg);
00198 
00199                 agg::gamma_lut<agg::int8u, agg::int8u, 8, 8> gamma(m_gamma.value());
00200                 pixf.apply_gamma_inv(gamma);
00201 
00202                 double x_start = 5.0;
00203                 double x_end   = 195.0;
00204                 double y_start = 235.0;
00205                 double y_end   = initial_height() - 5.0;
00206                 double x_center = (x_start + x_end) / 2;
00207 
00208                 agg::path_storage p;
00209                 agg::conv_stroke<agg::path_storage> stroke(p);
00210                 stroke.width(0.8);
00211 
00212                 unsigned i;
00213                 for(i = 0; i <= 16; i++)
00214                 {
00215                     double x = x_start + (x_end - x_start) * i / 16.0;
00216                     p.remove_all();
00217                     p.move_to(x+0.5, y_start);
00218                     p.line_to(x+0.5, y_end);
00219                     ras.add_path(stroke);
00220                     agg::render_scanlines_aa_solid(ras, sl, rb, 
00221                                                    agg::rgba8(0, 0, 0, i == 8 ? 255 : 100));
00222                 }
00223                 
00224                 double ys = y_start + (y_end - y_start) / 6.0;
00225                 p.remove_all();
00226                 p.move_to(x_start, ys);
00227                 p.line_to(x_end,   ys);
00228                 ras.add_path(stroke);
00229                 agg::render_scanlines_aa_solid(ras, sl, rb, agg::rgba8(0, 0, 0));
00230 
00231                 double radius = filter.radius();
00232                 unsigned n = unsigned(radius * 256 * 2);
00233                 double dx = (x_end - x_start) * radius / 8.0;
00234                 double dy = y_end - ys;
00235 
00236                 const agg::int16* weights = filter.weight_array();
00237                 double xs = (x_end + x_start)/2.0 - (filter.diameter() * (x_end - x_start) / 32.0);
00238                 unsigned nn = filter.diameter() * 256;
00239                 p.remove_all();
00240                 p.move_to(xs+0.5, ys + dy * weights[0] / agg::image_filter_scale);
00241                 for(i = 1; i < nn; i++)
00242                 {
00243                     p.line_to(xs + dx * i / n + 0.5,
00244                               ys + dy * weights[i] / agg::image_filter_scale);
00245                 }
00246                 ras.add_path(stroke);
00247                 agg::render_scanlines_aa_solid(ras, sl, rb, agg::rgba8(100, 0, 0));
00248             }
00249             break;
00250         }
00251 
00252         agg::render_ctrl(ras, sl, rb, m_gamma);
00253         if(m_filters.cur_item() >= 14)
00254         {
00255             agg::render_ctrl(ras, sl, rb, m_radius);
00256         }
00257         agg::render_ctrl(ras, sl, rb, m_filters);
00258         agg::render_ctrl(ras, sl, rb, m_normalize);
00259     }
00260 
00261 };
00262 
00263 
00264 
00265 
00266 
00267 int agg_main(int argc, char* argv[])
00268 {
00269     the_application app(agg::pix_format_bgra32, flip_y);
00270     app.caption("Image transformation filters comparison");
00271 
00272     if(app.init(500, 340, 0))
00273     {
00274         return app.run();
00275     }
00276     return 0;
00277 }
00278 
00279 

© sourcejam.com 2005-2008