diff --git a/desmume/src/aggdraw.cpp b/desmume/src/aggdraw.cpp index 33e78b9a8..b30f0b3bc 100644 --- a/desmume/src/aggdraw.cpp +++ b/desmume/src/aggdraw.cpp @@ -35,7 +35,13 @@ #include "agg_path_storage.h" #include "agg_color_rgba.h" +#include "agg_pixfmt_rgb.h" +#include "agg_pixfmt_rgba.h" +#include "agg_pixfmt_rgb_packed.h" + #include "agg_rasterizer_scanline_aa.h" +#include "agg_scanline_u.h" +#include "agg_renderer_scanline.h" #include "agg_scanline_p.h" //raster text @@ -49,6 +55,14 @@ #include "agg_renderer_outline_image.h" #include "agg_rasterizer_outline_aa.h" +#include "agg_image_accessors.h" +#include "agg_span_interpolator_linear.h" +#include "agg_span_image_filter_rgb.h" +#include "agg_span_image_filter_rgba.h" +#include "agg_span_image_filter_gray.h" + +#include "agg_span_allocator.h" + typedef std::map TAgg_Font_Table; static TAgg_Font_Table font_table; @@ -108,24 +122,87 @@ void Agg_init_fonts() font_table[fonts[i].name] = fonts[i].font; } -#include "agg_pixfmt_rgb.h" -#include "agg_pixfmt_rgb_packed.h" - AggDraw_Desmume aggDraw; + typedef AggDrawTargetImplementation T_AGG_RGB555; -T_AGG_RGB555 agg_targetScreen(GPU_tempScreen, 256, 384, 512); +typedef AggDrawTargetImplementation T_AGG_RGBA; + +T_AGG_RGB555 agg_targetScreen(GPU_screen, 256, 384, 512); + +static u32 luaBuffer[256*192*2]; +T_AGG_RGBA agg_targetLua((u8*)luaBuffer, 256, 384, 1024); + +static AggDrawTarget* targets[] = { + &agg_targetScreen, + &agg_targetLua +}; void Agg_init() { - aggDraw.target = &agg_targetScreen; Agg_init_fonts(); + aggDraw.target = targets[0]; } +void AggDraw_Desmume::setTarget(AggTarget newTarget) +{ + target = targets[newTarget]; +} + +void AggDraw_Desmume::composite(void* dest) +{ + //!! oh what a mess !! + + agg::rendering_buffer rBuf; + rBuf.attach((u8*)dest, 256, 384, 1024); + + typedef agg::image_accessor_clip img_source_type; + + img_source_type img_src(agg_targetLua.pixf, T_AGG_RGBA::pixfmt::color_type(0,255,0,0)); + + agg::trans_affine img_mtx; + typedef agg::span_interpolator_linear<> interpolator_type; + interpolator_type interpolator(img_mtx); + typedef agg::span_image_filter_rgba_nn span_gen_type; + span_gen_type sg(img_src, interpolator); + + agg::rasterizer_scanline_aa<> ras; + //dont know whether this is necessary + //ras.clip_box(0, 0, 256,384); + agg::scanline_u8 sl; + + //I can't believe we're using a polygon for a rectangle. + //there must be a better way + agg::path_storage path; + path.move_to(0, 0); + path.line_to(255, 0); + path.line_to(255, 383); + path.line_to(0, 383); + path.close_polygon(); + + + T_AGG_RGBA::pixfmt pixf(rBuf); + T_AGG_RGBA::RendererBase rbase(pixf); + agg::span_allocator sa; + + ras.add_path(path); + agg::render_scanlines_bin(ras, sl, rbase, sa, sg); + +} + +static int ctr=0; + //temporary, just for testing the lib void AGGDraw() { + aggDraw.setTarget(AggTarget_Lua); + + aggDraw.target->clear(); + + ctr++; + aggDraw.target->set_color(0, 255, 0, 128); - aggDraw.target->solid_rectangle(100, 100, 200, 200); + int add = (int)(40*cos((double)ctr/20.0f)); + aggDraw.target->solid_rectangle(100 +add , 100, 200 + add, 200); aggDraw.target->set_gamma(99999); aggDraw.target->set_color(255, 64, 64, 128); @@ -135,9 +212,9 @@ void AGGDraw() { aggDraw.target->solid_ellipse(70, 80, 50, 50); aggDraw.target->set_font("verdana18_bold"); - aggDraw.target->set_color(255, 0, 255, 128); + aggDraw.target->set_color(255, 0, 255, 255); aggDraw.target->render_text(60,60, "testing testing testing"); - + // //agg_draw_line_pattern(64, 19, 14, 126, 118, 266, 19, 265, .76, 4.69, "C:\\7.bmp"); } diff --git a/desmume/src/aggdraw.h b/desmume/src/aggdraw.h index 2a1d3558e..95bd6fd4a 100644 --- a/desmume/src/aggdraw.h +++ b/desmume/src/aggdraw.h @@ -30,9 +30,9 @@ #include "agg_color_rgba.h" #include "agg_rendering_buffer.h" -#include "agg_renderer_base.h" -#include "agg_renderer_primitives.h" -#include "agg_renderer_scanline.h" +#include "agg_renderer_base.h" +#include "agg_renderer_primitives.h" +#include "agg_renderer_scanline.h" #include "agg_bounding_rect.h" class AggDrawTarget @@ -41,6 +41,9 @@ public: virtual void set_color(int r, int g, int b, int a) = 0; virtual void set_gamma(int gamma) = 0; virtual void set_font(const std::string& name) = 0; + + virtual void set_pixel(int x, int y) = 0; + virtual void clear() = 0; virtual void render_text(int x, int y, const std::string& str) = 0; virtual void solid_ellipse(int x, int y, int rx, int ry) = 0; @@ -50,33 +53,35 @@ public: static const agg::int8u* lookupFont(const std::string& name); }; -template +template class AggDrawTargetImplementation : public AggDrawTarget { public: + typedef PIXFMT pixfmt; + // The AGG base typedef agg::renderer_base RendererBase; - // The AGG primitives renderer + // The AGG primitives renderer typedef agg::renderer_primitives RendererPrimitives; - // The AGG solid renderer + // The AGG solid renderer typedef agg::renderer_scanline_aa_solid RendererSolid; //the order of declaration matters in order to make these variables get setup correctly agg::rendering_buffer rBuf; pixfmt pixf; - RendererBase rbase; + RendererBase rbase; RendererPrimitives rprim; AggDrawTargetImplementation(agg::int8u* buf, int width, int height, int stride) : rBuf(buf,width,height,stride) - , pixf(rBuf) - , rbase(pixf) - , rprim(rbase) - { - } + , pixf(rBuf) + , rbase(pixf) + , rprim(rbase) + { + } typedef typename pixfmt::color_type color_type; @@ -96,6 +101,17 @@ public: virtual void set_gamma(int gamma) { renderState.gamma = gamma; } virtual void set_font(const std::string& name) { renderState.font = lookupFont(name); } + virtual void set_pixel(int x, int y) + { + pixf.copy_pixel(x, y, renderState.color); + } + + virtual void clear() + { + static color_type transparentBlack(0,0,0,0); + rbase.clear(transparentBlack); + } + virtual void render_text(int x, int y, const std::string& str) { typedef agg::renderer_base ren_base; @@ -110,15 +126,15 @@ public: rt.render_text(x, y, str.c_str(), true); //flipy } - virtual void solid_ellipse(int x, int y, int rx, int ry) - { - rprim.fill_color(renderState.color); - rprim.solid_ellipse(x, y, rx, ry); + virtual void solid_ellipse(int x, int y, int rx, int ry) + { + rprim.fill_color(renderState.color); + rprim.solid_ellipse(x, y, rx, ry); } virtual void solid_rectangle(int x1, int y1, int x2, int y2) { - rprim.fill_color(renderState.color); + rprim.fill_color(renderState.color); rprim.solid_rectangle(x1, y1, x2, y2); } @@ -154,9 +170,18 @@ public: AggDrawTarget *target; }; +enum AggTarget +{ + AggTarget_Screen = 0, + AggTarget_Lua = 1 +}; + //specialized instance for desmume; should eventually move to another file class AggDraw_Desmume : public AggDraw { +public: + void setTarget(AggTarget newTarget); + void composite(void* dest); }; extern AggDraw_Desmume aggDraw; diff --git a/desmume/src/windows/main.cpp b/desmume/src/windows/main.cpp index b0a76014d..fb0319727 100644 --- a/desmume/src/windows/main.cpp +++ b/desmume/src/windows/main.cpp @@ -83,9 +83,11 @@ #include "7zip.h" #include "pathsettings.h" #include "utils/xstring.h" - #include "directx/ddraw.h" +#include "aggdraw.h" + + using namespace std; #define HAVE_REMOTE @@ -774,6 +776,9 @@ void Display() ddsd.dwFlags=DDSD_ALL; res = lpBackSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL); + extern void AGGDraw(); + AGGDraw(); + if (res == DD_OK) { char* buffer = (char*)ddsd.lpSurface; @@ -828,6 +833,8 @@ void Display() break; } } + + //aggDraw.composite(ddsd.lpSurface); break; case 16: @@ -1469,6 +1476,8 @@ std::string GetPrivateProfileStdString(LPCSTR lpAppName,LPCSTR lpKeyName,LPCSTR int _main() { + extern void Agg_init(); + Agg_init(); InitDecoder(); #ifdef WX_STUB