aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2009-03-01 02:19:06 +0000
committerPaul Gilbert2009-03-01 02:19:06 +0000
commitaa3462871303a7dc32053b4e4fd778fff11b90d3 (patch)
tree67bade87c3f904de9a4002ddd509b8c06a5312d3
parentc51d5835a078ada1e01bf6cb9e8094874a9f20ef (diff)
downloadscummvm-rg350-aa3462871303a7dc32053b4e4fd778fff11b90d3.tar.gz
scummvm-rg350-aa3462871303a7dc32053b4e4fd778fff11b90d3.tar.bz2
scummvm-rg350-aa3462871303a7dc32053b4e4fd778fff11b90d3.zip
Cleaned up parts of the font display system. Note: Cruise used two almost identical routines for text display - one which creates a draw structure, and the other draws directly to the screen. Since there don't seem to be any other differences, the immediate draw version has been changed to use the rendering version and then draw the results
svn-id: r38994
-rw-r--r--engines/cruise/font.cpp200
-rw-r--r--engines/cruise/font.h2
-rw-r--r--engines/cruise/gfxModule.cpp30
-rw-r--r--engines/cruise/gfxModule.h4
-rw-r--r--engines/cruise/mainDraw.cpp21
-rw-r--r--engines/cruise/mainDraw.h2
6 files changed, 46 insertions, 213 deletions
diff --git a/engines/cruise/font.cpp b/engines/cruise/font.cpp
index e60d22e457..6d87d0ef6f 100644
--- a/engines/cruise/font.cpp
+++ b/engines/cruise/font.cpp
@@ -28,6 +28,7 @@
#include "common/util.h"
#include "cruise/cruise_main.h"
+#include "cruise/mouse.h"
#include "cruise/staticres.h"
namespace Cruise {
@@ -200,15 +201,13 @@ void flipGen(void *var, int32 length) {
}
}
-void renderWord(const uint8 *fontPtr_Data, uint8 *outBufferPtr,
- int32 drawPosPixel_X, int32 heightOff, int32 height, int32 param4,
- int32 stringRenderBufferSize, int32 width, int32 charWidth) {
+void renderWord(const uint8 *fontPtr_Data, uint8 *outBufferPtr, int xOffset, int yOffset,
+ int32 height, int32 param4, int32 stringRenderBufferSize, int32 width, int32 charWidth) {
int i;
int j;
const uint8 *fontPtr_Data2 = fontPtr_Data + height * 2;
- outBufferPtr += heightOff * width * 2; // param2 = height , param6 = width
- outBufferPtr += drawPosPixel_X; // param1 = drawPosPixel_X
+ outBufferPtr += yOffset * width * 2 + xOffset;
for (i = 0; i < height; i++) { // y++
uint16 bitSet1 = READ_BE_UINT16(fontPtr_Data);
@@ -218,7 +217,7 @@ void renderWord(const uint8 *fontPtr_Data, uint8 *outBufferPtr,
fontPtr_Data2 += sizeof(uint16);
for (j = 0; j < charWidth; j++) {
- *outBufferPtr = ((bitSet1 >> 15) & 1) | ((bitSet2 >>14) & 2);
+ *outBufferPtr = ((bitSet1 >> 15) & 1) | ((bitSet2 >> 14) & 2);
outBufferPtr++;
bitSet1 <<= 1;
@@ -279,188 +278,17 @@ int32 prepareWordRender(int32 inRightBorder_X, int16 wordSpacingWidth,
return counter;
}
-void drawString(int32 x, int32 y, const char *string, uint8 *buffer, uint8 color,
- int32 inRightBorder_X) {
- const FontInfo *fontPtr;
- const FontEntry *fontPtr_Desc;
- const uint8 *fontPtr_Data;
- int16 wordSpacingWidth; // var1
- int16 wordSpacingHeight; // var2
- int32 rightBorder_X; // param2
- int32 lineHeight; // fontProc1result
- int32 numLines;
- int32 stringHeight;
- int32 stringFinished;
- int32 stringWidth; // var_1C
- int32 stringRenderBufferSize;
- int32 useDynamicBuffer;
- uint8 *currentStrRenderBuffer;
- // int32 var_8; // don't need that on
- int32 heightOffset; // var_12
- int32 renderBufferSize; // var_1E
- int needFlip;
-
- if (!buffer || !string)
- return;
-
- if (fontFileIndex != -1) {
- fontPtr = (const FontInfo *)filesDatabase[fontFileIndex].subData.ptr;
-
- if (!fontPtr) {
- fontPtr = (const FontInfo *)_systemFNT;
- }
- } else {
- fontPtr = (const FontInfo *)_systemFNT;
- }
+void drawString(int32 x, int32 y, const char *string, uint8 *buffer, uint8 fontColour, int32 rightBorder_X) {
- if (!fontPtr) {
- return;
- }
-
- fontPtr_Desc = (const FontEntry *)((const uint8 *)fontPtr + sizeof(FontInfo));
- fontPtr_Data = (const uint8 *)fontPtr + FROM_LE_32(fontPtr->offset);
+ // Get the rendered text to display
+ gfxEntryStruct *s = renderText(rightBorder_X, string);
- lineHeight = getLineHeight(FROM_LE_16(fontPtr->numChars), fontPtr_Desc);
-
- wordSpacingWidth = FROM_LE_16(fontPtr->hSpacing);
- wordSpacingHeight = FROM_LE_16(fontPtr->vSpacing);
-
- if (inRightBorder_X > 310) {
- rightBorder_X = 310;
- } else {
- rightBorder_X = inRightBorder_X;
- }
- if (x + rightBorder_X > 319) {
- x = 319 - rightBorder_X;
- }
- if (y < 0) {
- y = 0;
- }
- if (x < 0) {
- x = 0;
- }
- numLines = getTextLineCount(rightBorder_X, wordSpacingWidth, fontPtr_Desc, string); // ok
-
- if (!numLines) {
- return;
- }
- stringHeight = ((wordSpacingHeight + lineHeight + 2) * numLines) + 1;
-
- if (y + stringHeight > 199) {
- y = 200 - stringHeight;
- }
- stringFinished = 0;
- stringWidth = (rightBorder_X / 16) + 2;
- stringRenderBufferSize = stringWidth * stringHeight * 4;
- inRightBorder_X = rightBorder_X;
-
- if (stringRenderBufferSize > 0x2000) {
- currentStrRenderBuffer =
- (uint8 *) mallocAndZero(stringRenderBufferSize);
-
- if (!currentStrRenderBuffer) {
- return;
- }
- useDynamicBuffer = 1;
- } else {
- currentStrRenderBuffer = (uint8 *) workBuffer;
- useDynamicBuffer = 0;
- }
-
- resetRaster(currentStrRenderBuffer, stringRenderBufferSize);
-
- // var_8 = 0;
- heightOffset = 0;
- renderBufferSize = stringRenderBufferSize;
+ // Draw the message
+ drawMessage(s, x, y, rightBorder_X - x, fontColour, buffer);
- do {
- int spacesCount = 0; // si
- char character = *(string);
- short int strPixelLength; // var_16;
- const char *ptrStringEnd; // var_4 //ok
- int drawPosPixel_X; // di
-
- while (character == ' ') {
- spacesCount++;
- character = *(string + spacesCount);
- }
-
- string += spacesCount;
- ptrStringEnd = string + prepareWordRender(inRightBorder_X, wordSpacingWidth, &strPixelLength, fontPtr_Desc, string); //ok
-
- if (inRightBorder_X > strPixelLength) {
- drawPosPixel_X =
- (inRightBorder_X - strPixelLength) / 2;
- } else {
- drawPosPixel_X = 0;
- }
- // drawPosPixel_X = var_8;
-
- do {
- character = *(string++);
-
- short int data = fontCharacterTable[(int)character];
-
- if (character) {
- if (character == ' ' || character == 0x7D) {
- drawPosPixel_X += wordSpacingWidth + 5;
- } else {
- if (data) {
- const FontEntry &fe = fontPtr_Desc[data];
-
- renderWord((const uint8 *)fontPtr_Data + FROM_LE_32(fe.offset),
- currentStrRenderBuffer,
- drawPosPixel_X,
- FROM_LE_16(fe.height2) - FROM_LE_16(fe.charHeight) +
- lineHeight + heightOffset,
- FROM_LE_16(fe.charHeight),
- FROM_LE_16(fe.v1),
- renderBufferSize / 2,
- stringWidth * 2,
- FROM_LE_16(fe.charWidth));
-
- drawPosPixel_X +=
- wordSpacingWidth + FROM_LE_16(fe.charWidth);
- }
- }
- } else {
- stringFinished = 1;
- }
-
- if (ptrStringEnd <= string) {
- break;
- }
-
- } while (!stringFinished);
-
- // var_8 = 0;
- heightOffset = wordSpacingHeight + lineHeight;
-
- } while (!stringFinished);
-
- needFlip = 0;
-
- if (buffer == gfxModuleData.pPage00) {
- if (gfxModuleData.field_1 != 0) {
- needFlip = 1;
- gfxModuleData_field_90();
- }
-
- gfxModuleData_gfxWaitVSync();
- }
-
- gfxModuleData_field_64((char *)currentStrRenderBuffer, stringWidth,
- stringHeight, (char *)buffer, x, y, 0);
- gfxModuleData_field_64((char *)currentStrRenderBuffer, stringWidth,
- stringHeight, (char *)buffer, x, y, color);
-
- if (needFlip) {
- gfxModuleData_flip();
- }
-
- if (useDynamicBuffer) {
- free(currentStrRenderBuffer);
- }
+ // Free the data
+ delete s->imagePtr;
+ delete s;
}
// calculates all necessary datas and renders text
@@ -531,7 +359,7 @@ gfxEntryStruct *renderText(int inRightBorder_X, const char *string) {
currentStrRenderBuffer =
(uint8 *) mallocAndZero(stringRenderBufferSize);
- resetRaster(currentStrRenderBuffer, stringRenderBufferSize);
+ resetBitmap(currentStrRenderBuffer, stringRenderBufferSize);
generatedGfxEntry = (gfxEntryStruct *) malloc(sizeof(gfxEntryStruct));
generatedGfxEntry->imagePtr = currentStrRenderBuffer;
diff --git a/engines/cruise/font.h b/engines/cruise/font.h
index 8895214416..0a3dc14379 100644
--- a/engines/cruise/font.h
+++ b/engines/cruise/font.h
@@ -68,7 +68,7 @@ void renderWord(uint8 *fontPtr_Data, uint8 *outBufferPtr,
int32 drawPosPixel_X, int32 heightOff, int32 height, int32 param4,
int32 stringRenderBufferSize, int32 width, int32 charWidth);
gfxEntryStruct *renderText(int inRightBorder_X, const char *string);
-void drawString(int32 x, int32 y, const char *string, uint8 * buffer, uint8 color,
+void drawString(int32 x, int32 y, const char *string, uint8 * buffer, uint8 fontColour,
int32 inRightBorder_X);
} // End of namespace Cruise
diff --git a/engines/cruise/gfxModule.cpp b/engines/cruise/gfxModule.cpp
index e46ea0da54..3671b01b0e 100644
--- a/engines/cruise/gfxModule.cpp
+++ b/engines/cruise/gfxModule.cpp
@@ -42,7 +42,6 @@ int palDirtyMin = 256;
int palDirtyMax = -1;
gfxModuleDataStruct gfxModuleData = {
- 0, // field_1
0, // use Tandy
0, // use EGA
1, // use VGA
@@ -193,25 +192,26 @@ void gfxModuleData_convertOldPalColor(uint16 oldColor, uint8* pOutput) {
*(pOutput++) = B;
}
-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;
+void gfxCopyRect(const byte *sourceBuffer, int width, int height, byte *dest, int x, int y, int colour) {
+ int xp, yp;
+
+ for (yp = 0; yp < height; ++yp) {
+ const uint8 *srcP = &sourceBuffer[yp * width];
+ uint8 *destP = &dest[(y + yp) * 320 + x];
- x = 0;
- y = 0;
+ for (xp = 0; xp < width; ++xp, ++srcP, ++destP) {
+ uint8 v = *srcP;
+ int xDest = x + xp;
+ int yDest = y + yp;
- for (i = 0; i < height; i++) {
- for (j = 0; j < width; j++) {
- dest[(y + i) * 320 / 4 + x + j] = sourceBuffer[i * width + j];
+ if ((v != 0) && (xDest >= 0) && (yDest >= 0) && (xDest < 320) && (yDest < 200))
+ *destP = (v == 1) ? 0 : colour;
}
}
}
@@ -271,4 +271,10 @@ void drawSolidBox(int32 x1, int32 y1, int32 x2, int32 y2, uint8 colour) {
}
}
+void resetBitmap(uint8 *dataPtr, int32 dataSize) {
+ memset(dataPtr, 0, dataSize);
+}
+
+
+
} // End of namespace Cruise
diff --git a/engines/cruise/gfxModule.h b/engines/cruise/gfxModule.h
index 7a48d4c2fc..d0aab71fc8 100644
--- a/engines/cruise/gfxModule.h
+++ b/engines/cruise/gfxModule.h
@@ -29,7 +29,6 @@
namespace Cruise {
struct gfxModuleDataStruct {
- int field_1;
int useTandy;
int useEGA;
int useVGA;
@@ -53,7 +52,7 @@ void gfxModuleData_setPalColor(int idx, int r, int g, int b);
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);
+void gfxCopyRect(const byte *sourceBuffer, int width, int height, byte *dest, int x, int y, int colour);
void gfxModuleData_gfxCopyScreen(char *sourcePtr, char *destPtr);
void convertGfxFromMode4(uint8 *sourcePtr, int width, int height, uint8 *destPtr);
void convertGfxFromMode5(uint8 *sourcePtr, int width, int height, uint8 *destPtr);
@@ -63,6 +62,7 @@ void gfxModuleData_convertOldPalColor(uint16 oldColor, uint8* pOutput);
void gfxModuleData_setPal256(uint8 * ptr);
void flip(void);
void drawSolidBox(int32 x1, int32 y1, int32 x2, int32 y2, uint8 colour);
+void resetBitmap(uint8 *dataPtr, int32 dataSize);
} // End of namespace Cruise
diff --git a/engines/cruise/mainDraw.cpp b/engines/cruise/mainDraw.cpp
index a42800994a..36a90c8d4c 100644
--- a/engines/cruise/mainDraw.cpp
+++ b/engines/cruise/mainDraw.cpp
@@ -1132,17 +1132,15 @@ void mainDrawPolygons(int fileIndex, cellStruct *plWork, int X, int scale, int Y
buildPolyModel(newX, newY, newScale, (char*)polygonMask, destBuffer, newFrame);
}
-void drawMessage(gfxEntryStruct *pGfxPtr, int globalX, int globalY, int width, int newColor, uint8 *ouputPtr) {
+void drawMessage(const gfxEntryStruct *pGfxPtr, int globalX, int globalY, int width, int newColor, uint8 *ouputPtr) {
// this is used for font only
if (pGfxPtr) {
uint8 *initialOuput;
uint8 *output;
- int i;
- int j;
- int x;
- int y;
- uint8 *ptr = pGfxPtr->imagePtr;
+ int xp, yp;
+ int x, y;
+ const uint8 *ptr = pGfxPtr->imagePtr;
int height = pGfxPtr->height;
if (width > 310)
@@ -1160,13 +1158,12 @@ void drawMessage(gfxEntryStruct *pGfxPtr, int globalX, int globalY, int width, i
initialOuput = ouputPtr + (globalY * 320) + globalX;
- y = globalY;
- x = globalX;
+ for (yp = 0; yp < height; yp++) {
+ output = initialOuput + 320 * yp;
+ y = globalY + yp;
- for (i = 0; i < height; i++) {
- output = initialOuput + 320 * i;
-
- for (j = 0; j < pGfxPtr->width; j++) {
+ for (xp = 0; xp < pGfxPtr->width; xp++) {
+ x = globalX + xp;
uint8 color = *(ptr++);
if (color) {
diff --git a/engines/cruise/mainDraw.h b/engines/cruise/mainDraw.h
index 0f51565129..98ba47c842 100644
--- a/engines/cruise/mainDraw.h
+++ b/engines/cruise/mainDraw.h
@@ -45,6 +45,8 @@ void getPolySize(int positionX, int positionY, int scale, int sizeTable[4], unsi
bool findPoly(char* dataPtr, int x, int y, int zoom, int mouseX, int mouseY);
unsigned char *drawPolyMode2(unsigned char *dataPointer, int linesToDraw);
void calcRGB(uint8* pColorSrc, uint8* pColorDst, int* offsetTable);
+void drawMessage(const gfxEntryStruct *pGfxPtr, int globalX, int globalY, int width, int newColor, uint8 *ouputPtr);
+
} // End of namespace Cruise
#endif