diff options
Diffstat (limited to 'engines/cruise/gfxModule.cpp')
-rw-r--r-- | engines/cruise/gfxModule.cpp | 97 |
1 files changed, 53 insertions, 44 deletions
diff --git a/engines/cruise/gfxModule.cpp b/engines/cruise/gfxModule.cpp index 1e77037e84..4a88e6ed5e 100644 --- a/engines/cruise/gfxModule.cpp +++ b/engines/cruise/gfxModule.cpp @@ -34,16 +34,25 @@ namespace Cruise { -typedef Common::List<Common::Rect> RectList; +uint8 page00[320 * 200]; +uint8 page10[320 * 200]; -/*gfxModuleDataStruct gfxModuleData = { +char screen[320 * 200]; +palEntry lpalette[256]; + +int palDirtyMin = 256; +int palDirtyMax = -1; + +bool _dirtyRectScreen = false; + +gfxModuleDataStruct gfxModuleData = { 0, // use Tandy 0, // use EGA 1, // use VGA - CVars.page00, // pPage00 - CVars.page10, // pPage10 -};*/ + page00, // pPage00 + page10, // pPage10 +}; void gfxModuleData_gfxClearFrameBuffer(uint8 *ptr) { memset(ptr, 0, 64000); @@ -99,16 +108,16 @@ void convertGfxFromMode5(const uint8 *sourcePtr, int width, int height, uint8 *d } void gfxModuleData_setDirtyColors(int min, int max) { - if (min < CVars.palDirtyMin) - CVars.palDirtyMin = min; - if (max > CVars.palDirtyMax) - CVars.palDirtyMax = max; + if (min < palDirtyMin) + palDirtyMin = min; + if (max > palDirtyMax) + palDirtyMax = max; } void gfxModuleData_setPalColor(int idx, int r, int g, int b) { - CVars.lpalette[idx].R = r; - CVars.lpalette[idx].G = g; - CVars.lpalette[idx].B = b; + lpalette[idx].R = r; + lpalette[idx].G = g; + lpalette[idx].B = b; gfxModuleData_setDirtyColors(idx, idx); } @@ -120,10 +129,10 @@ void gfxModuleData_setPalEntries(const byte *ptr, int start, int num) { G = *(ptr++); B = *(ptr++); - CVars.lpalette[i].R = R; - CVars.lpalette[i].G = G; - CVars.lpalette[i].B = B; - CVars.lpalette[i].A = 255; + lpalette[i].R = R; + lpalette[i].G = G; + lpalette[i].B = B; + lpalette[i].A = 255; } gfxModuleData_setDirtyColors(start, start + num - 1); @@ -156,10 +165,10 @@ void gfxModuleData_setPal256(const byte *ptr) { if (B > 0xFF) B = 0xFF; - CVars.lpalette[i].R = R; - CVars.lpalette[i].G = G; - CVars.lpalette[i].B = B; - CVars.lpalette[i].A = 255; + lpalette[i].R = R; + lpalette[i].G = G; + lpalette[i].B = B; + lpalette[i].A = 255; } gfxModuleData_setDirtyColors(0, 16); @@ -214,18 +223,18 @@ void gfxCopyRect(const uint8 *sourceBuffer, int width, int height, byte *dest, i void gfxModuleData_Init() { memset(globalScreen, 0, 320 * 200); - memset(CVars.page00, 0, 320 * 200); - memset(CVars.page10, 0, 320 * 200); + memset(page00, 0, 320 * 200); + memset(page10, 0, 320 * 200); } void gfxModuleData_flipScreen() { - memcpy(globalScreen, CVars.pPage00, 320 * 200); + memcpy(globalScreen, gfxModuleData.pPage00, 320 * 200); flip(); } void gfxModuleData_addDirtyRect(const Common::Rect &r) { - CVars._dirtyRects.push_back(Common::Rect( MAX(r.left, (int16)0), MAX(r.top, (int16)0), + _vm->_dirtyRects.push_back(Common::Rect( MAX(r.left, (int16)0), MAX(r.top, (int16)0), MIN(r.right, (int16)320), MIN(r.bottom, (int16)200))); } @@ -242,11 +251,11 @@ static bool unionRectangle(Common::Rect &pDest, const Common::Rect &pSrc1, const } static void mergeClipRects() { - RectList::iterator rOuter, rInner; + CruiseEngine::RectList::iterator rOuter, rInner; - for (rOuter = CVars._dirtyRects.begin(); rOuter != CVars._dirtyRects.end(); ++rOuter) { + for (rOuter = _vm->_dirtyRects.begin(); rOuter != _vm->_dirtyRects.end(); ++rOuter) { rInner = rOuter; - while (++rInner != CVars._dirtyRects.end()) { + while (++rInner != _vm->_dirtyRects.end()) { if ((*rOuter).intersects(*rInner)) { // these two rectangles overlap, so translate it to a bigger rectangle @@ -254,7 +263,7 @@ static void mergeClipRects() { unionRectangle(*rOuter, *rOuter, *rInner); // remove the inner rect from the list - CVars._dirtyRects.erase(rInner); + _vm->_dirtyRects.erase(rInner); // move back to beginning of list rInner = rOuter; @@ -266,16 +275,16 @@ static void mergeClipRects() { void gfxModuleData_updatePalette() { byte paletteRGBA[256 * 4]; - if (CVars.palDirtyMax != -1) { - for (int i = CVars.palDirtyMin; i <= CVars.palDirtyMax; i++) { - paletteRGBA[i * 4 + 0] = CVars.lpalette[i].R; - paletteRGBA[i * 4 + 1] = CVars.lpalette[i].G; - paletteRGBA[i * 4 + 2] = CVars.lpalette[i].B; + if (palDirtyMax != -1) { + for (int 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 + CVars.palDirtyMin*4, CVars.palDirtyMin, CVars.palDirtyMax - CVars.palDirtyMin + 1); - CVars.palDirtyMin = 256; - CVars.palDirtyMax = -1; + g_system->setPalette(paletteRGBA + palDirtyMin*4, palDirtyMin, palDirtyMax - palDirtyMin + 1); + palDirtyMin = 256; + palDirtyMax = -1; } } @@ -285,32 +294,32 @@ void gfxModuleData_updateScreen() { } void flip() { - RectList::iterator dr; + CruiseEngine::RectList::iterator dr; // Update the palette gfxModuleData_updatePalette(); // Make a copy of the prior frame's dirty rects, and then backup the current frame's rects - RectList tempList = CVars._priorFrameRects; - CVars._priorFrameRects = CVars._dirtyRects; + CruiseEngine::RectList tempList = _vm->_priorFrameRects; + _vm->_priorFrameRects = _vm->_dirtyRects; // Merge the prior frame's dirty rects into the current frame's list for (dr = tempList.begin(); dr != tempList.end(); ++dr) { Common::Rect &r = *dr; - CVars._dirtyRects.push_back(Common::Rect(r.left, r.top, r.right, r.bottom)); + _vm->_dirtyRects.push_back(Common::Rect(r.left, r.top, r.right, r.bottom)); } // Merge any overlapping rects to simplify the drawing process mergeClipRects(); // Copy any modified areas - for (dr = CVars._dirtyRects.begin(); dr != CVars._dirtyRects.end(); ++dr) { + for (dr = _vm->_dirtyRects.begin(); dr != _vm->_dirtyRects.end(); ++dr) { Common::Rect &r = *dr; g_system->copyRectToScreen(globalScreen + 320 * r.top + r.left, 320, r.left, r.top, r.width(), r.height()); } - CVars._dirtyRects.clear(); + _vm->_dirtyRects.clear(); // Allow the screen to update g_system->updateScreen(); @@ -318,7 +327,7 @@ void flip() { void drawSolidBox(int32 x1, int32 y1, int32 x2, int32 y2, uint8 colour) { for (int y = y1; y < y2; ++y) { - byte *p = &CVars.pPage00[y * 320 + x1]; + byte *p = &gfxModuleData.pPage00[y * 320 + x1]; Common::set_to(p, p + (x2 - x1), colour); } } @@ -332,7 +341,7 @@ void resetBitmap(uint8 *dataPtr, int32 dataSize) { * to figure out rectangles of changed areas for dirty rectangles */ void switchBackground(const byte *newBg) { - const byte *bg = CVars.pPage00; + const byte *bg = gfxModuleData.pPage00; int sliceXStart, sliceXEnd; // If both the upper corners are different, presume it's a full screen change |