Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

#ifndef __GRAPHICS_H__
#define __GRAPHICS_H__

#include "Common.h"
#include "Rect.h"
#include "Color.h"
#include "Image.h"
#include "TriVertex.h"

namespace Sexy
{

class Font;
class SexyMatrix3;
class Transform;

const int MAX_TEMP_SPANS = 8192;

struct Edge
{
    double mX;
    double mDX;
    int i;
        double b;
};

class Graphics;

class GraphicsState
{
public:
        static Image                    mStaticImage;
        Image*                                  mDestImage;
        float                                   mTransX;
        float                                   mTransY;
        float                                   mScaleX;
        float                                   mScaleY;
        float                                   mScaleOrigX;
        float                                   mScaleOrigY;
        Rect                                    mClipRect;
        Color                                   mColor;
        Font*                                   mFont;
        int                                             mDrawMode;
        bool                                    mColorizeImages;
        bool                                    mFastStretch;
        bool                                    mWriteColoredString;
        bool                                    mLinearBlend;
        bool                                    mIs3D;

public:
        void                                    CopyStateFrom(const GraphicsState* theState);
};

typedef std::list<GraphicsState> GraphicsStateList;

class Graphics : public GraphicsState
{
public:
        enum
        {
                DRAWMODE_NORMAL,
                DRAWMODE_ADDITIVE
        };
       
        Edge*                                   mPFActiveEdgeList;
        int                                             mPFNumActiveEdges;
        static const Point*             mPFPoints;
        int                                             mPFNumVertices;

        GraphicsStateList               mStateStack;

protected:     
        static int                              PFCompareInd(const void* u, const void* v);
        static int                              PFCompareActive(const void* u, const void* v);
        void                                    PFDelete(int i);
        void                                    PFInsert(int i, int y);

        void                                    DrawImageTransformHelper(Image* theImage, const Transform &theTransform, const Rect &theSrcRect, float x, float y, bool useFloat);

public:
        Graphics(const Graphics& theGraphics);
        Graphics(Image* theDestImage = NULL);
        virtual ~Graphics();   

        void                                    PushState();
        void                                    PopState();

        Graphics*                               Create();
       
        void                                    SetFont(Font* theFont);
        Font*                                   GetFont();

        void                                    SetColor(const Color& theColor);
        const Color&                    GetColor();
       
        void                                    SetDrawMode(int theDrawMode);
        int                                             GetDrawMode();
       
        void                                    SetColorizeImages(bool colorizeImages);
        bool                                    GetColorizeImages();

        void                                    SetFastStretch(bool fastStretch);
        bool                                    GetFastStretch();

        void                                    SetLinearBlend(bool linear); // for DrawImageMatrix, DrawImageTransform, etc...
        bool                                    GetLinearBlend();

        void                                    FillRect(int theX, int theY, int theWidth, int theHeight);
        void                                    FillRect(const Rect& theRect);
        void                                    DrawRect(int theX, int theY, int theWidth, int theHeight);     
        void                                    DrawRect(const Rect& theRect);
        void                                    ClearRect(int theX, int theY, int theWidth, int theHeight);    
        void                                    ClearRect(const Rect& theRect);
        void                                    DrawString(const SexyString& theString, int theX, int theY);
       
private:
        bool                                    DrawLineClipHelper(double* theStartX, double* theStartY, double *theEndX, double* theEndY);
public:
        void                                    DrawLine(int theStartX, int theStartY, int theEndX, int theEndY);
        void                                    DrawLineAA(int theStartX, int theStartY, int theEndX, int theEndY);
        void                                    PolyFill(const Point *theVertexList, int theNumVertices, bool convex = false);
        void                                    PolyFillAA(const Point *theVertexList, int theNumVertices, bool convex = false);

        void                                    DrawImage(Image* theImage, int theX, int theY);
        void                                    DrawImage(Image* theImage, int theX, int theY, const Rect& theSrcRect);
        void                                    DrawImage(Image* theImage, const Rect& theDestRect, const Rect& theSrcRect);
        void                                    DrawImage(Image* theImage, int theX, int theY, int theStretchedWidth, int theStretchedHeight);
        void                                    DrawImageF(Image* theImage, float theX, float theY);
        void                                    DrawImageF(Image* theImage, float theX, float theY, const Rect& theSrcRect);

        void                                    DrawImageMirror(Image* theImage, int theX, int theY, bool mirror = true);
        void                                    DrawImageMirror(Image* theImage, int theX, int theY, const Rect& theSrcRect, bool mirror = true);
        void                                    DrawImageMirror(Image* theImage, const Rect& theDestRect, const Rect& theSrcRect, bool mirror = true);

        void                                    DrawImageRotated(Image* theImage, int theX, int theY, double theRot, const Rect *theSrcRect = NULL);
        void                                    DrawImageRotated(Image* theImage, int theX, int theY, double theRot, int theRotCenterX, int theRotCenterY, const Rect *theSrcRect = NULL);
        void                                    DrawImageRotatedF(Image* theImage, float theX, float theY, double theRot, const Rect *theSrcRect = NULL);
        void                                    DrawImageRotatedF(Image* theImage, float theX, float theY, double theRot, float theRotCenterX, float theRotCenterY, const Rect *theSrcRect = NULL);

        void                                    DrawImageMatrix(Image* theImage, const SexyMatrix3 &theMatrix, float x = 0, float y = 0);
        void                                    DrawImageMatrix(Image* theImage, const SexyMatrix3 &theMatrix, const Rect &theSrcRect, float x = 0, float y = 0);
        void                                    DrawImageTransform(Image* theImage, const Transform &theTransform, float x = 0, float y = 0);
        void                                    DrawImageTransform(Image* theImage, const Transform &theTransform, const Rect &theSrcRect, float x = 0, float y = 0);
        void                                    DrawImageTransformF(Image* theImage, const Transform &theTransform, float x = 0, float y = 0);
        void                                    DrawImageTransformF(Image* theImage, const Transform &theTransform, const Rect &theSrcRect, float x = 0, float y = 0);
        void                                    DrawTriangleTex(Image *theTexture, const TriVertex &v1, const TriVertex &v2, const TriVertex &v3);
        void                                    DrawTrianglesTex(Image *theTexture, const TriVertex theVertices[][3], int theNumTriangles);

        void                                    DrawImageCel(Image* theImageStrip, int theX, int theY, int theCel);
        void                                    DrawImageCel(Image* theImageStrip, const Rect& theDestRect, int theCel);
        void                                    DrawImageCel(Image* theImageStrip, int theX, int theY, int theCelCol, int theCelRow);
        void                                    DrawImageCel(Image* theImageStrip, const Rect& theDestRect, int theCelCol, int theCelRow);

        void                                    DrawImageAnim(Image* theImageAnim, int theX, int theY, int theTime);

        void                                    ClearClipRect();
        void                                    SetClipRect(int theX, int theY, int theWidth, int theHeight);
        void                                    SetClipRect(const Rect& theRect);
        void                                    ClipRect(int theX, int theY, int theWidth, int theHeight);
        void                                    ClipRect(const Rect& theRect);
        void                                    Translate(int theTransX, int theTransY);
        void                                    TranslateF(float theTransX, float theTransY);

        // In progress: Only affects DrawImage
        void                                    SetScale(float theScaleX, float theScaleY, float theOrigX, float theOrigY);

        int                                             StringWidth(const SexyString& theString);
        void                                    DrawImageBox(const Rect& theDest, Image* theComponentImage);
        void                                    DrawImageBox(const Rect& theSrc, const Rect& theDest, Image* theComponentImage);

        int                                             WriteString(const SexyString& theString, int theX, int theY, int theWidth = -1, int theJustification = 0, bool drawString = true, int theOffset = 0, int theLength = -1, int theOldColor = -1);
        int                                             WriteWordWrapped(const Rect& theRect, const SexyString& theLine, int theLineSpacing = -1, int theJustification = -1, int *theMaxWidth = NULL, int theMaxChars = -1, int* theLastWidth = NULL);
        int                                             DrawStringColor(const SexyString& theString, int theX, int theY, int theOldColor = -1); //works like DrawString but can have color tags like ^ff0000^.
        int                                             DrawStringWordWrapped(const SexyString& theLine, int theX, int theY, int theWrapWidth = 10000000, int theLineSpacing = -1, int theJustification = -1, int *theMaxWidth = NULL); //works like DrawString but also word wraps
        int                                             GetWordWrappedHeight(int theWidth, const SexyString& theLine, int theLineSpacing = -1, int *theMaxWidth = NULL);

        bool                                    Is3D() { return mIs3D; }
};

class GraphicsAutoState
{
public:
        Graphics*                               mG;

public:
       
        GraphicsAutoState(Graphics* theG) : mG(theG)
        {
                mG->PushState();
        }

        ~GraphicsAutoState()
        {
                mG->PopState();
        }
};

}

#endif //__GRAPHICS_H__