#ifndef SERVER_BITMAP_H
#define SERVER_BITMAP_H
#include <AutoDeleter.h>
#include <GraphicsDefs.h>
#include <Rect.h>
#include <OS.h>
#include <Referenceable.h>
#include "ClientMemoryAllocator.h"
class BitmapManager;
class HWInterface;
class Overlay;
class ServerApp;
class ServerBitmap : public BReferenceable {
public:
inline bool IsValid() const
{ return fBuffer != NULL; }
inline uint8* Bits() const
{ return fBuffer; }
inline uint32 BitsLength() const;
inline BRect Bounds() const
{ return BRect(0, 0, fWidth - 1, fHeight - 1); }
inline int32 Width() const
{ return fWidth; }
inline int32 Height() const
{ return fHeight; }
inline int32 BytesPerRow() const
{ return fBytesPerRow; }
inline color_space ColorSpace() const
{ return fSpace; }
inline uint32 Flags() const
{ return fFlags; }
inline int32 Token() const
{ return fToken; }
area_id Area() const;
uint32 AreaOffset() const;
void SetOverlay(::Overlay* overlay);
::Overlay* Overlay() const;
void SetOwner(ServerApp* owner);
ServerApp* Owner() const;
inline void ShallowCopy(const ServerBitmap *from);
status_t ImportBits(const void *bits, int32 bitsLength,
int32 bytesPerRow, color_space colorSpace);
status_t ImportBits(const void *bits, int32 bitsLength,
int32 bytesPerRow, color_space colorSpace,
BPoint from, BPoint to, int32 width,
int32 height);
void PrintToStream();
protected:
friend class BitmapManager;
ServerBitmap(BRect rect, color_space space,
uint32 flags, int32 bytesPerRow = -1,
screen_id screen = B_MAIN_SCREEN_ID);
ServerBitmap(const ServerBitmap* bmp);
virtual ~ServerBitmap();
void AllocateBuffer();
protected:
ClientMemory fClientMemory;
AreaMemory* fMemory;
ObjectDeleter< ::Overlay>
fOverlay;
uint8* fBuffer;
int32 fWidth;
int32 fHeight;
int32 fBytesPerRow;
color_space fSpace;
uint32 fFlags;
ServerApp* fOwner;
int32 fToken;
};
class UtilityBitmap : public ServerBitmap {
public:
UtilityBitmap(BRect rect, color_space space,
uint32 flags, int32 bytesperline = -1,
screen_id screen = B_MAIN_SCREEN_ID);
UtilityBitmap(const ServerBitmap* bmp);
UtilityBitmap(const uint8* alreadyPaddedData,
uint32 width, uint32 height,
color_space format);
virtual ~UtilityBitmap();
};
uint32
ServerBitmap::BitsLength() const
{
int64 length = fBytesPerRow * fHeight;
return (length > 0 && length <= UINT32_MAX) ? (uint32)length : 0;
}
void
ServerBitmap::ShallowCopy(const ServerBitmap* from)
{
if (!from)
return;
fBuffer = from->fBuffer;
fWidth = from->fWidth;
fHeight = from->fHeight;
fBytesPerRow = from->fBytesPerRow;
fSpace = from->fSpace;
fFlags = from->fFlags;
fToken = from->fToken;
}
#endif