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
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