aboutsummaryrefslogtreecommitdiff
path: root/engines/cruise/gfxModule.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/cruise/gfxModule.cpp')
-rw-r--r--engines/cruise/gfxModule.cpp97
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