Subversion Repositories Kolibri OS

Rev

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

Rev 6806 Rev 6808
Line -... Line 1...
-
 
1
// Сам шрифт представляет.
-
 
2
 
-
 
3
// Голова:
-
 
4
// [2 байта символы:KF]
-
 
5
// [4 байта:указатель на название шрифта]
-
 
6
// [1 байт:размер массива указателей на размеры шрифтов, указатель 4 байта, т.е. размер = размер массива*4]
-
 
7
// [размер массива*4 байт:указатели..]
-
 
8
 
-
 
9
// Тело файла:
-
 
10
// [4 байта:масштаб ширина][4 байта:масштаб высота][255*4 байт:указатели на символы][масштаб ширина*масштаб высота байт: данные символов..]
-
 
11
 
-
 
12
// Конец:
-
 
13
// [Название шрифта:"Times New Roman"]
-
 
14
 
-
 
15
 
1
#ifndef INCLUDE_LABEL_H
16
#ifndef INCLUDE_LABEL_H
2
#define INCLUDE_LABEL_H
17
#define INCLUDE_LABEL_H
Line 3... Line 18...
3
 
18
 
4
#ifndef INCLUDE_MATH_H
19
#ifndef INCLUDE_MATH_H
Line 12... Line 27...
12
#include "../lib/patterns/rgb.h"
27
#include "../lib/patterns/rgb.h"
Line 13... Line 28...
13
 
28
 
Line -... Line 29...
-
 
29
 
-
 
30
#define DEFAULT_FONT "/sys/fonts/Tahoma.kf"
-
 
31
 
-
 
32
#ifndef KFONT_BPP
14
 
33
#define KFONT_BPP 4
15
#define DEFAULT_FONT "/sys/fonts/Tahoma.kf"
34
#endif
16
 
35
 
17
:struct __SIZE
36
:struct __SIZE
18
{
37
{
Line 28... Line 47...
28
	dword color, background;
47
	dword color, background;
29
	dword font,font_begin;
48
	dword font,font_begin;
30
	word block;
49
	word block;
31
	dword raw;
50
	dword raw;
32
	dword raw_size;
51
	dword raw_size;
-
 
52
	//dword palette[256];
Line 33... Line 53...
33
 
53
 
34
	bool init();
54
	bool init();
35
	bool changeSIZE();
55
	bool changeSIZE();
36
	byte symbol();
56
	byte symbol();
Line 40... Line 60...
40
	void ApplySmooth();
60
	void ApplySmooth();
41
	int WriteIntoWindow();
61
	int WriteIntoWindow();
42
	int WriteIntoWindowCenter();
62
	int WriteIntoWindowCenter();
43
	void WriteIntoBuffer();
63
	void WriteIntoBuffer();
44
	void ShowBuffer();
64
	void ShowBuffer();
-
 
65
	void ShowBufferPart();
45
} kfont;
66
} kfont;
Line -... Line 67...
-
 
67
 
-
 
68
:bool LABEL::init(dword font_path)
-
 
69
{
-
 
70
	IO label_io;
-
 
71
	if(font)free(font);
-
 
72
	label_io.read(font_path);
-
 
73
	if(!EAX) {
-
 
74
		debugln(font_path);
-
 
75
		label_io.run("/sys/@notify", "'Error: KFONT is not loaded.' -E"); 
-
 
76
		return false;
-
 
77
	}
-
 
78
	font_begin = label_io.buffer_data;
-
 
79
	changeSIZE();
-
 
80
	smooth = true;
-
 
81
	return true;
-
 
82
}
46
 
83
 
47
:bool LABEL::changeSIZE()
84
:bool LABEL::changeSIZE()
48
{
85
{
49
	dword file_size;
86
	dword file_size;
50
	dword ofs;
87
	dword ofs;
Line 98... Line 135...
98
	if(s==9)return width;
135
	if(s==9)return width;
99
	s = Cp866ToAnsi(s);
136
	s = Cp866ToAnsi(s);
100
	tmp = block*s << 2 + font;
137
	tmp = block*s << 2 + font;
101
	for(yi=0; yi
138
	for(yi=0; yi
102
	{
139
	{
103
		EDI = size.offset_y + yi + y * size.width * 3 + image_raw;
140
		EDI = size.offset_y + yi + y * size.width * KFONT_BPP + image_raw;
104
		for(xi=0; xi
141
		for(xi=0; xi
105
		{
142
		{
106
			if(iii%32) _ >>= 1;
143
			if(iii%32) _ >>= 1;
107
			else
144
			else
108
			{
145
			{
Line 110... Line 147...
110
					_ = DSDWORD[tmp];
147
					_ = DSDWORD[tmp];
111
			}
148
			}
112
			if(_&1) //check does the pixel set
149
			if(_&1) //check does the pixel set
113
			{
150
			{
114
				if(xi>chaw_width)chaw_width=xi;
151
				if(xi>chaw_width)chaw_width=xi;
-
 
152
				//in case of image_raw!=0 draw font into bug
-
 
153
				//in case of image_raw==0 calculate size
115
				if (image_raw)
154
				if (image_raw)
116
				{
155
				{
117
					offs = x + xi *3 + EDI;
156
					offs = x + xi * KFONT_BPP + EDI;
118
					DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color;
157
					DSDWORD[offs] = color;
119
					if(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color;
158
					if(bold) DSDWORD[offs+KFONT_BPP] = color;
120
				}
159
				}
121
				else
160
				else
122
				{
161
				{
123
					if(size.height
162
					if(size.height
124
					if(size.offset_y<0)size.offset_y = yi; else if(yi
163
					if(size.offset_y<0)size.offset_y = yi; else if(yi
Line 142... Line 181...
142
	if (AL==244) return 'I'; //I ukr (yi)
181
	if (AL==244) return 'I'; //I ukr (yi)
143
	if (AL==245) return 191; //i ukr (yi)
182
	if (AL==245) return 191; //i ukr (yi)
144
	return AL;
183
	return AL;
145
}
184
}
Line 146... Line -...
146
 
-
 
147
:bool LABEL::init(dword font_path)
-
 
148
{
-
 
149
	IO label_io;
-
 
150
	if(font)free(font);
-
 
151
	label_io.read(font_path);
-
 
152
	if(!EAX) {
-
 
153
		debugln(font_path);
-
 
154
		label_io.run("/sys/@notify", "'Error: KFONT is not loaded.' -E"); 
-
 
155
		return false;
-
 
156
	}
-
 
157
	font_begin = label_io.buffer_data;
-
 
158
	changeSIZE();
-
 
159
	smooth = true;
-
 
160
	return true;
-
 
161
}
-
 
162
 
-
 
163
 
185
 
164
/*=====================================================================================
186
/*=====================================================================================
165
===========================                                 ===========================
187
===========================                                 ===========================
166
===========================               RAW               ===========================
188
===========================               RAW               ===========================
167
===========================                                 ===========================
189
===========================                                 ===========================
Line 168... Line -...
168
=====================================================================================*/
-
 
169
 
190
=====================================================================================*/
170
 
191
 
171
inline fastcall dword b24(EAX) { return DSDWORD[EAX] & 0x00FFFFFF; }
192
inline fastcall dword b32(EAX) { return DSDWORD[EAX]; }
172
:void LABEL::ApplySmooth()
193
:void LABEL::ApplySmooth()
173
{
194
{
174
	dword i,line_w,to,dark_background;
195
	dword i,line_w,to,dark_background;
175
	line_w = size.width * 3;
196
	line_w = size.width * KFONT_BPP;
176
	to = size.height - 1 * line_w + raw - 3;
197
	to = size.height - 1 * line_w + raw - KFONT_BPP;
177
	for(i=raw; i < to; i+=3)
198
	for(i=raw; i < to; i+=KFONT_BPP)
178
	{
199
	{
179
		if(i-raw%line_w +3 == line_w) continue;
200
		if(i-raw%line_w +KFONT_BPP == line_w) continue;
180
		// pixels position, where b - black, w - write
201
		// pixels position, where b - black, w - write
-
 
202
		// bw
-
 
203
		// wb
181
		// bw
204
		if(b32(i)!=background) {
182
		// wb
205
			if (b32(i+KFONT_BPP)==background) 
183
		if(b24(i)!=background) && (b24(i+3)==background) && (b24(i+line_w)==background) && (b24(i+3+line_w)!=background)
206
			&& (b32(i+line_w)==background) && (b32(i+KFONT_BPP+line_w)!=background)
184
		{
207
			{
185
			dark_background = MixColors(background,b24(i),200);
208
				dark_background = MixColors(background,b32(i),200);
-
 
209
				DSDWORD[i+KFONT_BPP] = dark_background;
186
			DSDWORD[i+3] = DSDWORD[i+3] & 0xFF000000 | dark_background;
210
				DSDWORD[i+line_w] = dark_background;	
187
			DSDWORD[i+line_w] = DSDWORD[i+line_w] & 0xFF000000 | dark_background;			
211
			}
188
		}
212
		}
-
 
213
		// wb
189
		// wb
214
		// bw
190
		// bw
215
		else if (b32(i+KFONT_BPP)!=background) 
191
		else if(b24(i)==background) && (b24(i+3)!=background) && (b24(i+line_w)!=background) && (b24(i+3+line_w)==background)
216
		&& (b32(i+line_w)!=background) && (b32(i+KFONT_BPP+line_w)==background)
192
		{
217
		{
193
			dark_background = MixColors(background,b24(i+3),200);
218
			dark_background = MixColors(background,b32(i+KFONT_BPP),200);
194
			DSDWORD[i] = DSDWORD[i] & 0xFF000000 | dark_background;
219
			DSDWORD[i] = dark_background;
195
			DSDWORD[i+3+line_w] = DSDWORD[i+3+line_w] & 0xFF000000 | dark_background;
220
			DSDWORD[i+KFONT_BPP+line_w] = dark_background;	
196
		}
221
		}
Line 197... Line 222...
197
	}
222
	}
Line 211... Line 236...
211
	background = _background;
236
	background = _background;
Line 212... Line 237...
212
 
237
 
213
	size.width = w;
238
	size.width = w;
Line 214... Line 239...
214
	size.height = h;
239
	size.height = h;
215
 
240
 
216
	new_raw_size = w*h*3;
241
	new_raw_size = w*h*KFONT_BPP;
217
	if(raw_size != new_raw_size)
242
	if(raw_size != new_raw_size)
218
	{
243
	{
219
		raw_size = new_raw_size; 
244
		raw_size = new_raw_size; 
220
		free(raw);
245
		free(raw);
221
		raw = malloc(raw_size);
246
		raw = malloc(raw_size);
222
		// Fill background color
247
		// Fill background color
223
		EBX = background;
248
		EBX = background;
224
		EAX = raw_size+raw;
249
		EAX = raw_size+raw;
225
		for (EDI=raw; EDI
250
		for (EDI=raw; EDI
226
	}
251
	}
227
	WHILE(DSBYTE[text1])
252
	WHILE(DSBYTE[text1])
228
	{
253
	{
Line 249... Line 274...
249
{
274
{
250
	getsize(fontSizePoints, text1);
275
	getsize(fontSizePoints, text1);
251
	return WriteIntoWindow(w-size.width/2+x,y, _background, _color, fontSizePoints, text1);
276
	return WriteIntoWindow(w-size.width/2+x,y, _background, _color, fontSizePoints, text1);
252
}
277
}
Line 253... Line 278...
253
 
278
 
-
 
279
:void LABEL::ShowBuffer(dword _x, _y)
254
:void LABEL::ShowBuffer(dword x, y){
280
{
-
 
281
	if (4==KFONT_BPP) PutPaletteImage(raw, size.width, size.height, _x, _y, 32, 0);
255
	_PutImage(x, y, size.width, size.height, raw);
282
	//if (1==KFONT_BPP) PutPaletteImage(raw, size.width, size.height, _x, _y, 8, #palette);
Line -... Line 283...
-
 
283
}
-
 
284
 
-
 
285
:void LABEL::ShowBufferPart(dword _x, _y, _w, _h, _buf_offset)
-
 
286
{
-
 
287
	if (4==KFONT_BPP) PutPaletteImage(_buf_offset * KFONT_BPP + raw, _w, _h, _x, _y, 32, 0);
Line 256... Line 288...
256
}
288
	//if (1==KFONT_BPP) PutPaletteImage(_buf_offset * KFONT_BPP + raw, _w, _h, _x, _y, 8, #palette);
257
 
289
}