diff options
author | David Corrales | 2007-05-26 20:23:24 +0000 |
---|---|---|
committer | David Corrales | 2007-05-26 20:23:24 +0000 |
commit | 3646c968c9578c2a94d65ebd5fb06ec835f8c51d (patch) | |
tree | 8b57b339ebb31a1d7a67f1678aa5dc5c7759070a /engines/cruise/gfxModule.cpp | |
parent | d1f56d93f934150f4b579c2e90564e2bf035f113 (diff) | |
parent | ac45c5b33d834acbc9718f89be76e49d403a4d2c (diff) | |
download | scummvm-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.cpp | 659 |
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 |