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

line_patterns.cpp

Go to the documentation of this file.
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         // Pattern source. Must have an interface:
00212         // width() const
00213         // height() const
00214         // pixel(int x, int y) const
00215         // Any agg::renderer_base<> or derived
00216         // is good for the use as a source.
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;           // Filtering functor
00229 
00230         // agg::line_image_pattern is the main container for the patterns. It creates
00231         // a copy of the patterns extended according to the needs of the filter.
00232         // agg::line_image_pattern can operate with arbitrary image width, but if the 
00233         // width of the pattern is power of 2, it's better to use the modified
00234         // version agg::line_image_pattern_pow2 because it works about 15-25 percent
00235         // faster than agg::line_image_pattern (because of using simple masking instead 
00236         // of expensive '%' operation). 
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         //-- Create with specifying the source
00243         //pattern_type patt(fltr, src);   
00244 
00245         //-- Create uninitialized and set the source
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 

© sourcejam.com 2005-2008