Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

#include "Image.h"
#include "Graphics.h"

using namespace Sexy;

Image::Image()
{
        mWidth = 0;
        mHeight = 0;

        mNumRows = 1;
        mNumCols = 1;

        mAnimInfo = NULL;
        mDrawn = false;
}

Image::Image(const Image& theImage) :
        mWidth(theImage.mWidth),
        mHeight(theImage.mHeight),
        mNumRows(theImage.mNumRows),
        mNumCols(theImage.mNumCols)
{
        mDrawn = false;
        if (theImage.mAnimInfo != NULL)
                mAnimInfo = new AnimInfo(*theImage.mAnimInfo);
        else
                mAnimInfo = NULL;
}

Image::~Image()
{
        delete mAnimInfo;
}

int Image::GetWidth()
{
        return mWidth;
}

int     Image::GetHeight()
{
        return mHeight;
}

int Image::GetCelHeight()
{
        return mHeight / mNumRows;
}

int Image::GetCelWidth()
{
        return mWidth / mNumCols;
}

Rect Image::GetCelRect(int theCel)
{
        int h = GetCelHeight();
        int w = GetCelWidth();
        int x = (theCel % mNumCols) * w;
        int y = (theCel / mNumCols) * h;

        return Rect(x, y, w, h);
}

Rect Image::GetCelRect(int theCol, int theRow)
{
        int h = GetCelHeight();
        int w = GetCelWidth();
        int x = theCol * w;
        int y = theRow * h;

        return Rect(x, y, w, h);
}

AnimInfo::AnimInfo()
{
        mAnimType = AnimType_None;
        mFrameDelay = 1;
        mNumCels = 1;
}

void AnimInfo::SetPerFrameDelay(int theFrame, int theTime)
{
        if ((int)mPerFrameDelay.size()<=theFrame)
                mPerFrameDelay.resize(theFrame+1);

        mPerFrameDelay[theFrame] = theTime;
}

void AnimInfo::Compute(int theNumCels, int theBeginFrameTime, int theEndFrameTime)
{
        int i;

        mNumCels = theNumCels;
        if (mNumCels<=0)
                mNumCels = 1;

        if (mFrameDelay<=0)
                mFrameDelay = 1;

        if (mAnimType==AnimType_PingPong && mNumCels>1)
        {
                mFrameMap.resize(theNumCels*2-2);
                int index = 0;
                for (i=0; i<theNumCels; i++)
                        mFrameMap[index++] = i;
                for (i=theNumCels-2; i>=1; i--)
                        mFrameMap[index++] = i;
        }

        if (!mFrameMap.empty())
                mNumCels = (int)mFrameMap.size();

        if (theBeginFrameTime>0)
                SetPerFrameDelay(0,theBeginFrameTime);

        if (theEndFrameTime>0)
                SetPerFrameDelay(mNumCels-1,theEndFrameTime);

        if (!mPerFrameDelay.empty())
        {
                mTotalAnimTime = 0;
                mPerFrameDelay.resize(mNumCels);

                for (i=0; i<mNumCels; i++)
                {
                        if (mPerFrameDelay[i]<=0)
                                mPerFrameDelay[i] = mFrameDelay;
                               
                        mTotalAnimTime += mPerFrameDelay[i];
                }
        }
        else
                mTotalAnimTime = mFrameDelay*mNumCels;

        if (!mFrameMap.empty())
                mFrameMap.resize(mNumCels);
}
       
int AnimInfo::GetPerFrameCel(int theTime)
{
        for (int i=0; i<mNumCels; i++)
        {
                theTime -= mPerFrameDelay[i];
                if (theTime<0)
                        return i;
        }

        return mNumCels-1;
}



int AnimInfo::GetCel(int theTime)
{
        if (mAnimType==AnimType_Once && theTime>=mTotalAnimTime)
        {
                if (!mFrameMap.empty())
                        return mFrameMap[mFrameMap.size()-1];
                else
                        return mNumCels-1;
        }

        theTime = theTime%mTotalAnimTime;

        int aFrame;
        if (!mPerFrameDelay.empty())
                aFrame = GetPerFrameCel(theTime);
        else
                aFrame = (theTime/mFrameDelay)%mNumCels;

        if (mFrameMap.empty())
                return aFrame;
        else
                return mFrameMap[aFrame];      
}

int     Image::GetAnimCel(int theTime)
{
        if (mAnimInfo==NULL)
                return 0;
        else
                return mAnimInfo->GetCel(theTime);
}

Rect Image::GetAnimCelRect(int theTime)
{
        Rect aRect;
        int aCel = GetAnimCel(theTime);
        int aCelWidth = GetCelWidth();
        int aCelHeight = GetCelHeight();
        if (mNumCols>1)
                return Rect(aCel*aCelWidth,0,aCelWidth,mHeight);
        else
                return Rect(0,aCel*aCelHeight,mWidth,aCelHeight);
}

void Image::CopyAttributes(Image *from)
{
        mNumCols = from->mNumCols;
        mNumRows = from->mNumRows;
        delete mAnimInfo;
        mAnimInfo = NULL;
        if (from->mAnimInfo != NULL)
                mAnimInfo = new AnimInfo(*from->mAnimInfo);
}

Graphics* Image::GetGraphics()
{
        Graphics* g = new Graphics(this);      

        return g;
}

void Image::FillRect(const Rect& theRect, const Color& theColor, int theDrawMode)
{
}

void Image::ClearRect(const Rect& theRect)
{
}

void Image::DrawRect(const Rect& theRect, const Color& theColor, int theDrawMode)
{
        FillRect(Rect(theRect.mX, theRect.mY, theRect.mWidth + 1, 1), theColor, theDrawMode);
        FillRect(Rect(theRect.mX, theRect.mY + theRect.mHeight, theRect.mWidth + 1, 1), theColor, theDrawMode);
        FillRect(Rect(theRect.mX, theRect.mY + 1, 1, theRect.mHeight - 1), theColor, theDrawMode);
        FillRect(Rect(theRect.mX + theRect.mWidth, theRect.mY + 1, 1, theRect.mHeight - 1), theColor, theDrawMode);
}

void Image::DrawLine(double theStartX, double theStartY, double theEndX, double theEndY, const Color& theColor, int theDrawMode)
{
}

void Image::DrawLineAA(double theStartX, double theStartY, double theEndX, double theEndY, const Color& theColor, int theDrawMode)
{
}

void Image::FillScanLines(Span* theSpans, int theSpanCount, const Color& theColor, int theDrawMode)
{
        for (int i = 0; i < theSpanCount; i++)
        {
                Span* aSpan = &theSpans[i];            
                FillRect(Rect(aSpan->mX, aSpan->mY, aSpan->mWidth, 1), theColor, theDrawMode);         
        }
}

void Image::FillScanLinesWithCoverage(Span* theSpans, int theSpanCount, const Color& theColor, int theDrawMode, const BYTE* theCoverage, int theCoverX, int theCoverY, int theCoverWidth, int theCoverHeight)
{
}

bool Image::PolyFill3D(const Point theVertices[], int theNumVertices, const Rect *theClipRect, const Color &theColor, int theDrawMode, int tx, int ty, bool convex)
{
        return false;
}

void Image::Blt(Image* theImage, int theX, int theY, const Rect& theSrcRect, const Color& theColor, int theDrawMode)
{
}

void Image::BltF(Image* theImage, float theX, float theY, const Rect& theSrcRect, const Rect &theClipRect, const Color& theColor, int theDrawMode)
{
}

void Image::BltRotated(Image* theImage, float theX, float theY, const Rect &theSrcRect, const Rect& theClipRect, const Color& theColor, int theDrawMode, double theRot, float theRotCenterX, float theRotCenterY)
{
}

void Image::StretchBlt(Image* theImage, const Rect& theDestRect, const Rect& theSrcRect, const Rect& theClipRect, const Color& theColor, int theDrawMode, bool fastStretch)
{
}

void Image::BltMatrix(Image* theImage, float x, float y, const SexyMatrix3 &theMatrix, const Rect& theClipRect, const Color& theColor, int theDrawMode, const Rect &theSrcRect, bool blend)
{
}

void Image::BltTrianglesTex(Image *theTexture, const TriVertex theVertices[][3], int theNumTriangles, const Rect& theClipRect, const Color &theColor, int theDrawMode, float tx, float ty, bool blend)
{
}


void Image::BltMirror(Image* theImage, int theX, int theY, const Rect& theSrcRect, const Color& theColor, int theDrawMode)
{
}

void Image::StretchBltMirror(Image* theImage, const Rect& theDestRect, const Rect& theSrcRect, const Rect& theClipRect, const Color& theColor, int theDrawMode, bool fastStretch)
{
}