52a3801208
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10 a95241bf-73f2-0310-859d-f6bbb57e9c96
137 lines
3.3 KiB
C++
137 lines
3.3 KiB
C++
/*
|
|
ServerCursor.cpp
|
|
This is the server-side class used to handle cursors. Note that it
|
|
will handle the R5 cursor API, but it will also handle taking a bitmap.
|
|
|
|
ServerCursors are 32-bit. Eventually, we will be mapping colors to fit
|
|
when the set is called.
|
|
|
|
This is new code, and there may be changes to the API before it settles
|
|
in.
|
|
*/
|
|
|
|
#include "ServerCursor.h"
|
|
#include "ServerBitmap.h"
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
|
|
int8 default_cursor[]={
|
|
16,1,0,0,
|
|
|
|
// data
|
|
0xff, 0x80, 0x80, 0x80, 0x81, 0x00, 0x80, 0x80, 0x80, 0x40, 0x80, 0x80, 0x81, 0x00, 0xa2, 0x00,
|
|
0xd4, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
|
// mask
|
|
0xff, 0x80, 0xff, 0x80, 0xff, 0x00, 0xff, 0x80, 0xff, 0xc0, 0xff, 0x80, 0xff, 0x00, 0xfe, 0x00,
|
|
0xdc, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
long pow2(int power)
|
|
{
|
|
if(power==0)
|
|
return 1;
|
|
return long(2 << (power-1));
|
|
}
|
|
|
|
ServerCursor::ServerCursor(void)
|
|
{
|
|
// For when an application is started. This will probably disappear once I
|
|
// get the stuff for default cursors established
|
|
is_initialized=false;
|
|
position.Set(0,0);
|
|
}
|
|
|
|
ServerCursor::ServerCursor(ServerBitmap *bmp, ServerBitmap *cmask=NULL)
|
|
{
|
|
// The OpenBeOS R1 API uses Bitmaps to create cursors - more flexibility that way.
|
|
is_initialized=false;
|
|
position.Set(0,0);
|
|
SetCursor(bmp);
|
|
}
|
|
|
|
ServerCursor::ServerCursor(int8 *data)
|
|
{
|
|
// For handling the idiot R5 API data format
|
|
is_initialized=false;
|
|
position.Set(0,0);
|
|
SetCursor(data);
|
|
}
|
|
|
|
ServerCursor::~ServerCursor(void)
|
|
{
|
|
if(is_initialized)
|
|
delete bitmap;
|
|
}
|
|
|
|
void ServerCursor::SetCursor(int8 *data)
|
|
{
|
|
// 68-byte array used in R5 for holding cursors.
|
|
// This API has serious problems and should be deprecated(but supported)
|
|
// in a future release, perhaps right after the first one
|
|
|
|
if(is_initialized)
|
|
{
|
|
delete bitmap;
|
|
}
|
|
cspace=B_RGBA32;
|
|
|
|
bitmap=new ServerBitmap(16,16,B_RGBA32);
|
|
width=16;
|
|
height=16;
|
|
bounds.Set(0,0,15,15);
|
|
|
|
// Now that we have all the setup, we're going to map (for now) the cursor
|
|
// to RGBA32. Eventually, there will be support for 16 and 8-bit depths
|
|
uint32 black=0xFF000000,
|
|
white=0xFFFFFFFF,
|
|
*bmppos;
|
|
uint16 *cursorpos, *maskpos,cursorflip, maskflip,
|
|
cursorval, maskval;
|
|
uint8 i,j;
|
|
|
|
cursorpos=(uint16*)(data+4);
|
|
maskpos=(uint16*)(data+36);
|
|
|
|
// for each row in the cursor data
|
|
for(j=0;j<16;j++)
|
|
{
|
|
bmppos=(uint32*)(bitmap->Buffer()+ (j*bitmap->bytesperline) );
|
|
|
|
// On intel, our bytes end up swapped, so we must swap them back
|
|
cursorflip=(cursorpos[j] & 0xFF) << 8;
|
|
cursorflip |= (cursorpos[j] & 0xFF00) >> 8;
|
|
maskflip=(maskpos[j] & 0xFF) << 8;
|
|
maskflip |= (maskpos[j] & 0xFF00) >> 8;
|
|
|
|
// for each column in each row of cursor data
|
|
for(i=0;i<16;i++)
|
|
{
|
|
// Get the values and dump them to the bitmap
|
|
cursorval=cursorflip & pow2(15-i);
|
|
maskval=maskflip & pow2(15-i);
|
|
bmppos[i]=((cursorval!=0)?black:white) & ((maskval>0)?0xFFFFFFFF:0x00FFFFFF);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Currently unimplemented
|
|
void ServerCursor::SetCursor(ServerBitmap *bmp, ServerBitmap *cmask=NULL)
|
|
{
|
|
/* if(is_initialized)
|
|
delete bitmap;
|
|
cspace=bmp->cspace;
|
|
|
|
bitmap=new ServerBitmap(bmp->width,bmp->height,cspace);
|
|
|
|
width=bmp->width;
|
|
height=bmp->height;
|
|
bounds.Set(0,0,bmp->width-1,bmp->height-1);
|
|
*/
|
|
}
|
|
|
|
void ServerCursor::MoveTo(int32 x, int32 y)
|
|
{
|
|
position.Set(x,y);
|
|
}
|