{
  $Id$

  Translation of the GLaux headers for FreePascal
  Version for static linking in Win32 environment by Alexander Stohr.
  Latest change: 1999-11-13

  Further information:

  GLaux is an outdated toolkit from SGI and later used by Microsoft.
}
{*++ BUILD Version: 0004    // Increment this if a change has global effects

Copyright (c) 1985-95, Microsoft Corporation

Module Name:

    glaux.h

Abstract:

    Procedure declarations, constant definitions and macros for the OpenGL
    Auxiliary Library.

--*}
{*
 * (c) Copyright 1993, Silicon Graphics, Inc.
 * ALL RIGHTS RESERVED
 * Permission to use, copy, modify, and distribute this software for
 * any purpose and without fee is hereby granted, provided that the above
 * copyright notice appear in all copies and that both the copyright notice
 * and this permission notice appear in supporting documentation, and that
 * the name of Silicon Graphics, Inc. not be used in advertising
 * or publicity pertaining to distribution of the software without specific,
 * written prior permission.
 *
 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
 * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
 * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * US Government Users Restricted Rights
 * Use, duplication, or disclosure by the Government is subject to
 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
 * clause at DFARS 252.227-7013 and/or in similar or successor
 * clauses in the FAR or the DOD or NASA FAR Supplement.
 * Unpublished-- rights reserved under the copyright laws of the
 * United States.  Contractor/manufacturer is Silicon Graphics,
 * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
 *
 * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
 *}

{$MODE delphi}

{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
 This is necessary for supporting different platforms with different calling
 conventions via a single unit.}

{$define WINNT}
{$define GLauximp}
{x$define UNICODE}

unit GLaux_SL; { version which does statically linking }


interface

{$MACRO ON}

{$IFDEF Win32}
  {$DEFINE glaux_dll := external 'Glauximp.dll'}
  {$DEFINE glaux_callback := cdecl}
{$ELSE}
  {$MESSAGE Unsupported platform.}
{$ENDIF}


USES
  windows,
  GL;
{
#include <windows.h>
#include <GL/glu.h>
}

TYPE
  LPCSTR  = Pointer;   { pointer on a zero terminated string }
  LPCWSTR = Pointer;   { pointer on a zero terminated unicode string }

{*
** ToolKit Window Types
** In the future, AUX_RGBA may be a combination of both RGB and ALPHA
*}

const
    AUX_RGB             = 0;
    AUX_RGBA            = AUX_RGB;
    AUX_INDEX           = 1;
    AUX_SINGLE          = 0;
    AUX_DOUBLE          = 2;
    AUX_DIRECT          = 0;
    AUX_INDIRECT        = 4;

    AUX_ACCUM           = 8;
    AUX_ALPHA           = 16;
    AUX_DEPTH24         = 32;      {* 24-bit depth buffer *}
    AUX_STENCIL         = 64;
    AUX_AUX             = 128;
    AUX_DEPTH16         = 256;     {* 16-bit depth buffer *}
    AUX_FIXED_332_PAL   = 512;
    AUX_DEPTH           = AUX_DEPTH16; {* default is 16-bit depth buffer *}

{*
** Window Masks
*}

{ These have been macros and were converted to boolean funtions }
FUNCTION AUX_WIND_IS_RGB            (x : DWORD) : BOOLEAN;
FUNCTION AUX_WIND_IS_INDEX          (x : DWORD) : BOOLEAN;
FUNCTION AUX_WIND_IS_SINGLE         (x : DWORD) : BOOLEAN;
FUNCTION AUX_WIND_IS_DOUBLE         (x : DWORD) : BOOLEAN;
FUNCTION AUX_WIND_IS_INDIRECT       (x : DWORD) : BOOLEAN;
FUNCTION AUX_WIND_IS_DIRECT         (x : DWORD) : BOOLEAN;
FUNCTION AUX_WIND_HAS_ACCUM         (x : DWORD) : BOOLEAN;
FUNCTION AUX_WIND_HAS_ALPHA         (x : DWORD) : BOOLEAN;
FUNCTION AUX_WIND_HAS_DEPTH         (x : DWORD) : BOOLEAN;
FUNCTION AUX_WIND_HAS_STENCIL       (x : DWORD) : BOOLEAN;
FUNCTION AUX_WIND_USES_FIXED_332_PAL(x : DWORD) : BOOLEAN;

{*
** ToolKit Event Structure
*}
type
    AUX_EVENTREC = RECORD
    {BEGIN}
        event : GLint;
        data  : ARRAY[0..3] OF GLint;
    END;

{*
** ToolKit Event Types
*}
CONST
    AUX_EXPOSE      = 1;
    AUX_CONFIG      = 2;
    AUX_DRAW        = 4;
    AUX_KEYEVENT    = 8;
    AUX_MOUSEDOWN   = 16;
    AUX_MOUSEUP     = 32;
    AUX_MOUSELOC    = 64;

{*
** Toolkit Event Data Indices
*}
    AUX_WINDOWX             = 0;
    AUX_WINDOWY             = 1;
    AUX_MOUSEX              = 0;
    AUX_MOUSEY              = 1;
    AUX_MOUSESTATUS         = 3;
    AUX_KEY                 = 0;
    AUX_KEYSTATUS           = 1;

{*
** ToolKit Event Status Messages
*}
    AUX_LEFTBUTTON          = 1;
    AUX_RIGHTBUTTON         = 2;
    AUX_MIDDLEBUTTON        = 4;
    AUX_SHIFT               = 1;
    AUX_CONTROL             = 2;

{*
** ToolKit Key Codes
*}
    AUX_RETURN              = #$0D;
    AUX_ESCAPE              = #$1B;
    AUX_SPACE               = #$20;
    AUX_LEFT                = #$25;
    AUX_UP                  = #$26;
    AUX_RIGHT               = #$27;
    AUX_DOWN                = #$28;
    AUX_A                   = 'A';
    AUX_B                   = 'B';
    AUX_C                   = 'C';
    AUX_D                   = 'D';
    AUX_E                   = 'E';
    AUX_F                   = 'F';
    AUX_G                   = 'G';
    AUX_H                   = 'H';
    AUX_I                   = 'I';
    AUX_J                   = 'J';
    AUX_K                   = 'K';
    AUX_L                   = 'L';
    AUX_M                   = 'M';
    AUX_N                   = 'N';
    AUX_O                   = 'O';
    AUX_P                   = 'P';
    AUX_Q                   = 'Q';
    AUX_R                   = 'R';
    AUX_S                   = 'S';
    AUX_T                   = 'T';
    AUX_U                   = 'U';
    AUX_V                   = 'V';
    AUX_W                   = 'W';
    AUX_X                   = 'X';
    AUX_Y                   = 'Y';
    AUX_Z                   = 'Z';
    AUX_a_                  = 'a';
    AUX_b_                  = 'b';
    AUX_c_                  = 'c';
    AUX_d_                  = 'd';
    AUX_e_                  = 'e';
    AUX_f_                  = 'f';
    AUX_g_                  = 'g';
    AUX_h_                  = 'h';
    AUX_i_                  = 'i';
    AUX_j_                  = 'j';
    AUX_k_                  = 'k';
    AUX_l_                  = 'l';
    AUX_m_                  = 'm';
    AUX_n_                  = 'n';
    AUX_o_                  = 'o';
    AUX_p_                  = 'p';
    AUX_q_                  = 'q';
    AUX_r_                  = 'r';
    AUX_s_                  = 's';
    AUX_t_                  = 't';
    AUX_u_                  = 'u';
    AUX_v_                  = 'v';
    AUX_w_                  = 'w';
    AUX_x_                  = 'x';
    AUX_y_                  = 'y';
    AUX_z_                  = 'z';
    AUX_0                   = '0';
    AUX_1                   = '1';
    AUX_2                   = '2';
    AUX_3                   = '3';
    AUX_4                   = '4';
    AUX_5                   = '5';
    AUX_6                   = '6';
    AUX_7                   = '7';
    AUX_8                   = '8';
    AUX_9                   = '9';

{*
** ToolKit Gets and Sets
*}
    AUX_FD                  = 1;  {* return fd (long) *}
    AUX_COLORMAP            = 3;  {* pass buf of r, g and b (unsigned char) *}
    AUX_GREYSCALEMAP        = 4;
    AUX_FOGMAP              = 5;  {* pass fog and color bits (long) *}
    AUX_ONECOLOR            = 6;  {* pass index, r, g, and b (long) *}

{*
** Color Macros
*}

    AUX_BLACK               = 0;
    AUX_RED                 = 13;
    AUX_GREEN               = 14;
    AUX_YELLOW              = 15;
    AUX_BLUE                = 16;
    AUX_MAGENTA             = 17;
    AUX_CYAN                = 18;
    AUX_WHITE               = 19;

{ this was a macro and is now a procedure }
{ PROCEDURE AUX_SETCOLOR(x, y); - TODO }

{*
** RGB Image Structure
*}

type
    AUX_RGBImageRec = RECORD
    {BEGIN}
        sizeX, sizeY : GLint;
        data : ^BYTE;
    END;
    pAUX_RGBImageRec = ^AUX_RGBImageRec;

{*
** Prototypes
*}

Procedure auxInitDisplayMode(mode:GLenum); glaux_dll;
Procedure auxInitPosition(x,y,w,h:Integer); glaux_dll;

{$ifndef WINNT}
FUNCTION  auxInitWindow(name:LPCSTR)  : GLenum; glaux_dll;
{$else}
{$ifdef UNICODE }
FUNCTION  auxInitWindow (name:LPCWSTR) : GLenum; glaux_dll name 'auxInitWindowW';
{$else}
FUNCTION  auxInitWindow (name:LPCSTR)  : GLenum; glaux_dll name 'auxInitWindowA';
{$endif}
FUNCTION  auxInitWindowA(name:LPCSTR)  : GLenum; glaux_dll;
FUNCTION  auxInitWindowW(name:LPCWSTR) : GLenum; glaux_dll;
{$endif}

PROCEDURE auxCloseWindow; glaux_dll;
PROCEDURE auxQuit;        glaux_dll;
PROCEDURE auxSwapBuffers; glaux_dll;

{ callbacks }
type
  TAUXMAINPROC    = PROCEDURE;                           glaux_callback;
  TAUXEXPOSEPROC  = PROCEDURE(w, h : integer);           glaux_callback;
  TAUXRESHAPEPROC = PROCEDURE(w, h : GLsizei);           glaux_callback;
  TAUXIDLEPROC    = PROCEDURE;                           glaux_callback;
  TAUXKEYPROC     = PROCEDURE;                           glaux_callback;
  TAUXMOUSEPROC   = PROCEDURE(VAR event : AUX_EVENTREC); glaux_callback;

{ callback setup routines }
PROCEDURE auxMainLoop   (func : TAUXMAINPROC); glaux_dll;
PROCEDURE auxExposeFunc (func : TAUXEXPOSEPROC); glaux_dll;
PROCEDURE auxReshapeFunc(func : TAUXRESHAPEPROC); glaux_dll;
PROCEDURE auxIdleFunc   (func : TAUXIDLEPROC); glaux_dll;
PROCEDURE auxKeyFunc    (val : integer; func : TAUXKEYPROC); glaux_dll;
PROCEDURE auxMouseFunc  (v1, v2 :integer; func : TAUXMOUSEPROC); glaux_dll;

FUNCTION  auxGetColorMapSize : integer; glaux_dll;
PROCEDURE auxGetMouseLoc(var x, y : integer); glaux_dll;
PROCEDURE auxSetOneColor(id : integer; r, g, b : GLfloat); glaux_dll;
PROCEDURE auxSetFogRamp(v1, v2 : integer); glaux_dll;
PROCEDURE auxSetGreyRamp; glaux_dll;
PROCEDURE auxSetRGBMap(id : integer; var map : GLfloat); glaux_dll;

{$ifndef WINNT}
FUNCTION auxRGBImageLoad(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
{$else}
{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
{$ifdef UNICODE}
FUNCTION auxRGBImageLoad (name : LPCWSTR): pAUX_RGBImageRec; glaux_dll name 'auxRGBImageLoadW';
{$else}
FUNCTION auxRGBImageLoad (name : LPCSTR) : pAUX_RGBImageRec; glaux_dll name 'auxRGBImageLoadA';
{$endif}
FUNCTION auxRGBImageLoadA(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
FUNCTION auxRGBImageLoadW(name : LPCWSTR): pAUX_RGBImageRec; glaux_dll;
{$endif}
{$endif}

{$ifndef WINNT}
{ this function is Windows specific! }
FUNCTION auxDIBImageLoad(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
{$else}
{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
{$ifdef UNICODE }
FUNCTION auxDIBImageLoad (name : LPCWSTR): pAUX_RGBImageRec; glaux_dll name 'auxDIBImageLoadW';
{$else}
FUNCTION auxDIBImageLoad (name : LPCSTR) : pAUX_RGBImageRec; glaux_dll name 'auxDIBImageLoadA';
{$endif}
FUNCTION auxDIBImageLoadA(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
FUNCTION auxDIBImageLoadW(name : LPCWSTR): pAUX_RGBImageRec; glaux_dll;
{$endif}
{$endif}

PROCEDURE auxCreateFont; glaux_dll;

{$ifndef WINNT}
PROCEDURE auxDrawStr (name : LPCSTR);  glaux_dll;
{$else}
{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
{$ifdef UNICODE }
PROCEDURE auxDrawStr (name : LPCWSTR); glaux_dll name 'auxDrawStrW';
{$else}
PROCEDURE auxDrawStr (name : LPCSTR);  glaux_dll name 'auxDrawStrA';
{$endif}
PROCEDURE auxDrawStrA(name : LPCSTR);  glaux_dll;
PROCEDURE auxDrawStrW(name : LPCWSTR); glaux_dll;
{$endif}
{$endif}

PROCEDURE auxWireSphere(v : GLdouble); glaux_dll;
PROCEDURE auxSolidSphere(v : GLdouble); glaux_dll;
PROCEDURE auxWireCube(v : GLdouble); glaux_dll;
PROCEDURE auxSolidCube(v : GLdouble); glaux_dll;
PROCEDURE auxWireBox(v1, v2, v3 : GLdouble); glaux_dll;
PROCEDURE auxSolidBox(v1, v2, v3 : GLdouble); glaux_dll;
PROCEDURE auxWireTorus(v1, v2 : GLdouble); glaux_dll;
PROCEDURE auxSolidTorus(v1, v2 : GLdouble); glaux_dll;
PROCEDURE auxWireCylinder(v1, v2 : GLdouble); glaux_dll;
PROCEDURE auxSolidCylinder(v1, v2 :  GLdouble); glaux_dll;
PROCEDURE auxWireIcosahedron(v : GLdouble); glaux_dll;
PROCEDURE auxSolidIcosahedron(v : GLdouble); glaux_dll;
PROCEDURE auxWireOctahedron(v : GLdouble); glaux_dll;
PROCEDURE auxSolidOctahedron(v : GLdouble); glaux_dll;
PROCEDURE auxWireTetrahedron(v : GLdouble); glaux_dll;
PROCEDURE auxSolidTetrahedron(v : GLdouble); glaux_dll;
PROCEDURE auxWireDodecahedron(v : GLdouble); glaux_dll;
PROCEDURE auxSolidDodecahedron(v : GLdouble); glaux_dll;
PROCEDURE auxWireCone(v1, v2 : GLdouble); glaux_dll;
PROCEDURE auxSolidCone(v1, v2 : GLdouble); glaux_dll;
PROCEDURE auxWireTeapot(v : GLdouble); glaux_dll;
PROCEDURE auxSolidTeapot(v: GLdouble); glaux_dll;

{*
** Window specific functions
** hwnd, hdc, and hglrc valid after auxInitWindow()
*}
FUNCTION  auxGetHWND : HWND; glaux_dll;
FUNCTION  auxGetHDC : HDC; glaux_dll;
FUNCTION  auxGetHGLRC : HGLRC; glaux_dll;

{*
** Viewperf support functions and constants
*}
{* Display Mode Selection Criteria *}

CONST { was an unnamed enum }
    AUX_USE_ID                  = 1;
    AUX_EXACT_MATCH             = 2;
    AUX_MINIMUM_CRITERIA        = 3;

PROCEDURE auxInitDisplayModePolicy(val : GLenum); glaux_dll;
FUNCTION  auxInitDisplayModeID(val : GLint) : GLenum; glaux_dll;
FUNCTION  auxGetDisplayModePolicy : GLenum; glaux_dll;
FUNCTION  auxGetDisplayModeID : GLint; glaux_dll;
FUNCTION  auxGetDisplayMode : GLenum; glaux_dll;


implementation

{ these functions are resolved macros -
  they should be "inline" if compile can do this }

FUNCTION AUX_WIND_IS_RGB(x : DWORD) : BOOLEAN;
BEGIN
  AUX_WIND_IS_RGB := ((x AND AUX_INDEX) = 0);
END;

FUNCTION AUX_WIND_IS_INDEX(x : DWORD) : BOOLEAN;
BEGIN
  AUX_WIND_IS_INDEX := ((x AND AUX_INDEX) <> 0);
END;

FUNCTION AUX_WIND_IS_SINGLE(x : DWORD) : BOOLEAN;
BEGIN
  AUX_WIND_IS_SINGLE := ((x AND AUX_DOUBLE) = 0);
END;

FUNCTION AUX_WIND_IS_DOUBLE(x : DWORD) : BOOLEAN;
BEGIN
  AUX_WIND_IS_DOUBLE := ((x AND AUX_DOUBLE) <> 0);
END;

FUNCTION AUX_WIND_IS_INDIRECT(x : DWORD) : BOOLEAN;
BEGIN
  AUX_WIND_IS_INDIRECT := ((x AND AUX_INDIRECT) <> 0);
END;

FUNCTION AUX_WIND_IS_DIRECT(x : DWORD) : BOOLEAN;
BEGIN
  AUX_WIND_IS_DIRECT := ((x AND AUX_INDIRECT) = 0);
END;

FUNCTION AUX_WIND_HAS_ACCUM(x : DWORD) : BOOLEAN;
BEGIN
  AUX_WIND_HAS_ACCUM := ((x AND AUX_ACCUM) <> 0);
END;

FUNCTION AUX_WIND_HAS_ALPHA(x : DWORD) : BOOLEAN;
BEGIN
  AUX_WIND_HAS_ALPHA := ((x AND AUX_ALPHA) <> 0);
END;

FUNCTION AUX_WIND_HAS_DEPTH(x : DWORD) : BOOLEAN;
BEGIN
  AUX_WIND_HAS_DEPTH := ((x AND (AUX_DEPTH24 OR AUX_DEPTH16)) <> 0);
END;

FUNCTION AUX_WIND_HAS_STENCIL(x : DWORD) : BOOLEAN;
BEGIN
  AUX_WIND_HAS_STENCIL := ((x AND AUX_STENCIL) <> 0);
END;

FUNCTION AUX_WIND_USES_FIXED_332_PAL(x : DWORD) : BOOLEAN;
BEGIN
  AUX_WIND_USES_FIXED_332_PAL := ((x AND AUX_FIXED_332_PAL) <> 0);
END;

{extern float auxRGBMap[20][3];

PROCEDURE AUX_SETCOLOR(x, y);
BEGIN
  IF (AUX_WIND_IS_RGB((x))
  THEN glColor3fv(auxRGBMap[y])
  ELSE glIndexf(y));
END;
 - TODO}


{begin{of init}
end.
