4 Sprite(const char* sprite);
\r
6 char const * const getDecompressedSprite(U8 frameNumber);
\r
8 void decompressSprite(U8 frameNumber);
\r
17 char const * mCompressedSprite;
\r
18 char const * mCompressedFlags;
\r
19 char const * mFrameOffsets;
\r
21 //char *mDecompressBuffer;
\r
22 char mDecompressBuffer[100];
\r
27 //1 byte - sentinel value
\r
28 //1 byte - num frames
\r
31 //1 byte - offset to compressed offset data
\r
32 //max 32 bytes for 255 framse for compressed flag bitfield
\r
33 //max 512 bytes for data offset into frames
\r
35 static const U8 mSentinalIndex = 0;
\r
36 static const U8 mNumFramesIndex = 1;
\r
37 static const U8 mWidthIndex = 2;
\r
38 static const U8 mHeightIndex = 3;
\r
39 static const U8 mNumFlagBytes = 4;
\r
40 static const U8 mHeaderPad00 = 5;
\r
41 static const U8 mStartOfCompressedFlags = 6;
\r
43 static const U8 mInvalidFrameNumber = 255;
\r
47 Sprite::Sprite(const char* sprite)
\r
48 : mSentinal(sprite[mSentinalIndex])
\r
49 , mNumFrames(sprite[mNumFramesIndex])
\r
50 , mWidth(sprite[mWidthIndex])
\r
51 , mHeight(sprite[mHeightIndex])
\r
52 , mCurrentFrame(mInvalidFrameNumber)
\r
54 //mDecompressBuffer = new char[(mWidth*mHeight)/8];
\r
55 //memset(mDecompressBuffer, 0, (mWidth*mHeight)/8);
\r
57 mNumflagBytes = sprite[mNumFlagBytes];
\r
59 mCompressedFlags = &sprite[mStartOfCompressedFlags];
\r
61 int bufferOffset = 0;
\r
62 bufferOffset += mStartOfCompressedFlags + mNumflagBytes;
\r
64 mFrameOffsets = &sprite[bufferOffset];
\r
66 bufferOffset = bufferOffset + (mNumFrames * 2);
\r
67 mCompressedSprite = &sprite[bufferOffset];
\r
72 //delete [] mDecompressBuffer;
\r
75 char const * const Sprite::getDecompressedSprite(U8 frameNumber)
\r
77 if(mCurrentFrame != frameNumber)
\r
79 decompressSprite(frameNumber);
\r
81 return mDecompressBuffer;
\r
84 void Sprite::decompressSprite(U8 frameNumber)
\r
86 int numCompressedBytes = 0;
\r
87 char const *frameToDecompress = 0;
\r
89 if(frameNumber == 0)
\r
91 numCompressedBytes = reinterpret_cast<const unsigned short*>(mFrameOffsets)[frameNumber];
\r
92 frameToDecompress = mCompressedSprite;
\r
96 unsigned short nextOffset = reinterpret_cast<const unsigned short*>(mFrameOffsets)[frameNumber];
\r
97 unsigned short currentOffset = reinterpret_cast<const unsigned short*>(mFrameOffsets)[frameNumber - 1];
\r
99 numCompressedBytes = nextOffset - currentOffset;
\r
100 frameToDecompress = &mCompressedSprite[currentOffset];
\r
103 if(mCompressedFlags[frameNumber/8] & (1<<frameNumber))
\r
105 //decompress the frame
\r
107 int uncmpBuffer = 0;
\r
109 while(i < numCompressedBytes)
\r
111 char character = frameToDecompress[i];
\r
112 if(mSentinal == character)
\r
114 unsigned char numChars = frameToDecompress[i + 1];
\r
116 for(int j = 0; j < numChars; ++j)
\r
118 if(uncmpBuffer < (mWidth*mHeight)/8)
\r
120 mDecompressBuffer[uncmpBuffer++] = frameToDecompress[i + 2];
\r
128 if(uncmpBuffer < (mWidth*mHeight)/8)
\r
130 mDecompressBuffer[uncmpBuffer++] = character;
\r
138 memcpy(mDecompressBuffer, frameToDecompress, (mWidth*mHeight)/8);
\r