Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2011-2022. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 9941 $
  9.  
  10.  
  11. struct  BLITTER_BLOCK
  12.         xmin            dd ?
  13.         ymin            dd ?
  14.         xmax            dd ?
  15.         ymax            dd ?
  16. ends
  17.  
  18.  
  19. struct  BLITTER
  20.         dc              RECT
  21.         sc              RECT
  22.         dst_x           dd ?            ;  32
  23.         dst_y           dd ?            ;  36
  24.         src_x           dd ?            ;  40
  25.         src_y           dd ?            ;  44
  26.         w               dd ?            ;  48
  27.         h               dd ?            ;  52
  28.  
  29.         bitmap          dd ?            ;  56
  30.         stride          dd ?            ;  60
  31. ends
  32.  
  33.  
  34.  
  35. align 4
  36. block_clip:
  37. ;esi= clip RECT ptr
  38. ;edi= RECT ptr
  39. ;return code:
  40. ;CF= 0 - draw, 1 - don't draw
  41.  
  42.         push    ebx
  43.  
  44.         mov     eax, [edi + RECT.left]
  45.         mov     ebx, [edi + RECT.right]
  46.         mov     ecx, [esi + RECT.left]    ;clip.left
  47.         mov     edx, [esi + RECT.right]   ;clip.right
  48.  
  49.         cmp     eax, edx                ;left >= clip.right
  50.         jge     .fail
  51.  
  52.         cmp     ebx, ecx                ;right < clip.left
  53.         jl      .fail
  54.  
  55.         cmp     eax, ecx                ;left >= clip.left
  56.         jge     @F
  57.  
  58.         mov     [edi + RECT.left], ecx
  59. @@:
  60.         cmp     ebx, edx                ;right <= clip.right
  61.         jle     @f
  62.  
  63.         mov     [edi + RECT.right], edx
  64. @@:
  65.         mov     eax, [edi + RECT.top]
  66.         mov     ebx, [edi + RECT.bottom]
  67.         mov     ecx, [esi + RECT.top]     ;clip.top
  68.         mov     edx, [esi + RECT.bottom]  ;clip.bottom
  69.  
  70.         cmp     eax, edx                ;top >= clip.bottom
  71.         jge     .fail
  72.  
  73.         cmp     ebx, ecx                ;bottom < clip.top
  74.         jl      .fail
  75.  
  76.         cmp     eax, ecx                ;top >= clip.top
  77.         jge     @F
  78.  
  79.         mov     [edi + RECT.top], ecx
  80. @@:
  81.         cmp     ebx, edx                ;bottom <= clip.bottom
  82.         jle     @f
  83.  
  84.         mov     [edi + RECT.bottom], edx
  85. @@:
  86.         pop     ebx
  87.         clc
  88.         ret
  89. .fail:
  90.         pop     ebx
  91.         stc
  92.         ret
  93.  
  94.  
  95. align 4
  96. blit_clip:
  97.  
  98. ;return code:
  99. ;CF= 0 - draw, 1 - don't draw
  100.  
  101. .sx0   = 8
  102. .sy0   = 12
  103. .sx1   = 16
  104. .sy1   = 20
  105.  
  106. .dx0   = 24
  107. .dy0   = 28
  108. .dx1   = 32
  109. .dy1   = 36
  110.  
  111.  
  112.         push    edi
  113.         push    esi
  114.         push    ebx
  115.         sub     esp, 40
  116.  
  117.         mov     ebx, ecx
  118.         mov     edx, [ecx + BLITTER.src_x]
  119.         mov     [esp+.sx0], edx
  120.         mov     eax, [ecx + BLITTER.src_y]
  121.         mov     [esp+.sy0], eax
  122.         add     edx, [ecx + BLITTER.w]
  123.         add     eax, [ecx + BLITTER.h]
  124.         mov     [esp + .sx1], edx
  125.         mov     [esp + .sy1], eax
  126.  
  127.         lea     edi, [esp + .sx0]
  128.         lea     esi, [ebx + BLITTER.sc]
  129.  
  130.         call    block_clip
  131.         jc      .done
  132.  
  133.         mov     edi, [esp + .sx0]
  134.         mov     edx, [ebx + BLITTER.dst_x]
  135.         add     edx, edi
  136.         sub     edx, [ebx + BLITTER.src_x]
  137.         mov     [esp + .dx0], edx
  138.  
  139.         mov     ecx, [esp+.sy0]
  140.         mov     eax, [ebx + BLITTER.dst_y]
  141.         add     eax, ecx
  142.         sub     eax, [ebx + BLITTER.src_y]
  143.         mov     [esp + .dy0], eax
  144.  
  145.         sub     edx, edi
  146.         add     edx, [esp + .sx1]
  147.         mov     [esp + .dx1], edx
  148.  
  149.         sub     eax, ecx
  150.         add     eax, [esp + .sy1]
  151.         mov     [esp + .dy1], eax
  152.  
  153.         lea     edi, [esp + .dx0]
  154.         lea     esi, [ebx + BLITTER.dc]
  155.         call    block_clip
  156.         jc      .done
  157.  
  158.         mov     edx, [esp + .dx0]
  159.         mov     eax, [esp + .dx1]
  160.         sub     eax, edx
  161.         mov     [ebx + BLITTER.w], eax
  162.  
  163.         mov     eax, [esp + .dy0]
  164.         mov     ecx, [esp + .dy1]
  165.         sub     ecx, eax
  166.         mov     [ebx + BLITTER.h], ecx
  167.  
  168.         mov     ecx, [ebx + BLITTER.src_x]
  169.         add     ecx, edx
  170.         sub     ecx, [ebx + BLITTER.dst_x]
  171.         mov     [ebx + BLITTER.src_x], ecx
  172.  
  173.         mov     ecx, [ebx + BLITTER.src_y]
  174.         add     ecx, eax
  175.         sub     ecx, [ebx + BLITTER.dst_y]
  176.         mov     [ebx + BLITTER.src_y], ecx
  177.         mov     [ebx + BLITTER.dst_x], edx
  178.         mov     [ebx + BLITTER.dst_y], eax
  179.         clc
  180. .done:
  181.         add     esp, 40
  182.         pop     ebx
  183.         pop     esi
  184.         pop     edi
  185.  
  186.  
  187. purge .sx0
  188. purge .sy0
  189. purge .sx1
  190. purge .sy1
  191.  
  192. purge .dx0
  193. purge .dy0
  194. purge .dx1
  195. purge .dy1
  196.  
  197.         ret
  198.  
  199. align 4
  200. blit_32:
  201.         push    ebp
  202.         push    edi
  203.         push    esi
  204.         push    ebx
  205. virtual at sizeof.BLITTER
  206. .position       dd      ? ; (x shl 16) + y
  207. ; ???
  208. .extra_var1     dd      ?
  209. .flags          dd      ?
  210. .local_vars_size = $
  211. end virtual
  212.         sub     esp, .local_vars_size
  213.        
  214.         mov     [esp + .flags], ebx
  215.  
  216.         mov     eax, [current_slot]
  217.         mov     eax, [eax + APPDATA.window]
  218.         mov     ebx, [eax + WDATA.box.width]
  219.         mov     edx, [eax + WDATA.box.height]
  220.         inc     ebx
  221.         inc     edx
  222.  
  223.         xor     eax, eax
  224.  
  225.         mov     [esp + BLITTER.dc.left], eax
  226.         mov     [esp + BLITTER.dc.top], eax
  227.         mov     [esp + BLITTER.dc.right], ebx
  228.         mov     [esp + BLITTER.dc.bottom], edx
  229.  
  230.         mov     [esp + BLITTER.sc.left], eax
  231.         mov     [esp + BLITTER.sc.top], eax
  232.         mov     eax, [ecx+24]
  233.  
  234.         mov     [esp + BLITTER.sc.right], eax
  235.         mov     eax, [ecx+28]
  236.  
  237.         mov     [esp + BLITTER.sc.bottom], eax
  238.  
  239.         mov     eax, [ecx]
  240.         mov     [esp + BLITTER.dst_x], eax
  241.         mov     eax, [ecx+4]
  242.         mov     [esp + BLITTER.dst_y], eax
  243.  
  244.         mov     eax, [ecx+16]
  245.         mov     [esp + BLITTER.src_x], eax
  246.         mov     eax, [ecx+20]
  247.         mov     [esp + BLITTER.src_y], eax
  248.         mov     eax, [ecx+8]
  249.         mov     [esp + BLITTER.w], eax
  250.         mov     eax, [ecx+12]
  251.         mov     [esp + BLITTER.h], eax
  252.  
  253.  
  254.         mov     eax, [ecx+32]
  255.         mov     [esp + BLITTER.bitmap], eax
  256.         mov     eax, [ecx+36]
  257.         mov     [esp + BLITTER.stride], eax
  258.  
  259.         mov     ecx, esp
  260.         call    blit_clip
  261.         jc      .L57
  262.  
  263.         mov     eax, [current_slot]
  264.         mov     eax, [eax + APPDATA.window]
  265.  
  266.         mov     ebx, [esp + BLITTER.dst_x]
  267.         mov     ebp, [esp + BLITTER.dst_y]
  268.         add     ebx, [eax + WDATA.box.left]
  269.         add     ebp, [eax + WDATA.box.top]
  270.        
  271.         test    [esp + .flags], BLIT_CLIENT_RELATIVE
  272.         jz      .no_client_relative        
  273.  
  274.         add     ebx, [eax + WDATA.clientbox.left]
  275.         add     ebp, [eax + WDATA.clientbox.top]
  276. .no_client_relative:
  277.  
  278.         mov     ecx, ebx
  279.         add     ecx, [esp + BLITTER.w]
  280.         shl     ecx, 16
  281.         mov     cx, bp
  282.         add     ecx, [esp + BLITTER.h]
  283.  
  284.         mov     eax, ebx
  285.         shl     eax, 16
  286.         mov     ax, bp
  287.         mov     [esp + .position], eax
  288.  
  289.         mov     edi, ebp
  290.  
  291. ;        imul    edi, [_display.pitch]
  292.         mov     edi, [BPSLine_calc_area+edi*4]
  293. ;        imul    ebp, [_display.width]
  294.         mov     ebp, [d_width_calc_area+ebp*4]
  295.  
  296.         add     ebp, ebx
  297.         add     ebp, [_display.win_map]
  298.  
  299.         mov     eax, [esp + BLITTER.src_y]
  300.         imul    eax, [esp + BLITTER.stride]
  301.         mov     esi, [esp + BLITTER.src_x]
  302.         lea     esi, [eax + esi*4]
  303.         add     esi, [esp + BLITTER.bitmap]
  304.  
  305.         mov     eax, ecx
  306.         mov     ecx, [esp + BLITTER.h]
  307.         mov     edx, [esp + BLITTER.w]
  308.  
  309.         test    ecx, ecx    ;FIXME check clipping
  310.         jz      .L57
  311.  
  312.         test    edx, edx
  313.         jz      .L57
  314.  
  315.         cmp     [_display.bits_per_pixel], 32
  316.         jne     .core_24
  317.  
  318.         lea     edi, [edi + ebx*4]
  319.  
  320.         mov     ebx, [current_slot_idx]
  321. ; check for hardware cursor
  322.         cmp     [_display.select_cursor], select_cursor
  323.         jne     .core_32.hardware_cursor
  324. ;--------------------------------------
  325. .core_32.software_cursor:
  326. align 4
  327. .outer32:
  328.  
  329. align 4
  330. .inner32:
  331.         cmp     [ebp], bl
  332.         jne     .skip
  333. ;--------------------------------------
  334.         mov     eax, [esi]
  335.  
  336.         mov     ecx, [esp + .position]
  337.  
  338. ; check mouse area for putpixel
  339.         call    [_display.check_mouse]
  340. ;--------------------------------------
  341. ; store to real LFB
  342.         mov     [LFB_BASE + edi], eax
  343. ;--------------------------------------
  344. align 4
  345. .skip:
  346.         add     esi, 4
  347.         add     edi, 4
  348.         inc     ebp
  349.         add     [esp + .position], 1 shl 16
  350.         dec     edx
  351.         jnz     .inner32
  352.  
  353.         add     esi, [esp + BLITTER.stride]
  354.         add     edi, [_display.lfb_pitch]
  355.         add     ebp, [_display.width]
  356.  
  357.         mov     edx, [esp + BLITTER.w]
  358.         mov     eax, edx
  359.         inc     [esp+.position]
  360.         sub     ebp, edx
  361.         shl     eax, 2
  362.         sub     esi, eax
  363.         sub     edi, eax
  364.         shl     eax, 16-2
  365.         sub     [esp + .position], eax
  366.         dec     [esp + BLITTER.h]
  367.         jnz     .outer32
  368.         jmp     .done
  369. .core_32.hardware_cursor:
  370. align 4
  371. .hw.outer32:
  372.         xor     ecx, ecx
  373.  
  374. align 4
  375. .hw.inner32:
  376.         cmp     [ebp + ecx], bl
  377.         jne     .hw.skip
  378.         mov     eax, [esi + ecx*4]
  379.         mov     [LFB_BASE + edi + ecx*4], eax
  380.  
  381. align 4
  382. .hw.skip:
  383.         inc     ecx
  384.         dec     edx
  385.         jnz     .hw.inner32
  386.  
  387.         add     esi, [esp + BLITTER.stride]
  388.         add     edi, [_display.lfb_pitch]
  389.         add     ebp, [_display.width]
  390.  
  391.         mov     edx, [esp + BLITTER.w]
  392.         dec     [esp + BLITTER.h]
  393.         jnz     .hw.outer32
  394.  
  395. .done:
  396. ;        call    [draw_pointer]
  397. ;        call    __sys_draw_pointer
  398. .L57:
  399.         add     esp, .local_vars_size
  400.         pop     ebx
  401.         pop     esi
  402.         pop     edi
  403.         pop     ebp
  404.         ret
  405.  
  406. .core_24:
  407.         cmp     [_display.bits_per_pixel], 24
  408.         jne     .core_16
  409.  
  410.         lea     ebx, [ebx + ebx*2]
  411.         lea     edi, [LFB_BASE + edi + ebx]
  412.         mov     ebx, [current_slot_idx]
  413.  
  414. align 4
  415. .outer24:
  416.         mov     [esp + .extra_var1], edi
  417.         xor     ecx, ecx
  418.  
  419. align 4
  420. .inner24:
  421.         cmp     [ebp + ecx], bl           ; Does the process own this pixel?
  422.         jne     .skip_1
  423. ;--------------------------------------
  424.         push    eax
  425.         mov     eax, [esi + ecx*4]
  426.  
  427.         lea     edi, [edi + ecx*2]
  428.  
  429. ; check for hardware cursor
  430.         cmp     [_display.select_cursor], select_cursor
  431.         jne     .no_mouseunder_1
  432. ;--------------------------------------
  433. align 4
  434.         push    ecx
  435.  
  436.         mov     ecx, [esp+4]
  437.         ror     ecx, 16
  438.         sub     ecx, edx
  439.         rol     ecx, 16
  440.         sub     ecx, [esp + BLITTER.h + 8]
  441.  
  442. ; check mouse area for putpixel
  443.         call    [_display.check_mouse]
  444.         pop     ecx
  445. ;--------------------------------------
  446. align 4
  447. .no_mouseunder_1:
  448.         mov     [edi + ecx], ax
  449.         shr     eax, 16
  450.         mov     [edi + ecx+2], al
  451.  
  452.         pop     eax
  453. ;--------------------------------------
  454. align 4
  455. .skip_1:
  456.         mov     edi, [esp + .extra_var1]
  457.         inc     ecx
  458.         dec     edx
  459.         jnz     .inner24
  460.  
  461.         add     esi, [esp + BLITTER.stride]
  462.         add     edi, [_display.lfb_pitch]
  463.         add     ebp, [_display.width]
  464.  
  465.         mov     edx, [esp + BLITTER.w]
  466.         dec     [esp + BLITTER.h]
  467.         jnz     .outer24
  468.  
  469.         jmp     .done
  470.  
  471.  
  472. .core_16:
  473.         lea     edi, [LFB_BASE + edi + ebx*2]
  474.         mov     ebx, [current_slot_idx]
  475.  
  476.   .outer16:
  477.         mov     [esp + .extra_var1], edi
  478.         xor     ecx, ecx
  479.  
  480.   .inner16:
  481.         cmp     [ebp + ecx], bl                   ; Does the process own this pixel?
  482.         jne     .skip_2
  483. ;--------------------------------------
  484.         push    eax
  485.         mov     eax, [esi + ecx*4]
  486.  
  487. ; check for hardware cursor
  488.         cmp     [_display.select_cursor], select_cursor
  489.         jne     .no_mouseunder_2
  490. ;--------------------------------------
  491.         push    ecx
  492.  
  493.         mov     ecx, [esp+4]
  494.         ror     ecx, 16
  495.         sub     ecx, edx
  496.         rol     ecx, 16
  497.         sub     ecx, [esp + BLITTER.h + 8]
  498.  
  499. ; check mouse area for putpixel
  500.         call    [_display.check_mouse]
  501.         pop     ecx
  502. ;--------------------------------------
  503.   .no_mouseunder_2:
  504. ; convert to 16 bpp and store to LFB
  505.         and     eax, 00000000111110001111110011111000b
  506.         shr     ah, 2
  507.         shr     ax, 3
  508.         ror     eax, 8
  509.         add     al, ah
  510.         rol     eax, 8
  511.         mov     [edi + ecx*2], ax
  512.         pop     eax
  513. ;--------------------------------------
  514.   .skip_2:
  515.         mov     edi, [esp + .extra_var1]
  516.         inc     ecx
  517.         dec     edx
  518.         jnz     .inner16
  519.  
  520.         add     esi, [esp + BLITTER.stride]
  521.         add     edi, [_display.lfb_pitch]
  522.         add     ebp, [_display.width]
  523.  
  524.         mov     edx, [esp + BLITTER.w]
  525.         dec     [esp + BLITTER.h]
  526.         jnz     .outer16
  527.  
  528.         jmp     .done
  529.  
  530.