* Copyright 2001-2009, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* DarkWyrm <bpmagic@columbus.rr.com>
* Stephan AΓmus <superstippi@gmx.de>
* Axel DΓΆrfler, axeld@pinc-software.de
*/
the BitmapManager, but the CursorManager instead. Until they have been
attached to a CursorManager, you can delete cursors like any other object.
Unlike BeOS, cursors can be any size or color space, and this class
accomodates and expands the BeOS API.
*/
#include "CursorManager.h"
#include "ServerCursor.h"
#include <ByteOrder.h>
#include <new>
#include <stdio.h>
using std::nothrow;
\param r Size of the cursor
\param cspace Color space of the cursor
\param flags ServerBitmap flags. See Bitmap.h.
\param hotspot Hotspot of the cursor
\param bytesperline Bytes per row for the cursor. See
ServerBitmap::ServerBitmap()
*/
ServerCursor::ServerCursor(BRect r, color_space format, int32 flags,
BPoint hotspot, int32 bytesPerRow, screen_id screen)
:
ServerBitmap(r, format, flags, bytesPerRow, screen),
fHotSpot(hotspot),
fOwningTeam(-1),
fCursorData(NULL),
fManager(NULL)
{
fHotSpot.ConstrainTo(Bounds());
AllocateBuffer();
}
\param data Pointer to 68-byte cursor data array. See BeBook entry for
BCursor for details
*/
ServerCursor::ServerCursor(const uint8* data)
:
ServerBitmap(BRect(0, 0, 15, 15), B_RGBA32, 0),
fHotSpot(0, 0),
fOwningTeam(-1),
fCursorData(NULL),
fManager(NULL)
{
if (data) {
AllocateBuffer();
uint8* buffer = Bits();
if (!buffer)
return;
uint16* cursorBits = (uint16*)(data + 4);
uint16* transparencyBits = (uint16*)(data + 36);
fHotSpot.Set(data[3], data[2]);
for (int32 j = 0; j < 16; j++) {
uint32* bits = (uint32*)(buffer + (j * BytesPerRow()));
uint16 cursorLine = __swap_int16(cursorBits[j]);
uint16 transparencyLine = __swap_int16(transparencyBits[j]);
uint16 mask = 1 << 15;
for (int32 i = 0; i < 16; i++, mask >>= 1) {
if (cursorLine & mask)
bits[i] = 0xff000000;
else if (transparencyLine & mask)
bits[i] = 0xffffffff;
else
bits[i] = 0x00000000;
}
}
fCursorData = new (nothrow) uint8[68];
if (fCursorData)
memcpy(fCursorData, data, 68);
} else {
fWidth = 0;
fHeight = 0;
fBytesPerRow = 0;
fSpace = B_NO_COLOR_SPACE;
}
}
\param data Pointer to bitmap data in memory,
the padding bytes should be contained when format less than 32 bpp.
*/
ServerCursor::ServerCursor(const uint8* alreadyPaddedData, uint32 width,
uint32 height, color_space format)
:
ServerBitmap(BRect(0, 0, width - 1, height - 1), format, 0),
fHotSpot(0, 0),
fOwningTeam(-1),
fCursorData(NULL),
fManager(NULL)
{
AllocateBuffer();
if (Bits())
memcpy(Bits(), alreadyPaddedData, BitsLength());
}
\param cursor cursor to copy
*/
ServerCursor::ServerCursor(const ServerCursor* cursor)
:
ServerBitmap(cursor),
fHotSpot(0, 0),
fOwningTeam(-1),
fCursorData(NULL),
fManager(NULL)
{
AllocateBuffer();
if (cursor) {
if (Bits() && cursor->Bits())
memcpy(Bits(), cursor->Bits(), BitsLength());
fHotSpot = cursor->fHotSpot;
if (cursor->fCursorData) {
fCursorData = new (nothrow) uint8[68];
if (fCursorData)
memcpy(fCursorData, cursor->fCursorData, 68);
}
}
}
ServerCursor::~ServerCursor()
{
delete[] fCursorData;
}
\param pt New location of hotspot, constrained to the cursor's boundaries.
*/
void
ServerCursor::SetHotSpot(BPoint hotSpot)
{
fHotSpot = hotSpot;
fHotSpot.ConstrainTo(Bounds());
}
void
ServerCursor::AttachedToManager(CursorManager* manager)
{
fManager = manager;
}