Subversion Repositories Kolibri OS

Rev

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

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