Subversion Repositories Kolibri OS

Rev

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