Subversion Repositories Kolibri OS

Rev

Rev 6899 | Rev 7103 | 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: 6900 $
  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.         and     eax, 0xFFFFFF
  24.         bt      ecx, 30
  25.         jc      @f
  26.         xor     eax, eax
  27.         dec     eax
  28. @@:
  29.         pushd   0 0 0 eax
  30.         movsx   eax, bx
  31.         sar     ebx, 16
  32.         push    eax ebx edi
  33.         bt      ecx, 27
  34.         jc      .redirect
  35.         mov     ebp, [_display.width]
  36.         xor     edi, edi
  37.         jmp     @f
  38.  
  39. .ret:
  40.         add     esp, 28
  41.         ret
  42.  
  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.         mov     eax, [esp+8]
  94.         shr     eax, 2
  95.         sub     eax, [esp+16]
  96.         shr     eax, 3
  97.         xor     edx, edx
  98.         div     dword[esp+4]
  99.         mov     ecx, [esp]
  100.         cmp     eax, ecx
  101.         jnc     @f
  102.         mov     [esp], eax
  103. @@:
  104.         xor     edx, edx
  105.         bt      ebx, 29
  106.         jc      @f
  107.         bt      ebx, 28
  108.         jc      .draw866toUni
  109.         shl     eax, 3
  110.         mov     bx, 6
  111.         div     bx
  112.         xor     edx, edx
  113.         inc     eax
  114.         mov     [esp], ecx
  115.         cmp     eax, ecx
  116.         jnc     .draw866
  117.         mov     [esp], eax
  118.         jmp     .draw866
  119.  
  120. @@:
  121.         bt      ebx, 28
  122.         jc      .drawUTF8
  123.  
  124. ; ebp = font color
  125. ; esi -> string
  126. ; edi -> buffer
  127.  
  128. ; Stack map:
  129. ; char counter +0
  130. fontMultiplier = 4
  131. widthX = 8
  132. ; edi +12
  133. ; X +16
  134. ; Y +20
  135. ; background +24
  136. deltaToScreen = 28
  137. ; temp buffer height +32
  138. ; temp buffer pointer +36
  139.  
  140. .drawUTF16:
  141.         dec     dword [esp]
  142.         js      .done
  143.         movzx   ebx, word [esi]
  144.         test    ebx, ebx
  145.         jz      .done
  146.         inc     esi
  147.         inc     esi
  148.         cmp     bx, 1419
  149.         jc      @f
  150.         xor     ebx, ebx
  151. @@:
  152.         pushd   esi edi 16
  153.         shl     ebx, 4
  154.         add     ebx, fontUni
  155.         mov     esi, [esp+12+fontMultiplier]
  156.         call    drawChar
  157.         imul    esi, 8*4
  158.         pop     edi
  159.         pop     edi
  160.         add     edi, esi
  161.         pop     esi
  162.         jmp     .drawUTF16
  163.  
  164. .drawUTF8:
  165.         dec     dword [esp]
  166.         js      .done
  167.         xor     eax, eax
  168.         call    utf8to16
  169.         test    eax, eax
  170.         jz      .done
  171.         cmp     eax, 1419
  172.         jc      @f
  173.         xor     eax, eax
  174. @@:
  175.         shl     eax, 4
  176.         lea     ebx, [eax+fontUni]
  177.         pushd   esi edi 16
  178.         mov     esi, [esp+12+fontMultiplier]
  179.         call    drawChar
  180.         imul    esi, 8*4
  181.         pop     edi
  182.         pop     edi
  183.         add     edi, esi
  184.         pop     esi
  185.         jmp     .drawUTF8
  186.  
  187. .draw866:
  188.         dec     dword [esp]
  189.         js      .done
  190.         movzx   ebx, byte [esi]
  191.         test    ebx, ebx
  192.         jz      .done
  193.         inc     esi
  194.         pushd   esi edi 9
  195.         lea     ebx, [ebx*8+ebx+font1]
  196.         mov     esi, [esp+12+fontMultiplier]
  197.         call    drawChar
  198.         imul    esi, 6*4
  199.         pop     edi
  200.         pop     edi
  201.         add     edi, esi
  202.         pop     esi
  203.         jmp     .draw866
  204.  
  205. .draw866toUni:
  206.         dec     dword [esp]
  207.         js      .done
  208.         movzx   eax, byte [esi]
  209.         test    eax, eax
  210.         jz      .done
  211.         call    ansi2uni_char
  212.         shl     eax, 4
  213.         lea     ebx, [eax+fontUni]
  214.         inc     esi
  215.         pushd   esi edi 16
  216.         mov     esi, [esp+12+fontMultiplier]
  217.         call    drawChar
  218.         imul    esi, 8*4
  219.         pop     edi
  220.         pop     edi
  221.         add     edi, esi
  222.         pop     esi
  223.         jmp     .draw866toUni
  224.  
  225. .done:
  226.         mov     ecx, edi
  227.         pop     eax eax eax esi edx ebx ebp ebp ebp
  228.         mov     edi, [esp]
  229.         test    edi, edi
  230.         jnz     @f
  231.         pop     eax
  232.         ret
  233.  
  234. @@: ; redraw from buffer to screen
  235.         push    eax
  236.         sub     ecx, edi
  237.         shr     ecx, 2
  238.         add     edx, ecx
  239.         inc     ecx
  240.         push    ecx
  241.         push    edi
  242. .drawPicture:
  243.         mov     eax, -1
  244.         repz scasd
  245.         jecxz   @f
  246.         mov     eax, edx
  247.         sub     eax, ecx
  248.         push    ecx
  249.         mov     ecx, [edi-4]
  250.         xchg    esi, edi
  251.         call    __sys_putpixel
  252.         xchg    esi, edi
  253.         pop     ecx
  254.         jmp     .drawPicture
  255.  
  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.  
  346. .subpixelLeft:
  347.         mov     cl, bl
  348.         lea     edx, [ecx*8+ecx]
  349.         lea     edx, [ecx*2+edx]
  350.         mov     cl, al
  351.         lea     ecx, [ecx*4+ecx]
  352.         add     edx, ecx
  353.         shr     edx, 4
  354.         mov     al, dl
  355.  
  356.         xor     ecx, ecx
  357.         mov     cl, ah
  358.         lea     edx, [ecx*8+ecx]
  359.         lea     edx, [ecx*2+edx]
  360.         mov     cl, bh
  361.         lea     ecx, [ecx*4+ecx]
  362.         add     edx, ecx
  363.         shr     edx, 4
  364.         mov     ah, dl
  365.  
  366.         rol     eax, 16
  367.         rol     ebx, 16
  368.         xor     ecx, ecx
  369.         mov     cl, al
  370.         mov     edx, ecx
  371.         shl     ecx, 3
  372.         sub     ecx, edx
  373.         mov     dl, bl
  374.         add     ecx, edx
  375.         shr     ecx, 3
  376.         mov     al, cl
  377.         rol     eax, 16
  378. @@:
  379.         mov     [edi-4], eax
  380.         pop     edx ebx
  381. .checkRightSM:
  382.         bsf     eax, edx
  383.         inc     eax
  384.         bt      [ebx], eax
  385.         jc      .nextPixel
  386.         inc     eax
  387.         bt      [ebx], eax
  388.         jc      .nextPixel
  389.         dec     eax
  390. .checkRightDownSM:
  391.         bt      [ebx+1], eax
  392.         jnc     .checkRightUpSM
  393.         dec     eax
  394.         bt      [ebx+1], eax
  395.         jnc     @f
  396.         bt      [ebx-1], eax
  397.         jc      .nextPixel
  398.         inc     eax
  399.         inc     eax
  400.         bt      [ebx+1], eax
  401.         jnc     @f
  402.         dec     eax
  403. .checkRightUpSM:
  404.         bt      [ebx-1], eax
  405.         jnc     .nextPixel
  406.         dec     eax
  407.         bt      [ebx-1], eax
  408.         jnc     @f
  409.         bt      [ebx+1], eax
  410.         jc      .nextPixel
  411.         inc     eax
  412.         inc     eax
  413.         bt      [ebx-1], eax
  414.         jc      .nextPixel
  415. @@:
  416.         mov     ecx, [esp+20+deltaToScreen]
  417.         mov     eax, [edi+4]
  418.         test    ecx, ecx
  419.         jz      @f
  420.         pusha
  421.         lea     ebx, [edi+ecx+4]
  422.         shr     ebx, 2
  423.         call    syscall_getpixel
  424.         popa
  425. @@:
  426.         push    ebx edx
  427.         mov     ebx, ebp
  428.         xor     ecx, ecx
  429.         cmp     [fontSmoothing], 1
  430.         jnz     .subpixelRight
  431.         call    antiAliasing
  432.         jmp     @f
  433.  
  434. .subpixelRight:
  435.         mov     cl, al
  436.         mov     edx, ecx
  437.         shl     ecx, 3
  438.         sub     ecx, edx
  439.         mov     dl, bl
  440.         add     ecx, edx
  441.         shr     ecx, 3
  442.         mov     al, cl
  443.  
  444.         xor     ecx, ecx
  445.         mov     cl, ah
  446.         lea     edx, [ecx*8+ecx]
  447.         lea     edx, [ecx*2+edx]
  448.         mov     cl, bh
  449.         lea     ecx, [ecx*4+ecx]
  450.         add     edx, ecx
  451.         shr     edx, 4
  452.         mov     ah, dl
  453.  
  454.         rol     ebx, 16
  455.         rol     eax, 16
  456.         xor     ecx, ecx
  457.         mov     cl, bl
  458.         lea     edx, [ecx*8+ecx]
  459.         lea     edx, [ecx*2+edx]
  460.         mov     cl, al
  461.         lea     ecx, [ecx*4+ecx]
  462.         add     edx, ecx
  463.         shr     edx, 4
  464.         mov     al, dl
  465.         rol     eax, 16
  466. @@:
  467.         mov     [edi+4], eax
  468.         pop     edx ebx
  469.         jmp     .nextPixel
  470.  
  471. .square:    ; scaling
  472.         mov     eax, esi
  473. @@:
  474.         mov     [edi+eax*4], ebp
  475.         dec     eax
  476.         jns     @b
  477.         add     edi, [esp+20+widthX]
  478.         dec     ecx
  479.         jnz     .square
  480.         inc     esi
  481.         mov     edi, [esp]
  482. .checkLeft:
  483.         bsf     eax, edx
  484.         dec     eax
  485.         js      .checkRight
  486.         bt      [ebx], eax
  487.         jc      .checkRight
  488. .checkLeftDown:
  489.         bt      [ebx+1], eax
  490.         jnc     .checkLeftUp
  491.         mov     ecx, eax
  492.         inc     eax
  493.         bt      [ebx+1], eax
  494.         jc      @f
  495.         bt      [ebx-1], eax
  496.         jnc     .downRightLow
  497.         bt      [ebx-2], eax
  498.         jc      .downRightLow
  499.         dec     eax
  500.         bt      [ebx-1], eax
  501.         jc      .downRightLow
  502.         dec     eax
  503.         js      .downRightHigh
  504.         bt      [ebx-2], eax
  505.         jc      .downRightLow
  506.         jmp     .downRightHigh
  507.  
  508. @@:
  509.         bt      [ebx-1], eax
  510.         jc      .checkLeftUp
  511.         dec     eax
  512.         dec     eax
  513.         js      .downRightLow
  514.         bt      [ebx+1], eax
  515.         jc      .checkLeftUp
  516. .downRightLow:
  517.         imul    ecx, esi
  518.         shl     ecx, 2
  519.         add     edi, ecx
  520.         dec     esi
  521.         mov     eax, [esp+20+widthX]
  522.         imul    eax, esi
  523.         add     edi, eax
  524.         add     edi, 4
  525.         mov     ecx, esi
  526.         dec     ecx
  527. .drawDownRight:
  528.         mov     eax, ecx
  529. @@:
  530.         mov     [edi+eax*4], ebp
  531.         dec     eax
  532.         jns     @b
  533.         sub     edi, [esp+20+widthX]
  534.         add     edi, 4
  535.         dec     ecx
  536.         jns     .drawDownRight
  537.         inc     esi
  538.         mov     edi, [esp]
  539.         jmp     .checkLeftUp
  540.  
  541. .downRightHigh:
  542.         imul    ecx, esi
  543.         shl     ecx, 2
  544.         add     edi, ecx
  545.         dec     esi
  546.         mov     eax, [esp+20+widthX]
  547.         imul    eax, esi
  548.         add     edi, eax
  549.         add     edi, 4
  550.         mov     ecx, esi
  551.         dec     ecx
  552. .drawDownRightHigh:
  553.         mov     eax, ecx
  554. @@:
  555.         mov     [edi+eax*4], ebp
  556.         dec     eax
  557.         jns     @b
  558.         sub     edi, [esp+20+widthX]
  559.         mov     eax, ecx
  560. @@:
  561.         mov     [edi+eax*4], ebp
  562.         dec     eax
  563.         jns     @b
  564.         sub     edi, [esp+20+widthX]
  565.         add     edi, 4
  566.         dec     ecx
  567.         jns     .drawDownRightHigh
  568.         inc     esi
  569.         mov     edi, [esp]
  570. .checkLeftUp:
  571.         bsf     eax, edx
  572.         dec     eax
  573.         bt      [ebx-1], eax
  574.         jnc     .checkRight
  575.         mov     ecx, eax
  576.         inc     eax
  577.         bt      [ebx-1], eax
  578.         jc      @f
  579.         bt      [ebx+1], eax
  580.         jnc     .upRightLow
  581.         bt      [ebx+2], eax
  582.         jc      .upRightLow
  583.         dec     eax
  584.         bt      [ebx+1], eax
  585.         jc      .upRightLow
  586.         dec     eax
  587.         js      .upRightHigh
  588.         bt      [ebx+2], eax
  589.         jc      .upRightLow
  590.         jmp     .upRightHigh
  591.  
  592. @@:
  593.         bt      [ebx+1], eax
  594.         jc      .checkRight
  595.         dec     eax
  596.         dec     eax
  597.         js      .upRightLow
  598.         bt      [ebx-1], eax
  599.         jc      .checkRight
  600. .upRightLow:
  601.         imul    ecx, esi
  602.         shl     ecx, 2
  603.         add     edi, ecx
  604.         add     edi, 4
  605.         mov     ecx, esi
  606.         dec     ecx
  607.         dec     ecx
  608. .drawUpRight:
  609.         mov     eax, ecx
  610. @@:
  611.         mov     [edi+eax*4], ebp
  612.         dec     eax
  613.         jns     @b
  614.         add     edi, [esp+20+widthX]
  615.         add     edi, 4
  616.         dec     ecx
  617.         jns     .drawUpRight
  618.         mov     edi, [esp]
  619.         jmp     .checkRight
  620.  
  621. .upRightHigh:
  622.         imul    ecx, esi
  623.         shl     ecx, 2
  624.         add     edi, ecx
  625.         add     edi, 4
  626.         mov     ecx, esi
  627.         dec     ecx
  628.         dec     ecx
  629. .drawUpRightHigh:
  630.         mov     eax, ecx
  631. @@:
  632.         mov     [edi+eax*4], ebp
  633.         dec     eax
  634.         jns     @b
  635.         add     edi, [esp+20+widthX]
  636.         mov     eax, ecx
  637. @@:
  638.         mov     [edi+eax*4], ebp
  639.         dec     eax
  640.         jns     @b
  641.         add     edi, [esp+20+widthX]
  642.         add     edi, 4
  643.         dec     ecx
  644.         jns     .drawUpRightHigh
  645.         mov     edi, [esp]
  646. .checkRight:
  647.         bsf     eax, edx
  648.         inc     eax
  649.         bt      [ebx], eax
  650.         jc      .nextPixel
  651. .checkRightDown:
  652.         bt      [ebx+1], eax
  653.         jnc     .checkRightUp
  654.         mov     ecx, eax
  655.         dec     eax
  656.         bt      [ebx+1], eax
  657.         jc      @f
  658.         bt      [ebx-1], eax
  659.         jnc     .downLeftLow
  660.         bt      [ebx-2], eax
  661.         jc      .downLeftLow
  662.         inc     eax
  663.         bt      [ebx-1], eax
  664.         jc      .downLeftLow
  665.         inc     eax
  666.         bt      [ebx-2], eax
  667.         jc      .downLeftLow
  668.         jmp     .downLeftHigh
  669.  
  670. @@:
  671.         bt      [ebx-1], eax
  672.         jc      .checkRightUp
  673.         inc     eax
  674.         inc     eax
  675.         bt      [ebx+1], eax
  676.         jc      .checkRightUp
  677. .downLeftLow:
  678.         imul    ecx, esi
  679.         shl     ecx, 2
  680.         add     edi, ecx
  681.         dec     esi
  682.         mov     eax, [esp+20+widthX]
  683.         imul    eax, esi
  684.         add     edi, eax
  685.         mov     ecx, esi
  686.         dec     ecx
  687. .drawDownLeft:
  688.         mov     eax, ecx
  689. @@:
  690.         mov     [edi+eax*4], ebp
  691.         dec     eax
  692.         jns     @b
  693.         sub     edi, [esp+20+widthX]
  694.         dec     ecx
  695.         jns     .drawDownLeft
  696.         inc     esi
  697.         mov     edi, [esp]
  698.         jmp     .checkRightUp
  699.  
  700. .downLeftHigh:
  701.         imul    ecx, esi
  702.         shl     ecx, 2
  703.         add     edi, ecx
  704.         dec     esi
  705.         mov     eax, [esp+20+widthX]
  706.         imul    eax, esi
  707.         add     edi, eax
  708.         mov     ecx, esi
  709.         dec     ecx
  710. .drawDownLeftHigh:
  711.         mov     eax, ecx
  712. @@:
  713.         mov     [edi+eax*4], ebp
  714.         dec     eax
  715.         jns     @b
  716.         sub     edi, [esp+20+widthX]
  717.         mov     eax, ecx
  718. @@:
  719.         mov     [edi+eax*4], ebp
  720.         dec     eax
  721.         jns     @b
  722.         sub     edi, [esp+20+widthX]
  723.         dec     ecx
  724.         jns     .drawDownLeftHigh
  725.         inc     esi
  726.         mov     edi, [esp]
  727. .checkRightUp:
  728.         bsf     eax, edx
  729.         inc     eax
  730.         bt      [ebx-1], eax
  731.         jnc     .nextPixel
  732.         mov     ecx, eax
  733.         dec     eax
  734.         bt      [ebx-1], eax
  735.         jc      @f
  736.         bt      [ebx+1], eax
  737.         jnc     .upLeftLow
  738.         bt      [ebx+2], eax
  739.         jc      .upLeftLow
  740.         inc     eax
  741.         bt      [ebx+1], eax
  742.         jc      .upLeftLow
  743.         inc     eax
  744.         bt      [ebx+2], eax
  745.         jc      .upLeftLow
  746.         jmp     .upLeftHigh
  747.  
  748. @@:
  749.         bt      [ebx+1], eax
  750.         jc      .nextPixel
  751.         inc     eax
  752.         inc     eax
  753.         bt      [ebx-1], eax
  754.         jc      .nextPixel
  755. .upLeftLow:
  756.         imul    ecx, esi
  757.         shl     ecx, 2
  758.         add     edi, ecx
  759.         mov     ecx, esi
  760.         dec     ecx
  761.         dec     ecx
  762. .drawUpLeft:
  763.         mov     eax, ecx
  764. @@:
  765.         mov     [edi+eax*4], ebp
  766.         dec     eax
  767.         jns     @b
  768.         add     edi, [esp+20+widthX]
  769.         dec     ecx
  770.         jns     .drawUpLeft
  771.         jmp     .nextPixel
  772.  
  773. .upLeftHigh:
  774.         imul    ecx, esi
  775.         shl     ecx, 2
  776.         add     edi, ecx
  777.         mov     ecx, esi
  778.         dec     ecx
  779.         dec     ecx
  780. .drawUpLeftHigh:
  781.         mov     eax, ecx
  782. @@:
  783.         mov     [edi+eax*4], ebp
  784.         dec     eax
  785.         jns     @b
  786.         add     edi, [esp+20+widthX]
  787.         mov     eax, ecx
  788. @@:
  789.         mov     [edi+eax*4], ebp
  790.         dec     eax
  791.         jns     @b
  792.         add     edi, [esp+20+widthX]
  793.         dec     ecx
  794.         jns     .drawUpLeftHigh
  795. .nextPixel:
  796.         bsf     eax, edx
  797.         btr     edx, eax
  798.         pop     edi
  799.         jmp     .raw
  800.  
  801. .nextRaw:
  802.         inc     ebx
  803.         mov     eax, [esp+16+widthX]
  804.         imul    eax, esi
  805.         add     edi, eax
  806.         dec     dword [esp+4]
  807.         jnz     drawChar
  808.         ret
  809.  
  810. antiAliasing:
  811.         mov     bp, 3
  812. @@:
  813.         mov     cl, al
  814.         mov     dl, bl
  815.         lea     ecx, [ecx*2+ecx]
  816.         add     ecx, edx
  817.         shr     ecx, 2
  818.         mov     al, cl
  819.         ror     eax, 8
  820.         ror     ebx, 8
  821.         dec     bp
  822.         jnz     @b
  823.         ror     eax, 8
  824.         ror     ebx, 8
  825.         mov     ebp, ebx
  826.         ret
  827.  
  828. fontSmoothing   db  2   ; = 0, 1 or 2
  829. fontSize        db  0   ; user mode setting
  830. font1:
  831.   if lang eq sp
  832.   file 'char_sp.mt'
  833.   else if lang eq et
  834.   file 'char_et.mt'
  835.   else
  836.   file 'char.mt'
  837.   end if
  838. fontUni:
  839. file 'charUni.mt'
  840.