Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2013. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;   Written by hidnplayr@kolibrios.org                            ;;
  7. ;;                                                                 ;;
  8. ;;         GNU GENERAL PUBLIC LICENSE                              ;;
  9. ;;          Version 2, June 1991                                   ;;
  10. ;;                                                                 ;;
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12.  
  13.  
  14. text_insert_newlines:                   ; esi = ASCIIZ string
  15.  
  16.         xor     edx, edx                ; number of lines of text
  17.         cmp     byte[esi], 0
  18.         je      .done
  19.   .next_line:
  20.         xor     ebx, ebx
  21.         mov     ecx, [textbox_width]
  22.         inc     ecx
  23.   .more:
  24.         dec     ecx
  25.         jz      .end_of_line
  26.         lodsb                           ; get one character of the string
  27.         test    al, al                  ; end of string?
  28.         jz      .almost_done
  29.         cmp     al, ' '                 ; it's a space! remember its position
  30.         je      .space
  31.         cmp     al, 13                  ; we already inserted a newline once, make it a space again
  32.         je      .soft_nl
  33.         cmp     al, 10                  ; it's a newline, continue onto the next line
  34.         jne     .more
  35.         inc     edx
  36.         jmp     .next_line
  37.   .soft_nl:
  38.         inc     edx
  39.         mov     byte[esi-1], ' '
  40.         mov     ebx, esi
  41.         jmp     .more
  42.   .space:
  43.         mov     ebx, esi                ; last detected space
  44.         jmp     .more
  45.   .end_of_line:
  46.         inc     edx
  47.         test    ebx, ebx                ; did we detect any spaces on this line?
  48.         jz      .next_line              ; no:   just continue onto the next line
  49.         mov     byte[ebx-1], 13         ; yes:  replace last space on line with a soft newline
  50.         mov     esi, ebx                ;       and continue parsing just after last space
  51.         jmp     .next_line              ;
  52.   .almost_done:
  53.         dec     esi
  54.   .done:
  55.  
  56.         ret
  57.  
  58. ; When you set the direction flag before calling, you can also scan for previous line!
  59. ; in: esi
  60. ; out:esi
  61. text_nextline:
  62.  
  63.         mov     ecx, [textbox_width]
  64.   .loop:
  65.         cmp     byte[esi], 0
  66.         je      .done
  67.         lodsb
  68.         cmp     al, 10
  69.         je      .done
  70.         cmp     al, 13
  71.         je      .done
  72.         dec     ecx
  73.         jnz     .loop
  74.   .done:
  75.  
  76.         ret
  77.  
  78.  
  79. print_text:                             ; eax = start ptr
  80.                                         ; dl = end char
  81.         pusha
  82.   ptr2:
  83.         mov     bl, [eax]
  84.  
  85.         cmp     bl, dl
  86.         je      .done
  87.         test    bl, bl
  88.         jz      .done
  89.         call    print_character
  90.  
  91.         inc     eax
  92.         jmp     ptr2
  93.  
  94.   .done:
  95.         popa
  96.  
  97.         ret
  98.  
  99.  
  100.  
  101. print_text2:                            ; esi = ptr to ASCIIZ string
  102.  
  103.         pusha
  104.   .loop:
  105.         lodsb
  106.         test    al, al
  107.         jz      .done
  108.         mov     bl, al
  109.         call    print_character
  110.         jmp     .loop
  111.  
  112.   .done:
  113.         popa
  114.  
  115.         ret
  116.  
  117.  
  118. print_character:
  119.  
  120.         push    esi edi
  121.         mov     esi, [window_print]
  122.         mov     edi, [esi + window.text_write]
  123.         mov     byte[edi], bl
  124.         inc     edi
  125.         cmp     edi, [esi + window.text_end]
  126.         jae     .uh_ow
  127.         mov     [esi + window.text_write], edi
  128.   .continue:
  129.         or      [esi + window.flags], FLAG_UPDATED
  130.         pop     edi esi
  131.  
  132.         ret
  133.  
  134.   .uh_ow:
  135.  
  136.         pusha
  137.         mov     edi, [esi + window.text_start]
  138.         mov     [esi + window.text_print], edi
  139.         lea     esi, [edi + TEXT_BUFFERSIZE/2]
  140.         call    text_nextline
  141.         mov     ecx, TEXT_BUFFERSIZE/8
  142.         rep     movsd
  143.         mov     esi, edi
  144.         call    text_insert_newlines
  145.  
  146.         mov     ebx, [window_print]
  147.         mov     [ebx + window.text_lines], edx
  148.         mov     [ebx + window.text_scanned], esi
  149.         mov     [ebx + window.text_write], esi
  150.         mov     [ebx + window.text_line_print], 0
  151.         popa
  152.  
  153.         jmp     .continue
  154.  
  155.  
  156.  
  157. draw_channel_text:
  158.  
  159.         mov     edi, [window_active]
  160.         and     [edi + window.flags], not FLAG_UPDATED  ; clear the 'window is updated' flag
  161.  
  162. ; Scan new text for newlines
  163.         mov     esi, [edi + window.text_scanned]
  164.         call    text_insert_newlines
  165.         add     [edi + window.text_lines], edx
  166.         mov     [edi + window.text_scanned], esi
  167.  
  168. ; should we scroll up/down some lines ?                 ; TODO: only scroll down automatically when scrollbar is at lowest position  ?
  169.         mov     edx, [edi + window.text_lines]
  170.         sub     edx, [textbox_height]
  171.         jle     .noscroll                               ; There are less lines of text than fit into the window, dont scroll..
  172.         sub     edx, [edi + window.text_line_print]
  173.         je      .noscroll                               ; We are already at the bottom pos, dont scroll..
  174.  
  175.   .scroll_to_pos:               ; edx = number of lines to go up/down (flags must indicate direction)
  176.         pushf
  177.         add     [edi + window.text_line_print], edx
  178.         mov     esi, [edi + window.text_print]
  179.         popf
  180.         ja      .loop_forward
  181.         std                     ; set direction flag so we can scan backwards
  182.         dec     esi             ; move our cursor just in front of newline, for scanning backwards
  183.         dec     edx ;;;;; FIXME: this seems to be needed, but why ???
  184.   .loop_backward:
  185.         call    text_nextline
  186.         inc     edx
  187.         jnz     .loop_backward
  188.         inc     esi             ; move the cursor just after last newline
  189.         cld
  190.         jmp     .ok
  191.  
  192.   .loop_forward:
  193.         call    text_nextline
  194.         dec     edx
  195.         jnz     .loop_forward
  196.   .ok:
  197.         mov     [edi + window.text_print], esi
  198.   .noscroll:
  199.  
  200.         mov     edx, [edi + window.text_print]
  201. ; Calculate start coordinates (align text to bottom)
  202.         mov     ebx, [textbox_height]
  203.         sub     ebx, [edi + window.text_lines]
  204.         jae     @f
  205.         xor     ebx, ebx
  206.   @@:
  207.         imul    ebx, FONT_HEIGHT
  208.         add     ebx, TEXT_X shl 16 + TEXT_Y
  209.  
  210. ; Prepare to actually draw some text
  211.         mov     eax, [textbox_height]   ; max number of lines to draw
  212.         mov     ecx, [colors.work_text] ; default text color
  213.   .drawloop:
  214.         cmp     byte[edx], 0
  215.         je      .end
  216.  
  217. ; Clear one row of characters
  218.         pusha
  219.         mov     cx, bx
  220.         shl     ecx, 16
  221.         mov     cx, FONT_HEIGHT
  222.         mov     ebx, TEXT_X shl 16
  223.         mov     bx, word[textbox_width]
  224.         imul    bx, FONT_WIDTH
  225.         mov     edx, [colors.work]
  226.         mcall   13                      ; draw rectangle
  227.         popa
  228.  
  229.         mov     esi, edx
  230.         add     esi, [textbox_width]
  231.   .line:
  232.         cmp     byte[edx], 0
  233.         je      .end
  234.  
  235.         cmp     byte[edx], 13
  236.         je      .newline_soft
  237.  
  238.         cmp     byte[edx], 10
  239.         je      .newline_hard
  240.  
  241.         push    esi eax
  242.         cmp     byte[edx], 3            ; escape code for mIRC colors
  243.         jne     .no_colors
  244.         inc     edx
  245.         call    dec_to_esi
  246.         jz      .no_colors
  247.         mov     ecx, [irc_colors + 4*esi]
  248.  
  249.         cmp     byte[edx], ','          ; background color?
  250.         jne     .no_colors
  251.         inc     edx
  252.         call    dec_to_esi
  253.         jz      .no_colors
  254.         mov     edi, [irc_colors + 4*esi]
  255.         or      ecx, 0x40000000
  256.   .no_colors:
  257.  
  258.   .draw:
  259.         mov     esi, 1
  260.         mcall   4                       ; draw text
  261.         add     ebx, FONT_WIDTH shl 16
  262.         inc     edx
  263.         pop     eax esi
  264.         cmp     edx, esi
  265.         jb      .line
  266.         jmp     .line_full
  267.  
  268.   .newline_hard:
  269.         mov     ecx, [colors.work_text]
  270.   .newline_soft:
  271.         inc     edx
  272.   .line_full:
  273.         and     ebx, 0x0000ffff
  274.         add     ebx, TEXT_X shl 16 + FONT_HEIGHT
  275.         dec     eax
  276.         jnz     .drawloop
  277.  
  278. ; take care of the scrollbar
  279.   .scrollbar:
  280.         mov     edi, [window_active]
  281.         mov     edx, [edi + window.text_lines]
  282.         cmp     edx, [textbox_height]
  283.         ja      .draw_scroll
  284.         mov     [scroll2.position], 0           ; disable scrollbar
  285.         jmp     .scroll_done
  286.  
  287.   .draw_scroll:
  288.         mov     [scroll2.max_area], edx
  289.         mov     eax, [edi + window.text_line_print]
  290.         mov     [scroll2.position], eax
  291.  
  292.         push    dword scroll2                   ; redraw scrollbar
  293.         call    [scrollbar_draw]
  294.  
  295.         mov     [scroll2.all_redraw], 0         ; next time, dont redraw it completely
  296.   .scroll_done:
  297.   .end:
  298.         ret
  299.  
  300.  
  301.  
  302.  
  303. dec_to_esi:
  304.  
  305.         xor     esi, esi
  306.   .loop:
  307.         movzx   eax, byte[edx]
  308.         sub     al, '0'
  309.         jb      .done
  310.         cmp     al, 9
  311.         ja      .done
  312.         inc     edx
  313.         shl     esi, 1                  ; esi * 2
  314.         lea     esi, [esi + 4*esi]      ; esi * 5
  315.         add     esi, eax
  316.         jmp     .loop
  317.   .done:
  318.         cmp     esi, 16
  319.         jae     .fail
  320.         ret
  321.  
  322.   .fail:
  323.         xor     esi, esi
  324.         ret
  325.  
  326.  
  327.  
  328. if TIMESTAMP
  329. print_timestamp:
  330.  
  331.         pusha
  332.         mcall   3                       ; get system time
  333.  
  334.         mov     bl, '['
  335.         call    print_character
  336.         mov     ecx, TIMESTAMP
  337.   .loop:
  338.         mov     bl, al
  339.         shr     bl, 4
  340.         add     bl, '0'
  341.         call    print_character
  342.  
  343.         mov     bl, al
  344.         and     bl, 0x0f
  345.         add     bl, '0'
  346.         call    print_character
  347.  
  348.         dec     ecx
  349.         jz      .done
  350.  
  351.         mov     bl, ':'
  352.         call    print_character
  353.         shr     eax, 8
  354.         jmp     .loop
  355.   .done:
  356.         mov     bl, ']'
  357.         call    print_character
  358.         mov     bl, ' '
  359.         call    print_character
  360.  
  361.         popa
  362.         ret
  363. end if