aboutsummaryrefslogtreecommitdiff
path: root/sword2/maketext.h
blob: 476fbfc3088dc7cc5f7bc12b6c54edacad8fbfc6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* Copyright (C) 1994-2003 Revolution Software Ltd
 *
 * 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
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * $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"

// 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

enum {
	// only for debug text, since it doesn't keep text inside the screen
	// margin!
	NO_JUSTIFICATION = 0,

	// 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,
	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
};

struct TextBloc {
	int16 x;
	int16 y;
	// RDSPR_ status bits - see defintion of SpriteInfo structure for
	// correct size!
	uint16 type;
	Memory *text_mem;
};

struct LineInfo {
	uint16 width;	// width of line in pixels
	uint16 length;	// length of line in characters
};

class FontRenderer {
private:
	Sword2Engine *_vm;
	TextBloc _blocList[MAX_text_blocs];

	// layout variables - these used to be defines, but now we're dealing
	// with 2 character sets

	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

	uint16 analyseSentence(uint8 *sentence, uint16 maxWidth, uint32 fontRes, LineInfo *line);
	Memory *buildTextSprite(uint8 *sentence, uint32 fontRes, uint8 pen, LineInfo *line, uint16 noOfLines);
	uint16 charWidth(uint8 ch, uint32 fontRes);
	uint16 charHeight(uint32 fontRes);
	FrameHeader* findChar(uint8 ch, uint8 *charSet);
	void copyChar(FrameHeader *charPtr, uint8 *spritePtr, uint16 spriteWidth, uint8 pen);
	
public:
	FontRenderer(Sword2Engine *vm) : _vm(vm) {
		for (int i = 0; i < MAX_text_blocs; i++)
			_blocList[i].text_mem = NULL;
	}

	Memory *makeTextSprite(uint8 *sentence, uint16 maxWidth, uint8 pen, uint32 fontRes, uint8 border = BORDER_PEN);

	void killTextBloc(uint32 bloc_number);
	void printTextBlocs(void);

	uint32 buildNewBloc(uint8 *ascii, int16 x, int16 y, uint16 width, uint8 pen, uint32 type, uint32 fontRes, uint8 justification);
};

} // End of namespace Sword2

#endif