File: OFONT.h

package info (click to toggle)
7kaa 2.15.6%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 131,312 kB
  • sloc: cpp: 134,790; asm: 3,523; ansic: 1,949; perl: 1,665; makefile: 1,181; sh: 126; pascal: 27
file content (214 lines) | stat: -rw-r--r-- 6,733 bytes parent folder | download | duplicates (5)
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/*
 * Seven Kingdoms: Ancient Adversaries
 *
 * Copyright 1997,1998 Enlight 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, see <http://www.gnu.org/licenses/>.
 *
 */

//Filename    : OFONT.H
//Description : Header file of Object Font

#ifndef __OFONT_H
#define __OFONT_H

#ifndef __ALL_H
#include <ALL.h>
#endif

#ifndef __OVGABUF_H
#include <OVGABUF.h>
#endif

#ifdef ENABLE_NLS
#include <iconv.h>
#endif

//------- Define constant ------------//

#define DEFAULT_LINE_SPACE  2   // 2 pixels space between lines

// ###### patch begin Gilbert 20/2 ########//
//#if( defined(FRENCH) || defined(SPANISH) )
	// change to 80-8f in french
//	#define FIRST_NATION_COLOR_CODE_IN_TEXT  0x80
//	#define LAST_NATION_COLOR_CODE_IN_TEXT   0x8f
//#else
	// english and german uses f0-ff
//	#define FIRST_NATION_COLOR_CODE_IN_TEXT  0xF0	// 0xF0 to 0xFF are nation color code, must be this range as other ranges are used by foreign characters
//	#define LAST_NATION_COLOR_CODE_IN_TEXT   0xFF
//#endif
#define FIRST_NATION_COLOR_CODE_IN_TEXT  0x80
#define LAST_NATION_COLOR_CODE_IN_TEXT   0x8f
// ###### end begin Gilbert 20/2 ########//

#define NATION_COLOR_BAR_WIDTH 			  13
#define NATION_COLOR_BAR_HEIGHT			  13

//------ Define struct HyperField ------//

#define MAX_HYPER_FIELD 30      // Maximum no. of hyper-text fields in a single page

struct HyperField
{
	short x1, y1, x2, y2;
	const char* text_ptr;        // pointer to the hyper-field name in the text
	short text_len;        // length of the hyper-field name
};

//--------- Define class Font ----------//

struct FontInfo;

class Font
{
public:
	enum { LEFT_JUSTIFY=0,
		CENTER_JUSTIFY,
		RIGHT_JUSTIFY,
		AUTO_JUSTIFY
	};

	char	  init_flag;

	const char*   next_text_ptr;      // these 3 vars are used for storing
	short   next_text_y;        // the result parameters after calling
	short   line_count;         // put_paragraph(). Refer to put_paragraph()

	short   font_height;        // height of a character
	short	  std_font_height;
	short	  max_font_height;
	short   max_font_width;     // width of the widest character in the font
	short   space_width;        // width of the space character
	short   inter_char_space;   // inter-character space

	unsigned short first_char;         // the starting available character
	unsigned short last_char;           // the ending available character

	FontInfo* font_info_array;
	char* 	 font_bitmap_buf;        // pointer to the buffer of the font

#ifdef ENABLE_NLS
	iconv_t cd;
#endif

public:
	static short      hyper_field_count;
	static HyperField hyper_field_array[MAX_HYPER_FIELD];

//---------------------------------------//

public:
	Font(char* =NULL);
	~Font();

	void init(const char* fontName, int interCharSpace=1, int italicShift=0);
	void deinit();

	int  height()                    { return font_height; }
	int  width()                     { return space_width; }

	void use_std_height()		{ font_height = std_font_height; }
	void use_max_height()		{ font_height = max_font_height; }

	int  text_width(const char*, int= -1, int=0);
	int  text_height(int=DEFAULT_LINE_SPACE);

	int  put(int,int,const char*,char=0,int= -1);

	int  put(int x, int y, int value, char clearBack=0, int x2= -1)
		  { return put( x, y, misc.format(value), clearBack, x2 ); }

	void put_char(int,int,unsigned short);
	void right_put(int,int,char*);

	int  d3_put(int,int,const char*);
	void d3_put(int,int,int,int,const char*);
	int  center_put(int,int,int,int,const char*,char clearBack=0);

	void put_paragraph(int,int,int,int,const char*,int=DEFAULT_LINE_SPACE,int=1,char=1,char=AUTO_JUSTIFY);

	void count_line(int x1, int y1, int x2, int y2, const char *text,
						 int lineSpace, int& totalLines, int& dispLines);

	void put_char_to_buffer(char* dest, int destPitch, int x1, int y1, unsigned short text);
	void put_to_buffer(char* dest, int destPitch, int x1, int y1, const char *text);
	void center_put_to_buffer(char* dest, int destPitch, int x1, int y1, int x2, int y2, char *text);

	short translate_german_char(short textChar);

	//----------- <int> version -------------//

	void put_field(int,int,const char*,int,int,int=1);
	void update_field(int,int,int,int,int);
	void field(int,int,const char*,int,int,int,int,int,const char* helpCode=NULL);
	int  disp(int,int,int,int,int);

	//----- <short> version, call <int> version directly -----//

	void put_field(int a,int b,const char* c,int d,short e,int f=1)
		  { put_field(a,b,c,d,(int)e,f); }

	void update_field(int a,int b,short c,int d,int e)
		  { update_field(a,b,(int)c,d,e); }

	void field(int a,int b,const char* c,int d,short e,int f,int g,int h,char* helpCode=NULL)
		  { field(a,b,c,d,(int)e,f,g,h); }

	int  disp(int a,int b,short c,int d,int e)
		  { return disp(a,b,(int)c,d,e); }

	//---- <long> version, call <int> version directly ------//

	void put_field(int a,int b,const char* c,int d,long e,int f=1)
		  { put_field(a,b,c,d,(int)e,f); }

	void update_field(int a,int b,long c,int d,int e)
		  { update_field(a,b,(int)c,d,e); }

	void field(int a,int b,const char* c,int d,long e,int f,int g,int h,char* helpCode=NULL)
		  { field(a,b,c,d,(int)e,f,g,h); }

	int  disp(int a,int b,long c,int d,int e)
		  { return disp(a,b,(int)c,d,e); }

	//------------- <double> version ---------------//

	void put_field(int,int,const char*,int,double,int=1);
	void update_field(int,int,double,int,int);
	void field(int,int,const char*,int,double,int,int,int,char* helpCode=NULL);
	int  disp(int,int,double,int,int);

	//-------------- <char*> version ---------------//

	void put_field(int,int,const char*,int,const char*);
	void update_field(int,int,const char*,int);
	void field(int,int,const char*,int,const char*,int,int,const char* helpCode=NULL);
	int  disp(int,int,const char*,int);

private:
	void put_paragraph_line(int x1, int y1, const char *textPtr, const char *textPtrEnd, char *flag_under_line);
};

extern Font font_san, font_std, font_small, font_mid, font_news;
extern Font font_hitpoint, font_bible, font_bard;

#if( defined(GERMAN) || defined(FRENCH) || defined(SPANISH) )
extern Font font_hall;
#endif

//------------------------------------------------//

#endif