;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                                                              ;;
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License    ;;
;;                                                              ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

$Revision$

;------------------------------------------------------------------------------
align 4
dtext_asciiz_esi:                          ; for skins title out
        push    eax
        xor     eax, eax
        inc     eax
        jmp     dtext.1
;------------------------------------------------------------------------------
align 4
dtext:  ; Text String Output (rw by Johnny_B[john@kolibrios.org])
        ; ebx x & y
        ; ecx style ( 0xX0000000 ) & color ( 0x00RRGGBB )
        ; X = ABnnb:
        ; nn = font
        ; A = 0 <=> output esi characters; otherwise output ASCIIZ string
        ; B = 1 <=> fill background with color eax
        ; edx start of text
        ; edi 1 force
        push    eax
        xor     eax, eax
;--------------------------------------
align 4
.1:
        pushad
        movsx   eax, bx         ; eax=y
        sar     ebx, 16         ; ebx=x
        xchg    eax, ebx        ; eax=x, ebx=y
        cmp     esi, 255
        jb      .loop
        mov     esi, 255
;--------------------------------------
align 4
.loop:
        test    ecx, ecx
        js      .test_asciiz
        dec     esi
        js      .end
        jmp     @f
;--------------------------------------
align 4
.test_asciiz:
        cmp     byte [edx], 0
        jz      .end

        cmp     byte [esp+28], 1
        jne     @f
        dec     esi
        js      .end
;--------------------------------------
align 4
@@:
        inc     edx
        pushad
        movzx   edx, byte [edx-1]
        test    ecx, 0x10000000
        jnz     .font2
        mov     esi, 9
        lea     ebp, [FONT_I+8*edx+edx]
;--------------------------------------
align 4
.symloop1:
        mov     dl, byte [ebp]
        or      dl, 1 shl 6
;--------------------------------------
align 4
.pixloop1:
        shr     dl, 1
        jz      .pixloop1end
        jnc     .nopix
        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 save to mouseunder area
;        call    [putpixel]
        call    __sys_putpixel
        jmp     .pixloop1cont
;--------------------------------------
align 4
.nopix:
        test    ecx, 0x40000000
        jz      .pixloop1cont
        push    ecx
        mov     ecx, [esp+4+20h+20h]
        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 save to mouseunder area
;        call    [putpixel]
        call    __sys_putpixel
        pop     ecx
;--------------------------------------
align 4
.pixloop1cont:
        inc     eax
        jmp     .pixloop1
;--------------------------------------
align 4
.pixloop1end:
        sub     eax, 6
        inc     ebx
        inc     ebp
        dec     esi
        jnz     .symloop1
        popad
        add     eax, 6
        jmp     .loop
;--------------------------------------
align 4
.font2:
        add     edx, edx
        lea     ebp, [FONT_II+4*edx+edx+1]
        push    9
        movzx   esi, byte [ebp-1]
;--------------------------------------
align 4
.symloop2:
        mov     dl, byte [ebp]
        push    esi
;--------------------------------------
align 4
.pixloop2:
        shr     dl, 1
        jnc     .nopix2
        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 save to mouseunder area
;        call    [putpixel]
        call    __sys_putpixel
        jmp     .pixloop2cont
;--------------------------------------
align 4
.nopix2:
        test    ecx, 0x40000000
        jz      .pixloop2cont
        push    ecx
        mov     ecx, [esp+12+20h+20h]
        and     ecx, 0xFBFFFFFF  ;negate 0x04000000 save to mouseunder area
;        call    [putpixel]
        call    __sys_putpixel
        pop     ecx
;--------------------------------------
align 4
.pixloop2cont:
        inc     eax
        dec     esi
        jnz     .pixloop2
        pop     esi
        sub     eax, esi
        inc     ebx
        inc     ebp
        dec     dword [esp]
        jnz     .symloop2
        pop     eax
        add     dword [esp+28], esi
        popad
        jmp     .loop
;--------------------------------------
align 4
.end:
        popad
        pop     eax
        ret
;------------------------------------------------------------------------------