Subversion Repositories Kolibri OS

Rev

Rev 2470 | Rev 2522 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 2499 $
  9.  
  10. ; // Alver 22.06.2008 // {
  11. align 4
  12. dtext_asciiz_esi:                          ; for skins title out
  13.     push eax
  14.     xor eax, eax
  15.     inc eax
  16.     jmp    dtext.1
  17. ; } \\ Alver \\
  18.  
  19. align 4
  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
  29.  
  30. ; // Alver 22.06.2008 // {
  31.        push eax
  32.         xor     eax, eax
  33. .1:
  34. ; } \\ Alver \\
  35.         pushad
  36.         call    [_display.disable_mouse]
  37.  
  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
  44. .loop:
  45.         test    ecx, ecx
  46.         js      .test_asciiz
  47.         dec     esi
  48.         js      .end
  49.         jmp     @f
  50. .test_asciiz:
  51.         cmp     byte [edx], 0
  52.         jz      .end
  53. ; // Alver 22.06.2008 // {
  54.         cmp byte [esp+28], 1    ;  was the entry point = dtext.1 ?
  55.         jne   @f
  56.         dec     esi
  57.         js        .end
  58. ; } \\ Alver \\
  59. @@:
  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]
  67. .symloop1:
  68.         mov     dl, byte [ebp]
  69.         or      dl, 1 shl 6
  70. .pixloop1:
  71.         shr     dl, 1
  72.         jz      .pixloop1end
  73.         jnc     .nopix
  74.         call    [putpixel]
  75.         jmp     .pixloop1cont
  76. .nopix:
  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
  83. .pixloop1cont:
  84.         inc     eax
  85.         jmp     .pixloop1
  86. .pixloop1end:
  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
  95. .font2:
  96.         add     edx, edx
  97.         lea     ebp, [FONT_II+4*edx+edx+1]
  98.         push    9
  99.         movzx   esi, byte [ebp-1]
  100. .symloop2:
  101.         mov     dl, byte [ebp]
  102.         push    esi
  103. .pixloop2:
  104.         shr     dl, 1
  105.         jnc     .nopix2
  106.         call    [putpixel]
  107.         jmp     .pixloop2cont
  108. .nopix2:
  109.         test    ecx, 0x40000000
  110.         jz      .pixloop2cont
  111.         push    ecx
  112.         mov     ecx, [esp+12+20h+20h]
  113.         call    [putpixel]
  114.         pop     ecx
  115. .pixloop2cont:
  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
  129. .end:
  130.         popad
  131.         pop  eax                ; << // Alver 22.06.2008 // <<
  132.         ret
  133.  
  134. diff10 "old font  code size",dtext,$
  135.  
  136. ;=====================================================
  137. ; NEW FONTS
  138. ;_____________________________________________________
  139. ;
  140.  
  141. align 8
  142. sdsh_data:
  143.  
  144. diff16 "sdsh_data      : ",0,$
  145.  
  146. include 'fonts/sd_data.asm'
  147.  
  148. sdsh_code:
  149.  
  150. ; eax   =       if (bit[31])
  151. ;                               then lower 31 bits points to the user-selected font
  152. ;                               else ax = number of preloaded system font
  153. ; ebx   =       x<<16 + y
  154. ; ecx   =       0x00RRGGBB
  155. ; edx   =       if (bits[31:8] == 0)
  156. ;                               then dl = single char to write
  157. ;                               else edx= pointer to asciiz-string
  158.  
  159. diff16 "draw_char      : ",0,$
  160.  
  161. draw_char:
  162. ; font test
  163. ; bl=y; bh=x
  164. ; dl=ascii
  165.         movzx   eax, bh
  166.         movzx   ebx, bl
  167.         movzx   ecx, dl
  168.         xor     edi, edi
  169.         mov     ebp, edi
  170.  
  171.  
  172. sdsh_draw_char:
  173. ; eax = left side X
  174. ; ebx = bottom Y
  175. ; edi = color 0x0RRGGBB
  176. ; ebp = font@
  177. ; ecx = ascii, zero-extended to 32bits
  178.         push    ecx
  179.         push    edx
  180.         push    ebp
  181.         shl     ebp, 4
  182.         add     ebp, sdsh_data.info
  183. ;        call   ch_checkscreen
  184. ;        jb             .exit
  185. ;        call   ch_checkwin
  186. ;        jc             .exit
  187.         mov     edx, [ebp + 4]              ; chartable addr
  188.         mov     cx, word[edx + ecx*2]       ; tick info
  189.         mov     edx, ecx
  190.         and     ecx, 7                      ; cl = number of ticks
  191.         jz      .blank
  192.         shr     edx, 4                      ; offset in the chartable
  193.         add     edx, sdsh_data.chars        ; edx -> the char's ticklist
  194. .next_tick:
  195.         call    parse_tick
  196.         add     edx, 2
  197.         dec     cl
  198.         jnz     .next_tick
  199. .blank:
  200. .exit:
  201.         pop     ebp
  202.         pop     edx
  203.         pop     ecx
  204.         ret
  205.  
  206.  
  207. parse_tick:
  208. diff16 "parse_tick     : ",0,$
  209. ; eax = left side X
  210. ; ebx = bottom Y
  211. ; edx ->tickinfo
  212. ; edi = color 0x0RRGGBB
  213. ; ebp = font's header
  214.         pushad
  215.         mov     dx, word[edx]
  216.         movzx   ecx, dl
  217.         test    dl, 0xE0         
  218.         jz      .lntick.short   ; ticks #0..31
  219.         cmp     dl, 0xE0
  220.         jae     .lntick.long    ; ticks #224..255
  221.         cmp     dl, 0xD8
  222.         jae     .cstick         ; ticks #216..223
  223. .gptick:
  224.         push    edx
  225.         cmp     dl, 38
  226.         jb      .sptick             ; special ticks #32-37
  227.                                     ; general ticks #38..215
  228.         mov     cl, dh
  229.         shr     cl, 3               ; number of origin
  230.         mov     edx, [ebp+8]        ; orig. table
  231.         mov     ch, byte[edx+ecx]   ; orig. coords
  232.         pop     edx
  233.         mov     cl, dh
  234.         and     cl, 7               ; three rotation bits
  235.         movzx   edx, dl             ; dl = gptick#
  236.         cmp     dl, 80
  237.         jae     .gptick.2
  238.         sub     dl, 38
  239.  
  240. .gptick.1:
  241.         ;  1-byte tickgroups .v1-v4:
  242.         lea     esi, [sdsh_data.v1+edx]
  243.         inc     dh                ; dh = 1 vertex
  244.         sub     dl, 2                   ; .v1 : 2 ticks only (#38, 39)
  245.         jae     .gptick.1v2v4
  246.         mov     dl, dh
  247.         mov     dh, ch
  248.         jmp     .draw
  249.  
  250. .gptick.1v2v4:
  251.         ; 1-byte tickgroups .v2-v4 : 8, 16 and 16 ticks
  252.         inc     dh               ; dh = 2 vertice
  253.         add     dl, 8
  254.         shr     dl, 4
  255.         jmp     .gptick.done
  256.  
  257. .gptick.2:
  258.         ; 2-byte tickgroups .v5-v8: 8 ticks each
  259.         cmp     dl, 112
  260.         jae     .gptick.3
  261.         sub     dl, 80
  262.         lea     esi, [sdsh_data.v5 + edx*2]
  263.         mov     dh, 5
  264.         shr     dl, 3
  265.         jmp     .gptick.done
  266.  
  267. .gptick.3:
  268.         ; 3-byte tickgroups .v9-12: 4 ticks each
  269.         cmp     dl, 128
  270.         jae     .gptick.4
  271.         sub     dl, 112
  272.         lea     esi, [sdsh_data.v9 + edx*2 + edx]
  273.         mov     dh, 9
  274.         shr     dl, 2
  275.         jmp     .gptick.done
  276.  
  277. .gptick.4:
  278.         ; 4-byte tickgroups .v13-16: 4 ticks each
  279.         cmp     dl, 128                 ; fix this when needed
  280.         jae     .exit                   ; not implemented yet!
  281.         sub     dl, 128
  282.         lea     esi, [sdsh_data.v13 + edx*4]
  283.         mov     dh, 13
  284.         shr     dl, 2
  285.  
  286. .gptick.done:
  287.         add     dl, dh
  288.         mov     dh, ch                  ; dh = orig.XY;     dl = numvert
  289.         jmp     .draw                   ; cl = rotation;   esi-> tickfield
  290.  
  291. .cstick:
  292.         and     cl, 4
  293.         shr     cl, 2                   ; only one rotational bit
  294.         and     dl, 3
  295.         jz      .cstick.0
  296.         dec     dl
  297.         jnz     @f
  298.         mov     dl, 6
  299.         jz      .cstick.1               ; 8-pix square outline
  300. @@:     dec     dl
  301.         jz      .cstick.2
  302. .cstick.3:
  303.         mov     esi, sdsh_data.cs3      ; 12pix-ring
  304.         mov     dl, 10
  305.         jmp     .draw
  306. .cstick.2:
  307.         mov     dl, 7                   ; 9-pix filled square
  308. .cstick.1:
  309.         mov     esi, sdsh_data.cs2      ; the square tickfield
  310.         jmp     .draw
  311. .cstick.0:
  312.         mov     esi, sdsh_data.cs0      ; 4pix-square
  313.         mov     dl, 2
  314.         jmp     .draw
  315.  
  316. .ritick:
  317.         test    dl, 1
  318.         jnz     .ritick.1
  319. .ritick.0:
  320.         movzx   ecx, dh             ; y
  321.         and     cl, 0x0F
  322.         sub     ebx, ecx
  323.         mov     cl, dh
  324.         shr     cl, 4               ; x
  325.         add     eax, ecx
  326.         call    ch_putpixel
  327.         jmp     .exit
  328. .ritick.1:
  329.         mov     esi, sdsh_data.ri1  ; 8pix-ring
  330.         mov     dl, 6
  331.         jmp     .draw
  332.  
  333. .lntick.short:
  334.         test    dl, 0x06            ; ticks #0, 1 are reserved for
  335.         jz      .ritick             ;             rotational invariants
  336.         and     dl, 0x07            ; dl = line length
  337.         jmp     .lntick.both
  338. .lntick.long:
  339.         and     dl, 0x07
  340.         add     dl, 8
  341. .lntick.both:
  342.         sub     dl, 2               ; num_vertice = num_points - 2
  343.         and     cl, 0x18            ; two (lower) rotation bits
  344.         shr     cl, 3
  345.         mov     esi, sdsh_data.blank
  346.  
  347. .draw:
  348. ; cl = rot; dl = numvert; dh = orig.xy
  349.         push    ecx
  350.         movzx   ecx, dh             ; y
  351.         and     cl, 0x0F
  352.         sub     ebx, ecx
  353.         mov     cl, dh
  354.         shr     cl, 4               ; x
  355.         add     eax, ecx
  356.         pop     ecx
  357.         call    draw_tick
  358. .gptick.5:
  359. .sptick:
  360. .exit:
  361.         popad
  362.         ret
  363.  
  364.  
  365. diff16 "draw_tick      : ",0,$
  366.  
  367. draw_tick:
  368. ; eax = x-origin
  369. ; ebx = y-origin
  370. ; edi = 0x0RRGGBB
  371. ;  cl = direction (0..7)
  372. ;  dl = number of vertice  (dl)
  373. ; esi -> tick bitfield
  374.  
  375.         pushad
  376.         call    ch_putpixel                     ; the point of origin
  377.         and     ecx, 7
  378.         lea     ebp, [.move000+ ecx*4]
  379.         call    ebp                   ; basic vector
  380.         call    ch_putpixel
  381.         and     edx, 15
  382.         jz      .done                  ; no vertex (2pix line)
  383.         mov     esi, dword [esi]       ; 15 vertice will easily fit to 1dw
  384.         xchg    esi, edx
  385. .move_and_draw:
  386.         mov     ch, dl
  387.         and     ch, 3
  388.         jz      .moved
  389.         dec     ch
  390.         jz      .1
  391.         dec     ch
  392.         jz      .2
  393. .3:
  394.         dec     cl
  395. .1:
  396.         dec     cl
  397.         jmp     .wipe_it
  398. .2:
  399.         inc     cl
  400. .wipe_it:
  401.         and     ecx, 7
  402. .moved:
  403. diff16 "moved          : ",0,$
  404.         lea     ebp, [.move000+ ecx*4]
  405.         call    ebp                 ; go new way
  406.         call    ch_putpixel
  407.         shr     edx, 2
  408.         dec     esi
  409.         jnz     .move_and_draw
  410. diff16 "done           : ",0,$
  411. .done:
  412.         popad
  413.         ret
  414.  
  415. ; WARNING! The order matters! ------
  416. align 4
  417. diff16 "move000        : ",0,$
  418. .move000:
  419.         inc             eax
  420.         ret
  421. align 4
  422. .move001:
  423.         inc             eax
  424.         dec             ebx
  425.         ret
  426. align 4
  427. .move010:
  428.         dec             ebx
  429.         ret
  430. align 4
  431. .move011:
  432.         dec             eax
  433.         dec             ebx
  434.         ret
  435. align 4
  436. .move100:
  437.         dec             eax
  438.         ret
  439. align 4
  440. .move101:
  441.         dec             eax
  442.         inc             ebx
  443.         ret
  444. align 4
  445. .move110:
  446.         inc             ebx
  447.         ret
  448.  
  449. align 4
  450. diff10 "move111-move000 (must be 28!)  : ",.move000,$
  451. .move111:
  452.         inc             eax
  453.         inc             ebx
  454.         ret
  455.  
  456. ;) ---------------
  457.  
  458. align 4
  459. diff16 "checkscreen    : ",0,$
  460. ch_checkscreen:
  461.      cmp        [Screen_Max_X], eax
  462.      jb         .getout
  463.      cmp        [Screen_Max_Y], ebx
  464. .getout:
  465.      ret
  466.  
  467. align 4
  468. diff16 "checkwin       : ",0,$
  469. ch_checkwin:
  470. ; eax = x coordinate
  471. ; ebx = y coordinate
  472. ; ebp -> font info
  473. ;!destroys ch, edx!
  474.         push    eax
  475.         push    ebx
  476.         mov     ch,  byte[CURRENT_TASK]
  477.         mov     al,  byte [ebp]             ; char X-width
  478.         mov     edx, [_display.width]       ; screen X-size
  479.         imul    edx, ebx
  480.         add     edx, [_WinMapAddress]
  481.         add     edx, eax
  482.         cmp     ch,  byte [edx]
  483.         jne     .fail
  484.         movzx   eax, byte [ebp]
  485.         cmp     ch,  byte [edx+eax]
  486.         jne     .fail
  487.         movzx   ebx, byte [ebp+1]
  488.         imul    ebx, [_display.width]
  489.         cmp     ch,  byte [edx+ebx]
  490.         jne     .fail
  491.         add     edx, eax
  492.         cmp     ch,  byte [edx+ebx]
  493.         clc
  494.         je     .done
  495. .fail:
  496.         stc                                 ; CF means the charbox is invisible
  497. .done:
  498.         pop     ebx
  499.         pop     eax
  500.         ret
  501.  
  502. align 4
  503. diff16 "ch_putpix      : ",0,$
  504. ; ch_putpixel:
  505. ; eax = x coordinate
  506. ; ebx = y coordinate
  507. ; edi = 0x0RRGGBB
  508.      push   edx
  509.          mov    edx, ebx
  510.      imul       edx, [BytesPerScanLine]
  511.      lea        edx, [edx+eax*4]
  512.      mov   [LFB_BASE+edx], edi
  513.      pop    edx
  514.      ret
  515. ;)
  516. ch_putpixel:
  517. ; test version!!! ===== to be removed!!
  518. ; eax = x coordinate
  519. ; ebx = y coordinate
  520. ; edi = 0x0RRGGBB
  521.      push   edx
  522.          mov    edx, ebx
  523.         shl     edx, 1
  524.      imul       edx, [BytesPerScanLine]
  525.      lea        edx, [edx+eax*8]
  526.         add     edx, LFB_BASE
  527.      mov   [edx], edi
  528.         mov     [edx+4], edi
  529.         sub     edx, [BytesPerScanLine]
  530.         mov     [edx], edi
  531.         mov     [edx+4], edi
  532.      pop    edx
  533.      ret
  534.  
  535.  
  536. diff10 "new font  code size",sdsh_code,$
  537.