aboutsummaryrefslogtreecommitdiff
path: root/engines/cruise/gfxModule.cpp
diff options
context:
space:
mode:
authorDavid Corrales2007-05-26 20:23:24 +0000
committerDavid Corrales2007-05-26 20:23:24 +0000
commit3646c968c9578c2a94d65ebd5fb06ec835f8c51d (patch)
tree8b57b339ebb31a1d7a67f1678aa5dc5c7759070a /engines/cruise/gfxModule.cpp
parentd1f56d93f934150f4b579c2e90564e2bf035f113 (diff)
parentac45c5b33d834acbc9718f89be76e49d403a4d2c (diff)
downloadscummvm-rg350-3646c968c9578c2a94d65ebd5fb06ec835f8c51d.tar.gz
scummvm-rg350-3646c968c9578c2a94d65ebd5fb06ec835f8c51d.tar.bz2
scummvm-rg350-3646c968c9578c2a94d65ebd5fb06ec835f8c51d.zip
Merged the fs branch with trunk. r26472:26948
svn-id: r26949
Diffstat (limited to 'engines/cruise/gfxModule.cpp')
-rw-r--r--engines/cruise/gfxModule.cpp659
1 files changed, 659 insertions, 0 deletions
diff --git a/engines/cruise/gfxModule.cpp b/engines/cruise/gfxModule.cpp
new file mode 100644
index 0000000000..23d80a47b0
--- /dev/null
+++ b/engines/cruise/gfxModule.cpp
@@ -0,0 +1,659 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2006 The ScummVM project
+ *
+ * cinE Engine is (C) 2004-2005 by CinE Team
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/stdafx.h"
+#include "common/system.h"
+
+#include "cruise/cruise_main.h"
+
+namespace Cruise {
+
+uint8 page00[320 * 200];
+uint8 page10[320 * 200];
+
+char screen[320 * 200];
+palEntry lpalette[256];
+short globalAtariScreen[320 * 200 / 4];
+
+int palDirtyMin = 256;
+int palDirtyMax = -1;
+
+gfxModuleDataStruct gfxModuleData = {
+ 0, // field_1
+ 0, // use Tandy
+ 0, // use EGA
+ 1, // use VGA
+
+ page00, // pPage00
+ page10, // pPage10
+};
+
+void gfxModuleData_gfxClearFrameBuffer(uint8 *ptr) {
+ memset(ptr, 0, 64000);
+}
+
+void gfxModuleData_gfxCopyScreen(char *sourcePtr, char *destPtr) {
+ memcpy(destPtr, sourcePtr, 64000);
+}
+
+void outputBit(char *buffer, int bitPlaneNumber, uint8 data) {
+ *(buffer + (8000 * bitPlaneNumber)) = data;
+}
+
+void gfxModuleData_field_60(char *sourcePtr, int width, int height,
+ char *destPtr, int x, int y) {
+ /*
+ * int loc_1064;
+ * int loc_10AA;
+ * int loc_10AD;
+ * int loc_10C5;
+ * int loc_10DF;
+ * int loc_10EC;
+ * int loc_1147;
+ * int loc_114B;
+ * int loc_117C = 0xF8;
+ * int loc_11DC;
+ * int loc_1277;
+ * int loc_12D9;
+ * int loc_12DD;
+ *
+ * int loc_11E7;
+ * int loc_127A;
+ * int loc_1203;
+ * int loc_122B;
+ * int loc_117F;
+ * int loc_11EF;
+ * int loc_1217;
+ * int loc_12E1;
+ *
+ * int tempSwap;
+ *
+ * int cx;
+ * int bp;
+ * int bpSave;
+ *
+ * char* diPtr;
+ * char* siPtr;
+ *
+ * int direction = 1;
+ * int dx = height;
+ * int ax = width;
+ * int es = ax << 1;
+ * int bx = 0;
+ * int di = 199;
+ * int si;
+ *
+ * ax = y;
+ * si = 0;
+ *
+ * if(y>199) // out of screen vertically
+ * return;
+ *
+ * if(y<0) // cropped on the top
+ * {
+ * cx = bx;
+ * bx -= ax;
+ * dx -= bx;
+ * if(dx <= 0)
+ * {
+ * return;
+ * }
+ * ax = es; // es = size of a line ?
+ * ax*=(bx&0xFF); // bx number of lines to skip vertically
+ * si+=ax;
+ * ax = cx;
+ * }
+ *
+ * bx = ax;
+ * ax += dx;
+ * ax--;
+ *
+ * if(ax > di)
+ * {
+ * ax -= di;
+ * dx -= ax;
+ *
+ * if(dx <= 0)
+ * {
+ * return;
+ * }
+ * }
+ *
+ * ax = dx;
+ * loc_10DF = ax;
+ * ax = bx;
+ * loc_10AD = ax;
+ *
+ * bx = 0;
+ * di = 319;
+ *
+ * ax = x;
+ * dx = ax;
+ * cx = ax&0xFF;
+ * cx &= 7;
+ * {
+ * int cl = cx;
+ * int ch = cl;
+ *
+ * cl-=8;
+ * cl=-cl;
+ * cl&=7;
+ * ax = (ch<<8) | (cl);
+ * }
+ * loc_1064 = ax;
+ * ax = es;
+ * ax <<= 3;
+ *
+ * tempSwap = dx;
+ * dx = ax;
+ * ax = tempSwap;
+ *
+ * if(ax > di)
+ * {
+ * return;
+ * }
+ *
+ * cx = ax;
+ * cx += dx;
+ * cx --;
+ *
+ * dx >>= 3;
+ *
+ * dx = dx&0xFF;
+ *
+ * if(cx<bx)
+ * {
+ * return;
+ * }
+ *
+ * if(cx>di)
+ * {
+ * cx -= di;
+ * cx >>= 3;
+ * dx = (dx&0xFF00) | (((dx&0xFF) - (cx&0xFF))&0xFF);
+ * dx = ((cx&0xFF)<<8) | (dx&0xFF);
+ * di = 0xF8F9;
+ * }
+ * else
+ * {
+ * di = 0xF8F8;
+ * }
+ *
+ * if(ax<bx)
+ * {
+ * ax -= bx;
+ * ax = -ax;
+ * ax >>= 3;
+ *
+ * si += ax;
+ * dx = (dx&0xFF00) | (((dx&0xFF)-(ax&0xFF))&0xFF);
+ * dx = (((dx&0xFF00) + ((ax&0xFF)<<8))&0xFF00) | (dx&0xFF);
+ * ax = bx;
+ * cx = di;
+ * cx = (248<<8)|(cx&0xFF);
+ * di = cx;
+ * }
+ *
+ * loc_10AA = ax;
+ * ax = (ax&0xFF00) | (((dx&0xFF00)>>8)&0xFF);
+ * ax = ax&0xFF;
+ * loc_10C5 = ax;
+ * ax = (ax&0xFF00) | (dx&0xFF);
+ *
+ * dx = loc_1064;
+ *
+ * if(dx)
+ * {
+ * if(di&1)
+ * {
+ * loc_10C5++;
+ * }
+ *
+ * bx = ax;
+ * ax--;
+ * loc_11DC = ax;
+ *
+ * if(di&0x100)
+ * {
+ * bx--;
+ * }
+ *
+ * ax = bx;
+ * ax -= 40;
+ * ax = -ax;
+ * loc_12D9 = ax;
+ * ax = di;
+ * loc_1277 = ax&0xFF;
+ * ax = (ax&0xFF00) | (((ax&0xFF00)>>8)&0xFF);
+ * loc_117C = ax&0xFF;
+ * }
+ * else
+ * {
+ * loc_10EC = ax;
+ * ax -= 40;
+ * ax = -ax;
+ * loc_1147 = ax;
+ * }
+ *
+ * bx = loc_10AA;
+ * ax = loc_10AD;
+ * bx = ((((((bx&0xFF00)>>8)&0xFF) + (ax&0xFF))<<8)&0xFF00) | (bx&0xFF);
+ *
+ * bx>>=3;
+ * ax<<=3;
+ *
+ * bx+=ax;
+ *
+ * diPtr = destPtr;
+ * diPtr += bx;
+ *
+ * ax = loc_10C5;
+ * ax<<=2;
+ * loc_114B = ax;
+ * loc_12DD = ax;
+ * ax = si;
+ * ax <<=2;
+ * siPtr = sourcePtr;
+ *
+ * siPtr+=ax;
+ *
+ * bp = loc_10DF;
+ * bx = dx;
+ * dx = 974;
+ *
+ * if(!bx) // no crop ?
+ * {
+ * do // for each line
+ * {
+ * bpSave = bp;
+ * cx = loc_10EC;
+ *
+ * do // for the line
+ * {
+ * outputBit(diPtr,0,*(siPtr));
+ * outputBit(diPtr,1,*(siPtr+1));
+ * outputBit(diPtr,2,*(siPtr+2));
+ * outputBit(diPtr,3,*(siPtr+3));
+ *
+ * siPtr+=4;
+ * diPtr++;
+ * }while(--cx);
+ *
+ * diPtr += loc_1147; // interline
+ * siPtr += loc_114B;
+ * bp = bpSave;
+ * }while(--bp);
+ * }
+ * else // croped
+ * {
+ * ASSERT(0);
+ * loc_1156:
+ * ax = (ax&0xFF00) | bx&0xFF;
+ * loc_11E7 = ax&0xFF;
+ * loc_127A = ax&0xFF;
+ * loc_1203 = ax&0xFF;
+ * loc_122B = ax&0xFF;
+ *
+ * ax = (ax&0xFF00) | (((bx&0xFF00)>>8)&0xFF);
+ * loc_117F = ax&0xFF;
+ * loc_11EF = ax&0xFF;
+ * loc_1217 = ax&0xFF;
+ *
+ * do // main copy loop
+ * {
+ * ax = bp;
+ * loc_12E1 = ax;
+ *
+ * if(loc_117C == 0xF8)
+ * {
+ * direction = 1;
+ * }
+ * else
+ * {
+ * direction = -1;
+ * }
+ *
+ * if(direction == -1)
+ * {
+ * goto label_11DC;
+ * }
+ *
+ * cx = loc_117F;
+ *
+ * ax = (ax&0xFF00) | (((*siPtr)&0xFF)>>cx)&0xFF;
+ * dx = (((ax&0xFF)<<8)&0xFF00) | (dx&0xFF);
+ * ax = (((ax&0xFF)<<8)&0xFF00) | (ax&0xFF);
+ *
+ * ax = (ax&0xFF00) | (((*(siPtr+1))&0xFF)>>cx)&0xFF;
+ * dx = (dx&0xFF00) | (ax&0xFF);
+ * ax = ((((((ax&0xFF00)>>8)&0xFF) | (ax&0xFF))<<8)&0xFF00) | (ax&0xFF);
+ *
+ * ax = (ax&0xFF00) | (((*(siPtr+2))&0xFF)>>cx)&0xFF;
+ * bx = (((ax&0xFF)<<8)&0xFF00) | (bx&0xFF);
+ * ax = ((((((ax&0xFF00)>>8)&0xFF) | (ax&0xFF))<<8)&0xFF00) | (ax&0xFF);
+ *
+ * ax = (ax&0xFF00) | (((*(siPtr+3))&0xFF)>>cx)&0xFF;
+ * bx = (bx&0xFF00) | (ax&0xFF);
+ * ax = ((((((ax&0xFF00)>>8)&0xFF) | (ax&0xFF))<<8)&0xFF00) | (ax&0xFF);
+ *
+ * if(ax)
+ * {
+ * bp = dx;
+ * ax = (ax&0xFF00) | (*diPtr)&0xFF;
+ * ax = (ax&0xFF00) | 8;
+ *
+ * outputBit(diPtr,0,(bp>>8)&0xFF);
+ * outputBit(diPtr,1,(bp&0xFF));
+ * outputBit(diPtr,2,(bx>>8)&0xFF);
+ * outputBit(diPtr,3,(bx&0xFF));
+ * }
+ *
+ * diPtr++;
+ *
+ * label_11DC:
+ *
+ * bp = loc_11DC;
+ * if(bp >0)
+ * {
+ * do
+ * {
+ * cx = loc_11E7;
+ *
+ * ax = (ax&0xFF00) | (((*siPtr)&0xFF)>>cx)&0xFF;
+ * dx = (((ax&0xFF)<<8)&0xFF00) | (dx&0xFF);
+ * cx = loc_11EF;
+ * ax = (ax&0xFF00) | (((*(siPtr+4))&0xFF)>>cx)&0xFF;
+ * dx = (((dx&0xFF00) | (((ax&0xFF)<<8)&0xFF00))&0xFF00) | (dx&0xFF);
+ * ax = (ax&0xFF00) | (((ax&0xFF) | (((dx&0xFF00)>>8)&0xFF))&0xFF);
+ * ax = ((ax&0xFF)<<8) | (ax&0xFF);
+ *
+ * ax = (ax&0xFF00) | (((*(siPtr+5))&0xFF)>>cx)&0xFF;
+ * dx = (dx&0xFF00) | (ax&0xFF);
+ * cx = loc_1203;
+ * ax = (ax&0xFF00) | (((*(siPtr+1))&0xFF)>>cx)&0xFF;
+ * dx = (dx&0xFF00) | ((dx&0xFF) | (ax&0xFF));
+ * ax = (ax&0xFF00) | ((ax&0xFF) | dx&0xFF);
+ * ax = (ax&0xFF00) | ((ax&0xFF)<<8) | (ax&0xFF);
+ *
+ * ax = (ax&0xFF00) | (((*(siPtr+2))&0xFF)>>cx)&0xFF;
+ * bx = (((ax&0xFF)<<8)&0xFF00) | (bx&0xFF);
+ * cx = loc_1217;
+ * ax = (ax&0xFF00) | (((*(siPtr+7))&0xFF)>>cx)&0xFF;
+ * bx = (((bx&0xFF00) | (((ax&0xFF)<<8)&0xFF00))&0xFF00) | (bx&0xFF);
+ * ax = (ax&0xFF00) | ((ax&0xFF) | ((bx&0xFF00)>>8));
+ * ax = (ax&0xFF00) | ((ax&0xFF)<<8) | (ax&0xFF);
+ *
+ * ax = (ax&0xFF00) | (((*(siPtr+7))&0xFF)>>cx)&0xFF;
+ * bx = (bx&0xFF00) | (ax&0xFF);
+ * cx = loc_122B;
+ * ax = (ax&0xFF00) | (((*(siPtr+3))&0xFF)>>cx)&0xFF;
+ * bx = (bx&0xFF00) | ((bx&0xFF) | (ax&0xFF));
+ * ax = (ax&0xFF00) | ((ax&0xFF) | bx&0xFF);
+ * ax = (ax&0xFF00) | ((ax&0xFF)<<8) | (ax&0xFF);
+ *
+ * if(ax)
+ * {
+ * cx = dx;
+ * ax = (ax&0xFF00) | (*diPtr)&0xFF;
+ * ax = (ax&0xFF00) | 8;
+ *
+ * outputBit(diPtr,0,(cx>>8)&0xFF);
+ * outputBit(diPtr,1,(cx&0xFF));
+ * outputBit(diPtr,2,(cx>>8)&0xFF);
+ * outputBit(diPtr,3,(cx&0xFF));
+ * }
+ *
+ * siPtr += 4;
+ * diPtr++;
+ * }while(--bp);
+ * }
+ *
+ * if(loc_122B == 0xF8)
+ * {
+ * direction = 1;
+ * }
+ * else
+ * {
+ * direction = -1;
+ * }
+ *
+ * if(direction == -1)
+ * {
+ * goto label_12D9;
+ * }
+ *
+ * cx = loc_127A;
+ *
+ * ax = (ax&0xFF00) | (((*siPtr)&0xFF)>>cx)&0xFF;
+ * dx = (((ax&0xFF)<<8)&0xFF00) | (dx&0xFF);
+ * ax = (((ax&0xFF)<<8)&0xFF00) | (ax&0xFF);
+ *
+ * ax = (ax&0xFF00) | (((*(siPtr+1))&0xFF)>>cx)&0xFF;
+ * dx = (dx&0xFF00) | (ax&0xFF);
+ * ax = ((((((ax&0xFF00)>>8)&0xFF) | (ax&0xFF))<<8)&0xFF00) | (ax&0xFF);
+ *
+ * ax = (ax&0xFF00) | (((*(siPtr+2))&0xFF)>>cx)&0xFF;
+ * bx = (((ax&0xFF)<<8)&0xFF00) | (bx&0xFF);
+ * ax = ((((((ax&0xFF00)>>8)&0xFF) | (ax&0xFF))<<8)&0xFF00) | (ax&0xFF);
+ *
+ * ax = (ax&0xFF00) | (((*(siPtr+3))&0xFF)>>cx)&0xFF;
+ * bx = (bx&0xFF00) | (ax&0xFF);
+ * ax = ((((((ax&0xFF00)>>8)&0xFF) | (ax&0xFF))<<8)&0xFF00) | (ax&0xFF);
+ *
+ * if(ax)
+ * {
+ * bp = dx;
+ * ax = (ax&0xFF00) | (*diPtr)&0xFF;
+ * ax = (ax&0xFF00) | 8;
+ *
+ * outputBit(diPtr,0,(bp>>8)&0xFF);
+ * outputBit(diPtr,1,(bp&0xFF));
+ * outputBit(diPtr,2,(bx>>8)&0xFF);
+ * outputBit(diPtr,3,(bx&0xFF));
+ * }
+ *
+ * siPtr+=4;
+ *
+ * label_12D9:
+ * diPtr+=loc_12D9;
+ * siPtr+=loc_12DD;
+ * bp = loc_12E1;
+ *
+ * }while(--bp);
+ * } */
+
+ {
+ int cols = 320;
+ int rows = 200;
+ int row;
+ int col;
+ int i;
+ uint8 *pP;
+ short atariScreen[320 * 200 / 4];
+
+ for (i = 0; i < rows * cols / 4; i++) {
+ atariScreen[i] = *(int16 *) sourcePtr;
+ flipShort(&atariScreen[i]);
+ sourcePtr += 2;
+ }
+
+ memcpy(globalAtariScreen, atariScreen, sizeof(atariScreen));
+
+ pP = (uint8 *) destPtr;
+
+ for (row = 0; row < rows; ++row) {
+ for (col = 0; col < cols; ++col, ++pP) {
+ long int c, ind, b, plane;
+
+ ind = 80 * row + ((col >> 4) << 2);
+ b = 0x8000 >> (col & 0xf);
+ c = 0;
+
+ for (plane = 0; plane < 4; ++plane) {
+ if (b & atariScreen[ind + plane]) {
+ c |= (1 << plane);
+ }
+ }
+
+ *pP = (uint8) c;
+ }
+ }
+ }
+/*
+ {
+ int i;
+ int j;
+
+ for(i=x;i<height+x;i++)
+ {
+ for(j=y;j<width*16+y;j++)
+ {
+ if(i>=0&&i<200&&j>=0&&j<320)
+ destPtr[i*320+j] = *(sourcePtr++);
+ }
+ }
+ }*/
+}
+
+void gfxModuleData_setDirtyColors(int min, int max) {
+ if (min < palDirtyMin)
+ palDirtyMin = min;
+ if (max > palDirtyMax)
+ palDirtyMax = max;
+}
+
+void gfxModuleData_setPalColor(int idx, int r, int g, int b) {
+ lpalette[idx].R = r;
+ lpalette[idx].G = g;
+ lpalette[idx].B = b;
+ gfxModuleData_setDirtyColors(idx, idx);
+}
+
+void gfxModuleData_setPal256(int16 *ptr) {
+ int R;
+ int G;
+ int B;
+ int i;
+
+ for (i = 0; i < 256; i++) {
+ R = *(ptr++);
+ G = *(ptr++);
+ B = *(ptr++);
+
+ lpalette[i].R = R;
+ lpalette[i].G = G;
+ lpalette[i].B = B;
+ lpalette[i].A = 255;
+ }
+
+ gfxModuleData_setDirtyColors(0, 255);
+}
+
+void gfxModuleData_setPal(uint8 *ptr) {
+ int i;
+ int R;
+ int G;
+ int B;
+
+ for (i = 0; i < 16; i++) {
+#define convertRatio 36.571428571428571428571428571429
+ short int atariColor = *(int16 *) ptr;
+ //flipShort(&atariColor);
+ ptr += 2;
+
+ R = (int)(convertRatio * ((atariColor & 0x700) >> 8));
+ G = (int)(convertRatio * ((atariColor & 0x070) >> 4));
+ B = (int)(convertRatio * ((atariColor & 0x007)));
+
+ if (R > 0xFF)
+ R = 0xFF;
+ if (G > 0xFF)
+ G = 0xFF;
+ if (B > 0xFF)
+ B = 0xFF;
+
+ lpalette[i].R = R;
+ lpalette[i].G = G;
+ lpalette[i].B = B;
+ lpalette[i].A = 255;
+ }
+
+ gfxModuleData_setDirtyColors(0, 16);
+}
+
+void gfxModuleData_field_90(void) {
+}
+
+void gfxModuleData_gfxWaitVSync(void) {
+}
+
+void gfxModuleData_flip(void) {
+}
+
+void gfxModuleData_field_64(char *sourceBuffer, int width, int height,
+ char *dest, int x, int y, int color) {
+ int i;
+ int j;
+
+ x = 0;
+ y = 0;
+
+ for (i = 0; i < height; i++) {
+ for (j = 0; j < width; j++) {
+ dest[(y + i) * 320 / 4 + x + j] =
+ sourceBuffer[i * width + j];
+ }
+ }
+}
+
+void gfxModuleData_flipScreen(void) {
+ memcpy(globalScreen, gfxModuleData.pPage00, 320 * 200);
+
+ flip();
+}
+
+void flip() {
+ int i;
+ byte paletteRGBA[256 * 4];
+ //uint8* outPtr = scaledScreen;
+ //uint8* inPtr = globalScreen;
+
+ if (palDirtyMax != -1) {
+ for (i = palDirtyMin; i < palDirtyMax; i++) {
+ paletteRGBA[i * 4 + 0] = lpalette[i].R;
+ paletteRGBA[i * 4 + 1] = lpalette[i].G;
+ paletteRGBA[i * 4 + 2] = lpalette[i].B;
+ paletteRGBA[i * 4 + 3] = 0xFF;
+ }
+ g_system->setPalette(paletteRGBA, palDirtyMin, palDirtyMax - palDirtyMin + 1);
+ palDirtyMin = 256;
+ palDirtyMax = -1;
+ }
+
+ g_system->copyRectToScreen(globalScreen, 320, 0, 0, 320, 200);
+ g_system->updateScreen();
+
+}
+
+} // End of namespace Cruise