#ifndef HW_INTERFACE_H
#define HW_INTERFACE_H
#include <AutoDeleter.h>
#include <Accelerant.h>
#include <GraphicsCard.h>
#include <List.h>
#include <Locker.h>
#include <OS.h>
#include <Region.h>
#include <video_overlay.h>
#include <new>
#include "IntRect.h"
#include "MultiLocker.h"
#include "ServerCursor.h"
class BString;
class DrawingEngine;
class EventStream;
class Overlay;
class RenderingBuffer;
class ServerBitmap;
class HWInterfaceListener {
public:
HWInterfaceListener();
virtual ~HWInterfaceListener();
virtual void FrameBufferChanged() {};
virtual void ScreenChanged(HWInterface* interface) {};
};
class HWInterface : protected MultiLocker {
public:
HWInterface();
virtual ~HWInterface();
bool LockParallelAccess() { return ReadLock(); }
#if DEBUG
bool IsParallelAccessLocked() const
{ return IsReadLocked(); }
#endif
void UnlockParallelAccess() { ReadUnlock(); }
bool LockExclusiveAccess() { return WriteLock(); }
bool IsExclusiveAccessLocked()
{ return IsWriteLocked(); }
void UnlockExclusiveAccess() { WriteUnlock(); }
virtual status_t Initialize();
virtual status_t Shutdown() = 0;
virtual DrawingEngine* CreateDrawingEngine();
virtual EventStream* CreateEventStream();
virtual status_t SetMode(const display_mode& mode) = 0;
virtual void GetMode(display_mode* mode) = 0;
virtual status_t GetDeviceInfo(accelerant_device_info* info) = 0;
virtual status_t GetModeList(display_mode** _modeList,
uint32* _count) = 0;
virtual status_t GetPixelClockLimits(display_mode* mode,
uint32* _low, uint32* _high) = 0;
virtual status_t GetTimingConstraints(display_timing_constraints*
constraints) = 0;
virtual status_t ProposeMode(display_mode* candidate,
const display_mode* low,
const display_mode* high) = 0;
virtual status_t GetPreferredMode(display_mode* mode);
virtual status_t GetMonitorInfo(monitor_info* info);
virtual sem_id RetraceSemaphore() = 0;
virtual status_t WaitForRetrace(
bigtime_t timeout = B_INFINITE_TIMEOUT) = 0;
virtual status_t SetDPMSMode(uint32 state) = 0;
virtual uint32 DPMSMode() = 0;
virtual uint32 DPMSCapabilities() = 0;
virtual status_t SetBrightness(float) = 0;
virtual status_t GetBrightness(float*) = 0;
virtual status_t GetAccelerantPath(BString& path);
virtual status_t GetDriverPath(BString& path);
ServerCursorReference Cursor() const;
ServerCursorReference CursorAndDragBitmap() const;
virtual void SetCursor(ServerCursor* cursor);
virtual void SetCursorVisible(bool visible);
bool IsCursorVisible();
virtual void ObscureCursor();
virtual void MoveCursorTo(float x, float y);
BPoint CursorPosition();
virtual void SetDragBitmap(const ServerBitmap* bitmap,
const BPoint& offsetFromCursor);
virtual overlay_token AcquireOverlayChannel();
virtual void ReleaseOverlayChannel(overlay_token token);
virtual status_t GetOverlayRestrictions(const Overlay* overlay,
overlay_restrictions* restrictions);
virtual bool CheckOverlayRestrictions(int32 width,
int32 height, color_space colorSpace);
virtual const overlay_buffer* AllocateOverlayBuffer(int32 width,
int32 height, color_space space);
virtual void FreeOverlayBuffer(const overlay_buffer* buffer);
virtual void ConfigureOverlay(Overlay* overlay);
virtual void HideOverlay(Overlay* overlay);
RenderingBuffer* DrawingBuffer() const;
virtual RenderingBuffer* FrontBuffer() const = 0;
virtual RenderingBuffer* BackBuffer() const = 0;
virtual bool IsDoubleBuffered() const = 0;
virtual status_t InvalidateRegion(const BRegion& region);
virtual status_t Invalidate(const BRect& frame);
virtual status_t CopyBackToFront(const BRect& frame);
protected:
virtual void _CopyBackToFront( BRegion& region);
public:
bool HideFloatingOverlays(const BRect& area);
bool HideFloatingOverlays();
void ShowFloatingOverlays();
bool AddListener(HWInterfaceListener* listener);
void RemoveListener(HWInterfaceListener* listener);
protected:
virtual void _DrawCursor(IntRect area) const;
void _CopyToFront(uint8* src, uint32 srcBPR, int32 x,
int32 y, int32 right, int32 bottom) const;
IntRect _CursorFrame() const;
void _RestoreCursorArea() const;
void _AdoptDragBitmap();
void _NotifyFrameBufferChanged();
void _NotifyScreenChanged();
static bool _IsValidMode(const display_mode& mode);
struct buffer_clip {
buffer_clip(int32 width, int32 height)
{
bpr = width * 4;
if (bpr > 0 && height > 0)
buffer = new(std::nothrow) uint8[bpr * height];
else
buffer = NULL;
left = 0;
top = 0;
right = -1;
bottom = -1;
cursor_hidden = true;
}
~buffer_clip()
{
delete[] buffer;
}
uint8* buffer;
int32 left;
int32 top;
int32 right;
int32 bottom;
int32 bpr;
bool cursor_hidden;
};
ObjectDeleter<buffer_clip>
fCursorAreaBackup;
mutable BLocker fFloatingOverlaysLock;
ServerCursorReference
fCursor;
BReference<ServerBitmap>
fDragBitmap;
BPoint fDragBitmapOffset;
ServerCursorReference
fCursorAndDragBitmap;
bool fCursorVisible;
bool fCursorObscured;
bool fHardwareCursorEnabled;
BPoint fCursorLocation;
BRect fTrackingRect;
int fVGADevice;
private:
BList fListeners;
};
#endif