Subversion Repositories Kolibri OS

Rev

Rev 5751 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5730 pavelyakov 1
#ifndef INCLUDE_FONT_H
2
#define INCLUDE_FONT_H
3
 
4
#ifndef INCLUDE_MATH_H
5
#include "../lib/math.h"
6
#endif
7
 
8
#ifndef INCLUDE_IO_H
9
#include "../lib/io.h"
10
#endif
11
 
5753 leency 12
:struct __SIZE
13
{
14
	word width,height;
15
	signed offset_x,offset_y;
16
	byte text;
17
};
5730 pavelyakov 18
:struct FONT
19
{
5753 leency 20
	__SIZE size;
21
	byte width,height,offsetLine,r,g,b,weight;
22
	dword color;
5736 pavelyakov 23
	dword file_size;
5740 pavelyakov 24
	dword buffer;
5741 pavelyakov 25
	dword buffer_size;
5730 pavelyakov 26
	word block;
27
	dword data;
5736 pavelyakov 28
	dword begin;
5730 pavelyakov 29
	dword size_file;
30
	byte load(...);
5740 pavelyakov 31
	byte symbol(word x;byte s;dword c);
5742 pavelyakov 32
	byte symbol_size(byte s);
5753 leency 33
	dword text(word x,y;dword text1,c);
34
	dword getsize(dword text1);
35
	dword textarea(word x,y;dword text,c);
36
	byte changeSIZE();
5740 pavelyakov 37
	void PixelRGB(word x,y);
38
	dword tmp_y,tmp_height,tmp_x;
5745 leency 39
	byte no_bg_copy;
40
	dword bg_color;
5730 pavelyakov 41
};
42
FONT font = 0;
5740 pavelyakov 43
 
44
:void FONT::PixelRGB(dword x,y)
45
{
46
	dword tmp;
5753 leency 47
	tmp = y*size.width*3;
5740 pavelyakov 48
	tmp += x*3;
49
	tmp += buffer;
50
 
51
	DSBYTE[tmp] = r;
52
	tmp++;
53
	DSBYTE[tmp] = g;
54
	tmp++;
55
	DSBYTE[tmp] = b;
56
}
5753 leency 57
:byte FONT::changeSIZE()
5730 pavelyakov 58
{
5736 pavelyakov 59
	dword TMP_DATA;
60
	dword ofs;
61
	byte s;
5753 leency 62
	IF(size.text<9) size.text = 8;
63
	IF(size.text>45)size.text = 45;
64
		s = size.text-8;
5736 pavelyakov 65
		data = begin;
66
		TMP_DATA = data;
67
		TMP_DATA +=s*4;
68
		ofs = DSDWORD[TMP_DATA];
69
		IF(ofs==-1)return false;
70
		data += ofs;
71
		data += 156;
72
		TMP_DATA = data;
73
		file_size = DSDWORD[TMP_DATA];
74
		TMP_DATA += file_size;
75
		TMP_DATA--;
76
		height = DSBYTE[TMP_DATA];
77
		TMP_DATA--;
78
		width =  DSBYTE[TMP_DATA];
79
		block = math.ceil(height*width/32);
80
		return true;
81
}
5740 pavelyakov 82
:proc_info Form_SELF_FONTS;
5741 pavelyakov 83
 
5753 leency 84
:dword FONT::getsize(dword text1)
5736 pavelyakov 85
{
5753 leency 86
	size.height = size.width = 0;
87
	size.offset_x = size.offset_y = -1;
88
	IF(size.text)IF(!changeSIZE())return 0;
5742 pavelyakov 89
	WHILE(DSBYTE[text1])
90
	{
5753 leency 91
		symbol_size(DSBYTE[text1]);
5742 pavelyakov 92
		text1++;
93
	}
5753 leency 94
	$neg size.offset_y
95
	$neg size.offset_x
96
	size.height++;
97
	size.height += size.offset_y;
98
	size.width += size.offset_x;
99
	size.width++;
100
	return size.width;
5742 pavelyakov 101
}
102
:byte FONT::symbol_size(byte s)
103
{
104
        dword xi,yi;
105
        dword tmp,_;
106
        dword iii;
107
        byte rw=0;
5753 leency 108
		byte X;
109
        IF(s==32)
110
		{
111
			size.width += width/4;
112
			IF(weight) size.width++;
113
			return;
114
		}
115
		IF(s==9)
116
		{
117
			size.width += width;
118
			IF(weight) size.width++;
119
			return;
120
		}
5742 pavelyakov 121
        yi = 0;
122
        iii = 0;
123
        tmp = 4*block*s;
124
        tmp +=data;
5753 leency 125
        while(yi
5742 pavelyakov 126
        {
127
                xi = 0;
128
                WHILE(xi
129
                {
130
                        IF(iii%32) _ >>= 1;
131
						ELSE
132
						{
133
                                tmp += 4;
134
                                _ = DSDWORD[tmp];
135
                        }
5753 leency 136
                        IF(_&1)
137
						{
138
							IF(xi>rw)rw=xi;
139
							IF(size.height
140
							IF(size.offset_y<0)size.offset_y = yi;
141
							ELSE IF(yi
142
							IF(!X) X = xi;
143
							ELSE IF(X>xi)X = xi;
144
						}
5742 pavelyakov 145
                        xi++;
146
                        iii++;
147
                }
148
                yi++;
149
        }
5753 leency 150
		size.width += rw;
151
		IF(weight) size.width++;
152
		IF(s=='_') size.width--;
153
		IF(size.offset_x<0)size.offset_x = X;
5742 pavelyakov 154
}
5753 leency 155
:dword FONT::text(word x,y;dword text1)
5742 pavelyakov 156
{
157
	signed len=0;
5753 leency 158
	dword c;
159
	word _tmp_h;
160
	c = color;
161
	IF(size.text)IF(!changeSIZE())return 0;
5740 pavelyakov 162
	GetProcessInfo(#Form_SELF_FONTS, SelfInfo);
5741 pavelyakov 163
	IF(y>Form_SELF_FONTS.cheight) return 0;
164
	IF(x>Form_SELF_FONTS.cwidth) return 0;
165
	tmp_y = y;
5740 pavelyakov 166
	AX = c;
167
	r = AL;
168
	g = AH;
169
	c>>=16;
170
	AX = c;
171
	b = AL;
5753 leency 172
	getsize(text1);
5745 leency 173
	IF(!buffer_size)
174
	{
5753 leency 175
		buffer_size = size.width*size.height*3;
5745 leency 176
		buffer = malloc(buffer_size);
177
	}
5753 leency 178
	ELSE IF(buffer_size
5745 leency 179
	{
5753 leency 180
		buffer_size = size.width*size.height*3;
5745 leency 181
		buffer = realloc(buffer,buffer_size);
182
	}
183
	IF (no_bg_copy)
184
	{
185
		EBX = bg_color;
186
		EAX = buffer_size+buffer;
187
		EDI = buffer;
188
		WHILE (EDI
189
		{
190
			ESDWORD[EDI] = EBX;
191
			$add edi,3
192
		}
193
	}
5753 leency 194
	ELSE CopyScreen(buffer,x+Form_SELF_FONTS.left+5,y+Form_SELF_FONTS.top+GetSkinHeight(),size.width,size.height);
195
 
5730 pavelyakov 196
	WHILE(DSBYTE[text1])
197
	{
5753 leency 198
		IF(DSBYTE[text1]=='_') len--;
199
		len+=symbol(len,DSBYTE[text1],c);
200
		IF(weight)len++;
5730 pavelyakov 201
		text1++;
202
	}
5753 leency 203
	_PutImage(x,y-size.offset_y,size.width,size.height,buffer);
5730 pavelyakov 204
	return len;
205
}
5736 pavelyakov 206
:dword FONT::textarea(word x,y;dword text1,c;byte size)
5730 pavelyakov 207
{
5740 pavelyakov 208
 
5730 pavelyakov 209
}
5742 pavelyakov 210
 
5740 pavelyakov 211
:byte FONT::symbol(signed x;byte s;dword c)
5730 pavelyakov 212
{
5736 pavelyakov 213
        dword xi,yi;
214
        dword tmp,_;
215
        dword iii;
5741 pavelyakov 216
		dword ___x;
5736 pavelyakov 217
        byte rw=0;
5753 leency 218
		x += size.offset_x;
5736 pavelyakov 219
        IF(s==32)return width/4;
220
		IF(s==9)return width;
221
        yi = 0;
222
        iii = 0;
223
        tmp = 4*block*s;
224
        tmp +=data;
5741 pavelyakov 225
        while(yi
5736 pavelyakov 226
        {
227
                xi = 0;
5753 leency 228
                while(xi
5736 pavelyakov 229
                {
5740 pavelyakov 230
                        IF(iii%32) _ >>= 1;
231
						ELSE
232
						{
5736 pavelyakov 233
                                tmp += 4;
234
                                _ = DSDWORD[tmp];
235
                        }
236
                        IF(_&1)
237
                        {
238
                                IF(xi>rw)rw=xi;
5741 pavelyakov 239
								___x = x+xi;
5753 leency 240
								IF(___x
241
								{
242
									PixelRGB(___x,size.offset_y+yi);
243
									IF(weight) PixelRGB(___x+1,size.offset_y+yi);
244
								}
5736 pavelyakov 245
                        }
246
                        xi++;
247
                        iii++;
248
                }
249
                yi++;
250
        }
251
        return rw;
5730 pavelyakov 252
}
253
:byte FONT::load(dword path)
254
{
255
	dword tmp;
5745 leency 256
	buffer_size = 0;
5730 pavelyakov 257
	IF(data)free(data);
5751 leency 258
	if (!io.readKPACK(path))
5745 leency 259
	{
260
		debug("Error while loading font: ");
261
		debugln(path);
262
		return 0;
263
	}
264
	tmp = io.buffer_data;
5730 pavelyakov 265
	data = tmp;
5736 pavelyakov 266
	begin = data;
5730 pavelyakov 267
	size_file = io.FILES_SIZE;
268
	tmp +=size_file;
269
	tmp--;
270
	height = DSBYTE[tmp];
271
	tmp--;
272
	width = DSBYTE[tmp];
273
	block = math.ceil(height*width/32);
274
}
275
 
276
#endif