Subversion Repositories Kolibri OS

Rev

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

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