Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 7718 $
  9.  
  10. dtext:
  11. ; edx -> string
  12. ; esi = number of characters
  13. ; ebx = output coordinates XXXXYYYY h
  14. ; ecx = char color and flags flRRGGBB h
  15. ; fl = ZBFFRSSS b
  16. ; Z=1: edx -> zero terminated string, esi = ?
  17. ; B=1: fill background with color eax
  18. ; R=1: edi -> user area for redirect
  19. ; FF=3: UTF-8 8x16, FF=2: UTF-16LE 8x16
  20. ; FF=1: cp866 8x16, FF=0: cp866 6x9
  21. ; SSS = (font multiplier)-1
  22. ; edi=1: force output    
  23. ; flag CF=1 means that we deal with asciiz but need to draw no more than esi symbols
  24.         clc
  25. ._:        
  26.         push    ecx edx
  27.         setc    dl        
  28.         and     eax, 0xFFFFFF
  29.         and     ecx, 1 shl 31
  30.         shl     edx, 29
  31.         or      eax, ecx    
  32.         or      eax, edx
  33.         pop     edx ecx        
  34.         bt      ecx, 30
  35.         jc      @f
  36.         or      eax, 1 shl 30
  37. @@:
  38.         pushd   0 0 0 eax
  39.         movsx   eax, bx
  40.         sar     ebx, 16
  41.         push    eax ebx edi
  42.         bt      ecx, 27
  43.         jc      .redirect
  44.         mov     ebp, [_display.width]
  45.         xor     edi, edi
  46.         jmp     @f
  47.  
  48. .ret:
  49.         add     esp, 28
  50.         ret
  51.  
  52. .redirect:
  53.         mov     ebp, [edi]
  54.         add     edi, 8
  55. @@:
  56.         shl     ebp, 2
  57.         imul    eax, ebp
  58.         shl     ebx, 2
  59.         add     eax, ebx
  60.         js      .ret
  61.         add     edi, eax
  62.         mov     eax, ecx
  63.         mov     ebx, ecx
  64.         test    ecx, ecx
  65.         jns     @f
  66.         mov     esi, 256
  67. @@:
  68.         shr     ecx, 24
  69.         and     cl, 7
  70.         inc     ecx
  71.         push    ebp ecx esi
  72.         mov     esi, edx
  73.         or      eax, 0xFF000000
  74.         bt      ebx, 27
  75.         jc      .bufferReady
  76.         mov     eax, 9
  77.         test    ebx, 0x30000000
  78.         jz      @f
  79.         add     eax, 7
  80. @@:
  81.         imul    eax, ecx
  82.         mov     [esp+32], eax
  83.         imul    ebp, eax
  84.         stdcall kernel_alloc, ebp
  85.         mov     ecx, ebp
  86.         shr     ecx, 2
  87.         mov     [esp+36], eax
  88.         sub     edi, eax
  89.         mov     edx, eax
  90.         mov     eax, [esp+24]
  91.         test    eax, 1 shl 30
  92.         jz      @f
  93.         or      eax, -1
  94.         mov     [esp+28], edi
  95.         jmp     .1
  96. @@:    
  97.         and     eax, 0x00ffffff          
  98. .1:
  99.         mov     edi, edx
  100.         rep stosd
  101.         mov     edi, edx
  102.         mov     eax, ebx
  103.         and     eax, 0xFFFFFF
  104. .bufferReady:
  105.         mov     ebp, eax
  106.         mov     eax, [esp+8]
  107.         shr     eax, 2
  108.         sub     eax, [esp+16]
  109.         shr     eax, 3
  110.         xor     edx, edx
  111.         div     dword[esp+4]
  112.         mov     ecx, [esp]
  113.         cmp     eax, ecx
  114.         jnc     @f
  115.         mov     [esp], eax
  116. @@:
  117.         xor     edx, edx
  118.         bt      ebx, 29
  119.         jc      @f
  120.         bt      ebx, 28
  121.         jc      .draw866toUni
  122.         shl     eax, 3
  123.         mov     bx, 6
  124.         div     bx
  125.         xor     edx, edx
  126.         inc     eax
  127.         mov     [esp], ecx
  128.         cmp     eax, ecx
  129.         jnc     .draw866
  130.         mov     [esp], eax
  131.         jmp     .draw866
  132.  
  133. @@:
  134.         bt      ebx, 28
  135.         jc      .drawUTF8
  136.  
  137. ; ebp = font color
  138. ; esi -> string
  139. ; edi -> buffer
  140.  
  141. ; Stack map:
  142. ; char counter +0
  143. fontMultiplier = 4
  144. widthX = 8
  145. ; edi +12
  146. ; X +16
  147. ; Y +20
  148. ; internal flags & background +24
  149. deltaToScreen = 28
  150. ; temp buffer height +32
  151. ; temp buffer pointer +36
  152.  
  153. .drawUTF16:
  154.         dec     dword [esp]
  155.         js      .done
  156.         movzx   ebx, word [esi]
  157.         test    dword [esp + 24], 1 shl 31
  158.         jnz     @f                
  159.         test    dword [esp + 24], 1 shl 29
  160.         jz      .u16Still
  161. @@:        
  162.         test    ebx, ebx
  163.         jz      .done
  164. .u16Still:        
  165.         inc     esi
  166.         inc     esi
  167.         cmp     bx, 1419
  168.         jc      @f
  169.         xor     ebx, ebx
  170. @@:
  171.         pushd   esi edi 16
  172.         shl     ebx, 4
  173.         add     ebx, fontUni
  174.         mov     esi, [esp+12+fontMultiplier]
  175.         call    drawChar
  176.         imul    esi, 8*4
  177.         pop     edi
  178.         pop     edi
  179.         add     edi, esi
  180.         pop     esi
  181.         jmp     .drawUTF16
  182.  
  183. .drawUTF8:
  184.         dec     dword [esp]
  185.         js      .done
  186.         xor     eax, eax
  187.         call    utf8to16
  188.         test    dword [esp + 24], 1 shl 31
  189.         jnz     @f                
  190.         test    dword [esp + 24], 1 shl 29
  191.         jz      .u8Still
  192. @@:        
  193.         test    eax, eax
  194.         jz      .done
  195. .u8Still:        
  196.         cmp     eax, 1419
  197.         jc      @f
  198.         xor     eax, eax
  199. @@:
  200.         shl     eax, 4
  201.         lea     ebx, [eax+fontUni]
  202.         pushd   esi edi 16
  203.         mov     esi, [esp+12+fontMultiplier]
  204.         call    drawChar
  205.         imul    esi, 8*4
  206.         pop     edi
  207.         pop     edi
  208.         add     edi, esi
  209.         pop     esi
  210.         jmp     .drawUTF8
  211.  
  212. .draw866:
  213.         dec     dword [esp]
  214.         js      .done
  215.         movzx   ebx, byte [esi]
  216.         test    dword [esp + 24], 1 shl 31
  217.         jnz     @f                
  218.         test    dword [esp + 24], 1 shl 29
  219.         jz      .866Still
  220. @@:        
  221.         test    ebx, ebx
  222.         jz      .done
  223. .866Still:        
  224.         inc     esi
  225.         pushd   esi edi 9
  226.         lea     ebx, [ebx*8+ebx+font1]
  227.         mov     esi, [esp+12+fontMultiplier]
  228.         call    drawChar
  229.         imul    esi, 6*4
  230.         pop     edi
  231.         pop     edi
  232.         add     edi, esi
  233.         pop     esi
  234.         jmp     .draw866
  235.  
  236. .draw866toUni:
  237.         dec     dword [esp]
  238.         js      .done
  239.         movzx   eax, byte [esi]
  240.         test    dword [esp + 24], 1 shl 31
  241.         jnz     @f                
  242.         test    dword [esp + 24], 1 shl 29
  243.         jz      .8662uStill        
  244. @@:        
  245.         test    eax, eax
  246.         jz      .done
  247. .8662uStill:        
  248.         call    ansi2uni_char
  249.         shl     eax, 4
  250.         lea     ebx, [eax+fontUni]
  251.         inc     esi
  252.         pushd   esi edi 16
  253.         mov     esi, [esp+12+fontMultiplier]
  254.         call    drawChar
  255.         imul    esi, 8*4
  256.         pop     edi
  257.         pop     edi
  258.         add     edi, esi
  259.         pop     esi
  260.         jmp     .draw866toUni
  261.  
  262. .done:
  263.         mov     ecx, edi
  264.         pop     eax eax eax esi edx ebx ebp ebp ebp
  265.         mov     edi, [esp]
  266.         test    edi, edi
  267.         jnz     @f
  268.         pop     eax
  269.         ret
  270.  
  271. @@: ; redraw from buffer to screen
  272.         push    eax
  273.         sub     ecx, edi
  274.         shr     ecx, 2
  275.         add     edx, ecx
  276.         inc     ecx
  277.         push    ecx
  278.         push    edi
  279. .drawPicture:
  280.         mov     eax, -1
  281.         repz scasd
  282.         jecxz   @f
  283.         mov     eax, edx
  284.         sub     eax, ecx
  285.         push    ecx
  286.         mov     ecx, [edi-4]
  287.         xchg    esi, edi
  288.         call    __sys_putpixel
  289.         xchg    esi, edi
  290.         pop     ecx
  291.         jmp     .drawPicture
  292.  
  293. @@:
  294.         pop     edi
  295.         mov     ecx, [esp]
  296.         add     edi, [esp+4]
  297.         inc     ebx
  298.         push    edi
  299.         dec     ebp
  300.         jnz     .drawPicture
  301.         add     esp, 12
  302.         call    kernel_free
  303.         ret
  304.  
  305. ; scaling/smoothing algorithm
  306. drawChar:
  307. ; ebp = font color
  308. ; esi = font multiplier
  309. ; edi -> buffer
  310. ; ebx -> char data
  311.         mov     dl, [ebx]
  312. .raw:
  313.         bsf     eax, edx
  314.         jz      .nextRaw
  315.         imul    eax, esi
  316.         shl     eax, 2
  317.         push    edi
  318.         add     edi, eax
  319.         mov     ecx, esi
  320.         dec     esi
  321.         jnz     .square
  322.         mov     [edi], ebp
  323.         inc     esi
  324.         cmp     [fontSmoothing], 0
  325.         jz      .nextPixel
  326. .checkLeftSM:     ; smoothing
  327.         bsf     eax, edx
  328.         dec     eax
  329.         js      .checkRightSM
  330.         bt      [ebx], eax
  331.         jc      .checkRightSM
  332.         dec     eax
  333.         js      .checkLeftDownSM
  334.         bt      [ebx], eax
  335.         jc      .checkRightSM
  336. .checkLeftDownSM:
  337.         inc     eax
  338.         bt      [ebx+1], eax
  339.         jnc     .checkLeftUpSM
  340.         inc     eax
  341.         bt      [ebx+1], eax
  342.         jnc     @f
  343.         bt      [ebx-1], eax
  344.         jc      .checkRightSM
  345.         dec     eax
  346.         dec     eax
  347.         js      @f
  348.         bt      [ebx+1], eax
  349.         jnc     @f
  350.         inc     eax
  351. .checkLeftUpSM:
  352.         bt      [ebx-1], eax
  353.         jnc     .checkRightSM
  354.         inc     eax
  355.         bt      [ebx-1], eax
  356.         jnc     @f
  357.         bt      [ebx+1], eax
  358.         jc      .checkRightSM
  359.         dec     eax
  360.         dec     eax
  361.         js      @f
  362.         bt      [ebx-1], eax
  363.         jc      .checkRightSM
  364. @@:
  365.         mov     ecx, [esp+20+deltaToScreen]
  366.         mov     eax, [edi-4]
  367.         test    ecx, ecx
  368.         jz      @f
  369.         pusha
  370.         lea     ebx, [edi+ecx-4]
  371.         shr     ebx, 2
  372.         call    syscall_getpixel
  373.         popa
  374. @@:
  375.         push    ebx edx
  376.         mov     ebx, ebp
  377.         xor     ecx, ecx
  378.         cmp     [fontSmoothing], 1
  379.         jnz     .subpixelLeft
  380.         call    antiAliasing
  381.         jmp     @f
  382.  
  383. .subpixelLeft:
  384.         mov     cl, bl
  385.         lea     edx, [ecx*8+ecx]
  386.         lea     edx, [ecx*2+edx]
  387.         mov     cl, al
  388.         lea     ecx, [ecx*4+ecx]
  389.         add     edx, ecx
  390.         shr     edx, 4
  391.         mov     al, dl
  392.  
  393.         xor     ecx, ecx
  394.         mov     cl, ah
  395.         lea     edx, [ecx*8+ecx]
  396.         lea     edx, [ecx*2+edx]
  397.         mov     cl, bh
  398.         lea     ecx, [ecx*4+ecx]
  399.         add     edx, ecx
  400.         shr     edx, 4
  401.         mov     ah, dl
  402.  
  403.         rol     eax, 16
  404.         rol     ebx, 16
  405.         xor     ecx, ecx
  406.         mov     cl, al
  407.         mov     edx, ecx
  408.         shl     ecx, 3
  409.         sub     ecx, edx
  410.         mov     dl, bl
  411.         add     ecx, edx
  412.         shr     ecx, 3
  413.         mov     al, cl
  414.         rol     eax, 16
  415. @@:
  416.         mov     [edi-4], eax
  417.         pop     edx ebx
  418. .checkRightSM:
  419.         bsf     eax, edx
  420.         inc     eax
  421.         bt      [ebx], eax
  422.         jc      .nextPixel
  423.         inc     eax
  424.         bt      [ebx], eax
  425.         jc      .nextPixel
  426.         dec     eax
  427. .checkRightDownSM:
  428.         bt      [ebx+1], eax
  429.         jnc     .checkRightUpSM
  430.         dec     eax
  431.         bt      [ebx+1], eax
  432.         jnc     @f
  433.         bt      [ebx-1], eax
  434.         jc      .nextPixel
  435.         inc     eax
  436.         inc     eax
  437.         bt      [ebx+1], eax
  438.         jnc     @f
  439.         dec     eax
  440. .checkRightUpSM:
  441.         bt      [ebx-1], eax
  442.         jnc     .nextPixel
  443.         dec     eax
  444.         bt      [ebx-1], eax
  445.         jnc     @f
  446.         bt      [ebx+1], eax
  447.         jc      .nextPixel
  448.         inc     eax
  449.         inc     eax
  450.         bt      [ebx-1], eax
  451.         jc      .nextPixel
  452. @@:
  453.         mov     ecx, [esp+20+deltaToScreen]
  454.         mov     eax, [edi+4]
  455.         test    ecx, ecx
  456.         jz      @f
  457.         pusha
  458.         lea     ebx, [edi+ecx+4]
  459.         shr     ebx, 2
  460.         call    syscall_getpixel
  461.         popa
  462. @@:
  463.         push    ebx edx
  464.         mov     ebx, ebp
  465.         xor     ecx, ecx
  466.         cmp     [fontSmoothing], 1
  467.         jnz     .subpixelRight
  468.         call    antiAliasing
  469.         jmp     @f
  470.  
  471. .subpixelRight:
  472.         mov     cl, al
  473.         mov     edx, ecx
  474.         shl     ecx, 3
  475.         sub     ecx, edx
  476.         mov     dl, bl
  477.         add     ecx, edx
  478.         shr     ecx, 3
  479.         mov     al, cl
  480.  
  481.         xor     ecx, ecx
  482.         mov     cl, ah
  483.         lea     edx, [ecx*8+ecx]
  484.         lea     edx, [ecx*2+edx]
  485.         mov     cl, bh
  486.         lea     ecx, [ecx*4+ecx]
  487.         add     edx, ecx
  488.         shr     edx, 4
  489.         mov     ah, dl
  490.  
  491.         rol     ebx, 16
  492.         rol     eax, 16
  493.         xor     ecx, ecx
  494.         mov     cl, bl
  495.         lea     edx, [ecx*8+ecx]
  496.         lea     edx, [ecx*2+edx]
  497.         mov     cl, al
  498.         lea     ecx, [ecx*4+ecx]
  499.         add     edx, ecx
  500.         shr     edx, 4
  501.         mov     al, dl
  502.         rol     eax, 16
  503. @@:
  504.         mov     [edi+4], eax
  505.         pop     edx ebx
  506.         jmp     .nextPixel
  507.  
  508. .square:    ; scaling
  509.         mov     eax, esi
  510. @@:
  511.         mov     [edi+eax*4], ebp
  512.         dec     eax
  513.         jns     @b
  514.         add     edi, [esp+20+widthX]
  515.         dec     ecx
  516.         jnz     .square
  517.         inc     esi
  518.         mov     edi, [esp]
  519. .checkLeft:
  520.         bsf     eax, edx
  521.         dec     eax
  522.         js      .checkRight
  523.         bt      [ebx], eax
  524.         jc      .checkRight
  525. .checkLeftDown:
  526.         bt      [ebx+1], eax
  527.         jnc     .checkLeftUp
  528.         mov     ecx, eax
  529.         inc     eax
  530.         bt      [ebx+1], eax
  531.         jc      @f
  532.         bt      [ebx-1], eax
  533.         jnc     .downRightLow
  534.         bt      [ebx-2], eax
  535.         jc      .downRightLow
  536.         dec     eax
  537.         bt      [ebx-1], eax
  538.         jc      .downRightLow
  539.         dec     eax
  540.         js      .downRightHigh
  541.         bt      [ebx-2], eax
  542.         jc      .downRightLow
  543.         jmp     .downRightHigh
  544.  
  545. @@:
  546.         bt      [ebx-1], eax
  547.         jc      .checkLeftUp
  548.         dec     eax
  549.         dec     eax
  550.         js      .downRightLow
  551.         bt      [ebx+1], eax
  552.         jc      .checkLeftUp
  553. .downRightLow:
  554.         imul    ecx, esi
  555.         shl     ecx, 2
  556.         add     edi, ecx
  557.         dec     esi
  558.         mov     eax, [esp+20+widthX]
  559.         imul    eax, esi
  560.         add     edi, eax
  561.         add     edi, 4
  562.         mov     ecx, esi
  563.         dec     ecx
  564. .drawDownRight:
  565.         mov     eax, ecx
  566. @@:
  567.         mov     [edi+eax*4], ebp
  568.         dec     eax
  569.         jns     @b
  570.         sub     edi, [esp+20+widthX]
  571.         add     edi, 4
  572.         dec     ecx
  573.         jns     .drawDownRight
  574.         inc     esi
  575.         mov     edi, [esp]
  576.         jmp     .checkLeftUp
  577.  
  578. .downRightHigh:
  579.         imul    ecx, esi
  580.         shl     ecx, 2
  581.         add     edi, ecx
  582.         dec     esi
  583.         mov     eax, [esp+20+widthX]
  584.         imul    eax, esi
  585.         add     edi, eax
  586.         add     edi, 4
  587.         mov     ecx, esi
  588.         dec     ecx
  589. .drawDownRightHigh:
  590.         mov     eax, ecx
  591. @@:
  592.         mov     [edi+eax*4], ebp
  593.         dec     eax
  594.         jns     @b
  595.         sub     edi, [esp+20+widthX]
  596.         mov     eax, ecx
  597. @@:
  598.         mov     [edi+eax*4], ebp
  599.         dec     eax
  600.         jns     @b
  601.         sub     edi, [esp+20+widthX]
  602.         add     edi, 4
  603.         dec     ecx
  604.         jns     .drawDownRightHigh
  605.         inc     esi
  606.         mov     edi, [esp]
  607. .checkLeftUp:
  608.         bsf     eax, edx
  609.         dec     eax
  610.         bt      [ebx-1], eax
  611.         jnc     .checkRight
  612.         mov     ecx, eax
  613.         inc     eax
  614.         bt      [ebx-1], eax
  615.         jc      @f
  616.         bt      [ebx+1], eax
  617.         jnc     .upRightLow
  618.         bt      [ebx+2], eax
  619.         jc      .upRightLow
  620.         dec     eax
  621.         bt      [ebx+1], eax
  622.         jc      .upRightLow
  623.         dec     eax
  624.         js      .upRightHigh
  625.         bt      [ebx+2], eax
  626.         jc      .upRightLow
  627.         jmp     .upRightHigh
  628.  
  629. @@:
  630.         bt      [ebx+1], eax
  631.         jc      .checkRight
  632.         dec     eax
  633.         dec     eax
  634.         js      .upRightLow
  635.         bt      [ebx-1], eax
  636.         jc      .checkRight
  637. .upRightLow:
  638.         imul    ecx, esi
  639.         shl     ecx, 2
  640.         add     edi, ecx
  641.         add     edi, 4
  642.         mov     ecx, esi
  643.         dec     ecx
  644.         dec     ecx
  645. .drawUpRight:
  646.         mov     eax, ecx
  647. @@:
  648.         mov     [edi+eax*4], ebp
  649.         dec     eax
  650.         jns     @b
  651.         add     edi, [esp+20+widthX]
  652.         add     edi, 4
  653.         dec     ecx
  654.         jns     .drawUpRight
  655.         mov     edi, [esp]
  656.         jmp     .checkRight
  657.  
  658. .upRightHigh:
  659.         imul    ecx, esi
  660.         shl     ecx, 2
  661.         add     edi, ecx
  662.         add     edi, 4
  663.         mov     ecx, esi
  664.         dec     ecx
  665.         dec     ecx
  666. .drawUpRightHigh:
  667.         mov     eax, ecx
  668. @@:
  669.         mov     [edi+eax*4], ebp
  670.         dec     eax
  671.         jns     @b
  672.         add     edi, [esp+20+widthX]
  673.         mov     eax, ecx
  674. @@:
  675.         mov     [edi+eax*4], ebp
  676.         dec     eax
  677.         jns     @b
  678.         add     edi, [esp+20+widthX]
  679.         add     edi, 4
  680.         dec     ecx
  681.         jns     .drawUpRightHigh
  682.         mov     edi, [esp]
  683. .checkRight:
  684.         bsf     eax, edx
  685.         inc     eax
  686.         bt      [ebx], eax
  687.         jc      .nextPixel
  688. .checkRightDown:
  689.         bt      [ebx+1], eax
  690.         jnc     .checkRightUp
  691.         mov     ecx, eax
  692.         dec     eax
  693.         bt      [ebx+1], eax
  694.         jc      @f
  695.         bt      [ebx-1], eax
  696.         jnc     .downLeftLow
  697.         bt      [ebx-2], eax
  698.         jc      .downLeftLow
  699.         inc     eax
  700.         bt      [ebx-1], eax
  701.         jc      .downLeftLow
  702.         inc     eax
  703.         bt      [ebx-2], eax
  704.         jc      .downLeftLow
  705.         jmp     .downLeftHigh
  706.  
  707. @@:
  708.         bt      [ebx-1], eax
  709.         jc      .checkRightUp
  710.         inc     eax
  711.         inc     eax
  712.         bt      [ebx+1], eax
  713.         jc      .checkRightUp
  714. .downLeftLow:
  715.         imul    ecx, esi
  716.         shl     ecx, 2
  717.         add     edi, ecx
  718.         dec     esi
  719.         mov     eax, [esp+20+widthX]
  720.         imul    eax, esi
  721.         add     edi, eax
  722.         mov     ecx, esi
  723.         dec     ecx
  724. .drawDownLeft:
  725.         mov     eax, ecx
  726. @@:
  727.         mov     [edi+eax*4], ebp
  728.         dec     eax
  729.         jns     @b
  730.         sub     edi, [esp+20+widthX]
  731.         dec     ecx
  732.         jns     .drawDownLeft
  733.         inc     esi
  734.         mov     edi, [esp]
  735.         jmp     .checkRightUp
  736.  
  737. .downLeftHigh:
  738.         imul    ecx, esi
  739.         shl     ecx, 2
  740.         add     edi, ecx
  741.         dec     esi
  742.         mov     eax, [esp+20+widthX]
  743.         imul    eax, esi
  744.         add     edi, eax
  745.         mov     ecx, esi
  746.         dec     ecx
  747. .drawDownLeftHigh:
  748.         mov     eax, ecx
  749. @@:
  750.         mov     [edi+eax*4], ebp
  751.         dec     eax
  752.         jns     @b
  753.         sub     edi, [esp+20+widthX]
  754.         mov     eax, ecx
  755. @@:
  756.         mov     [edi+eax*4], ebp
  757.         dec     eax
  758.         jns     @b
  759.         sub     edi, [esp+20+widthX]
  760.         dec     ecx
  761.         jns     .drawDownLeftHigh
  762.         inc     esi
  763.         mov     edi, [esp]
  764. .checkRightUp:
  765.         bsf     eax, edx
  766.         inc     eax
  767.         bt      [ebx-1], eax
  768.         jnc     .nextPixel
  769.         mov     ecx, eax
  770.         dec     eax
  771.         bt      [ebx-1], eax
  772.         jc      @f
  773.         bt      [ebx+1], eax
  774.         jnc     .upLeftLow
  775.         bt      [ebx+2], eax
  776.         jc      .upLeftLow
  777.         inc     eax
  778.         bt      [ebx+1], eax
  779.         jc      .upLeftLow
  780.         inc     eax
  781.         bt      [ebx+2], eax
  782.         jc      .upLeftLow
  783.         jmp     .upLeftHigh
  784.  
  785. @@:
  786.         bt      [ebx+1], eax
  787.         jc      .nextPixel
  788.         inc     eax
  789.         inc     eax
  790.         bt      [ebx-1], eax
  791.         jc      .nextPixel
  792. .upLeftLow:
  793.         imul    ecx, esi
  794.         shl     ecx, 2
  795.         add     edi, ecx
  796.         mov     ecx, esi
  797.         dec     ecx
  798.         dec     ecx
  799. .drawUpLeft:
  800.         mov     eax, ecx
  801. @@:
  802.         mov     [edi+eax*4], ebp
  803.         dec     eax
  804.         jns     @b
  805.         add     edi, [esp+20+widthX]
  806.         dec     ecx
  807.         jns     .drawUpLeft
  808.         jmp     .nextPixel
  809.  
  810. .upLeftHigh:
  811.         imul    ecx, esi
  812.         shl     ecx, 2
  813.         add     edi, ecx
  814.         mov     ecx, esi
  815.         dec     ecx
  816.         dec     ecx
  817. .drawUpLeftHigh:
  818.         mov     eax, ecx
  819. @@:
  820.         mov     [edi+eax*4], ebp
  821.         dec     eax
  822.         jns     @b
  823.         add     edi, [esp+20+widthX]
  824.         mov     eax, ecx
  825. @@:
  826.         mov     [edi+eax*4], ebp
  827.         dec     eax
  828.         jns     @b
  829.         add     edi, [esp+20+widthX]
  830.         dec     ecx
  831.         jns     .drawUpLeftHigh
  832. .nextPixel:
  833.         bsf     eax, edx
  834.         btr     edx, eax
  835.         pop     edi
  836.         jmp     .raw
  837.  
  838. .nextRaw:
  839.         inc     ebx
  840.         mov     eax, [esp+16+widthX]
  841.         imul    eax, esi
  842.         add     edi, eax
  843.         dec     dword [esp+4]
  844.         jnz     drawChar
  845.         ret
  846.  
  847. antiAliasing:
  848.         mov     bp, 3
  849. @@:
  850.         mov     cl, al
  851.         mov     dl, bl
  852.         lea     ecx, [ecx*2+ecx]
  853.         add     ecx, edx
  854.         shr     ecx, 2
  855.         mov     al, cl
  856.         ror     eax, 8
  857.         ror     ebx, 8
  858.         dec     bp
  859.         jnz     @b
  860.         ror     eax, 8
  861.         ror     ebx, 8
  862.         mov     ebp, ebx
  863.         ret
  864.  
  865. iglobal
  866. fontSmoothing   db  2   ; = 0, 1 or 2
  867. fontSize        db  0   ; user mode setting
  868. font1:
  869.   if lang eq sp
  870.   file 'gui/char_sp.mt'
  871.   else if lang eq et
  872.   file 'gui/char_et.mt'
  873.   else
  874.   file 'gui/char.mt'
  875.   end if
  876. fontUni:
  877. file 'gui/charUni.mt'
  878. endg
  879.