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

aa_demo.cpp

Go to the documentation of this file.
00001 #include "agg_basics.h"
00002 #include "agg_rendering_buffer.h"
00003 #include "agg_rasterizer_scanline_aa.h"
00004 #include "agg_scanline_u.h"
00005 #include "agg_renderer_scanline.h"
00006 #include "agg_pixfmt_rgb.h"
00007 #include "platform/agg_platform_support.h"
00008 #include "ctrl/agg_slider_ctrl.h"
00009 #include "ctrl/agg_cbox_ctrl.h"
00010 
00011 
00012 enum flip_y_e { flip_y = true };
00013 
00014 
00015 namespace agg
00016 {
00017 
00018     class square
00019     {
00020     public:
00021         square(double size) : m_size(size) {}
00022 
00023         template<class Rasterizer, class Scanline, class Renderer, class ColorT> 
00024         void draw(Rasterizer& ras, Scanline& sl, Renderer& ren, ColorT color, 
00025                   double x, double y)
00026         {
00027             ras.reset();
00028             ras.move_to_d(x*m_size,        y*m_size);
00029             ras.line_to_d(x*m_size+m_size, y*m_size);
00030             ras.line_to_d(x*m_size+m_size, y*m_size+m_size);
00031             ras.line_to_d(x*m_size,        y*m_size+m_size);
00032             agg::render_scanlines_aa_solid(ras, sl, ren, color);
00033         }
00034 
00035     private:
00036         double m_size;
00037     };
00038 
00039 
00040 
00041     template<class Renderer> class renderer_enlarged
00042     {
00043     public:
00044         renderer_enlarged(Renderer& ren, double size) : 
00045             m_ren(ren),
00046             m_square(size), 
00047             m_size(size) {}
00048 
00049         //--------------------------------------------------------------------
00050         void color(rgba8 c) { m_color = c; }
00051 
00052         //--------------------------------------------------------------------
00053         void prepare() {}
00054 
00055         //--------------------------------------------------------------------
00056         template<class Scanline> void render(const Scanline& sl)
00057         {
00058             int y = sl.y();
00059 
00060             unsigned num_spans = sl.num_spans();
00061             typename Scanline::const_iterator span = sl.begin();
00062 
00063             do
00064             {
00065                 int x = span->x;
00066                 const typename Scanline::cover_type* covers = span->covers;
00067                 int num_pix = span->len;
00068                 
00069                 do 
00070                 {
00071                     int a = (*covers++ * m_color.a) >> 8;
00072                     m_square.draw(m_ras, m_sl, m_ren, 
00073                                   rgba8(m_color.r, m_color.g, m_color.b, a),
00074                                   x, y);
00075                     ++x;
00076                 }
00077                 while(--num_pix);
00078             }
00079             while(--num_spans);
00080         }
00081 
00082     private:
00083         rasterizer_scanline_aa<> m_ras;
00084         scanline_u8 m_sl;
00085         Renderer&   m_ren;
00086         square      m_square;
00087         rgba8       m_color;
00088         double      m_size;
00089     };
00090 
00091 
00092 
00093 };
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 class the_application : public agg::platform_support
00114 {
00115     double m_x[3];
00116     double m_y[3];
00117     double m_dx;
00118     double m_dy;
00119     int    m_idx;
00120 
00121     agg::slider_ctrl<agg::rgba8> m_slider1;
00122     agg::slider_ctrl<agg::rgba8> m_slider2;
00123 
00124 public:
00125     the_application(agg::pix_format_e format, bool flip_y) :
00126         agg::platform_support(format, flip_y),
00127         m_slider1(80, 10,    600-10, 19,    !flip_y),
00128         m_slider2(80, 10+20, 600-10, 19+20, !flip_y)
00129     {
00130         m_idx = -1;
00131         m_x[0] = 57;    m_y[0] = 100;
00132         m_x[1] = 369;   m_y[1] = 170;
00133         m_x[2] = 143;   m_y[2] = 310;
00134 
00135         add_ctrl(m_slider1);
00136         add_ctrl(m_slider2);
00137 
00138         m_slider1.range(8.0, 100.0);
00139         m_slider1.num_steps(23);
00140         m_slider1.value(32.0);
00141 
00142         m_slider2.range(0.1, 3.0);
00143         m_slider2.value(1.0);
00144 
00145         m_slider1.label("Pixel size=%1.0f");
00146         m_slider2.label("Gamma=%4.3f");
00147 
00148         m_slider1.no_transform();
00149         m_slider2.no_transform();
00150     }
00151 
00152 
00153     virtual ~the_application()
00154     {
00155     }
00156 
00157 
00158     virtual void on_init()
00159     {
00160     }
00161 
00162 
00163     virtual void on_draw()
00164     {
00165         typedef agg::renderer_base<agg::pixfmt_bgr24> ren_base;
00166 
00167         agg::pixfmt_bgr24 pixf(rbuf_window());
00168         ren_base ren(pixf);
00169         agg::scanline_u8 sl;
00170 
00171         ren.clear(agg::rgba(1,1,1));
00172 
00173         agg::rasterizer_scanline_aa<> ras;
00174 
00175         int size_mul = int(m_slider1.value());
00176 
00177         ras.gamma(agg::gamma_power(m_slider2.value()));
00178 
00179 
00180         agg::renderer_enlarged<ren_base> ren_en(ren, size_mul);
00181 
00182         ras.reset();
00183         ras.move_to_d(m_x[0]/size_mul, m_y[0]/size_mul);
00184         ras.line_to_d(m_x[1]/size_mul, m_y[1]/size_mul);
00185         ras.line_to_d(m_x[2]/size_mul, m_y[2]/size_mul);
00186         ren_en.color(agg::rgba8(0,0,0, 255));
00187         agg::render_scanlines(ras, sl, ren_en);
00188 
00189 
00190         agg::render_scanlines_aa_solid(ras, sl, ren, agg::rgba8(0,0,0));
00191 
00192         ras.gamma(agg::gamma_none());
00193 
00194         agg::path_storage ps;
00195         agg::conv_stroke<agg::path_storage> pg(ps);
00196         pg.width(2.0);
00197 
00198         ps.remove_all();
00199         ps.move_to(m_x[0], m_y[0]);
00200         ps.line_to(m_x[1], m_y[1]);
00201         ras.add_path(pg);
00202         agg::render_scanlines_aa_solid(ras, sl, ren, agg::rgba8(0,150,160, 200));
00203 
00204         ps.remove_all();
00205         ps.move_to(m_x[1], m_y[1]);
00206         ps.line_to(m_x[2], m_y[2]);
00207         ras.add_path(pg);
00208         agg::render_scanlines_aa_solid(ras, sl, ren, agg::rgba8(0,150,160, 200));
00209 
00210         ps.remove_all();
00211         ps.move_to(m_x[2], m_y[2]);
00212         ps.line_to(m_x[0], m_y[0]);
00213         ras.add_path(pg);
00214         agg::render_scanlines_aa_solid(ras, sl, ren, agg::rgba8(0,150,160, 200));
00215 
00216         // Render the controls
00217         agg::render_ctrl(ras, sl, ren, m_slider1);
00218         agg::render_ctrl(ras, sl, ren, m_slider2);
00219     }
00220 
00221 
00222 
00223 
00224     virtual void on_mouse_button_down(int x, int y, unsigned flags)
00225     {
00226         if(flags & agg::mouse_left)
00227         {
00228             unsigned i;
00229             for (i = 0; i < 3; i++)
00230             {
00231                 if(sqrt( (x-m_x[i]) * (x-m_x[i]) + (y-m_y[i]) * (y-m_y[i]) ) < 10.0)
00232                 {
00233                     m_dx = x - m_x[i];
00234                     m_dy = y - m_y[i];
00235                     m_idx = i;
00236                     break;
00237                 }
00238             }
00239             if(i == 3)
00240             {
00241                 if(agg::point_in_triangle(m_x[0], m_y[0], 
00242                                           m_x[1], m_y[1],
00243                                           m_x[2], m_y[2],
00244                                           x, y))
00245                 {
00246                     m_dx = x - m_x[0];
00247                     m_dy = y - m_y[0];
00248                     m_idx = 3;
00249                 }
00250             }
00251         }
00252     }
00253 
00254 
00255     virtual void on_mouse_move(int x, int y, unsigned flags)
00256     {
00257         if(flags & agg::mouse_left)
00258         {
00259             if(m_idx == 3)
00260             {
00261                 double dx = x - m_dx;
00262                 double dy = y - m_dy;
00263                 m_x[1] -= m_x[0] - dx;
00264                 m_y[1] -= m_y[0] - dy;
00265                 m_x[2] -= m_x[0] - dx;
00266                 m_y[2] -= m_y[0] - dy;
00267                 m_x[0] = dx;
00268                 m_y[0] = dy;
00269                 force_redraw();
00270                 return;
00271             }
00272 
00273             if(m_idx >= 0)
00274             {
00275                 m_x[m_idx] = x - m_dx;
00276                 m_y[m_idx] = y - m_dy;
00277                 force_redraw();
00278             }
00279         }
00280         else
00281         {
00282             on_mouse_button_up(x, y, flags);
00283         }
00284     }
00285 
00286     virtual void on_mouse_button_up(int x, int y, unsigned flags)
00287     {
00288         m_idx = -1;
00289     }
00290 };
00291 
00292 
00293 int agg_main(int argc, char* argv[])
00294 {
00295     the_application app(agg::pix_format_bgr24, flip_y);
00296     app.caption("AGG Example. Anti-Aliasing Demo");
00297 
00298     if(app.init(600, 400, agg::window_resize))
00299     {
00300         return app.run();
00301     }
00302     return 1;
00303 }
00304 
00305 

© sourcejam.com 2005-2008