Subversion Repositories Kolibri OS

Rev

Rev 5995 | 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
5996 leency 76
	size.height += size.offset_y+1;
77
	size.width += size.offset_x+1;
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
		s = Cp866ToAnsi(s);
147
		EBX = block*s << 2 + font;
5981 leency 148
		for(yi=0; yi
149
		{
5987 leency 150
			EDI = size.offset_y + yi + y * size.width * 3 + image_raw;
5981 leency 151
			for(xi=0; xi
152
			{
153
				IF(iii%32) $shr ecx,1
154
				ELSE
155
				{
156
						EBX += 4;
157
						ECX = DSDWORD[EBX];
158
				}
159
				IF(ECX&true)
160
				{
161
						IF(xi>rw)rw=xi;
162
						___x = x+xi;
163
						IF(italic)___x+=math.ceil(ital);
5985 leency 164
						offs = ___x*3 + EDI;
165
						DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color;
166
						IF(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color;
5981 leency 167
				}
168
				iii++;
169
			}
170
			if (italic) ital-=size.offset_i;
171
		}
172
		return rw;
173
}
174
 
5987 leency 175
byte Cp866ToAnsi(byte s) {
5981 leency 176
	IF(s>=128)&&(s<=175)s+=64;
177
	ELSE IF(s>=224)&&(s<=239)s+=16;
178
	ELSE IF(s==241)s=184; //yo
179
	ELSE IF(s==240)s=168; //YO
180
	return s;
181
}
182
 
5987 leency 183
:byte LABEL::init(dword font_path)
184
{
185
	lib_init_fs();
186
	IF(font)free(font);
187
	IF(!fs.read(font_path)) {
188
		debug("Error while loading font: ");
189
		debugln(font_path);
190
		//io.run("/sys/@notify","'Error: Font is not loaded.' -E");
191
		return false;
192
	}
193
	font_begin = font = EAX;
194
	EBX = font_begin + ECX;
195
	height = DSBYTE[EBX-1];
196
	width = DSBYTE[EBX-2];
197
	block = math.ceil(height*width/32);
198
	smooth = true;
199
	return true;
200
}
201
 
202
 
203
/*=====================================================================================
204
===========================                                 ===========================
205
===========================               RAW               ===========================
206
===========================                                 ===========================
207
=====================================================================================*/
208
 
209
 
5981 leency 210
inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; }
5987 leency 211
:void LABEL::apply_smooth()
5981 leency 212
{
213
	dword i,line_w,to;
5987 leency 214
	line_w = size.width * 3;
215
	to = size.height - 1 * line_w + raw - 3;
216
	for(i=raw; i < to; i+=3)
5985 leency 217
	{
5987 leency 218
		IF(i-raw%line_w +3 == line_w) continue;
5981 leency 219
		IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000)
220
		{
5985 leency 221
			ShadowPixel(i+3, 2);
222
			ShadowPixel(i+line_w, 2);
5981 leency 223
		}
224
		ELSE IF(b24(i)!=0x000000) && (b24(i+3)==0x000000) && (b24(i+line_w)==0x000000) && (b24(i+3+line_w)!=0x000000)
225
		{
5985 leency 226
			ShadowPixel(i, 2);
227
			ShadowPixel(i+3+line_w, 2);
5981 leency 228
		}
229
	}
230
}
231
 
5987 leency 232
:int LABEL::write_center(dword x,y,w,h; dword background, color1; byte fontSizePoints; dword txt)
5742 pavelyakov 233
{
5987 leency 234
	size.pt = fontSizePoints;
5985 leency 235
	getsize(txt);
5987 leency 236
	return write(w-size.width/2+x,y, background, color1, fontSizePoints, txt);
5985 leency 237
}
238
 
5987 leency 239
:int LABEL::write(int x,y; dword background, color1; byte fontSizePoints; dword text1)
5985 leency 240
{
5742 pavelyakov 241
	signed len=0;
5754 pavelyakov 242
	IF(!text1)return false;
5987 leency 243
	IF(size.pt)IF(!changeSIZE())return false;
244
	size.pt = fontSizePoints;
5753 leency 245
	getsize(text1);
5987 leency 246
	color = color1;
247
	y -= size.offset_y;
5754 pavelyakov 248
	EDX = size.width*size.height*3;
5987 leency 249
	IF(!raw_size)
5745 leency 250
	{
5987 leency 251
		raw_size = EDX;
252
		raw = malloc(raw_size);
5745 leency 253
	}
5987 leency 254
	ELSE IF(raw_size
5745 leency 255
	{
5987 leency 256
		raw_size = EDX;
257
		raw = realloc(raw,raw_size);
5745 leency 258
	}
5985 leency 259
	// Fill background color {
5987 leency 260
	EBX = background;
261
	EAX = raw_size+raw;
262
	for (EDI=raw; EDI
5985 leency 263
	// }
5987 leency 264
	len = size.offset_x;
5730 pavelyakov 265
	WHILE(DSBYTE[text1])
266
	{
5753 leency 267
		IF(DSBYTE[text1]=='_') len--;
5987 leency 268
		len+=symbol(len,0,DSBYTE[text1], raw);
269
		IF(bold)len+=math.ceil(size.pt/17);
5730 pavelyakov 270
		text1++;
271
	}
5985 leency 272
	IF (smooth) apply_smooth();
5987 leency 273
	show_buf(x,y);
5730 pavelyakov 274
	return len;
275
}
276
 
5987 leency 277
:void LABEL::write_buf(int x,y,w,h; dword background, color1; byte fontSizePoints; dword text1)
5782 leency 278
{
5987 leency 279
	dword new_raw_size;
5782 leency 280
	IF(!text1)return;
5987 leency 281
	IF(size.pt)IF(!changeSIZE())return;
282
 
283
	size.pt = fontSizePoints;
5782 leency 284
	getsize(text1);
5987 leency 285
	y -= size.offset_y;
286
	color = color1;
5981 leency 287
 
5782 leency 288
	size.width = w;
5783 leency 289
	size.height = h;
5784 leency 290
 
5987 leency 291
	new_raw_size = w*h*3;
292
	IF(raw_size != new_raw_size)
5782 leency 293
	{
5987 leency 294
		raw_size = new_raw_size;
295
		free(raw);
296
		raw = malloc(raw_size);
5985 leency 297
		// Fill background color
5987 leency 298
		EBX = background;
299
		EAX = raw_size+raw;
300
		for (EDI=raw; EDI
5782 leency 301
	}
302
	WHILE(DSBYTE[text1])
303
	{
5987 leency 304
		x+=symbol(x,y,DSBYTE[text1], raw);
305
		IF(bold)x+=math.ceil(size.pt/17);
5782 leency 306
		text1++;
307
	}
308
	return;
309
}
310
 
5987 leency 311
:void LABEL::show_buf(dword x, y){
312
	_PutImage(x, y, size.width, size.height, raw);
5985 leency 313
}
314
 
315
 
316
 
5730 pavelyakov 317
#endif