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

lion_lens.cpp

Go to the documentation of this file.
00001 #include <stdlib.h>
00002 #include <ctype.h>
00003 #include <stdio.h>
00004 #include "agg_basics.h"
00005 #include "agg_rendering_buffer.h"
00006 #include "agg_rasterizer_scanline_aa.h"
00007 #include "agg_scanline_p.h"
00008 #include "agg_renderer_scanline.h"
00009 #include "agg_path_storage.h"
00010 #include "agg_conv_transform.h"
00011 #include "agg_trans_warp_magnifier.h"
00012 #include "agg_conv_segmentator.h"
00013 #include "agg_bounding_rect.h"
00014 #include "ctrl/agg_slider_ctrl.h"
00015 #include "ctrl/agg_cbox_ctrl.h"
00016 #include "platform/agg_platform_support.h"
00017 
00018 #define AGG_BGR24 
00019 //#define AGG_RGB24
00020 //#define AGG_BGRA32 
00021 //#define AGG_RGBA32 
00022 //#define AGG_ARGB32 
00023 //#define AGG_ABGR32
00024 //#define AGG_RGB565
00025 //#define AGG_RGB555
00026 //#define AGG_RGB_AAA
00027 #include "pixel_formats.h"
00028 
00029 enum flip_y_e { flip_y = true };
00030 
00031 agg::rasterizer_scanline_aa<> g_rasterizer;
00032 agg::scanline_p8  g_scanline;
00033 agg::path_storage g_path;
00034 agg::rgba8        g_colors[100];
00035 unsigned          g_path_idx[100];
00036 unsigned          g_npaths = 0;
00037 double            g_x1 = 0;
00038 double            g_y1 = 0;
00039 double            g_x2 = 0;
00040 double            g_y2 = 0;
00041 double            g_base_dx = 0;
00042 double            g_base_dy = 0;
00043 double            g_angle = 0;
00044 double            g_scale = 1.0;
00045 double            g_skew_x = 0;
00046 double            g_skew_y = 0;
00047 int               g_nclick = 0;
00048 
00049 unsigned parse_lion(agg::path_storage& ps, agg::rgba8* colors, unsigned* path_idx);
00050 void parse_lion()
00051 {
00052     g_npaths = parse_lion(g_path, g_colors, g_path_idx);
00053     agg::pod_array_adaptor<unsigned> path_idx(g_path_idx, 100);
00054     agg::bounding_rect(g_path, path_idx, 0, g_npaths, &g_x1, &g_y1, &g_x2, &g_y2);
00055     g_base_dx = (g_x2 - g_x1) / 2.0;
00056     g_base_dy = (g_y2 - g_y1) / 2.0;
00057 }
00058 
00059 
00060 class the_application : public agg::platform_support
00061 {
00062     agg::slider_ctrl<agg::rgba8> m_magn_slider;
00063     agg::slider_ctrl<agg::rgba8> m_radius_slider;
00064 
00065 public:
00066     typedef agg::renderer_base<pixfmt> renderer_base;
00067     typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_solid;
00068 
00069     the_application(agg::pix_format_e format, bool flip_y) :
00070         agg::platform_support(format, flip_y),
00071         m_magn_slider  (5,   5, 495,  12, !flip_y),
00072         m_radius_slider(5,  20, 495,  27, !flip_y)
00073     {
00074         parse_lion();
00075         add_ctrl(m_magn_slider);
00076 
00077         m_magn_slider.no_transform();
00078         m_magn_slider.range(0.01, 4.0);
00079         m_magn_slider.value(3.0);
00080         m_magn_slider.label("Scale=%3.2f");
00081 
00082         add_ctrl(m_radius_slider);
00083         m_radius_slider.no_transform();
00084         m_radius_slider.range(0.0, 100.0);
00085         m_radius_slider.value(70.0);
00086         m_radius_slider.label("Radius=%3.2f");
00087 
00088     }
00089 
00090 
00091     virtual void on_init()
00092     {
00093         g_x1 = 200;
00094         g_y1 = 150;
00095     }
00096 
00097     virtual void on_resize(int cx, int cy)
00098     {
00099     }
00100 
00101     virtual void on_draw()
00102     {
00103         pixfmt pixf(rbuf_window());
00104         renderer_base rb(pixf);
00105         renderer_solid r(rb);
00106 
00107         rb.clear(agg::rgba(1, 1, 1));
00108 
00109         agg::trans_warp_magnifier lens;
00110         lens.center(g_x1, g_y1);
00111         lens.magnification(m_magn_slider.value());
00112         lens.radius(m_radius_slider.value() / m_magn_slider.value());
00113 
00114         agg::conv_segmentator<agg::path_storage> segm(g_path);
00115 
00116         agg::trans_affine mtx;
00117         mtx *= agg::trans_affine_translation(-g_base_dx, -g_base_dy);
00118         mtx *= agg::trans_affine_rotation(g_angle + agg::pi);
00119         mtx *= agg::trans_affine_translation(width()/2, height()/2);
00120 
00121         agg::conv_transform<
00122             agg::conv_segmentator<
00123                 agg::path_storage> > trans_mtx(segm, mtx);
00124 
00125         agg::conv_transform<
00126             agg::conv_transform<
00127                 agg::conv_segmentator<
00128                     agg::path_storage> >, agg::trans_warp_magnifier> trans_lens(trans_mtx, lens);
00129 
00130         agg::render_all_paths(g_rasterizer, g_scanline, r, trans_lens, g_colors, g_path_idx, g_npaths);
00131 
00132         agg::render_ctrl(g_rasterizer, g_scanline, rb, m_magn_slider);
00133         agg::render_ctrl(g_rasterizer, g_scanline, rb, m_radius_slider);
00134     }
00135 
00136 
00137 
00138     virtual void on_mouse_button_down(int x, int y, unsigned flags)
00139     {
00140         if(flags & agg::mouse_left)
00141         {
00142             g_x1 = x;
00143             g_y1 = y;
00144             force_redraw();
00145         }
00146         if(flags & agg::mouse_right)
00147         {
00148             g_x2 = x;
00149             g_y2 = y;
00150             force_redraw();
00151         }
00152     }
00153 
00154 
00155     virtual void on_mouse_move(int x, int y, unsigned flags)
00156     {
00157         on_mouse_button_down(x, y, flags);
00158     }
00159 
00160 };
00161 
00162 
00163 
00164 
00165 
00166 
00167 int agg_main(int argc, char* argv[])
00168 {
00169     the_application app(pix_format, flip_y);
00170     app.caption("AGG Example. Lion");
00171 
00172     if(app.init(500, 600, agg::window_resize))
00173     {
00174         return app.run();
00175     }
00176     return 1;
00177 }
00178 
00179 
00180 
00181 
00182 
00183 

© sourcejam.com 2005-2008