agg/examples/line_thickness.cpp

146 lines
4.3 KiB
C++

#include <stdio.h>
#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_blur.h"
#include "util/agg_color_conv.h"
#include "platform/agg_platform_support.h"
#include "ctrl/agg_slider_ctrl.h"
#include "ctrl/agg_cbox_ctrl.h"
//#define AGG_GRAY8
//#define AGG_GRAY32
//#define AGG_BGR24
#define AGG_BGR96
#include "pixel_formats.h"
enum flip_y_e { flip_y = true };
class the_application : public agg::platform_support
{
agg::slider_ctrl<color_type> m_slider1;
agg::slider_ctrl<color_type> m_slider2;
agg::cbox_ctrl<color_type> m_cbox1;
agg::cbox_ctrl<color_type> m_cbox2;
public:
the_application(agg::pix_format_e format, bool flip_y) :
agg::platform_support(format, flip_y),
m_slider1(10, 10, 640-10, 19, !flip_y),
m_slider2(10, 10+20, 640-10, 19+20, !flip_y),
m_cbox1(10, 10+40, "Monochrome", !flip_y),
m_cbox2(10, 10+60, "Invert", !flip_y)
{
add_ctrl(m_slider1);
add_ctrl(m_slider2);
add_ctrl(m_cbox1);
add_ctrl(m_cbox2);
m_slider1.label("Line thickness=%1.2f");
m_slider1.range(0.0, 5.0);
m_slider1.value(1.0);
m_slider2.label("Blur radius=%1.2f");
m_slider2.range(0.0, 2.0);
m_slider2.value(1.5);
m_cbox1.status(true);
m_cbox2.status(false);
m_slider1.no_transform();
m_slider2.no_transform();
m_cbox1.no_transform();
m_cbox2.no_transform();
}
template<class T>
void SetCtrlClr(T & ctrl, agg::rgba const & clr)
{
ctrl.text_color(clr);
ctrl.inactive_color(clr);
ctrl.active_color(clr);
}
virtual void on_draw()
{
pixfmt pf(rbuf_window());
agg::renderer_base<pixfmt> ren(pf);
agg::scanline_u8 sl;
agg::rasterizer_scanline_aa<> ras;
agg::path_storage ps;
agg::conv_stroke<agg::path_storage> pg(ps);
agg::rgba clr1 = m_cbox1.status() ? agg::rgba(1, 1, 1) : agg::rgba(1, 0, 1);
agg::rgba clr2 = m_cbox1.status() ? agg::rgba(0, 0, 0) : agg::rgba(0, 1, 0);
agg::rgba foreground = m_cbox2.status() ? clr1 : clr2;
agg::rgba background = m_cbox2.status() ? clr2 : clr1;
SetCtrlClr(m_cbox1, foreground);
SetCtrlClr(m_cbox2, foreground);
ren.clear(background);
// Draw row of straight lines.
for (int i = 0; i < 20; ++i)
{
pg.width(m_slider1.value() * 0.3 * (i + 1));
ps.remove_all();
ps.move_to(20 + 30 * i, 310);
ps.line_to(40 + 30 * i, 460);
ras.add_path(pg);
agg::render_scanlines_aa_solid(ras, sl, ren, foreground);
}
// Draw wheel of lines.
for (int i = 0; i < 40; ++i)
{
pg.width(m_slider1.value());
ps.remove_all();
ps.move_to(320 + 20 * sin(i * agg::pi / 20), 180 + 20 * cos(i * agg::pi / 20));
ps.line_to(320 + 100 * sin(i * agg::pi / 20), 180 + 100 * cos(i * agg::pi / 20));
ras.add_path(pg);
agg::render_scanlines_aa_solid(ras, sl, ren, foreground);
}
// Apply blur.
start_timer();
agg::apply_slight_blur(ren, m_slider2.value());
double tm = elapsed_time();
// Display the blur time.
char buf[64];
agg::gsv_text t;
t.size(10.0);
agg::conv_stroke<agg::gsv_text> st(t);
st.width(1.5);
sprintf(buf, "Blur: %3.2f ms", tm);
t.start_point(10.0, 90.0);
t.text(buf);
ras.add_path(st);
agg::render_scanlines_aa_solid(ras, sl, ren, foreground);
// Render the controls
render_ctrl(ras, sl, ren, m_slider1);
render_ctrl(ras, sl, ren, m_slider2);
render_ctrl(ras, sl, ren, m_cbox1);
render_ctrl(ras, sl, ren, m_cbox2);
}
};
int agg_main(int argc, char* argv[])
{
the_application app(pix_format, flip_y);
app.caption("Anti-aliased lines with blurring");
if(app.init(640, 480, agg::window_resize))
{
return app.run();
}
return 1;
}