/*
     File:       RAVE.h
 
     Contains:   Interface for RAVE (Renderer Acceleration Virtual Engine)
 
     Version:    Technology: Quickdraw 3D 1.6
                 Release:    Universal Interfaces 3.4
 
     Copyright:  © 1995-2001 by Apple Computer, Inc., all rights reserved.
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef __RAVE__
#define __RAVE__

#ifndef __CONDITIONALMACROS__
#include <ConditionalMacros.h>
#endif


#if TARGET_OS_MAC
#ifndef __MACTYPES__
#include <MacTypes.h>
#endif

#ifndef __QUICKDRAW__
#include <Quickdraw.h>
#endif

#ifndef __QDOFFSCREEN__
#include <QDOffscreen.h>
#endif


#endif  /* TARGET_OS_MAC */

#if TARGET_OS_WIN32
#include <windows.h>
#ifndef RAVE_NO_DIRECTDRAW
#include <ddraw.h>
#endif  /* !defined(RAVE_NO_DIRECTDRAW) */

#endif  /* TARGET_OS_WIN32 */



#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=power
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif

#if PRAGMA_ENUM_ALWAYSINT
    #if defined(__fourbyteints__) && !__fourbyteints__ 
        #define __RAVE__RESTORE_TWOBYTEINTS
        #pragma fourbyteints on
    #endif
    #pragma enumsalwaysint on
#elif PRAGMA_ENUM_OPTIONS
    #pragma option enum=int
#elif PRAGMA_ENUM_PACK
    #if __option(pack_enums)
        #define __RAVE__RESTORE_PACKED_ENUMS
        #pragma options(!pack_enums)
    #endif
#endif

#define RAVE_OBSOLETE 0

/******************************************************************************
 *
 * Platform macros.
 * This sets kQAPlatform to one of kQAMacOS, kQAWin32, or kQAGeneric.
 * kQAPlatform controls platform-specific compilation switches and types.
 *
 *****************************************************************************/

#if !defined(kQAMacOS)
#define kQAMacOS        1           /* Target is MacOS                  */
#endif

#if !defined(kQAGeneric)
#define kQAGeneric      2           /* Target is generic platform       */
#endif

#if !defined(kQAWin32)
#define kQAWin32        3           /* Target is Win32                  */
#endif

#if defined(_WIN32) || defined(_WINDOWS)
    #define kQAPlatform kQAWin32
#elif !defined(kQAPlatform)
    #define kQAPlatform kQAMacOS
#endif


/******************************************************************************
 *
 * Export Control
 *
 *****************************************************************************/
#if defined(_MSC_VER)
    /* Microsoft Visual C */
    #if defined(WIN32_RAVEEXPORTING)    
    /* define when building DLL */
        #define RAVE_EXPORT     __declspec( dllexport )
        #define RAVE_CALL
        #define RAVE_CALLBACK
    #else
        #define RAVE_EXPORT     __declspec( dllimport )
        #define RAVE_CALL       __cdecl
        #define RAVE_CALLBACK   __cdecl
    #endif 
    /* WIN32_RAVEEXPORTING */
#else
    #define RAVE_EXPORT
    #define RAVE_CALL
    #define RAVE_CALLBACK
#endif 
/* _MSC_VER */

/******************************************************************************
 *
 * Platform dependent datatypes: TQAImagePixelType, TQADevice, TQAClip, and TQARect.
 *
 *****************************************************************************/

enum TQAImagePixelType {
  kQAPixel_Alpha1               = 0,    /* 1 bit/pixel alpha */
  kQAPixel_RGB16                = 1,    /* 16 bits/pixel, R=14:10, G=9:5, B=4:0 */
  kQAPixel_ARGB16               = 2,    /* 16 bits/pixel, A=15, R=14:10, G=9:5, B=4:0 */
  kQAPixel_RGB32                = 3,    /* 32 bits/pixel, R=23:16, G=15:8, B=7:0 */
  kQAPixel_ARGB32               = 4,    /* 32 bits/pixel, A=31:24, R=23:16, G=15:8, B=7:0 */
  kQAPixel_CL4                  = 5,    /* 4 bit color look up table, always big endian, ie high 4 bits effect left pixel */
  kQAPixel_CL8                  = 6,    /* 8 bit color look up table */
  kQAPixel_RGB16_565            = 7,    /* Win32 ONLY  16 bits/pixel, no alpha, R:5, G:6, B:5 */
  kQAPixel_RGB24                = 8,    /* Win32 ONLY  24 bits/pixel, no alpha, R:8, G:8, B:8 */
  kQAPixel_RGB8_332             = 9,    /* 8 bits/pixel, R=7:5, G = 4:2, B = 1:0 */
  kQAPixel_ARGB16_4444          = 10,   /* 16 bits/pixel, A=15:12, R=11:8, G=7:4, B=3:0 */
  kQAPixel_ACL16_88             = 11,   /* 16 bits/pixel, A=15:8, CL=7:0, 8 bit alpha + 8 bit color lookup */
  kQAPixel_I8                   = 12,   /* 8 bits/pixel, I=7:0, intensity map (grayscale) */
  kQAPixel_AI16_88              = 13,   /* 16 bits/pixel, A=15:8, I=7:0, intensity map (grayscale) */
  kQAPixel_YUVS                 = 14,   /* 16 bits/pixel, QD's kYUVSPixelFormat (4:2:2, YUYV ordering, unsigned UV) */
  kQAPixel_YUVU                 = 15,   /* 16 bits/pixel, QD's kYUVUPixelFormat (4:2:2, YUYV ordering, signed UV) */
  kQAPixel_YVYU422              = 16,   /* 16 bits/pixel, QD's kYVYU422PixelFormat (4:2:2, YVYU ordering, unsigned UV) */
  kQAPixel_UYVY422              = 17    /* 16 bits/pixel, QD's kUYVY422PixelFormat (4:2:2, UYVY ordering, unsigned UV) */
};
typedef enum TQAImagePixelType TQAImagePixelType;


enum TQAColorTableType {
  kQAColorTable_CL8_RGB32       = 0,    /* 256 entry, 32 bit/pixel, R=23:16, G=15:8, B=7:0 */
  kQAColorTable_CL4_RGB32       = 1     /* 16 entry, 32 bit/pixel, R=23:16, G=15:8, B=7:0 */
};
typedef enum TQAColorTableType TQAColorTableType;

/* Selects target device type */

enum TQADeviceType {
  kQADeviceMemory               = 0,    /* Memory draw context */
  kQADeviceGDevice              = 1,    /* Macintosh GDevice draw context */
  kQADeviceWin32DC              = 2,    /* Win32 DC */
  kQADeviceDDSurface            = 3     /* Win32 DirectDraw Surface */
};
typedef enum TQADeviceType TQADeviceType;

/* Generic memory pixmap device */
struct TQADeviceMemory {
  long                rowBytes;               /* Rowbytes */
  TQAImagePixelType   pixelType;              /* Depth, color space, etc. */
  long                width;                  /* Width in pixels */
  long                height;                 /* Height in pixels */
  void *              baseAddr;               /* Base address of pixmap */
};
typedef struct TQADeviceMemory          TQADeviceMemory;
/* Offscreen Device */
struct TQADeviceOffscreen {
  TQAImagePixelType   pixelType;              /* Depth, color space, etc. */
};
typedef struct TQADeviceOffscreen       TQADeviceOffscreen;
/* Selects target clip type */

enum TQAClipType {
  kQAClipRgn                    = 0,    /* Macintosh clipRgn with serial number */
  kQAClipWin32Rgn               = 1     /* Win32 clip region */
};
typedef enum TQAClipType TQAClipType;

struct TQARect {
  long                left;
  long                right;
  long                top;
  long                bottom;
};
typedef struct TQARect                  TQARect;
#if TARGET_OS_MAC
union TQAPlatformDevice {
  TQADeviceMemory     memoryDevice;
  GDHandle            gDevice;
};
typedef union TQAPlatformDevice         TQAPlatformDevice;
union TQAPlatformClip {
  RgnHandle           clipRgn;
};
typedef union TQAPlatformClip           TQAPlatformClip;
typedef CALLBACK_API( void , TQADrawNotificationProcPtr )(short left, short top, short right, short bottom, long refCon);

typedef long                            TQADrawNotificationProcRefNum;
/* used to unregister your proc */
#elif TARGET_OS_WIN32

#if !defined(RAVE_NO_DIRECTDRAW)

    enum TQADirectDrawObjectSelector
    {
        kQADirectDrawObject     = 1,
        kQADirectDrawObject2    = 2
    };
    typedef enum TQADirectDrawObjectSelector TQADirectDrawObjectSelector;

    enum TQADirectDrawSurfaceSelector
    {
        kQADirectDrawSurface    = 1,
        kQADirectDrawSurface2   = 2
    };
    typedef enum TQADirectDrawSurfaceSelector TQADirectDrawSurfaceSelector;

#endif /* !RAVE_NO_DIRECTDRAW */

    union TQAPlatformDevice
    {
        TQADeviceMemory         memoryDevice;
        HDC                     hdc;
#if !defined(RAVE_NO_DIRECTDRAW)
        struct
        {
            TQADirectDrawObjectSelector     objectSelector;
            union
            {
                LPDIRECTDRAW                lpDirectDraw;
                LPDIRECTDRAW2               lpDirectDraw2;
            };

            TQADirectDrawSurfaceSelector    surfaceSelector;
            union
            {
                LPDIRECTDRAWSURFACE         lpDirectDrawSurface;
                LPDIRECTDRAWSURFACE2        lpDirectDrawSurface2;
            };
        };
#endif /* RAVE_NO_DIRECTDRAW */
    };
    typedef union TQAPlatformDevice TQAPlatformDevice;
    
    union TQAPlatformClip
    {
        HRGN            clipRgn;
    };
    typedef union TQAPlatformClip TQAPlatformClip;

#else
/*
     * Generic platform supports memory device only. TQARect is generic. TQAClip is ???.
     */
union TQAPlatformDevice {
  TQADeviceMemory     memoryDevice;
};
typedef union TQAPlatformDevice         TQAPlatformDevice;
union TQAPlatformClip {
  void *              region;                 /* ??? */
};
typedef union TQAPlatformClip           TQAPlatformClip;
#endif  /*  */

struct TQADevice {
  TQADeviceType       deviceType;
  TQAPlatformDevice   device;
};
typedef struct TQADevice                TQADevice;
struct TQAClip {
  TQAClipType         clipType;
  TQAPlatformClip     clip;
};
typedef struct TQAClip                  TQAClip;
/******************************************************************************
 *
 * Basic data types.
 *
 *****************************************************************************/

/* Pointer to a drawing engine */
typedef struct TQAEngine TQAEngine;
/* Pointer to an allocated texture */
typedef struct TQATexture TQATexture;
/* Pointer to an allocated bitmap */
typedef struct TQABitmap TQABitmap;
/* Engine's private draw context pointer */
typedef struct TQADrawPrivate TQADrawPrivate;
/* An engine specific color table structure */
typedef struct TQAColorTable TQAColorTable;
/* A single triangle element for QADrawTriMesh */
struct TQAIndexedTriangle {
  unsigned long       triangleFlags;          /* Triangle flags, see kQATriFlags_ */
  unsigned long       vertices[3];            /* Indices into a vertex array */
};
typedef struct TQAIndexedTriangle       TQAIndexedTriangle;
/* An image for use as texture or bitmap */
struct TQAImage {
  long                width;                  /* Width of pixmap */
  long                height;                 /* Height of pixmap */
  long                rowBytes;               /* Rowbytes of pixmap */
  void *              pixmap;                 /* Pixmap */
};
typedef struct TQAImage                 TQAImage;
/* a pixel buffer */

typedef TQADeviceMemory                 TQAPixelBuffer;
/* a zbuffer */
struct TQAZBuffer {
  long                width;                  /* Width of pixmap */
  long                height;                 /* Height of pixmap */
  long                rowBytes;               /* Rowbytes of pixmap */
  void *              zbuffer;                /* pointer to the zbuffer data */
  long                zDepth;                 /* bit depth of zbuffer (16,24,32...) */
  long                isBigEndian;            /* true if zbuffer values are in big-endian format, false if little-endian */
};
typedef struct TQAZBuffer               TQAZBuffer;
/* Standard error type */

enum TQAError {
  kQANoErr                      = 0,    /* No error */
  kQAError                      = 1,    /* Generic error flag */
  kQAOutOfMemory                = 2,    /* Insufficient memory */
  kQANotSupported               = 3,    /* Requested feature is not supported */
  kQAOutOfDate                  = 4,    /* A newer drawing engine was registered */
  kQAParamErr                   = 5,    /* Error in passed parameters */
  kQAGestaltUnknown             = 6,    /* Requested gestalt type isn't available */
  kQADisplayModeUnsupported     = 7,    /* Engine cannot render to the display in its current , */
                                        /* mode, but could if it were in some other mode */
  kQAOutOfVideoMemory           = 8     /* There is not enough VRAM to support the desired context dimensions */
};
typedef enum TQAError TQAError;

/* TQABoolean */

typedef unsigned char                   TQABoolean;
/************************************************************************************************
 *
 * Vertex data types.
 *
 ***********************************************************************************************/
/*
 * TQAVGouraud is used for Gouraud shading. Each vertex specifies position, color and Z.
 *
 * Alpha is always treated as indicating transparency. Drawing engines which don't
 * support Z-sorted rendering use the back-to-front transparency blending functions
 * shown below. (ARGBsrc are the source (new) values, ARGBdest are  the destination
 * (previous) pixel values.)
 *
 *      Premultiplied                           Interpolated
 *
 *      A = 1 - (1 - Asrc) * (1 - Adest)        A = 1 - (1 - Asrc) * (1 - Adest) 
 *      R = (1 - Asrc) * Rdest + Rsrc           R = (1 - Asrc) * Rdest + Asrc * Rsrc
 *      G = (1 - Asrc) * Gdest + Gsrc           G = (1 - Asrc) * Gdest + Asrc * Gsrc
 *      B = (1 - Asrc) * Bdest + Bsrc           B = (1 - Asrc) * Bdest + Asrc * Bsrc
 *
 * Note that the use of other blending modes to implement antialiasing is performed
 * automatically by the drawing engine when the kQATag_Antialias variable !=
 * kQAAntiAlias_Fast. The driving software should continue to use the alpha fields
 * for transparency even when antialiasing is being used (the drawing engine will
 * resolve the multiple blending requirements as best as it can).
 *
 * Drawing engines which perform front-to-back Z-sorted rendering should replace
 * the blending function shown above with the equivalent front-to-back formula.
 */
struct TQAVGouraud {
  float               x;                      /* X pixel coordinate, 0.0 <= x < width */
  float               y;                      /* Y pixel coordinate, 0.0 <= y < height */
  float               z;                      /* Z coordinate, 0.0 <= z <= 1.0 */
  float               invW;                   /* 1 / w; required only when kQAPerspectiveZ_On is set */

  float               r;                      /* Red, 0.0 <= r <= 1.0 */
  float               g;                      /* Green, 0.0 <= g <= 1.0 */
  float               b;                      /* Blue, 0.0 <= b <= 1.0 */
  float               a;                      /* Alpha, 0.0 <= a <= 1.0, 1.0 is opaque */
};
typedef struct TQAVGouraud              TQAVGouraud;
/*
 * TQAVTexture is used for texture mapping. The texture mapping operation
 * is controlled by the kQATag_TextureOp variable, which is a mask of
 * kQATextureOp_None/Modulate/Highlight/Decal. Below is pseudo-code for the
 * texture shading operation:
 *
 *      texPix = TextureLookup (uq/q, vq/q);
 *      if (kQATextureOp_Decal)
 *      {
 *          texPix.r = texPix.a * texPix.r + (1 - texPix.a) * r;
 *          texPix.g = texPix.a * texPix.g + (1 - texPix.a) * g;
 *          texPix.b = texPix.a * texPix.b + (1 - texPix.a) * b;
 *          texPix.a = a;
 *      }
 *      else
 *      {
 *          texPix.a = texPix.a * a;
 *      }
 *      if (kQATextureOp_Modulate)
 *      {
 *          texPix.r *= kd_r;       // Clamped to prevent overflow
 *          texPix.g *= kd_g;       // Clamped to prevent overflow
 *          texPix.b *= kd_b;       // Clamped to prevent overflow
 *      }
 *      if (kQATextureOp_Highlight)
 *      {
 *          texPix.r += ks_r;       // Clamped to prevent overflow
 *          texPix.g += ks_g;       // Clamped to prevent overflow
 *          texPix.b += ks_b;       // Clamped to prevent overflow
 *      }
 *
 * After computation of texPix, transparency blending (as shown
 * above for TQAVGouraud) is performed.
 */
struct TQAVTexture {
  float               x;                      /* X pixel coordinate, 0.0 <= x < width */
  float               y;                      /* Y pixel coordinate, 0.0 <= y < height */
  float               z;                      /* Z coordinate, 0.0 <= z <= 1.0 */
  float               invW;                   /* 1 / w (always required) */

                                              /* rgb are used only when kQATextureOp_Decal is set. a is always required */

  float               r;                      /* Red, 0.0 <= r <= 1.0 */
  float               g;                      /* Green, 0.0 <= g <= 1.0 */
  float               b;                      /* Blue, 0.0 <= b <= 1.0 */
  float               a;                      /* Alpha, 0.0 <= a <= 1.0, 1.0 is opaque */

                                              /* uOverW and vOverW are required by all modes */

  float               uOverW;                 /* u / w */
  float               vOverW;                 /* v / w */

                                              /* kd_r/g/b are used only when kQATextureOp_Modulate is set */

  float               kd_r;                   /* Scale factor for texture red, 0.0 <= kd_r */
  float               kd_g;                   /* Scale factor for texture green, 0.0 <= kd_g */
  float               kd_b;                   /* Scale factor for texture blue, 0.0 <= kd_b */

                                              /* ks_r/g/b are used only when kQATextureOp_Highlight is set */

  float               ks_r;                   /* Red specular highlight, 0.0 <= ks_r <= 1.0 */
  float               ks_g;                   /* Green specular highlight, 0.0 <= ks_g <= 1.0 */
  float               ks_b;                   /* Blue specular highlight, 0.0 <= ks_b <= 1.0 */
};
typedef struct TQAVTexture              TQAVTexture;
/*
*  TQAVMultiTexture allows you to specify the uv and invW values
*  for secondary textures.  This data is submitted with the
*  QASubmitMultiTextureParams() call.
*/
struct TQAVMultiTexture {
  float               invW;
  float               uOverW;
  float               vOverW;
};
typedef struct TQAVMultiTexture         TQAVMultiTexture;

/************************************************************************************************
 *
 * Constants used for the state variables.
 *
 ***********************************************************************************************/
/*
 * kQATag_xxx is used to select a state variable when calling QASetFloat(), QASetInt(),
 * QAGetFloat() and QAGetInt(). The kQATag values are split into three separate enumerated
 * types: TQATagInt, TQATagPtr and TQATagFloat. TQATagInt is used for the QASet/GetInt()
 * functions, TQATagPtr is used for the QASet/GetPtr() functions, and TQATagFloat is used for 
 * the QASet/GetFloat() functions. (This is so that a compiler that typechecks enums can flag
 * a float/int tag mismatch during compile.)
 *
 * -=- All tag values must be unique even across all three types. -=-
 *
 * These variables are required by all drawing engines:
 *      kQATag_ZFunction            (Int)   One of kQAZFunction_xxx
 *      kQATag_ColorBG_a            (Float) Background color alpha
 *      kQATag_ColorBG_r            (Float) Background color red
 *      kQATag_ColorBG_g            (Float) Background color green
 *      kQATag_ColorBG_b            (Float) Background color blue
 *      kQATag_Width                (Float) Line and point width (pixels)
 *      kQATag_ZMinOffset           (Float) Min offset to Z to guarantee visibility (Read only!)
 *      kQATag_ZMinScale            (Float) Min scale to Z to guarantee visibility (Read only!)
 
 * These variables are used for optional features:
 *      kQATag_Antialias            (Int)   One of kQAAntiAlias_xxx
 *      kQATag_Blend                (Int)   One of kQABlend_xxx
 *      kQATag_PerspectiveZ         (Int)   One of kQAPerspectiveZ_xxx
 *      kQATag_TextureFilter        (Int)   One of kQATextureFilter_xxx
 *      kQATag_TextureOp            (Int)   Mask of kQATextureOp_xxx
 *      kQATag_Texture              (Ptr)   Pointer to current TQATexture
 *      kQATag_CSGTag               (Int)   One of kQACSGTag_xxx
 *      kQATag_CSGEquation          (Int)   32 bit CSG truth table
 *      kQATag_FogMode              (Int)   One of kQAFogMode_xxxx
 *      kQATag_FogColor_a           (Float) Fog color alpha
 *      kQATag_FogColor_r           (Float) Fog color red
 *      kQATag_FogColor_g           (Float) Fog color green
 *      kQATag_FogColor_b           (Float) Fog color blue
 *      kQATag_FogStart             (Float) Fog start
 *      kQATag_FogEnd               (Float) Fog end
 *      kQATag_FogDensity           (Float) Fog density
 *      kQATag_FogMaxDepth          (Float) Maximun value for 1.0 / invW
 *      kQATag_MipmapBias           (Float) The mipmap page bias factor
 *      kQATag_ChannelMask          (Int) one of kQAChannelMask_xxx
 *      kQATag_ZBufferMask          (Int) one of kQAZBufferMask_xxx
 *      kQATag_ZSortedHint          (Int) 1 = depth sort transparent triangles, 0 = do not sort.
 *      kQATag_Chromakey_r          (Float) chroma key red
 *      kQATag_Chromakey_g          (Float) chroma key green
 *      kQATag_Chromakey_b          (Float) chroma key blue
 *      kQATag_ChromakeyEnable      (Int) 1 = enable chroma keying, 0 = disable chroma keying
 *      kQATag_AlphaTestFunc        (Int) one of kQAAlphaTest_xxx
 *      kQATag_AlphaTestRef         (Float) from 0 to 1
 *      kQATag_DontSwap             (Int) 1 = dont swap buffers during QARenderEnd, 0 = do swap buffers during QARenderEnd.

 *      kQATag_MultiTextureOp       (Int) One of kQAMultiTexture_xxx
 *      kQATag_MultiTextureFilter   (Int) One of kQATextureFilter_xxx
 *      kQATag_MultiTextureCurrent  (Int) which multitexture layer to use for all other multitexture funcs
 *      kQATag_MultiTextureEnable   (Int) how many multitexture layers to use (0 = no multitexturing).
 *      kQATag_MultiTextureWrapU    (Int)
 *      kQATag_MultiTextureWrapV    (Int)
 *      kQATag_MultiTextureMagFilter (Int)
 *      kQATag_MultiTextureMinFilter (Int)
 *      kQATag_MultiTextureBorder_a (Float)
 *      kQATag_MultiTextureBorder_r (Float)
 *      kQATag_MultiTextureBorder_g (Float)
 *      kQATag_MultiTextureBorder_b (Float)
 *      kQATag_MultiTextureMipmapBias (Float)
 *      kQATag_MultiTextureFactor    (Float) used with kQAMultiTexture_Fixed to determine blending factor
 *
 * These variables are used for OpenGLª support:
 *      kQATagGL_DrawBuffer         (Int)   Mask of kQAGL_DrawBuffer_xxx
 *      kQATagGL_TextureWrapU       (Int)   kQAGL_Clamp or kQAGL_Repeat
 *      kQATagGL_TextureWrapV       (Int)   kQAGL_Clamp or kQAGL_Repeat
 *      kQATagGL_TextureMagFilter   (Int)   kQAGL_Nearest or kQAGL_Linear
 *      kQATagGL_TextureMinFilter   (Int)   kQAGL_Nearest, etc.
 *      kQATagGL_ScissorXMin        (Int)   Minimum X value for scissor rectangle
 *      kQATagGL_ScissorYMin        (Int)   Minimum Y value for scissor rectangle
 *      kQATagGL_ScissorXMax        (Int)   Maximum X value for scissor rectangle
 *      kQATagGL_ScissorYMax        (Int)   Maximum Y value for scissor rectangle
 *      kQATagGL_BlendSrc           (Int)   Source blending operation
 *      kQATagGL_BlendDst           (Int)   Destination blending operation
 *      kQATagGL_LinePattern        (Int)   Line rasterization pattern
 *      kQATagGL_AreaPattern0       (Int)   First of 32 area pattern registers
 *      kQATagGL_AreaPattern31      (Int)   Last of 32 area pattern registers
 *
 *      kQATagGL_DepthBG            (Float) Background Z
 *      kQATagGL_TextureBorder_a    (Float) Texture border color alpha
 *      kQATagGL_TextureBorder_r    (Float) Texture border color red
 *      kQATagGL_TextureBorder_g    (Float) Texture border color green
 *      kQATagGL_TextureBorder_b    (Float) Texture border color blue
 *
 * Tags >= kQATag_EngineSpecific_Minimum may be assigned by the vendor for use as
 * engine-specific variables. NOTE: These should be used only in exceptional circumstances,
 * as functions performed by these variables won't be generally accessible. All other tag
 * values are reserved.
 *
 *      kQATag_EngineSpecific_Minimum   Minimum tag value for drawing-engine specific variables
 */

enum TQATagInt {
  kQATag_ZFunction              = 0,
  kQATag_Antialias              = 8,
  kQATag_Blend                  = 9,
  kQATag_PerspectiveZ           = 10,
  kQATag_TextureFilter          = 11,
  kQATag_TextureOp              = 12,
  kQATag_CSGTag                 = 14,
  kQATag_CSGEquation            = 15,
  kQATag_BufferComposite        = 16,
  kQATag_FogMode                = 17,
  kQATag_ChannelMask            = 27,
  kQATag_ZBufferMask            = 28,
  kQATag_ZSortedHint            = 29,
  kQATag_ChromakeyEnable        = 30,
  kQATag_AlphaTestFunc          = 31,
  kQATag_DontSwap               = 32,
  kQATag_MultiTextureEnable     = 33,
  kQATag_MultiTextureCurrent    = 34,
  kQATag_MultiTextureOp         = 35,
  kQATag_MultiTextureFilter     = 36,
  kQATag_MultiTextureWrapU      = 37,
  kQATag_MultiTextureWrapV      = 38,
  kQATag_MultiTextureMagFilter  = 39,
  kQATag_MultiTextureMinFilter  = 40,
  kQATag_BitmapFilter           = 54,   /* filter to use while scaling bitmaps, one of kQAFilter_xxx */
  kQATag_DrawContextFilter      = 55,   /* filter to use while scaling draw contexts, one of kQAFilter_xxx */
  kQATagGL_DrawBuffer           = 100,
  kQATagGL_TextureWrapU         = 101,
  kQATagGL_TextureWrapV         = 102,
  kQATagGL_TextureMagFilter     = 103,
  kQATagGL_TextureMinFilter     = 104,
  kQATagGL_ScissorXMin          = 105,
  kQATagGL_ScissorYMin          = 106,
  kQATagGL_ScissorXMax          = 107,
  kQATagGL_ScissorYMax          = 108,
  kQATagGL_BlendSrc             = 109,
  kQATagGL_BlendDst             = 110,
  kQATagGL_LinePattern          = 111,
  kQATagGL_AreaPattern0         = 117,  /* ...kQATagGL_AreaPattern1-30 */
  kQATagGL_AreaPattern31        = 148,
  kQATagGL_LinePatternFactor    = 149,  /* equivalent to GL_LINE_STIPPLE_REPEAT */
  kQATag_EngineSpecific_Minimum = 1000
};
typedef enum TQATagInt TQATagInt;


enum TQATagPtr {
  kQATag_Texture                = 13,
  kQATag_MultiTexture           = 26
};
typedef enum TQATagPtr TQATagPtr;


enum TQATagFloat {
  kQATag_ColorBG_a              = 1,
  kQATag_ColorBG_r              = 2,
  kQATag_ColorBG_g              = 3,
  kQATag_ColorBG_b              = 4,
  kQATag_Width                  = 5,
  kQATag_ZMinOffset             = 6,
  kQATag_ZMinScale              = 7,
  kQATag_FogColor_a             = 18,
  kQATag_FogColor_r             = 19,
  kQATag_FogColor_g             = 20,
  kQATag_FogColor_b             = 21,
  kQATag_FogStart               = 22,
  kQATag_FogEnd                 = 23,
  kQATag_FogDensity             = 24,
  kQATag_FogMaxDepth            = 25,
  kQATag_MipmapBias             = 41,
  kQATag_MultiTextureMipmapBias = 42,
  kQATag_Chromakey_r            = 43,
  kQATag_Chromakey_g            = 44,
  kQATag_Chromakey_b            = 45,
  kQATag_AlphaTestRef           = 46,
  kQATag_MultiTextureBorder_a   = 47,
  kQATag_MultiTextureBorder_r   = 48,
  kQATag_MultiTextureBorder_g   = 49,
  kQATag_MultiTextureBorder_b   = 50,
  kQATag_MultiTextureFactor     = 51,
  kQATag_BitmapScale_x          = 52,   /* horizontal bitmap scale factor, default value is 1.0 */
  kQATag_BitmapScale_y          = 53,   /* vertical bitmap scale factor, default value is 1.0 */
  kQATag_MultiTextureEnvColor_a = 56,
  kQATag_MultiTextureEnvColor_r = 57,
  kQATag_MultiTextureEnvColor_g = 58,
  kQATag_MultiTextureEnvColor_b = 59,
  kQATagGL_DepthBG              = 112,
  kQATagGL_TextureBorder_a      = 113,
  kQATagGL_TextureBorder_r      = 114,
  kQATagGL_TextureBorder_g      = 115,
  kQATagGL_TextureBorder_b      = 116,
  kQATagGL_TextureEnvColor_a    = 150,
  kQATagGL_TextureEnvColor_r    = 151,
  kQATagGL_TextureEnvColor_g    = 152,
  kQATagGL_TextureEnvColor_b    = 153
};
typedef enum TQATagFloat TQATagFloat;


/* kQATag_ZFunction */
enum {
  kQAZFunction_None             = 0,    /* Z is neither tested nor written (same as no Z buffer) */
  kQAZFunction_LT               = 1,    /* Znew < Zbuffer is visible */
  kQAZFunction_EQ               = 2,    /* Znew == Zbuffer is visible */
  kQAZFunction_LE               = 3,    /* Znew <= Zbuffer is visible */
  kQAZFunction_GT               = 4,    /* Znew > Zbuffer is visible */
  kQAZFunction_NE               = 5,    /* Znew != Zbuffer is visible */
  kQAZFunction_GE               = 6,    /* Znew >= Zbuffer is visible */
  kQAZFunction_True             = 7,    /* Znew is always visible */
  kQAZFunction_False            = 8     /* Znew is never visible */
};

/* kQATag_Width */
#define kQAMaxWidth 128.0
/* kQATag_Antialias */
enum {
  kQAAntiAlias_Off              = 0,
  kQAAntiAlias_Fast             = 1,
  kQAAntiAlias_Mid              = 2,
  kQAAntiAlias_Best             = 3
};

/* kQATag_Blend */
enum {
  kQABlend_PreMultiply          = 0,
  kQABlend_Interpolate          = 1,
  kQABlend_OpenGL               = 2
};

/* kQATag_BufferComposite */
enum {
  kQABufferComposite_None       = 0,    /* Default: New pixels overwrite initial buffer contents */
  kQABufferComposite_PreMultiply = 1,   /* New pixels are blended with initial buffer contents via PreMultiply */
  kQABufferComposite_Interpolate = 2    /* New pixels are blended with initial buffer contents via Interpolate */
};

/* kQATag_PerspectiveZ */
enum {
  kQAPerspectiveZ_Off           = 0,    /* Use Z for hidden surface removal */
  kQAPerspectiveZ_On            = 1     /* Use InvW for hidden surface removal */
};

/* kQATag_TextureFilter */
enum {
                                        /* suggested meanings of these values */
  kQATextureFilter_Fast         = 0,    /* No filtering, pick nearest */
  kQATextureFilter_Mid          = 1,    /* Fastest method that does some filtering */
  kQATextureFilter_Best         = 2     /* Highest quality renderer can do */
};

/* filter tag values */
enum {
                                        /* suggested meanings of these values */
  kQAFilter_Fast                = 0,    /* No filtering, pick nearest */
  kQAFilter_Mid                 = 1,    /* Fastest method that does some filtering */
  kQAFilter_Best                = 2     /* Highest quality renderer can do */
};

/* kQATag_TextureOp (mask of one or more) */
enum {
  kQATextureOp_None             = 0,    /* Default texture mapping mode */
  kQATextureOp_Modulate         = (1 << 0), /* Modulate texture color with kd_r/g/b */
  kQATextureOp_Highlight        = (1 << 1), /* Add highlight value ks_r/g/b */
  kQATextureOp_Decal            = (1 << 2), /* When texture alpha == 0, use rgb instead */
  kQATextureOp_Shrink           = (1 << 3), /* This is a non-wrapping texture, so the ??? */
  kQATextureOp_Blend            = (1 << 4) /* Same as GL_TEXTURE_ENV_MODE GL_BLEND */
};

/* kQATag_MultiTextureOp */
enum {
  kQAMultiTexture_Add           = 0,    /* texels are added to form final pixel */
  kQAMultiTexture_Modulate      = 1,    /* texels are multiplied to form final pixel */
  kQAMultiTexture_BlendAlpha    = 2,    /* texels are blended according to 2nd texel's alpha */
  kQAMultiTexture_Fixed         = 3     /* texels are blended by a fixed factor via kQATag_MultiTextureFactor  */
};

/* kQATag_CSGTag */
#define kQACSGTag_None 0xffffffffUL
enum {
  kQACSGTag_0                   = 0,    /* Submitted tris have CSG ID 0 */
  kQACSGTag_1                   = 1,    /* Submitted tris have CSG ID 1 */
  kQACSGTag_2                   = 2,    /* Submitted tris have CSG ID 2 */
  kQACSGTag_3                   = 3,    /* Submitted tris have CSG ID 3 */
  kQACSGTag_4                   = 4     /* Submitted tris have CSG ID 4 */
};

/* kQATagGL_TextureWrapU/V */
enum {
  kQAGL_Repeat                  = 0,
  kQAGL_Clamp                   = 1
};

/* kQATagGL_BlendSrc */
enum {
  kQAGL_SourceBlend_XXX         = 0
};

/* kQATagGL_BlendDst */
enum {
  kQAGL_DestBlend_XXX           = 0
};

/* kQATagGL_DrawBuffer (mask of one or more) */
enum {
  kQAGL_DrawBuffer_None         = 0,
  kQAGL_DrawBuffer_FrontLeft    = (1 << 0),
  kQAGL_DrawBuffer_FrontRight   = (1 << 1),
  kQAGL_DrawBuffer_BackLeft     = (1 << 2),
  kQAGL_DrawBuffer_BackRight    = (1 << 3),
  kQAGL_DrawBuffer_Front        = (kQAGL_DrawBuffer_FrontLeft | kQAGL_DrawBuffer_FrontRight),
  kQAGL_DrawBuffer_Back         = (kQAGL_DrawBuffer_BackLeft | kQAGL_DrawBuffer_BackRight)
};

/* kQATag_FogMode */
enum {
  kQAFogMode_None               = 0,    /* no fog                     */
  kQAFogMode_Alpha              = 1,    /* fog value is alpha               */
  kQAFogMode_Linear             = 2,    /* fog = (end - z) / (end - start)         */
  kQAFogMode_Exponential        = 3,    /* fog = exp(-density * z)              */
  kQAFogMode_ExponentialSquared = 4     /* fog = exp(-density * z * density * z)  */
};


/* kQATag_ChannelMask */
enum {
  kQAChannelMask_r              = (1 << 0),
  kQAChannelMask_g              = (1 << 1),
  kQAChannelMask_b              = (1 << 2),
  kQAChannelMask_a              = (1 << 3)
};


/* kQATag_ZBufferMask */
enum {
  kQAZBufferMask_Disable        = 0,
  kQAZBufferMask_Enable         = 1
};

/* kQATag_AlphaTestFunc */
enum {
  kQAAlphaTest_None             = 0,
  kQAAlphaTest_LT               = 1,
  kQAAlphaTest_EQ               = 2,
  kQAAlphaTest_LE               = 3,
  kQAAlphaTest_GT               = 4,
  kQAAlphaTest_NE               = 5,
  kQAAlphaTest_GE               = 6,
  kQAAlphaTest_True             = 7
};


/* flags for QAAccess__xxx */
enum {
  kQANoCopyNeeded               = (1 << 0)
};


/************************************************************************************************
 *
 * Constants used as function parameters.
 *
 ***********************************************************************************************/
/*
 * TQAVertexMode is a parameter to QADrawVGouraud() and QADrawVTexture() that specifies how
 * to interpret and draw the vertex array.
 */

enum TQAVertexMode {
  kQAVertexMode_Point           = 0,    /* Draw nVertices points */
  kQAVertexMode_Line            = 1,    /* Draw nVertices/2 line segments */
  kQAVertexMode_Polyline        = 2,    /* Draw nVertices-1 connected line segments */
  kQAVertexMode_Tri             = 3,    /* Draw nVertices/3 triangles */
  kQAVertexMode_Strip           = 4,    /* Draw nVertices-2 triangles as a strip */
  kQAVertexMode_Fan             = 5,    /* Draw nVertices-2 triangles as a fan from v0 */
  kQAVertexMode_NumModes        = 6
};
typedef enum TQAVertexMode TQAVertexMode;

/*
 * TQAGestaltSelector is a parameter to QAEngineGestalt(). It selects which gestalt
 * parameter will be copied into 'response'.
 */

enum TQAGestaltSelector {
  kQAGestalt_OptionalFeatures   = 0,    /* Mask of one or more kQAOptional_xxx */
  kQAGestalt_FastFeatures       = 1,    /* Mask of one or more kQAFast_xxx */
  kQAGestalt_VendorID           = 2,    /* Vendor ID */
  kQAGestalt_EngineID           = 3,    /* Engine ID */
  kQAGestalt_Revision           = 4,    /* Revision number of this engine */
  kQAGestalt_ASCIINameLength    = 5,    /* strlen (asciiName) */
  kQAGestalt_ASCIIName          = 6,    /* Causes strcpy (response, asciiName) */
  kQAGestalt_TextureMemory      = 7,    /* amount of texture RAM currently available */
  kQAGestalt_FastTextureMemory  = 8,    /* amount of texture RAM currently available */
  kQAGestalt_DrawContextPixelTypesAllowed = 9, /* returns all the draw context pixel types supported by the RAVE engine */
  kQAGestalt_DrawContextPixelTypesPreferred = 10, /* returns all the draw context pixel types that are preferred by the RAVE engine. */
  kQAGestalt_TexturePixelTypesAllowed = 11, /* returns all the texture pixel types that are supported by the RAVE engine */
  kQAGestalt_TexturePixelTypesPreferred = 12, /* returns all the texture pixel types that are preferred by the RAVE engine.*/
  kQAGestalt_BitmapPixelTypesAllowed = 13, /* returns all the bitmap pixel types that are supported by the RAVE engine. */
  kQAGestalt_BitmapPixelTypesPreferred = 14, /* returns all the bitmap pixel types that are preferred by the RAVE engine. */
  kQAGestalt_OptionalFeatures2  = 15,   /* Mask of one or more kQAOptional2_xxx */
  kQAGestalt_MultiTextureMax    = 16,   /* max number of multi textures supported by this engine */
  kQAGestalt_NumSelectors       = 17,
  kQAGestalt_EngineSpecific_Minimum = 1000 /* all gestalts here and above are for engine specific purposes */
};
typedef enum TQAGestaltSelector TQAGestaltSelector;

/*
 * TQAMethodSelector is a parameter to QASetNoticeMethod to select the notice method
 */
#if RAVE_OBSOLETE

enum TQAMethodSelector {
  kQAMethod_RenderCompletion    = 0,    /* Called when rendering has completed and buffers swapped */
  kQAMethod_DisplayModeChanged  = 1,    /* Called when a display mode has changed */
  kQAMethod_ReloadTextures      = 2,    /* Called when texture memory has been invalidated */
  kQAMethod_BufferInitialize    = 3,    /* Called when a buffer needs to be initialized */
  kQAMethod_BufferComposite     = 4,    /* Called when rendering is finished and its safe to composite */
  kQAMethod_NumSelectors        = 5
};
typedef enum TQAMethodSelector TQAMethodSelector;

#else

enum TQAMethodSelector {
  kQAMethod_RenderCompletion    = 0,    /* Called when rendering has completed and buffers swapped */
  kQAMethod_DisplayModeChanged  = 1,    /* Called when a display mode has changed */
  kQAMethod_ReloadTextures      = 2,    /* Called when texture memory has been invalidated */
  kQAMethod_ImageBufferInitialize = 3,  /* Called when a buffer needs to be initialized */
  kQAMethod_ImageBuffer2DComposite = 4, /* Called when rendering is finished and its safe to composite */
  kQAMethod_NumSelectors        = 5
};
typedef enum TQAMethodSelector TQAMethodSelector;

#endif  /* RAVE_OBSOLETE */

/*
 * kQATriFlags_xxx are ORed together to generate the 'flags' parameter
 * to QADrawTriGouraud() and QADrawTriTexture().
 */
enum {
  kQATriFlags_None              = 0,    /* No flags (triangle is front-facing or don't care) */
  kQATriFlags_Backfacing        = (1 << 0) /* Triangle is back-facing */
};

/*
 * kQATexture_xxx are ORed together to generate the 'flags' parameter to QATextureNew().
 */
enum {
  kQATexture_None               = 0,    /* No flags */
  kQATexture_Lock               = (1 << 0), /* Don't swap this texture out */
  kQATexture_Mipmap             = (1 << 1), /* This texture is mipmapped */
  kQATexture_NoCompression      = (1 << 2), /* Do not compress this texture */
  kQATexture_HighCompression    = (1 << 3), /* Compress texture, even if it takes a while */
  kQATexture_NonRelocatable     = (1 << 4), /* Image buffer in VRAM should be non-relocatable */
  kQATexture_NoCopy             = (1 << 5), /* Don't copy image to VRAM when creating it */
  kQATexture_FlipOrigin         = (1 << 6), /* The image(s) is(are) in a bottom-up format. (The image(s) is(are) flipped vertically.) */
  kQATexture_PriorityBits       = (1 << 31) | (1 << 30) | (1 << 29) | (1 << 28) /* Texture priority: 4 upper bits for 16 levels of priority */
};

/*
 * kQABitmap_xxx are ORed together to generate the 'flags' parameter to QABitmapNew().
 */
enum {
  kQABitmap_None                = 0,    /* No flags */
  kQABitmap_Lock                = (1 << 1), /* Don't swap this bitmap out */
  kQABitmap_NoCompression       = (1 << 2), /* Do not compress this bitmap */
  kQABitmap_HighCompression     = (1 << 3), /* Compress bitmap, even if it takes a while */
  kQABitmap_NonRelocatable      = (1 << 4), /* Image buffer in VRAM should be non-relocatable */
  kQABitmap_NoCopy              = (1 << 5), /* Don't copy image to VRAM when creating it */
  kQABitmap_FlipOrigin          = (1 << 6), /* The image is in a bottom-up format. (The image is flipped vertically.) */
  kQABitmap_PriorityBits        = (1 << 31) | (1 << 30) | (1 << 29) | (1 << 28) /* Bitmap priority: 4 upper bits for 16 levels of priority */
};

/*
 * kQAContext_xxx are ORed together to generate the 'flags' parameter for QADrawContextNew().
 */
enum {
  kQAContext_None               = 0,    /* No flags */
  kQAContext_NoZBuffer          = (1 << 0), /* No hidden surface removal */
  kQAContext_DeepZ              = (1 << 1), /* Hidden surface precision >= 24 bits */
  kQAContext_DoubleBuffer       = (1 << 2), /* Double buffered window */
  kQAContext_Cache              = (1 << 3), /* This is a cache context */
  kQAContext_NoDither           = (1 << 4), /* No dithering, straight color banding */
  kQAContext_Scale              = (1 << 5), /* The draw context is to be scaled.  The front buffer is a different size than the back buffer. */
  kQAContext_NonRelocatable     = (1 << 6), /* The back buffer and the z buffer must not move in memory */
  kQAContext_EngineSpecific1    = (1 << 28), /* engine specific flag # 1 */
  kQAContext_EngineSpecific2    = (1 << 29), /* engine specific flag # 2 */
  kQAContext_EngineSpecific3    = (1 << 30), /* engine specific flag # 3 */
  kQAContext_EngineSpecific4    = (1 << 31) /* engine specific flag # 4 */
};

/*
 * kQAOptional_xxx are ORed together to generate the kQAGestalt_OptionalFeatures response
 * from QAEngineGestalt().
 */
enum {
  kQAOptional_None              = 0,    /* No optional features */
  kQAOptional_DeepZ             = (1 << 0), /* Hidden surface precision >= 24 bits */
  kQAOptional_Texture           = (1 << 1), /* Texture mapping */
  kQAOptional_TextureHQ         = (1 << 2), /* High quality texture (tri-linear mip or better) */
  kQAOptional_TextureColor      = (1 << 3), /* Full color modulation and highlight of textures */
  kQAOptional_Blend             = (1 << 4), /* Transparency blending of RGB */
  kQAOptional_BlendAlpha        = (1 << 5), /* Transparency blending includes alpha channel */
  kQAOptional_Antialias         = (1 << 6), /* Antialiased rendering */
  kQAOptional_ZSorted           = (1 << 7), /* Z sorted rendering (for transparency, etc.) */
  kQAOptional_PerspectiveZ      = (1 << 8), /* Hidden surface removal using InvW instead of Z */
  kQAOptional_OpenGL            = (1 << 9), /* Extended rasterization features for OpenGLª */
  kQAOptional_NoClear           = (1 << 10), /* This drawing engine doesn't clear before drawing */
  kQAOptional_CSG               = (1 << 11), /* kQATag_CSGxxx are implemented */
  kQAOptional_BoundToDevice     = (1 << 12), /* This engine is tightly bound to GDevice */
  kQAOptional_CL4               = (1 << 13), /* This engine suports kQAPixel_CL4 */
  kQAOptional_CL8               = (1 << 14), /* This engine suports kQAPixel_CL8 */
  kQAOptional_BufferComposite   = (1 << 15), /* This engine can composite with initial buffer contents */
  kQAOptional_NoDither          = (1 << 16), /* This engine can draw with no dithering */
  kQAOptional_FogAlpha          = (1 << 17), /* This engine suports alpha based fog */
  kQAOptional_FogDepth          = (1 << 18), /* This engine suports depth based fog */
  kQAOptional_MultiTextures     = (1 << 19), /* This bit set if engine supports texture compositing */
  kQAOptional_MipmapBias        = (1 << 20), /* This bit is set if the engine supports mipmap selection bias */
  kQAOptional_ChannelMask       = (1 << 21),
  kQAOptional_ZBufferMask       = (1 << 22),
  kQAOptional_AlphaTest         = (1 << 23), /* this engine supports alpha testing */
  kQAOptional_AccessTexture     = (1 << 24), /* if engine supports access to texture */
  kQAOptional_AccessBitmap      = (1 << 25), /* if engine supports access to bitmaps */
  kQAOptional_AccessDrawBuffer  = (1 << 26), /* if engine supports access to draw buffer */
  kQAOptional_AccessZBuffer     = (1 << 27), /* if engine supports access to zbuffer */
  kQAOptional_ClearDrawBuffer   = (1 << 28), /* if engine supports QAClearDrawBuffer() */
  kQAOptional_ClearZBuffer      = (1 << 29), /* if engine supports QAClearZBuffer() */
  kQAOptional_OffscreenDrawContexts = (1 << 30) /* if engine supports TQADeviceOffscreen */
};

/*
 * kQAOptional2_xxx are ORed together to generate the kQAGestalt_OptionalFeatures2 response
 * from QAEngineGestalt().
 */
enum {
  kQAOptional2_None             = 0,
  kQAOptional2_TextureDrawContexts = (1 << 1), /* if engine supports QATextureNewFromDrawContext() */
  kQAOptional2_BitmapDrawContexts = (1 << 2), /* if engine supports QABitmapNewFromDrawContext() */
  kQAOptional2_Busy             = (1 << 3), /* if engine supports QABusy() */
  kQAOptional2_SwapBuffers      = (1 << 4), /* if engine supports QASwapBuffers() */
  kQAOptional2_Chromakey        = (1 << 5), /* if engine supports chromakeying via kQATag_Chromakey_xxx */
  kQAOptional2_NonRelocatable   = (1 << 6), /* if engine supports nonrelocatable texture & bitmap image buffers in VRAM */
  kQAOptional2_NoCopy           = (1 << 7), /* if engine supports ability to not copy texture & bitmap image to VRAM */
  kQAOptional2_PriorityBits     = (1 << 8), /* if engine supports texture & bitmap priority levels */
  kQAOptional2_FlipOrigin       = (1 << 9), /* if engine supports textures & bitmaps that are vertically flipped */
  kQAOptional2_BitmapScale      = (1 << 10), /* if engine supports scaled bitmap drawing */
  kQAOptional2_DrawContextScale = (1 << 11), /* if engine supports scaled draw contexts */
  kQAOptional2_DrawContextNonRelocatable = (1 << 12) /* if engine supports draw contexts with non relocatable buffers */
};


/*
 * kQAFast_xxx are ORed together to generate the kQAGestalt_FastFeatures response
 * from QAEngineGestalt().
 */
enum {
  kQAFast_None                  = 0,    /* No accelerated features */
  kQAFast_Line                  = (1 << 0), /* Line drawing */
  kQAFast_Gouraud               = (1 << 1), /* Gouraud shaded triangles */
  kQAFast_Texture               = (1 << 2), /* Texture mapped triangles */
  kQAFast_TextureHQ             = (1 << 3), /* High quality texture (tri-linear mip or better) */
  kQAFast_Blend                 = (1 << 4), /* Transparency blending */
  kQAFast_Antialiasing          = (1 << 5), /* Antialiased rendering */
  kQAFast_ZSorted               = (1 << 6), /* Z sorted rendering of non-opaque objects */
  kQAFast_CL4                   = (1 << 7), /* This engine accelerates kQAPixel_CL4 */
  kQAFast_CL8                   = (1 << 8), /* This engine accelerates kQAPixel_CL8 */
  kQAFast_FogAlpha              = (1 << 9), /* This engine accelerates alpha based fog */
  kQAFast_FogDepth              = (1 << 10), /* This engine accelerates depth based fog */
  kQAFast_MultiTextures         = (1 << 11), /* This engine accelerates texture compositing */
  kQAFast_BitmapScale           = (1 << 12), /* This engine accelerates scaled bitmap drawing */
  kQAFast_DrawContextScale      = (1 << 13) /* This engine accelerates scaled draw contexts */
};



/************************************************************************************************
 *
 * Macro definition for easily setting the texture priority bits in the flags field of
 * QATextureNew(), and QABitMapNew().
 *
 * The priority value must be a number between 0 and 15.  0 is top priority, and 15 is lowest
 * priority. Note that this is different than OpenGL which uses floats from 0.0 to 1.0 where
 * 1.0 is top priority. In RAVE, this system is more like texture ranking, thus 0 is top rank,
 * and 15 is the last ranking.
 *
 * Texture prioritization is mainly used for systems which support AGP memory.  This allows the
 * hardware driver to determine which textures to put into faster VRAM and which to put into
 * slower AGP RAM. If you dont care about texture priority, then you dont need to worry about
 * this macro or the priority bits since the default will always be top priority when all 4 bits
 * of this flag field are 0's.
 *
 * To upload a texture with high priority, do the following:
 *
 *      unsigned long flags = kQATexture_Mipmap;            // Initialize flags
 *
 *      flags |= QACalculatePriorityBits(0);                // Setting top priority (this actually does
 *                                                          // nothing since the bits are still 0000)
 *      QATextureNew(myEngine, flags, pixelType, image, &raveTexture);
 *
 *
 * To do a texture with a middle priority of 8, do the following:
 *
 *      unsigned long flags = kQATexture_HighCompression;   // Initialize flags
 *
 *      flags |= QACalculatePriorityBits(8);                // Setting middle priority
 *
 *      QATextureNew(myEngine, flags, pixelType, image, &raveTexture);
 *
 ***********************************************************************************************/

#define QACalculatePriorityBits(_priority)  (((unsigned long) (_priority)) << 28)



/************************************************************************************************
 *
 * Macro definitions for the drawing engine methods included in TQADrawContext. These
 * macros are the recommended means of accessing the engine's draw methods, e.g:
 *
 *      TQADrawContext  *drawContext;
 *      TQAVTexture     vertices[3];
 *
 *      drawContext = QADrawContextNew (rect, gdevice, engine, kQAContext_ZBuffer);
 *      ...
 *      QASetInt (drawContext, kQATag_ZFunction, kQAZFunction_LT);
 *      QADrawTriGouraud (drawContext, &vertices[0], &vertices[1], &vertices[2], kQATriFlags_None);
 *
 * Note that QARenderStart(), QARenderEnd(), QAFlush() and QASync() have real function
 * definitions instead of macros. This is because these functions can afford the extra
 * per-call overhead of a function layer (which makes application code a little smaller),
 * and to allow a cleaner implementation of handling NULL parameters to QARenderStart().
 *
 ***********************************************************************************************/


#define QASetFloat(drawContext,tag,newValue) \
        (drawContext)->setFloat (drawContext,tag,newValue)

#define QASetInt(drawContext,tag,newValue) \
        (drawContext)->setInt (drawContext,tag,newValue)

#define QASetPtr(drawContext,tag,newValue) \
        (drawContext)->setPtr (drawContext,tag,newValue)

#define QAGetFloat(drawContext,tag) \
        (drawContext)->getFloat (drawContext,tag)

#define QAGetInt(drawContext,tag) \
        (drawContext)->getInt (drawContext,tag)

#define QAGetPtr(drawContext,tag) \
        (drawContext)->getPtr (drawContext,tag)

#define QADrawPoint(drawContext,v) \
        (drawContext)->drawPoint (drawContext,v)

#define QADrawLine(drawContext,v0,v1) \
        (drawContext)->drawLine (drawContext,v0,v1)

#define QADrawTriGouraud(drawContext,v0,v1,v2,flags) \
        (drawContext)->drawTriGouraud (drawContext,v0,v1,v2,flags)

#define QADrawTriTexture(drawContext,v0,v1,v2,flags) \
        (drawContext)->drawTriTexture (drawContext,v0,v1,v2,flags)

#define QASubmitVerticesGouraud(drawContext,nVertices,vertices) \
        (drawContext)->submitVerticesGouraud(drawContext,nVertices,vertices)
        
#define QASubmitVerticesTexture(drawContext,nVertices,vertices) \
        (drawContext)->submitVerticesTexture(drawContext,nVertices,vertices)
        
#define QASubmitMultiTextureParams(drawContext,nParams,params) \
        (drawContext)->submitMultiTextureParams(drawContext,nParams,params)


        
#define QADrawTriMeshGouraud(drawContext,nTriangle,triangles) \
        (drawContext)->drawTriMeshGouraud (drawContext,nTriangle,triangles)

#define QADrawTriMeshTexture(drawContext,nTriangle,triangles) \
        (drawContext)->drawTriMeshTexture (drawContext,nTriangle,triangles)

#define QADrawVGouraud(drawContext,nVertices,vertexMode,vertices,flags) \
        (drawContext)->drawVGouraud (drawContext,nVertices,vertexMode,vertices,flags)

#define QADrawVTexture(drawContext,nVertices,vertexMode,vertices,flags) \
        (drawContext)->drawVTexture (drawContext,nVertices,vertexMode,vertices,flags)

#define QADrawBitmap(drawContext,v,bitmap) \
        (drawContext)->drawBitmap (drawContext,v,bitmap)

#define QARenderStart(drawContext,dirtyRect,initialContext) \
        (drawContext)->renderStart (drawContext,dirtyRect,initialContext)

#define QARenderEnd(drawContext,modifiedRect) \
        (drawContext)->renderEnd (drawContext,modifiedRect)

#define QARenderAbort(drawContext) \
        (drawContext)->renderAbort (drawContext)

#define QAFlush(drawContext) \
        (drawContext)->flush (drawContext)

#define QASync(drawContext) \
        (drawContext)->sync (drawContext)

#define QASetNoticeMethod(drawContext, method, completionCallBack, refCon) \
        (drawContext)->setNoticeMethod (drawContext, method, completionCallBack, refCon)

#define QAGetNoticeMethod(drawContext, method, completionCallBack, refCon) \
        (drawContext)->getNoticeMethod (drawContext, method, completionCallBack, refCon)
        
#define QAAccessDrawBuffer(drawContext, pixelBuffer) \
        (drawContext)->accessDrawBuffer(drawContext, pixelBuffer)

#define QAAccessDrawBufferEnd(drawContext, dirtyRect) \
        (drawContext)->accessDrawBufferEnd(drawContext, dirtyRect)

#define QAAccessZBuffer(drawContext, zBuffer) \
        (drawContext)->accessZBuffer(drawContext, zBuffer)

#define QAAccessZBufferEnd(drawContext, dirtyRect) \
        (drawContext)->accessZBufferEnd(drawContext, dirtyRect)


        
#define QAClearDrawBuffer(drawContext, rect, initialContext) \
        (drawContext)->clearDrawBuffer(drawContext, rect, initialContext)

#define QAClearZBuffer(drawContext, rect, initialContext) \
        (drawContext)->clearZBuffer(drawContext, rect, initialContext)

#define QATextureNewFromDrawContext(drawContext, flags, newTexture) \
        (drawContext)->textureFromContext(drawContext, flags, newTexture)

#define QABitmapNewFromDrawContext(drawContext, flags, newBitmap) \
        (drawContext)->bitmapFromContext(drawContext, flags, newBitmap)

#define QABusy(drawContext) \
        (drawContext)->busy(drawContext)

#define QASwapBuffers(drawContext, dirtyRect) \
        (drawContext)->swapBuffers(drawContext, dirtyRect)





/********************************************************************
 * TQAVersion sets the TQADrawContext 'version' field. It is set by
 * the manager to indicate the version of the TQADrawContext structure.
 *******************************************************************/

enum TQAVersion {
  kQAVersion_Prerelease         = 0,
  kQAVersion_1_0                = 1,
  kQAVersion_1_0_5              = 2,    /* Added tri mesh functions, color tables */
  kQAVersion_1_5                = 3,    /* Added call backs, texture compression, and new error return code */
  kQAVersion_1_6                = 4     /* Added QAAccess_xxx, fog, _Options2, Clear_xxx, etc. */
};
typedef enum TQAVersion TQAVersion;



/***********************************************************************
 * TQADrawContext structure holds method pointers.
 * This is a forward refrence. The structure is defined later.
 **********************************************************************/
typedef struct TQADrawContext           TQADrawContext;
/************************************************************************************************
 *
 * Typedefs of draw method functions provided by the drawing engine. One function pointer
 * for each of these function types in stored in the TQADrawContext public data structure.
 *
 * These functions should be accessed through the QA<function>(context,...) macros,
 * defined above.
 *
 ***********************************************************************************************/
typedef CALLBACK_API_C( void , TQAStandardNoticeMethod )(const TQADrawContext *drawContext, void *refCon);
typedef CALLBACK_API_C( void , TQABufferNoticeMethod )(const TQADrawContext *drawContext, const TQADevice *buffer, const TQARect *dirtyRect, void *refCon);
union TQANoticeMethod {
  TQAStandardNoticeMethod  standardNoticeMethod; /* Used for non-buffer related methods */
  TQABufferNoticeMethod  bufferNoticeMethod;  /* Used for buffer handling methods */
};
typedef union TQANoticeMethod           TQANoticeMethod;
typedef CALLBACK_API_C( void , TQASetFloat )(TQADrawContext *drawContext, TQATagFloat tag, float newValue);
typedef CALLBACK_API_C( void , TQASetInt )(TQADrawContext *drawContext, TQATagInt tag, unsigned long newValue);
typedef CALLBACK_API_C( void , TQASetPtr )(TQADrawContext *drawContext, TQATagPtr tag, const void *newValue);
typedef CALLBACK_API_C( float , TQAGetFloat )(const TQADrawContext *drawContext, TQATagFloat tag);
typedef CALLBACK_API_C( unsigned long , TQAGetInt )(const TQADrawContext *drawContext, TQATagInt tag);
typedef CALLBACK_API_C( void *, TQAGetPtr )(const TQADrawContext *drawContext, TQATagPtr tag);
typedef CALLBACK_API_C( void , TQADrawPoint )(const TQADrawContext *drawContext, const TQAVGouraud *v);
typedef CALLBACK_API_C( void , TQADrawLine )(const TQADrawContext *drawContext, const TQAVGouraud *v0, const TQAVGouraud *v1);
typedef CALLBACK_API_C( void , TQADrawTriGouraud )(const TQADrawContext *drawContext, const TQAVGouraud *v0, const TQAVGouraud *v1, const TQAVGouraud *v2, unsigned long flags);
typedef CALLBACK_API_C( void , TQADrawTriTexture )(const TQADrawContext *drawContext, const TQAVTexture *v0, const TQAVTexture *v1, const TQAVTexture *v2, unsigned long flags);
typedef CALLBACK_API_C( void , TQASubmitVerticesGouraud )(const TQADrawContext *drawContext, unsigned long nVertices, const TQAVGouraud *vertices);
typedef CALLBACK_API_C( void , TQASubmitVerticesTexture )(const TQADrawContext *drawContext, unsigned long nVertices, const TQAVTexture *vertices);
typedef CALLBACK_API_C( void , TQADrawTriMeshGouraud )(const TQADrawContext *drawContext, unsigned long nTriangles, const TQAIndexedTriangle *triangles);
typedef CALLBACK_API_C( void , TQADrawTriMeshTexture )(const TQADrawContext *drawContext, unsigned long nTriangles, const TQAIndexedTriangle *triangles);
typedef CALLBACK_API_C( void , TQADrawVGouraud )(const TQADrawContext *drawContext, unsigned long nVertices, TQAVertexMode vertexMode, const TQAVGouraud vertices[], const unsigned long flags[]);
typedef CALLBACK_API_C( void , TQADrawVTexture )(const TQADrawContext *drawContext, unsigned long nVertices, TQAVertexMode vertexMode, const TQAVTexture vertices[], const unsigned long flags[]);
typedef CALLBACK_API_C( void , TQADrawBitmap )(const TQADrawContext *drawContext, const TQAVGouraud *v, TQABitmap *bitmap);
typedef CALLBACK_API_C( void , TQARenderStart )(const TQADrawContext *drawContext, const TQARect *dirtyRect, const TQADrawContext *initialContext);
typedef CALLBACK_API_C( TQAError , TQARenderEnd )(const TQADrawContext *drawContext, const TQARect *modifiedRect);
typedef CALLBACK_API_C( TQAError , TQARenderAbort )(const TQADrawContext * drawContext);
typedef CALLBACK_API_C( TQAError , TQAFlush )(const TQADrawContext * drawContext);
typedef CALLBACK_API_C( TQAError , TQASync )(const TQADrawContext * drawContext);
typedef CALLBACK_API_C( TQAError , TQASetNoticeMethod )(const TQADrawContext *drawContext, TQAMethodSelector method, TQANoticeMethod completionCallBack, void *refCon);
typedef CALLBACK_API_C( TQAError , TQAGetNoticeMethod )(const TQADrawContext *drawContext, TQAMethodSelector method, TQANoticeMethod *completionCallBack, void **refCon);
typedef CALLBACK_API_C( void , TQASubmitMultiTextureParams )(const TQADrawContext *drawContext, unsigned long nParams, const TQAVMultiTexture *params);
typedef CALLBACK_API_C( TQAError , TQAAccessDrawBuffer )(const TQADrawContext *drawContext, TQAPixelBuffer *buffer);
typedef CALLBACK_API_C( TQAError , TQAAccessDrawBufferEnd )(const TQADrawContext *drawContext, const TQARect *dirtyRect);
typedef CALLBACK_API_C( TQAError , TQAAccessZBuffer )(const TQADrawContext *drawContext, TQAZBuffer *buffer);
typedef CALLBACK_API_C( TQAError , TQAAccessZBufferEnd )(const TQADrawContext *drawContext, const TQARect *dirtyRect);
typedef CALLBACK_API_C( TQAError , TQAClearDrawBuffer )(const TQADrawContext *drawContext, const TQARect *rect, const TQADrawContext *initialContext);
typedef CALLBACK_API_C( TQAError , TQAClearZBuffer )(const TQADrawContext *drawContext, const TQARect *rect, const TQADrawContext *initialContext);
typedef CALLBACK_API_C( TQAError , TQATextureNewFromDrawContext )(const TQADrawContext *drawContext, unsigned long flags, TQATexture **newTexture);
typedef CALLBACK_API_C( TQAError , TQABitmapNewFromDrawContext )(const TQADrawContext *drawContext, unsigned long flags, TQABitmap **newBitmap);
typedef CALLBACK_API_C( TQABoolean , TQABusy )(const TQADrawContext * drawContext);
typedef CALLBACK_API_C( TQAError , TQASwapBuffers )(const TQADrawContext *drawContext, const TQARect *dirtyRect);
/************************************************************************************************
 *
 * Public TQADrawContext structure. This contains function pointers for the chosen
 * drawing engine.
 *
 ***********************************************************************************************/
struct TQADrawContext {
  TQADrawPrivate *    drawPrivate;            /* Engine's private data for this context */
  TQAVersion          version;                /* Version number */
  TQASetFloat         setFloat;               /* Method: Set a float state variable */
  TQASetInt           setInt;                 /* Method: Set an unsigned long state variable */
  TQASetPtr           setPtr;                 /* Method: Set an unsigned long state variable */
  TQAGetFloat         getFloat;               /* Method: Get a float state variable */
  TQAGetInt           getInt;                 /* Method: Get an unsigned long state variable */
  TQAGetPtr           getPtr;                 /* Method: Get an pointer state variable */
  TQADrawPoint        drawPoint;              /* Method: Draw a point */
  TQADrawLine         drawLine;               /* Method: Draw a line */
  TQADrawTriGouraud   drawTriGouraud;         /* Method: Draw a Gouraud shaded triangle */
  TQADrawTriTexture   drawTriTexture;         /* Method: Draw a texture mapped triangle */
  TQADrawVGouraud     drawVGouraud;           /* Method: Draw Gouraud vertices */
  TQADrawVTexture     drawVTexture;           /* Method: Draw texture vertices */
  TQADrawBitmap       drawBitmap;             /* Method: Draw a bitmap */
  TQARenderStart      renderStart;            /* Method: Initialize for rendering */
  TQARenderEnd        renderEnd;              /* Method: Complete rendering and display */
  TQARenderAbort      renderAbort;            /* Method: Abort any outstanding rendering (blocking) */
  TQAFlush            flush;                  /* Method: Start render of any queued commands (non-blocking) */
  TQASync             sync;                   /* Method: Wait for completion of all rendering (blocking) */
  TQASubmitVerticesGouraud  submitVerticesGouraud; /* Method: Submit Gouraud vertices for trimesh */
  TQASubmitVerticesTexture  submitVerticesTexture; /* Method: Submit Texture vertices for trimesh */
  TQADrawTriMeshGouraud  drawTriMeshGouraud;  /* Method: Draw a Gouraud triangle mesh */
  TQADrawTriMeshTexture  drawTriMeshTexture;  /* Method: Draw a Texture triangle mesh */
  TQASetNoticeMethod  setNoticeMethod;        /* Method: Set a notice method */
  TQAGetNoticeMethod  getNoticeMethod;        /* Method: Get a notice method */
  TQASubmitMultiTextureParams  submitMultiTextureParams; /* Method: Submit Secondary texture params */
  TQAAccessDrawBuffer  accessDrawBuffer;
  TQAAccessDrawBufferEnd  accessDrawBufferEnd;
  TQAAccessZBuffer    accessZBuffer;
  TQAAccessZBufferEnd  accessZBufferEnd;
  TQAClearDrawBuffer  clearDrawBuffer;
  TQAClearZBuffer     clearZBuffer;
  TQATextureNewFromDrawContext  textureFromContext;
  TQABitmapNewFromDrawContext  bitmapFromContext;
  TQABusy             busy;
  TQASwapBuffers      swapBuffers;
};

/************************************************************************************************
 *
 * Acceleration manager function prototypes.
 *
 ***********************************************************************************************/
#if CALL_NOT_IN_CARBON
/*
 *  QADrawContextNew()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QADrawContextNew(
  const TQADevice *  device,
  const TQARect *    rect,
  const TQAClip *    clip,
  const TQAEngine *  engine,
  unsigned long      flags,
  TQADrawContext **  newDrawContext);


/*
 *  QADrawContextDelete()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( void )
QADrawContextDelete(TQADrawContext * drawContext);


/*
 *  QAColorTableNew()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QAColorTableNew(
  const TQAEngine *   engine,
  TQAColorTableType   tableType,
  void *              pixelData,
  long                transparentIndexFlag,
  TQAColorTable **    newTable);


/*
 *  QAColorTableDelete()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( void )
QAColorTableDelete(
  const TQAEngine *  engine,
  TQAColorTable *    colorTable);


/*
 *  QATextureNew()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QATextureNew(
  const TQAEngine *   engine,
  unsigned long       flags,
  TQAImagePixelType   pixelType,
  const TQAImage      images[],
  TQATexture **       newTexture);


/*
 *  QATextureDetach()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QATextureDetach(
  const TQAEngine *  engine,
  TQATexture *       texture);


/*
 *  QATextureDelete()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( void )
QATextureDelete(
  const TQAEngine *  engine,
  TQATexture *       texture);


/*
 *  QATextureBindColorTable()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QATextureBindColorTable(
  const TQAEngine *  engine,
  TQATexture *       texture,
  TQAColorTable *    colorTable);


/*
 *  QABitmapNew()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QABitmapNew(
  const TQAEngine *   engine,
  unsigned long       flags,
  TQAImagePixelType   pixelType,
  const TQAImage *    image,
  TQABitmap **        newBitmap);


/*
 *  QABitmapDetach()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QABitmapDetach(
  const TQAEngine *  engine,
  TQABitmap *        bitmap);


/*
 *  QABitmapDelete()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( void )
QABitmapDelete(
  const TQAEngine *  engine,
  TQABitmap *        bitmap);


/*
 *  QABitmapBindColorTable()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QABitmapBindColorTable(
  const TQAEngine *  engine,
  TQABitmap *        bitmap,
  TQAColorTable *    colorTable);


/*
 *  QADeviceGetFirstEngine()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAEngine * )
QADeviceGetFirstEngine(const TQADevice * device);


/*
 *  QADeviceGetNextEngine()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAEngine * )
QADeviceGetNextEngine(
  const TQADevice *  device,
  const TQAEngine *  currentEngine);


/*
 *  QAEngineCheckDevice()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QAEngineCheckDevice(
  const TQAEngine *  engine,
  const TQADevice *  device);


/*
 *  QAEngineGestalt()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QAEngineGestalt(
  const TQAEngine *    engine,
  TQAGestaltSelector   selector,
  void *               response);


/*
 *  QAEngineEnable()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QAEngineEnable(
  long   vendorID,
  long   engineID);


/*
 *  QAEngineDisable()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QAEngineDisable(
  long   vendorID,
  long   engineID);



/*
 *  QAAccessTexture()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QAAccessTexture(
  const TQAEngine *  engine,
  TQATexture *       texture,
  long               mipmapLevel,
  long               flags,
  TQAPixelBuffer *   buffer);


/*
 *  QAAccessTextureEnd()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QAAccessTextureEnd(
  const TQAEngine *  engine,
  TQATexture *       texture,
  const TQARect *    dirtyRect);


/*
 *  QAAccessBitmap()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QAAccessBitmap(
  const TQAEngine *  engine,
  TQABitmap *        bitmap,
  long               flags,
  TQAPixelBuffer *   buffer);


/*
 *  QAAccessBitmapEnd()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QAAccessBitmapEnd(
  const TQAEngine *  engine,
  TQABitmap *        bitmap,
  const TQARect *    dirtyRect);





#endif  /* CALL_NOT_IN_CARBON */

#if TARGET_OS_MAC
#if CALL_NOT_IN_CARBON
/*
 *  QARegisterDrawNotificationProc()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QARegisterDrawNotificationProc(
  Rect *                           globalRect,
  TQADrawNotificationProcPtr       proc,
  long                             refCon,
  TQADrawNotificationProcRefNum *  refNum);


/*
 *  QAUnregisterDrawNotificationProc()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQAError )
QAUnregisterDrawNotificationProc(TQADrawNotificationProcRefNum refNum);


#endif  /* CALL_NOT_IN_CARBON */

#endif  /* TARGET_OS_MAC */








#if PRAGMA_ENUM_ALWAYSINT
    #pragma enumsalwaysint reset
    #ifdef __RAVE__RESTORE_TWOBYTEINTS
        #pragma fourbyteints off
    #endif
#elif PRAGMA_ENUM_OPTIONS
    #pragma option enum=reset
#elif defined(__RAVE__RESTORE_PACKED_ENUMS)
    #pragma options(pack_enums)
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __RAVE__ */

