Slicer3:Editor:Rasterizing:AGGextended demo

From NAMIC Wiki
Revision as of 15:09, 20 December 2006 by Andy (talk | contribs)
Jump to: navigation, search
Home < Slicer3:Editor:Rasterizing:AGGextended demo

An example from The Antigrain Graphics (AGG) code extended to 7 vertices.

Agg-intersection.png
 #include "agg_basics.h"
 #include "agg_rendering_buffer.h"
 #include "agg_rasterizer_scanline_aa.h"
 #include "agg_scanline_u.h"
 #include "agg_renderer_scanline.h"
 #include "agg_pixfmt_rgb.h"
 #include "platform/agg_platform_support.h"
 #include "ctrl/agg_slider_ctrl.h"
 #include "ctrl/agg_cbox_ctrl.h"
 
 
 enum flip_y_e { flip_y = true };
 
 #define NUMPOINTS 7
 
 namespace agg
 {
 
     class square
     {
     public:
         square(double size) : m_size(size) {}
 
         template<class Rasterizer, class Scanline, class Renderer, class ColorT>
         void draw(Rasterizer& ras, Scanline& sl, Renderer& ren, ColorT color,
                   double x, double y)
         {
             ras.reset();
             ras.move_to_d(x*m_size,        y*m_size);
             ras.line_to_d(x*m_size+m_size, y*m_size);
             ras.line_to_d(x*m_size+m_size, y*m_size+m_size);
             ras.line_to_d(x*m_size,        y*m_size+m_size);
             agg::render_scanlines_aa_solid(ras, sl, ren, color);
         }
 
     private:
         double m_size;
     };
 
 
 
     template<class Renderer> class renderer_enlarged
     {
     public:
         renderer_enlarged(Renderer& ren, double size) :
             m_ren(ren),
             m_square(size),
             m_size(size) {}
 
         //--------------------------------------------------------------------
         void color(rgba8 c) { m_color = c; }
 
         //--------------------------------------------------------------------
         void prepare() {}
 
         //--------------------------------------------------------------------
         template<class Scanline> void render(const Scanline& sl)
         {
             int y = sl.y();
 
             unsigned num_spans = sl.num_spans();
             typename Scanline::const_iterator span = sl.begin();
 
             do
             {
                 int x = span->x;
                 const typename Scanline::cover_type* covers = span->covers;
                 int num_pix = span->len;
 
                 do
                 {
                     int a = (*covers++ * m_color.a) >> 8;
                     m_square.draw(m_ras, m_sl, m_ren,
                                   rgba8(m_color.r, m_color.g, m_color.b, a),
                                   x, y);
                     ++x;
                 }
                 while(--num_pix);
             }
             while(--num_spans);
         }
 
     private:
         rasterizer_scanline_aa<> m_ras;
         scanline_u8 m_sl;
         Renderer&   m_ren;
         square      m_square;
         rgba8       m_color;
         double      m_size;
     };
 
 
 
 };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 class the_application : public agg::platform_support
 {
     double m_x[NUMPOINTS];
     double m_y[NUMPOINTS];
     double m_dx;
     double m_dy;
     int    m_idx;
     int m_numPoints;
 
     agg::slider_ctrl<agg::rgba8> m_slider1;
     agg::slider_ctrl<agg::rgba8> m_slider2;
 
 public:
     the_application(agg::pix_format_e format, bool flip_y) :
         agg::platform_support(format, flip_y),
         m_slider1(80, 10,    600-10, 19,    !flip_y),
         m_slider2(80, 10+20, 600-10, 19+20, !flip_y)
     {
         m_idx = -1;
         m_numPoints = NUMPOINTS;
         m_x[0] = 57;    m_y[0] = 100;
         m_x[1] = 369;   m_y[1] = 170;
         m_x[2] = 143;   m_y[2] = 310;
         m_x[3] = 153;   m_y[3] = 310;
         m_x[4] = 143;   m_y[4] = 360;
         m_x[5] = 173;   m_y[5] = 360;
         m_x[6] = 173;   m_y[6] = 380;
 
         add_ctrl(m_slider1);
         add_ctrl(m_slider2);
 
         m_slider1.range(8.0, 100.0);
         m_slider1.num_steps(23);
         m_slider1.value(32.0);
 
         m_slider2.range(0.1, 3.0);
         m_slider2.value(1.0);
 
         m_slider1.label("Pixel size=%1.0f");
         m_slider2.label("Gamma=%4.3f");
 
         m_slider1.no_transform();
         m_slider2.no_transform();
     }
 
 
     virtual ~the_application()
     {
     }
 
 
     virtual void on_init()
     {
     }
 
 
     virtual void on_draw()
     {
         typedef agg::renderer_base<agg::pixfmt_bgr24> ren_base;
 
         agg::pixfmt_bgr24 pixf(rbuf_window());
         ren_base ren(pixf);
         agg::scanline_u8 sl;
 
         ren.clear(agg::rgba(1,1,1));
 
         agg::rasterizer_scanline_aa<> ras;
 
         int size_mul = int(m_slider1.value());
 
         ras.gamma(agg::gamma_power(m_slider2.value()));
         ras.filling_rule(agg::fill_even_odd);
 
         agg::renderer_enlarged<ren_base> ren_en(ren, size_mul);
 
         ras.reset();
 
         ras.move_to_d(m_x[0]/size_mul, m_y[0]/size_mul);
         for (int i = 0; i < m_numPoints; i++)
           {
           ras.line_to_d(m_x[i]/size_mul, m_y[i]/size_mul);
           }
 
         ren_en.color(agg::rgba8(0,255,0, 255));
         agg::render_scanlines(ras, sl, ren_en);
 
 
         agg::render_scanlines_aa_solid(ras, sl, ren, agg::rgba8(0,0,0));
 
         ras.gamma(agg::gamma_none());
 
         agg::path_storage ps;
         agg::conv_stroke<agg::path_storage> pg(ps);
         pg.width(2.0);
 
         for (int i = 0; i < m_numPoints; i++)
           {
           int nextPoint = (i+1)%m_numPoints;
           ps.remove_all();
           ps.move_to(m_x[i], m_y[i]);
           ps.line_to(m_x[nextPoint], m_y[nextPoint]);
           ras.add_path(pg);
           agg::render_scanlines_aa_solid(ras, sl, ren, agg::rgba8(0,150,160, 200));
           }
 
 
         // Render the controls
         agg::render_ctrl(ras, sl, ren, m_slider1);
         agg::render_ctrl(ras, sl, ren, m_slider2);
     }
 
 
 
 
     virtual void on_mouse_button_down(int x, int y, unsigned flags)
     {
         if(flags & agg::mouse_left)
         {
             unsigned i;
             for (i = 0; i < m_numPoints; i++)
             {
                 if(sqrt( (x-m_x[i]) * (x-m_x[i]) + (y-m_y[i]) * (y-m_y[i]) ) < 10.0)
                 {
                     m_dx = x - m_x[i];
                     m_dy = y - m_y[i];
                     m_idx = i;
                     break;
                 }
             }
             if(i == m_numPoints + 1)
             {
                 if(agg::point_in_triangle(m_x[0], m_y[0],
                                           m_x[1], m_y[1],
                                           m_x[2], m_y[2],
                                           x, y))
                 {
                     m_dx = x - m_x[0];
                     m_dy = y - m_y[0];
                     m_idx = m_numPoints + 1;
                 }
             }
         }
     }
 
 
     virtual void on_mouse_move(int x, int y, unsigned flags)
     {
         if(flags & agg::mouse_left)
         {
             if(m_idx == m_numPoints + 1)
             {
                 double dx = x - m_dx;
                 double dy = y - m_dy;
                 m_x[1] -= m_x[0] - dx;
                 m_y[1] -= m_y[0] - dy;
                 m_x[2] -= m_x[0] - dx;
                 m_y[2] -= m_y[0] - dy;
                 m_x[0] = dx;
                 m_y[0] = dy;
                 force_redraw();
                 return;
             }
 
             if(m_idx >= 0)
             {
                 m_x[m_idx] = x - m_dx;
                 m_y[m_idx] = y - m_dy;
                 force_redraw();
             }
         }
         else
         {
             on_mouse_button_up(x, y, flags);
         }
     }
 
     virtual void on_mouse_button_up(int x, int y, unsigned flags)
     {
         m_idx = -1;
     }
 };
 
 
 int agg_main(int argc, char* argv[])
 {
     the_application app(agg::pix_format_bgr24, flip_y);
     app.caption("AGG Example. Anti-Aliasing Demo");
 
     if(app.init(600, 400, agg::window_resize))
     {
         return app.run();
     }
     return 1;
 }