Subversion Repositories Kolibri OS

Rev

Rev 5783 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5783 Rev 5784
1
#ifndef INCLUDE_FONT_H
1
#ifndef INCLUDE_FONT_H
2
#define INCLUDE_FONT_H
2
#define INCLUDE_FONT_H
3
 
3
 
4
#ifndef INCLUDE_MATH_H
4
#ifndef INCLUDE_MATH_H
5
#include "../lib/math.h"
5
#include "../lib/math.h"
6
#endif
6
#endif
7
 
7
 
8
#ifndef INCLUDE_IO_H
8
#ifndef INCLUDE_IO_H
9
#include "../lib/io.h"
9
#include "../lib/io.h"
10
#endif
10
#endif
11
 
11
 
12
:struct __SIZE
12
:struct __SIZE
13
{
13
{
14
	word width,height;
14
	word width,height;
15
	signed offset_x,offset_y;
15
	signed offset_x,offset_y;
16
	float offset_i,w_italic;
16
	float offset_i,w_italic;
17
	byte text;
17
	byte text;
18
	byte TMP_WEIGHT;
18
	byte TMP_WEIGHT;
19
};
19
};
20
:struct FONT
20
:struct FONT
21
{
21
{
22
	__SIZE size;
22
	__SIZE size;
23
	byte r,g,b,weight,italic;
23
	byte r,g,b,weight,italic, smooth;
24
	byte width,height;
24
	byte width,height;
25
	byte encoding;
25
	byte encoding;
26
	dword color;
26
	dword color;
27
	dword file_size;
27
	dword file_size;
28
	dword buffer;
28
	dword buffer;
29
	dword buffer_size;
29
	dword buffer_size;
30
	word block;
30
	word block;
31
	dword data;
31
	dword data;
32
	dword begin;
32
	dword begin;
33
	dword size_file;
-
 
34
	byte load(...);
33
	byte load(...);
35
	byte symbol(word x;byte s;dword c);
34
	byte symbol(word x,y;byte s;dword c);
36
	byte symbol_size(byte s);
35
	byte symbol_size(byte s);
37
	dword prepare(word x,y;dword text1);
36
	dword prepare(word x,y;dword text1);
38
	void prepare_buf(word x,y,w,h;dword text1);
37
	void prepare_buf(word x,y,w,h;dword text1);
39
	void show(word x,y);
38
	void show(word x,y);
40
	byte textcenter(word x,y,w,h;dword txt);
39
	byte textcenter(word x,y,w,h;dword txt);
41
	dword getsize(dword text1);
40
	dword getsize(dword text1);
42
	byte changeSIZE();
41
	byte changeSIZE();
43
	void PixelRGB(word x,y);
42
	void PixelRGB(word x,y);
44
	//dword GetPixel(word x,y);
43
	//dword GetPixel(word x,y);
45
	byte no_bg_copy;
44
	byte no_bg_copy;
46
	dword bg_color;
45
	dword bg_color;
47
};
46
};
48
FONT font = 0;
47
FONT font = 0;
49
/*
48
/*
50
:dword FONT::GetPixel(word x,y)
49
:dword FONT::GetPixel(word x,y)
51
{
50
{
52
	dword tmp = y*size.width*3;
51
	dword tmp = y*size.width*3;
53
	tmp += x*3 + buffer;
52
	tmp += x*3 + buffer;
54
	r = DSBYTE[tmp]; tmp++;
53
	r = DSBYTE[tmp]; tmp++;
55
	g = DSBYTE[tmp]; tmp++;
54
	g = DSBYTE[tmp]; tmp++;
56
	b = DSBYTE[tmp];
55
	b = DSBYTE[tmp];
57
}*/
56
}*/
58
:void FONT::PixelRGB(dword x,y)
57
:void FONT::PixelRGB(dword x,y)
59
{
58
{
60
	$push ebx 
59
	$push ebx 
61
	EBX = y*size.width+x*3 + buffer;
60
	EBX = y*size.width+x*3 + buffer;
62
	DSBYTE[EBX] = r; EBX++;
61
	DSBYTE[EBX] = r; EBX++;
63
	DSBYTE[EBX] = g; EBX++;
62
	DSBYTE[EBX] = g; EBX++;
64
	DSBYTE[EBX] = b;
63
	DSBYTE[EBX] = b;
65
	$pop ebx
64
	$pop ebx
66
}
65
}
67
:byte FONT::changeSIZE()
66
:byte FONT::changeSIZE()
68
{
67
{
69
	dword TMP_DATA;
68
	dword TMP_DATA;
70
	dword ofs;
69
	dword ofs;
71
	IF(size.text<9) size.text = 8;
70
	IF(size.text<9) size.text = 8;
72
	TMP_DATA = data = begin;
71
	TMP_DATA = data = begin;
73
	TMP_DATA +=size.text-8*4;
72
	TMP_DATA +=size.text-8*4;
74
	ofs = DSDWORD[TMP_DATA];
73
	ofs = DSDWORD[TMP_DATA];
75
	IF(ofs==-1)return false;
74
	IF(ofs==-1)return false;
76
	data += ofs + 156;
75
	data += ofs + 156;
77
	TMP_DATA = data;
76
	TMP_DATA = data;
78
	file_size = DSDWORD[TMP_DATA];
77
	file_size = DSDWORD[TMP_DATA];
79
	TMP_DATA = data + file_size;
78
	TMP_DATA = data + file_size;
80
	height = DSBYTE[TMP_DATA - 1];
79
	height = DSBYTE[TMP_DATA - 1];
81
	width =  DSBYTE[TMP_DATA - 2];
80
	width =  DSBYTE[TMP_DATA - 2];
82
	block = math.ceil(height*width/32);
81
	block = math.ceil(height*width/32);
83
	return true;
82
	return true;
84
}
83
}
85
:byte FONT::textcenter(word x,y,w,h;dword txt)
84
:byte FONT::textcenter(word x,y,w,h;dword txt)
86
{
85
{
87
	getsize(txt);
86
	getsize(txt);
88
	EDX = w/2;
87
	EDX = w/2;
89
	ECX = size.width/2;
88
	ECX = size.width/2;
90
	EDX -= ECX;
89
	EDX -= ECX;
91
	x += EDX;
90
	x += EDX;
92
	return text(x,y,txt);
91
	return text(x,y,txt);
93
}
92
}
94
:dword FONT::getsize(dword text1)
93
:dword FONT::getsize(dword text1)
95
{
94
{
96
	size.height = size.width = 0;
95
	size.height = size.width = 0;
97
	size.offset_x = size.offset_y = -1;
96
	size.offset_x = size.offset_y = -1;
98
	IF(size.text)IF(!changeSIZE())return 0;
97
	IF(size.text)IF(!changeSIZE())return 0;
99
	WHILE(DSBYTE[text1])
98
	WHILE(DSBYTE[text1])
100
	{
99
	{
101
		symbol_size(DSBYTE[text1]);
100
		symbol_size(DSBYTE[text1]);
102
		text1++;
101
		text1++;
103
	}
102
	}
104
	$neg size.offset_y
103
	$neg size.offset_y
105
	$neg size.offset_x
104
	$neg size.offset_x
106
	size.height++;
-
 
107
	size.height += size.offset_y;
105
	size.height += size.offset_y; size.height++;
108
	size.width += size.offset_x;
106
	size.width += size.offset_x; size.width++;
109
	size.width++;
-
 
110
	IF(italic)
107
	IF(italic)
111
	{
108
	{
112
		size.w_italic = size.height/3;
109
		size.w_italic = size.height/3;
113
		size.offset_i = size.w_italic/size.height;
110
		size.offset_i = size.w_italic/size.height;
114
		size.width += size.w_italic;
111
		size.width += size.w_italic;
115
		size.w_italic = -size.w_italic;
112
		size.w_italic = -size.w_italic;
116
	}
113
	}
117
	return size.width;
114
	return size.width;
118
}
115
}
119
:byte FONT::symbol_size(byte s)
116
:byte FONT::symbol_size(byte s)
120
{
117
{
121
        dword xi,yi;
118
        dword xi,yi;
122
        dword tmp,_;
119
        dword tmp,_;
123
        dword iii;
120
        dword iii;
124
        byte rw=0;
121
        byte rw=0;
125
		byte X;
122
		byte X;
126
		size.TMP_WEIGHT = math.ceil(size.text/17);
123
		size.TMP_WEIGHT = math.ceil(size.text/17);
127
        IF(s==32)
124
        IF(s==32)
128
		{
125
		{
129
			size.width += width/4;
126
			size.width += width/4;
130
			IF(weight) size.width+=size.TMP_WEIGHT;
127
			IF(weight) size.width+=size.TMP_WEIGHT;
131
			return;
128
			return;
132
		}
129
		}
133
		IF(s==9)
130
		IF(s==9)
134
		{
131
		{
135
			size.width += width;
132
			size.width += width;
136
			IF(weight) size.width+=size.TMP_WEIGHT;
133
			IF(weight) size.width+=size.TMP_WEIGHT;
137
			return;
134
			return;
138
		}
135
		}
139
		IF(!encoding){
136
		IF(!encoding){
140
			IF(s>=128)&&(s<=175)s+=64;
137
			IF(s>=128)&&(s<=175)s+=64;
141
			ELSE IF(s>=224)&&(s<=239)s+=16;
138
			ELSE IF(s>=224)&&(s<=239)s+=16;
142
			ELSE IF(s==241)s=184; //yo
139
			ELSE IF(s==241)s=184; //yo
143
			ELSE IF(s==240)s=168; //YO
140
			ELSE IF(s==240)s=168; //YO
144
		}
141
		}
145
        yi = 0;
-
 
146
        iii = 0;
142
        iii = 0;
147
        tmp = 4*block*s + data;
143
        tmp = 4*block*s + data;
148
        while(yi
144
        for(yi=0; yi
149
        {
145
        {
150
                xi = 0;
-
 
151
                WHILE(xi
146
            for(xi=0; xi
152
                {
147
            {
153
                        IF(iii%32) _ >>= 1;
148
                IF(iii%32) _ >>= 1;
154
						ELSE
149
				ELSE
155
						{
150
				{
156
                                tmp += 4;
151
                        tmp += 4;
157
                                _ = DSDWORD[tmp];
152
                        _ = DSDWORD[tmp];
158
                        }
153
                }
159
                        IF(_&1)
154
                IF(_&1)
160
						{
155
				{
161
							IF(xi>rw)rw=xi;
156
					IF(xi>rw)rw=xi;
162
							IF(size.height
157
					IF(size.height
163
							IF(size.offset_y<0)size.offset_y = yi;
158
					IF(size.offset_y<0)size.offset_y = yi;
164
							ELSE IF(yi
159
					ELSE IF(yi
165
							IF(!X) X = xi;
160
					IF(!X) X = xi;
166
							ELSE IF(X>xi)X = xi;
161
					ELSE IF(X>xi)X = xi;
167
						}
162
				}
168
                        xi++;
-
 
169
                        iii++;
163
                iii++;
170
                }
164
            }
171
                yi++;
-
 
172
        }
165
        }
173
		size.width += rw;
166
		size.width += rw;
174
		IF(weight) size.width+=size.TMP_WEIGHT;
167
		IF(weight) size.width+=size.TMP_WEIGHT;
175
		IF(s=='_') size.width--;
168
		IF(s=='_') size.width--;
176
		IF(size.offset_x<0)size.offset_x = X;
169
		IF(size.offset_x<0)size.offset_x = X;
177
}
170
}
178
:dword FONT::prepare(word x,y;dword text1)
171
:dword FONT::prepare(word x,y;dword text1)
179
{
172
{
180
	signed len=0;
173
	signed len=0;
181
	proc_info Form_SELF_FONTS;
174
	proc_info Form_SELF_FONTS;
182
	dword c;
175
	dword c;
183
	c = color;
176
	c = color;
184
	IF(!text1)return false;
177
	IF(!text1)return false;
185
	IF(size.text)IF(!changeSIZE())return false;
178
	IF(size.text)IF(!changeSIZE())return false;
186
	AX = c; r = AL; g = AH; c>>=16; AX = c; b = AL;
179
	AX = c; r = AL; g = AH; c>>=16; AX = c; b = AL;
187
	getsize(text1);
180
	getsize(text1);
188
	y -= size.offset_y;
181
	y -= size.offset_y;
189
	
182
	
190
	EDX = size.width*size.height*3;
183
	EDX = size.width*size.height*3;
191
	IF(!buffer_size)
184
	IF(!buffer_size)
192
	{
185
	{
193
		buffer_size = EDX;
186
		buffer_size = EDX;
194
		buffer = malloc(buffer_size);
187
		buffer = malloc(buffer_size);
195
	}
188
	}
196
	ELSE IF(buffer_size
189
	ELSE IF(buffer_size
197
	{
190
	{
198
		buffer_size = EDX;
191
		buffer_size = EDX;
199
		buffer = realloc(buffer,buffer_size);
192
		buffer = realloc(buffer,buffer_size);
200
	}
193
	}
201
	IF (no_bg_copy)
194
	IF (no_bg_copy)
202
	{
195
	{
203
		EBX = bg_color;
196
		EBX = bg_color;
204
		EDI = buffer;
197
		EDI = buffer;
205
		EAX = buffer_size+EDI;
198
		EAX = buffer_size+EDI;
206
		WHILE (EDI
199
		WHILE (EDI
207
		{
200
		{
208
			ESDWORD[EDI] = EBX;
201
			ESDWORD[EDI] = EBX;
209
			$add edi,3
202
			$add edi,3
210
		}
203
		}
211
	}
204
	}
212
	ELSE
205
	ELSE
213
	{
206
	{
214
		GetProcessInfo(#Form_SELF_FONTS, SelfInfo); 
207
		GetProcessInfo(#Form_SELF_FONTS, SelfInfo); 
215
		CopyScreen(buffer,x+Form_SELF_FONTS.left+5,y+Form_SELF_FONTS.top+GetSkinHeight(),size.width,size.height);
208
		CopyScreen(buffer,x+Form_SELF_FONTS.left+5,y+Form_SELF_FONTS.top+GetSkinHeight(),size.width,size.height);
216
	}
209
	}
217
	len = size.offset_x;
210
	len = size.offset_x;
218
	WHILE(DSBYTE[text1])
211
	WHILE(DSBYTE[text1])
219
	{
212
	{
220
		IF(DSBYTE[text1]=='_') len--;
213
		IF(DSBYTE[text1]=='_') len--;
221
		len+=symbol(len,DSBYTE[text1]);
214
		len+=symbol(len,0,DSBYTE[text1]);
222
		IF(weight)len+=math.ceil(size.text/17);
215
		IF(weight)len+=math.ceil(size.text/17);
223
		text1++;
216
		text1++;
224
	}
217
	}
225
	IF (no_bg_copy) && (!color) SmoothFont(buffer, size.width, size.height);
218
	IF (no_bg_copy) && (!color) SmoothFont(buffer, size.width, size.height);
226
	return len;
219
	return len;
227
}
220
}
228
:void FONT::show(word x,y)
221
:void FONT::show(word x,y)
229
{
222
{
230
	_PutImage(x,y,size.width,size.height,buffer);
223
	_PutImage(x,y,size.width,size.height,buffer);
231
}
224
}
232
inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; }
225
inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; }
233
:void SmoothFont(dword image, w, h)
226
:void SmoothFont(dword image, w, h)
234
{
227
{
235
	byte rr,gg,bb;
228
	byte rr,gg,bb;
236
	dword i,line_w,to, pixel;
229
	dword i,line_w,to, pixel;
237
	line_w = w * 3;
230
	line_w = w * 3;
238
	to = w*h*3 + image - line_w - 3;
231
	to = w*h*3 + image - line_w - 3;
239
	for (i = image; i < to; i+=3)	{
232
	for (i = image; i < to; i+=3)	{
240
		if (i-image%line_w +3 == line_w) continue;
233
		if (i-image%line_w +3 == line_w) continue;
241
		if (b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000)
234
		if (b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000)
242
		{ 
235
		{ 
243
			ShadowImage(i+3, 1, 1, 2);
236
			ShadowImage(i+3, 1, 1, 2);
244
			ShadowImage(i+line_w, 1, 1, 2);
237
			ShadowImage(i+line_w, 1, 1, 2);
245
		}
238
		}
246
		else if (b24(i)!=0x000000) && (b24(i+3)==0x000000) && (b24(i+line_w)==0x000000) && (b24(i+3+line_w)!=0x000000)
239
		else if (b24(i)!=0x000000) && (b24(i+3)==0x000000) && (b24(i+line_w)==0x000000) && (b24(i+3+line_w)!=0x000000)
247
		{
240
		{
248
			ShadowImage(i, 1, 1, 2);
241
			ShadowImage(i, 1, 1, 2);
249
			ShadowImage(i+3+line_w, 1, 1, 2);
242
			ShadowImage(i+3+line_w, 1, 1, 2);
250
		}
243
		}
251
	}
244
	}
252
}
245
}
253
:byte FONT::symbol(signed x;byte s)
246
:byte FONT::symbol(signed x,y;byte s)
254
{
247
{
255
        dword xi,yi;
248
        dword xi,yi;
256
        dword tmp,_;
249
        dword tmp,_;
257
        dword iii;
250
        dword iii;
258
		float ital = -size.w_italic;
251
		float ital = -size.w_italic;
259
		dword ___x;
252
		dword ___x;
260
		word TMP;
253
		word TMP;
261
		byte _TMP_WEIGHT;
254
		byte _TMP_WEIGHT;
262
        byte rw=0;
255
        byte rw=0;
263
        IF(s==32)return width/4;
256
        IF(s==32)return width/4;
264
		IF(s==9)return width;
257
		IF(s==9)return width;
265
		IF(!encoding)
258
		IF(!encoding)
266
		{
259
		{
267
			IF(s>=128)&&(s<=175)s+=64;
260
			IF(s>=128)&&(s<=175)s+=64;
268
			ELSE IF(s>=224)&&(s<=239)s+=16;
261
			ELSE IF(s>=224)&&(s<=239)s+=16;
269
			ELSE IF(s==241)s=184; //yo
262
			ELSE IF(s==241)s=184; //yo
270
			ELSE IF(s==240)s=168; //YO
263
			ELSE IF(s==240)s=168; //YO
271
		}
264
		}
272
        yi = 0;
-
 
273
        iii = 0;
265
        iii = 0;
274
        tmp = 4*block*s;
266
        tmp = 4*block*s + data;
275
        tmp +=data;
-
 
276
        while(yi
267
        for(yi=0; yi
277
        {
268
        {
278
            xi = 0;
-
 
279
			TMP = size.offset_y+yi;
269
			TMP = size.offset_y+yi+y;
280
            while(xi
270
            for(xi=0; xi
281
            {
271
            {
282
				IF(iii%32) _ >>= 1;
272
				IF(iii%32) _ >>= 1;
283
				ELSE
273
				ELSE
284
				{
274
				{
285
						tmp += 4;
275
						tmp += 4;
286
						_ = DSDWORD[tmp];
276
						_ = DSDWORD[tmp];
287
				}
277
				}
288
				if(_&1)
278
				if(_&1)
289
				{
279
				{
290
						IF(xi>rw)rw=xi;
280
						IF(xi>rw)rw=xi;
291
						___x = x+xi;
281
						___x = x+xi;
292
						IF(italic)___x+=math.ceil(ital);
282
						IF(italic)___x+=math.ceil(ital);
293
						PixelRGB(___x,TMP);
283
						PixelRGB(___x,TMP);
294
						_TMP_WEIGHT = size.TMP_WEIGHT;
284
						for(_TMP_WEIGHT=size.TMP_WEIGHT; _TMP_WEIGHT; _TMP_WEIGHT--)
295
						WHILE(_TMP_WEIGHT)
-
 
296
						{
285
						{
297
							IF(weight) PixelRGB(___x+_TMP_WEIGHT,TMP);
286
							IF(weight) PixelRGB(___x+_TMP_WEIGHT,TMP);
298
							_TMP_WEIGHT--;
-
 
299
						}
287
						}
300
				}
288
				}
301
				xi++;
-
 
302
				iii++;
289
				iii++;
303
            }
290
            }
304
            yi++;
-
 
305
			IF(italic) ital-=size.offset_i;
291
			IF(italic) ital-=size.offset_i;
306
        }
292
        }
307
        return rw;
293
        return rw;
308
}
294
}
309
:byte FONT::load(dword path)
295
:byte FONT::load(dword path)
310
{
296
{
311
	buffer_size = 0;
297
	buffer_size = 0;
312
	IF(data)free(data);
298
	IF(data)free(data);
313
	if (!io.readKPACK(path)) { debug("Error while loading font: "); debugln(path); return false; }
299
	if (!io.readKPACK(path)) { debug("Error while loading font: "); debugln(path); return false; }
314
	begin = data = io.buffer_data;
300
	begin = data = io.buffer_data;
315
	size_file = io.FILES_SIZE;
301
	EBX = begin + io.FILES_SIZE;
316
	EBX = begin + size_file;
-
 
317
	height = DSBYTE[EBX - 1];
302
	height = DSBYTE[EBX - 1];
318
	width = DSBYTE[EBX - 2];
303
	width = DSBYTE[EBX - 2];
319
	block = math.ceil(height*width/32);
304
	block = math.ceil(height*width/32);
320
	return true;
305
	return true;
321
}
306
}
322
 
307
 
323
:void FONT::prepare_buf(word x,y,w,h; dword text1)
308
:void FONT::prepare_buf(word x,y,w,h; dword text1)
324
{
309
{
325
	signed len=0;
-
 
326
	dword c;
310
	dword c;
327
	c = color;
311
	c = color;
328
	IF(!text1)return;
312
	IF(!text1)return;
329
	IF(size.text)IF(!changeSIZE())return;
313
	IF(size.text)IF(!changeSIZE())return;
330
	AX = c; r = AL; g = AH; c>>=16; AX = c; b = AL;
314
	AX = c; r = AL; g = AH; c>>=16; AX = c; b = AL;
331
	getsize(text1);
315
	getsize(text1);
332
	y -= size.offset_y;
316
	y -= size.offset_y;
333
	
317
	
334
	size.width = w;
318
	size.width = w;
335
	size.height = h;
319
	size.height = h;
-
 
320
 
336
	EDX = size.width*size.height*3;
321
	EDX = size.width*size.height*3;
337
	IF(!buffer_size)
322
	if(buffer_size!=EDX)
338
	{
323
	{
339
		buffer_size = EDX;
324
		buffer_size = EDX; 
-
 
325
		free(buffer);
340
		buffer = malloc(buffer_size);
326
		buffer = malloc(buffer_size); 
341
		EBX = bg_color;
327
		EBX = font.bg_color;
342
		EDI = buffer;
328
		EDI = font.buffer;
343
		EAX = buffer_size+EDI;
329
		EAX = font.buffer_size+font.buffer;
344
		WHILE (EDI
330
		WHILE (EDI
345
		{
331
		{
346
			ESDWORD[EDI] = EBX;
332
			ESDWORD[EDI] = EBX;
347
			$add edi,3
333
			$add edi,3
348
		}
334
		}
349
	}
335
	}
350
	WHILE(DSBYTE[text1])
336
	WHILE(DSBYTE[text1])
351
	{
337
	{
352
		x+=symbol(x,DSBYTE[text1]);
338
		x+=symbol(x,y,DSBYTE[text1]);
353
		IF(weight)x+=math.ceil(size.text/17);
339
		IF(weight)x+=math.ceil(size.text/17);
354
		text1++;
340
		text1++;
355
	}
341
	}
356
	return;
342
	return;
357
}
343
}
358
 
-
 
359
 
344
 
360
#endif
345
#endif
361
>
346
>
362
>
347
>
363
>
348
>
364
>
349
>
365
>
350
>
366
>
351
>
367
>
352
>
368
>
-
 
369
>
-
 
370
>
-
 
371
>
-