From 867c17d7a39a12e175eb33f6f3d5a45ec0eec726 Mon Sep 17 00:00:00 2001 From: zeromus Date: Sat, 11 Jul 2009 06:46:46 +0000 Subject: [PATCH] more antigrain refactors --- desmume/src/agg2d.h | 231 ++++++++-- desmume/src/agg2d.inl | 535 +----------------------- desmume/src/aggdraw.cpp | 439 +++++++++++++++---- desmume/src/aggdraw.h | 58 ++- desmume/src/windows/DeSmuME_2005.vcproj | 8 + desmume/src/windows/main.cpp | 2 +- 6 files changed, 623 insertions(+), 650 deletions(-) diff --git a/desmume/src/agg2d.h b/desmume/src/agg2d.h index 9f2a76c86..bcdc082f5 100644 --- a/desmume/src/agg2d.h +++ b/desmume/src/agg2d.h @@ -16,6 +16,7 @@ //---------------------------------------------------------------------------- // // 25 Jan 2007 - Ported to AGG 2.4 Jerry Evans (jerry@novadsp.com) +// 11 Jul 2009 - significant refactors for introduction to desmume // //---------------------------------------------------------------------------- @@ -67,8 +68,21 @@ //+ JME #include "agg_image_accessors.h" -#define AGG2D_TEMPLATE template -#define AGG2D_TEMPLATE_ARG +#define AGG2D_TEMPLATE template +#define AGG2D_TEMPLATE_WITH_IMAGE template +#define AGG2D_TEMPLATE_ARG +#define AGG2D_IMAGE_TEMPLATE template +#define AGG2D_IMAGE_TEMPLATE_ARG +#define TIMAGE Agg2DBase :: Image AGG2D_IMAGE_TEMPLATE_ARG + + +template +class PixFormatSet +{ +public: + typedef Main PixFormat; + typedef Pre PixFormatPre; +}; class Agg2DBase { @@ -137,11 +151,13 @@ public: double affineMatrix[6]; }; - struct Image + AGG2D_IMAGE_TEMPLATE struct Image { agg::rendering_buffer renBuf; - Image() {} + Image(const agg::rendering_buffer& srcBuf) + : renBuf(srcBuf) + {} Image(unsigned char* buf, unsigned width, unsigned height, int stride) : renBuf(buf, width, height, stride) {} void attach(unsigned char* buf, unsigned width, unsigned height, int stride) @@ -150,8 +166,18 @@ public: } int width() const { return renBuf.width(); } int height() const { return renBuf.height(); } - AGG2D_TEMPLATE void premultiply(); - AGG2D_TEMPLATE void demultiply(); + AGG2D_TEMPLATE void premultiply() +{ + PixFormat pixf(renBuf); + pixf.premultiply(); +} + + AGG2D_TEMPLATE void demultiply() +{ + PixFormat pixf(renBuf); + pixf.demultiply(); +} + }; enum ImageFilter @@ -219,9 +245,12 @@ public: }; -AGG2D_TEMPLATE class Agg2D : public Agg2DBase + +template class Agg2D : public Agg2DBase { public: + typedef typename PixFormatSet::PixFormat PixFormat; + typedef Image MyImage; typedef agg::order_bgra ComponentOrder; // Platform dependent! typedef agg::rgba8 ColorType; @@ -238,7 +267,7 @@ public: typedef agg::pixfmt_custom_blend_rgba PixFormatComp; // JME //typedef agg::pixel_formats_rgba PixFormatPre; - typedef agg::pixfmt_bgra32_pre PixFormatPre; + typedef typename PixFormatSet::PixFormatPre PixFormatPre; // JME //typedef agg::pixfmt_custom_blend_rgba PixFormatCompPre; typedef agg::pixfmt_custom_blend_rgba PixFormatCompPre; @@ -279,7 +308,7 @@ public: }; public: - AGG2D_TEMPLATE friend class Agg2DRenderer; + AGG2D_TEMPLATE_WITH_IMAGE friend class Agg2DRenderer; typedef ColorType Color; @@ -337,7 +366,7 @@ public: // Setup //----------------------- void attach(unsigned char* buf, unsigned width, unsigned height, int stride); - void attach(Image& img); + void attach(MyImage& img); void clipBox(double x1, double y1, double x2, double y2); RectD clipBox() const; @@ -402,7 +431,7 @@ public: void lineRadialGradient(double x, double y, double r); void lineWidth(double w); - double lineWidth(double w) const; + double lineWidth() const; void lineCap(LineCap cap); LineCap lineCap() const; @@ -540,46 +569,155 @@ public: void imageResample(ImageResample f); ImageResample imageResample() const; - void transformImage(const Image& img, + //--------- + //if anyone can figure out how to put these in the .inl file, theyre more than welcome to. I couldnt declare them correctly to match + //the .h file declaration + + AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, - double dstX1, double dstY1, double dstX2, double dstY2); + double dstX1, double dstY1, double dstX2, double dstY2) + { + resetPath(); + moveTo(dstX1, dstY1); + lineTo(dstX2, dstY1); + lineTo(dstX2, dstY2); + lineTo(dstX1, dstY2); + closePolygon(); + double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; + renderImage (img, imgX1, imgY1, imgX2, imgY2, parallelogram); + } - void transformImage(const Image& img, - double dstX1, double dstY1, double dstX2, double dstY2); + AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, + double dstX1, double dstY1, double dstX2, double dstY2) + { + resetPath(); + moveTo(dstX1, dstY1); + lineTo(dstX2, dstY1); + lineTo(dstX2, dstY2); + lineTo(dstX1, dstY2); + closePolygon(); + double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; + renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); + } - void transformImage(const Image& img, + + AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, - const double* parallelogram); - - void transformImage(const Image& img, const double* parallelogram); + const double* parallelogram) + { + resetPath(); + moveTo(parallelogram[0], parallelogram[1]); + lineTo(parallelogram[2], parallelogram[3]); + lineTo(parallelogram[4], parallelogram[5]); + lineTo(parallelogram[0] + parallelogram[4] - parallelogram[2], + parallelogram[1] + parallelogram[5] - parallelogram[3]); + closePolygon(); + renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); + } - void transformImagePath(const Image& img, + AGG2D_IMAGE_TEMPLATE void transformImage(const TIMAGE& img, const double* parallelogram) +{ + resetPath(); + moveTo(parallelogram[0], parallelogram[1]); + lineTo(parallelogram[2], parallelogram[3]); + lineTo(parallelogram[4], parallelogram[5]); + lineTo(parallelogram[0] + parallelogram[4] - parallelogram[2], + parallelogram[1] + parallelogram[5] - parallelogram[3]); + closePolygon(); + renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); +} + + + + AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, - double dstX1, double dstY1, double dstX2, double dstY2); + double dstX1, double dstY1, double dstX2, double dstY2) + { + double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; + renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); +} - void transformImagePath(const Image& img, - double dstX1, double dstY1, double dstX2, double dstY2); - void transformImagePath(const Image& img, + AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, + double dstX1, double dstY1, double dstX2, double dstY2) +{ + double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; + renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); +} + + + + AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, - const double* parallelogram); + const double* parallelogram) + { + renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); +} + + + AGG2D_IMAGE_TEMPLATE void transformImagePath(const TIMAGE& img, const double* parallelogram) +{ + renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); +} - void transformImagePath(const Image& img, const double* parallelogram); // Image Blending (no transformations available) - void blendImage(Image& img, + AGG2D_IMAGE_TEMPLATE void blendImage(TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, - double dstX, double dstY, unsigned alpha=255); - void blendImage(Image& img, double dstX, double dstY, unsigned alpha=255); + double dstX, double dstY, unsigned alpha=255) +{ + worldToScreen(dstX, dstY); + PixFormat pixF(img.renBuf); + // JME + //agg::rect r(imgX1, imgY1, imgX2, imgY2); + Rect r(imgX1, imgY1, imgX2, imgY2); + if(m_blendMode == BlendAlpha) + { + m_renBasePre.blend_from(pixF, &r, int(dstX)-imgX1, int(dstY)-imgY1, alpha); + } + else + { + m_renBaseCompPre.blend_from(pixF, &r, int(dstX)-imgX1, int(dstY)-imgY1, alpha); + } +} + + + AGG2D_IMAGE_TEMPLATE void blendImage(TIMAGE& img, double dstX, double dstY, unsigned alpha=255) +{ + worldToScreen(dstX, dstY); + PixFormat pixF(img.renBuf); + m_renBasePre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); + if(m_blendMode == BlendAlpha) + { + m_renBasePre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); + } + else + { + m_renBaseCompPre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); + } +} + // Copy image directly, together with alpha-channel - void copyImage(Image& img, + AGG2D_IMAGE_TEMPLATE void copyImage(TIMAGE& img, int imgX1, int imgY1, int imgX2, int imgY2, - double dstX, double dstY); - void copyImage(Image& img, double dstX, double dstY); + double dstX, double dstY) +{ + worldToScreen(dstX, dstY); + // JME + //agg::rect r(imgX1, imgY1, imgX2, imgY2); + Rect r(imgX1, imgY1, imgX2, imgY2); + m_renBase.copy_from(img.renBuf, &r, int(dstX)-imgX1, int(dstY)-imgY1); +} + + AGG2D_IMAGE_TEMPLATE void copyImage(TIMAGE& img, double dstX, double dstY) +{ + worldToScreen(dstX, dstY); + m_renBase.copy_from(img.renBuf, 0, int(dstX), int(dstY)); +} // State //----------------------- @@ -596,6 +734,7 @@ public: static double rad2Deg(double v) { return v * 180.0 / agg::pi; } PixFormat & pixFormat() { return m_pixFormat; } + agg::rendering_buffer & buf() { return m_rbuf; } private: void render(bool fillColor); @@ -606,7 +745,33 @@ private: void addLine(double x1, double y1, double x2, double y2); void updateRasterizerGamma(); - void renderImage(const Image& img, int x1, int y1, int x2, int y2, const double* parl); + AGG2D_IMAGE_TEMPLATE void renderImage(const TIMAGE& img, int x1, int y1, int x2, int y2, const double* parl) +{ + agg::trans_affine mtx((double)x1, + (double)y1, + (double)x2, + (double)y2, + parl); + mtx *= m_transform; + mtx.invert(); + + m_rasterizer.reset(); + m_rasterizer.add_path(m_pathTransform); + + typedef agg::span_interpolator_linear Interpolator; + Interpolator interpolator(mtx); + + if(m_blendMode == BlendAlpha) + { + // JME audit - + Agg2DRenderer::renderImage(*this, img, m_renBasePre, interpolator); + } + else + { + Agg2DRenderer::renderImage(*this, img, m_renBaseCompPre, interpolator); + } +} + void updateTransformations(); diff --git a/desmume/src/agg2d.inl b/desmume/src/agg2d.inl index 4761055ad..866e521a6 100644 --- a/desmume/src/agg2d.inl +++ b/desmume/src/agg2d.inl @@ -16,6 +16,7 @@ //---------------------------------------------------------------------------- // // 25 Jan 2007 - Ported to AGG 2.4 Jerry Evans (jerry@novadsp.com) +// 11 Jul 2009 - significant refactors for introduction to desmume // //---------------------------------------------------------------------------- #include "GPU.h" @@ -24,7 +25,7 @@ static const double g_approxScale = 2.0; #define TAGG2D Agg2D AGG2D_TEMPLATE_ARG -#define TAGG2DRENDERER Agg2DRenderer AGG2D_TEMPLATE_ARG +#define TAGG2DRENDERER Agg2DRenderer //AGG2D_TEMPLATE inline bool operator == (const TAGG2D::Color& c1, const TAGG2D::Color& c2) //{ @@ -256,7 +257,7 @@ AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::attach(unsigned char* buf, unsign //------------------------------------------------------------------------ -AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::attach(Image& img) +AGG2D_TEMPLATE void Agg2D AGG2D_TEMPLATE_ARG ::attach(MyImage& img) { attach(img.renBuf.buf(), img.renBuf.width(), img.renBuf.height(), img.renBuf.stride()); } @@ -824,7 +825,7 @@ AGG2D_TEMPLATE void TAGG2D::lineWidth(double w) //------------------------------------------------------------------------ -AGG2D_TEMPLATE double TAGG2D::lineWidth(double w) const +AGG2D_TEMPLATE double TAGG2D::lineWidth() const { return m_lineWidth; } @@ -1573,90 +1574,7 @@ AGG2D_TEMPLATE Agg2DBase::ImageResample TAGG2D::imageResample() const return m_imageResample; } - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::transformImage(const Image& img, int imgX1, int imgY1, int imgX2, int imgY2, - double dstX1, double dstY1, double dstX2, double dstY2) -{ - resetPath(); - moveTo(dstX1, dstY1); - lineTo(dstX2, dstY1); - lineTo(dstX2, dstY2); - lineTo(dstX1, dstY2); - closePolygon(); - double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; - renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); -} - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::transformImage(const Image& img, double dstX1, double dstY1, double dstX2, double dstY2) -{ - resetPath(); - moveTo(dstX1, dstY1); - lineTo(dstX2, dstY1); - lineTo(dstX2, dstY2); - lineTo(dstX1, dstY2); - closePolygon(); - double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; - renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); -} - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::transformImage(const Image& img, int imgX1, int imgY1, int imgX2, int imgY2, - const double* parallelogram) -{ - resetPath(); - moveTo(parallelogram[0], parallelogram[1]); - lineTo(parallelogram[2], parallelogram[3]); - lineTo(parallelogram[4], parallelogram[5]); - lineTo(parallelogram[0] + parallelogram[4] - parallelogram[2], - parallelogram[1] + parallelogram[5] - parallelogram[3]); - closePolygon(); - renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); -} - - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::transformImage(const Image& img, const double* parallelogram) -{ - resetPath(); - moveTo(parallelogram[0], parallelogram[1]); - lineTo(parallelogram[2], parallelogram[3]); - lineTo(parallelogram[4], parallelogram[5]); - lineTo(parallelogram[0] + parallelogram[4] - parallelogram[2], - parallelogram[1] + parallelogram[5] - parallelogram[3]); - closePolygon(); - renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); -} - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::transformImagePath(const Image& img, int imgX1, int imgY1, int imgX2, int imgY2, - double dstX1, double dstY1, double dstX2, double dstY2) -{ - double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; - renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); -} - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::transformImagePath(const Image& img, double dstX1, double dstY1, double dstX2, double dstY2) -{ - double parallelogram[6] = { dstX1, dstY1, dstX2, dstY1, dstX2, dstY2 }; - renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); -} - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::transformImagePath(const Image& img, int imgX1, int imgY1, int imgX2, int imgY2, - const double* parallelogram) -{ - renderImage(img, imgX1, imgY1, imgX2, imgY2, parallelogram); -} - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::transformImagePath(const Image& img, const double* parallelogram) -{ - renderImage(img, 0, 0, img.renBuf.width(), img.renBuf.height(), parallelogram); -} - +//==============moved to .h file=========== //------------------------------------------------------------------------ @@ -1708,11 +1626,11 @@ AGG2D_TEMPLATE void TAGG2D::drawPath(DrawPathFlag flag) //------------------------------------------------------------------------ -AGG2D_TEMPLATE class Agg2DRenderer +AGG2D_TEMPLATE_WITH_IMAGE class Agg2DRenderer { public: typedef typename TAGG2D::Color Color; - typedef typename TAGG2D::Image Image; + typedef typename TIMAGE Image; //-------------------------------------------------------------------- template void static render(TAGG2D& gr, BaseRenderer& renBase, SolidRenderer& renSolid, bool fillColor) @@ -1799,7 +1717,7 @@ public: class SpanConvImageBlend { public: - SpanConvImageBlend(Agg2D::BlendMode m, Color c) : + SpanConvImageBlend(Agg2DBase::BlendMode m, Color c) : m_mode(m), m_color(c) {} @@ -1896,14 +1814,14 @@ public: //-------------------------------------------------------------------- //! JME - this is where the bulk of the changes have taken place. template - static void renderImage(TAGG2D& gr, const Image& img, + static void renderImage(TAGG2D& gr, const TIMAGE& img, BaseRenderer& renBase, Interpolator& interpolator) { //! JME - have not quite figured which part of this is not const-correct // hence the cast. Image& imgc = const_cast(img); - TAGG2D::PixFormat img_pixf(imgc.renBuf); - typedef agg::image_accessor_clone img_source_type; + ImagePixFormatSet::PixFormat img_pixf(imgc.renBuf); + typedef agg::image_accessor_clone img_source_type; img_source_type source(img_pixf); SpanConvImageBlend blend(gr.m_imageBlendMode, gr.m_imageBlendColor); @@ -2017,35 +1935,6 @@ AGG2D_TEMPLATE void TAGG2D::render(FontRasterizer& ras, FontScanline& sl) #endif -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::renderImage(const Image& img, int x1, int y1, int x2, int y2, - const double* parl) -{ - agg::trans_affine mtx((double)x1, - (double)y1, - (double)x2, - (double)y2, - parl); - mtx *= m_transform; - mtx.invert(); - - m_rasterizer.reset(); - m_rasterizer.add_path(m_pathTransform); - - typedef agg::span_interpolator_linear Interpolator; - Interpolator interpolator(mtx); - - if(m_blendMode == BlendAlpha) - { - // JME audit - - Agg2DRenderer::renderImage(*this, img, m_renBasePre, interpolator); - } - else - { - Agg2DRenderer::renderImage(*this, img, m_renBaseCompPre, interpolator); - } -} - //------------------------------------------------------------------------ AGG2D_TEMPLATE struct Agg2DRasterizerGamma { @@ -2067,405 +1956,3 @@ AGG2D_TEMPLATE void TAGG2D::updateRasterizerGamma() m_rasterizer.gamma(Agg2DRasterizerGamma(m_masterAlpha, m_antiAliasGamma)); } -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::blendImage(Image& img, - int imgX1, int imgY1, int imgX2, int imgY2, - double dstX, double dstY, unsigned alpha) -{ - worldToScreen(dstX, dstY); - PixFormat pixF(img.renBuf); - // JME - //agg::rect r(imgX1, imgY1, imgX2, imgY2); - Rect r(imgX1, imgY1, imgX2, imgY2); - if(m_blendMode == BlendAlpha) - { - m_renBasePre.blend_from(pixF, &r, int(dstX)-imgX1, int(dstY)-imgY1, alpha); - } - else - { - m_renBaseCompPre.blend_from(pixF, &r, int(dstX)-imgX1, int(dstY)-imgY1, alpha); - } -} - - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::blendImage(Image& img, double dstX, double dstY, unsigned alpha) -{ - worldToScreen(dstX, dstY); - PixFormat pixF(img.renBuf); - m_renBasePre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); - if(m_blendMode == BlendAlpha) - { - m_renBasePre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); - } - else - { - m_renBaseCompPre.blend_from(pixF, 0, int(dstX), int(dstY), alpha); - } -} - - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::copyImage(Image& img, - int imgX1, int imgY1, int imgX2, int imgY2, - double dstX, double dstY) -{ - worldToScreen(dstX, dstY); - // JME - //agg::rect r(imgX1, imgY1, imgX2, imgY2); - Rect r(imgX1, imgY1, imgX2, imgY2); - m_renBase.copy_from(img.renBuf, &r, int(dstX)-imgX1, int(dstY)-imgY1); -} - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void TAGG2D::copyImage(Image& img, double dstX, double dstY) -{ - worldToScreen(dstX, dstY); - m_renBase.copy_from(img.renBuf, 0, int(dstX), int(dstY)); -} - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void Agg2DBase::Image::premultiply() -{ - PixFormat pixf(renBuf); - pixf.premultiply(); -} - -//------------------------------------------------------------------------ -AGG2D_TEMPLATE void Agg2DBase::Image::demultiply() -{ - PixFormat pixf(renBuf); - pixf.demultiply(); -} - - -// -////======================== -////testing stufff -// -//int width = 256; -//int height = 384; -// -//Agg2D m_graphics; -// -//void AGGDraw(unsigned char * buffer) -// { -// m_graphics.attach(buffer, -// 256, -// 384, -// 512); -// -// m_graphics.clearAll(255, 255, 255); -// //m_graphics.clearAll(0, 0, 0); -// -// //m_graphics.blendMode(TAGG2D::BlendSub); -// //m_graphics.blendMode(TAGG2D::BlendAdd); -// -// m_graphics.antiAliasGamma(1.4); -// -// // Set flipText(true) if you have the Y axis upside down. -// //m_graphics.flipText(true); -// -// -// // ClipBox. -// //m_graphics.clipBox(50, 50, rbuf_window().width() - 50, rbuf_window().height() - 50); -// -// // Transfornations - Rotate around (300,300) to 5 degree -// //m_graphics.translate(-300, -300); -// //m_graphics.rotate(TAGG2D::deg2Rad(5.0)); -// //m_graphics.translate(300, 300); -// -// // Viewport - set 0,0,600,600 to the actual window size -// // preserving aspect ratio and placing the viewport in the center. -// // To ignore aspect ratio use TAGG2D::Anisotropic -// // Note that the viewport just adds transformations to the current -// // affine matrix. So that, set the viewport *after* all transformations! -// m_graphics.viewport(0, 0, 600, 600, -// 0, 0, width, height, -// //TAGG2D::Anisotropic); -// TAGG2D::XMidYMid); -// -// -// // Rounded Rect -// m_graphics.lineColor(0, 0, 0); -// m_graphics.noFill(); -// m_graphics.roundedRect(0.5, 0.5, 600-0.5, 600-0.5, 20.0); -///* -// -// // Reglar Text -// m_graphics.font("Times New Roman", 14.0, false, false); -// m_graphics.fillColor(0, 0, 0); -// m_graphics.noLine(); -// m_graphics.text(100, 20, "Regular Raster Text -- Fast, but can't be rotated"); -// -// // Outlined Text -// m_graphics.font("Times New Roman", 50.0, false, false, TAGG2D::VectorFontCache); -// m_graphics.lineColor(50, 0, 0); -// m_graphics.fillColor(180, 200, 100); -// m_graphics.lineWidth(1.0); -// m_graphics.text(100.5, 50.5, "Outlined Text"); -// -// // Text Alignment -// m_graphics.line(250.5-150, 150.5, 250.5+150, 150.5); -// m_graphics.line(250.5, 150.5-20, 250.5, 150.5+20); -// m_graphics.line(250.5-150, 200.5, 250.5+150, 200.5); -// m_graphics.line(250.5, 200.5-20, 250.5, 200.5+20); -// m_graphics.line(250.5-150, 250.5, 250.5+150, 250.5); -// m_graphics.line(250.5, 250.5-20, 250.5, 250.5+20); -// m_graphics.line(250.5-150, 300.5, 250.5+150, 300.5); -// m_graphics.line(250.5, 300.5-20, 250.5, 300.5+20); -// m_graphics.line(250.5-150, 350.5, 250.5+150, 350.5); -// m_graphics.line(250.5, 350.5-20, 250.5, 350.5+20); -// m_graphics.line(250.5-150, 400.5, 250.5+150, 400.5); -// m_graphics.line(250.5, 400.5-20, 250.5, 400.5+20); -// m_graphics.line(250.5-150, 450.5, 250.5+150, 450.5); -// m_graphics.line(250.5, 450.5-20, 250.5, 450.5+20); -// m_graphics.line(250.5-150, 500.5, 250.5+150, 500.5); -// m_graphics.line(250.5, 500.5-20, 250.5, 500.5+20); -// m_graphics.line(250.5-150, 550.5, 250.5+150, 550.5); -// m_graphics.line(250.5, 550.5-20, 250.5, 550.5+20); -//*/ -///* -// m_graphics.fillColor(100, 50, 50); -// m_graphics.noLine(); -// //m_graphics.textHints(false); -// m_graphics.font("Times New Roman", 40.0, false, false, TAGG2D::VectorFontCache); -// -// m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignBottom); -// m_graphics.text(250.0, 150.0, "Left-Bottom", true, 0, 0); -// -// m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignBottom); -// m_graphics.text(250.0, 200.0, "Center-Bottom", true, 0, 0); -// -// m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignBottom); -// m_graphics.text(250.0, 250.0, "Right-Bottom", true, 0, 0); -// -// m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignCenter); -// m_graphics.text(250.0, 300.0, "Left-Center", true, 0, 0); -// -// m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); -// m_graphics.text(250.0, 350.0, "Center-Center", true, 0, 0); -// -// m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignCenter); -// m_graphics.text(250.0, 400.0, "Right-Center", true, 0, 0); -// -// m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignTop); -// m_graphics.text(250.0, 450.0, "Left-Top", true, 0, 0); -// -// m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignTop); -// m_graphics.text(250.0, 500.0, "Center-Top", true, 0, 0); -// -// m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignTop); -// m_graphics.text(250.0, 550.0, "Right-Top", true, 0, 0); -// -//*/ -// // Gradients (Aqua Buttons) -// //======================================= -// m_graphics.font("Verdana", 20.0, false, false, TAGG2D::VectorFontCache); -// double xb1 = 400; -// double yb1 = 80; -// double xb2 = xb1 + 150; -// double yb2 = yb1 + 36; -// -// m_graphics.fillColor(TAGG2D::Color(0,50,180,180)); -// m_graphics.lineColor(TAGG2D::Color(0,0,80, 255)); -// m_graphics.lineWidth(1.0); -// m_graphics.roundedRect(xb1, yb1, xb2, yb2, 12, 18); -// -// m_graphics.lineColor(TAGG2D::Color(0,0,0,0)); -// m_graphics.fillLinearGradient(xb1, yb1, xb1, yb1+30, -// TAGG2D::Color(100,200,255,255), -// TAGG2D::Color(255,255,255,0)); -// m_graphics.roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1); -// -// m_graphics.fillColor(TAGG2D::Color(0,0,50, 200)); -// m_graphics.noLine(); -///* m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); -// m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, "Aqua Button", true, 0.0, 0.0); -//*/ -// m_graphics.fillLinearGradient(xb1, yb2-20, xb1, yb2-3, -// TAGG2D::Color(0, 0, 255,0), -// TAGG2D::Color(100,255,255,255)); -// m_graphics.roundedRect(xb1+3, yb2-20, xb2-3, yb2-2, 1, 1, 9, 18); -// -// -// // Aqua Button Pressed -// xb1 = 400; -// yb1 = 30; -// xb2 = xb1 + 150; -// yb2 = yb1 + 36; -// -// m_graphics.fillColor(TAGG2D::Color(0,50,180,180)); -// m_graphics.lineColor(TAGG2D::Color(0,0,0, 255)); -// m_graphics.lineWidth(2.0); -// m_graphics.roundedRect(xb1, yb1, xb2, yb2, 12, 18); -// -// m_graphics.lineColor(TAGG2D::Color(0,0,0,0)); -// m_graphics.fillLinearGradient(xb1, yb1+2, xb1, yb1+25, -// TAGG2D::Color(60, 160,255,255), -// TAGG2D::Color(100,255,255,0)); -// m_graphics.roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1); -// -// m_graphics.fillColor(TAGG2D::Color(0,0,50, 255)); -// m_graphics.noLine(); -///* m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); -// m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, "Aqua Pressed", 0.0, 0.0); -//*/ -// m_graphics.fillLinearGradient(xb1, yb2-25, xb1, yb2-5, -// TAGG2D::Color(0, 180,255,0), -// TAGG2D::Color(0, 200,255,255)); -// m_graphics.roundedRect(xb1+3, yb2-25, xb2-3, yb2-2, 1, 1, 9, 18); -// -// -// -// -// // Basic Shapes -- Ellipse -// //=========================================== -// m_graphics.lineWidth(3.5); -// m_graphics.lineColor(20, 80, 80); -// m_graphics.fillColor(200, 255, 80, 200); -// m_graphics.ellipse(450, 200, 50, 90); -// -// -// // Paths -// //=========================================== -// m_graphics.resetPath(); -// m_graphics.fillColor(255, 0, 0, 100); -// m_graphics.lineColor(0, 0, 255, 100); -// m_graphics.lineWidth(2); -// m_graphics.moveTo(300/2, 200/2); -// m_graphics.horLineRel(-150/2); -// m_graphics.arcRel(150/2, 150/2, 0, 1, 0, 150/2, -150/2); -// m_graphics.closePolygon(); -// m_graphics.drawPath(); -// -// m_graphics.resetPath(); -// m_graphics.fillColor(255, 255, 0, 100); -// m_graphics.lineColor(0, 0, 255, 100); -// m_graphics.lineWidth(2); -// m_graphics.moveTo(275/2, 175/2); -// m_graphics.verLineRel(-150/2); -// m_graphics.arcRel(150/2, 150/2, 0, 0, 0, -150/2, 150/2); -// m_graphics.closePolygon(); -// m_graphics.drawPath(); -// -// -// m_graphics.resetPath(); -// m_graphics.noFill(); -// m_graphics.lineColor(127, 0, 0); -// m_graphics.lineWidth(5); -// m_graphics.moveTo(600/2, 350/2); -// m_graphics.lineRel(50/2, -25/2); -// m_graphics.arcRel(25/2, 25/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); -// m_graphics.lineRel(50/2, -25/2); -// m_graphics.arcRel(25/2, 50/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); -// m_graphics.lineRel(50/2, -25/2); -// m_graphics.arcRel(25/2, 75/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); -// m_graphics.lineRel(50, -25); -// m_graphics.arcRel(25/2, 100/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); -// m_graphics.lineRel(50/2, -25/2); -// m_graphics.drawPath(); -// -// -// // Master Alpha. From now on everything will be translucent -// //=========================================== -// m_graphics.masterAlpha(0.85); -// -// -// // Image Transformations -// //=========================================== -///* TAGG2D::Image img(rbuf_img(0).buf(), -// rbuf_img(0).width(), -// rbuf_img(0).height(), -// rbuf_img(0).stride()); -// m_graphics.imageFilter(TAGG2D::Bilinear); -// -// //m_graphics.imageResample(TAGG2D::NoResample); -// //m_graphics.imageResample(TAGG2D::ResampleAlways); -// m_graphics.imageResample(TAGG2D::ResampleOnZoomOut); -// -// // Set the initial image blending operation as BlendDst, that actually -// // does nothing. -// //----------------- -// m_graphics.imageBlendMode(TAGG2D::BlendDst); -// -// -// // Transform the whole image to the destination rectangle -// //----------------- -// //m_graphics.transformImage(img, 450, 200, 595, 350); -// -// // Transform the rectangular part of the image to the destination rectangle -// //----------------- -// //m_graphics.transformImage(img, 60, 60, img.width()-60, img.height()-60, -// // 450, 200, 595, 350); -// -// // Transform the whole image to the destination parallelogram -// //----------------- -// //double parl[6] = { 450, 200, 595, 220, 575, 350 }; -// //m_graphics.transformImage(img, parl); -// -// // Transform the rectangular part of the image to the destination parallelogram -// //----------------- -// //double parl[6] = { 450, 200, 595, 220, 575, 350 }; -// //m_graphics.transformImage(img, 60, 60, img.width()-60, img.height()-60, parl); -// -// // Transform image to the destination path. The scale is determined by a rectangle -// //----------------- -// //m_graphics.resetPath(); -// //m_graphics.moveTo(450, 200); -// //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); -// //m_graphics.lineTo(470, 340); -// //m_graphics.transformImagePath(img, 450, 200, 595, 350); -// -// -// // Transform image to the destination path. -// // The scale is determined by a rectangle -// //----------------- -// m_graphics.resetPath(); -// m_graphics.moveTo(450, 200); -// m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); -// m_graphics.lineTo(470, 340); -// m_graphics.transformImagePath(img, 60, 60, img.width()-60, img.height()-60, -// 450, 200, 595, 350); -// -// // Transform image to the destination path. -// // The transformation is determined by a parallelogram -// //m_graphics.resetPath(); -// //m_graphics.moveTo(450, 200); -// //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); -// //m_graphics.lineTo(470, 340); -// //double parl[6] = { 450, 200, 595, 220, 575, 350 }; -// //m_graphics.transformImagePath(img, parl); -// -// // Transform the rectangular part of the image to the destination path. -// // The transformation is determined by a parallelogram -// //m_graphics.resetPath(); -// //m_graphics.moveTo(450, 200); -// //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); -// //m_graphics.lineTo(470, 340); -// //double parl[6] = { 450, 200, 595, 220, 575, 350 }; -// //m_graphics.transformImagePath(img, 60, 60, img.width()-60, img.height()-60, parl); -//*/ -// -// // Add/Sub/Contrast Blending Modes -// m_graphics.noLine(); -// m_graphics.fillColor(70, 70, 0); -// m_graphics.blendMode(TAGG2D::BlendAdd); -// m_graphics.ellipse(500, 280, 20, 40); -// -// m_graphics.fillColor(255, 255, 255); -// m_graphics.blendMode(TAGG2D::BlendContrast); -// m_graphics.ellipse(500+40, 280, 20, 40); -// -// -// -// // Radial gradient. -// m_graphics.blendMode(TAGG2D::BlendAlpha); -// m_graphics.fillRadialGradient(400, 500, 40, -// TAGG2D::Color(255, 255, 0, 0), -// TAGG2D::Color(0, 0, 127), -// TAGG2D::Color(0, 255, 0, 0)); -// m_graphics.ellipse(400, 500, 40, 40); -// -// } -// \ No newline at end of file diff --git a/desmume/src/aggdraw.cpp b/desmume/src/aggdraw.cpp index 23cad4929..d7d4e6abe 100644 --- a/desmume/src/aggdraw.cpp +++ b/desmume/src/aggdraw.cpp @@ -63,27 +63,27 @@ #include "agg_span_allocator.h" -typedef std::map TAgg_Font_Table; -static TAgg_Font_Table font_table; - AggDraw_Desmume aggDraw; -typedef AggDrawTargetImplementation T_AGG_RGB555; -typedef AggDrawTargetImplementation T_AGG_RGBA; +typedef AggDrawTargetImplementation > T_AGG_RGB555; +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 u32 hudBuffer[256*192*2]; +T_AGG_RGBA agg_targetHud((u8*)hudBuffer, 256, 384, 1024); + static AggDrawTarget* targets[] = { &agg_targetScreen, - &agg_targetLua + &agg_targetHud, + &agg_targetLua, }; void Agg_init() { - //Agg_init_fonts(); aggDraw.target = targets[0]; } @@ -94,81 +94,366 @@ void AggDraw_Desmume::setTarget(AggTarget newTarget) void AggDraw_Desmume::composite(void* dest) { - //!! oh what a mess !! + T_AGG_RGBA target((u8*)dest, 256, 384, 1024); - 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.pixFormat(), 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); + //if lua is nonempty, blend it + if(!agg_targetLua.empty) + { + T_AGG_RGBA::MyImage luaImage(agg_targetLua.buf()); + target.transformImage(luaImage, 0.5,0.5,256-0.5,384-0.5); + } + //if hud is nonempty, blend it + if(!agg_targetHud.empty) + { + T_AGG_RGBA::MyImage hudImage(agg_targetHud.buf()); + target.transformImage(hudImage, 0.5,0.5,256-0.5,384-0.5); + } } -// -//static int ctr=0; -// -////temporary, just for testing the lib -void AGGDraw() { -// - aggDraw.setTarget(AggTarget_Lua); -// -// aggDraw.target->clear(); -// -// ctr++; -// - +//temporary, just for testing the lib +void AGGDraw() { + + aggDraw.setTarget(AggTarget_Lua); + + aggDraw.target->clear(); aggDraw.target->lineColor(0, 255, 0, 128); - aggDraw.target->noFill(); -// int add = (int)(40*cos((double)ctr/20.0f)); - aggDraw.target->roundedRect(0.5, 0.5, 600-0.5, 600-0.5, 20.0); -// -// aggDraw.target->set_gamma(99999); -// aggDraw.target->set_color(255, 64, 64, 128); -// aggDraw.target->solid_triangle(0, 60, 200, 170, 100, 310); -// -// aggDraw.target->set_color(255, 0, 0, 128); -// aggDraw.target->solid_ellipse(70, 80, 50, 50); -// -// aggDraw.target->set_font("verdana18_bold"); -// aggDraw.target->set_color(255, 0, 255, 255); -// aggDraw.target->render_text(60,60, "testing testing testing"); -// -// aggDraw.target->line(60, 90, 100, 100, 4); -// -// aggDraw.target->marker(200, 200, 40, 4); -// aggDraw.target->marker(100, 300, 40, 3); -// // -// //agg_draw_line_pattern(64, 19, 14, 126, 118, 266, 19, 265, .76, 4.69, "C:\\7.bmp"); + aggDraw.target->fillColor(0, 255, 0, 128); + //aggDraw.target->noFill(); + aggDraw.target->lineWidth(1.0); + aggDraw.target->roundedRect(10,10,256-10,192-10,4); } + + +// +////======================== +////testing stufff +// +//int width = 256; +//int height = 384; +// +//Agg2D m_graphics; +// +//void AGGDraw(unsigned char * buffer) +// { +// m_graphics.attach(buffer, +// 256, +// 384, +// 512); +// +// m_graphics.clearAll(255, 255, 255); +// //m_graphics.clearAll(0, 0, 0); +// +// //m_graphics.blendMode(TAGG2D::BlendSub); +// //m_graphics.blendMode(TAGG2D::BlendAdd); +// +// m_graphics.antiAliasGamma(1.4); +// +// // Set flipText(true) if you have the Y axis upside down. +// //m_graphics.flipText(true); +// +// +// // ClipBox. +// //m_graphics.clipBox(50, 50, rbuf_window().width() - 50, rbuf_window().height() - 50); +// +// // Transfornations - Rotate around (300,300) to 5 degree +// //m_graphics.translate(-300, -300); +// //m_graphics.rotate(TAGG2D::deg2Rad(5.0)); +// //m_graphics.translate(300, 300); +// +// // Viewport - set 0,0,600,600 to the actual window size +// // preserving aspect ratio and placing the viewport in the center. +// // To ignore aspect ratio use TAGG2D::Anisotropic +// // Note that the viewport just adds transformations to the current +// // affine matrix. So that, set the viewport *after* all transformations! +// m_graphics.viewport(0, 0, 600, 600, +// 0, 0, width, height, +// //TAGG2D::Anisotropic); +// TAGG2D::XMidYMid); +// +// +// // Rounded Rect +// m_graphics.lineColor(0, 0, 0); +// m_graphics.noFill(); +// m_graphics.roundedRect(0.5, 0.5, 600-0.5, 600-0.5, 20.0); +///* +// +// // Reglar Text +// m_graphics.font("Times New Roman", 14.0, false, false); +// m_graphics.fillColor(0, 0, 0); +// m_graphics.noLine(); +// m_graphics.text(100, 20, "Regular Raster Text -- Fast, but can't be rotated"); +// +// // Outlined Text +// m_graphics.font("Times New Roman", 50.0, false, false, TAGG2D::VectorFontCache); +// m_graphics.lineColor(50, 0, 0); +// m_graphics.fillColor(180, 200, 100); +// m_graphics.lineWidth(1.0); +// m_graphics.text(100.5, 50.5, "Outlined Text"); +// +// // Text Alignment +// m_graphics.line(250.5-150, 150.5, 250.5+150, 150.5); +// m_graphics.line(250.5, 150.5-20, 250.5, 150.5+20); +// m_graphics.line(250.5-150, 200.5, 250.5+150, 200.5); +// m_graphics.line(250.5, 200.5-20, 250.5, 200.5+20); +// m_graphics.line(250.5-150, 250.5, 250.5+150, 250.5); +// m_graphics.line(250.5, 250.5-20, 250.5, 250.5+20); +// m_graphics.line(250.5-150, 300.5, 250.5+150, 300.5); +// m_graphics.line(250.5, 300.5-20, 250.5, 300.5+20); +// m_graphics.line(250.5-150, 350.5, 250.5+150, 350.5); +// m_graphics.line(250.5, 350.5-20, 250.5, 350.5+20); +// m_graphics.line(250.5-150, 400.5, 250.5+150, 400.5); +// m_graphics.line(250.5, 400.5-20, 250.5, 400.5+20); +// m_graphics.line(250.5-150, 450.5, 250.5+150, 450.5); +// m_graphics.line(250.5, 450.5-20, 250.5, 450.5+20); +// m_graphics.line(250.5-150, 500.5, 250.5+150, 500.5); +// m_graphics.line(250.5, 500.5-20, 250.5, 500.5+20); +// m_graphics.line(250.5-150, 550.5, 250.5+150, 550.5); +// m_graphics.line(250.5, 550.5-20, 250.5, 550.5+20); +//*/ +///* +// m_graphics.fillColor(100, 50, 50); +// m_graphics.noLine(); +// //m_graphics.textHints(false); +// m_graphics.font("Times New Roman", 40.0, false, false, TAGG2D::VectorFontCache); +// +// m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignBottom); +// m_graphics.text(250.0, 150.0, "Left-Bottom", true, 0, 0); +// +// m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignBottom); +// m_graphics.text(250.0, 200.0, "Center-Bottom", true, 0, 0); +// +// m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignBottom); +// m_graphics.text(250.0, 250.0, "Right-Bottom", true, 0, 0); +// +// m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignCenter); +// m_graphics.text(250.0, 300.0, "Left-Center", true, 0, 0); +// +// m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); +// m_graphics.text(250.0, 350.0, "Center-Center", true, 0, 0); +// +// m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignCenter); +// m_graphics.text(250.0, 400.0, "Right-Center", true, 0, 0); +// +// m_graphics.textAlignment(TAGG2D::AlignLeft, TAGG2D::AlignTop); +// m_graphics.text(250.0, 450.0, "Left-Top", true, 0, 0); +// +// m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignTop); +// m_graphics.text(250.0, 500.0, "Center-Top", true, 0, 0); +// +// m_graphics.textAlignment(TAGG2D::AlignRight, TAGG2D::AlignTop); +// m_graphics.text(250.0, 550.0, "Right-Top", true, 0, 0); +// +//*/ +// // Gradients (Aqua Buttons) +// //======================================= +// m_graphics.font("Verdana", 20.0, false, false, TAGG2D::VectorFontCache); +// double xb1 = 400; +// double yb1 = 80; +// double xb2 = xb1 + 150; +// double yb2 = yb1 + 36; +// +// m_graphics.fillColor(TAGG2D::Color(0,50,180,180)); +// m_graphics.lineColor(TAGG2D::Color(0,0,80, 255)); +// m_graphics.lineWidth(1.0); +// m_graphics.roundedRect(xb1, yb1, xb2, yb2, 12, 18); +// +// m_graphics.lineColor(TAGG2D::Color(0,0,0,0)); +// m_graphics.fillLinearGradient(xb1, yb1, xb1, yb1+30, +// TAGG2D::Color(100,200,255,255), +// TAGG2D::Color(255,255,255,0)); +// m_graphics.roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1); +// +// m_graphics.fillColor(TAGG2D::Color(0,0,50, 200)); +// m_graphics.noLine(); +///* m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); +// m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, "Aqua Button", true, 0.0, 0.0); +//*/ +// m_graphics.fillLinearGradient(xb1, yb2-20, xb1, yb2-3, +// TAGG2D::Color(0, 0, 255,0), +// TAGG2D::Color(100,255,255,255)); +// m_graphics.roundedRect(xb1+3, yb2-20, xb2-3, yb2-2, 1, 1, 9, 18); +// +// +// // Aqua Button Pressed +// xb1 = 400; +// yb1 = 30; +// xb2 = xb1 + 150; +// yb2 = yb1 + 36; +// +// m_graphics.fillColor(TAGG2D::Color(0,50,180,180)); +// m_graphics.lineColor(TAGG2D::Color(0,0,0, 255)); +// m_graphics.lineWidth(2.0); +// m_graphics.roundedRect(xb1, yb1, xb2, yb2, 12, 18); +// +// m_graphics.lineColor(TAGG2D::Color(0,0,0,0)); +// m_graphics.fillLinearGradient(xb1, yb1+2, xb1, yb1+25, +// TAGG2D::Color(60, 160,255,255), +// TAGG2D::Color(100,255,255,0)); +// m_graphics.roundedRect(xb1+3, yb1+2.5, xb2-3, yb1+30, 9, 18, 1, 1); +// +// m_graphics.fillColor(TAGG2D::Color(0,0,50, 255)); +// m_graphics.noLine(); +///* m_graphics.textAlignment(TAGG2D::AlignCenter, TAGG2D::AlignCenter); +// m_graphics.text((xb1 + xb2) / 2.0, (yb1 + yb2) / 2.0, "Aqua Pressed", 0.0, 0.0); +//*/ +// m_graphics.fillLinearGradient(xb1, yb2-25, xb1, yb2-5, +// TAGG2D::Color(0, 180,255,0), +// TAGG2D::Color(0, 200,255,255)); +// m_graphics.roundedRect(xb1+3, yb2-25, xb2-3, yb2-2, 1, 1, 9, 18); +// +// +// +// +// // Basic Shapes -- Ellipse +// //=========================================== +// m_graphics.lineWidth(3.5); +// m_graphics.lineColor(20, 80, 80); +// m_graphics.fillColor(200, 255, 80, 200); +// m_graphics.ellipse(450, 200, 50, 90); +// +// +// // Paths +// //=========================================== +// m_graphics.resetPath(); +// m_graphics.fillColor(255, 0, 0, 100); +// m_graphics.lineColor(0, 0, 255, 100); +// m_graphics.lineWidth(2); +// m_graphics.moveTo(300/2, 200/2); +// m_graphics.horLineRel(-150/2); +// m_graphics.arcRel(150/2, 150/2, 0, 1, 0, 150/2, -150/2); +// m_graphics.closePolygon(); +// m_graphics.drawPath(); +// +// m_graphics.resetPath(); +// m_graphics.fillColor(255, 255, 0, 100); +// m_graphics.lineColor(0, 0, 255, 100); +// m_graphics.lineWidth(2); +// m_graphics.moveTo(275/2, 175/2); +// m_graphics.verLineRel(-150/2); +// m_graphics.arcRel(150/2, 150/2, 0, 0, 0, -150/2, 150/2); +// m_graphics.closePolygon(); +// m_graphics.drawPath(); +// +// +// m_graphics.resetPath(); +// m_graphics.noFill(); +// m_graphics.lineColor(127, 0, 0); +// m_graphics.lineWidth(5); +// m_graphics.moveTo(600/2, 350/2); +// m_graphics.lineRel(50/2, -25/2); +// m_graphics.arcRel(25/2, 25/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); +// m_graphics.lineRel(50/2, -25/2); +// m_graphics.arcRel(25/2, 50/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); +// m_graphics.lineRel(50/2, -25/2); +// m_graphics.arcRel(25/2, 75/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); +// m_graphics.lineRel(50, -25); +// m_graphics.arcRel(25/2, 100/2, TAGG2D::deg2Rad(-30), 0, 1, 50/2, -25/2); +// m_graphics.lineRel(50/2, -25/2); +// m_graphics.drawPath(); +// +// +// // Master Alpha. From now on everything will be translucent +// //=========================================== +// m_graphics.masterAlpha(0.85); +// +// +// // Image Transformations +// //=========================================== +///* TAGG2D::Image img(rbuf_img(0).buf(), +// rbuf_img(0).width(), +// rbuf_img(0).height(), +// rbuf_img(0).stride()); +// m_graphics.imageFilter(TAGG2D::Bilinear); +// +// //m_graphics.imageResample(TAGG2D::NoResample); +// //m_graphics.imageResample(TAGG2D::ResampleAlways); +// m_graphics.imageResample(TAGG2D::ResampleOnZoomOut); +// +// // Set the initial image blending operation as BlendDst, that actually +// // does nothing. +// //----------------- +// m_graphics.imageBlendMode(TAGG2D::BlendDst); +// +// +// // Transform the whole image to the destination rectangle +// //----------------- +// //m_graphics.transformImage(img, 450, 200, 595, 350); +// +// // Transform the rectangular part of the image to the destination rectangle +// //----------------- +// //m_graphics.transformImage(img, 60, 60, img.width()-60, img.height()-60, +// // 450, 200, 595, 350); +// +// // Transform the whole image to the destination parallelogram +// //----------------- +// //double parl[6] = { 450, 200, 595, 220, 575, 350 }; +// //m_graphics.transformImage(img, parl); +// +// // Transform the rectangular part of the image to the destination parallelogram +// //----------------- +// //double parl[6] = { 450, 200, 595, 220, 575, 350 }; +// //m_graphics.transformImage(img, 60, 60, img.width()-60, img.height()-60, parl); +// +// // Transform image to the destination path. The scale is determined by a rectangle +// //----------------- +// //m_graphics.resetPath(); +// //m_graphics.moveTo(450, 200); +// //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); +// //m_graphics.lineTo(470, 340); +// //m_graphics.transformImagePath(img, 450, 200, 595, 350); +// +// +// // Transform image to the destination path. +// // The scale is determined by a rectangle +// //----------------- +// m_graphics.resetPath(); +// m_graphics.moveTo(450, 200); +// m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); +// m_graphics.lineTo(470, 340); +// m_graphics.transformImagePath(img, 60, 60, img.width()-60, img.height()-60, +// 450, 200, 595, 350); +// +// // Transform image to the destination path. +// // The transformation is determined by a parallelogram +// //m_graphics.resetPath(); +// //m_graphics.moveTo(450, 200); +// //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); +// //m_graphics.lineTo(470, 340); +// //double parl[6] = { 450, 200, 595, 220, 575, 350 }; +// //m_graphics.transformImagePath(img, parl); +// +// // Transform the rectangular part of the image to the destination path. +// // The transformation is determined by a parallelogram +// //m_graphics.resetPath(); +// //m_graphics.moveTo(450, 200); +// //m_graphics.cubicCurveTo(595, 220, 575, 350, 595, 350); +// //m_graphics.lineTo(470, 340); +// //double parl[6] = { 450, 200, 595, 220, 575, 350 }; +// //m_graphics.transformImagePath(img, 60, 60, img.width()-60, img.height()-60, parl); +//*/ +// +// // Add/Sub/Contrast Blending Modes +// m_graphics.noLine(); +// m_graphics.fillColor(70, 70, 0); +// m_graphics.blendMode(TAGG2D::BlendAdd); +// m_graphics.ellipse(500, 280, 20, 40); +// +// m_graphics.fillColor(255, 255, 255); +// m_graphics.blendMode(TAGG2D::BlendContrast); +// m_graphics.ellipse(500+40, 280, 20, 40); +// +// +// +// // Radial gradient. +// m_graphics.blendMode(TAGG2D::BlendAlpha); +// m_graphics.fillRadialGradient(400, 500, 40, +// TAGG2D::Color(255, 255, 0, 0), +// TAGG2D::Color(0, 0, 127), +// TAGG2D::Color(0, 255, 0, 0)); +// m_graphics.ellipse(400, 500, 40, 40); +// +// } +// \ No newline at end of file diff --git a/desmume/src/aggdraw.h b/desmume/src/aggdraw.h index e2c0648bb..1c6fd55a9 100644 --- a/desmume/src/aggdraw.h +++ b/desmume/src/aggdraw.h @@ -44,40 +44,67 @@ class AggDrawTarget { public: + AggDrawTarget() + : empty(true) + { + } + +protected: + void dirty() { empty = false; } + void undirty() { empty = true; } + +public: + + bool empty; + + virtual void clear() = 0; + virtual void lineColor(unsigned r, unsigned g, unsigned b, unsigned a) = 0; + virtual void fillColor(unsigned r, unsigned g, unsigned b, unsigned a) = 0; virtual void noFill() = 0; + virtual void noLine() = 0; + virtual void lineWidth(double w) = 0; + virtual double lineWidth() = 0; + virtual void roundedRect(double x1, double y1, double x2, double y2,double rx_bottom, double ry_bottom,double rx_top, double ry_top) = 0; virtual void roundedRect(double x1, double y1, double x2, double y2, double r) = 0; virtual void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry) = 0; }; -template -class AggDrawTargetImplementation : public AggDrawTarget, public Agg2D +template +class AggDrawTargetImplementation : public AggDrawTarget, public Agg2D { public: - typedef PIXFMT pixfmt; + typedef typename PixFormatSet::PixFormat pixfmt; typedef typename pixfmt::color_type color_type; - typedef Agg2D BASE; + typedef Agg2D BASE; AggDrawTargetImplementation(agg::int8u* buf, int width, int height, int stride) { attach(buf,width,height,stride); - BASE::viewport(0, 0, 600, 600, - 0, 0, width, height, - //TAGG2D::Anisotropic); - XMidYMid); + BASE::viewport(0, 0, width-1, height-1, 0.5, 0.5, width-0.5, height-0.5, TAGG2D::Anisotropic); + } + + virtual void clear() { + if(!empty) + { + BASE::clearAll(0,0,0,0); + undirty(); + } } virtual void lineColor(unsigned r, unsigned g, unsigned b, unsigned a) { BASE::lineColor(r,g,b,a); } + virtual void fillColor(unsigned r, unsigned g, unsigned b, unsigned a) { BASE::fillColor(r,g,b,a); } virtual void noFill() { BASE::noFill(); } - virtual void roundedRect(double x1, double y1, double x2, double y2,double rx_bottom, double ry_bottom,double rx_top,double ry_top) - { - BASE::roundedRect(x1,y1,x2,y2,rx_bottom,ry_bottom,rx_top,ry_top); - } - virtual void roundedRect(double x1, double y1, double x2, double y2, double r) { BASE::roundedRect(x1,y1,x2,y2,r); } - virtual void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry) { BASE::roundedRect(x1,y1,x2,y2,rx,ry); } + virtual void noLine() { BASE::noLine(); } + virtual void lineWidth(double w) { BASE::lineWidth(w); } + virtual double lineWidth() { return BASE::lineWidth(); } + + virtual void roundedRect(double x1, double y1, double x2, double y2,double rx_bottom, double ry_bottom,double rx_top,double ry_top) { dirty(); BASE::roundedRect(x1,y1,x2,y2,rx_bottom,ry_bottom,rx_top,ry_top); } + virtual void roundedRect(double x1, double y1, double x2, double y2, double r) { dirty(); BASE::roundedRect(x1,y1,x2,y2,r); } + virtual void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry) { dirty(); BASE::roundedRect(x1,y1,x2,y2,rx,ry); } }; class AggDraw @@ -92,7 +119,8 @@ public: enum AggTarget { AggTarget_Screen = 0, - AggTarget_Lua = 1 + AggTarget_Hud = 1, + AggTarget_Lua = 2, }; //specialized instance for desmume; should eventually move to another file diff --git a/desmume/src/windows/DeSmuME_2005.vcproj b/desmume/src/windows/DeSmuME_2005.vcproj index 83eb3d36a..501f6b851 100644 --- a/desmume/src/windows/DeSmuME_2005.vcproj +++ b/desmume/src/windows/DeSmuME_2005.vcproj @@ -758,6 +758,14 @@ RelativePath="..\addons.h" > + + + + diff --git a/desmume/src/windows/main.cpp b/desmume/src/windows/main.cpp index bc0a3dbbc..9523c3756 100644 --- a/desmume/src/windows/main.cpp +++ b/desmume/src/windows/main.cpp @@ -778,7 +778,7 @@ void Display() res = lpBackSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL); //extern void AGGDraw(); AGGDraw(); - + //aggDraw.composite(GPU_screen); if (res == DD_OK) {