Subversion Repositories Kolibri OS

Rev

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