Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1.  
  2. USE32
  3.  
  4. format MS COFF
  5.  
  6. include 'proc32.inc'
  7.  
  8. struc BITMAPINFOHEADER {
  9.   .biSize          dd ? ; DWORD
  10.   .biWidth         dd ? ; LONG
  11.   .biHeight        dd ? ; LONG
  12.   .biPlanes        dw ? ; WORD
  13.   .biBitCount      dw ? ; WORD
  14.   .biCompression   dd ? ; DWORD
  15.   .biSizeImage     dd ? ; DWORD
  16.   .biXPelsPerMeter dd ? ; LONG
  17.   .biYPelsPerMeter dd ? ; LONG
  18.   .biClrUsed       dd ? ; DWORD
  19.   .biClrImportant  dd ? ; DWORD
  20. }
  21.  
  22. virtual at 0
  23.   BI BITMAPINFOHEADER
  24. end virtual
  25.  
  26. public ___create_cursor
  27. public ___destroy_cursor
  28. public _copy_cursor@8
  29.  
  30. extrn _create_cursor    :dword
  31. extrn _destroy_cursor   :dword
  32. extrn _tmp_cursor       :dword
  33.  
  34. section 'AUTO' code readable executable align 16
  35.  
  36. align 16
  37. ___create_cursor:
  38.              push ecx
  39.              push ebx
  40.              push eax
  41.              call _create_cursor
  42.              add esp, 12
  43.              ret
  44. align 16
  45. ___destroy_cursor:
  46.              push eax
  47.              call _destroy_cursor
  48.              add esp, 4
  49.              ret
  50. align 16
  51. proc _copy_cursor@8 stdcall, dst:dword, src:dword
  52.            locals
  53.              rBase    dd ?
  54.              pQuad    dd ?
  55.              pBits    dd ?
  56.              pAnd     dd ?
  57.              width    dd ?
  58.              height   dd ?
  59.              counter  dd ?
  60.            endl
  61.  
  62.            mov esi, [src]
  63.            add esi,[esi+18]
  64.            mov eax,esi
  65.  
  66.            cmp [esi+BI.biBitCount], 24
  67.            je .img_24
  68.            cmp [esi+BI.biBitCount], 8
  69.            je .img_8
  70.            cmp [esi+BI.biBitCount], 4
  71.            je .img_4
  72.  
  73. .img_2:
  74.            add eax, [esi]
  75.            mov [pQuad],eax
  76.            add eax,8
  77.            mov [pBits],eax
  78.            add eax, 128
  79.            mov [pAnd],eax
  80.            mov eax,[esi+4]
  81.            mov [width],eax
  82.            mov ebx,[esi+8]
  83.            shr ebx,1
  84.            mov [height],ebx
  85.  
  86.            mov edi, _tmp_cursor
  87.            add edi, 32*31*4
  88.            mov [rBase],edi
  89.  
  90.            mov esi,[pQuad]
  91. .l21:
  92.            mov ebx, [pBits]
  93.            mov ebx, [ebx]
  94.            bswap ebx
  95.            mov eax, [pAnd]
  96.            mov eax, [eax]
  97.            bswap eax
  98.            mov [counter], 32
  99. @@:
  100.            xor edx, edx
  101.            shl eax,1
  102.            setc dl
  103.            dec edx
  104.  
  105.            xor ecx, ecx
  106.            shl ebx,1
  107.            setc cl
  108.            mov ecx, [esi+ecx*4]
  109.            and ecx, edx
  110.            and edx, 0xFF000000
  111.            or edx, ecx
  112.            mov [edi], edx
  113.  
  114.            add edi, 4
  115.            dec [counter]
  116.            jnz @B
  117.  
  118.            add [pBits], 4
  119.            add [pAnd], 4
  120.            mov edi,[rBase]
  121.            sub edi,128
  122.            mov [rBase],edi
  123.            sub [height],1
  124.            jnz .l21
  125.            jmp .copy
  126. .img_4:
  127.            add eax, [esi]
  128.            mov [pQuad],eax
  129.            add eax,64
  130.            mov [pBits],eax
  131.            add eax, 0x200
  132.            mov [pAnd],eax
  133.            mov eax,[esi+4]
  134.            mov [width],eax
  135.            mov ebx,[esi+8]
  136.            shr ebx,1
  137.            mov [height],ebx
  138.  
  139.            mov edi, _tmp_cursor
  140.            add edi, 32*31*4
  141.            mov [rBase],edi
  142.  
  143.            mov esi,[pQuad]
  144.            mov ebx, [pBits]
  145. .l4:
  146.            mov eax, [pAnd]
  147.            mov eax, [eax]
  148.            bswap eax
  149.            mov [counter], 16
  150. @@:
  151.            xor edx, edx
  152.            shl eax,1
  153.            setc dl
  154.            dec edx
  155.  
  156.            movzx ecx, byte [ebx]
  157.            and cl, 0xF0
  158.            shr ecx, 2
  159.            mov ecx, [esi+ecx]
  160.            and ecx, edx
  161.            and edx, 0xFF000000
  162.            or edx, ecx
  163.            mov [edi], edx
  164.  
  165.            xor edx, edx
  166.            shl eax,1
  167.            setc dl
  168.            dec edx
  169.  
  170.            movzx ecx, byte [ebx]
  171.            and cl, 0x0F
  172.            mov ecx, [esi+ecx*4]
  173.            and ecx, edx
  174.            and edx, 0xFF000000
  175.            or edx, ecx
  176.            mov [edi+4], edx
  177.  
  178.            inc ebx
  179.            add edi, 8
  180.            dec [counter]
  181.            jnz @B
  182.  
  183.            add [pAnd], 4
  184.            mov edi,[rBase]
  185.            sub edi,128
  186.            mov [rBase],edi
  187.            sub [height],1
  188.            jnz .l4
  189.            jmp .copy
  190. .img_8:
  191.            add eax, [esi]
  192.            mov [pQuad],eax
  193.            add eax,1024
  194.            mov [pBits],eax
  195.            add eax, 1024
  196.            mov [pAnd],eax
  197.            mov eax,[esi+4]
  198.            mov [width],eax
  199.            mov ebx,[esi+8]
  200.            shr ebx,1
  201.            mov [height],ebx
  202.  
  203.            mov edi, _tmp_cursor
  204.            add edi, 32*31*4
  205.            mov [rBase],edi
  206.  
  207.            mov esi,[pQuad]
  208.            mov ebx, [pBits]
  209. .l81:
  210.            mov eax, [pAnd]
  211.            mov eax, [eax]
  212.            bswap eax
  213.            mov [counter], 32
  214. @@:
  215.            xor edx, edx
  216.            shl eax,1
  217.            setc dl
  218.            dec edx
  219.  
  220.            movzx ecx,  byte [ebx]
  221.            mov ecx, [esi+ecx*4]
  222.            and ecx, edx
  223.            and edx, 0xFF000000
  224.            or edx, ecx
  225.            mov [edi], edx
  226.  
  227.            inc ebx
  228.            add edi, 4
  229.            dec [counter]
  230.            jnz @B
  231.  
  232.            add [pAnd], 4
  233.            mov edi,[rBase]
  234.            sub edi,128
  235.            mov [rBase],edi
  236.            sub [height],1
  237.            jnz .l81
  238.            jmp .copy
  239. .img_24:
  240.            add eax, [esi]
  241.            mov [pQuad],eax
  242.            add eax, 0xC00
  243.            mov [pAnd],eax
  244.            mov eax,[esi+BI.biWidth]
  245.            mov [width],eax
  246.            mov ebx,[esi+BI.biHeight]
  247.            shr ebx,1
  248.            mov [height],ebx
  249.  
  250.            mov edi, _tmp_cursor
  251.            add edi, 32*31*4
  252.            mov [rBase],edi
  253.  
  254.            mov esi,[pAnd]
  255.            mov ebx, [pQuad]
  256. .row_24:
  257.            mov eax, [esi]
  258.            bswap eax
  259.            mov [counter], 32
  260. @@:
  261.            xor edx, edx
  262.            shl eax,1
  263.            setc dl
  264.            dec edx
  265.  
  266.            mov ecx, [ebx]
  267.            and ecx, 0x00FFFFFF
  268.            and ecx, edx
  269.            and edx, 0xFF000000
  270.            or edx, ecx
  271.            mov [edi], edx
  272.            add ebx, 3
  273.            add edi, 4
  274.            dec [counter]
  275.            jnz @B
  276.  
  277.            add esi, 4
  278.            mov edi,[rBase]
  279.            sub edi,128
  280.            mov [rBase],edi
  281.            sub [height],1
  282.            jnz .row_24
  283. .copy:
  284.            mov edi, [dst]
  285.            mov ecx, 64*64
  286.            xor eax,eax
  287.            rep stosd
  288.  
  289.            mov esi, _tmp_cursor
  290.            mov edi, [dst]
  291.            mov ebx, 32
  292.            cld
  293. @@:
  294.            mov ecx, 32
  295.            rep movsd
  296.            add edi, 128
  297.            dec ebx
  298.            jnz @B
  299.            ret
  300. endp
  301.  
  302. macro rdr op1, op2
  303. {
  304.      mov op1, [edi+op2]
  305. }
  306.  
  307. macro wrr dest, src
  308. {
  309.      mov dword [edi+dest], src
  310. }
  311.  
  312. struc CURSOR
  313. {;common object header
  314.    .magic       dd ?   ;'CURS'
  315.    .destroy     dd ?   ;internal destructor
  316.    .fd          dd ?   ;next object in list
  317.    .bk          dd ?   ;prev object in list
  318.    .pid         dd ?   ;owner id
  319.  
  320.  ;cursor data
  321.    .base        dd ?   ;allocated memory
  322.    .hot_x       dd ?   ;hotspot coords
  323.    .hot_y       dd ?
  324. }
  325. virtual at 0
  326.   CURSOR CURSOR
  327. end virtual
  328.  
  329. ;public _r500_SelectCursor@4
  330. align 4
  331. proc _r500_SelectCursor@4 stdcall,hcursor:dword
  332.  
  333.            mov ecx, [hcursor]
  334.            mov edi, [_rhd]
  335.  
  336.            mov edx, [ecx+CURSOR.base]
  337.            sub edx, [_rhd+3*4]
  338.            add edx, [_rhd+5*4]
  339.            mov [edi+0x6408], edx
  340.  
  341.            mov eax, [ecx+CURSOR.hot_x]
  342.            shl eax, 16
  343.            mov ax, word [ecx+CURSOR.hot_y]
  344.            mov [edi+0x6418], eax
  345.            ret
  346. endp
  347.  
  348. ;public _r500_SetCursor@12
  349. align 4
  350. proc _r500_SetCursor@12 stdcall, hcursor:dword, x:dword, y:dword
  351.            pushfd
  352.            cli
  353.  
  354.            mov edx, [_rhd]
  355.  
  356.            mov eax, [x]
  357.            shl eax, 16
  358.            mov ax, word [y]
  359.  
  360.            mov [edx+0x6414], eax
  361.            or dword [edx+0x6400], 1
  362.  
  363.            popfd
  364.            ret
  365. endp
  366.  
  367.