Subversion Repositories Kolibri OS

Rev

Rev 5985 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5985 Rev 5987
Line 1... Line 1...
1
#ifndef INCLUDE_FONT_H
1
#ifndef INCLUDE_LABEL_H
2
#define INCLUDE_FONT_H
2
#define INCLUDE_LABEL_H
Line 3... Line 3...
3
 
3
 
4
#ifndef INCLUDE_MATH_H
4
#ifndef INCLUDE_MATH_H
5
#include "../lib/math.h"
5
#include "../lib/math.h"
Line 9... Line 9...
9
#include "../lib/obj/fs.h"
9
#include "../lib/obj/fs.h"
10
#endif
10
#endif
Line 11... Line 11...
11
 
11
 
Line 12... Line -...
12
#define DEFAULT_FONT "/sys/fonts/Tahoma.kf"
-
 
13
 
-
 
14
:struct __OFFSET_FONT
-
 
15
{
-
 
16
	signed x,y;
12
#define DEFAULT_FONT "/sys/fonts/Tahoma.kf"
17
};
13
 
18
:struct __SIZE
14
:struct __SIZE
19
{
15
{
20
	dword width,height;
16
	dword width,height;
21
	__OFFSET_FONT offset;
17
	signed offset_x, offset_y;
22
	float offset_i,w_italic;
18
	float offset_i,w_italic;
23
	byte text;
19
	byte points;
24
	byte TMP_WEIGHT;
20
	byte TMP_WEIGHT;
25
};
21
};
26
:struct FONT
22
:struct LABEL
27
{
23
{
28
	__SIZE size;
24
	__SIZE size;
29
	int left,top,width,height;
-
 
30
	byte bold,italic,smooth;
25
	int width,height;
31
	dword bg_color;
-
 
32
	dword color;
-
 
33
	dword file_size;
26
	byte bold,italic,smooth;
34
	dword buffer;
27
	dword color;
35
	dword buffer_size;
-
 
36
	word block;
-
 
37
	dword data;
28
	dword font,font_begin;
38
	dword begin;
29
	word block;
39
	byte load(...);
30
	byte init();
40
	byte changeSIZE();
31
	byte changeSIZE();
41
	byte symbol(signed x,y;byte s;dword c);
32
	byte symbol();
-
 
33
	byte symbol_size();
-
 
34
	dword getsize();
-
 
35
 
42
	byte symbol_size(byte s);
36
	dword raw;
43
	dword getsize(dword text1);
37
	dword raw_size;
44
	void apply_smooth();
38
	void apply_smooth();
45
	int write_center(dword x,y,w,h;dword txt);
39
	int write_center();
46
	int write(int x,y;dword text1);
40
	int write();
47
	void write_buf(int x,y,w,h, text1);
41
	void write_buf();
48
	void show_buf();
-
 
Line 49... Line 42...
49
};
42
	void show_buf();
50
FONT font = 0;
43
} label;
-
 
44
 
51
 
45
:byte LABEL::changeSIZE()
52
:byte FONT::changeSIZE()
46
{
53
{
47
	dword file_size;
54
	dword TMP_DATA;
48
	dword TMP_DATA;
55
	dword ofs;
49
	dword ofs;
56
	IF(size.text<9) size.text = 8;
50
	IF(size.pt<9) size.pt = 8;
57
	TMP_DATA = data = begin;
51
	TMP_DATA = font = font_begin;
58
	TMP_DATA +=size.text-8*4;
52
	TMP_DATA +=size.pt-8*4;
59
	ofs = DSDWORD[TMP_DATA];
53
	ofs = DSDWORD[TMP_DATA];
60
	IF(ofs==-1)return false;
54
	IF(ofs==-1)return false;
61
	data += ofs + 156;
55
	font += ofs + 156;
62
	TMP_DATA = data;
56
	TMP_DATA = font;
63
	file_size = DSDWORD[TMP_DATA];
57
	file_size = DSDWORD[TMP_DATA];
64
	TMP_DATA = data + file_size;
58
	TMP_DATA = font + file_size;
65
	height = DSBYTE[TMP_DATA - 1];
59
	height = DSBYTE[TMP_DATA - 1];
66
	width =  DSBYTE[TMP_DATA - 2];
60
	width =  DSBYTE[TMP_DATA - 2];
67
	block = math.ceil(height*width/32);
61
	block = math.ceil(height*width/32);
68
	return true;
62
	return true;
69
}
63
}
70
:dword FONT::getsize(dword text1)
64
:dword LABEL::getsize(dword text1)
71
{
65
{
72
	size.height = size.width = 0;
66
	size.height = size.width = 0;
73
	size.offset.x = size.offset.y = -1;
67
	size.offset_x = size.offset_y = -1;
74
	IF(size.text)IF(!changeSIZE())return 0;
68
	IF(size.pt)IF(!changeSIZE())return 0;
75
	WHILE(DSBYTE[text1])
69
	WHILE(DSBYTE[text1])
76
	{
70
	{
77
		symbol_size(DSBYTE[text1]);
71
		symbol_size(DSBYTE[text1]);
78
		text1++;
72
		text1++;
79
	}
73
	}
80
	$neg size.offset.y
74
	$neg size.offset_y
81
	$neg size.offset.x
75
	$neg size.offset_x
82
	size.height += size.offset.y; size.height++;
76
	size.height += size.offset_y; size.height++;
83
	size.width += size.offset.x; size.width++;
77
	size.width += size.offset_x; size.width++;
84
	IF(italic)
78
	IF(italic)
85
	{
79
	{
86
		size.w_italic = size.height/3;
80
		size.w_italic = size.height/3;
87
		size.offset_i = size.w_italic/size.height;
81
		size.offset_i = size.w_italic/size.height;
88
		size.width += size.w_italic;
82
		size.width += size.w_italic;
89
		size.w_italic = -size.w_italic;
83
		size.w_italic = -size.w_italic;
90
	}
84
	}
91
	return size.width;
85
	return size.width;
92
}
86
}
93
:byte FONT::symbol_size(byte s)
87
:byte LABEL::symbol_size(byte s)
94
{
88
{
95
		dword xi,yi;
89
		dword xi,yi;
96
		dword tmp,_;
90
		dword tmp,_;
97
		dword iii = 0;
91
		dword iii = 0;
98
		byte rw=0;
92
		byte rw=0;
99
		byte X;
93
		byte X;
100
		size.TMP_WEIGHT = math.ceil(size.text/17);
94
		size.TMP_WEIGHT = math.ceil(size.pt/17);
101
		IF(s==32)
95
		IF(s==32)
102
		{
96
		{
Line 108... Line 102...
108
		{
102
		{
109
			size.width += width;
103
			size.width += width;
110
			IF(bold) size.width+=size.TMP_WEIGHT;
104
			IF(bold) size.width+=size.TMP_WEIGHT;
111
			return;
105
			return;
112
		}
106
		}
113
		s = AnsiToCp866(s);
107
		s = Cp866ToAnsi(s);
114
		tmp = 4*block*s + data;
108
		tmp = 4*block*s + font;
115
		for(yi=0; yi
109
		for(yi=0; yi
116
		{
110
		{
117
			for(xi=0; xi
111
			for(xi=0; xi
118
			{
112
			{
119
				IF(iii%32) _ >>= 1;
113
				IF(iii%32) _ >>= 1;
Line 124... Line 118...
124
				}
118
				}
125
				IF(_&1)
119
				IF(_&1)
126
				{
120
				{
127
					IF(xi>rw)rw=xi;
121
					IF(xi>rw)rw=xi;
128
					IF(size.height
122
					IF(size.height
129
					IF(size.offset.y<0)size.offset.y = yi;
123
					IF(size.offset_y<0)size.offset_y = yi;
130
					ELSE IF(yi
124
					ELSE IF(yi
131
					IF(!X) X = xi;
125
					IF(!X) X = xi;
132
					ELSE IF(X>xi)X = xi;
126
					ELSE IF(X>xi)X = xi;
133
				}
127
				}
134
				iii++;
128
				iii++;
135
			}
129
			}
136
		}
130
		}
137
		size.width += rw;
131
		size.width += rw;
138
		IF(bold) size.width+=size.TMP_WEIGHT;
132
		IF(bold) size.width+=size.TMP_WEIGHT;
139
		IF(s=='_') size.width--;
133
		IF(s=='_') size.width--;
140
		IF(size.offset.x<0)size.offset.x = X;
134
		IF(size.offset_x<0)size.offset_x = X;
141
}
135
}
142
:byte FONT::symbol(signed x,y;byte s)
136
:byte LABEL::symbol(signed x,y; byte s; dword image_raw)
143
{
137
{
144
		dword xi,yi;
138
		dword xi,yi;
145
		dword iii = 0;
139
		dword iii = 0;
146
		dword offs;
140
		dword offs;
147
		float ital = -size.w_italic;
141
		float ital = -size.w_italic;
148
		dword ___x;
142
		dword ___x;
149
		byte rw=0;
143
		byte rw=0;
150
		IF(s==32)return width/4;
144
		IF(s==32)return width/4;
151
		IF(s==9)return width;
145
		IF(s==9)return width;
-
 
146
		debugch(s);
152
		s = AnsiToCp866(s);
147
		s = Cp866ToAnsi(s);
153
		EBX = block*s << 2 + data;
148
		EBX = block*s << 2 + font;
154
		for(yi=0; yi
149
		for(yi=0; yi
155
		{
150
		{
156
			EDI = size.offset.y + yi + y * size.width * 3 + buffer;
151
			EDI = size.offset_y + yi + y * size.width * 3 + image_raw;
157
			for(xi=0; xi
152
			for(xi=0; xi
158
			{
153
			{
159
				IF(iii%32) $shr ecx,1
154
				IF(iii%32) $shr ecx,1
160
				ELSE
155
				ELSE
161
				{
156
				{
Line 176... Line 171...
176
			if (italic) ital-=size.offset_i;
171
			if (italic) ital-=size.offset_i;
177
		}
172
		}
178
		return rw;
173
		return rw;
179
}
174
}
Line 180... Line 175...
180
 
175
 
181
byte AnsiToCp866(byte s) {
176
byte Cp866ToAnsi(byte s) {
182
	IF(s>=128)&&(s<=175)s+=64;
177
	IF(s>=128)&&(s<=175)s+=64;
183
	ELSE IF(s>=224)&&(s<=239)s+=16;
178
	ELSE IF(s>=224)&&(s<=239)s+=16;
184
	ELSE IF(s==241)s=184; //yo
179
	ELSE IF(s==241)s=184; //yo
185
	ELSE IF(s==240)s=168; //YO
180
	ELSE IF(s==240)s=168; //YO
186
	return s;
181
	return s;
Line -... Line 182...
-
 
182
}
-
 
183
 
-
 
184
:byte LABEL::init(dword font_path)
-
 
185
{
-
 
186
	lib_init_fs();
-
 
187
	IF(font)free(font);
-
 
188
	IF(!fs.read(font_path)) {
-
 
189
		debug("Error while loading font: "); 
-
 
190
		debugln(font_path); 
-
 
191
		//io.run("/sys/@notify","'Error: Font is not loaded.' -E");
-
 
192
		return false;
-
 
193
	}
-
 
194
	font_begin = font = EAX;
-
 
195
	EBX = font_begin + ECX;
-
 
196
	height = DSBYTE[EBX-1];
-
 
197
	width = DSBYTE[EBX-2];
-
 
198
	block = math.ceil(height*width/32);
-
 
199
	smooth = true;
-
 
200
	return true;
-
 
201
}
-
 
202
 
-
 
203
 
-
 
204
/*=====================================================================================
-
 
205
===========================                                 ===========================
-
 
206
===========================               RAW               ===========================
-
 
207
===========================                                 ===========================
-
 
208
=====================================================================================*/
187
}
209
 
188
 
210
 
189
inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; }
211
inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; }
190
:void FONT::apply_smooth()
212
:void LABEL::apply_smooth()
191
{
213
{
192
	dword i,line_w,to;
214
	dword i,line_w,to;
193
	line_w = font.size.width * 3;
215
	line_w = size.width * 3;
194
	to = font.size.height - 1 * line_w + font.buffer - 3;
216
	to = size.height - 1 * line_w + raw - 3;
195
	for(i=font.buffer; i < to; i+=3)	
217
	for(i=raw; i < to; i+=3)
196
	{
218
	{
197
		IF(i-font.buffer%line_w +3 == line_w) continue;
219
		IF(i-raw%line_w +3 == line_w) continue;
198
		IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000)
220
		IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000)
199
		{ 
221
		{ 
200
			ShadowPixel(i+3, 2);
222
			ShadowPixel(i+3, 2);
Line 205... Line 227...
205
			ShadowPixel(i, 2);
227
			ShadowPixel(i, 2);
206
			ShadowPixel(i+3+line_w, 2);
228
			ShadowPixel(i+3+line_w, 2);
207
		}
229
		}
208
	}
230
	}
209
}
231
}
210
:byte FONT::load(dword path)
-
 
211
{
-
 
212
	lib_init_fs();
-
 
213
	buffer_size = 0;
-
 
214
	smooth = true;
-
 
215
	IF(data)free(data);
-
 
216
	IF(!fs.read(path)) { debug("Error while loading font: "); debugln(path); return false; }
-
 
217
	begin = data = EAX;
-
 
218
	EBX = begin + ECX;
-
 
219
	height = DSBYTE[EBX-1];
-
 
220
	width = DSBYTE[EBX-2];
-
 
221
	block = math.ceil(height*width/32);
-
 
222
	return true;
-
 
223
}
-
 
Line 224... Line 232...
224
 
232
 
225
:int FONT::write_center(dword x,y,w,h;dword txt)
233
:int LABEL::write_center(dword x,y,w,h; dword background, color1; byte fontSizePoints; dword txt)
-
 
234
{
226
{
235
	size.pt = fontSizePoints;
227
	getsize(txt);
236
	getsize(txt);
228
	return write(w-size.width/2+x,y,txt);
237
	return write(w-size.width/2+x,y, background, color1, fontSizePoints, txt);
Line 229... Line 238...
229
}
238
}
230
 
239
 
231
:int FONT::write(int x,y; dword text1)
240
:int LABEL::write(int x,y; dword background, color1; byte fontSizePoints; dword text1)
232
{
241
{
233
	signed len=0;
242
	signed len=0;
234
	IF(!text1)return false;
243
	IF(!text1)return false;
235
	IF(size.text)IF(!changeSIZE())return false;
244
	IF(size.pt)IF(!changeSIZE())return false;
-
 
245
	size.pt = fontSizePoints;
236
	left = x;
246
	getsize(text1);
237
	getsize(text1);
-
 
238
	y -= size.offset.y;
247
	color = color1;
239
	top = y;
248
	y -= size.offset_y;
240
	EDX = size.width*size.height*3;
249
	EDX = size.width*size.height*3;
241
	IF(!buffer_size)
250
	IF(!raw_size)
242
	{
251
	{
243
		buffer_size = EDX;
252
		raw_size = EDX;
244
		buffer = malloc(buffer_size);
253
		raw = malloc(raw_size);
245
	}
254
	}
246
	ELSE IF(buffer_size
255
	ELSE IF(raw_size
247
	{
256
	{
248
		buffer_size = EDX;
257
		raw_size = EDX;
249
		buffer = realloc(buffer,buffer_size);
258
		raw = realloc(raw,raw_size);
250
	}
259
	}
251
	// Fill background color {
260
	// Fill background color {
252
	EBX = bg_color;
261
	EBX = background;
253
	EAX = buffer_size+buffer;
262
	EAX = raw_size+raw;
254
	for (EDI=buffer; EDI
263
	for (EDI=raw; EDI
255
	// }
264
	// }
256
	len = size.offset.x;
265
	len = size.offset_x;
257
	WHILE(DSBYTE[text1])
266
	WHILE(DSBYTE[text1])
258
	{
267
	{
259
		IF(DSBYTE[text1]=='_') len--;
268
		IF(DSBYTE[text1]=='_') len--;
260
		len+=symbol(len,0,DSBYTE[text1]);
269
		len+=symbol(len,0,DSBYTE[text1], raw);
261
		IF(bold)len+=math.ceil(size.text/17);
270
		IF(bold)len+=math.ceil(size.pt/17);
262
		text1++;
271
		text1++;
263
	}
272
	}
264
	IF (smooth) apply_smooth();
273
	IF (smooth) apply_smooth();
265
	show_buf(left,top);
274
	show_buf(x,y);
Line 266... Line 275...
266
	return len;
275
	return len;
267
}
276
}
268
 
277
 
269
:void FONT::write_buf(int x,y,w,h; dword text1)
278
:void LABEL::write_buf(int x,y,w,h; dword background, color1; byte fontSizePoints; dword text1)
270
{
279
{
-
 
280
	dword new_raw_size;
-
 
281
	IF(!text1)return;
271
	dword new_buffer_size;
282
	IF(size.pt)IF(!changeSIZE())return;
272
	IF(!text1)return;
283
	
-
 
284
	size.pt = fontSizePoints;
Line 273... Line 285...
273
	IF(size.text)IF(!changeSIZE())return;
285
	getsize(text1);
274
	getsize(text1);
286
	y -= size.offset_y;
Line 275... Line 287...
275
	y -= size.offset.y;
287
	color = color1;
276
 
288
 
277
	size.width = w;
289
	size.width = w;
278
	size.height = h;
290
	size.height = h;
279
 
291
 
280
	new_buffer_size = w*h*3;
292
	new_raw_size = w*h*3;
281
	IF(buffer_size != w*h*3)
293
	IF(raw_size != new_raw_size)
282
	{
294
	{
283
		buffer_size = new_buffer_size; 
295
		raw_size = new_raw_size; 
284
		free(buffer);
296
		free(raw);
285
		buffer = malloc(buffer_size);
297
		raw = malloc(raw_size);
286
		// Fill background color
298
		// Fill background color
287
		EBX = bg_color;
299
		EBX = background;
288
		EAX = buffer_size+buffer;
300
		EAX = raw_size+raw;
289
		for (EDI=buffer; EDI
301
		for (EDI=raw; EDI
290
	}
302
	}
291
	WHILE(DSBYTE[text1])
303
	WHILE(DSBYTE[text1])
292
	{
304
	{
293
		x+=symbol(x,y,DSBYTE[text1]);
305
		x+=symbol(x,y,DSBYTE[text1], raw);
Line 294... Line 306...
294
		IF(bold)x+=math.ceil(size.text/17);
306
		IF(bold)x+=math.ceil(size.pt/17);
295
		text1++;
307
		text1++;
296
	}
308
	}
Line 297... Line -...
297
	return;
-
 
298
}
309
	return;
299
 
310
}