/**************************************************************
$Id: objgfx30.h,v 1.4 2003/03/17 01:52:01 flameshadow Exp $
**************************************************************/

#ifndef OBJGFX30_H
#define OBJGFX30_H

#include <stdlib.h> // for NULL, true, false

#define ogVERSION 3.0;

typedef signed char            int8;
typedef signed short int       int16;
typedef signed long int        int32;
typedef signed long long int   int64;
typedef unsigned char          uInt8;
typedef unsigned short int     uInt16;
typedef unsigned long int      uInt32;
typedef unsigned long long int uInt64;

enum ogDataState { ogNONE, ogOWNER, ogALIASING };

struct ogRGB {
  uInt8 red;
  uInt8 green;
  uInt8 blue;
};

struct ogRGBA {
  uInt8 red;
  uInt8 green;
  uInt8 blue;
  uInt8 alpha;
};

struct ogPoint {
  int32 x;
  int32 y;
};

typedef 
  struct ogPixelFmt {
    uInt8 BPP;
    uInt8 redFieldPosition;
    uInt8 greenFieldPosition;
    uInt8 blueFieldPosition;
    uInt8 alphaFieldPosition;
    uInt8 redMaskSize;
    uInt8 greenMaskSize;
    uInt8 blueMaskSize;
    uInt8 alphaMaskSize;
  };

// Default pixel formats

const ogPixelFmt OG_NULL_PIXFMT      = { 0, 0,0,0,0,0,0,0,0};
const ogPixelFmt OG_PIXFMT_8BPP      = { 8, 0,0,0,0,0,0,0,0};
const ogPixelFmt OG_PIXFMT_15BPP     = {15, 10,5,0,15,5,5,5,1};
const ogPixelFmt OG_PIXFMT_16BPP     = {16, 11,5,0,0,5,6,5,0};
const ogPixelFmt OG_PIXFMT_24BPP     = {24, 16,8,0,0,8,8,8,0};
const ogPixelFmt OG_PIXFMT_32BPP     = {32, 16,8,0,24,8,8,8,8};
const ogPixelFmt OG_MAC_PIXFMT_16BPP = {16, 8,4,0,12,4,4,4,4};

class ogSurface {
 protected:
  float        version;
  void*        buffer;
  uInt32*      lineOfs;
  ogRGBA*      pal;
  ogSurface*   owner;
  uInt32       xRes, yRes;
  uInt32       maxX, maxY;
  uInt32       bSize;       // buffer size (in bytes)
  uInt32       lSize;       // LineOfs size (in bytes)
  uInt32       transparentColor;
  ogDataState  dataState;
  uInt8        BPP;         // bits per pixel
  uInt8        redFieldPosition;
  uInt8        greenFieldPosition;
  uInt8        blueFieldPosition;
  uInt8        alphaFieldPosition;
  uInt8        redShifter;
  uInt8        greenShifter;
  uInt8        blueShifter;
  uInt8        alphaShifter;
  bool         antiAlias;
  bool         clipLine(int32&, int32&, int32&, int32&);
  virtual void rawLine(uInt32, uInt32, uInt32, uInt32, uInt32);
  virtual uInt32 rawGetPixel(uInt32, uInt32);
  virtual void rawSetPixel(uInt32, uInt32, uInt32);
  void         aaRawLine(uInt32, uInt32, uInt32, uInt32, uInt32);
 public:
               ogSurface(void);
  virtual bool ogAlias(ogSurface&, uInt32, uInt32, uInt32, uInt32);
  virtual bool ogAvail(void);
  void         ogArc(int32, int32, uInt32, uInt32, uInt32, uInt32);
  void         ogBSpline(uInt32, ogPoint*, uInt32, uInt32);
  void         ogCircle(int32, int32, uInt32, uInt32);
  virtual void ogClear(uInt32);
  virtual bool ogClone(ogSurface&);
  void         ogCopy(ogSurface&);
  void         ogCopyBuf(int32, int32,
                 ogSurface&, int32, int32, int32, int32);
  virtual void ogCopyLineTo(uInt32, uInt32, const void *, uInt32);
  virtual void ogCopyLineFrom(uInt32, uInt32, void *, uInt32);
  void         ogCopyPal(ogSurface&);
  virtual bool ogCreate(uInt32, uInt32, ogPixelFmt);
  void         ogCubicBezierCurve(int32, int32, int32, int32,
                 int32, int32, int32, int32, uInt32, uInt32);
  void         ogCurve(int32,int32, int32,int32, int32,int32, uInt32, uInt32);
  void         ogFillCircle(int32, int32, uInt32, uInt32);
//  void         ogFillConvexPolygon(uInt32, ogPoint*, uInt32);
  void         ogFillPolygon(uInt32, ogPoint*, uInt32);
  void         ogFillRect(int32, int32, int32, int32, uInt32);
  void         ogFillTriangle(int32,int32, int32,int32, int32,int32, uInt32);
  bool         ogGetAntiAlias(void) const { return antiAlias; }
  uInt8        ogGetBPP(void) const { return BPP; }
  ogDataState  ogGetDataState(void) const { return dataState; }
  uInt32       ogGetMaxX(void) const { return maxX; }
  uInt32       ogGetMaxY(void) const { return maxY; }
  void         ogGetPixFmt(ogPixelFmt&);
  virtual uInt32 ogGetPixel(int32, int32);
  virtual void * ogGetPtr(uInt32, uInt32);
  uInt32       ogGetTransparentColor(void) { return transparentColor; }
  void         ogHFlip(void);
  virtual void ogHLine(int32, int32, int32, uInt32);
  void         ogLine(int32, int32, int32, int32, uInt32);
  virtual bool ogLoadPal(const char *);
  void         ogPolygon(uInt32, ogPoint*, uInt32);
  void         ogRect(int32, int32, int32, int32, uInt32);
  uInt32       ogRGB(uInt8, uInt8, uInt8);
  bool         ogSavePal(const char *);
  void         ogScale(ogSurface&);
  void         ogScaleBuf(int32, int32, int32, int32,
                 ogSurface&, int32, int32, int32, int32);
  bool         ogSetAntiAlias(bool);
  virtual void ogSetPixel(int32, int32, uInt32);
  virtual void ogSetRGBPalette(uInt8, uInt8, uInt8, uInt8);
  uInt32       ogSetTransparentColor(uInt32);
  void         ogSpline(uInt32, ogPoint*, uInt32, uInt32);
  void         ogTriangle(int32, int32, int32, int32, int32, int32, uInt32);
  void         ogUnpackRGB(uInt32, uInt8&, uInt8&, uInt8&);
  virtual void ogVFlip(void);
  virtual void ogVLine(int32, int32, int32, uInt32);
  virtual      ~ogSurface(void);
}; // ogSurface

#endif
