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