forked from KolibriOS/kolibrios
104 lines
2.0 KiB
PHP
104 lines
2.0 KiB
PHP
|
|
||
|
char tmp_cursor[4096];
|
||
|
|
||
|
cursor_t *create_cursor(u32 pid, void *src, u32 flags)
|
||
|
{
|
||
|
void *img;
|
||
|
|
||
|
cursor_t *cursor = (cursor_t*)CreateObject(pid, 32);
|
||
|
|
||
|
if(cursor==0)
|
||
|
return 0;
|
||
|
dbgprintf("create object at %x\n", cursor);
|
||
|
|
||
|
cursor->magic = 0x53525543;
|
||
|
cursor->destroy = __destroy_cursor;
|
||
|
|
||
|
img = rhd_mem_alloc(&rhd,RHD_MEM_FB,64*64*4);
|
||
|
if(img==0)
|
||
|
goto cleanup;
|
||
|
|
||
|
dbgprintf("alloc video memory at %x size %x\n",img,64*64*4);
|
||
|
dbgprintf("offset %x\n", img-rhd.FbBase);
|
||
|
cursor->base=img;
|
||
|
|
||
|
if( (u16)flags==LOAD_INDIRECT){
|
||
|
cursor->hot_x = (u8)(flags>>24);
|
||
|
cursor->hot_y = (u8)(flags>>16);
|
||
|
asm __volatile__
|
||
|
(
|
||
|
"cld \n\t"
|
||
|
"rep stosl"
|
||
|
:
|
||
|
:"a"(0),"c"(64*64),"D"(img)
|
||
|
);
|
||
|
asm __volatile__
|
||
|
(
|
||
|
"1: "
|
||
|
"movl $32, %%ecx \n\t"
|
||
|
"rep stosl \n\t"
|
||
|
"addl $128, %%edi \n\t"
|
||
|
"decl %%ebx \n\t"
|
||
|
"jnz 1b"
|
||
|
:
|
||
|
:"b"(32),"S"(src),"D"(img)
|
||
|
);
|
||
|
}
|
||
|
else {
|
||
|
cursor->hot_x = *(u16*)((char*)src+10);
|
||
|
cursor->hot_y = *(u16*)((char*)src+12);
|
||
|
copy_cursor(img, src);
|
||
|
dbgprintf("cursor loaded\n");
|
||
|
}
|
||
|
return cursor;
|
||
|
cleanup:
|
||
|
DestroyObject(cursor);
|
||
|
return NULL;
|
||
|
};
|
||
|
|
||
|
void destroy_cursor(cursor_t *cursor)
|
||
|
{
|
||
|
if(cursor->base)
|
||
|
rhd_mem_free(&rhd,RHD_MEM_FB,cursor->base);
|
||
|
DestroyObject(cursor);
|
||
|
}
|
||
|
|
||
|
void __stdcall r500_SelectCursor(cursor_t *cursor)
|
||
|
{
|
||
|
CARD32 base;
|
||
|
|
||
|
base = (CARD32)cursor->base - rhd.FbBase;
|
||
|
asm __volatile__
|
||
|
(
|
||
|
"cli"
|
||
|
);
|
||
|
OUTREG (D1CUR_SURFACE_ADDRESS, rhd.FbIntAddress+base);
|
||
|
OUTREG (D1CUR_HOT_SPOT, (cursor->hot_x<<16)|(cursor->hot_y&0xFFFF));
|
||
|
asm __volatile__
|
||
|
(
|
||
|
"sti"
|
||
|
);
|
||
|
}
|
||
|
|
||
|
void __stdcall r500_SetCursor(cursor_t *cursor, int x, int y)
|
||
|
{
|
||
|
CARD32 tmp = (x<<16)|(y & 0xFFFF) ;
|
||
|
|
||
|
asm __volatile__
|
||
|
(
|
||
|
"pushfl \n\t"
|
||
|
"cli"
|
||
|
);
|
||
|
|
||
|
OUTREG(D1CUR_POSITION, tmp);
|
||
|
OUTREG(D1CUR_CONTROL, 0x301);
|
||
|
asm __volatile__
|
||
|
(
|
||
|
"popfl"
|
||
|
);
|
||
|
}
|
||
|
|
||
|
void __stdcall r500_CursorRestore(int x, int y)
|
||
|
{};
|
||
|
|