OSDN Git Service

Update samples to nxtOSEK_v212.zip (I did not check their licenses.)
[nxt-jsp/etrobo-atk.git] / nxtOSEK / samples_c++ / cc / sprite_devl / CompressedSprite.h
1 class Sprite\r
2 {\r
3 public:\r
4         Sprite(const char* sprite);\r
5         ~Sprite();\r
6         char const * const getDecompressedSprite(U8 frameNumber);\r
7 private:\r
8         void decompressSprite(U8 frameNumber);\r
9 \r
10         //compressed data\r
11         char mSentinal;\r
12         U8 mNumFrames;\r
13         U8 mWidth;\r
14         U8 mHeight;\r
15         \r
16         U16 mNumflagBytes;\r
17         char const * mCompressedSprite;\r
18         char const * mCompressedFlags;\r
19         char const * mFrameOffsets;\r
20 \r
21         //char *mDecompressBuffer;\r
22         char mDecompressBuffer[100];\r
23 \r
24         //uncompressed data\r
25         U8 mCurrentFrame;\r
26 \r
27     //1 byte - sentinel value\r
28         //1 byte - num frames\r
29     //1 byte - width\r
30     //1 byte - height\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
34 \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
42 \r
43         static const U8 mInvalidFrameNumber = 255;\r
44 \r
45 };\r
46 \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
53 {\r
54         //mDecompressBuffer = new char[(mWidth*mHeight)/8];\r
55         //memset(mDecompressBuffer, 0, (mWidth*mHeight)/8);\r
56 \r
57         mNumflagBytes = sprite[mNumFlagBytes];\r
58         \r
59         mCompressedFlags = &sprite[mStartOfCompressedFlags];\r
60 \r
61         int bufferOffset = 0;\r
62         bufferOffset += mStartOfCompressedFlags + mNumflagBytes;\r
63 \r
64         mFrameOffsets = &sprite[bufferOffset];\r
65 \r
66         bufferOffset = bufferOffset + (mNumFrames * 2);\r
67         mCompressedSprite = &sprite[bufferOffset];\r
68 }\r
69 \r
70 Sprite::~Sprite()\r
71 {\r
72         //delete [] mDecompressBuffer;\r
73 }\r
74 \r
75 char const * const Sprite::getDecompressedSprite(U8 frameNumber)\r
76 {\r
77         if(mCurrentFrame != frameNumber)\r
78         {\r
79                 decompressSprite(frameNumber);\r
80         }\r
81         return mDecompressBuffer;\r
82 }\r
83 \r
84 void Sprite::decompressSprite(U8 frameNumber)\r
85 {\r
86         int numCompressedBytes = 0;\r
87         char const *frameToDecompress = 0;\r
88 \r
89         if(frameNumber == 0)\r
90         {\r
91                 numCompressedBytes = reinterpret_cast<const unsigned short*>(mFrameOffsets)[frameNumber];\r
92                 frameToDecompress = mCompressedSprite;\r
93         }\r
94         else\r
95         {\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
98 \r
99                 numCompressedBytes = nextOffset - currentOffset;\r
100                 frameToDecompress = &mCompressedSprite[currentOffset];\r
101         }\r
102 \r
103         if(mCompressedFlags[frameNumber/8] & (1<<frameNumber))\r
104         {\r
105                 //decompress the frame\r
106                 int i = 0;\r
107                 int uncmpBuffer = 0;\r
108 \r
109                 while(i < numCompressedBytes)\r
110                 {\r
111                         char character = frameToDecompress[i];\r
112                         if(mSentinal == character)\r
113                         {\r
114                                 unsigned char numChars = frameToDecompress[i + 1];\r
115 \r
116                                 for(int j = 0; j < numChars; ++j)\r
117                                 {\r
118                                         if(uncmpBuffer < (mWidth*mHeight)/8)\r
119                                         {\r
120                                                 mDecompressBuffer[uncmpBuffer++] = frameToDecompress[i + 2];\r
121                                         }\r
122                                 }\r
123          \r
124                                 i += 3;\r
125                         }\r
126                         else\r
127                         {\r
128                                 if(uncmpBuffer < (mWidth*mHeight)/8)\r
129                                 {\r
130                                         mDecompressBuffer[uncmpBuffer++] = character;\r
131                                 }\r
132                                 i++;\r
133                         }\r
134                 }\r
135         }\r
136         else\r
137         {\r
138                 memcpy(mDecompressBuffer, frameToDecompress, (mWidth*mHeight)/8);\r
139         }\r
140 }\r