Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

#ifndef __IMAGE_H__
#define __IMAGE_H__

#include "Common.h"
#include "Color.h"
#include "Rect.h"
#include "Point.h"

namespace Sexy
{

struct Span
{
        int                                             mY;
        int                                             mX;
        int                                             mWidth;
};

enum AnimType
{
        AnimType_None,
        AnimType_Once,
        AnimType_PingPong,
        AnimType_Loop
};

struct AnimInfo
{
        AnimType                                mAnimType;
        int                                             mFrameDelay; // 1/100s
        int                                             mNumCels;
        std::vector<int>                mPerFrameDelay;
        std::vector<int>                mFrameMap;
        int                                             mTotalAnimTime;

        AnimInfo();
        void SetPerFrameDelay(int theFrame, int theTime);
        void Compute(int theNumCels, int theBeginFrameTime = 0, int theEndFrameTime = 0);

        int GetPerFrameCel(int theTime);
        int GetCel(int theTime);
};

class Graphics;
class SexyMatrix3;
class SysFont;
class TriVertex;

class Image
{
        friend class                    Sexy::SysFont;

public:
        bool                                    mDrawn;
        std::string                             mFilePath;
        int                                             mWidth;
        int                                             mHeight;

        // for image strips
        int                                             mNumRows;
        int                                             mNumCols;

        // for animations
        AnimInfo                                *mAnimInfo;

public:
        Image();
        Image(const Image& theImage);
        virtual ~Image();

        int                                             GetWidth();
        int                                             GetHeight();
        int                                             GetCelWidth();          // returns the width of just 1 cel in a strip of images
        int                                             GetCelHeight(); // like above but for vertical strips
        int                                             GetAnimCel(int theTime); // use animinfo to return appropriate cel to draw at the time
        Rect                                    GetAnimCelRect(int theTime);
        Rect                                    GetCelRect(int theCel);                         // Gets the rectangle for the given cel at the specified row/col
        Rect                                    GetCelRect(int theCol, int theRow);     // Same as above, but for an image with both multiple rows and cols
        void                                    CopyAttributes(Image *from);
        Graphics*                               GetGraphics();

        virtual bool                    PolyFill3D(const Point theVertices[], int theNumVertices, const Rect *theClipRect, const Color &theColor, int theDrawMode, int tx, int ty, bool convex);

        virtual void                    FillRect(const Rect& theRect, const Color& theColor, int theDrawMode); 
        virtual void                    DrawRect(const Rect& theRect, const Color& theColor, int theDrawMode);
        virtual void                    ClearRect(const Rect& theRect);
        virtual void                    DrawLine(double theStartX, double theStartY, double theEndX, double theEndY, const Color& theColor, int theDrawMode);
        virtual void                    DrawLineAA(double theStartX, double theStartY, double theEndX, double theEndY, const Color& theColor, int theDrawMode);
        virtual void                    FillScanLines(Span* theSpans, int theSpanCount, const Color& theColor, int theDrawMode);
        virtual void                    FillScanLinesWithCoverage(Span* theSpans, int theSpanCount, const Color& theColor, int theDrawMode, const BYTE* theCoverage, int theCoverX, int theCoverY, int theCoverWidth, int theCoverHeight);
        virtual void                    Blt(Image* theImage, int theX, int theY, const Rect& theSrcRect, const Color& theColor, int theDrawMode);
        virtual void                    BltF(Image* theImage, float theX, float theY, const Rect& theSrcRect, const Rect &theClipRect, const Color& theColor, int theDrawMode);
        virtual void                    BltRotated(Image* theImage, float theX, float theY, const Rect &theSrcRect, const Rect& theClipRect, const Color& theColor, int theDrawMode, double theRot, float theRotCenterX, float theRotCenterY);
        virtual void                    StretchBlt(Image* theImage, const Rect& theDestRect, const Rect& theSrcRect, const Rect& theClipRect, const Color& theColor, int theDrawMode, bool fastStretch);
        virtual void                    BltMatrix(Image* theImage, float x, float y, const SexyMatrix3 &theMatrix, const Rect& theClipRect, const Color& theColor, int theDrawMode, const Rect &theSrcRect, bool blend);
        virtual void                    BltTrianglesTex(Image *theTexture, const TriVertex theVertices[][3], int theNumTriangles, const Rect& theClipRect, const Color &theColor, int theDrawMode, float tx, float ty, bool blend);

        virtual void                    BltMirror(Image* theImage, int theX, int theY, const Rect& theSrcRect, const Color& theColor, int theDrawMode);
        virtual void                    StretchBltMirror(Image* theImage, const Rect& theDestRect, const Rect& theSrcRect, const Rect& theClipRect, const Color& theColor, int theDrawMode, bool fastStretch);
};

}

#endif //__IMAGE_H__