#define PX_CREATE              1
#define PX_DESTROY             2
#define PX_CLEAR               3
#define PX_DRAW_RECT           4
#define PX_FILL_RECT           5
#define PX_LINE                6
#define PX_BLIT                7
#define PX_BLIT_TRANSPARENT    8
#define PX_BLIT_ALPHA          9



typedef unsigned int color_t;

typedef struct
{
  int x;
  int y;
}pt_t;

/***********               Clipping             **********/

typedef struct
{
  int xmin;
  int ymin;
  int xmax;
  int ymax;
}clip_t, *PTRclip;

#define CLIP_TOP          1
#define CLIP_BOTTOM       2
#define CLIP_RIGHT        4
#define CLIP_LEFT         8

int LineClip ( clip_t *clip, int *x1, int *y1, int *x2, int *y2 );

int BlockClip( clip_t *clip, int *x1, int *y1, int *x2, int* y2 );

typedef struct
{
  unsigned   width;
  unsigned   height;
  u32_t      format;
  u32_t      flags;
  size_t     pitch;
  void      *mapped;

  u32_t     handle;
}pixmap_t;


typedef struct
{
  unsigned   width;
  unsigned   height;
  u32_t      format;
  u32_t      flags;
  size_t     pitch;
  void      *mapped;

  unsigned  pitch_offset;
  addr_t    local;
}local_pixmap_t;

#define  PX_MEM_SYSTEM    0
#define  PX_MEM_LOCAL     1
#define  PX_MEM_GART      2

#define  PX_MEM_MASK      3

#define  PX_LOCK          1

typedef struct
{
  local_pixmap_t  *dstpix;

  color_t color;
}io_clear_t;

typedef struct
{
  local_pixmap_t  *dstpix;

  struct
  {
    int x0;
    int y0;
  };
  union
  {
    struct
    {
      int x1;
      int y1;
    };
    struct
    {
      int w;
      int h;
    };
  };
  color_t color;
  color_t border;
}io_draw_t;

typedef struct
{
  local_pixmap_t  *dstpix;

  int x;
  int y;
  int w;
  int h;

  color_t bkcolor;
  color_t fcolor;

  u32_t   bmp0;
  u32_t   bmp1;
  color_t border;
}io_fill_t;

typedef struct
{
  local_pixmap_t  *dstpix;
  int        dst_x;
  int        dst_y;

  local_pixmap_t  *srcpix;
  int        src_x;
  int        src_y;
  int        w;
  int        h;

  union {
    color_t    key;
    color_t    alpha;
  };
}io_blit_t;


static addr_t bind_pixmap(local_pixmap_t *pixmap);


int CreatePixmap(pixmap_t *io);

int DestroyPixmap(pixmap_t *io);

int ClearPixmap(io_clear_t *io);

int Line(io_draw_t *draw);

int DrawRect(io_draw_t * draw);

int FillRect(io_fill_t * fill);

int Blit(io_blit_t* blit);

int BlitTransparent(io_blit_t* blit);