Subversion Repositories Kolibri OS

Rev

Rev 6786 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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