2005-01-17 10:57:15 +00:00
|
|
|
/* Copyright (C) 1994-1998 Revolution Software Ltd.
|
2006-01-18 17:39:49 +00:00
|
|
|
* Copyright (C) 2003-2006 The ScummVM project
|
2003-07-28 01:44:38 +00:00
|
|
|
*
|
|
|
|
* 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
|
2005-10-18 01:30:26 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2003-07-28 01:44:38 +00:00
|
|
|
*
|
2006-02-09 15:12:44 +00:00
|
|
|
* $URL$
|
|
|
|
* $Id$
|
2003-07-28 01:44:38 +00:00
|
|
|
*/
|
|
|
|
|
2006-02-12 19:57:23 +00:00
|
|
|
#ifndef SWORD2_MAKETEXT_H
|
|
|
|
#define SWORD2_MAKETEXT_H
|
2003-07-28 01:44:38 +00:00
|
|
|
|
2003-10-28 19:51:30 +00:00
|
|
|
#include "sword2/debug.h"
|
2003-10-11 12:26:53 +00:00
|
|
|
|
2004-04-14 07:12:10 +00:00
|
|
|
namespace Sword2 {
|
|
|
|
|
2003-10-11 12:26:53 +00:00
|
|
|
// 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
|
|
|
|
|
2004-04-14 07:12:10 +00:00
|
|
|
// 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...
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2004-04-14 07:12:10 +00:00
|
|
|
#define MAX_text_blocs MAX_DEBUG_TEXTS + 1
|
2003-10-11 12:26:53 +00:00
|
|
|
|
|
|
|
enum {
|
2004-04-14 07:12:10 +00:00
|
|
|
// Doesn't keep the text inside the screen - only for debug text!
|
2003-10-11 12:26:53 +00:00
|
|
|
NO_JUSTIFICATION = 0,
|
|
|
|
|
2004-04-14 07:12:10 +00:00
|
|
|
// These all force text inside the screen edge margin when necessary
|
2003-10-11 12:26:53 +00:00
|
|
|
POSITION_AT_CENTRE_OF_BASE = 1,
|
|
|
|
POSITION_AT_CENTRE_OF_TOP = 2,
|
|
|
|
POSITION_AT_LEFT_OF_TOP = 3,
|
|
|
|
POSITION_AT_RIGHT_OF_TOP = 4,
|
|
|
|
POSITION_AT_LEFT_OF_BASE = 5,
|
|
|
|
POSITION_AT_RIGHT_OF_BASE = 6,
|
|
|
|
POSITION_AT_LEFT_OF_CENTRE = 7,
|
|
|
|
POSITION_AT_RIGHT_OF_CENTRE = 8
|
|
|
|
};
|
|
|
|
|
|
|
|
enum {
|
|
|
|
DEFAULT_TEXT = 0,
|
|
|
|
FINNISH_TEXT = 1,
|
|
|
|
POLISH_TEXT = 2
|
|
|
|
};
|
2003-07-28 01:44:38 +00:00
|
|
|
|
2004-04-14 07:12:10 +00:00
|
|
|
// Info about the text, used to create the SpriteInfo struct
|
|
|
|
|
|
|
|
struct TextBloc {
|
2003-10-11 12:26:53 +00:00
|
|
|
int16 x;
|
|
|
|
int16 y;
|
|
|
|
uint16 type;
|
2004-04-23 07:02:11 +00:00
|
|
|
byte *text_mem;
|
2003-12-28 15:08:12 +00:00
|
|
|
};
|
2003-07-28 01:44:38 +00:00
|
|
|
|
2004-04-14 07:12:10 +00:00
|
|
|
// Info for each line of words in the output text sprite
|
|
|
|
|
2003-12-28 15:08:12 +00:00
|
|
|
struct LineInfo {
|
2004-04-14 07:12:10 +00:00
|
|
|
uint16 width; // Width in pixels
|
|
|
|
uint16 length; // Length in characters
|
2003-12-28 15:08:12 +00:00
|
|
|
};
|
2003-07-28 01:44:38 +00:00
|
|
|
|
2003-10-11 12:26:53 +00:00
|
|
|
class FontRenderer {
|
|
|
|
private:
|
2003-11-16 14:18:29 +00:00
|
|
|
Sword2Engine *_vm;
|
2003-10-11 12:26:53 +00:00
|
|
|
TextBloc _blocList[MAX_text_blocs];
|
2003-07-28 01:44:38 +00:00
|
|
|
|
2004-04-14 07:12:10 +00:00
|
|
|
// Layout variables - these used to be defines, but now we're dealing
|
|
|
|
// with three character sets
|
2003-10-11 12:26:53 +00:00
|
|
|
|
|
|
|
int8 _lineSpacing; // no. of pixels to separate lines of
|
|
|
|
// characters in the output sprite - negative
|
|
|
|
// for overlap
|
|
|
|
int8 _charSpacing; // no. of pixels to separate characters along
|
|
|
|
// each line - negative for overlap
|
|
|
|
uint8 _borderPen; // output pen colour of character borders
|
|
|
|
|
2004-04-23 07:02:11 +00:00
|
|
|
uint16 analyseSentence(byte *sentence, uint16 maxWidth, uint32 fontRes, LineInfo *line);
|
|
|
|
byte *buildTextSprite(byte *sentence, uint32 fontRes, uint8 pen, LineInfo *line, uint16 noOfLines);
|
|
|
|
uint16 charWidth(byte ch, uint32 fontRes);
|
2003-10-11 12:26:53 +00:00
|
|
|
uint16 charHeight(uint32 fontRes);
|
Applied my own patch #1341495, in an attempt to fix alignment issues
reported by Crilith.
To elaborate a bit, the engine no longer accesses resource data through
packed structs. Instead it uses memory streams and the READ/WRITE
functions.
If data is mainly read, not written, I have replaced the old struct with a
new one with a read() function to read the whole thing from memory into the
struct's variables, and a write() function to dump the struct's variables
to memory. In fact, most of these write() functions remain unused.
If data is both read and written, I have replaced the struct with a class
with individual get/set functions to replace the old variables. This
manipulates memory directly.
Since I'm fairly sure that these structs are frequently stored as local
variables for a script, all script variables (both local and global) are
stored as little-endian and accessed through the READ/WRITE functions,
rather than being treated as arrays of 32-bit integers.
On a positive note, the functions for doing endian conversion of resources
and save games have been removed, and some general cleanups have been made
to assist in the rewrite.
Initial reports indicate that this patch indeed fixes alignment issues, and
that I have not - surprisingly - broken the game on big-endian platforms.
At least not in any immediately obvious way. And there's still plenty of
time to fix regressions before 0.9.0, too.
svn-id: r19366
2005-10-29 21:24:54 +00:00
|
|
|
byte *findChar(byte ch, byte *charSet);
|
|
|
|
void copyChar(byte *charPtr, byte *spritePtr, uint16 spriteWidth, uint8 pen);
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2003-10-11 12:26:53 +00:00
|
|
|
public:
|
2003-11-16 14:18:29 +00:00
|
|
|
FontRenderer(Sword2Engine *vm) : _vm(vm) {
|
2003-10-11 12:26:53 +00:00
|
|
|
for (int i = 0; i < MAX_text_blocs; i++)
|
|
|
|
_blocList[i].text_mem = NULL;
|
|
|
|
}
|
|
|
|
|
2004-08-25 05:57:17 +00:00
|
|
|
~FontRenderer() {
|
|
|
|
for (int i = 0; i < MAX_text_blocs; i++)
|
|
|
|
free(_blocList[i].text_mem);
|
|
|
|
}
|
|
|
|
|
2004-04-23 07:02:11 +00:00
|
|
|
byte *makeTextSprite(byte *sentence, uint16 maxWidth, uint8 pen, uint32 fontRes, uint8 border = BORDER_PEN);
|
2003-10-11 12:26:53 +00:00
|
|
|
|
|
|
|
void killTextBloc(uint32 bloc_number);
|
2005-05-02 05:41:01 +00:00
|
|
|
void printTextBlocs();
|
2003-10-11 12:26:53 +00:00
|
|
|
|
2004-04-23 07:02:11 +00:00
|
|
|
uint32 buildNewBloc(byte *ascii, int16 x, int16 y, uint16 width, uint8 pen, uint32 type, uint32 fontRes, uint8 justification);
|
2003-10-11 12:26:53 +00:00
|
|
|
};
|
|
|
|
|
2003-10-04 00:52:27 +00:00
|
|
|
} // End of namespace Sword2
|
|
|
|
|
2003-07-28 01:44:38 +00:00
|
|
|
#endif
|