aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb/dreamweb.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/dreamweb/dreamweb.cpp')
-rw-r--r--engines/dreamweb/dreamweb.cpp42
1 files changed, 38 insertions, 4 deletions
diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp
index 39baa68e50..556ed11839 100644
--- a/engines/dreamweb/dreamweb.cpp
+++ b/engines/dreamweb/dreamweb.cpp
@@ -605,6 +605,9 @@ void readoneblock(Context &context) {
void readabyte(Context & context);
void showpcx(Context &context) {
+ Graphics::Surface *s = g_system->lockScreen();
+ int y = 0;
+
openfile(context);
context.ds = context.data.word(kWorkspace);
context.cx = 128;
@@ -616,6 +619,7 @@ void showpcx(Context &context) {
context.cx = 48;
context.es = context.data.word(kBuffers);
context.di = 0+(228*13)+32+60+(32*32)+(11*10*3)+768+768;
+ uint8 *pal = context.es.ptr(context.di, 768);
pcxpal:
context.push(context.cx);
readabyte(context);
@@ -626,7 +630,18 @@ pcxpal:
if (--context.cx) goto pcxpal;
context.cx = 768 - 48;
context.ax = 0x0ffff;
- while (--context.cx) context._stosw();
+ while (context.cx--) context._stosw();
+
+ // TODO: I think this is wrong. I mean, it's the right palette but I
+ // don't think this is the place to set it in the backend.
+
+ byte pal16[48];
+ for (int i = 0; i < 48; i++) {
+ pal16[i] = 4 * pal[i];
+ }
+
+ PaletteManager *palette = g_system->getPaletteManager();
+ palette->setPalette(pal16, 0, 256);
readoneblock(context);
context.si = 0;
@@ -639,6 +654,9 @@ convertpcx:
context.es = context.data.word(kBuffers);
context.di = 0+(228*13)+32+60;
context.bx = 0;
+
+ uint8 *src = context.es.ptr(context.di, 320);
+
sameline:
readabyte(context);
context.ah = context.al;
@@ -652,7 +670,7 @@ sameline:
readabyte(context);
context.cx = context.pop();
context._add(context.bx, context.cx);
- while (--context.cx) context._stosb();
+ while (context.cx--) context._stosb();
context._cmp(context.bx, 4 * 80);
if (!context.flags.z()) goto sameline;
goto endline;
@@ -670,14 +688,30 @@ endline:
context.si = 0+(228*13)+32+60;
context.ds = context.data.word(kBuffers);
- // TODO: There's a bunch of code here which I assume draws data to the
- // screen or something like that.
+ uint8 *dst = (uint8 *)s->getBasePtr(0, y);
+ memset(dst, 0, 640);
+
+ for (int i = 0; i < 320; i++) {
+ int plane = i / 80;
+ int pos = i % 80;
+
+ for (int j = 0; j < 8; j++) {
+ byte bit = (src[i] >> (7 - j)) & 1;
+ dst[8 * pos + j] |= (bit << plane);
+ }
+ }
context.si = context.pop();
context.cx = context.pop();
+
+ y++;
+
if (--context.cx) goto convertpcx;
closefile(context);
+
+ g_system->unlockScreen();
+ g_system->updateScreen();
}
} /*namespace dreamgen */