Subversion Repositories Kolibri OS

Rev

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