Subversion Repositories Kolibri OS

Rev

Rev 2956 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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