Rev 2318 | Rev 2321 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2318 | art_zh | 1 | .;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
431 | serge | 2 | ;; ;; |
983 | diamond | 3 | ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; |
431 | serge | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
7 | |||
593 | mikedld | 8 | $Revision: 2320 $ |
9 | |||
803 | alver | 10 | ; // Alver 22.06.2008 // { |
11 | align 4 |
||
2014 | art_zh | 12 | dtext_asciiz_esi: ; for skins title out |
803 | alver | 13 | push eax |
14 | xor eax, eax |
||
15 | inc eax |
||
16 | jmp dtext.1 |
||
17 | ; } \\ Alver \\ |
||
593 | mikedld | 18 | |
1 | ha | 19 | align 4 |
2014 | art_zh | 20 | dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org]) |
21 | ; ebx x & y |
||
22 | ; ecx style ( 0xX0000000 ) & color ( 0x00RRGGBB ) |
||
23 | ; X = ABnnb: |
||
24 | ; nn = font |
||
25 | ; A = 0 <=> output esi characters; otherwise output ASCIIZ string |
||
26 | ; B = 1 <=> fill background with color eax |
||
27 | ; edx start of text |
||
28 | ; edi 1 force |
||
1 | ha | 29 | |
803 | alver | 30 | ; // Alver 22.06.2008 // { |
31 | push eax |
||
2014 | art_zh | 32 | xor eax, eax |
803 | alver | 33 | .1: |
34 | ; } \\ Alver \\ |
||
2014 | art_zh | 35 | pushad |
36 | call [_display.disable_mouse] |
||
1 | ha | 37 | |
2014 | art_zh | 38 | movsx eax, bx ; eax=y |
39 | sar ebx, 16 ; ebx=x |
||
40 | xchg eax, ebx ; eax=x, ebx=y |
||
41 | cmp esi, 255 |
||
42 | jb .loop |
||
43 | mov esi, 255 |
||
139 | diamond | 44 | .loop: |
2014 | art_zh | 45 | test ecx, ecx |
46 | js .test_asciiz |
||
47 | dec esi |
||
48 | js .end |
||
49 | jmp @f |
||
139 | diamond | 50 | .test_asciiz: |
2014 | art_zh | 51 | cmp byte [edx], 0 |
52 | jz .end |
||
803 | alver | 53 | ; // Alver 22.06.2008 // { |
2014 | art_zh | 54 | cmp byte [esp+28], 1 ; was the entry point = dtext.1 ? |
55 | jne @f |
||
56 | dec esi |
||
57 | js .end |
||
803 | alver | 58 | ; } \\ Alver \\ |
139 | diamond | 59 | @@: |
2014 | art_zh | 60 | inc edx |
61 | pushad ; esp -= 64 ! |
||
62 | movzx edx, byte [edx-1] |
||
63 | test ecx, 0x10000000 |
||
64 | jnz .font2 |
||
65 | mov esi, 9 |
||
66 | lea ebp, [FONT_I+8*edx+edx] |
||
139 | diamond | 67 | .symloop1: |
2014 | art_zh | 68 | mov dl, byte [ebp] |
69 | or dl, 1 shl 6 |
||
139 | diamond | 70 | .pixloop1: |
2014 | art_zh | 71 | shr dl, 1 |
72 | jz .pixloop1end |
||
73 | jnc .nopix |
||
74 | call [putpixel] |
||
75 | jmp .pixloop1cont |
||
12 | halyavin | 76 | .nopix: |
2014 | art_zh | 77 | test ecx, 0x40000000 |
78 | jz .pixloop1cont |
||
79 | push ecx |
||
80 | mov ecx, [esp+4+20h+20h] ; original eax? |
||
81 | call [putpixel] |
||
82 | pop ecx |
||
139 | diamond | 83 | .pixloop1cont: |
2014 | art_zh | 84 | inc eax |
85 | jmp .pixloop1 |
||
139 | diamond | 86 | .pixloop1end: |
2014 | art_zh | 87 | sub eax, 6 |
88 | inc ebx |
||
89 | inc ebp |
||
90 | dec esi |
||
91 | jnz .symloop1 |
||
92 | popad |
||
93 | add eax, 6 |
||
94 | jmp .loop |
||
139 | diamond | 95 | .font2: |
2014 | art_zh | 96 | add edx, edx |
97 | lea ebp, [FONT_II+4*edx+edx+1] |
||
98 | push 9 |
||
99 | movzx esi, byte [ebp-1] |
||
139 | diamond | 100 | .symloop2: |
2014 | art_zh | 101 | mov dl, byte [ebp] |
102 | push esi |
||
139 | diamond | 103 | .pixloop2: |
2014 | art_zh | 104 | shr dl, 1 |
105 | jnc .nopix2 |
||
106 | call [putpixel] |
||
107 | jmp .pixloop2cont |
||
139 | diamond | 108 | .nopix2: |
2014 | art_zh | 109 | test ecx, 0x40000000 |
110 | jz .pixloop2cont |
||
111 | push ecx |
||
112 | mov ecx, [esp+12+20h+20h] |
||
113 | call [putpixel] |
||
114 | pop ecx |
||
139 | diamond | 115 | .pixloop2cont: |
2014 | art_zh | 116 | inc eax |
117 | dec esi |
||
118 | jnz .pixloop2 |
||
119 | pop esi |
||
120 | sub eax, esi |
||
121 | inc ebx |
||
122 | inc ebp |
||
123 | dec dword [esp] |
||
124 | jnz .symloop2 |
||
125 | pop eax |
||
126 | add dword [esp+28], esi |
||
127 | popad |
||
128 | jmp .loop |
||
139 | diamond | 129 | .end: |
2014 | art_zh | 130 | popad |
131 | pop eax ; << // Alver 22.06.2008 // << |
||
132 | ret |
||
2318 | art_zh | 133 | |
134 | ;===================================================== |
||
135 | ; NEW FONTS |
||
136 | ;_____________________________________________________ |
||
137 | ; |
||
138 | |||
139 | align 8 |
||
140 | sdsh_data: |
||
141 | |||
142 | include 'sdsh.inc' |
||
143 | |||
144 | sdsh_code: |
||
145 | |||
146 | ; eax = if (bit[31]) |
||
147 | ; then lower 31 bits points to the user-selected font |
||
148 | ; else ax = number of preloaded system font |
||
149 | ; ebx = x<<16 + y |
||
150 | ; ecx = 0x00RRGGBB |
||
151 | ; edx = if (bits[31:8] == 0) |
||
152 | ; then dl = single char to write |
||
153 | ; else edx= pointer to asciiz-string |
||
154 | |||
155 | |||
156 | sdsh_draw_char: |
||
157 | ; eax = left side X |
||
158 | ; ebx = bottom Y |
||
159 | ; edi = color 0x0RRGGBB |
||
160 | ; ebp = font@ |
||
161 | ; ecx = ascii, zero-extended to 32bits |
||
162 | push ecx, edx, ebp |
||
163 | shl ebp, 4 |
||
164 | add ebp, sdsh_data.info |
||
165 | call ch_checkscreen |
||
166 | jb .exit |
||
167 | call ch_checkwin |
||
168 | jc .exit |
||
169 | xor ch, ch |
||
170 | mov edx, [ebp + 4] ; chartable addr |
||
171 | mov cx, word[edx + ecx*2] ; tick info |
||
172 | mov edx, ecx |
||
2320 | art_zh | 173 | and ecx, 7 ; cl = number of ticks |
2318 | art_zh | 174 | jz .blank |
175 | shr edx, 4 ; offset in the chartable |
||
176 | add edx, [sdsh_data.chars] ; edx -> the char's ticklist |
||
177 | .next_tick: |
||
178 | call parse_tick |
||
179 | add edx, 4 |
||
180 | dec cl |
||
181 | jnz .next_tick |
||
182 | .blank: |
||
183 | .exit: |
||
184 | pop ebp, edx, ecx |
||
185 | ret |
||
186 | |||
187 | |||
188 | parse_tick: |
||
189 | ; eax = left side X |
||
190 | ; ebx = bottom Y |
||
191 | ; edx ->tickinfo |
||
192 | ; edi = color 0x0RRGGBB |
||
193 | ; ebp = font's header |
||
2320 | art_zh | 194 | pushad |
2318 | art_zh | 195 | xor ecx, ecx |
196 | mov dx, word[edx] |
||
197 | mov cl, dl |
||
198 | test dl, 0xE0 ; ticks #32..255 |
||
199 | jz .lntick.short |
||
200 | cmp dl, 0xE0 |
||
201 | jae .lntick.long |
||
202 | cmp dl, 0xC0 |
||
203 | jae .cstick |
||
204 | .gptick: |
||
2320 | art_zh | 205 | push edx |
206 | mov cl, dh |
||
207 | shr cl, 3 ; orig.# |
||
208 | mov edx, [ebp+8] ; orig. table |
||
209 | mov ch, byte[edx+ecx] ; orig. coords |
||
210 | pop edx |
||
211 | mov cl, dh |
||
212 | and cl, 7 ; three rotation bits |
||
213 | and edx, 0xFF |
||
214 | sub dl, 32 |
||
215 | test dl, (sdsh_data.v5-sdsh_data.v1) |
||
216 | jae .gptick.2 |
||
217 | .gptick.1: |
||
218 | mov esi, sdsh_data.tick_table |
||
219 | add esi, edx ; the tickfield |
||
220 | inc dh |
||
221 | sub dl, 2 ; .v1 |
||
222 | jb .gptick.done |
||
223 | inc dh |
||
224 | sub dl, 8 ; .v2 |
||
225 | jb .gptick.done |
||
226 | inc dh |
||
227 | sub dl, 8 ; .v3 |
||
228 | jb .gptick.done |
||
229 | inc dh |
||
230 | jmp .gptick.done ; .v4 |
||
231 | .gptick.2: |
||
232 | sub dl, (sdsh_data.v5-sdsh_data.v1) |
||
233 | jae .gptick.3 |
||
234 | mov esi, sdsh_data.v5 |
||
235 | add esi, edx*2 ; 2-byte tickfield |
||
236 | mov dh, 5 |
||
237 | sub dl, 8 ; .v5 |
||
238 | jb .gptick.done |
||
239 | inc dh |
||
240 | sub dl, 8 ; .v6 |
||
241 | jb .gptick.done |
||
242 | inc dh |
||
243 | sub dl, 8 ; .v7 |
||
244 | jb .gptick.done |
||
245 | inc dh |
||
246 | jmp .gptick.done ; .v8 |
||
247 | .gptick.3: |
||
248 | sub dl, (sdsh_data.v9-sdsh_data.v5) |
||
249 | jae .gptick.4 |
||
250 | mov esi, sdsh_data.v9 |
||
251 | lea esi,[esi+edx*2+edx] ; 3-byte tickfield |
||
252 | mov dh, 9 |
||
253 | sub dl, 4 ; .v9 |
||
254 | jb .gptick.done |
||
255 | inc dh |
||
256 | sub dl, 4 ; .v10 |
||
257 | jb .gptick.done |
||
258 | inc dh |
||
259 | sub dl, 4 ; .v11 |
||
260 | jb .gptick.done |
||
261 | inc dh |
||
262 | jmp .gptick.done ; .v12 |
||
263 | .gptick.4: |
||
264 | sub dl, (sdsh_data.v13-sdsh_data.v9) |
||
265 | jae .gptick.5 |
||
266 | mov esi, sdsh_data.v13 |
||
267 | lea esi,[esi+edx*2+edx] ; 3-byte tickfield |
||
268 | mov dh, 13 |
||
269 | sub dl, 4 ; .v13 |
||
270 | jb .gptick.done |
||
271 | inc dh |
||
272 | sub dl, 4 ; .v14 |
||
273 | jb .gptick.done |
||
274 | inc dh |
||
275 | sub dl, 4 ; .v15 |
||
276 | jb .gptick.done |
||
277 | inc dh |
||
278 | jmp .gptick.done ; .v16 |
||
279 | .gptick.unknown: |
||
280 | jmp .exit |
||
281 | .gptick.done: |
||
282 | mov dl, dh ; dl = numvert |
||
283 | mov dh, ch ; dh = orig.xy |
||
284 | call draw_tick |
||
285 | jmp .exit |
||
2318 | art_zh | 286 | |
287 | .cstick: |
||
288 | and cl, 4 |
||
289 | shr cl, 2 ; only one rotational bit |
||
290 | and dl, 3 |
||
291 | dec dl |
||
292 | jb .cstick.0 |
||
293 | mov esi, sdsh_data.cs2 ; the square |
||
294 | dec dl |
||
295 | jb .cstick.1 |
||
296 | dec dl |
||
297 | jb .cstick.2 |
||
298 | .cstick.3: |
||
299 | mov esi, sdsh_data.cs3 ; 12pix-ring |
||
300 | mov dl, 10 |
||
301 | jmp .draw |
||
302 | .cstick.2: |
||
303 | mov dl, 7 |
||
304 | jmp .draw |
||
305 | .cstick.1: |
||
306 | mov dl, 6 |
||
307 | jmp .draw |
||
308 | .cstick.3: |
||
309 | mov esi, sdsh_data.cs0 ; 4pix-square |
||
310 | mov dl, 3 |
||
311 | jmp .draw |
||
312 | |||
313 | .ritick: |
||
314 | test dl, 1 |
||
315 | jnz .ritick.1 |
||
316 | .ritick.0: |
||
317 | mov cl, dh ; y |
||
318 | and cl, 0x0F |
||
2320 | art_zh | 319 | sub ebx, ecx |
2318 | art_zh | 320 | mov cl, dh |
321 | shr cl, 4 ; x |
||
2320 | art_zh | 322 | add eax, ecx |
2318 | art_zh | 323 | call ch_putpixel |
324 | jmp .exit |
||
325 | .ritick.1: |
||
326 | mov esi, sdsh_data.ri1 ; 8pix-ring |
||
327 | mov dl, 4 |
||
2320 | art_zh | 328 | xor cl, cl |
2318 | art_zh | 329 | jmp .draw |
330 | |||
331 | .lntick.short: |
||
332 | test dl, 0x06 ; ticks #0, 1 are reserved for |
||
333 | jz .ritick ; rotational invariants |
||
334 | and dl, 0x07 ; dl = line length |
||
335 | jmp .lntick.both |
||
336 | .lntick.long: |
||
337 | and dl, 0x07 |
||
338 | add dl, 8 |
||
339 | .lntick.both: |
||
340 | sub dl, 2 ; num_vertice = num_points - 2 |
||
341 | and cl, 0x18 ; two rotation bits |
||
342 | shr cl, 3 |
||
343 | mov esi, sdsh_data.blank |
||
344 | .draw: |
||
2320 | art_zh | 345 | ; cl = rot; dl = numvert; dh = orig.xy |
2318 | art_zh | 346 | push ecx |
347 | mov cl, dh ; y |
||
348 | and cl, 0x0F |
||
2320 | art_zh | 349 | sub ebx, ecx |
2318 | art_zh | 350 | mov cl, dh |
351 | shr cl, 4 ; x |
||
2320 | art_zh | 352 | add eax, ecx |
2318 | art_zh | 353 | pop ecx |
354 | call draw_tick |
||
2320 | art_zh | 355 | .gptick.5: |
2318 | art_zh | 356 | .exit: |
357 | popad |
||
358 | ret |
||
359 | |||
360 | |||
361 | |||
362 | draw_tick: |
||
363 | ; eax = x-origin |
||
364 | ; ebx = y-origin |
||
365 | ; edi = 0x0RRGGBB |
||
366 | ; cl = direction (0..7) |
||
2320 | art_zh | 367 | ; dl = number of vertices (dl) |
368 | ; esi -> tick bitfield |
||
2318 | art_zh | 369 | |
370 | pushad |
||
2320 | art_zh | 371 | inc dl ; -- that's to count down to 0 |
372 | call ch_putpixel ; the point of origin |
||
373 | and ecx, 7 |
||
374 | call [.moves + ecx*4] ; basic vector |
||
375 | call ch_putpixel |
||
376 | dec dl |
||
377 | jz .done ; 2pix lines only |
||
378 | mov esi, dword [esi] ; max 16 vertice bitfield limit |
||
379 | xchg esi, edx |
||
2318 | art_zh | 380 | .move_and_draw: |
2320 | art_zh | 381 | mov ch, dl |
382 | and ch, 3 |
||
383 | jz .moved |
||
384 | btc ch, 0 |
||
385 | jz .2 |
||
386 | .1: |
||
387 | dec cl ; right turns (1 and 3) |
||
388 | and cl, 7 |
||
389 | @@: btc ch, 1 ; straight angle (3) ? |
||
390 | jc .1 |
||
391 | jmp .moved |
||
392 | .2: |
||
393 | inc cl ; left turn (2) |
||
394 | and cl, 7 |
||
395 | btc ch, 1 ; just to zero ah |
||
396 | .moved: |
||
397 | call [.moves + ecx*4] ; go new way |
||
398 | call ch_putpixel |
||
399 | shr edx, 2 |
||
400 | dec esi |
||
401 | jnz .move_and_draw |
||
2318 | art_zh | 402 | .done: |
403 | popad |
||
404 | ret |
||
405 | |||
406 | .move000: |
||
407 | inc eax |
||
408 | ret |
||
409 | .move001: |
||
410 | inc eax |
||
2320 | art_zh | 411 | dec ebx |
2318 | art_zh | 412 | ret |
413 | .move010: |
||
2320 | art_zh | 414 | dec ebx |
2318 | art_zh | 415 | ret |
416 | .move011: |
||
417 | dec eax |
||
2320 | art_zh | 418 | dec ebx |
2318 | art_zh | 419 | ret |
2320 | art_zh | 420 | .move100: |
2318 | art_zh | 421 | dec eax |
422 | ret |
||
2320 | art_zh | 423 | .move101: |
2318 | art_zh | 424 | dec eax |
2320 | art_zh | 425 | inc ebx |
2318 | art_zh | 426 | ret |
2320 | art_zh | 427 | .move110: |
428 | inc ebx |
||
2318 | art_zh | 429 | ret |
2320 | art_zh | 430 | .move111: |
2318 | art_zh | 431 | inc eax |
2320 | art_zh | 432 | inc ebx |
2318 | art_zh | 433 | ret |
434 | |||
435 | align 4 |
||
436 | .moves dd .move000, .move001, .move010, .move011, .move100, .move101, .move110, .move111 |
||
437 | |||
438 | ;) |
||
439 | |||
440 | align 4 |
||
441 | ch_checkscreen: |
||
442 | cmp [Screen_Max_X], eax |
||
443 | jb .getout |
||
444 | cmp [Screen_Max_Y], ebx |
||
445 | .getout: |
||
446 | ret |
||
447 | |||
448 | align 4 |
||
449 | ch_checkwin: |
||
450 | ; eax = x coordinate |
||
451 | ; ebx = y coordinate |
||
452 | ; ebp -> font info |
||
453 | ;!destroys ch, edx! |
||
454 | push eax, ebx |
||
455 | mov ch, byte[CURRENT_TASK] |
||
456 | mov al, byte [ebp] ; char X-width |
||
457 | mov edx, [_display.width] ; screen X-size |
||
458 | imul edx, ebx |
||
459 | add edx, [_WinMapAddress] |
||
460 | add edx, eax |
||
461 | cmp ch, byte [edx] |
||
462 | jne .fail |
||
463 | moxzx eax, byte [ebp] |
||
464 | cmp ch, byte [edx+eax] |
||
465 | jne .fail |
||
466 | moxzx ebx, byte [ebp+1] |
||
467 | imul ebx, [_display.width] |
||
468 | cmp ch, byte [edx+ebx] |
||
469 | jne .fail |
||
470 | add edx, eax |
||
471 | cmp ch, byte [edx+ebx] |
||
472 | clc |
||
473 | je .done |
||
474 | .fail: |
||
475 | stc ; CF means the charbox is invisible |
||
476 | .done: |
||
477 | pop ebx, eax |
||
478 | ret |
||
479 | |||
480 | align 4 |
||
481 | ch_putpixel: |
||
482 | ; eax = x coordinate |
||
483 | ; ebx = y coordinate |
||
484 | ; edi = 0x0RRGGBB |
||
485 | push edx |
||
486 | mov edx, ebx |
||
487 | imul edx, [BytesPerScanLine] |
||
488 | lea edx, [edx+eax*4] |
||
489 | mov [LFB_BASE+edx], edi |
||
490 | pop edx |
||
491 | ret |
||
492 | ;) |
||
493 | |||
2014 | art_zh | 494 | ;diff16 "font code end ",0,$ |
495 | diff10 "font code size",dtext,$16><16> |