00001 #include <stdlib.h>
00002 #include <ctype.h>
00003 #include <stdio.h>
00004 #include "agg_basics.h"
00005 #include "agg_rendering_buffer.h"
00006 #include "agg_rasterizer_scanline_aa.h"
00007 #include "agg_scanline_p.h"
00008 #include "agg_renderer_scanline.h"
00009 #include "agg_path_storage.h"
00010 #include "agg_conv_transform.h"
00011 #include "agg_trans_warp_magnifier.h"
00012 #include "agg_conv_segmentator.h"
00013 #include "agg_bounding_rect.h"
00014 #include "ctrl/agg_slider_ctrl.h"
00015 #include "ctrl/agg_cbox_ctrl.h"
00016 #include "platform/agg_platform_support.h"
00017
00018 #define AGG_BGR24
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "pixel_formats.h"
00028
00029 enum flip_y_e { flip_y = true };
00030
00031 agg::rasterizer_scanline_aa<> g_rasterizer;
00032 agg::scanline_p8 g_scanline;
00033 agg::path_storage g_path;
00034 agg::rgba8 g_colors[100];
00035 unsigned g_path_idx[100];
00036 unsigned g_npaths = 0;
00037 double g_x1 = 0;
00038 double g_y1 = 0;
00039 double g_x2 = 0;
00040 double g_y2 = 0;
00041 double g_base_dx = 0;
00042 double g_base_dy = 0;
00043 double g_angle = 0;
00044 double g_scale = 1.0;
00045 double g_skew_x = 0;
00046 double g_skew_y = 0;
00047 int g_nclick = 0;
00048
00049 unsigned parse_lion(agg::path_storage& ps, agg::rgba8* colors, unsigned* path_idx);
00050 void parse_lion()
00051 {
00052 g_npaths = parse_lion(g_path, g_colors, g_path_idx);
00053 agg::pod_array_adaptor<unsigned> path_idx(g_path_idx, 100);
00054 agg::bounding_rect(g_path, path_idx, 0, g_npaths, &g_x1, &g_y1, &g_x2, &g_y2);
00055 g_base_dx = (g_x2 - g_x1) / 2.0;
00056 g_base_dy = (g_y2 - g_y1) / 2.0;
00057 }
00058
00059
00060 class the_application : public agg::platform_support
00061 {
00062 agg::slider_ctrl<agg::rgba8> m_magn_slider;
00063 agg::slider_ctrl<agg::rgba8> m_radius_slider;
00064
00065 public:
00066 typedef agg::renderer_base<pixfmt> renderer_base;
00067 typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_solid;
00068
00069 the_application(agg::pix_format_e format, bool flip_y) :
00070 agg::platform_support(format, flip_y),
00071 m_magn_slider (5, 5, 495, 12, !flip_y),
00072 m_radius_slider(5, 20, 495, 27, !flip_y)
00073 {
00074 parse_lion();
00075 add_ctrl(m_magn_slider);
00076
00077 m_magn_slider.no_transform();
00078 m_magn_slider.range(0.01, 4.0);
00079 m_magn_slider.value(3.0);
00080 m_magn_slider.label("Scale=%3.2f");
00081
00082 add_ctrl(m_radius_slider);
00083 m_radius_slider.no_transform();
00084 m_radius_slider.range(0.0, 100.0);
00085 m_radius_slider.value(70.0);
00086 m_radius_slider.label("Radius=%3.2f");
00087
00088 }
00089
00090
00091 virtual void on_init()
00092 {
00093 g_x1 = 200;
00094 g_y1 = 150;
00095 }
00096
00097 virtual void on_resize(int cx, int cy)
00098 {
00099 }
00100
00101 virtual void on_draw()
00102 {
00103 pixfmt pixf(rbuf_window());
00104 renderer_base rb(pixf);
00105 renderer_solid r(rb);
00106
00107 rb.clear(agg::rgba(1, 1, 1));
00108
00109 agg::trans_warp_magnifier lens;
00110 lens.center(g_x1, g_y1);
00111 lens.magnification(m_magn_slider.value());
00112 lens.radius(m_radius_slider.value() / m_magn_slider.value());
00113
00114 agg::conv_segmentator<agg::path_storage> segm(g_path);
00115
00116 agg::trans_affine mtx;
00117 mtx *= agg::trans_affine_translation(-g_base_dx, -g_base_dy);
00118 mtx *= agg::trans_affine_rotation(g_angle + agg::pi);
00119 mtx *= agg::trans_affine_translation(width()/2, height()/2);
00120
00121 agg::conv_transform<
00122 agg::conv_segmentator<
00123 agg::path_storage> > trans_mtx(segm, mtx);
00124
00125 agg::conv_transform<
00126 agg::conv_transform<
00127 agg::conv_segmentator<
00128 agg::path_storage> >, agg::trans_warp_magnifier> trans_lens(trans_mtx, lens);
00129
00130 agg::render_all_paths(g_rasterizer, g_scanline, r, trans_lens, g_colors, g_path_idx, g_npaths);
00131
00132 agg::render_ctrl(g_rasterizer, g_scanline, rb, m_magn_slider);
00133 agg::render_ctrl(g_rasterizer, g_scanline, rb, m_radius_slider);
00134 }
00135
00136
00137
00138 virtual void on_mouse_button_down(int x, int y, unsigned flags)
00139 {
00140 if(flags & agg::mouse_left)
00141 {
00142 g_x1 = x;
00143 g_y1 = y;
00144 force_redraw();
00145 }
00146 if(flags & agg::mouse_right)
00147 {
00148 g_x2 = x;
00149 g_y2 = y;
00150 force_redraw();
00151 }
00152 }
00153
00154
00155 virtual void on_mouse_move(int x, int y, unsigned flags)
00156 {
00157 on_mouse_button_down(x, y, flags);
00158 }
00159
00160 };
00161
00162
00163
00164
00165
00166
00167 int agg_main(int argc, char* argv[])
00168 {
00169 the_application app(pix_format, flip_y);
00170 app.caption("AGG Example. Lion");
00171
00172 if(app.init(500, 600, agg::window_resize))
00173 {
00174 return app.run();
00175 }
00176 return 1;
00177 }
00178
00179
00180
00181
00182
00183