Subversion Repositories Kolibri OS

Rev

Rev 6803 | Rev 6806 | 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();
6805 leency 44
	void ShowBuffer();
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;
6805 leency 51
	if(size.pt<9) size.pt = 9;
6803 leency 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
}
6805 leency 62
:dword LABEL::getsize(byte fontSizePoints, dword text1)
5736 pavelyakov 63
{
5753 leency 64
	size.height = size.width = 0;
5987 leency 65
	size.offset_x = size.offset_y = -1;
6805 leency 66
	size.pt = fontSizePoints;
6803 leency 67
	if(size.pt)if(!changeSIZE())return 0;
5742 pavelyakov 68
	WHILE(DSBYTE[text1])
69
	{
5753 leency 70
		symbol_size(DSBYTE[text1]);
5742 pavelyakov 71
		text1++;
72
	}
5987 leency 73
	$neg size.offset_y
74
	$neg size.offset_x
5996 leency 75
	size.height += size.offset_y+1;
76
	size.width += size.offset_x+1;
5753 leency 77
	return size.width;
5742 pavelyakov 78
}
5987 leency 79
:byte LABEL::symbol_size(byte s)
5742 pavelyakov 80
{
6805 leency 81
	//return symbol_size(s);
82
	dword xi,yi;
83
	dword tmp,_;
84
	dword iii = 0;
85
	byte rw=0;
86
	byte X;
87
	if(bold) size.width+=math.ceil(size.pt/17);
88
	if(s==32)
89
	{
90
		size.width += width/4;
91
		return;
92
	}
93
	if(s==9)
94
	{
95
		size.width += width;
96
		return;
97
	}
98
	s = Cp866ToAnsi(s);
99
	tmp = block*s << 2 + font;
100
	for(yi=0; yi
101
	{
102
		for(xi=0; xi
5753 leency 103
		{
6805 leency 104
			if(iii%32) _ >>= 1;
105
			else
5981 leency 106
			{
6805 leency 107
				tmp += 4;
108
				_ = DSDWORD[tmp];
5981 leency 109
			}
6805 leency 110
			if(_&1)
111
			{
112
				if(xi>rw)rw=xi;
113
				if(size.height
114
				if(size.offset_y<0)size.offset_y = yi;
115
				else if(yi
116
				if(!X) X = xi;
117
				else if(X>xi)X = xi;
118
			}
119
			iii++;
5981 leency 120
		}
6805 leency 121
	}
122
	size.width += rw;
123
	if(size.offset_x<0)size.offset_x = X;
5742 pavelyakov 124
}
5987 leency 125
:byte LABEL::symbol(signed x,y; byte s; dword image_raw)
5981 leency 126
{
6805 leency 127
	dword xi,yi;
128
	dword iii = 0;
129
	dword offs;
130
	byte rw=0;
131
	if(s==32)return width/4;
132
	if(s==9)return width;
133
	s = Cp866ToAnsi(s);
134
	EBX = block*s << 2 + font;
135
	for(yi=0; yi
136
	{
137
		EDI = size.offset_y + yi + y * size.width * 3 + image_raw;
138
		for(xi=0; xi
5981 leency 139
		{
6805 leency 140
			if(iii%32) $shr ecx,1
141
			else
5981 leency 142
			{
6805 leency 143
					EBX += 4;
144
					ECX = DSDWORD[EBX];
5981 leency 145
			}
6805 leency 146
			if(ECX&true)
147
			{
148
					if(xi>rw)rw=xi;
149
					offs = x + xi *3 + EDI;
150
					DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color;
151
					if(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color;
152
			}
153
			iii++;
5981 leency 154
		}
6805 leency 155
	}
156
	return rw;
5981 leency 157
}
158
 
6803 leency 159
inline fastcall Cp866ToAnsi(AL) {
160
	if (AL>=128)&&(AL<=175) return AL+64;
161
	if (AL>=224)&&(AL<=239) return AL+16;
162
	if (AL==241) return 184; //e ruAL with dotAL (yo)
163
	if (AL==240) return 168; //E ruAL with dotAL (yo)
164
	if (AL==242) return 'E'; //E ukr (ye)
165
	if (AL==243) return 186; //e ukr (ye)
166
	if (AL==244) return 'I'; //I ukr (yi)
167
	if (AL==245) return 191; //i ukr (yi)
168
	return AL;
5981 leency 169
}
170
 
5987 leency 171
:byte LABEL::init(dword font_path)
172
{
6784 leency 173
	IO label_io;
6803 leency 174
	if(font)free(font);
6784 leency 175
	label_io.read(font_path);
6803 leency 176
	if(!EAX) {
6785 leency 177
		debugln(font_path);
6786 leency 178
		label_io.run("/sys/@notify", "'Error: KFONT is not loaded.' -E");
5987 leency 179
		return false;
180
	}
6803 leency 181
	font_begin = label_io.buffer_data;
182
	changeSIZE();
5987 leency 183
	smooth = true;
184
	return true;
185
}
186
 
187
 
188
/*=====================================================================================
189
===========================                                 ===========================
190
===========================               RAW               ===========================
191
===========================                                 ===========================
192
=====================================================================================*/
193
 
194
 
6053 leency 195
inline fastcall dword b24(EAX) { return DSDWORD[EAX] & 0x00FFFFFF; }
6803 leency 196
:void LABEL::ApplySmooth()
5981 leency 197
{
6053 leency 198
	dword i,line_w,to,dark_background;
5987 leency 199
	line_w = size.width * 3;
200
	to = size.height - 1 * line_w + raw - 3;
201
	for(i=raw; i < to; i+=3)
5985 leency 202
	{
5997 leency 203
		if(i-raw%line_w +3 == line_w) continue;
6021 leency 204
		// pixels position, where b - black, w - write
205
		// bw
206
		// wb
6053 leency 207
		if(b24(i)!=background) && (b24(i+3)==background) && (b24(i+line_w)==background) && (b24(i+3+line_w)!=background)
5997 leency 208
		{
6216 leency 209
			dark_background = MixColors(background,b24(i),210);
6053 leency 210
			DSDWORD[i+3] = DSDWORD[i+3] & 0xFF000000 | dark_background;
211
			DSDWORD[i+line_w] = DSDWORD[i+line_w] & 0xFF000000 | dark_background;
5981 leency 212
		}
6021 leency 213
		// wb
214
		// bw
6053 leency 215
		else if(b24(i)==background) && (b24(i+3)!=background) && (b24(i+line_w)!=background) && (b24(i+3+line_w)==background)
5981 leency 216
		{
6216 leency 217
			dark_background = MixColors(background,b24(i+3),210);
6053 leency 218
			DSDWORD[i] = DSDWORD[i] & 0xFF000000 | dark_background;
219
			DSDWORD[i+3+line_w] = DSDWORD[i+3+line_w] & 0xFF000000 | dark_background;
5981 leency 220
		}
221
	}
222
}
223
 
6803 leency 224
:void LABEL::WriteIntoBuffer(int x,y,w,h; dword _background, _color; byte fontSizePoints; dword text1)
5782 leency 225
{
5987 leency 226
	dword new_raw_size;
6803 leency 227
	if(!text1)return;
228
	if(size.pt)if(!changeSIZE())return;
5987 leency 229
 
6021 leency 230
	if (size.pt != fontSizePoints) {
6805 leency 231
		getsize(fontSizePoints, text1);
6021 leency 232
		y -= size.offset_y;
233
	}
5997 leency 234
	color = _color;
235
	background = _background;
5981 leency 236
 
5782 leency 237
	size.width = w;
5783 leency 238
	size.height = h;
5784 leency 239
 
5987 leency 240
	new_raw_size = w*h*3;
6803 leency 241
	if(raw_size != new_raw_size)
5782 leency 242
	{
5987 leency 243
		raw_size = new_raw_size;
244
		free(raw);
245
		raw = malloc(raw_size);
5985 leency 246
		// Fill background color
5987 leency 247
		EBX = background;
248
		EAX = raw_size+raw;
249
		for (EDI=raw; EDI
5782 leency 250
	}
251
	WHILE(DSBYTE[text1])
252
	{
5987 leency 253
		x+=symbol(x,y,DSBYTE[text1], raw);
6803 leency 254
		if(bold)x+=math.ceil(size.pt/17);
5782 leency 255
		text1++;
256
	}
257
	return;
258
}
259
 
6805 leency 260
:int LABEL::WriteIntoWindow(int x,y; dword _background, _color; byte fontSizePoints; dword text1)
261
{
262
	if(!text1)return 0;
263
	getsize(fontSizePoints, text1);
264
	raw_size = NULL;
265
	WriteIntoBuffer(0, -size.offset_y, size.width-size.offset_x,
266
		size.height-size.offset_y, _background, _color, fontSizePoints, text1);
267
	if (smooth) ApplySmooth();
268
	ShowBuffer(x,y);
269
	return size.offset_x + size.width;
270
}
271
 
272
:int LABEL::WriteIntoWindowCenter(dword x,y,w,h; dword _background, _color; byte fontSizePoints; dword text1)
273
{
274
	getsize(fontSizePoints, text1);
275
	return WriteIntoWindow(w-size.width/2+x,y, _background, _color, fontSizePoints, text1);
276
}
277
 
278
:void LABEL::ShowBuffer(dword x, y){
5987 leency 279
	_PutImage(x, y, size.width, size.height, raw);
5985 leency 280
}
281
 
282
 
283
 
5730 pavelyakov 284
#endif