Subversion Repositories Kolibri OS

Rev

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