Subversion Repositories Kolibri OS

Rev

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

Rev 6805 Rev 6806
Line 29... Line 29...
29
	dword font,font_begin;
29
	dword font,font_begin;
30
	word block;
30
	word block;
31
	dword raw;
31
	dword raw;
32
	dword raw_size;
32
	dword raw_size;
Line 33... Line 33...
33
 
33
 
34
	byte init();
34
	bool init();
35
	bool changeSIZE();
35
	bool changeSIZE();
36
	byte symbol();
36
	byte symbol();
37
	byte symbol_size();
37
	byte symbol_size();
Line 38... Line 38...
38
	dword getsize();
38
	dword getsize();
39
 
39
 
40
	void ApplySmooth();
40
	void ApplySmooth();
41
	int WriteIntoWindow();
41
	int WriteIntoWindow();
42
	int WriteIntoWindowCenter();
42
	int WriteIntoWindowCenter();
43
	void WriteIntoBuffer();
43
	void WriteIntoBuffer();
Line 44... Line 44...
44
	void ShowBuffer();
44
	void ShowBuffer();
45
} label;
45
} kfont;
46
 
46
 
47
:bool LABEL::changeSIZE()
47
:bool LABEL::changeSIZE()
Line 57... Line 57...
57
	height = DSBYTE[calc(font+file_size) - 1];
57
	height = DSBYTE[calc(font+file_size) - 1];
58
	width =  DSBYTE[calc(font+file_size) - 2];
58
	width =  DSBYTE[calc(font+file_size) - 2];
59
	block = math.ceil(height*width/32);
59
	block = math.ceil(height*width/32);
60
	return true;
60
	return true;
61
}
61
}
-
 
62
 
62
:dword LABEL::getsize(byte fontSizePoints, dword text1)
63
:dword LABEL::getsize(byte fontSizePoints, dword text1)
63
{
64
{
64
	size.height = size.width = 0;
65
	size.height = size.width = 0;
65
	size.offset_x = size.offset_y = -1;
66
	size.offset_x = size.offset_y = -1;
66
	size.pt = fontSizePoints;
67
	size.pt = fontSizePoints;
67
	if(size.pt)if(!changeSIZE())return 0;
68
	if(size.pt)if(!changeSIZE())return 0;
68
	WHILE(DSBYTE[text1])
69
	WHILE(DSBYTE[text1])
69
	{
70
	{
70
		symbol_size(DSBYTE[text1]);
71
		size.width += symbol_size(DSBYTE[text1]);
71
		text1++;
72
		text1++;
72
	}
73
	}
73
	$neg size.offset_y
74
	$neg size.offset_y
74
	$neg size.offset_x
75
	$neg size.offset_x
75
	size.height += size.offset_y+1;
76
	size.height += size.offset_y+1;
76
	size.width += size.offset_x+1;
77
	size.width += size.offset_x+1;
77
	return size.width;
78
	return size.width;
78
}
79
}
-
 
80
 
79
:byte LABEL::symbol_size(byte s)
81
:byte LABEL::symbol_size(byte s)
80
{
82
{
81
	//return symbol_size(s);
-
 
82
	dword xi,yi;
83
	int chaw_width;
83
	dword tmp,_;
-
 
84
	dword iii = 0;
84
	chaw_width = symbol(0,0, s, 0);
85
	byte rw=0;
-
 
86
	byte X;
-
 
87
	if(bold) size.width+=math.ceil(size.pt/17);
85
	if(bold) chaw_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;
86
	return chaw_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
-
 
103
		{
-
 
104
			if(iii%32) _ >>= 1;
-
 
105
			else
-
 
106
			{
-
 
107
				tmp += 4;
-
 
108
				_ = DSDWORD[tmp];
-
 
109
			}
-
 
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++;
-
 
120
		}
-
 
121
	}
-
 
122
	size.width += rw;
-
 
123
	if(size.offset_x<0)size.offset_x = X;
-
 
124
}
87
}
-
 
88
 
125
:byte LABEL::symbol(signed x,y; byte s; dword image_raw)
89
:byte LABEL::symbol(signed x,y; byte s; dword image_raw)
126
{
90
{
127
	dword xi,yi;
91
	dword xi,yi;
128
	dword iii = 0;
92
	dword iii = 0;
129
	dword offs;
93
	dword offs;
-
 
94
	dword tmp, _;
130
	byte rw=0;
95
	byte X;
-
 
96
	byte chaw_width=0;
131
	if(s==32)return width/4;
97
	if(s==32)return width/4;
132
	if(s==9)return width;
98
	if(s==9)return width;
133
	s = Cp866ToAnsi(s);
99
	s = Cp866ToAnsi(s);
134
	EBX = block*s << 2 + font;
100
	tmp = block*s << 2 + font;
135
	for(yi=0; yi
101
	for(yi=0; yi
136
	{
102
	{
137
		EDI = size.offset_y + yi + y * size.width * 3 + image_raw;
103
		EDI = size.offset_y + yi + y * size.width * 3 + image_raw;
138
		for(xi=0; xi
104
		for(xi=0; xi
139
		{
105
		{
140
			if(iii%32) $shr ecx,1
106
			if(iii%32) _ >>= 1;
141
			else
107
			else
142
			{
108
			{
143
					EBX += 4;
109
					tmp += 4;
144
					ECX = DSDWORD[EBX];
110
					_ = DSDWORD[tmp];
145
			}
111
			}
-
 
112
			if(_&1) //check does the pixel set
-
 
113
			{
-
 
114
				if(xi>chaw_width)chaw_width=xi;
146
			if(ECX&true)
115
				if (image_raw)
147
			{
116
				{
148
					if(xi>rw)rw=xi;
-
 
149
					offs = x + xi *3 + EDI;
117
					offs = x + xi *3 + EDI;
150
					DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color;
118
					DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color;
151
					if(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color;
119
					if(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color;
152
			}
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
				}
-
 
128
			}
153
			iii++;
129
			iii++;
154
		}
130
		}
155
	}
131
	}
156
	return rw;
132
	return chaw_width;
157
}
133
}
Line 158... Line 134...
158
 
134
 
159
inline fastcall Cp866ToAnsi(AL) {
135
inline fastcall Cp866ToAnsi(AL) {
160
	if (AL>=128)&&(AL<=175) return AL+64;
136
	if (AL>=128)&&(AL<=175) return AL+64;
Line 166... Line 142...
166
	if (AL==244) return 'I'; //I ukr (yi)
142
	if (AL==244) return 'I'; //I ukr (yi)
167
	if (AL==245) return 191; //i ukr (yi)
143
	if (AL==245) return 191; //i ukr (yi)
168
	return AL;
144
	return AL;
169
}
145
}
Line 170... Line 146...
170
 
146
 
171
:byte LABEL::init(dword font_path)
147
:bool LABEL::init(dword font_path)
172
{
148
{
173
	IO label_io;
149
	IO label_io;
174
	if(font)free(font);
150
	if(font)free(font);
175
	label_io.read(font_path);
151
	label_io.read(font_path);
Line 204... Line 180...
204
		// pixels position, where b - black, w - write
180
		// pixels position, where b - black, w - write
205
		// bw
181
		// bw
206
		// wb
182
		// wb
207
		if(b24(i)!=background) && (b24(i+3)==background) && (b24(i+line_w)==background) && (b24(i+3+line_w)!=background)
183
		if(b24(i)!=background) && (b24(i+3)==background) && (b24(i+line_w)==background) && (b24(i+3+line_w)!=background)
208
		{
184
		{
209
			dark_background = MixColors(background,b24(i),210);
185
			dark_background = MixColors(background,b24(i),200);
210
			DSDWORD[i+3] = DSDWORD[i+3] & 0xFF000000 | dark_background;
186
			DSDWORD[i+3] = DSDWORD[i+3] & 0xFF000000 | dark_background;
211
			DSDWORD[i+line_w] = DSDWORD[i+line_w] & 0xFF000000 | dark_background;			
187
			DSDWORD[i+line_w] = DSDWORD[i+line_w] & 0xFF000000 | dark_background;			
212
		}
188
		}
213
		// wb
189
		// wb
214
		// bw
190
		// bw
215
		else if(b24(i)==background) && (b24(i+3)!=background) && (b24(i+line_w)!=background) && (b24(i+3+line_w)==background)
191
		else if(b24(i)==background) && (b24(i+3)!=background) && (b24(i+line_w)!=background) && (b24(i+3+line_w)==background)
216
		{
192
		{
217
			dark_background = MixColors(background,b24(i+3),210);
193
			dark_background = MixColors(background,b24(i+3),200);
218
			DSDWORD[i] = DSDWORD[i] & 0xFF000000 | dark_background;
194
			DSDWORD[i] = DSDWORD[i] & 0xFF000000 | dark_background;
219
			DSDWORD[i+3+line_w] = DSDWORD[i+3+line_w] & 0xFF000000 | dark_background;
195
			DSDWORD[i+3+line_w] = DSDWORD[i+3+line_w] & 0xFF000000 | dark_background;
220
		}
196
		}
221
	}
197
	}
222
}
198
}
Line 278... Line 254...
278
:void LABEL::ShowBuffer(dword x, y){
254
:void LABEL::ShowBuffer(dword x, y){
279
	_PutImage(x, y, size.width, size.height, raw);
255
	_PutImage(x, y, size.width, size.height, raw);
280
}
256
}
Line 281... Line -...
281
 
-
 
282
 
257
 
283
 
258