Commit 44f0912e authored by alistert's avatar alistert

Slightly improved Scene animation loading.

parent 947aa7ae
...@@ -408,7 +408,7 @@ int Scene::play () { ...@@ -408,7 +408,7 @@ int Scene::play () {
case ESquareAniHeader: case ESquareAniHeader:
loadCompactedMem(currentFrame->frameSize, currentFrame->frameData, (unsigned char*)animation->background->pixels, SW, SH); loadCompactedMem(currentFrame->frameSize, currentFrame->frameData, (unsigned char*)animation->background->pixels);
break; break;
......
...@@ -234,7 +234,7 @@ class Scene { ...@@ -234,7 +234,7 @@ class Scene {
void loadScripts (File* f); void loadScripts (File* f);
void loadData (File* f); void loadData (File* f);
void loadAni (File* f, int dataIndex); void loadAni (File* f, int dataIndex);
void loadCompactedMem (int size, unsigned char* frameData, unsigned char* pixdata, int width, int height); void loadCompactedMem (int size, unsigned char* frameData, unsigned char* pixdata);
void loadFFMem (int size, unsigned char* frameData, unsigned char* pixdata); void loadFFMem (int size, unsigned char* frameData, unsigned char* pixdata);
unsigned short int loadShortMem (unsigned char **data); unsigned short int loadShortMem (unsigned char **data);
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "io/file.h" #include "io/file.h"
#include "io/gfx/font.h" #include "io/gfx/font.h"
#include "io/gfx/video.h" #include "io/gfx/video.h"
#include "util.h"
#include <string.h> #include <string.h>
...@@ -48,49 +49,31 @@ unsigned short int Scene::loadShortMem (unsigned char** data) { ...@@ -48,49 +49,31 @@ unsigned short int Scene::loadShortMem (unsigned char** data) {
} }
void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixdata) { void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixels) {
int pixels = 0; unsigned char* nextPixel = pixels;
unsigned char* nextData = frameData;
int fillWidth = 0; int fillWidth = 0;
unsigned char fillColor = 0; unsigned char header;
bool trans = true; bool trans = true;
int opCodeNo = 0;
unsigned char* repeatPos = NULL;
unsigned char* startPix = pixdata;
unsigned char* framestart = frameData;
/*FILE* out = fopen("c:\\output.dat", "wb"); /*FILE* out = fopen("c:\\output.dat", "wb");
fwrite(frameData, size, 1, out); fwrite(frameData, size, 1, out);
fclose(out);*/ fclose(out);*/
while (size > 0 && pixels < 64000) { while ((nextData < frameData + size) && (nextPixel < pixels + (SW * SH))) {
LOG("PL FF frame offset", frameData - framestart); LOG("PL FF frame offset", nextData - frameStart);
opCodeNo++; header = *nextData;
fflush(stderr); nextData++;
unsigned char header = *frameData;
frameData++;
if ((header & 0x7F) == 0x7F) { if ((header & 0x7F) == 0x7F) {
fillWidth = loadShortMem(&frameData); fillWidth = loadShortMem(&nextData);
if (trans) fillWidth += 255; if (trans) fillWidth += 255;
if (header & 0x80) { LOG("PL FF 0x7f skip", fillWidth);
LOG("PL FF 0xff skip", fillWidth);
} else {
fillColor = *frameData;
frameData++;
//memset(pixdata, fillColor, fillWidth);
LOG("PL FF 0x7f fillWidth", fillWidth);
}
size -= 2;
} else if (header) { } else if (header) {
...@@ -108,10 +91,9 @@ void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixdat ...@@ -108,10 +91,9 @@ void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixdat
LOG("PL FF 0x00 Copy bytes", header); LOG("PL FF 0x00 Copy bytes", header);
memcpy(pixdata, frameData, fillWidth); memcpy(nextPixel, nextData, fillWidth);
frameData += fillWidth; nextData += fillWidth;
size -= fillWidth;
} }
...@@ -121,7 +103,7 @@ void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixdat ...@@ -121,7 +103,7 @@ void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixdat
LOG("PL FF 0x20 fill next op", fillWidth); LOG("PL FF 0x20 fill next op", fillWidth);
if (pixdata - 320 >= startPix) memcpy(pixdata, pixdata - 320, fillWidth); if (nextPixel - 320 >= pixels) memcpy(nextPixel, nextPixel - 320, fillWidth);
break; break;
...@@ -129,18 +111,26 @@ void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixdat ...@@ -129,18 +111,26 @@ void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixdat
LOG("PL FF 0x40 fillWidth", fillWidth); LOG("PL FF 0x40 fillWidth", fillWidth);
fillColor = *frameData; memset(nextPixel, *nextData, fillWidth);
frameData++;
memset(pixdata, fillColor, fillWidth); nextData++;
size--;
break; break;
case 0x60: case 0x60:
LOG("PL FF 0x60 skip", header); LOG("PL FF 0x60 header", header);
if (nextPixel == pixels) {
fillWidth = header;
} else {
fillWidth = header & 0x7F;
nextPixel -= (nextPixel - pixels) % 320;
}
break; break;
...@@ -148,26 +138,20 @@ void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixdat ...@@ -148,26 +138,20 @@ void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixdat
} else { } else {
fillWidth = 0;
size = 1; // end
LOG("PL FF END OF STREAM", size); LOG("PL FF END OF STREAM", size);
return;
} }
pixdata += fillWidth; nextPixel += fillWidth;
pixels += fillWidth;
if (header & 0x80) trans = false; if (header & 0x80) trans = false;
else trans = !trans; else trans = !trans;
size--;
SDL_Rect dst;
dst.x = (canvasW - SW) >> 1;
dst.y = (canvasH - SH) >> 1;
} }
LOG("PL FF pixels", pixels); LOG("PL FF pixels", nextPixel - pixels);
} }
...@@ -178,52 +162,42 @@ void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixdat ...@@ -178,52 +162,42 @@ void Scene::loadFFMem (int size, unsigned char* frameData, unsigned char* pixdat
* $8x Next x + 1 pixels are skipped, they're already the right color (Max val $FE) * $8x Next x + 1 pixels are skipped, they're already the right color (Max val $FE)
* $FF $xxxx Skip next xxxx pixels of picture, they're already the right color * $FF $xxxx Skip next xxxx pixels of picture, they're already the right color
*/ */
void Scene::loadCompactedMem (int size, unsigned char* frameData, unsigned char* pixdata, int width, int height) { void Scene::loadCompactedMem (int size, unsigned char* frameData, unsigned char* pixels) {
int pixels = 0; unsigned char* nextPixel = pixels;
int fillWidth = 0; unsigned char* endpixdata = pixels + (SW * SH);
unsigned char* endpixdata = pixdata + (width * height);
unsigned char* fillstart = NULL; unsigned char* fillstart = NULL;
int fillWidth = 0;
unsigned char header;
while (size > 0) { while (size > 0) {
unsigned char header = *frameData; header = *frameData;
frameData++; frameData++;
switch (header) { if (header == 0x7F) {
case 0x7F:
{
fillWidth = loadShortMem(&frameData); fillWidth = loadShortMem(&frameData);
unsigned char fillColor = *frameData; unsigned char fillColor = *frameData;
frameData++; frameData++;
fillstart = pixdata; fillstart = nextPixel;
while (fillstart + fillWidth < endpixdata) { while (fillstart + fillWidth < endpixdata) {
memset(fillstart, fillColor, fillWidth); memset(fillstart, fillColor, fillWidth);
fillstart+=width; fillstart += SW;
} }
size -= 3; size -= 3;
} } else if (header == 0xFF) {
break;
case 0xFF:
fillWidth = loadShortMem(&frameData); fillWidth = loadShortMem(&frameData);
size -= 2; size -= 2;
break; } else if (header & 0x80) {
default:
if (header & 0x80) {
fillWidth = (header - 0x80) + 1; fillWidth = (header - 0x80) + 1;
...@@ -233,12 +207,12 @@ void Scene::loadCompactedMem (int size, unsigned char* frameData, unsigned char* ...@@ -233,12 +207,12 @@ void Scene::loadCompactedMem (int size, unsigned char* frameData, unsigned char*
frameData++; frameData++;
fillWidth = (header - 0x40) + 1; fillWidth = (header - 0x40) + 1;
fillstart = pixdata; fillstart = nextPixel;
while (fillstart + fillWidth < endpixdata) { while (fillstart + fillWidth < endpixdata) {
memset(fillstart, fillColor, fillWidth); memset(fillstart, fillColor, fillWidth);
fillstart += width; fillstart += SW;
} }
...@@ -256,39 +230,31 @@ void Scene::loadCompactedMem (int size, unsigned char* frameData, unsigned char* ...@@ -256,39 +230,31 @@ void Scene::loadCompactedMem (int size, unsigned char* frameData, unsigned char*
if (color != 0xFF) { if (color != 0xFF) {
fillstart = pixdata; fillstart = nextPixel + col;
while (fillstart < endpixdata) { while (fillstart < endpixdata) {
*fillstart = color; *fillstart = color;
fillstart += width; fillstart += SW;
} }
} }
pixdata++;
size--; size--;
} }
pixdata -= fillWidth;
} }
break; nextPixel += fillWidth;
}
pixdata += fillWidth;
pixels += fillWidth;
size--; size--;
} }
LOG("PL Compacts pixels", pixels); LOG("PL Compacts pixels", nextPixel - pixels);
} }
...@@ -376,7 +342,7 @@ void Scene::loadAni (File *f, int dataIndex) { ...@@ -376,7 +342,7 @@ void Scene::loadAni (File *f, int dataIndex) {
memset(pixels, 0, SW*SH); memset(pixels, 0, SW*SH);
unsigned char* frameData; unsigned char* frameData;
frameData = f->loadBlock(size); frameData = f->loadBlock(size);
loadCompactedMem(size, frameData, pixels, SW, SH); loadCompactedMem(size, frameData, pixels);
delete[] frameData; delete[] frameData;
animations->background = createSurface(pixels, SW, SH); animations->background = createSurface(pixels, SW, SH);
delete[] pixels; delete[] pixels;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment