aboutsummaryrefslogtreecommitdiff
path: root/sword2
diff options
context:
space:
mode:
authorTorbjörn Andersson2004-04-14 07:12:10 +0000
committerTorbjörn Andersson2004-04-14 07:12:10 +0000
commit3a4536e2e2ea74a4332447d59813b916f2aa3aa7 (patch)
treef450164473003b98b4e9dd24526321fce689b470 /sword2
parentfae6675c5be5788e1ec4456fdf866466b80577ff (diff)
downloadscummvm-rg350-3a4536e2e2ea74a4332447d59813b916f2aa3aa7.tar.gz
scummvm-rg350-3a4536e2e2ea74a4332447d59813b916f2aa3aa7.tar.bz2
scummvm-rg350-3a4536e2e2ea74a4332447d59813b916f2aa3aa7.zip
Cleanup. (Mostly of the comments.)
svn-id: r13579
Diffstat (limited to 'sword2')
-rw-r--r--sword2/console.h2
-rw-r--r--sword2/debug.cpp6
-rw-r--r--sword2/debug.h2
-rw-r--r--sword2/maketext.cpp507
-rw-r--r--sword2/maketext.h68
5 files changed, 247 insertions, 338 deletions
diff --git a/sword2/console.h b/sword2/console.h
index f25645dd49..d445b977f5 100644
--- a/sword2/console.h
+++ b/sword2/console.h
@@ -44,7 +44,7 @@ private:
int32 _showVar[MAX_SHOWVARS];
- uint8 _debugTextBlocks[MAX_DEBUG_TEXT_BLOCKS];
+ uint8 _debugTextBlocks[MAX_DEBUG_TEXTS];
void clearDebugTextBlocks(void);
void makeDebugTextBlock(char *text, int16 x, int16 y);
diff --git a/sword2/debug.cpp b/sword2/debug.cpp
index 85a463932a..8d9bb1d8b2 100644
--- a/sword2/debug.cpp
+++ b/sword2/debug.cpp
@@ -31,7 +31,7 @@ namespace Sword2 {
void Debugger::clearDebugTextBlocks(void) {
uint8 blockNo = 0;
- while (blockNo < MAX_DEBUG_TEXT_BLOCKS && _debugTextBlocks[blockNo] > 0) {
+ while (blockNo < MAX_DEBUG_TEXTS && _debugTextBlocks[blockNo] > 0) {
// kill the system text block
_vm->_fontRenderer->killTextBloc(_debugTextBlocks[blockNo]);
@@ -45,10 +45,10 @@ void Debugger::clearDebugTextBlocks(void) {
void Debugger::makeDebugTextBlock(char *text, int16 x, int16 y) {
uint8 blockNo = 0;
- while (blockNo < MAX_DEBUG_TEXT_BLOCKS && _debugTextBlocks[blockNo] > 0)
+ while (blockNo < MAX_DEBUG_TEXTS && _debugTextBlocks[blockNo] > 0)
blockNo++;
- assert(blockNo < MAX_DEBUG_TEXT_BLOCKS);
+ assert(blockNo < MAX_DEBUG_TEXTS);
_debugTextBlocks[blockNo] = _vm->_fontRenderer->buildNewBloc((uint8 *) text, x, y, 640 - x, 0, RDSPR_DISPLAYALIGN, CONSOLE_FONT_ID, NO_JUSTIFICATION);
}
diff --git a/sword2/debug.h b/sword2/debug.h
index e29a002ff0..644450f75c 100644
--- a/sword2/debug.h
+++ b/sword2/debug.h
@@ -21,7 +21,7 @@
#define D_DEBUG
// FIXME: I don't know how large this constant used to be
-#define MAX_DEBUG_TEXT_BLOCKS 50
+#define MAX_DEBUG_TEXTS 50
#define MAX_SHOWVARS 15
diff --git a/sword2/maketext.cpp b/sword2/maketext.cpp
index bc528bba28..7d90f9ba3e 100644
--- a/sword2/maketext.cpp
+++ b/sword2/maketext.cpp
@@ -35,141 +35,138 @@
// for new system by JEL on 9oct96 and updated again (for font
// as a resource) on 5dec96.
+#include "common/stdafx.h"
+#include "sword2/sword2.h"
+#include "sword2/defs.h"
+#include "sword2/logic.h"
+#include "sword2/maketext.h"
+#include "sword2/resman.h"
+#include "sword2/driver/d_draw.h"
+
+namespace Sword2 {
+
#define MAX_LINES 30 // max character lines in output sprite
#define BORDER_COL 200 // source colour for character border (only
// needed for remapping colours)
#define LETTER_COL 193 // source colour for bulk of character ( " )
-#define NO_COL 0 // sprite background - 0 for transparency!
#define SPACE ' '
#define FIRST_CHAR SPACE // first character in character set
#define LAST_CHAR 255 // last character in character set
#define DUD 64 // the first "chequered flag" (dud) symbol in
// our character set is in the '@' position
-#include "common/stdafx.h"
-#include "sword2/sword2.h"
-#include "sword2/defs.h"
-#include "sword2/logic.h"
-#include "sword2/maketext.h"
-#include "sword2/resman.h"
-#include "sword2/driver/d_draw.h"
-namespace Sword2 {
-
-// info for each line of words in the output text sprite
+/**
+ * This function creates a new text sprite in a movable memory block. It must
+ * be locked before use, i.e. lock, draw sprite, unlock/free. The sprite data
+ * contains a FrameHeader, but not a standard file header.
+ *
+ * @param sentence pointer to a null-terminated string
+ * @param maxWidth the maximum allowed text sprite width in pixels
+ * @param pen the text colour, or zero to use the source colours
+ * @param fontRes the font resource id
+ * @param border the border colour; black by default
+ * @return a handle to a floating memory block containing the text sprite
+ * @note The sentence must contain no leading, trailing or extra spaces.
+ * Out-of-range characters in the string are replaced by a special
+ * error-signal character (chequered flag)
+ */
Memory *FontRenderer::makeTextSprite(uint8 *sentence, uint16 maxWidth, uint8 pen, uint32 fontRes, uint8 border) {
- Memory *line; // handle for the memory block which will
- // contain the array of lineInfo structures
- Memory *textSprite; // handle for the block to contain the text
- // sprite itself
- uint16 noOfLines; // no of lines of text required to fit within
- // a sprite of width 'maxWidth' pixels
-
- debug(5, "makeTextSprite(\"%s\", maxWidth=%u)", sentence, maxWidth);
+ debug(3, "makeTextSprite(\"%s\", maxWidth=%u)", sentence, maxWidth);
_borderPen = border;
- // NB. ensure sentence contains no leading/tailing/extra spaces - if
- // necessary, copy to another array first, missing the extra spaces.
-
- // set the global layout variables
+ // Line- and character spacing are hard-wired, rather than being part
+ // of the resource.
if (fontRes == _vm->_speechFontId) {
- _lineSpacing = -6; // overlap lines by 6 pixels
- _charSpacing = -3; // overlap characters by 3 pixels
+ _lineSpacing = -6;
+ _charSpacing = -3;
} else if (fontRes == CONSOLE_FONT_ID) {
- _lineSpacing = 0; // no space or overlap between lines
- _charSpacing = 1; // 1 pixel spacing between each character
+ _lineSpacing = 0;
+ _charSpacing = 1;
} else {
_lineSpacing = 0;
_charSpacing = 0;
}
- // allocate memory for array of lineInfo structures
+ // Allocate memory for array of lineInfo structures
- line = _vm->_memory->allocMemory(MAX_LINES * sizeof(LineInfo), MEM_locked, (uint32) UID_temp);
+ Memory *line = _vm->_memory->allocMemory(MAX_LINES * sizeof(LineInfo), MEM_locked, UID_temp);
- // get details of sentence breakdown into array of LineInfo structures
- // and get the no of lines involved
+ // Get details of sentence breakdown into array of LineInfo structures
+ // and get the number of lines involved
- noOfLines = analyseSentence(sentence, maxWidth, fontRes, (LineInfo *) line->ad);
+ uint16 noOfLines = analyseSentence(sentence, maxWidth, fontRes, (LineInfo *) line->ad);
- // construct the sprite based on the info gathered - returns floating
+ // Construct the sprite based on the info gathered - returns floating
// mem block
- textSprite = buildTextSprite(sentence, fontRes, pen, (LineInfo *) line->ad, noOfLines);
+ Memory *textSprite = buildTextSprite(sentence, fontRes, pen, (LineInfo *) line->ad, noOfLines);
- // free up the lineInfo array now
_vm->_memory->freeMemory(line);
-
return textSprite;
}
uint16 FontRenderer::analyseSentence(uint8 *sentence, uint16 maxWidth, uint32 fontRes, LineInfo *line) {
- uint16 pos = 0, wordWidth, wordLength, spaceNeeded;
- uint16 lineNo = 0;
- uint8 ch;
- bool firstWord = true;
-
// joinWidth = how much extra space is needed to append a word to a
// line. NB. SPACE requires TWICE the '_charSpacing' to join a word
// to line
uint16 joinWidth = charWidth(SPACE, fontRes) + 2 * _charSpacing;
-
- // while not reached the NULL terminator
+
+ uint16 lineNo = 0;
+ uint16 pos = 0;
+ bool firstWord = true;
+
+ uint8 ch;
do {
- // new word
- wordWidth = 0;
- wordLength = 0;
+ uint16 wordWidth = 0;
+ uint16 wordLength = 0;
- // get first char of word (at position 'pos')
- ch = sentence[pos++];
+ // Calculate the width of the word.
- // while not SPACE or NULL terminator
+ ch = sentence[pos++];
- while ((ch != SPACE) && ch) {
+ while (ch && ch != SPACE) {
wordWidth += charWidth(ch, fontRes) + _charSpacing;
wordLength++;
ch = sentence[pos++];
}
- // no _charSpacing after final letter of word!
+ // Don't include any character spacing at the end of the word.
wordWidth -= _charSpacing;
// 'ch' is now the SPACE or NULL following the word
// 'pos' indexes to the position following 'ch'
if (firstWord) {
- // first word on first line, so no separating SPACE
- // needed
+ // This is the first word on the line, so no separating
+ // space is needed.
line[0].width = wordWidth;
line[0].length = wordLength;
firstWord = false;
} else {
- // see how much extra space this word will need to
+ // See how much extra space this word will need to
// fit on current line (with a separating space
// character - also overlapped)
- spaceNeeded = joinWidth + wordWidth;
+ uint16 spaceNeeded = joinWidth + wordWidth;
if (line[lineNo].width + spaceNeeded <= maxWidth) {
- // fits this line
+ // The word fits on this line.
line[lineNo].width += spaceNeeded;
- // NB. space+word characters
- line[lineNo].length += 1 + wordLength;
+ line[lineNo].length += (1 + wordLength);
} else {
- // put word (without separating SPACE) at
- // start of next line
+ // The word spills over to the next line, i.e.
+ // no separating space.
- // for next LineInfo structure in the array
lineNo++;
- // exception if lineNo >= MAX_LINES
- // debug_only( lineNo < MAX_LINES );
+ assert(lineNo < MAX_LINES);
line[lineNo].width = wordWidth;
line[lineNo].length = wordLength;
@@ -177,268 +174,235 @@ uint16 FontRenderer::analyseSentence(uint8 *sentence, uint16 maxWidth, uint32 fo
}
} while (ch);
- // return no of lines
return lineNo + 1;
}
-// Returns a handle to a floating memory block containing a text sprite, given
-// a pointer to a null-terminated string, pointer to required character set,
-// required text pen colour (or zero to use source colours), pointer to the
-// array of linInfo structures created by 'analyseSentence()', and the number
-// of lines (ie. no. of elements in the 'line' array).
-
-// PC Version of BuildTextSprite
+/**
+ * This function creates a new text sprite in a movable memory block. It must
+ * be locked before use, i.e. lock, draw sprite, unlock/free. The sprite data
+ * contains a FrameHeader, but not a standard file header.
+ *
+ * @param sentence pointer to a null-terminated string
+ * @param fontRes the font resource id
+ * @param pen the text colour, or zero to use the source colours
+ * @param line array of LineInfo structures, created by analyseSentence()
+ * @param noOfLines the number of lines, i.e. the number of elements in 'line'
+ * @return a handle to a floating memory block containing the text sprite
+ * @note The sentence must contain no leading, trailing or extra spaces.
+ * Out-of-range characters in the string are replaced by a special
+ * error-signal character (chequered flag)
+ */
Memory *FontRenderer::buildTextSprite(uint8 *sentence, uint32 fontRes, uint8 pen, LineInfo *line, uint16 noOfLines) {
- uint8 *linePtr, *spritePtr;
- uint16 lineNo, pos = 0, posInLine, spriteWidth = 0, spriteHeight;
- uint16 sizeOfSprite;
- uint16 char_height = charHeight(fontRes);
- FrameHeader *frameHeadPtr, *charPtr;
- Memory *textSprite;
- uint8 *charSet;
+ uint16 i;
+
+ // Find the width of the widest line in the output text
- // spriteWidth = width of widest line of output text
+ uint16 spriteWidth = 0;
- for (lineNo = 0; lineNo < noOfLines; lineNo++)
- if (line[lineNo].width > spriteWidth)
- spriteWidth = line[lineNo].width;
+ for (i = 0; i < noOfLines; i++)
+ if (line[i].width > spriteWidth)
+ spriteWidth = line[i].width;
- // spriteHeight = tot height of char lines + tot height of separating
- // lines
+ // Find the total height of the text sprite: the total height of the
+ // text lines, plus the total height of the spacing between them.
- spriteHeight = char_height * noOfLines + _lineSpacing * (noOfLines - 1);
+ uint16 char_height = charHeight(fontRes);
+ uint16 spriteHeight = char_height * noOfLines + _lineSpacing * (noOfLines - 1);
- // total size (no of pixels)
- sizeOfSprite = spriteWidth * spriteHeight;
+ // Allocate memory for the text sprite
- // allocate memory for sprite, and lock it ready for use
- // NB. 'textSprite' is the given pointer to the handle to be used
- textSprite = _vm->_memory->allocMemory(sizeof(FrameHeader) + sizeOfSprite, MEM_locked, (uint32) UID_text_sprite);
+ uint32 sizeOfSprite = spriteWidth * spriteHeight;
+ Memory *textSprite = _vm->_memory->allocMemory(sizeof(FrameHeader) + sizeOfSprite, MEM_locked, UID_text_sprite);
- // the handle (*textSprite) now points to UNMOVABLE memory block
- // set up the frame header
+ // At this stage, textSprite points to an unmovable memory block. Set
+ // up the frame header.
- // point to the start of our memory block
- frameHeadPtr = (FrameHeader *) textSprite->ad;
+ FrameHeader *frameHeadPtr = (FrameHeader *) textSprite->ad;
frameHeadPtr->compSize = 0;
frameHeadPtr->width = spriteWidth;
frameHeadPtr->height = spriteHeight;
-
- debug(5, "spriteWidth=%u", spriteWidth);
- debug(5, "spriteHeight=%u", spriteHeight);
- // ok, now point to the start (of the first line) of the sprite data
- // itelf
+ debug(4, "Text sprite size: %ux%u", spriteWidth, spriteHeight);
- linePtr = textSprite->ad + sizeof(FrameHeader);
+ // Clear the entire sprite to make it transparent.
- // start with transparent sprite (no colour)
- memset(linePtr, NO_COL, sizeOfSprite);
+ uint8 *linePtr = textSprite->ad + sizeof(FrameHeader);
+ memset(linePtr, 0, sizeOfSprite);
- // open font file
- charSet = _vm->_resman->openResource(fontRes);
+ uint8 *charSet = _vm->_resman->openResource(fontRes);
- // fill sprite with characters, one line at a time
+ // Build the sprite, one line at a time
- for (lineNo = 0; lineNo < noOfLines; lineNo++) {
- // position the start of the line so that it is centred
- // across the sprite
+ uint16 pos = 0;
- spritePtr = linePtr + (spriteWidth - line[lineNo].width) / 2;
+ for (i = 0; i < noOfLines; i++) {
+ // Center each line
+ uint8 *spritePtr = linePtr + (spriteWidth - line[i].width) / 2;
// copy the sprite for each character in this line to the
// text sprite and inc the sprite ptr by the character's
// width minus the 'overlap'
- for (posInLine = 0; posInLine < line[lineNo].length; posInLine++) {
- charPtr = findChar(sentence[pos++], charSet);
-
-#ifdef _SWORD2_DEBUG
- if (charPtr->height != char_height)
- error("FONT ERROR: '%c' is not same height as the space", sentence[pos - 1]);
-#endif
+ for (uint j = 0; j < line[i].length; j++) {
+ FrameHeader *charPtr = findChar(sentence[pos++], charSet);
+ assert(charPtr->height == char_height);
copyChar(charPtr, spritePtr, spriteWidth, pen);
spritePtr += charPtr->width + _charSpacing;
}
- // skip space at end of last word in this line
+ // Skip space at end of last word in this line
pos++;
- // move to start of next character line in text sprite
linePtr += (char_height + _lineSpacing) * spriteWidth;
}
- // close font file
_vm->_resman->closeResource(fontRes);
- // unlock the sprite memory block, so it's movable
+ // Unlock the sprite memory block, so it's movable
_vm->_memory->floatMemory(textSprite);
-
return textSprite;
}
-// Returns the width of a character sprite, given the character's ASCII code
-// and a pointer to the start of the character set.
+/**
+ * @param ch the ASCII code of the character
+ * @param fontRes the font resource id
+ * @return the width of the character
+ */
uint16 FontRenderer::charWidth(uint8 ch, uint32 fontRes) {
- FrameHeader *charFrame;
- uint8 *charSet;
- uint16 width;
-
- // open font file
- charSet = _vm->_resman->openResource(fontRes);
+ uint8 *charSet = _vm->_resman->openResource(fontRes);
- // move to approp. sprite (header)
- charFrame = findChar(ch, charSet);
- width = charFrame->width;
+ FrameHeader *charFrame = findChar(ch, charSet);
+ uint16 width = charFrame->width;
- // close font file
_vm->_resman->closeResource(fontRes);
-
- // return its width
return width;
}
+/**
+ * @param fontRes the font resource id
+ * @return the height of a character sprite
+ * @note All characters in a font are assumed to have the same height, so
+ * there is no need to specify which one to look at.
+ */
+
// Returns the height of a character sprite, given the character's ASCII code
// and a pointer to the start of the character set.
uint16 FontRenderer::charHeight(uint32 fontRes) {
- FrameHeader *charFrame;
- uint8 *charSet;
- uint16 height;
+ uint8 *charSet = _vm->_resman->openResource(fontRes);
- // open font file
- charSet = _vm->_resman->openResource(fontRes);
+ FrameHeader *charFrame = findChar(FIRST_CHAR, charSet);
+ uint16 height = charFrame->height;
- // assume all chars the same height, i.e. FIRST_CHAR is as good as any
- charFrame = findChar(FIRST_CHAR, charSet);
- height = charFrame->height;
-
- // close font file
_vm->_resman->closeResource(fontRes);
-
- // return its height
return height;
}
-// Returns a pointer to the header of a character sprite, given the character's
-// ASCII code and a pointer to the start of the character set.
+/**
+ * @param ch the ASCII code of the character to find
+ * @param charSet pointer to the start of the character set
+ * @return pointer to the requested character or, if it's out of range, the
+ * 'dud' character (chequered flag)
+ */
FrameHeader* FontRenderer::findChar(uint8 ch, uint8 *charSet) {
- // if 'ch' out of range, print the 'dud' character (chequered flag)
if (ch < FIRST_CHAR)
ch = DUD;
-
return _vm->fetchFrameHeader(charSet, ch - FIRST_CHAR);
}
-// Copies a character sprite from 'charPtr' to the sprite buffer at 'spritePtr'
-// of width 'spriteWidth'. If pen is zero, it copies the data across directly,
-// otherwise it maps pixels of BORDER_COL to '_borderPen', and LETTER_COL to
-// 'pen'.
+/**
+ * Copies a character sprite to the sprite buffer.
+ * @param charPtr pointer to the character sprite
+ * @param spritePtr pointer to the sprite buffer
+ * @param spriteWidth the width of the character
+ * @param pen If zero, copy the data directly. Otherwise remap the
+ * sprite's colours from BORDER_COL to _borderPen and from
+ * LETTER_COL to pen.
+ */
void FontRenderer::copyChar(FrameHeader *charPtr, uint8 *spritePtr, uint16 spriteWidth, uint8 pen) {
- uint8 *rowPtr, *source, *dest;
- uint16 rows, cols;
+ uint8 *source = (uint8 *) charPtr + sizeof(FrameHeader);
+ uint8 *rowPtr = spritePtr;
- // now pts to sprite data for char 'ch'
- source = (uint8 *) charPtr + sizeof(FrameHeader);
+ for (uint i = 0; i < charPtr->height; i++) {
+ uint8 *dest = rowPtr;
- // pts to start of first row of char within text sprite
- rowPtr = spritePtr;
-
- for (rows = 0; rows < charPtr->height; rows++) {
- // start at beginning of row
- dest = rowPtr;
-
- // if required output pen is non-zero
if (pen) {
- for (cols = 0; cols < charPtr->width; cols++) {
- // inc source ptr along sprite data
+ // Use the specified colours
+ for (uint j = 0; j < charPtr->width; j++) {
switch (*source++) {
case LETTER_COL:
*dest = pen;
break;
case BORDER_COL:
- // don't do a border pixel if there's
+ // Don't do a border pixel if there's
// already a bit of another character
// underneath (for overlapping!)
-
if (!*dest)
*dest = _borderPen;
break;
-
- // do nothing if source pixel is zero,
+ default:
+ // Do nothing if source pixel is zero,
// ie. transparent
+ break;
}
-
- // inc dest ptr to next pixel along row
dest++;
}
} else {
- // pen is zero, so just copy character sprites
- // directly into text sprite without remapping colours
+ // Pen is zero, so just copy character sprites
+ // directly into text sprite without remapping colours.
+ // Apparently overlapping is never considered here?
memcpy(dest, source, charPtr->width);
source += charPtr->width;
}
-
- // next row down (add width of text sprite)
rowPtr += spriteWidth;
}
}
-// distance to keep speech text from edges of screen
+// Distance to keep speech text from edges of screen
#define TEXT_MARGIN 12
-// creates a text bloc in the list and returns the bloc number the list of
-// blocs are read and blitted at render time choose alignment type
-// RDSPR_DISPLAYALIGN or 0
+/**
+ * Creates a text bloc in the list and returns the bloc number. The list of
+ * blocs is read and blitted at render time. Choose alignment type
+ * RDSPR_DISPLAYALIGN or 0
+ */
uint32 FontRenderer::buildNewBloc(uint8 *ascii, int16 x, int16 y, uint16 width, uint8 pen, uint32 type, uint32 fontRes, uint8 justification) {
- uint32 j = 0;
- FrameHeader *frame_head;
- int16 text_left_margin;
- int16 text_right_margin;
- int16 text_top_margin;
- int16 text_bottom_margin;
-
- // find a free slot
- while (j < MAX_text_blocs && _blocList[j].text_mem)
- j++;
+ uint32 i = 0;
- assert(j < MAX_text_blocs);
+ while (i < MAX_text_blocs && _blocList[i].text_mem)
+ i++;
- // make the sprite!
- _blocList[j].text_mem = makeTextSprite(ascii, width, pen, fontRes);
+ assert(i < MAX_text_blocs);
- // speech to be centred above point (x,y), but kept on-screen
- // where (x,y) is a point somewhere just above the talker's head
+ // Create and position the sprite
- // debug text just to be printed normally from point (x,y)
-
- // JUSTIFICATION & POSITIONING
+ _blocList[i].text_mem = makeTextSprite(ascii, width, pen, fontRes);
// 'NO_JUSTIFICATION' means print sprite with top-left at (x,y)
// without margin checking - used for debug text
if (justification != NO_JUSTIFICATION) {
- frame_head = (FrameHeader *) _blocList[j].text_mem->ad;
+ FrameHeader *frame_head = (FrameHeader *) _blocList[i].text_mem->ad;
switch (justification) {
- // this one is always used for SPEECH TEXT; possibly
- // also for pointer text
case POSITION_AT_CENTRE_OF_BASE:
- x -= (frame_head->width) / 2;
+ // This one is always used for SPEECH TEXT; possibly
+ // also for pointer text
+ x -= (frame_head->width / 2);
y -= frame_head->height;
break;
case POSITION_AT_CENTRE_OF_TOP:
- x -= (frame_head->width) / 2;
+ x -= (frame_head->width / 2);
break;
case POSITION_AT_LEFT_OF_TOP:
- // the given coords are already correct for this!
+ // The given coords are already correct for this!
break;
case POSITION_AT_RIGHT_OF_TOP:
x -= frame_head->width;
@@ -451,7 +415,7 @@ uint32 FontRenderer::buildNewBloc(uint8 *ascii, int16 x, int16 y, uint16 width,
y -= frame_head->height;
break;
case POSITION_AT_LEFT_OF_CENTRE:
- y -= (frame_head->height) / 2;
+ y -= (frame_head->height / 2);
break;
case POSITION_AT_RIGHT_OF_CENTRE:
x -= frame_head->width;
@@ -459,22 +423,22 @@ uint32 FontRenderer::buildNewBloc(uint8 *ascii, int16 x, int16 y, uint16 width,
break;
}
- // ensure text sprite is a few pixels inside the visible screen
+ // Ensure text sprite is a few pixels inside the visible screen
// remember - it's RDSPR_DISPLAYALIGN
- text_left_margin = TEXT_MARGIN;
- text_right_margin = 640 - TEXT_MARGIN - frame_head->width;
- text_top_margin = TEXT_MARGIN;
- text_bottom_margin = 400 - TEXT_MARGIN - frame_head->height;
+ uint16 text_left_margin = TEXT_MARGIN;
+ uint16 text_right_margin = 640 - TEXT_MARGIN - frame_head->width;
+ uint16 text_top_margin = TEXT_MARGIN;
+ uint16 text_bottom_margin = 400 - TEXT_MARGIN - frame_head->height;
- // move if too far left or too far right
+ // Move if too far left or too far right
if (x < text_left_margin)
x = text_left_margin;
else if (x > text_right_margin)
x = text_right_margin;
- // move if too high or too low
+ // Move if too high or too low
if (y < text_top_margin)
y = text_top_margin;
@@ -482,109 +446,81 @@ uint32 FontRenderer::buildNewBloc(uint8 *ascii, int16 x, int16 y, uint16 width,
y = text_bottom_margin;
}
- _blocList[j].x = x;
- _blocList[j].y = y;
+ // The sprite is always uncompressed
+ _blocList[i].type = type | RDSPR_NOCOMPRESSION;
- // always uncompressed
- _blocList[j].type = type | RDSPR_NOCOMPRESSION;
+ _blocList[i].x = x;
+ _blocList[i].y = y;
- return j + 1;
+ return i + 1;
}
-void FontRenderer::printTextBlocs(void) {
- //called by build_display
-
- FrameHeader *frame;
- SpriteInfo spriteInfo;
- uint32 rv;
- uint32 j;
+/**
+ * Called by buildDisplay()
+ */
- for (j = 0; j < MAX_text_blocs; j++) {
- if (_blocList[j].text_mem) {
- frame = (FrameHeader *) _blocList[j].text_mem->ad;
+void FontRenderer::printTextBlocs(void) {
+ for (uint i = 0; i < MAX_text_blocs; i++) {
+ if (_blocList[i].text_mem) {
+ FrameHeader *frame = (FrameHeader *) _blocList[i].text_mem->ad;
+ SpriteInfo spriteInfo;
- spriteInfo.x = _blocList[j].x;
- spriteInfo.y = _blocList[j].y;
+ spriteInfo.x = _blocList[i].x;
+ spriteInfo.y = _blocList[i].y;
spriteInfo.w = frame->width;
spriteInfo.h = frame->height;
spriteInfo.scale = 0;
spriteInfo.scaledWidth = 0;
spriteInfo.scaledHeight = 0;
- spriteInfo.type = _blocList[j].type;
+ spriteInfo.type = _blocList[i].type;
spriteInfo.blend = 0;
- spriteInfo.data = _blocList[j].text_mem->ad + sizeof(FrameHeader);
+ spriteInfo.data = _blocList[i].text_mem->ad + sizeof(FrameHeader);
spriteInfo.colourTable = 0;
- rv = _vm->_graphics->drawSprite(&spriteInfo);
+ uint32 rv = _vm->_graphics->drawSprite(&spriteInfo);
if (rv)
- error("Driver Error %.8x in Print_text_blocs", rv);
+ error("Driver Error %.8x in printTextBlocs", rv);
}
}
}
void FontRenderer::killTextBloc(uint32 bloc_number) {
- //back to real
bloc_number--;
-
- if (_blocList[bloc_number].text_mem) {
- // release the floating memory and mark it as free
- _vm->_memory->freeMemory(_blocList[bloc_number].text_mem);
- _blocList[bloc_number].text_mem = 0;
- } else {
- // illegal kill - stop the system
- error("closing closed text bloc number %d", bloc_number);
- }
+ assert(_blocList[bloc_number].text_mem);
+ _vm->_memory->freeMemory(_blocList[bloc_number].text_mem);
+ _blocList[bloc_number].text_mem = 0;
}
-// The rest of this file doesn't belong in the FontRenderer class!
-
-// called from InitialiseGame() in sword2.cpp
-
-// resource 3258 contains text from location script for 152 (install, save &
+// Resource 3258 contains text from location script for 152 (install, save &
// restore text, etc)
#define TEXT_RES 3258
-// local line number of "save" (actor no. 1826)
+// Local line number of "save" (actor no. 1826)
#define SAVE_LINE_NO 1
void Sword2Engine::initialiseFontResourceFlags(void) {
- uint8 *textFile, *textLine;
- uint8 language;
-
- // open the text resource
- textFile = _resman->openResource(TEXT_RES);
+ uint8 *textFile = _resman->openResource(TEXT_RES);
// If language is Polish or Finnish it requires alternate fonts.
// Otherwise, use regular fonts
- // get the text line (& skip the 2 chars containing the wavId)
-
- textLine = fetchTextLine(textFile, SAVE_LINE_NO) + 2;
-
// "talenna" Finnish for "save"
// "zapisz" Polish for "save"
- if (strcmp((char *) textLine, "tallenna") == 0)
- language = FINNISH_TEXT;
- else if (strcmp((char *) textLine, "zapisz") == 0)
- language = POLISH_TEXT;
- else
- language = DEFAULT_TEXT;
+ // Get the text line (& skip the 2 chars containing the wavId)
+ char *textLine = (char *) fetchTextLine(textFile, SAVE_LINE_NO) + 2;
- // Set the game to use the appropriate fonts
- initialiseFontResourceFlags(language);
+ if (strcmp(textLine, "tallenna") == 0)
+ initialiseFontResourceFlags(FINNISH_TEXT);
+ else if (strcmp(textLine, "zapisz") == 0)
+ initialiseFontResourceFlags(POLISH_TEXT);
+ else
+ initialiseFontResourceFlags(DEFAULT_TEXT);
// Get the game name for the windows application
- // Get the text line - skip the 2 chars containing the wavId
-
- if (Logic::_scriptVars[DEMO])
- textLine = fetchTextLine(textFile, 451) + 2;
- else
- textLine = fetchTextLine(textFile, 54) + 2;
-
// According to the GetNameFunction(), which was never called and has
// therefore been removed, the name of the game is:
//
@@ -592,28 +528,35 @@ void Sword2Engine::initialiseFontResourceFlags(void) {
// AMERICAN: "Circle of Blood II"
// GERMAN: "Baphomet's Fluch II"
// default: "Some game or other, part 86"
+ //
+ // But we get it from the text resource instead.
- _graphics->setWindowName((char *) textLine);
+ if (Logic::_scriptVars[DEMO])
+ textLine = (char *) fetchTextLine(textFile, 451) + 2;
+ else
+ textLine = (char *) fetchTextLine(textFile, 54) + 2;
- // now ok to close the text file
+ _graphics->setWindowName(textLine);
_resman->closeResource(TEXT_RES);
}
-// called from the above function, and also from console.cpp
+/**
+ * Called from initialiseFontResourceFlags(), and also from console.cpp
+ */
void Sword2Engine::initialiseFontResourceFlags(uint8 language) {
switch (language) {
- case FINNISH_TEXT: // special Finnish fonts
+ case FINNISH_TEXT:
_speechFontId = FINNISH_SPEECH_FONT_ID;
_controlsFontId = FINNISH_CONTROLS_FONT_ID;
_redFontId = FINNISH_RED_FONT_ID;
break;
- case POLISH_TEXT: // special Polish fonts
+ case POLISH_TEXT:
_speechFontId = POLISH_SPEECH_FONT_ID;
_controlsFontId = POLISH_CONTROLS_FONT_ID;
_redFontId = POLISH_RED_FONT_ID;
break;
- default: // DEFAULT_TEXT - regular fonts
+ default:
_speechFontId = ENGLISH_SPEECH_FONT_ID;
_controlsFontId = ENGLISH_CONTROLS_FONT_ID;
_redFontId = ENGLISH_RED_FONT_ID;
diff --git a/sword2/maketext.h b/sword2/maketext.h
index 7e4b46fde8..c249ad3a1a 100644
--- a/sword2/maketext.h
+++ b/sword2/maketext.h
@@ -17,64 +17,28 @@
* $Header$
*/
-/****************************************************************************
- * MAKETEXT.H - Function prototype for text sprite builder routine JEL Oct96
- *
- * The routine returns a memory handle to a movable memory block containing
- * the required sprite, which must be locked before use. ie. lock, draw
- * sprite, unlock/free.
- *
- * The sprite data contains a frameHeader, but not a standard file header.
- *
- * Debugger will trap error when word too big for line (maxWidth) or when
- * more lines needed than max expected (MAX_LINES)
- *
- * PARAMETERS:
- *
- * 'sentence' points to a NULL-TERMINATED STRING
- * - string must contain no leading/tailing/extra spaces
- * - out-of-range characters in the string are forced to the output as
- * a special error-signal character (chequered flag)
- *
- * 'maxWidth' is the maximum allowed text sprite width, in PIXELS
- *
- * 'pen' is the desired colour (0-255) for the main body of each character
- *
- * NB. Border colour is #DEFINEd in textsprt.c (to a colour value for BLACK)
- * if 'pen' is zero, the characters are copied directly and NOT remapped.
- *
- * 'charSet' points to the beginning of the standard file header for the
- * desired character set
- *
- * NB. The first and last characters in the set are #DEFINEd in textsprt.c
- *
- * RETURNS:
- *
- * 'textSprite' points to the handle to be used for the text sprite
- *
- ****************************************************************************/
-
#ifndef _MAKETEXT_H
#define _MAKETEXT_H
#include "sword2/debug.h"
+namespace Sword2 {
+
// Output colour for character border - should be be black but note that we
// have to use a different pen number during sequences
#define BORDER_PEN 194
-namespace Sword2 {
-
-// allow enough for all the debug text blocks (see debug.cpp)
-#define MAX_text_blocs MAX_DEBUG_TEXT_BLOCKS + 1
+// Usually the only texts on screen are the subtitles and the mouse-over text,
+// but there can also be a considerable number of debugging messages...
+
+#define MAX_text_blocs MAX_DEBUG_TEXTS + 1
enum {
- // only for debug text, since it doesn't keep text inside the screen
- // margin!
+ // Doesn't keep the text inside the screen - only for debug text!
NO_JUSTIFICATION = 0,
- // these all force text inside the screen edge margin when necessary
+ // These all force text inside the screen edge margin when necessary
POSITION_AT_CENTRE_OF_BASE = 1,
POSITION_AT_CENTRE_OF_TOP = 2,
POSITION_AT_LEFT_OF_TOP = 3,
@@ -91,18 +55,20 @@ enum {
POLISH_TEXT = 2
};
-struct TextBloc {
+// Info about the text, used to create the SpriteInfo struct
+
+ struct TextBloc {
int16 x;
int16 y;
- // RDSPR_ status bits - see defintion of SpriteInfo structure for
- // correct size!
uint16 type;
Memory *text_mem;
};
+// Info for each line of words in the output text sprite
+
struct LineInfo {
- uint16 width; // width of line in pixels
- uint16 length; // length of line in characters
+ uint16 width; // Width in pixels
+ uint16 length; // Length in characters
};
class FontRenderer {
@@ -110,8 +76,8 @@ private:
Sword2Engine *_vm;
TextBloc _blocList[MAX_text_blocs];
- // layout variables - these used to be defines, but now we're dealing
- // with 2 character sets
+ // Layout variables - these used to be defines, but now we're dealing
+ // with three character sets
int8 _lineSpacing; // no. of pixels to separate lines of
// characters in the output sprite - negative