Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2016. 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.         test    [edi + window.flags], FLAG_SCROLL_LOW
  183.         jnz     .yesscroll                              ;Yes
  184.         cmp     [scroll2.all_redraw], 1                 ;No
  185.         jnz      .noscroll
  186.         mov     edx, [textbox_height]
  187.         add     edx, [edi + window.text_line_print]
  188.     cmp edx, [edi + window.text_lines]
  189.         jl      .noscroll
  190.   .yesscroll:
  191. ; Scrollbar was at lowest position, scroll down automatically when new text arrived.
  192.         mov     edx, [edi + window.text_lines]
  193.         sub     edx, [textbox_height]
  194.         jle     .noscroll                               ; There are less lines of text than fit into the window, dont scroll..
  195.         sub     edx, [edi + window.text_line_print]
  196.         je      .noscroll                               ; We are already at the bottom pos, dont scroll..
  197.   .scroll_to_pos:               ; edx = number of lines to go up/down (flags must indicate direction)
  198.         pushf
  199.         add     [edi + window.text_line_print], edx
  200.         mov     esi, [edi + window.text_print]
  201.         popf
  202.         ja      .loop_forward
  203.         std                     ; set direction flag so we can scan backwards
  204.         dec     esi
  205.         dec     esi             ; move our cursor just in front of newline, for scanning backwards
  206.   .loop_backward:
  207.         call    text_nextline
  208.         inc     edx
  209.         jnz     .loop_backward
  210.         inc     esi
  211.         inc     esi             ; move the cursor just after last newline
  212.         cld
  213.         jmp     .ok
  214.  
  215.   .loop_forward:
  216.         call    text_nextline
  217.         dec     edx
  218.         jnz     .loop_forward
  219.   .ok:
  220.         mov     [edi + window.text_print], esi
  221.   .noscroll:
  222.  
  223. ; Update and draw scrollbar when nescessary
  224.         mov     edx, [edi + window.text_lines]
  225.         cmp     edx, [textbox_height]
  226.         jbe     .scroll_done
  227.  
  228.         mov     [scroll2.max_area], edx
  229.         mov     eax, [edi + window.text_line_print]
  230.         mov     [scroll2.position], eax
  231.  
  232.         push    dword scroll2                   ; redraw scrollbar
  233.         call    [scrollbar_draw]
  234.         mov     [scroll2.all_redraw], 0         ; next time, dont redraw it completely
  235.   .scroll_done:
  236.  
  237. ; Calculate start offset coordinates (align text to bottom)
  238.         mov     ebx, [textbox_height]
  239.         sub     ebx, [edi + window.text_lines]
  240.         jb      .no_offset
  241.         imul    ebx, FONT_HEIGHT
  242.         push    [edi + window.text_start]
  243.         pop     [edi + window.text_print]
  244.         jmp     .draw_text
  245.   .no_offset:
  246.         xor     ebx, ebx
  247.   .draw_text:
  248. ; Prepare to actually draw some text
  249.         mov     eax, [textbox_height]   ; max number of lines to draw
  250.         add     ebx, TEXT_X shl 16 + TEXT_Y
  251.         mov     ecx, [colors.work_text] ; default text color
  252.         mov     edx, [edi + window.text_print]
  253.   .drawloop:
  254.         cmp     byte[edx], 0
  255.         je      .end_of_text
  256.  
  257. ; Clear one row of characters
  258.         pusha
  259.         mov     cx, bx
  260.         shl     ecx, 16
  261.         mov     cx, FONT_HEIGHT
  262.         mov     ebx, TEXT_X shl 16
  263.         mov     bx, word[textbox_width]
  264.         imul    bx, FONT_WIDTH
  265.         mov     edx, [colors.work]
  266.         mcall   13                      ; draw rectangle
  267.         popa
  268.  
  269.         mov     esi, edx
  270.         add     esi, [textbox_width]
  271.   .line:
  272.         cmp     byte[edx], 0
  273.         je      .end_of_text
  274.  
  275.         cmp     byte[edx], 13
  276.         je      .newline_soft
  277.  
  278.         cmp     byte[edx], 10
  279.         je      .newline_hard
  280.  
  281.         push    esi eax
  282.         cmp     byte[edx], 3            ; escape code for mIRC colors
  283.         jne     .no_colors
  284.         inc     edx
  285.         call    dec_to_esi
  286.         jz      .no_colors
  287.         mov     ecx, [irc_colors + 4*esi]
  288.  
  289.         cmp     byte[edx], ','          ; background color?
  290.         jne     .no_colors
  291.         inc     edx
  292.         call    dec_to_esi
  293.         jz      .no_colors
  294.         mov     edi, [irc_colors + 4*esi]
  295.         or      ecx, 0x40000000
  296.   .no_colors:
  297.  
  298.         mov     esi, 1
  299.         mcall   4                       ; draw text
  300.         add     ebx, FONT_WIDTH shl 16
  301.         inc     edx
  302.         pop     eax esi
  303.         cmp     edx, esi
  304.         jb      .line
  305.         jmp     .line_full
  306.  
  307.   .newline_hard:
  308.         mov     ecx, [colors.work_text]
  309.   .newline_soft:
  310.         inc     edx
  311.   .line_full:
  312.         and     ebx, 0x0000ffff
  313.         add     ebx, TEXT_X shl 16 + FONT_HEIGHT
  314.         dec     eax
  315.         jnz     .drawloop
  316.   .end_of_text:
  317.  
  318.         ret
  319.  
  320.  
  321.  
  322.  
  323. dec_to_esi:
  324.  
  325.         xor     esi, esi
  326.   .loop:
  327.         movzx   eax, byte[edx]
  328.         sub     al, '0'
  329.         jb      .done
  330.         cmp     al, 9
  331.         ja      .done
  332.         inc     edx
  333.         lea     esi, [esi*4 + esi]      ; esi * 5
  334.         lea     esi, [esi*2 + eax]      ; esi * 2 + eax
  335.         jmp     .loop
  336.   .done:
  337.         cmp     esi, 16
  338.         jae     .fail
  339.         ret
  340.  
  341.   .fail:
  342.         xor     esi, esi
  343.         ret
  344.  
  345.  
  346.  
  347. if TIMESTAMP
  348. print_timestamp:
  349.  
  350.         pusha
  351.         mcall   3                       ; get system time
  352.         mov     ebx, eax
  353.  
  354.         mov     al, '['
  355.         call    print_char
  356.         mov     ecx, TIMESTAMP
  357.   .loop:
  358.         mov     al, bl
  359.         shr     al, 4
  360.         add     al, '0'
  361.         call    print_char
  362.  
  363.         mov     al, bl
  364.         and     al, 0x0f
  365.         add     al, '0'
  366.         call    print_char
  367.  
  368.         dec     ecx
  369.         jz      .done
  370.  
  371.         mov     al, ':'
  372.         call    print_char
  373.         shr     ebx, 8
  374.         jmp     .loop
  375.   .done:
  376.         mov     al, ']'
  377.         call    print_char
  378.         mov     al, ' '
  379.         call    print_char
  380.  
  381.         popa
  382.         ret
  383. end if