/* 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]; 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(cxdi) { 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>= 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> 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=0&&i<200&&j>=0&&j<320) destPtr[i*320+j] = *(sourcePtr++); } } }*/ } 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; } } 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; } } 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; for(i=0;i<256;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, 0, 16); g_system->copyRectToScreen(globalScreen, 320, 0, 0, 320, 200); g_system->updateScreen(); } } // End of namespace Cruise