00001 #include <math.h>
00002 #include <stdio.h>
00003 #include <time.h>
00004 #include "agg_basics.h"
00005 #include "agg_rendering_buffer.h"
00006 #include "agg_conv_transform.h"
00007 #include "agg_conv_stroke.h"
00008 #include "agg_conv_clip_polyline.h"
00009 #include "agg_scanline_p.h"
00010 #include "agg_renderer_scanline.h"
00011 #include "agg_rasterizer_outline_aa.h"
00012 #include "agg_rasterizer_scanline_aa.h"
00013 #include "agg_pattern_filters_rgba.h"
00014 #include "agg_renderer_outline_aa.h"
00015 #include "agg_renderer_outline_image.h"
00016 #include "agg_pixfmt_rgb.h"
00017 #include "ctrl/agg_slider_ctrl.h"
00018 #include "ctrl/agg_bezier_ctrl.h"
00019 #include "platform/agg_platform_support.h"
00020
00021
00022 enum flip_y_e { flip_y = true };
00023
00024 typedef agg::pixfmt_bgr24 pixfmt;
00025
00026
00027 static agg::int8u brightness_to_alpha[256 * 3] =
00028 {
00029 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00030 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00031 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00032 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00033 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00034 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00035 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00036 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00037 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00038 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254, 254, 254,
00039 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00040 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00041 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00042 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00043 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00044 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00045 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00046 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00047 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00048 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00049 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00050 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00051 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
00052 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 253, 253,
00053 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 252,
00054 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 251, 251, 251, 251, 251,
00055 251, 251, 251, 251, 250, 250, 250, 250, 250, 250, 250, 250, 249, 249, 249, 249,
00056 249, 249, 249, 248, 248, 248, 248, 248, 248, 248, 247, 247, 247, 247, 247, 246,
00057 246, 246, 246, 246, 246, 245, 245, 245, 245, 245, 244, 244, 244, 244, 243, 243,
00058 243, 243, 243, 242, 242, 242, 242, 241, 241, 241, 241, 240, 240, 240, 239, 239,
00059 239, 239, 238, 238, 238, 238, 237, 237, 237, 236, 236, 236, 235, 235, 235, 234,
00060 234, 234, 233, 233, 233, 232, 232, 232, 231, 231, 230, 230, 230, 229, 229, 229,
00061 228, 228, 227, 227, 227, 226, 226, 225, 225, 224, 224, 224, 223, 223, 222, 222,
00062 221, 221, 220, 220, 219, 219, 219, 218, 218, 217, 217, 216, 216, 215, 214, 214,
00063 213, 213, 212, 212, 211, 211, 210, 210, 209, 209, 208, 207, 207, 206, 206, 205,
00064 204, 204, 203, 203, 202, 201, 201, 200, 200, 199, 198, 198, 197, 196, 196, 195,
00065 194, 194, 193, 192, 192, 191, 190, 190, 189, 188, 188, 187, 186, 186, 185, 184,
00066 183, 183, 182, 181, 180, 180, 179, 178, 177, 177, 176, 175, 174, 174, 173, 172,
00067 171, 171, 170, 169, 168, 167, 166, 166, 165, 164, 163, 162, 162, 161, 160, 159,
00068 158, 157, 156, 156, 155, 154, 153, 152, 151, 150, 149, 148, 148, 147, 146, 145,
00069 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129,
00070 128, 128, 127, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113,
00071 112, 111, 110, 109, 108, 107, 106, 105, 104, 102, 101, 100, 99, 98, 97, 96,
00072 95, 94, 93, 91, 90, 89, 88, 87, 86, 85, 84, 82, 81, 80, 79, 78,
00073 77, 75, 74, 73, 72, 71, 70, 69, 67, 66, 65, 64, 63, 61, 60, 59,
00074 58, 57, 56, 54, 53, 52, 51, 50, 48, 47, 46, 45, 44, 42, 41, 40,
00075 39, 37, 36, 35, 34, 33, 31, 30, 29, 28, 27, 25, 24, 23, 22, 20,
00076 19, 18, 17, 15, 14, 13, 12, 11, 9, 8, 7, 6, 4, 3, 2, 1
00077 };
00078
00079
00080 class pattern_src_brightness_to_alpha_rgba8
00081 {
00082 public:
00083 pattern_src_brightness_to_alpha_rgba8(agg::rendering_buffer& rb) :
00084 m_rb(&rb), m_pf(*m_rb) {}
00085
00086 unsigned width() const { return m_pf.width(); }
00087 unsigned height() const { return m_pf.height(); }
00088 agg::rgba8 pixel(int x, int y) const
00089 {
00090 agg::rgba8 c = m_pf.pixel(x, y);
00091 c.a = brightness_to_alpha[c.r + c.g + c.b];
00092 return c;
00093 }
00094
00095 private:
00096 agg::rendering_buffer* m_rb;
00097 pixfmt m_pf;
00098 };
00099
00100
00101 class the_application : public agg::platform_support
00102 {
00103 agg::rgba8 m_ctrl_color;
00104 agg::bezier_ctrl<agg::rgba8> m_curve1;
00105 agg::bezier_ctrl<agg::rgba8> m_curve2;
00106 agg::bezier_ctrl<agg::rgba8> m_curve3;
00107 agg::bezier_ctrl<agg::rgba8> m_curve4;
00108 agg::bezier_ctrl<agg::rgba8> m_curve5;
00109 agg::bezier_ctrl<agg::rgba8> m_curve6;
00110 agg::bezier_ctrl<agg::rgba8> m_curve7;
00111 agg::bezier_ctrl<agg::rgba8> m_curve8;
00112 agg::bezier_ctrl<agg::rgba8> m_curve9;
00113 agg::slider_ctrl<agg::rgba8> m_scale_x;
00114 agg::slider_ctrl<agg::rgba8> m_start_x;
00115
00116 public:
00117 typedef agg::renderer_base<pixfmt> renderer_base;
00118 typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_scanline;
00119 typedef agg::rasterizer_scanline_aa<> rasterizer_scanline;
00120 typedef agg::scanline_p8 scanline;
00121
00122
00123 the_application(agg::pix_format_e format, bool flip_y) :
00124 agg::platform_support(format, flip_y),
00125 m_ctrl_color(agg::rgba(0, 0.3, 0.5, 0.3)),
00126 m_scale_x(5.0, 5.0, 240.0, 12.0, !flip_y),
00127 m_start_x(250.0, 5.0, 495.0, 12.0, !flip_y)
00128 {
00129 m_curve1.line_color(m_ctrl_color);
00130 m_curve2.line_color(m_ctrl_color);
00131 m_curve3.line_color(m_ctrl_color);
00132 m_curve4.line_color(m_ctrl_color);
00133 m_curve5.line_color(m_ctrl_color);
00134 m_curve6.line_color(m_ctrl_color);
00135 m_curve7.line_color(m_ctrl_color);
00136 m_curve8.line_color(m_ctrl_color);
00137 m_curve9.line_color(m_ctrl_color);
00138
00139 m_curve1.curve(64, 19, 14, 126, 118, 266, 19, 265);
00140 m_curve2.curve(112, 113, 178, 32, 200, 132, 125, 438);
00141 m_curve3.curve(401, 24, 326, 149, 285, 11, 177, 77);
00142 m_curve4.curve(188, 427, 129, 295, 19, 283, 25, 410);
00143 m_curve5.curve(451, 346, 302, 218, 265, 441, 459, 400);
00144 m_curve6.curve(454, 198, 14, 13, 220, 291, 483, 283);
00145 m_curve7.curve(301, 398, 355, 231, 209, 211, 170, 353);
00146 m_curve8.curve(484, 101, 222, 33, 486, 435, 487, 138);
00147 m_curve9.curve(143, 147, 11, 45, 83, 427, 132, 197);
00148
00149 add_ctrl(m_curve1);
00150 add_ctrl(m_curve2);
00151 add_ctrl(m_curve3);
00152 add_ctrl(m_curve4);
00153 add_ctrl(m_curve5);
00154 add_ctrl(m_curve6);
00155 add_ctrl(m_curve7);
00156 add_ctrl(m_curve8);
00157 add_ctrl(m_curve9);
00158
00159 m_curve1.no_transform();
00160 m_curve2.no_transform();
00161 m_curve3.no_transform();
00162 m_curve4.no_transform();
00163 m_curve5.no_transform();
00164 m_curve6.no_transform();
00165 m_curve7.no_transform();
00166 m_curve8.no_transform();
00167 m_curve9.no_transform();
00168
00169 m_scale_x.label("Scale X=%.2f");
00170 m_scale_x.range(0.2, 3.0);
00171 m_scale_x.value(1.0);
00172 m_scale_x.no_transform();
00173 add_ctrl(m_scale_x);
00174
00175 m_start_x.label("Start X=%.2f");
00176 m_start_x.range(0.0, 10.0);
00177 m_start_x.value(0.0);
00178 m_start_x.no_transform();
00179 add_ctrl(m_start_x);
00180 }
00181
00182
00183 template<class Pattern,
00184 class Rasterizer,
00185 class Renderer,
00186 class PatternSource,
00187 class VertexSource>
00188 void draw_curve(Pattern& patt,
00189 Rasterizer& ras,
00190 Renderer& ren,
00191 PatternSource& src,
00192 VertexSource& vs)
00193 {
00194 patt.create(src);
00195 ren.scale_x(m_scale_x.value());
00196 ren.start_x(m_start_x.value());
00197 ras.add_path(vs);
00198 }
00199
00200
00201 virtual void on_draw()
00202 {
00203 pixfmt pf(rbuf_window());
00204 renderer_base ren_base(pf);
00205 ren_base.clear(agg::rgba(1.0, 1.0, 0.95));
00206 renderer_scanline ren(ren_base);
00207
00208 rasterizer_scanline ras;
00209 scanline sl;
00210
00211
00212
00213
00214
00215
00216
00217
00218 pattern_src_brightness_to_alpha_rgba8 p1(rbuf_img(0));
00219 pattern_src_brightness_to_alpha_rgba8 p2(rbuf_img(1));
00220 pattern_src_brightness_to_alpha_rgba8 p3(rbuf_img(2));
00221 pattern_src_brightness_to_alpha_rgba8 p4(rbuf_img(3));
00222 pattern_src_brightness_to_alpha_rgba8 p5(rbuf_img(4));
00223 pattern_src_brightness_to_alpha_rgba8 p6(rbuf_img(5));
00224 pattern_src_brightness_to_alpha_rgba8 p7(rbuf_img(6));
00225 pattern_src_brightness_to_alpha_rgba8 p8(rbuf_img(7));
00226 pattern_src_brightness_to_alpha_rgba8 p9(rbuf_img(8));
00227
00228 agg::pattern_filter_bilinear_rgba8 fltr;
00229
00230
00231
00232
00233
00234
00235
00236
00237 typedef agg::line_image_pattern<agg::pattern_filter_bilinear_rgba8> pattern_type;
00238 typedef agg::renderer_base<pixfmt> base_ren_type;
00239 typedef agg::renderer_outline_image<base_ren_type, pattern_type> renderer_type;
00240 typedef agg::rasterizer_outline_aa<renderer_type> rasterizer_type;
00241
00242
00243
00244
00245
00246 pattern_type patt(fltr);
00247 renderer_type ren_img(ren_base, patt);
00248 rasterizer_type ras_img(ren_img);
00249
00250 draw_curve(patt, ras_img, ren_img, p1, m_curve1.curve());
00251 draw_curve(patt, ras_img, ren_img, p2, m_curve2.curve());
00252 draw_curve(patt, ras_img, ren_img, p3, m_curve3.curve());
00253 draw_curve(patt, ras_img, ren_img, p4, m_curve4.curve());
00254 draw_curve(patt, ras_img, ren_img, p5, m_curve5.curve());
00255 draw_curve(patt, ras_img, ren_img, p6, m_curve6.curve());
00256 draw_curve(patt, ras_img, ren_img, p7, m_curve7.curve());
00257 draw_curve(patt, ras_img, ren_img, p8, m_curve8.curve());
00258 draw_curve(patt, ras_img, ren_img, p9, m_curve9.curve());
00259
00260 agg::render_ctrl(ras, sl, ren_base, m_curve1);
00261 agg::render_ctrl(ras, sl, ren_base, m_curve2);
00262 agg::render_ctrl(ras, sl, ren_base, m_curve3);
00263 agg::render_ctrl(ras, sl, ren_base, m_curve4);
00264 agg::render_ctrl(ras, sl, ren_base, m_curve5);
00265 agg::render_ctrl(ras, sl, ren_base, m_curve6);
00266 agg::render_ctrl(ras, sl, ren_base, m_curve7);
00267 agg::render_ctrl(ras, sl, ren_base, m_curve8);
00268 agg::render_ctrl(ras, sl, ren_base, m_curve9);
00269
00270 agg::render_ctrl(ras, sl, ren_base, m_scale_x);
00271 agg::render_ctrl(ras, sl, ren_base, m_start_x);
00272 }
00273
00274
00275 virtual void on_key(int x, int y, unsigned key, unsigned flags)
00276 {
00277 if(key == ' ')
00278 {
00279 FILE* fd = fopen(full_file_name("coord"), "w");
00280 fprintf(fd, "%.0f, %.0f, %.0f, %.0f, %.0f, %.0f, %.0f, %.0f",
00281 m_curve1.x1(), m_curve1.y1(),
00282 m_curve1.x2(), m_curve1.y2(),
00283 m_curve1.x3(), m_curve1.y3(),
00284 m_curve1.x4(), m_curve1.y4());
00285 fclose(fd);
00286 }
00287 }
00288
00289 virtual void on_ctrl_change()
00290 {
00291 }
00292 };
00293
00294
00295 int agg_main(int argc, char* argv[])
00296 {
00297 the_application app(agg::pix_format_bgr24, flip_y);
00298 app.caption("AGG Example. Drawing Lines with Image Patterns");
00299
00300 if(!app.load_img(0, "1") ||
00301 !app.load_img(1, "2") ||
00302 !app.load_img(2, "3") ||
00303 !app.load_img(3, "4") ||
00304 !app.load_img(4, "5") ||
00305 !app.load_img(5, "6") ||
00306 !app.load_img(6, "7") ||
00307 !app.load_img(7, "8") ||
00308 !app.load_img(8, "9"))
00309 {
00310 char buf[256];
00311 sprintf(buf, "There must be files 1%s...9%s\n"
00312 "Download and unzip:\n"
00313 "http://www.antigrain.com/line_patterns.bmp.zip\n"
00314 "or\n"
00315 "http://www.antigrain.com/line_patterns.ppm.tar.gz\n",
00316 app.img_ext(), app.img_ext());
00317 app.message(buf);
00318 return 1;
00319 }
00320
00321 if(app.init(500, 450, agg::window_resize))
00322 {
00323 return app.run();
00324 }
00325
00326 return 1;
00327 }
00328
00329