Stefan Schuermans commited on 2016-12-18 20:29:15
Showing 1 changed files, with 21 additions and 12 deletions.
| ... | ... |
@@ -61,7 +61,13 @@ static void BlinkenGifSetPixel(ColorMapObject *pMap, int idx, int transparent, |
| 61 | 61 |
stBlinkenMovie *BlinkenGifLoad(const char *pFilename) |
| 62 | 62 |
{
|
| 63 | 63 |
GifFileType *gif; |
| 64 |
- int height, width, frameCnt, frameIdx, i, y, x, |
|
| 64 |
+ struct sPass { int ofs, stride; };
|
|
| 65 |
+ static struct sPass const passes_linear[] = { { 0, 1 }, { 0, 0 } };
|
|
| 66 |
+ static struct sPass const passes_interlaced[] = {
|
|
| 67 |
+ { 0, 8 }, { 4, 8 }, { 2, 4 }, { 1, 2 }
|
|
| 68 |
+ }; |
|
| 69 |
+ struct sPass const *pass; |
|
| 70 |
+ int height, width, frameCnt, frameIdx, i, y, x, y1, x1, |
|
| 65 | 71 |
bg, disposal, delay, transp, idx; |
| 66 | 72 |
ColorMapObject *pGlobalMap, *pMap; |
| 67 | 73 |
SavedImage *pImg; |
| ... | ... |
@@ -140,9 +146,11 @@ stBlinkenMovie *BlinkenGifLoad(const char *pFilename) |
| 140 | 146 |
// frames with no duration -> only effect on background |
| 141 | 147 |
pFrame = NULL; |
| 142 | 148 |
} |
| 143 |
- // FIXME: pDesc->Interlace > 0 |
|
| 144 |
- for (y = pDesc->Top, i = 0; y < pDesc->Top + pDesc->Height; ++y) {
|
|
| 145 |
- for (x = pDesc->Left; x < pDesc->Left + pDesc->Width; ++x, ++i) {
|
|
| 149 |
+ for (pass = pDesc->Interlace ? passes_interlaced : passes_linear; |
|
| 150 |
+ pass->stride > 0; ++pass) {
|
|
| 151 |
+ for (y = pass->ofs, y1 = pDesc->Top + pass->ofs, i = 0; |
|
| 152 |
+ y < pDesc->Height; y += pass->stride, y1 += pass->stride) {
|
|
| 153 |
+ for (x = 0, x1 = pDesc->Left; x < pDesc->Width; ++x, ++x1, ++i) {
|
|
| 146 | 154 |
idx = pImg->RasterBits[i]; |
| 147 | 155 |
switch (disposal) {
|
| 148 | 156 |
// undefined |
| ... | ... |
@@ -153,21 +161,22 @@ stBlinkenMovie *BlinkenGifLoad(const char *pFilename) |
| 153 | 161 |
case 7: |
| 154 | 162 |
// do not dispose -> draw to frame and update background |
| 155 | 163 |
case 1: |
| 156 |
- BlinkenGifSetPixel(pMap, idx, transp, pFrame, y, x); |
|
| 157 |
- BlinkenGifSetPixel(pMap, idx, transp, pBack, y, x); |
|
| 164 |
+ BlinkenGifSetPixel(pMap, idx, transp, pFrame, y1, x1); |
|
| 165 |
+ BlinkenGifSetPixel(pMap, idx, transp, pBack, y1, x1); |
|
| 158 | 166 |
break; |
| 159 | 167 |
// restore background -> draw to frame and reset background |
| 160 | 168 |
case 2: |
| 161 |
- BlinkenGifSetPixel(pMap, idx, transp, pFrame, y, x); |
|
| 162 |
- BlinkenGifSetPixel(pMap, bg, transp, pBack, y, x); |
|
| 169 |
+ BlinkenGifSetPixel(pMap, idx, transp, pFrame, y1, x1); |
|
| 170 |
+ BlinkenGifSetPixel(pMap, bg, transp, pBack, y1, x1); |
|
| 163 | 171 |
break; |
| 164 | 172 |
// restore previous -> draw to frame only |
| 165 | 173 |
case 3: |
| 166 |
- BlinkenGifSetPixel(pMap, idx, transp, pFrame, y, x); |
|
| 174 |
+ BlinkenGifSetPixel(pMap, idx, transp, pFrame, y1, x1); |
|
| 167 | 175 |
break; |
| 168 |
- } |
|
| 169 |
- } |
|
| 170 |
- } |
|
| 176 |
+ } // switch disposal |
|
| 177 |
+ } // for x |
|
| 178 |
+ } // for y |
|
| 179 |
+ } // for pass |
|
| 171 | 180 |
|
| 172 | 181 |
// append frame to movie |
| 173 | 182 |
if (pFrame) {
|
| 174 | 183 |