Subversion Repositories Kolibri OS

Rev

Rev 2988 | Rev 4850 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2011-2012. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. struct  BLITTER_BLOCK
  9.         xmin            dd ?
  10.         ymin            dd ?
  11.         xmax            dd ?
  12.         ymax            dd ?
  13. ends
  14.  
  15.  
  16. struct  BLITTER
  17.         dc              RECT
  18.         sc              RECT
  19.         dst_x           dd ?            ;  32
  20.         dst_y           dd ?            ;  36
  21.         src_x           dd ?            ;  40
  22.         src_y           dd ?            ;  44
  23.         w               dd ?            ;  48
  24.         h               dd ?            ;  52
  25.  
  26.         bitmap          dd ?            ;  56
  27.         stride          dd ?            ;  60
  28. ends
  29.  
  30.  
  31.  
  32. align 4
  33. block_clip:
  34. ;esi= clip RECT ptr
  35. ;edi= RECT ptr
  36. ;return code:
  37. ;eax= 0 - draw, 1 - don't draw
  38.  
  39.         push    ebx
  40.  
  41.         mov     eax, [edi+RECT.left]
  42.         mov     ebx, [edi+RECT.right]
  43.         mov     ecx, [esi+RECT.left]    ;clip.left
  44.         mov     edx, [esi+RECT.right]   ;clip.right
  45.  
  46.         cmp     eax, edx                ;left >= clip.right
  47.         jge     .fail
  48.  
  49.         cmp     ebx, ecx                ;right < clip.left
  50.         jl      .fail
  51.  
  52.         cmp     eax, ecx                ;left >= clip.left
  53.         jae     @F
  54.  
  55.         mov     eax, ecx
  56. @@:
  57.         mov     [edi+RECT.left], eax
  58.  
  59.         cmp     ebx, edx                ;right <= clip.right
  60.         jle     @f
  61.         mov     ebx, edx
  62. @@:
  63.         mov     [edi+RECT.right], ebx
  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.         jae     @F
  78.  
  79.         mov     eax, ecx
  80. @@:
  81.         mov     [edi+RECT.top], eax
  82.  
  83.         cmp     ebx, edx                ;bottom <= clip.bottom
  84.         jle     @f
  85.         mov     ebx, edx
  86. @@:
  87.         mov     [edi+RECT.bottom], ebx
  88.         pop     ebx
  89.         xor     eax, eax
  90.         ret
  91. .fail:
  92.         pop     ebx
  93.         mov     eax, 1
  94.         ret
  95.  
  96.  
  97. align 4
  98. blit_clip:
  99.  
  100. .sx0   equ 8
  101. .sy0   equ 12
  102. .sx1   equ 16
  103. .sy1   equ 20
  104.  
  105. .dx0   equ 24
  106. .dy0   equ 28
  107. .dx1   equ 32
  108. .dy1   equ 36
  109.  
  110.  
  111.         push    edi
  112.         push    esi
  113.         push    ebx
  114.         sub     esp, 40
  115.  
  116.         mov     ebx, ecx
  117.         mov     edx, [ecx+BLITTER.src_x]
  118.         mov     [esp+.sx0], edx
  119.         mov     eax, [ecx+BLITTER.src_y]
  120.         mov     [esp+.sy0], eax
  121.         add     edx, [ecx+BLITTER.w]
  122.         add     eax, [ecx+BLITTER.h]
  123.         mov     [esp+.sx1], edx
  124.         mov     [esp+.sy1], eax
  125.  
  126.         lea     edi, [esp+.sx0]
  127.         lea     esi, [ebx+BLITTER.sc]
  128.  
  129.         call    block_clip
  130.         test    eax, eax
  131.         mov     esi, 1
  132.         jnz     .done
  133.  
  134.         mov     edi, [esp+.sx0]
  135.         mov     edx, [ebx+BLITTER.dst_x]
  136.         add     edx, edi
  137.         sub     edx, [ebx+BLITTER.src_x]
  138.         mov     [esp+.dx0], edx
  139.  
  140.         mov     ecx, [esp+.sy0]
  141.         mov     eax, [ebx+BLITTER.dst_y]
  142.         add     eax, ecx
  143.         sub     eax, [ebx+BLITTER.src_y]
  144.         mov     [esp+.dy0], eax
  145.  
  146.         sub     edx, edi
  147.         add     edx, [esp+.sx1]
  148.         mov     [esp+.dx1], edx
  149.  
  150.         sub     eax, ecx
  151.         add     eax, [esp+.sy1]
  152.         mov     [esp+.dy1], eax
  153.  
  154.         lea     edi, [esp+.dx0]
  155.         lea     esi, [ebx+BLITTER.dc]
  156.         call    block_clip
  157.         test    eax, eax
  158.         mov     esi, 1
  159.         jnz     .done
  160.  
  161.         mov     edx, [esp+.dx0]
  162.         mov     eax, [esp+.dx1]
  163.         sub     eax, edx
  164.         mov     [ebx+BLITTER.w], eax
  165.  
  166.         mov     eax, [esp+.dy0]
  167.         mov     ecx, [esp+.dy1]
  168.         sub     ecx, eax
  169.         mov     [ebx+BLITTER.h], ecx
  170.  
  171.         mov     ecx, [ebx+BLITTER.src_x]
  172.         add     ecx, edx
  173.         sub     ecx, [ebx+BLITTER.dst_x]
  174.         mov     [ebx+BLITTER.src_x], ecx
  175.  
  176.         mov     ecx, [ebx+BLITTER.src_y]
  177.         add     ecx, eax
  178.         sub     ecx, [ebx+BLITTER.dst_y]
  179.         mov     [ebx+BLITTER.src_y], ecx
  180.         mov     [ebx+BLITTER.dst_x], edx
  181.         mov     [ebx+BLITTER.dst_y], eax
  182.         xor     esi, esi
  183. .done:
  184.         mov     eax, esi
  185.         add     esp, 40
  186.         pop     ebx
  187.         pop     esi
  188.         pop     edi
  189.  
  190.  
  191. purge .sx0
  192. purge .sy0
  193. purge .sx1
  194. purge .sy1
  195.  
  196. purge .dx0
  197. purge .dy0
  198. purge .dx1
  199. purge .dy1
  200.  
  201.         ret
  202.  
  203. align 4
  204. blit_32:
  205.         push    ebp
  206.         push    edi
  207.         push    esi
  208.         push    ebx
  209. virtual at sizeof.BLITTER
  210. .position       dd      ? ; (x shl 16) + y
  211. ; ???
  212. .extra_var1     dd      ?
  213. .local_vars_size = $
  214. end virtual
  215.         sub     esp, .local_vars_size
  216.  
  217.         mov     eax, [TASK_BASE]
  218.         mov     ebx, [eax-twdw + WDATA.box.width]
  219.         mov     edx, [eax-twdw + 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.         test    eax, eax
  262.         jne     .L57
  263.  
  264.         mov     eax, [TASK_BASE]
  265.  
  266.         mov     ebx, [esp+BLITTER.dst_x]
  267.         mov     ebp, [esp+BLITTER.dst_y]
  268.         add     ebx, [eax-twdw + WDATA.box.left]
  269.         add     ebp, [eax-twdw + WDATA.box.top]
  270.  
  271.         mov     ecx, ebx
  272.         add     ecx, [esp+BLITTER.w]
  273.         shl     ecx, 16
  274.         mov     cx, bp
  275.         add     ecx, [esp+BLITTER.h]
  276.  
  277.         mov     eax, ebx
  278.         shl     eax, 16
  279.         mov     ax, bp
  280.         mov     [esp+.position], eax
  281.  
  282.         mov     edi, ebp
  283.  
  284. ;        imul    edi, [_display.pitch]
  285.         mov     edi, [BPSLine_calc_area+edi*4]
  286. ;        imul    ebp, [_display.width]
  287.         mov     ebp, [d_width_calc_area+ebp*4]
  288.  
  289.         add     ebp, ebx
  290.         add     ebp, [_WinMapAddress]
  291.  
  292.         mov     eax, [esp+BLITTER.src_y]
  293.         imul    eax, [esp+BLITTER.stride]
  294.         mov     esi, [esp+BLITTER.src_x]
  295.         lea     esi, [eax+esi*4]
  296.         add     esi, [esp+BLITTER.bitmap]
  297.  
  298.         mov     eax, ecx
  299.         mov     ecx, [esp+BLITTER.h]
  300.         mov     edx, [esp+BLITTER.w]
  301.  
  302.         test    ecx, ecx    ;FIXME check clipping
  303.         jz      .L57
  304.  
  305.         test    edx, edx
  306.         jz      .L57
  307.  
  308.         cmp     [_display.bpp], 32
  309.         jne     .core_24
  310.  
  311.         lea     edi, [edi+ebx*4]
  312.  
  313.         mov     ebx, [CURRENT_TASK]
  314. ; check for hardware cursor
  315.         cmp     [_display.select_cursor], select_cursor
  316.         je      .core_32.software_cursor
  317.         cmp     [_display.select_cursor], 0
  318.         jne     .core_32.hardware_cursor
  319. ;--------------------------------------
  320. .core_32.software_cursor:
  321. align 4
  322. .outer32:
  323.  
  324. align 4
  325. .inner32:
  326.         cmp     [ebp], bl
  327.         jne     .skip
  328. ;--------------------------------------
  329.         mov     eax, [esi]
  330.  
  331.         mov     ecx, [esp+.position]
  332.  
  333. ; check mouse area for putpixel
  334.         call    [_display.check_mouse]
  335. ;--------------------------------------
  336. ; store to real LFB
  337.         mov     [LFB_BASE+edi], eax
  338. ;--------------------------------------
  339. align 4
  340. .skip:
  341.         add     esi, 4
  342.         add     edi, 4
  343.         inc     ebp
  344.         add     [esp+.position], 1 shl 16
  345.         dec     edx
  346.         jnz     .inner32
  347.  
  348.         add     esi, [esp+BLITTER.stride]
  349.         add     edi, [_display.pitch]
  350.         add     ebp, [_display.width]
  351.  
  352.         mov     edx, [esp+BLITTER.w]
  353.         mov     eax, edx
  354.         inc     [esp+.position]
  355.         sub     ebp, edx
  356.         shl     eax, 2
  357.         sub     esi, eax
  358.         sub     edi, eax
  359.         shl     eax, 16-2
  360.         sub     [esp+.position], eax
  361.         dec     [esp+BLITTER.h]
  362.         jnz     .outer32
  363.         jmp     .done
  364. .core_32.hardware_cursor:
  365. align 4
  366. .hw.outer32:
  367.         xor     ecx, ecx
  368.  
  369. align 4
  370. .hw.inner32:
  371.         cmp     [ebp+ecx], bl
  372.         jne     .hw.skip
  373.         mov     eax, [esi+ecx*4]
  374.         mov     [LFB_BASE+edi+ecx*4], eax
  375.  
  376. align 4
  377. .hw.skip:
  378.         inc     ecx
  379.         dec     edx
  380.         jnz     .hw.inner32
  381.  
  382.         add     esi, [esp+BLITTER.stride]
  383.         add     edi, [_display.pitch]
  384.         add     ebp, [_display.width]
  385.  
  386.         mov     edx, [esp+BLITTER.w]
  387.         dec     [esp+BLITTER.h]
  388.         jnz     .hw.outer32
  389.  
  390. .done:
  391. ;        call    [draw_pointer]
  392. ;        call    __sys_draw_pointer
  393. .L57:
  394.         add     esp, .local_vars_size
  395.         pop     ebx
  396.         pop     esi
  397.         pop     edi
  398.         pop     ebp
  399.         ret
  400.  
  401. .core_24:
  402.         lea     ebx, [ebx+ebx*2]
  403.         lea     edi, [LFB_BASE+edi+ebx]
  404.         mov     ebx, [CURRENT_TASK]
  405.  
  406. align 4
  407. .outer24:
  408.         mov     [esp+.extra_var1], edi
  409.         xor     ecx, ecx
  410.  
  411. align 4
  412. .inner24:
  413.         cmp     [ebp+ecx], bl
  414.         jne     .skip_1
  415. ;--------------------------------------
  416.         push    eax
  417.         mov     eax, [esi+ecx*4]
  418.  
  419.         lea     edi, [edi+ecx*2]
  420.  
  421. ; check for hardware cursor
  422.         cmp     [_display.select_cursor], select_cursor
  423.         je      @f
  424.         cmp     [_display.select_cursor], 0
  425.         jne     .no_mouseunder_1
  426. ;--------------------------------------
  427. align 4
  428. @@:
  429.         push    ecx
  430.  
  431.         mov     ecx, [esp+4]
  432.         ror     ecx, 16
  433.         sub     ecx, edx
  434.         rol     ecx, 16
  435.         sub     ecx, [esp+BLITTER.h + 8]
  436.  
  437. ; check mouse area for putpixel
  438.         call    [_display.check_mouse]
  439.         pop     ecx
  440. ;--------------------------------------
  441. align 4
  442. .no_mouseunder_1:
  443.         mov     [edi+ecx], ax
  444.         shr     eax, 16
  445.         mov     [edi+ecx+2], al
  446.  
  447.         pop     eax
  448. ;--------------------------------------
  449. align 4
  450. .skip_1:
  451.         mov     edi, [esp+.extra_var1]
  452.         inc     ecx
  453.         dec     edx
  454.         jnz     .inner24
  455.  
  456.         add     esi, [esp+BLITTER.stride]
  457.         add     edi, [_display.pitch]
  458.         add     ebp, [_display.width]
  459.  
  460.         mov     edx, [esp+BLITTER.w]
  461.         dec     [esp+BLITTER.h]
  462.         jnz     .outer24
  463.  
  464.         jmp     .done
  465.