Subversion Repositories Kolibri OS

Rev

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

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