Subversion Repositories Kolibri OS

Rev

Rev 5742 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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