Subversion Repositories Kolibri OS

Rev

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

Rev 5783 Rev 5784
Line 18... Line 18...
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);
Line 101... Line 100...
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;
Line 140... Line 137...
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;
Line 163... Line 158...
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;
Line 216... Line 209...
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;
Line 248... Line 241...
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;
Line 267... Line 260...
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;
Line 289... Line 279...
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
}
Line 322... Line 307...
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
{
-
 
325
	signed len=0;
309
{
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);
Line 332... Line 316...
332
	y -= size.offset_y;
316
	y -= size.offset_y;
333
	
317
	
-
 
318
	size.width = w;
334
	size.width = w;
319
	size.height = h;
335
	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)
-
 
323
	{
338
	{
324
		buffer_size = EDX; 
339
		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
	}
Line 356... Line -...
356
	return;
-
 
357
}
342
	return;
358
 
343
}