#ifndef __GUI_SURFACE_H
#define __GUI_SURFACE_H
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdlib.h>
#include <os/com.h>
typedef dword pixel_t;
typedef dword colour_t;
#define RGB(r, g, b) ((byte) (b) | ((byte) (g) << 8) | ((byte) (r) << 16))
#define GetRValue(rgb) ((dword) (rgb) & 0xff0000)
#define GetGValue(rgb) ((dword) (rgb) & 0x00ff00)
#define GetBValue(rgb) ((dword) (rgb) & 0x0000ff)
typedef struct surface_t surface_t;
struct surface_t
{
int nWidth, nHeight, nBpp, nPitch;
void* pMemory;
};
typedef struct rectangle_t rectangle_t;
struct rectangle_t
{
int left, top, right, bottom;
#ifdef __cplusplus
rectangle_t() { }
rectangle_t(int x1, int y1, int x2, int y2)
{
left = x1;
top = y1;
right = x2;
bottom = y2;
}
operator rectangle_t*()
{
return this;
}
void OffsetRect(int dx, int dy)
{
left += dx;
top += dy;
right += dx;
bottom += dy;
}
void InflateRect(int dx, int dy)
{
left -= dx;
top -= dy;
right += dx;
bottom += dy;
}
void UnionRect(const rectangle_t* rect)
{
if (!rect->IsEmpty())
{
left = min(left, rect->left);
top = min(top, rect->top);
right = max(right, rect->right);
bottom = max(bottom, rect->bottom);
}
}
bool IsEmpty() const
{
return left == 0 &&
top == 0 &&
right == 0 &&
bottom == 0;
}
void SetEmpty()
{
left = right = top = bottom = 0;
}
int Width() const
{
return right - left;
}
int Height() const
{
return bottom - top;
}
#endif
};
typedef struct point_t point_t;
struct point_t
{
int x, y;
#ifdef __cplusplus
point_t() { }
point_t(int x1, int y1)
{
x = x1;
y = y1;
}
#endif
};
typedef enum
{
modeCopy,
modeXor,
modeNot
} DrawMode;
#undef INTERFACE
#define INTERFACE ISurface
DECLARE_INTERFACE(ISurface)
{
STDMETHOD(QueryInterface)(THIS_ REFIID iid, void ** ppvObject) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
STDMETHOD(SetPalette)(THIS_ int nIndex, int red, int green, int blue) PURE;
STDMETHOD(Blt)(THIS_ ISurface* pSrc, int x, int y, int nWidth,
int nHeight, int nSrcX, int nSrcY, pixel_t pixTrans) PURE;
STDMETHOD(Lock)(THIS_ surface_t* pDesc) PURE;
STDMETHOD(Unlock)(THIS) PURE;
STDMETHOD(GetSurfaceDesc)(THIS_ surface_t* pDesc) PURE;
STDMETHOD_(pixel_t, ColourMatch)(THIS_ colour_t clr) PURE;
STDMETHOD(SetPixel)(THIS_ int x, int y, pixel_t pix) PURE;
STDMETHOD_(pixel_t, GetPixel)(THIS_ int x, int y) PURE;
STDMETHOD_(DrawMode, SetDrawMode)(THIS_ DrawMode mode) PURE;
STDMETHOD(FillRect)(THIS_ const rectangle_t* rect, pixel_t pix) PURE;
STDMETHOD(Rect3d)(THIS_ const rectangle_t* rect, pixel_t pixTop,
pixel_t pixBottom, int nWidth) PURE;
STDMETHOD(Rect)(THIS_ const rectangle_t* rect, pixel_t pix, int nWidth) PURE;
STDMETHOD(GetClipRect)(THIS_ rectangle_t* rect) PURE;
};
/*
* Some ISurface methods are currently not marshallable to the kernel:
* SetPalette
* Blt
* Rect3d
*/
//HRESULT ISurface_SetPalette(ISurface* ptr, int nIndex, int red, int green, int blue);
//HRESULT ISurface_Blt(ISurface* ptr, ISurface* pSrc, int x, int y, int nWidth,
//int nHeight, int nSrcX, int nSrcY, pixel_t pixTrans);
HRESULT ISurface_Lock(ISurface* ptr, surface_t* pDesc);
HRESULT ISurface_Unlock(ISurface* ptr);
HRESULT ISurface_GetSurfaceDesc(ISurface* ptr, surface_t* pDesc);
pixel_t ISurface_ColourMatch(ISurface* ptr, colour_t clr);
HRESULT ISurface_SetPixel(ISurface* ptr, int x, int y, pixel_t pix);
pixel_t ISurface_GetPixel(ISurface* ptr, int x, int y);
DrawMode ISurface_SetDrawMode(ISurface* ptr, DrawMode mode);
HRESULT ISurface_FillRect(ISurface* ptr, const rectangle_t* rect, pixel_t pix);
HRESULT ISurface_Rect3d(ISurface* ptr, const rectangle_t* rect, pixel_t pixTop,
pixel_t pixBottom, int nWidth);
HRESULT ISurface_Rect(ISurface* ptr, const rectangle_t* rect, pixel_t pix, int nWidth);
HRESULT ISurface_GetClipRect(ISurface* ptr, rectangle_t* rect);
// {816B7D5a-910A-4187-AEF6-F30EFEFE4AEE}
DEFINE_GUID(IID_ISurface,
0x816b7d5a, 0x910a, 0x4187, 0xae, 0xf6, 0xf3, 0xe, 0xfe, 0xfe, 0x4a, 0xee);
#ifdef __cplusplus
}
#endif
#endif