Subversion Repositories Kolibri OS

Rev

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

Rev 5981 Rev 5985
Line 26... Line 26...
26
:struct FONT
26
:struct FONT
27
{
27
{
28
	__SIZE size;
28
	__SIZE size;
29
	int left,top,width,height;
29
	int left,top,width,height;
30
	byte bold,italic,smooth;
30
	byte bold,italic,smooth;
31
	byte no_bg_copy;
-
 
32
	dword bg_color;
31
	dword bg_color;
33
	dword color;
32
	dword color;
34
	dword file_size;
33
	dword file_size;
35
	dword buffer;
34
	dword buffer;
36
	dword buffer_size;
35
	dword buffer_size;
37
	word block;
36
	word block;
38
	dword data;
37
	dword data;
39
	dword begin;
38
	dword begin;
40
	byte load(...);
39
	byte load(...);
-
 
40
	byte changeSIZE();
41
	byte symbol(word x,y;byte s;dword c);
41
	byte symbol(signed x,y;byte s;dword c);
42
	byte symbol_size(byte s);
42
	byte symbol_size(byte s);
43
	dword prepare(word x,y;dword text1);
-
 
44
	void prepare_buf(dword x,y,w,h, text1);
-
 
45
	void show();
-
 
46
	byte textcenter(word x,y,w,h;dword txt);
-
 
47
	dword getsize(dword text1);
43
	dword getsize(dword text1);
48
	byte changeSIZE();
44
	void apply_smooth();
-
 
45
	int write_center(dword x,y,w,h;dword txt);
49
	void PixelRGB(dword x,y);
46
	int write(int x,y;dword text1);
-
 
47
	void write_buf(int x,y,w,h, text1);
-
 
48
	void show_buf();
50
};
49
};
51
FONT font = 0;
50
FONT font = 0;
Line 52... Line -...
52
 
-
 
53
:void FONT::PixelRGB(dword x,y)
-
 
54
{
-
 
55
	dword offs = y*size.width+x*3 + buffer;
-
 
56
	DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color;
-
 
57
}
51
 
58
:byte FONT::changeSIZE()
52
:byte FONT::changeSIZE()
59
{
53
{
60
	dword TMP_DATA;
54
	dword TMP_DATA;
61
	dword ofs;
55
	dword ofs;
Line 71... Line 65...
71
	height = DSBYTE[TMP_DATA - 1];
65
	height = DSBYTE[TMP_DATA - 1];
72
	width =  DSBYTE[TMP_DATA - 2];
66
	width =  DSBYTE[TMP_DATA - 2];
73
	block = math.ceil(height*width/32);
67
	block = math.ceil(height*width/32);
74
	return true;
68
	return true;
75
}
69
}
76
:byte FONT::textcenter(word x,y,w,h;dword txt)
-
 
77
{
-
 
78
	getsize(txt);
-
 
79
	EDX = w/2;
-
 
80
	ECX = size.width/2;
-
 
81
	EDX -= ECX;
-
 
82
	x += EDX;
-
 
83
	prepare(x,y,txt);
-
 
84
}
-
 
85
:dword FONT::getsize(dword text1)
70
:dword FONT::getsize(dword text1)
86
{
71
{
87
	size.height = size.width = 0;
72
	size.height = size.width = 0;
88
	size.offset.x = size.offset.y = -1;
73
	size.offset.x = size.offset.y = -1;
89
	IF(size.text)IF(!changeSIZE())return 0;
74
	IF(size.text)IF(!changeSIZE())return 0;
Line 107... Line 92...
107
}
92
}
108
:byte FONT::symbol_size(byte s)
93
:byte FONT::symbol_size(byte s)
109
{
94
{
110
		dword xi,yi;
95
		dword xi,yi;
111
		dword tmp,_;
96
		dword tmp,_;
112
		dword iii;
97
		dword iii = 0;
113
		byte rw=0;
98
		byte rw=0;
114
		byte X;
99
		byte X;
115
		size.TMP_WEIGHT = math.ceil(size.text/17);
100
		size.TMP_WEIGHT = math.ceil(size.text/17);
116
		IF(s==32)
101
		IF(s==32)
117
		{
102
		{
Line 124... Line 109...
124
			size.width += width;
109
			size.width += width;
125
			IF(bold) size.width+=size.TMP_WEIGHT;
110
			IF(bold) size.width+=size.TMP_WEIGHT;
126
			return;
111
			return;
127
		}
112
		}
128
		s = AnsiToCp866(s);
113
		s = AnsiToCp866(s);
129
		iii = 0;
-
 
130
		tmp = 4*block*s + data;
114
		tmp = 4*block*s + data;
131
		for(yi=0; yi
115
		for(yi=0; yi
132
		{
116
		{
133
			for(xi=0; xi
117
			for(xi=0; xi
134
			{
118
			{
Line 156... Line 140...
156
		IF(size.offset.x<0)size.offset.x = X;
140
		IF(size.offset.x<0)size.offset.x = X;
157
}
141
}
158
:byte FONT::symbol(signed x,y;byte s)
142
:byte FONT::symbol(signed x,y;byte s)
159
{
143
{
160
		dword xi,yi;
144
		dword xi,yi;
161
		dword iii;
145
		dword iii = 0;
-
 
146
		dword offs;
162
		float ital = -size.w_italic;
147
		float ital = -size.w_italic;
163
		dword ___x;
148
		dword ___x;
164
		byte rw=0;
149
		byte rw=0;
165
		IF(s==32)return width/4;
150
		IF(s==32)return width/4;
166
		IF(s==9)return width;
151
		IF(s==9)return width;
167
		s = AnsiToCp866(s);
152
		s = AnsiToCp866(s);
168
		iii = 0;
-
 
169
		EBX = block*s << 2 + data;
153
		EBX = block*s << 2 + data;
170
		for(yi=0; yi
154
		for(yi=0; yi
171
		{
155
		{
172
			EDI = size.offset.y + yi + y;
156
			EDI = size.offset.y + yi + y * size.width * 3 + buffer;
173
			for(xi=0; xi
157
			for(xi=0; xi
174
			{
158
			{
175
				IF(iii%32) $shr ecx,1
159
				IF(iii%32) $shr ecx,1
176
				ELSE
160
				ELSE
177
				{
161
				{
Line 181... Line 165...
181
				IF(ECX&true)
165
				IF(ECX&true)
182
				{
166
				{
183
						IF(xi>rw)rw=xi;
167
						IF(xi>rw)rw=xi;
184
						___x = x+xi;
168
						___x = x+xi;
185
						IF(italic)___x+=math.ceil(ital);
169
						IF(italic)___x+=math.ceil(ital);
186
						PixelRGB(___x,EDI);
170
						offs = ___x*3 + EDI;
-
 
171
						DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color;
187
						IF(bold) PixelRGB(___x+1,EDI);
172
						IF(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color;
188
				}
173
				}
189
				iii++;
174
				iii++;
190
			}
175
			}
191
			if (italic) ital-=size.offset_i;
176
			if (italic) ital-=size.offset_i;
192
		}
177
		}
193
		return rw;
178
		return rw;
194
}
179
}
Line 195... Line -...
195
 
-
 
196
:void FONT::show(){ 
-
 
197
	_PutImage(left,top,size.width,size.height,buffer);
-
 
198
}
-
 
199
 
180
 
200
byte AnsiToCp866(byte s) {
181
byte AnsiToCp866(byte s) {
201
	IF(s>=128)&&(s<=175)s+=64;
182
	IF(s>=128)&&(s<=175)s+=64;
202
	ELSE IF(s>=224)&&(s<=239)s+=16;
183
	ELSE IF(s>=224)&&(s<=239)s+=16;
203
	ELSE IF(s==241)s=184; //yo
184
	ELSE IF(s==241)s=184; //yo
204
	ELSE IF(s==240)s=168; //YO
185
	ELSE IF(s==240)s=168; //YO
205
	return s;
186
	return s;
Line 206... Line 187...
206
}
187
}
207
 
188
 
208
inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; }
189
inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; }
209
:void SmoothFont(dword image, w, h)
190
:void FONT::apply_smooth()
210
{
191
{
211
	dword i,line_w,to;
192
	dword i,line_w,to;
212
	line_w = w * 3;
193
	line_w = font.size.width * 3;
-
 
194
	to = font.size.height - 1 * line_w + font.buffer - 3;
213
	to = w*h*3 + image - line_w - 3;
195
	for(i=font.buffer; i < to; i+=3)	
214
	for(i = image; i < to; i+=3)	{
196
	{
215
		IF(i-image%line_w +3 == line_w) continue;
197
		IF(i-font.buffer%line_w +3 == line_w) continue;
216
		IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000)
198
		IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000)
217
		{ 
199
		{ 
218
			ShadowImage(i+3, 1, 1, 2);
200
			ShadowPixel(i+3, 2);
219
			ShadowImage(i+line_w, 1, 1, 2);
201
			ShadowPixel(i+line_w, 2);
220
		}
202
		}
221
		ELSE IF(b24(i)!=0x000000) && (b24(i+3)==0x000000) && (b24(i+line_w)==0x000000) && (b24(i+3+line_w)!=0x000000)
203
		ELSE IF(b24(i)!=0x000000) && (b24(i+3)==0x000000) && (b24(i+line_w)==0x000000) && (b24(i+3+line_w)!=0x000000)
222
		{
204
		{
223
			ShadowImage(i, 1, 1, 2);
205
			ShadowPixel(i, 2);
224
			ShadowImage(i+3+line_w, 1, 1, 2);
206
			ShadowPixel(i+3+line_w, 2);
225
		}
207
		}
226
	}
208
	}
227
}
209
}
Line 238... Line 220...
238
	width = DSBYTE[EBX-2];
220
	width = DSBYTE[EBX-2];
239
	block = math.ceil(height*width/32);
221
	block = math.ceil(height*width/32);
240
	return true;
222
	return true;
241
}
223
}
Line -... Line 224...
-
 
224
 
-
 
225
:int FONT::write_center(dword x,y,w,h;dword txt)
-
 
226
{
-
 
227
	getsize(txt);
-
 
228
	return write(w-size.width/2+x,y,txt);
-
 
229
}
242
 
230
 
243
:dword FONT::prepare(int x,y;dword text1)
231
:int FONT::write(int x,y; dword text1)
244
{
232
{
245
	signed len=0;
-
 
246
	proc_info Form_SELF_FONTS;
-
 
247
	dword c;
233
	signed len=0;
248
	IF(!text1)return false;
234
	IF(!text1)return false;
249
	IF(size.text)IF(!changeSIZE())return false;
235
	IF(size.text)IF(!changeSIZE())return false;
250
	left = x;
236
	left = x;
251
	getsize(text1);
237
	getsize(text1);
Line 260... Line 246...
260
	ELSE IF(buffer_size
246
	ELSE IF(buffer_size
261
	{
247
	{
262
		buffer_size = EDX;
248
		buffer_size = EDX;
263
		buffer = realloc(buffer,buffer_size);
249
		buffer = realloc(buffer,buffer_size);
264
	}
250
	}
265
	IF (no_bg_copy)
251
	// Fill background color {
266
	{
-
 
267
		EBX = bg_color;
252
	EBX = bg_color;
268
		EAX = buffer_size+buffer;
253
	EAX = buffer_size+buffer;
269
		for (EDI=buffer; EDI
254
	for (EDI=buffer; EDI
270
	}
255
	// }
271
	ELSE
-
 
272
	{
-
 
273
		GetProcessInfo(#Form_SELF_FONTS, SelfInfo); 
-
 
274
		CopyScreen(buffer,x+Form_SELF_FONTS.left+5,y+Form_SELF_FONTS.top+GetSkinHeight(),size.width,size.height);
-
 
275
	}
-
 
276
	len = size.offset.x;
256
	len = size.offset.x;
277
	WHILE(DSBYTE[text1])
257
	WHILE(DSBYTE[text1])
278
	{
258
	{
279
		IF(DSBYTE[text1]=='_') len--;
259
		IF(DSBYTE[text1]=='_') len--;
280
		len+=symbol(len,0,DSBYTE[text1]);
260
		len+=symbol(len,0,DSBYTE[text1]);
281
		IF(bold)len+=math.ceil(size.text/17);
261
		IF(bold)len+=math.ceil(size.text/17);
282
		text1++;
262
		text1++;
283
	}
263
	}
284
	IF (smooth) SmoothFont(buffer, size.width, size.height);
264
	IF (smooth) apply_smooth();
-
 
265
	show_buf(left,top);
285
	return len;
266
	return len;
286
}
267
}
Line 287... Line 268...
287
 
268
 
288
:void FONT::prepare_buf(int x,y,w,h; dword text1)
269
:void FONT::write_buf(int x,y,w,h; dword text1)
289
{
270
{
290
	dword c, new_buffer_size;
271
	dword new_buffer_size;
291
	IF(!text1)return;
272
	IF(!text1)return;
292
	IF(size.text)IF(!changeSIZE())return;
273
	IF(size.text)IF(!changeSIZE())return;
293
	getsize(text1);
274
	getsize(text1);
Line 300... Line 281...
300
	IF(buffer_size != w*h*3)
281
	IF(buffer_size != w*h*3)
301
	{
282
	{
302
		buffer_size = new_buffer_size; 
283
		buffer_size = new_buffer_size; 
303
		free(buffer);
284
		free(buffer);
304
		buffer = malloc(buffer_size);
285
		buffer = malloc(buffer_size);
-
 
286
		// Fill background color
305
		EBX = bg_color;
287
		EBX = bg_color;
306
		EAX = buffer_size+buffer;
288
		EAX = buffer_size+buffer;
307
		for (EDI=buffer; EDI
289
		for (EDI=buffer; EDI
308
	}
290
	}
309
	WHILE(DSBYTE[text1])
291
	WHILE(DSBYTE[text1])
Line 313... Line 295...
313
		text1++;
295
		text1++;
314
	}
296
	}
315
	return;
297
	return;
316
}
298
}
Line -... Line 299...
-
 
299
 
-
 
300
:void FONT::show_buf(dword left1, top1){
-
 
301
	_PutImage(left1,top1,size.width,size.height,buffer);
-
 
302
}
-
 
303
 
-
 
304
 
-
 
305
 
317
 
306
 
318
#endif
307
#endif