agg/examples/polymorphic_renderer.cpp

168 lines
4.9 KiB
C++

#include <math.h>
#include <stdio.h>
#include <time.h>
#include "agg_basics.h"
#include "agg_rendering_buffer.h"
#include "agg_rasterizer_scanline_aa.h"
#include "agg_rasterizer_outline.h"
#include "agg_scanline_p.h"
#include "agg_path_storage.h"
#include "agg_renderer_scanline.h"
#include "platform/agg_platform_support.h"
#include "agg_pixfmt_rgb.h"
#include "agg_pixfmt_rgb_packed.h"
#include "agg_pixfmt_rgba.h"
static int pix_fmt = agg::pix_format_rgb555;
//static int pix_fmt = agg::pix_format_rgb565;
//static int pix_fmt = agg::pix_format_rgb24;
//static int pix_fmt = agg::pix_format_bgr24;
//static int pix_fmt = agg::pix_format_rgba32;
//static int pix_fmt = agg::pix_format_argb32;
//static int pix_fmt = agg::pix_format_abgr32;
//static int pix_fmt = agg::pix_format_bgra32;
enum flip_y_e { flip_y = true };
namespace agg
{
//========================================================================
class polymorphic_renderer_solid_rgba8_base
{
public:
typedef srgba8 color_type;
typedef scanline_p8 scanline_type;
virtual ~polymorphic_renderer_solid_rgba8_base() {}
//--------------------------------------------------------------------
virtual void clear(const color_type& c) = 0;
virtual void color(const color_type& c) = 0;
virtual const color_type color() const = 0;
virtual void prepare() = 0;
virtual void render(const scanline_type&) = 0;
};
//========================================================================
template<class PixFmt> class polymorphic_renderer_solid_rgba8_adaptor :
public polymorphic_renderer_solid_rgba8_base
{
public:
polymorphic_renderer_solid_rgba8_adaptor(rendering_buffer& rbuf) :
m_pixfmt(rbuf),
m_ren_base(m_pixfmt),
m_ren(m_ren_base)
{}
//--------------------------------------------------------------------
virtual void clear(const color_type& c)
{
m_ren_base.clear(c);
}
virtual void color(const color_type& c)
{
m_ren.color(c);
}
virtual const color_type color() const
{
return m_ren.color();
}
virtual void prepare()
{
m_ren.prepare();
}
virtual void render(const scanline_type& sl)
{
m_ren.render(sl);
}
private:
PixFmt m_pixfmt;
renderer_base<PixFmt> m_ren_base;
renderer_scanline_aa_solid<renderer_base<PixFmt> > m_ren;
};
}
class the_application : public agg::platform_support
{
double m_x[3];
double m_y[3];
public:
the_application(int format, bool flip_y) :
agg::platform_support((agg::pix_format_e)format, flip_y)
{
m_x[0] = 100; m_y[0] = 60;
m_x[1] = 369; m_y[1] = 170;
m_x[2] = 143; m_y[2] = 310;
}
virtual void on_draw()
{
agg::path_storage path;
path.move_to(m_x[0], m_y[0]);
path.line_to(m_x[1], m_y[1]);
path.line_to(m_x[2], m_y[2]);
path.close_polygon();
agg::polymorphic_renderer_solid_rgba8_base* ren = 0;
//-- Polymorphic renderer class factory
switch(pix_fmt)
{
case agg::pix_format_rgb555 : ren = new agg::polymorphic_renderer_solid_rgba8_adaptor<agg::pixfmt_rgb555>(rbuf_window()); break;
case agg::pix_format_rgb565 : ren = new agg::polymorphic_renderer_solid_rgba8_adaptor<agg::pixfmt_rgb565>(rbuf_window()); break;
case agg::pix_format_rgb24 : ren = new agg::polymorphic_renderer_solid_rgba8_adaptor<agg::pixfmt_rgb24 >(rbuf_window()); break;
case agg::pix_format_bgr24 : ren = new agg::polymorphic_renderer_solid_rgba8_adaptor<agg::pixfmt_bgr24 >(rbuf_window()); break;
case agg::pix_format_rgba32 : ren = new agg::polymorphic_renderer_solid_rgba8_adaptor<agg::pixfmt_rgba32>(rbuf_window()); break;
case agg::pix_format_argb32 : ren = new agg::polymorphic_renderer_solid_rgba8_adaptor<agg::pixfmt_argb32>(rbuf_window()); break;
case agg::pix_format_abgr32 : ren = new agg::polymorphic_renderer_solid_rgba8_adaptor<agg::pixfmt_abgr32>(rbuf_window()); break;
case agg::pix_format_bgra32 : ren = new agg::polymorphic_renderer_solid_rgba8_adaptor<agg::pixfmt_bgra32>(rbuf_window()); break;
}
agg::rasterizer_scanline_aa<> ras;
agg::scanline_p8 sl;
if(ren)
{
ren->clear(agg::srgba8(255, 255, 255));
ren->color(agg::srgba8(80, 30, 20));
ras.add_path(path);
agg::render_scanlines(ras, sl, *ren);
}
delete ren;
}
};
int agg_main(int argc, char* argv[])
{
the_application app(pix_fmt, flip_y);
app.caption("AGG Example. Polymorphic Renderers");
if(app.init(400, 330, agg::window_resize))
{
return app.run();
}
return 1;
}