Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
5987 leency 1
#ifndef INCLUDE_LABEL_H
2
#define INCLUDE_LABEL_H
5730 pavelyakov 3
 
4
#ifndef INCLUDE_MATH_H
5
#include "../lib/math.h"
6
#endif
7
 
5933 pavelyakov 8
#ifndef INCLUDE_FS_H
5885 pavelyakov 9
#include "../lib/obj/fs.h"
5730 pavelyakov 10
#endif
11
 
5981 leency 12
#define DEFAULT_FONT "/sys/fonts/Tahoma.kf"
13
 
5753 leency 14
:struct __SIZE
15
{
5816 leency 16
	dword width,height;
5987 leency 17
	signed offset_x, offset_y;
5757 pavelyakov 18
	float offset_i,w_italic;
5988 leency 19
	byte pt;
5754 pavelyakov 20
	byte TMP_WEIGHT;
5753 leency 21
};
5987 leency 22
:struct LABEL
5730 pavelyakov 23
{
5753 leency 24
	__SIZE size;
5987 leency 25
	int width,height;
5981 leency 26
	byte bold,italic,smooth;
5753 leency 27
	dword color;
5987 leency 28
	dword font,font_begin;
5730 pavelyakov 29
	word block;
5987 leency 30
	byte init();
5985 leency 31
	byte changeSIZE();
5987 leency 32
	byte symbol();
33
	byte symbol_size();
34
	dword getsize();
35
 
36
	dword raw;
37
	dword raw_size;
5985 leency 38
	void apply_smooth();
5987 leency 39
	int write_center();
40
	int write();
41
	void write_buf();
5985 leency 42
	void show_buf();
5987 leency 43
} label;
5981 leency 44
 
5987 leency 45
:byte LABEL::changeSIZE()
5730 pavelyakov 46
{
5987 leency 47
	dword file_size;
5736 pavelyakov 48
	dword TMP_DATA;
49
	dword ofs;
5987 leency 50
	IF(size.pt<9) size.pt = 8;
51
	TMP_DATA = font = font_begin;
52
	TMP_DATA +=size.pt-8*4;
5754 pavelyakov 53
	ofs = DSDWORD[TMP_DATA];
54
	IF(ofs==-1)return false;
5987 leency 55
	font += ofs + 156;
56
	TMP_DATA = font;
5754 pavelyakov 57
	file_size = DSDWORD[TMP_DATA];
5987 leency 58
	TMP_DATA = font + file_size;
5783 leency 59
	height = DSBYTE[TMP_DATA - 1];
60
	width =  DSBYTE[TMP_DATA - 2];
5754 pavelyakov 61
	block = math.ceil(height*width/32);
62
	return true;
5736 pavelyakov 63
}
5987 leency 64
:dword LABEL::getsize(dword text1)
5736 pavelyakov 65
{
5753 leency 66
	size.height = size.width = 0;
5987 leency 67
	size.offset_x = size.offset_y = -1;
68
	IF(size.pt)IF(!changeSIZE())return 0;
5742 pavelyakov 69
	WHILE(DSBYTE[text1])
70
	{
5753 leency 71
		symbol_size(DSBYTE[text1]);
5742 pavelyakov 72
		text1++;
73
	}
5987 leency 74
	$neg size.offset_y
75
	$neg size.offset_x
76
	size.height += size.offset_y; size.height++;
77
	size.width += size.offset_x; size.width++;
5757 pavelyakov 78
	IF(italic)
79
	{
5758 pavelyakov 80
		size.w_italic = size.height/3;
81
		size.offset_i = size.w_italic/size.height;
82
		size.width += size.w_italic;
83
		size.w_italic = -size.w_italic;
5757 pavelyakov 84
	}
5753 leency 85
	return size.width;
5742 pavelyakov 86
}
5987 leency 87
:byte LABEL::symbol_size(byte s)
5742 pavelyakov 88
{
5981 leency 89
		dword xi,yi;
90
		dword tmp,_;
5985 leency 91
		dword iii = 0;
5981 leency 92
		byte rw=0;
5753 leency 93
		byte X;
5987 leency 94
		size.TMP_WEIGHT = math.ceil(size.pt/17);
5981 leency 95
		IF(s==32)
5753 leency 96
		{
97
			size.width += width/4;
5981 leency 98
			IF(bold) size.width+=size.TMP_WEIGHT;
5753 leency 99
			return;
100
		}
101
		IF(s==9)
102
		{
103
			size.width += width;
5981 leency 104
			IF(bold) size.width+=size.TMP_WEIGHT;
5753 leency 105
			return;
106
		}
5987 leency 107
		s = Cp866ToAnsi(s);
108
		tmp = 4*block*s + font;
5981 leency 109
		for(yi=0; yi
110
		{
111
			for(xi=0; xi
112
			{
113
				IF(iii%32) _ >>= 1;
5784 leency 114
				ELSE
115
				{
5981 leency 116
					tmp += 4;
117
					_ = DSDWORD[tmp];
118
				}
119
				IF(_&1)
5784 leency 120
				{
121
					IF(xi>rw)rw=xi;
122
					IF(size.height
5987 leency 123
					IF(size.offset_y<0)size.offset_y = yi;
124
					ELSE IF(yi
5784 leency 125
					IF(!X) X = xi;
126
					ELSE IF(X>xi)X = xi;
127
				}
5981 leency 128
				iii++;
129
			}
130
		}
5753 leency 131
		size.width += rw;
5981 leency 132
		IF(bold) size.width+=size.TMP_WEIGHT;
5753 leency 133
		IF(s=='_') size.width--;
5987 leency 134
		IF(size.offset_x<0)size.offset_x = X;
5742 pavelyakov 135
}
5987 leency 136
:byte LABEL::symbol(signed x,y; byte s; dword image_raw)
5981 leency 137
{
138
		dword xi,yi;
5985 leency 139
		dword iii = 0;
140
		dword offs;
5981 leency 141
		float ital = -size.w_italic;
142
		dword ___x;
143
		byte rw=0;
144
		IF(s==32)return width/4;
145
		IF(s==9)return width;
5987 leency 146
		debugch(s);
147
		s = Cp866ToAnsi(s);
148
		EBX = block*s << 2 + font;
5981 leency 149
		for(yi=0; yi
150
		{
5987 leency 151
			EDI = size.offset_y + yi + y * size.width * 3 + image_raw;
5981 leency 152
			for(xi=0; xi
153
			{
154
				IF(iii%32) $shr ecx,1
155
				ELSE
156
				{
157
						EBX += 4;
158
						ECX = DSDWORD[EBX];
159
				}
160
				IF(ECX&true)
161
				{
162
						IF(xi>rw)rw=xi;
163
						___x = x+xi;
164
						IF(italic)___x+=math.ceil(ital);
5985 leency 165
						offs = ___x*3 + EDI;
166
						DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color;
167
						IF(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color;
5981 leency 168
				}
169
				iii++;
170
			}
171
			if (italic) ital-=size.offset_i;
172
		}
173
		return rw;
174
}
175
 
5987 leency 176
byte Cp866ToAnsi(byte s) {
5981 leency 177
	IF(s>=128)&&(s<=175)s+=64;
178
	ELSE IF(s>=224)&&(s<=239)s+=16;
179
	ELSE IF(s==241)s=184; //yo
180
	ELSE IF(s==240)s=168; //YO
181
	return s;
182
}
183
 
5987 leency 184
:byte LABEL::init(dword font_path)
185
{
186
	lib_init_fs();
187
	IF(font)free(font);
188
	IF(!fs.read(font_path)) {
189
		debug("Error while loading font: ");
190
		debugln(font_path);
191
		//io.run("/sys/@notify","'Error: Font is not loaded.' -E");
192
		return false;
193
	}
194
	font_begin = font = EAX;
195
	EBX = font_begin + ECX;
196
	height = DSBYTE[EBX-1];
197
	width = DSBYTE[EBX-2];
198
	block = math.ceil(height*width/32);
199
	smooth = true;
200
	return true;
201
}
202
 
203
 
204
/*=====================================================================================
205
===========================                                 ===========================
206
===========================               RAW               ===========================
207
===========================                                 ===========================
208
=====================================================================================*/
209
 
210
 
5981 leency 211
inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; }
5987 leency 212
:void LABEL::apply_smooth()
5981 leency 213
{
214
	dword i,line_w,to;
5987 leency 215
	line_w = size.width * 3;
216
	to = size.height - 1 * line_w + raw - 3;
217
	for(i=raw; i < to; i+=3)
5985 leency 218
	{
5987 leency 219
		IF(i-raw%line_w +3 == line_w) continue;
5981 leency 220
		IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000)
221
		{
5985 leency 222
			ShadowPixel(i+3, 2);
223
			ShadowPixel(i+line_w, 2);
5981 leency 224
		}
225
		ELSE IF(b24(i)!=0x000000) && (b24(i+3)==0x000000) && (b24(i+line_w)==0x000000) && (b24(i+3+line_w)!=0x000000)
226
		{
5985 leency 227
			ShadowPixel(i, 2);
228
			ShadowPixel(i+3+line_w, 2);
5981 leency 229
		}
230
	}
231
}
232
 
5987 leency 233
:int LABEL::write_center(dword x,y,w,h; dword background, color1; byte fontSizePoints; dword txt)
5742 pavelyakov 234
{
5987 leency 235
	size.pt = fontSizePoints;
5985 leency 236
	getsize(txt);
5987 leency 237
	return write(w-size.width/2+x,y, background, color1, fontSizePoints, txt);
5985 leency 238
}
239
 
5987 leency 240
:int LABEL::write(int x,y; dword background, color1; byte fontSizePoints; dword text1)
5985 leency 241
{
5742 pavelyakov 242
	signed len=0;
5754 pavelyakov 243
	IF(!text1)return false;
5987 leency 244
	IF(size.pt)IF(!changeSIZE())return false;
245
	size.pt = fontSizePoints;
5753 leency 246
	getsize(text1);
5987 leency 247
	color = color1;
248
	y -= size.offset_y;
5754 pavelyakov 249
	EDX = size.width*size.height*3;
5987 leency 250
	IF(!raw_size)
5745 leency 251
	{
5987 leency 252
		raw_size = EDX;
253
		raw = malloc(raw_size);
5745 leency 254
	}
5987 leency 255
	ELSE IF(raw_size
5745 leency 256
	{
5987 leency 257
		raw_size = EDX;
258
		raw = realloc(raw,raw_size);
5745 leency 259
	}
5985 leency 260
	// Fill background color {
5987 leency 261
	EBX = background;
262
	EAX = raw_size+raw;
263
	for (EDI=raw; EDI
5985 leency 264
	// }
5987 leency 265
	len = size.offset_x;
5730 pavelyakov 266
	WHILE(DSBYTE[text1])
267
	{
5753 leency 268
		IF(DSBYTE[text1]=='_') len--;
5987 leency 269
		len+=symbol(len,0,DSBYTE[text1], raw);
270
		IF(bold)len+=math.ceil(size.pt/17);
5730 pavelyakov 271
		text1++;
272
	}
5985 leency 273
	IF (smooth) apply_smooth();
5987 leency 274
	show_buf(x,y);
5730 pavelyakov 275
	return len;
276
}
277
 
5987 leency 278
:void LABEL::write_buf(int x,y,w,h; dword background, color1; byte fontSizePoints; dword text1)
5782 leency 279
{
5987 leency 280
	dword new_raw_size;
5782 leency 281
	IF(!text1)return;
5987 leency 282
	IF(size.pt)IF(!changeSIZE())return;
283
 
284
	size.pt = fontSizePoints;
5782 leency 285
	getsize(text1);
5987 leency 286
	y -= size.offset_y;
287
	color = color1;
5981 leency 288
 
5782 leency 289
	size.width = w;
5783 leency 290
	size.height = h;
5784 leency 291
 
5987 leency 292
	new_raw_size = w*h*3;
293
	IF(raw_size != new_raw_size)
5782 leency 294
	{
5987 leency 295
		raw_size = new_raw_size;
296
		free(raw);
297
		raw = malloc(raw_size);
5985 leency 298
		// Fill background color
5987 leency 299
		EBX = background;
300
		EAX = raw_size+raw;
301
		for (EDI=raw; EDI
5782 leency 302
	}
303
	WHILE(DSBYTE[text1])
304
	{
5987 leency 305
		x+=symbol(x,y,DSBYTE[text1], raw);
306
		IF(bold)x+=math.ceil(size.pt/17);
5782 leency 307
		text1++;
308
	}
309
	return;
310
}
311
 
5987 leency 312
:void LABEL::show_buf(dword x, y){
313
	_PutImage(x, y, size.width, size.height, raw);
5985 leency 314
}
315
 
316
 
317
 
5730 pavelyakov 318
#endif