Rev 5933 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5933 | Rev 5981 | ||
---|---|---|---|
Line 7... | Line 7... | ||
7 | 7 | ||
8 | #ifndef INCLUDE_FS_H |
8 | #ifndef INCLUDE_FS_H |
9 | #include "../lib/obj/fs.h" |
9 | #include "../lib/obj/fs.h" |
Line -... | Line 10... | ||
- | 10 | #endif |
|
- | 11 | ||
10 | #endif |
12 | #define DEFAULT_FONT "/sys/fonts/Tahoma.kf" |
11 | 13 | ||
12 | :struct __OFFSET_FONT |
14 | :struct __OFFSET_FONT |
13 | { |
15 | { |
14 | signed x,y; |
16 | signed x,y; |
Line 22... | Line 24... | ||
22 | byte TMP_WEIGHT; |
24 | byte TMP_WEIGHT; |
23 | }; |
25 | }; |
24 | :struct FONT |
26 | :struct FONT |
25 | { |
27 | { |
26 | __SIZE size; |
28 | __SIZE size; |
27 | byte r,g,b,weight,italic, smooth; |
- | |
28 | byte width,height; |
29 | int left,top,width,height; |
29 | byte use_smooth; |
30 | byte bold,italic,smooth; |
30 | int left,top; |
31 | byte no_bg_copy; |
31 | byte encoding; |
32 | dword bg_color; |
32 | dword color; |
33 | dword color; |
33 | dword file_size; |
34 | dword file_size; |
34 | dword buffer; |
35 | dword buffer; |
35 | dword buffer_size; |
36 | dword buffer_size; |
36 | word block; |
37 | word block; |
Line 44... | Line 45... | ||
44 | void show(); |
45 | void show(); |
45 | byte textcenter(word x,y,w,h;dword txt); |
46 | byte textcenter(word x,y,w,h;dword txt); |
46 | dword getsize(dword text1); |
47 | dword getsize(dword text1); |
47 | byte changeSIZE(); |
48 | byte changeSIZE(); |
48 | void PixelRGB(dword x,y); |
49 | void PixelRGB(dword x,y); |
49 | //dword GetPixel(word x,y); |
- | |
50 | byte no_bg_copy; |
- | |
51 | dword bg_color; |
- | |
52 | }; |
50 | }; |
53 | FONT font = 0; |
51 | FONT font = 0; |
54 | /* |
- | |
55 | :dword FONT::GetPixel(word x,y) |
- | |
56 | { |
52 | |
57 | dword tmp = y*size.width*3; |
- | |
58 | tmp += x*3 + buffer; |
- | |
59 | r = DSBYTE[tmp]; tmp++; |
- | |
60 | g = DSBYTE[tmp]; tmp++; |
- | |
61 | b = DSBYTE[tmp]; |
- | |
62 | }*/ |
- | |
63 | :void FONT::PixelRGB(dword x,y) |
53 | :void FONT::PixelRGB(dword x,y) |
64 | { |
54 | { |
65 | dword offs = y*size.width+x*3 + buffer; |
55 | dword offs = y*size.width+x*3 + buffer; |
66 | DSBYTE[offs] = r; offs++; |
- | |
67 | DSBYTE[offs] = g; offs++; |
56 | DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color; |
68 | DSBYTE[offs] = b; |
- | |
69 | } |
57 | } |
70 | :byte FONT::changeSIZE() |
58 | :byte FONT::changeSIZE() |
71 | { |
59 | { |
72 | dword TMP_DATA; |
60 | dword TMP_DATA; |
73 | dword ofs; |
61 | dword ofs; |
Line 126... | Line 114... | ||
126 | byte X; |
114 | byte X; |
127 | size.TMP_WEIGHT = math.ceil(size.text/17); |
115 | size.TMP_WEIGHT = math.ceil(size.text/17); |
128 | IF(s==32) |
116 | IF(s==32) |
129 | { |
117 | { |
130 | size.width += width/4; |
118 | size.width += width/4; |
131 | IF(weight) size.width+=size.TMP_WEIGHT; |
119 | IF(bold) size.width+=size.TMP_WEIGHT; |
132 | return; |
120 | return; |
133 | } |
121 | } |
134 | IF(s==9) |
122 | IF(s==9) |
135 | { |
123 | { |
136 | size.width += width; |
124 | size.width += width; |
137 | IF(weight) size.width+=size.TMP_WEIGHT; |
125 | IF(bold) size.width+=size.TMP_WEIGHT; |
138 | return; |
126 | return; |
139 | } |
127 | } |
140 | IF(!encoding){ |
128 | s = AnsiToCp866(s); |
141 | IF(s>=128)&&(s<=175)s+=64; |
- | |
142 | ELSE IF(s>=224)&&(s<=239)s+=16; |
- | |
143 | ELSE IF(s==241)s=184; //yo |
- | |
144 | ELSE IF(s==240)s=168; //YO |
- | |
145 | } |
- | |
146 | iii = 0; |
129 | iii = 0; |
147 | tmp = 4*block*s + data; |
130 | tmp = 4*block*s + data; |
148 | for(yi=0; yi |
131 | for(yi=0; yi |
149 | { |
132 | { |
150 | for(xi=0; xi |
133 | for(xi=0; xi |
Line 166... | Line 149... | ||
166 | } |
149 | } |
167 | iii++; |
150 | iii++; |
168 | } |
151 | } |
169 | } |
152 | } |
170 | size.width += rw; |
153 | size.width += rw; |
171 | IF(weight) size.width+=size.TMP_WEIGHT; |
154 | IF(bold) size.width+=size.TMP_WEIGHT; |
172 | IF(s=='_') size.width--; |
155 | IF(s=='_') size.width--; |
173 | IF(size.offset.x<0)size.offset.x = X; |
156 | IF(size.offset.x<0)size.offset.x = X; |
174 | } |
157 | } |
175 | :dword FONT::prepare(int x,y;dword text1) |
158 | :byte FONT::symbol(signed x,y;byte s) |
176 | { |
- | |
177 | signed len=0; |
- | |
178 | proc_info Form_SELF_FONTS; |
- | |
179 | dword c; |
- | |
180 | c = color; |
- | |
181 | left = x; |
- | |
182 | IF(!text1)return false; |
- | |
183 | IF(size.text)IF(!changeSIZE())return false; |
- | |
184 | AX = c; r = AL; g = AH; c>>=16; AX = c; b = AL; |
- | |
185 | getsize(text1); |
- | |
186 | y -= size.offset.y; |
- | |
187 | top = y; |
- | |
188 | EDX = size.width*size.height*3; |
- | |
189 | IF(!buffer_size) |
- | |
190 | { |
- | |
191 | buffer_size = EDX; |
- | |
192 | buffer = malloc(buffer_size); |
- | |
193 | } |
- | |
194 | ELSE IF(buffer_size |
- | |
195 | { |
159 | { |
196 | buffer_size = EDX; |
160 | dword xi,yi; |
- | 161 | dword iii; |
|
197 | buffer = realloc(buffer,buffer_size); |
162 | float ital = -size.w_italic; |
- | 163 | dword ___x; |
|
198 | } |
164 | byte rw=0; |
- | 165 | IF(s==32)return width/4; |
|
- | 166 | IF(s==9)return width; |
|
199 | IF (no_bg_copy) |
167 | s = AnsiToCp866(s); |
- | 168 | iii = 0; |
|
- | 169 | EBX = block*s << 2 + data; |
|
- | 170 | for(yi=0; yi |
|
200 | { |
171 | { |
201 | EBX = bg_color; |
- | |
202 | EDI = buffer; |
172 | EDI = size.offset.y + yi + y; |
203 | EAX = buffer_size+EDI; |
173 | for(xi=0; xi |
204 | WHILE (EDI |
- | |
205 | { |
174 | { |
206 | ESDWORD[EDI] = EBX; |
175 | IF(iii%32) $shr ecx,1 |
207 | $add edi,3 |
- | |
208 | } |
- | |
209 | } |
- | |
210 | ELSE |
176 | ELSE |
211 | { |
177 | { |
- | 178 | EBX += 4; |
|
212 | GetProcessInfo(#Form_SELF_FONTS, SelfInfo); |
179 | ECX = DSDWORD[EBX]; |
213 | CopyScreen(buffer,x+Form_SELF_FONTS.left+5,y+Form_SELF_FONTS.top+GetSkinHeight(),size.width,size.height); |
- | |
214 | } |
180 | } |
215 | len = size.offset.x; |
- | |
216 | WHILE(DSBYTE[text1]) |
181 | IF(ECX&true) |
217 | { |
182 | { |
218 | IF(DSBYTE[text1]=='_') len--; |
183 | IF(xi>rw)rw=xi; |
219 | len+=symbol(len,0,DSBYTE[text1]); |
184 | ___x = x+xi; |
220 | IF(weight)len+=math.ceil(size.text/17); |
185 | IF(italic)___x+=math.ceil(ital); |
221 | text1++; |
186 | PixelRGB(___x,EDI); |
- | 187 | IF(bold) PixelRGB(___x+1,EDI); |
|
222 | } |
188 | } |
223 | IF (use_smooth) SmoothFont(buffer, size.width, size.height); |
- | |
224 | return len; |
189 | iii++; |
225 | } |
190 | } |
- | 191 | if (italic) ital-=size.offset_i; |
|
- | 192 | } |
|
226 | :void FONT::show() |
193 | return rw; |
227 | { |
194 | } |
- | 195 | ||
- | 196 | :void FONT::show(){ |
|
228 | _PutImage(left,top,size.width,size.height,buffer); |
197 | _PutImage(left,top,size.width,size.height,buffer); |
229 | } |
198 | } |
- | 199 | ||
- | 200 | byte AnsiToCp866(byte s) { |
|
- | 201 | IF(s>=128)&&(s<=175)s+=64; |
|
- | 202 | ELSE IF(s>=224)&&(s<=239)s+=16; |
|
- | 203 | ELSE IF(s==241)s=184; //yo |
|
- | 204 | ELSE IF(s==240)s=168; //YO |
|
- | 205 | return s; |
|
- | 206 | } |
|
- | 207 | ||
230 | inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; } |
208 | inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; } |
231 | :void SmoothFont(dword image, w, h) |
209 | :void SmoothFont(dword image, w, h) |
232 | { |
210 | { |
233 | byte rr,gg,bb; |
- | |
234 | dword i,line_w,to, pixel; |
211 | dword i,line_w,to; |
235 | line_w = w * 3; |
212 | line_w = w * 3; |
236 | to = w*h*3 + image - line_w - 3; |
213 | to = w*h*3 + image - line_w - 3; |
237 | for(i = image; i < to; i+=3) { |
214 | for(i = image; i < to; i+=3) { |
238 | IF(i-image%line_w +3 == line_w) continue; |
215 | IF(i-image%line_w +3 == line_w) continue; |
239 | IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000) |
216 | IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000) |
Line 246... | Line 223... | ||
246 | ShadowImage(i, 1, 1, 2); |
223 | ShadowImage(i, 1, 1, 2); |
247 | ShadowImage(i+3+line_w, 1, 1, 2); |
224 | ShadowImage(i+3+line_w, 1, 1, 2); |
248 | } |
225 | } |
249 | } |
226 | } |
250 | } |
227 | } |
251 | :byte FONT::symbol(signed x,y;byte s) |
- | |
252 | { |
- | |
253 | dword xi,yi; |
- | |
254 | dword iii; |
- | |
255 | float ital = -size.w_italic; |
- | |
256 | dword ___x; |
- | |
257 | //byte _TMP_WEIGHT; |
- | |
258 | byte rw=0; |
- | |
259 | //_TMP_WEIGHT=2; |
- | |
260 | IF(s==32)return width/4; |
- | |
261 | IF(s==9)return width; |
- | |
262 | IF(!encoding) |
- | |
263 | { |
- | |
264 | IF(s>=128)&&(s<=175)s+=64; |
- | |
265 | ELSE IF(s>=224)&&(s<=239)s+=16; |
- | |
266 | ELSE IF(s==241)s=184; //yo |
- | |
267 | ELSE IF(s==240)s=168; //YO |
- | |
268 | } |
- | |
269 | iii = 0; |
- | |
270 | EBX = block*s; |
- | |
271 | $shl ebx,2 |
- | |
272 | $add ebx,data |
- | |
273 | yi = 0; |
- | |
274 | while(yi |
- | |
275 | { |
- | |
276 | EDI = size.offset.y; |
- | |
277 | $add edi,yi |
- | |
278 | $add edi,y |
- | |
279 | for(xi=0; xi |
- | |
280 | { |
- | |
281 | IF(iii%32) $shr ecx,1 |
- | |
282 | ELSE |
- | |
283 | { |
- | |
284 | $add ebx,4 |
- | |
285 | ECX = DSDWORD[EBX]; |
- | |
286 | } |
- | |
287 | IF(ECX&true) |
- | |
288 | { |
- | |
289 | IF(xi>rw)rw=xi; |
- | |
290 | ___x = x+xi; |
- | |
291 | IF(italic)___x+=math.ceil(ital); |
- | |
292 | PixelRGB(___x,EDI); |
- | |
293 | //_TMP_WEIGHT = 2; |
- | |
294 | //WHILE(_TMP_WEIGHT) |
- | |
295 | //{ |
- | |
296 | // _TMP_WEIGHT--; |
- | |
297 | IF(weight) PixelRGB(___x+1,EDI); |
- | |
298 | //} |
- | |
299 | } |
- | |
300 | iii++; |
- | |
301 | } |
- | |
302 | IF(italic) ital-=size.offset_i; |
- | |
303 | $inc yi |
- | |
304 | } |
- | |
305 | return rw; |
- | |
306 | } |
- | |
307 | :byte FONT::load(dword path) |
228 | :byte FONT::load(dword path) |
308 | { |
229 | { |
309 | lib_init_fs(); |
230 | lib_init_fs(); |
310 | buffer_size = 0; |
231 | buffer_size = 0; |
311 | use_smooth = true; |
232 | smooth = true; |
312 | IF(data)free(data); |
233 | IF(data)free(data); |
313 | IF(!fs.read(path)) { debug("Error while loading font: "); debugln(path); return false; } |
234 | IF(!fs.read(path)) { debug("Error while loading font: "); debugln(path); return false; } |
314 | begin = data = EAX; |
235 | begin = data = EAX; |
315 | EBX = begin + ECX; |
236 | EBX = begin + ECX; |
316 | $dec ebx |
- | |
317 | height = DSBYTE[EBX]; |
237 | height = DSBYTE[EBX-1]; |
318 | $dec ebx |
- | |
319 | width = DSBYTE[EBX]; |
238 | width = DSBYTE[EBX-2]; |
320 | block = math.ceil(height*width/32); |
239 | block = math.ceil(height*width/32); |
321 | return true; |
240 | return true; |
322 | } |
241 | } |
Line -... | Line 242... | ||
- | 242 | ||
- | 243 | :dword FONT::prepare(int x,y;dword text1) |
|
- | 244 | { |
|
- | 245 | signed len=0; |
|
- | 246 | proc_info Form_SELF_FONTS; |
|
- | 247 | dword c; |
|
- | 248 | IF(!text1)return false; |
|
- | 249 | IF(size.text)IF(!changeSIZE())return false; |
|
- | 250 | left = x; |
|
- | 251 | getsize(text1); |
|
- | 252 | y -= size.offset.y; |
|
- | 253 | top = y; |
|
- | 254 | EDX = size.width*size.height*3; |
|
- | 255 | IF(!buffer_size) |
|
- | 256 | { |
|
- | 257 | buffer_size = EDX; |
|
- | 258 | buffer = malloc(buffer_size); |
|
- | 259 | } |
|
- | 260 | ELSE IF(buffer_size |
|
- | 261 | { |
|
- | 262 | buffer_size = EDX; |
|
- | 263 | buffer = realloc(buffer,buffer_size); |
|
- | 264 | } |
|
- | 265 | IF (no_bg_copy) |
|
- | 266 | { |
|
- | 267 | EBX = bg_color; |
|
- | 268 | EAX = buffer_size+buffer; |
|
- | 269 | for (EDI=buffer; EDI |
|
- | 270 | } |
|
- | 271 | ELSE |
|
- | 272 | { |
|
- | 273 | GetProcessInfo(#Form_SELF_FONTS, SelfInfo); |
|
- | 274 | CopyScreen(buffer,x+Form_SELF_FONTS.left+5,y+Form_SELF_FONTS.top+GetSkinHeight(),size.width,size.height); |
|
- | 275 | } |
|
- | 276 | len = size.offset.x; |
|
- | 277 | WHILE(DSBYTE[text1]) |
|
- | 278 | { |
|
- | 279 | IF(DSBYTE[text1]=='_') len--; |
|
- | 280 | len+=symbol(len,0,DSBYTE[text1]); |
|
- | 281 | IF(bold)len+=math.ceil(size.text/17); |
|
- | 282 | text1++; |
|
- | 283 | } |
|
- | 284 | IF (smooth) SmoothFont(buffer, size.width, size.height); |
|
- | 285 | return len; |
|
- | 286 | } |
|
323 | 287 | ||
324 | :void FONT::prepare_buf(int x,y,w,h; dword text1) |
288 | :void FONT::prepare_buf(int x,y,w,h; dword text1) |
325 | { |
289 | { |
326 | dword c, new_buffer_size; |
- | |
327 | c = color; |
- | |
328 | //left = x; |
290 | dword c, new_buffer_size; |
329 | IF(!text1)return; |
291 | IF(!text1)return; |
330 | IF(size.text)IF(!changeSIZE())return; |
- | |
331 | AX = c; r = AL; g = AH; c>>=16; AX = c; b = AL; |
292 | IF(size.text)IF(!changeSIZE())return; |
332 | getsize(text1); |
293 | getsize(text1); |
333 | y -= size.offset.y; |
294 | y -= size.offset.y; |
334 | //top = y; |
295 | |
335 | size.width = w; |
296 | size.width = w; |
Line 336... | Line 297... | ||
336 | size.height = h; |
297 | size.height = h; |
337 | 298 | ||
338 | new_buffer_size = w*h*3; |
299 | new_buffer_size = w*h*3; |
339 | IF(buffer_size!=new_buffer_size) |
300 | IF(buffer_size != w*h*3) |
340 | { |
301 | { |
341 | buffer_size = new_buffer_size; |
302 | buffer_size = new_buffer_size; |
342 | free(buffer); |
303 | free(buffer); |
343 | buffer = malloc(buffer_size); |
- | |
344 | EBX = bg_color; |
304 | buffer = malloc(buffer_size); |
345 | EDI = buffer; |
- | |
346 | EAX = buffer_size+buffer; |
- | |
347 | WHILE (EDI |
305 | EBX = bg_color; |
348 | { |
- | |
349 | ESDWORD[EDI] = EBX; |
- | |
350 | $add edi,3 |
306 | EAX = buffer_size+buffer; |
351 | } |
307 | for (EDI=buffer; EDI |
352 | } |
308 | } |
353 | WHILE(DSBYTE[text1]) |
309 | WHILE(DSBYTE[text1]) |
354 | { |
310 | { |
355 | x+=symbol(x,y,DSBYTE[text1]); |
311 | x+=symbol(x,y,DSBYTE[text1]); |
356 | IF(weight)x+=math.ceil(size.text/17); |
312 | IF(bold)x+=math.ceil(size.text/17); |
357 | text1++; |
313 | text1++; |
358 | } |
314 | } |