diff --git a/ng/Togl-1.7/.indent.pro b/ng/Togl-1.7/.indent.pro deleted file mode 100644 index 365338e4..00000000 --- a/ng/Togl-1.7/.indent.pro +++ /dev/null @@ -1,72 +0,0 @@ ---blank-before-sizeof ---blank-lines-after-declarations ---blank-lines-after-procedures ---blank-lines-before-block-comments ---braces-after-struct-decl-line ---braces-on-if-line ---break-before-boolean-operator ---case-brace-indentation0 ---case-indentation2 ---comment-line-length80 ---continuation-indentation8 ---cuddle-do-while ---cuddle-else ---declaration-indentation8 ---dont-line-up-parentheses ---format-all-comments ---format-first-column-comments ---indent-level4 ---leave-optional-blank-lines ---line-length80 ---no-space-after-function-call-names ---no-space-after-parentheses ---no-tabs ---parameter-indentation8 ---preprocessor-indentation2 ---procnames-start-lines ---space-after-cast ---space-after-for ---space-after-if ---space-after-while ---space-special-semicolon ---start-left-side-of-comments ---struct-brace-indentation0 ---tab-size8 --T AGLContext --T CALLBACK --T ClientData --T Colormap --T Display --T GLXContext --T GLbitfield --T GLboolean --T GLenum --T GLfloat --T GLint --T GLuint --T HDC --T HGLRC --T HWND --T LPARAM --T PIXELFORMATDESCRIPTOR --T Tcl_Command --T Tcl_Interp --T TkClassCreateProc --T TkClassGeometryProc --T TkClassModalProc --T TkClassProcs --T TkWinColormap --T Tk_ConfigSpec --T Tk_Cursor --T Tk_Window --T Togl_Callback --T Togl_CmdProc --T UINT --T WPARAM --T WinFont --T Window --T XColor --T XEvent --T XVisualInfo --T TOGL_EXTERN --T Togl diff --git a/ng/Togl-1.7/CMakeLists.txt b/ng/Togl-1.7/CMakeLists.txt deleted file mode 100644 index 8ca9e0f4..00000000 --- a/ng/Togl-1.7/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -add_definitions("-DPACKAGE_NAME=\"Togl\" -DPACKAGE_TARNAME=\"togl\" -DPACKAGE_VERSION=\"1.7\" -DPACKAGE_STRING=\"Togl\ 1.7\" -DPACKAGE_BUGREPORT=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIMITS_H=1 -DHAVE_SYS_PARAM_H=1 -DUSE_THREAD_ALLOC=1 -D_REENTRANT=1 -D_THREAD_SAFE=1 -DTCL_THREADS=1 -D_LARGEFILE64_SOURCE=1 -DTCL_WIDE_INT_IS_LONG=1 -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1") - -# include_directories("/usr/include/tcl8.5" "/usr/include/tcl8.5/tk-private/generic" "/usr/include/tcl8.5/tk-private/unix") -# SET(CMAKE_CXX_FLAGS "-O2 -fomit-frame-pointer -Wall -Wno-implicit-int -fPIC -c") -include_directories("${TCL_INCLUDE_PATH}/tk-private/generic" "${TCL_INCLUDE_PATH}/tk-private/unix") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -fomit-frame-pointer -Wall -Wno-implicit-int") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -fomit-frame-pointer -Wall -Wno-implicit-int") -add_library(togl togl.c) -target_link_libraries(togl ${OPENGL_LIBRARIES}) -set_target_properties(togl PROPERTIES POSITION_INDEPENDENT_CODE ON ) -# -# gcc -DPACKAGE_NAME=\"Togl\" -DPACKAGE_TARNAME=\"togl\" -DPACKAGE_VERSION=\"1.7\" -DPACKAGE_STRING=\"Togl\ 1.7\" -DPACKAGE_BUGREPORT=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIMITS_H=1 -DHAVE_SYS_PARAM_H=1 -DUSE_THREAD_ALLOC=1 -D_REENTRANT=1 -D_THREAD_SAFE=1 -DTCL_THREADS=1 -D_LARGEFILE64_SOURCE=1 -DTCL_WIDE_INT_IS_LONG=1 -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 -# -I"/usr/include/tcl8.6" -I"/usr/include/tcl8.6/tk-private/generic" -I"/usr/include/tcl8.6/tk-private/unix" -# -O2 -fomit-frame-pointer -Wall -Wno-implicit-int -fPIC -c `echo togl.c` -o togl.o -# rm -f libTogl1.7.so -# gcc -pipe -shared -o libTogl1.7.so togl.o -lX11 -lGL -lXmu -L/usr/lib/x86_64-linux-gnu -ltclstub8.6 -L/usr/lib/x86_64-linux-gnu -ltkstub8.6 -# : libTogl1.7.so - - diff --git a/ng/Togl-1.7/LICENSE b/ng/Togl-1.7/LICENSE deleted file mode 100644 index e9badb74..00000000 --- a/ng/Togl-1.7/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -This software is copyrighted by Brian Paul (brian@mesa3d.org) -and Benjamin Bederson (bederson@cs.umd.edu). The following -terms apply to all files associated with the software unless explicitly -disclaimed in individual files. - -The authors hereby grant permission to use, copy, modify, distribute, -and license this software and its documentation for any purpose, provided -that existing copyright notices are retained in all copies and that this -notice is included verbatim in any distributions. No written agreement, -license, or royalty fee is required for any of the authorized uses. -Modifications to this software may be copyrighted by their authors -and need not follow the licensing terms described here, provided that -the new terms are clearly indicated on the first page of each file where -they apply. - -IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -MODIFICATIONS. diff --git a/ng/Togl-1.7/README.stubs b/ng/Togl-1.7/README.stubs deleted file mode 100644 index 4c1b8186..00000000 --- a/ng/Togl-1.7/README.stubs +++ /dev/null @@ -1,21 +0,0 @@ -This version of Togl is entirely free from -dependencies on Tcl/Tk's internal functions. It uses the public stubs -interface, witch means that the same binary works with any stubs-aware -wish (i.e. version >= 8.1) - -It has been tested on Windows NT/2000 and Linux for several Tcl/Tk versions up -to 8.4a3. I haven't been able to test the Mac port, it probably needs mending -but I can't see why it shouldn't work in principle. - -Implementation wise, what differs from Togl 1.5 is that Togl_MakeWindowExist() -is replaced by Togl_CreateWindow(), a function that gets registered in Tk as a callback for window creation. In Tk/Tk 8.4a3, there is a new public API call -Tk_SetClassProcs() to register this callback, but for earlier versions of Tk -one needs to do this using some pointer magic. -There is a run-time check to determine which method to use, hence the -same binary runs on all versions of Wish from 8.1 and up. For this to -work you need to compile against the headers from Tcl/Tk 8.4a3 or later, or -the binary will only work for Tcl/Tk 8.1-8.4a2. -The tk8.4a3 public headers (tk8.4a3.h + tkDecls.h) are included for -convenience, and they are used if the flag -DUSE_LOCAL_TK_H is specified. - -Jonas Beskow, December 2001 \ No newline at end of file diff --git a/ng/Togl-1.7/TODO b/ng/Togl-1.7/TODO deleted file mode 100644 index c525ddac..00000000 --- a/ng/Togl-1.7/TODO +++ /dev/null @@ -1,20 +0,0 @@ -In no particular order: ------------------------ - -stubify C API. - -replace EPS support with TK photo image support - -Add command arguments for create, destroy, etc. so there would be a --createcommand option to the togl command (etc.) (and phase out -Togl_*Func from the C API) - -multisampling support (can be worked-around by passing in a pixelformat) - -add vertical sync control - -update documentation - - update build instructions - - update stereo documentation - - separate Tcl API from C API - - say togl hides window system dependent (glX/wgl/agl) calls diff --git a/ng/Togl-1.7/Togl.html b/ng/Togl-1.7/Togl.html deleted file mode 100644 index 5df48136..00000000 --- a/ng/Togl-1.7/Togl.html +++ /dev/null @@ -1,1081 +0,0 @@ - - - - - - - Togl - - - - -
-

Togl — a Tk OpenGL widget

-

Copyright (C) 1996-2002 Brian Paul and Ben Bederson

-
- - -
-

Contents

- - - - -
-

Introduction

- - Togl is a Tk widget for OpenGL rendering. - Togl was originally based on OGLTK, written by Benjamin Bederson at - the University of New Mexico. - Togl adds the new features: - - - -

- Togl allows one to create and manage a special Tk/OpenGL widget - with Tcl and render into it with a C program. That is, - a typical Togl program will have Tcl code for managing the user interface - and a C program for computations and OpenGL rendering. - -

- Togl is copyrighted by - Brian Paul - (brian_e_paul@yahoo.com) and - Benjamin Bederson - (bederson@cs.umd.edu). - See the LICENSE file for details. - -

- The - Togl project and - home page are - hosted by SourceForge. - - -
-

Prerequisites

- -

- You should have - Tcl and Tk - installed on your computer. Togl works with Tcl/Tk - version 8.0 and up. The Mac OS X version requires version 8.4. - -

- You must also have - OpenGL or - Mesa - (a free alternative to OpenGL) installed on your computer. - -

- One should be familiar with Tcl, Tk, OpenGL, and C programming to use Togl - effectively. - - -
-

Getting Togl

- -

- The current version of Togl is 1.7. - Togl can be downloaded from - - SourceForge. - - -
-

Mailing list

- -

- See the - Togl project at SourceForge for mailing list information. - - -
-

Using Togl With Your Application

- -

- There are basically two ways of using Togl with your application: -

- Since Togl is compiled into a shared library using the Tcl/Tk stubs-interface, - the same binary can be used with any version of Tck/Tk from 8.06 and up. - See README.stubs for more info. - -

Unix/X11 usage

- -

- Unix/X systems only need the togl.c, togl.h - and the public Tcl/Tk include files. - -

Windows 95/NT/2000/XP usage

- -

- Windows platforms need tkWinInt.h - and other internal Tk header files. So you need a Tcl/Tk - source distribution in addition to the Togl distribution - (or copy over the various include files). -

- Here's the minimal way to build Togl with Tcl/Tk - using the gcc that is distributed - as part of the cygwin tools - (Microsoft's compilers work too): -

-VER=8.4.12
-SRCDIR=`pwd`
-
-cd $SRCDIR/tcl$VER/win
-env 'CC=gcc -mno-cygwin' ./configure --enable-threads
-make libtclstub84.a
-
-cd $SRCDIR/tk$VER/win
-env 'CC=gcc -mno-cygwin' ./configure --enable-threads
-make libtkstub84.a
-
-cd $SRCDIR/Togl
-env 'CC=gcc -mno-cygwin' ./configure --with-tcl=../tcl$VER/win --with-tk=../tk$VER/win
-
-make
-
- The resulting Togl17.dll and pkgIndex.tcl - should be installed into your Tcl distribution just like any other package. - -

Mac OS X usage

- -

- These special instructions are for building the Aqua version of Togl. - Mac OS X needs tkMacOSXInt.h - and other internal Tk header files. Unfortunately, the Tcl and Tk - frameworks that Apple distributes are missing the internal headers. - So you need a Tcl/Tk source distribution in addition to the Togl - distribution (or copy over the various include files). - You would probably want a newer version of Tcl and Tk anyway - because each minor revision of 8.4 has many Aqua bug fixes. -

- Here's one way to build Tcl, Tk, and Togl on Mac OS X (assuming they - are all in the same directory) to install in your home directory: -

-VER=8.4.12
-
-mkdir -p ~/bin
-make -C tcl$VER/macosx install PREFIX="${HOME}" INSTALL_PATH="${HOME}/Library/Frameworks"
-make -C tk$VER/macosx install PREFIX="${HOME}" INSTALL_PATH="${HOME}/Library/Frameworks"
-
-(cd Togl; ./configure --prefix="${HOME}")
-make -C Togl install
-
- - -
-

C Togl Functions

- -

- These are the Togl functions one may call from a C program. - -

- - #include "togl.h" - -
- -

- For portability, you should include the togl.h header - before any other OpenGL header so that various - Windows 95/NT/2000/XP stuff falls into place. - - -

Setup and Initialization Functions

- -
-
int Togl_Init(Tcl_Interp *interp) -
- Initializes the Togl module. This is typically called from the - Tk_Main() function - or via Tcl's package require command. -
- -
-
void Togl_CreateFunc(Togl_Callback *proc) -
- void Togl_DisplayFunc(Togl_Callback *proc) -
- void Togl_ReshapeFunc(Togl_Callback *proc) -
- void Togl_DestroyFunc(Togl_Callback *proc) -
-
- Register C functions to be called by Tcl/Tk when a widget is realized, - must be redrawn, is resized, or is destroyed respectively. -

- Each C callback must be of the form: -

-	void callback(Togl *togl)
-	{
-	   ...your code...
-	}
-
-
- -
-
void Togl_TimerFunc(Togl_Callback *proc) -
- Register a C timer callback function which will be called every - n milliseconds. The interval n is specified - by the -time option to the Togl Tcl command. -

- The C callback must be of the form: -

-	void my_timer_callback(Togl *togl)
-	{
-	   ...your code...
-	}
-
-
- -
-
void Togl_ResetDefaultCallbacks(void) -
- Reset all default callback pointers to NULL. -
- -
-
void Togl_CreateCommand(char *cmd_name, Togl_CmdProc *cmd_proc) -
- Used to create a new Togl sub-command. The C function which implements - the command must be of the form: -

-

-	int callback(Togl *togl, int argc, char *argv[])
-	{
-	   ...your code...
-	   return TCL_OK or TCL_ERROR;
-	}
-
-
- -

Drawing-related Commands

- -
-
void Togl_PostRedisplay(Togl *togl) -
- Signals that the widget should be redrawn. When Tk is next idle the - user's C render callback will be invoked. This is typically called - from within a Togl sub-command which was registered with - Togl_CreateCommand(). -
- -
-
void Togl_SwapBuffers(const Togl *togl) -
- Swaps the front and back color buffers for a double-buffered widget. - glFlush() is executed if the window is single-buffered. This is - typically called in the rendering function which was registered with - Togl_DisplayFunc(). -
- -
-
void Togl_MakeCurrent(const Togl *togl) -
- Sets the current rendering context to the given widget. This is done - automatically before the Togl callback functions are called. So the - call is only needed if you have multiple widgets with separate OpenGL - contexts. If the argument is NULL, then the rendering context is cleared - and subsequent OpenGL commands will fail. -
- -

Query Functions

- -
-
char *Togl_Ident(const Togl *togl) -
- Returns a pointer to the identification string associated with a Togl - widget or NULL if there's no identifier string. -
- -
-
int Togl_Width(const Togl *togl) -
- Returns the width of the given Togl widget. Typically called in the - function registered with Togl_ReshapeFunc(). -
- -
-
int Togl_Height(const Togl *togl) -
- Returns the height of the given Togl widget. Typically called in the - function registered with Togl_ReshapeFunc(). -
- -
-
Tcl_Interp *Togl_Interp(const Togl *togl) -
- Returns the Tcl interpreter associated with the given Togl widget. -
-
-
- Tk_Window Togl_TkWin(const Togl *togl) -
- Returns the Tk window associated with the given Togl widget. -
- -

Color Index Mode Functions

- -

- These functions are only used for color index mode. - -

-
unsigned long Togl_AllocColor(Togl *togl, float red, float green, float blue) -
- Allocate a color from a read-only colormap. Given a color specified - by red, green, and blue return a colormap index (aka pixel value) - whose entry most closely matches the red, green, blue color. Red, - green, and blue are values in [0,1]. This function is only used in - color index mode when the -privatecmap option is false. -
- -
-
void Togl_FreeColor(Togl *togl, unsigned long index) -
- Free a color in a read-only colormap. Index is a value which was - returned by the Togl_AllocColor() function. This function is only - used in color index mode when the -privatecmap option - is false. -
- -
-
void Togl_SetColor(Togl *togl, - int index, float red, float green, float blue) -
- Load the colormap entry specified by index with the given red, green - and blue values. Red, green, and blue are values in [0,1]. This - function is only used in color index mode when the - -privatecmap option is true. -
- - -

Font Functions

- -
-
GLuint Togl_LoadBitmapFont(Togl *togl, - const char *fontname) -
- Load the named font as a set of glBitmap display lists. - fontname may be one of - - - Zero is returned if this function fails. -
- After Togl_LoadBitmapFont() has been called, returning fontbase, - you can render a string s with: -
- - glListBase(fontbase); -
- glCallLists(strlen(s), GL_BYTE, s); -
-
- To maximize the portability of your application it is best to use one - of the predefined TOGL_BITMAP_* fonts. -
- -
-
void Togl_UnloadBitmapFont(Togl *togl, GLuint fontbase) - -
- Destroys the bitmap display lists created by by Togl_LoadBitmapFont(). -
- -

Client Data Functions

- -
-
void Togl_SetClientData(Togl *togl, ClientData clientData) -
- clientData is a pointer to an arbitrary user data structure. - Each Togl struct has such a pointer. - This function sets the Togl widget's client data pointer. -
- -
-
ClientData Togl_GetClientData(const Togl *togl) -
- clientData is a pointer to an arbitrary user data structure. - Each Togl struct has such a pointer. - This function returns the Togl widget's client data pointer. -
- -
-
void Togl_ClientData(ClientData clientData) -
- clientData is a pointer to an arbitrary user data structure. - Set default client data pointer for subsequent new Togl widgets. - Default value is NULL. -
- - -

Overlay Functions

- -

- These functions are modelled after GLUT's overlay sub-API. - -

-
void Togl_UseLayer(Togl *togl, int layer) -
- Select the layer into which subsequent OpenGL rendering will be - directed. layer may be either TOGL_OVERLAY or - TOGL_NORMAL. -
- -
-
void Togl_ShowOverlay(Togl *togl) -
- Display the overlay planes, if any. -
- -
-
void Togl_HideOverlay(Togl *togl) -
- Hide the overlay planes, if any. -
- -
-
void Togl_PostOverlayRedisplay(Togl *togl) -
- Signal that the overlay planes should be redraw. - When Tk is next idle the user's C overlay display callback will be invoked. - This is typically called from within a Togl sub-command which was - registered with Togl_CreateCommand(). -
- -
-
void Togl_OverlayDisplayFunc(Togl_Callback *proc) -
- Registers the C callback function which should be called to redraw the - overlay planes. This is the function which will be called in - response to Togl_PostOverlayRedisplay(). - The callback must be of the form: -

-

-	void RedrawOverlay(Togl *togl)
-	{
-	   ...your code...
-	}
-
-
- -
-
int Togl_ExistsOverlay(Togl *togl) -
- Returns 1 if overlay planes exist, 0 otherwise. -
- -
-
int Togl_GetOverlayTransparentValue(const Togl *togl) -
- Returns the color index of the overlay's transparent pixel value. -
- -
-
int Togl_IsMappedOverlay(const Togl *togl) -
- Returns 1 if the overlay planes are currently displayed, 0 otherwise. -
- -
-
unsigned long Togl_AllocColorOverlay(const Togl *togl, - float red, float green, float blue) -
- Allocate a color in the overlay planes. Red, green, and blue are - values in [0,1]. Return the color index or -1 if the allocation - fails. -
- -
-
void Togl_FreeColorOverlay(const Togl *togl, unsigned long index) -
- Free a color which was allocated with Togl_AllocColorOverlay(). -
- - -

X11-only Functions

- -

- These functions are only implemented on systems using the X Window System. - We recommend that you avoid using these functions in your application since - they are not portable to other operating/window systems - (use Togl_TkWin() and normal Tk functions instead). -

- -

-
Display *Togl_Display(const Togl *togl) -
- Returns the X Display of a Togl widget. -
- -
-
Screen *Togl_Screen(const Togl *togl) -
- Returns the X Screen of a Togl widget. -
- -
-
int Togl_ScreenNumber(const Togl *togl) -
- Returns the X screen number of a Togl widget. -
- -
-
Colormap Togl_Colormap(const Togl *togl) -
- Returns the X Colormap used by a Togl widget. -
- - -

Postscript Output

-

- -

-
int Togl_DumpToEpsFile(const Togl *togl, - const char *filename, int rgbFlag, void (*user_redraw)()) -
- Generate an encapsulated Postscript file of the image in a Togl widget. - filename is the name of the file to generate. - If rgbFlag is non-zero then an RGB image file is written, - else a grayscale image file is written. - user_redraw is a pointer to the function which will render the - desired image. This will typically be the same as the function passed - to Togl_DisplayFunc(). -
- - -
-

Tcl Togl commands

- -

- These are the Togl commands one may call from a Tcl program. - -

-
togl pathName [options] -
- Creates a new togl widget with name pathName and - an optional list of configuration options. Options include: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Option Default Comments
-width 400 - Width of widget in pixels.
-height 400 - Height of widget in pixels.
 
-ident "" - A user identification string. This is used match widgets - for the -sharecontext - and the -sharelist options (see below). - This is also useful in your callback functions - to determine which Togl widget is the caller. -
 
-rgba true - If true, use RGB(A) mode, otherwise use Color Index mode.
-redsize 1 - Minimum number of bits in red component.
-greensize 1 - Minimum number of bits in green component.
-bluesize 1 - Minimum number of bits in blue component.
-alpha 1 - If true and -rgba is true, request an alpha channel.
-alphasize 1 - Minimum number of bits in alpha component.
 
-double false - If true, request a double-buffered window, otherwise - request a single-buffered window.
 
-depth false - If true, request a depth buffer.
-depthsize 1 - Minimum number of bits in depth buffer.
 
-accum false - If true, request an accumulation buffer.
-accumredsize 1 - Minimum number of bits in accumulation buffer red component.
-accumgreensize 1 - Minimum number of bits in accumulation buffer green component.
-accumbluesize 1 - Minimum number of bits in accumulation buffer blue component.
-accumalphasize 1 - Minimum number of bits in accumulation buffer alpha component.
 
-stencil false - If true, request a stencil buffer.
-stencilsize 1 - Minimum number of bits in stencil component.
 
-auxbuffers 0 - Desired number of auxiliary buffers.
 
-privatecmap false - Only applicable in color index mode. - If false, use a shared read-only colormap. - If true, use a private read/write colormap. -
 
-overlay false - If true, request overlay planes.
 
-stereo false - If true, request a stereo-capable window.
-oldstereo false - On SGI workstations only: if true, request divided-screen stereo. -
 
-time 1 - Specifies the interval, in milliseconds, for - calling the C timer callback function which - was registered with Togl_TimerFunc.
 
-sharelist "" - Name of an existing Togl widget with which to - share display lists. -
-sharecontext "" - Name of an existing Togl widget with which to - share the OpenGL context. NOTE: most other - attributes such as double buffering, RGBA vs CI, - ancillary buffer specs, etc are then ignored. -
 
-indirect false - If present, request an indirect rendering context. - A direct rendering context is normally requested. - Only significant on Unix/X11. -
 
-cursor "" - Set the cursor in the widget window.
 
-pixelformat 0 - Set the pixel format to the (platform-dependent) given value.
-

- - -
-
pathName configure -
- Returns all configuration records for the named togl widget. -
- -
-
pathName configure -option -
- Returns configuration information for the specified option - which may be one of: -
-
-width -
- Returns the width configuration of the widget in the form: -
- -width width Width W w -
- where W is the default width in pixels - and w is the current width in pixels -
-
-
-height -
- Returns the height configuration of the widget in the form: -
- -height height Height H h -
- where H is the default height in pixels - and h is the current height in pixels -
-
-
-extensions -
- Returns a list of OpenGL extensions available. For example: - GL_EXT_polygon_offset GL_EXT_vertex_array -
-
- -
-
pathName configure -option value -
- Reconfigure a Togl widget. option may be any one of the - options listed in the togl command above. -
- -
-
pathName render -
- Causes the render callback function to be called for pathName. -
- -
-
pathName swapbuffers -
- Causes front/back buffers to be swapped if in double buffer mode. - And flushes the OpenGL command buffer if in single buffer mode. - (So this is appropriate to call after every frame is drawn.) -
- -
-
pathName makecurrent -
- Make the widget specified by pathName and its OpenGL context - the current ones. -
- - -
-

Demo Programs

- -

- There are six demo programs: - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
double.tcl— compares single vs double buffering with two Togl widgets
texture.tcl— lets you play with texture mapping options
index.tcl— demo of using color index mode
overlay.tcl— example of using overlay planes (requires overlay hardware)
stereo.tcl— stereo example
gears.tcl— spinning gears demo
-
- -

- To compile the demos, edit the Makefile to suit your system, then - type make demos. - The demos are compiled into shared libraries, - that can are loaded into the Tcl interpreter as Tcl/Tk-extensions. - Demos are started by running the corresponding Tcl script. - To run a demo just type ./double.tcl or ./texture.tcl etc. - - -
-

Stereo Rendering

- -

- Quad-buffered stereo-in-a-window is supported. Quad-buffer stereo - is only available on workstation-class graphics cards - (3Dlabs Wildcat series, - ATI FireGL series, - NVidia Quadro series, - and SGI workstations). - Legacy support for divided-screen stereo on SGI workstations is - available via the -oldstereo option. - Developers for SGI workstations might also like the - - autostereo package to automatically switch the display - in and out of stereo (other systems already do it automatically). -

- Full-screen stereo that gaming graphics cards support (ATI Radeon, - NVidia GeForce) is not supported. - -
-

Common Questions and Problems

- -

- If you have something to add to this section please let us know. - -

Bad Match X errors on Sun systems

-

- There's a bug in Sun's XmuLookupStandardColormap X library function. - If you compile togl.c with the SOLARIS_BUG symbol defined (-DSOLARIS_BUG) - this function call will be omitted. - - -
-

Reporting Bugs

- -

- There is a bug database on the - Togl Project Page. - You may also discuss bugs on the mailing list. -

- When reporting bugs please provide as much information as possible. - Also, it's very helpful to us if you can provide an example program - which demonstrates the problem. - - -
-

Version History

- -

Version 1.0 — March, 1996

- - -

Version 1.1 (never officially released)

- - -

Version 1.2 — November, 1996

- - -

Version 1.3 — May 2, 1997

- - -

Version 1.4 — September 17, 1997

- - -

Version 1.5 — September 18, 1998

- - -

Version 1.6 — May 7, 2003

- - -

Version 1.7 — Jan 2006

- - -

Version 2.0 — ??? 2006

- - -
-

Future plans

- - - -
-

Contributors

- -

- Several people have contributed new features to Togl. Among them are: - -

- - Many others have contributed bug fixes. Thanks for your contributions! - -
-
- Last edited on 25 October 2005 by Greg Couch. - - - diff --git a/ng/Togl-1.7/aclocal.m4 b/ng/Togl-1.7/aclocal.m4 deleted file mode 100644 index 0b057391..00000000 --- a/ng/Togl-1.7/aclocal.m4 +++ /dev/null @@ -1,9 +0,0 @@ -# -# Include the TEA standard macro set -# - -builtin(include,tclconfig/tcl.m4) - -# -# Add here whatever m4 macros you want to define for your package -# diff --git a/ng/Togl-1.7/ben.rgb b/ng/Togl-1.7/ben.rgb deleted file mode 100644 index 4eb067a2..00000000 Binary files a/ng/Togl-1.7/ben.rgb and /dev/null differ diff --git a/ng/Togl-1.7/configure.in b/ng/Togl-1.7/configure.in deleted file mode 100644 index 5a89c64a..00000000 --- a/ng/Togl-1.7/configure.in +++ /dev/null @@ -1,222 +0,0 @@ -#!/bin/bash -norc -dnl This file is an input file used by the GNU "autoconf" program to -dnl generate the file "configure", which is run during Tcl installation -dnl to configure the system for the local environment. -# -# RCS: @(#) $Id: configure.in,v 1.6 2006/01/06 00:09:00 gregcouch Exp $ - -#----------------------------------------------------------------------- -# Sample configure.in for Tcl Extensions. The only places you should -# need to modify this file are marked by the string __CHANGE__ -#----------------------------------------------------------------------- - -#----------------------------------------------------------------------- -# __CHANGE__ -# Set your package name and version numbers here. -# -# This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION -# set as provided. These will also be added as -D defs in your Makefile -# so you can encode the package version directly into the source files. -#----------------------------------------------------------------------- - -AC_INIT([Togl], [1.7]) - -#-------------------------------------------------------------------- -# Call TEA_INIT as the first TEA_ macro to set up initial vars. -# This will define a ${TEA_PLATFORM} variable == "unix" or "windows" -# as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE. -#-------------------------------------------------------------------- - -TEA_INIT([3.4]) - -AC_CONFIG_AUX_DIR(tclconfig) - -#-------------------------------------------------------------------- -# Load the tclConfig.sh file -#-------------------------------------------------------------------- - -TEA_PATH_TCLCONFIG -TEA_LOAD_TCLCONFIG - -#-------------------------------------------------------------------- -# Load the tkConfig.sh file if necessary (Tk extension) -#-------------------------------------------------------------------- - -TEA_PATH_TKCONFIG -TEA_LOAD_TKCONFIG - -#----------------------------------------------------------------------- -# Handle the --prefix=... option by defaulting to what Tcl gave. -# Must be called after TEA_LOAD_TCLCONFIG and before TEA_SETUP_COMPILER. -#----------------------------------------------------------------------- - -TEA_PREFIX - -#----------------------------------------------------------------------- -# Standard compiler checks. -# This sets up CC by using the CC env var, or looks for gcc otherwise. -# This also calls AC_PROG_CC, AC_PROG_INSTALL and a few others to create -# the basic setup necessary to compile executables. -#----------------------------------------------------------------------- - -TEA_SETUP_COMPILER - -#----------------------------------------------------------------------- -# __CHANGE__ -# Specify the C source files to compile in TEA_ADD_SOURCES, -# public headers that need to be installed in TEA_ADD_HEADERS, -# stub library C source files to compile in TEA_ADD_STUB_SOURCES, -# and runtime Tcl library files in TEA_ADD_TCL_SOURCES. -# This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS -# and PKG_TCL_SOURCES. -#----------------------------------------------------------------------- - -TEA_ADD_SOURCES([togl.c]) -# togl_ws.h is added in Makefile.in because it is generated -TEA_ADD_HEADERS([togl.h]) -TEA_ADD_INCLUDES([]) -TEA_ADD_LIBS([]) -TEA_ADD_CFLAGS([]) -TEA_ADD_STUB_SOURCES([]) -TEA_ADD_TCL_SOURCES([]) - -#-------------------------------------------------------------------- -# __CHANGE__ -# A few miscellaneous platform-specific items: -# -# Define a special symbol for Windows (BUILD_sample in this case) so -# that we create the export library with the dll. -# -# Windows creates a few extra files that need to be cleaned up. -# You can add more files to clean if your extension creates any extra -# files. -# -# TEA_ADD_* any platform specific compiler/build info here. -#-------------------------------------------------------------------- - -if test "${TEA_PLATFORM}" = "windows" ; then - AC_DEFINE(BUILD_togl, 1, [Build windows export dll]) - CLEANFILES="pkgIndex.tcl togl_ws.h *.lib *.dll *.exp *.ilk *.pdb vc*.pch" - #TEA_ADD_SOURCES([win/winFile.c]) - #TEA_ADD_INCLUDES([-I\"$(${CYGPATH} ${srcdir}/win)\"]) -else - CLEANFILES="pkgIndex.tcl togl_ws.h so_locations" - #TEA_ADD_SOURCES([unix/unixFile.c]) - #TEA_ADD_LIBS([-lsuperfly]) -fi -AC_SUBST(CLEANFILES) - -#-------------------------------------------------------------------- -# __CHANGE__ -# Choose which headers you need. Extension authors should try very -# hard to only rely on the Tcl public header files. Internal headers -# contain private data structures and are subject to change without -# notice. -# This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG -#-------------------------------------------------------------------- - -TEA_PUBLIC_TCL_HEADERS -#TEA_PRIVATE_TCL_HEADERS - -#TEA_PUBLIC_TK_HEADERS -TEA_PRIVATE_TK_HEADERS -TEA_PATH_X - -#-------------------------------------------------------------------- -# __CHANGE__ -# Choose OpenGL platform -#-------------------------------------------------------------------- - -case "${TEA_WINDOWINGSYSTEM}" in - aqua) - AC_SUBST(TOGL_WINDOWINGSYSTEM,TOGL_AGL) - TEA_ADD_LIBS([-framework AGL -framework OpenGL -framework ApplicationServices]) - # libGLU is implicit in OpenGL framework - LIBGLU= - ;; - x11) - AC_SUBST(TOGL_WINDOWINGSYSTEM,TOGL_X11) - TEA_ADD_LIBS([-lGL -lXmu]) - LIBGLU=-lGLU - ;; - win32) - AC_SUBST(TOGL_WINDOWINGSYSTEM,TOGL_WGL) - TEA_ADD_LIBS([opengl32.lib user32.lib gdi32.lib]) - if test "$GCC" = "yes" ; then - LIBGLU=-lglu32 - else - LIBGLU=glu32.lib - fi - ;; - *) - AC_MSG_ERROR([Unsupported windowing system: ${TEA_WINDOWINGSYSTEM}]) - ;; -esac -AC_SUBST(LIBGLU) - -#-------------------------------------------------------------------- -# Check whether --enable-threads or --disable-threads was given. -# This auto-enables if Tcl was compiled threaded. -#-------------------------------------------------------------------- - -TEA_ENABLE_THREADS - -#-------------------------------------------------------------------- -# The statement below defines a collection of symbols related to -# building as a shared library instead of a static library. -#-------------------------------------------------------------------- - -TEA_ENABLE_SHARED - -#-------------------------------------------------------------------- -# This macro figures out what flags to use with the compiler/linker -# when building shared/static debug/optimized objects. This information -# can be taken from the tclConfig.sh file, but this figures it all out. -#-------------------------------------------------------------------- - -TEA_CONFIG_CFLAGS -# should be part of TEA_CONFIG_CFLAGS, but more visible modification here -AC_SUBST(SHLIB_SUFFIX) - -#-------------------------------------------------------------------- -# Set the default compiler switches based on the --enable-symbols option. -#-------------------------------------------------------------------- - -TEA_ENABLE_SYMBOLS - -#-------------------------------------------------------------------- -# Everyone should be linking against the Tcl stub library. If you -# can't for some reason, remove this definition. If you aren't using -# stubs, you also need to modify the SHLIB_LD_LIBS setting below to -# link against the non-stubbed Tcl library. Add Tk too if necessary. -#-------------------------------------------------------------------- - -AC_DEFINE(USE_TCL_STUBS, 1, [Use Tcl stubs]) -AC_DEFINE(USE_TK_STUBS, 1, [Use Tk stubs]) - -#-------------------------------------------------------------------- -# This macro generates a line to use when building a library. It -# depends on values set by the TEA_ENABLE_SHARED, TEA_ENABLE_SYMBOLS, -# and TEA_LOAD_TCLCONFIG macros above. -#-------------------------------------------------------------------- - -TEA_MAKE_LIB - -#-------------------------------------------------------------------- -# Determine the name of the tclsh and/or wish executables in the -# Tcl and Tk build directories or the location they were installed -# into. These paths are used to support running test cases only, -# the Makefile should not be making use of these paths to generate -# a pkgIndex.tcl file or anything else at extension build time. -#-------------------------------------------------------------------- - -TEA_PROG_TCLSH -TEA_PROG_WISH - -#-------------------------------------------------------------------- -# Finally, substitute all of the various values into the Makefile. -# You may alternatively have a special pkgIndex.tcl.in or other files -# which require substituting th AC variables in. Include these here. -#-------------------------------------------------------------------- - -AC_OUTPUT([Makefile pkgIndex.tcl togl_ws.h]) diff --git a/ng/Togl-1.7/double.c b/ng/Togl-1.7/double.c deleted file mode 100644 index ba072570..00000000 --- a/ng/Togl-1.7/double.c +++ /dev/null @@ -1,280 +0,0 @@ -/* $Id: double.c,v 1.14 2005/04/23 07:49:13 gregcouch Exp $ */ - -/* - * Togl - a Tk OpenGL widget - * Copyright (C) 1996-1997 Brian Paul and Ben Bederson - * See the LICENSE file for copyright details. - */ - -#include "togl.h" -#include -#include - -/* - * The following variable is a special hack that is needed in order for - * Sun shared libraries to be used for Tcl. - */ -#ifdef SUN -extern int matherr(); -int *tclDummyMathPtr = (int *) matherr; -#endif - -static GLuint FontBase; -static float xAngle = 0.0, yAngle = 0.0, zAngle = 0.0; -static GLfloat CornerX, CornerY, CornerZ; /* where to print strings */ - - -/* - * Togl widget create callback. This is called by Tcl/Tk when the widget has - * been realized. Here's where one may do some one-time context setup or - * initializations. - */ -void -create_cb(Togl *togl) -{ - - FontBase = Togl_LoadBitmapFont(togl, TOGL_BITMAP_8_BY_13); - if (!FontBase) { - printf("Couldn't load font!\n"); - exit(1); - } -} - - -/* - * Togl widget reshape callback. This is called by Tcl/Tk when the widget - * has been resized. Typically, we call glViewport and perhaps setup the - * projection matrix. - */ -void -reshape_cb(Togl *togl) -{ - int width = Togl_Width(togl); - int height = Togl_Height(togl); - float aspect = (float) width / (float) height; - - glViewport(0, 0, width, height); - - /* Set up projection transform */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-aspect, aspect, -1.0, 1.0, 1.0, 10.0); - - CornerX = -aspect; - CornerY = -1.0; - CornerZ = -1.1; - - /* Change back to model view transform for rendering */ - glMatrixMode(GL_MODELVIEW); -} - - - -static void -print_string(const char *s) -{ - glCallLists(strlen(s), GL_UNSIGNED_BYTE, s); -} - - -/* - * Togl widget display callback. This is called by Tcl/Tk when the widget's - * contents have to be redrawn. Typically, we clear the color and depth - * buffers, render our objects, then swap the front/back color buffers. - */ -void -display_cb(Togl *togl) -{ - static GLuint cubeList = 0; - const char *ident; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glLoadIdentity(); /* Reset modelview matrix to the identity - * matrix */ - glTranslatef(0.0, 0.0, -3.0); /* Move the camera back three units */ - glRotatef(xAngle, 1.0, 0.0, 0.0); /* Rotate by X, Y, and Z angles */ - glRotatef(yAngle, 0.0, 1.0, 0.0); - glRotatef(zAngle, 0.0, 0.0, 1.0); - - glEnable(GL_DEPTH_TEST); - - if (!cubeList) { - cubeList = glGenLists(1); - glNewList(cubeList, GL_COMPILE); - - /* Front face */ - glBegin(GL_QUADS); - glColor3f(0.0, 0.7, 0.1); /* Green */ - glVertex3f(-1.0, 1.0, 1.0); - glVertex3f(1.0, 1.0, 1.0); - glVertex3f(1.0, -1.0, 1.0); - glVertex3f(-1.0, -1.0, 1.0); - /* Back face */ - glColor3f(0.9, 1.0, 0.0); /* Yellow */ - glVertex3f(-1.0, 1.0, -1.0); - glVertex3f(1.0, 1.0, -1.0); - glVertex3f(1.0, -1.0, -1.0); - glVertex3f(-1.0, -1.0, -1.0); - /* Top side face */ - glColor3f(0.2, 0.2, 1.0); /* Blue */ - glVertex3f(-1.0, 1.0, 1.0); - glVertex3f(1.0, 1.0, 1.0); - glVertex3f(1.0, 1.0, -1.0); - glVertex3f(-1.0, 1.0, -1.0); - /* Bottom side face */ - glColor3f(0.7, 0.0, 0.1); /* Red */ - glVertex3f(-1.0, -1.0, 1.0); - glVertex3f(1.0, -1.0, 1.0); - glVertex3f(1.0, -1.0, -1.0); - glVertex3f(-1.0, -1.0, -1.0); - glEnd(); - - glEndList(); - - } - glCallList(cubeList); - - glDisable(GL_DEPTH_TEST); - glLoadIdentity(); - glColor3f(1.0, 1.0, 1.0); - glRasterPos3f(CornerX, CornerY, CornerZ); - glListBase(FontBase); - ident = Togl_Ident(togl); - if (strcmp(ident, "Single") == 0) { - print_string("Single buffered"); - } else { - print_string("Double buffered"); - } - Togl_SwapBuffers(togl); -} - - - - -int -setXrot_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName setXrot ?angle?\"", - TCL_STATIC); - return TCL_ERROR; - } - - xAngle = atof(argv[2]); - - /* printf( "before %f ", xAngle ); */ - - if (xAngle < 0.0) { - xAngle += 360.0; - } else if (xAngle > 360.0) { - xAngle -= 360.0; - } - - /* printf( "after %f \n", xAngle ); */ - - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - - -int -setYrot_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName setYrot ?angle?\"", - TCL_STATIC); - return TCL_ERROR; - } - - yAngle = atof(argv[2]); - - if (yAngle < 0.0) { - yAngle += 360.0; - } else if (yAngle > 360.0) { - yAngle -= 360.0; - } - - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - -int -getXrot_cb(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) -{ - sprintf(interp->result, "%d", (int) xAngle); - return TCL_OK; -} - -int -getYrot_cb(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) -{ - sprintf(interp->result, "%d", (int) yAngle); - return TCL_OK; -} - -/* - * Called by Tk_Main() to let me initialize the modules (Togl) I will need. - */ -TOGL_EXTERN int -Double_Init(Tcl_Interp *interp) -{ -#ifdef USE_TCL_STUBS - if (Tcl_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif -#ifdef USE_TK_STUBS - if (Tk_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif - - if (Togl_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } -#ifdef macintosh - Togl_MacSetupMainInterp(interp); -#endif - - /* - * Specify the C callback functions for widget creation, display, - * and reshape. - */ - Togl_CreateFunc(create_cb); - Togl_DisplayFunc(display_cb); - Togl_ReshapeFunc(reshape_cb); - - /* - * Make a new Togl widget command so the Tcl code can set a C variable. - */ - - Togl_CreateCommand("setXrot", setXrot_cb); - Togl_CreateCommand("setYrot", setYrot_cb); - - /* - * Call Tcl_CreateCommand for application-specific commands, if - * they weren't already created by the init procedures called above. - */ - - Tcl_CreateCommand(interp, "getXrot", (Tcl_CmdProc *) getXrot_cb, - (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); - Tcl_CreateCommand(interp, "getYrot", (Tcl_CmdProc *) getYrot_cb, - (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); - return TCL_OK; -} diff --git a/ng/Togl-1.7/double.tcl b/ng/Togl-1.7/double.tcl deleted file mode 100644 index 88987f7c..00000000 --- a/ng/Togl-1.7/double.tcl +++ /dev/null @@ -1,103 +0,0 @@ -#!/bin/sh -# the next line restarts using wish \ -exec wish "$0" "$@" - -# $Id: double.tcl,v 1.5 2001/12/20 13:59:31 beskow Exp $ - -# Togl - a Tk OpenGL widget -# Copyright (C) 1996 Brian Paul and Ben Bederson -# See the LICENSE file for copyright details. - - -# $Log: double.tcl,v $ -# Revision 1.5 2001/12/20 13:59:31 beskow -# Improved error-handling in togl.c in case of window creation failure -# Added pkgIndex target to makefile -# Updated documentation to reflect stubs-interface (Togl.html + new README.stubs) -# Added tk8.4a3 headers -# Removed obsolete Tk internal headers -# -# Revision 1.4 2001/01/29 18:11:53 brianp -# Jonas Beskow's changes to use Tcl/Tk stub interface -# -# Revision 1.3 1998/03/12 03:52:31 brianp -# now sharing display lists between the widgets -# -# Revision 1.2 1996/10/23 23:31:56 brianp -# added -ident options to togl calls -# -# Revision 1.1 1996/10/23 23:17:22 brianp -# Initial revision -# - - -# An Tk/OpenGL widget demo with two windows, one single buffered and the -# other double buffered. - -load [file dirname [info script]]/double[info sharedlibextension] - -proc setup {} { - wm title . "Single vs Double Buffering" - - frame .f1 - - # create first Togl widget - togl .f1.o1 -width 200 -height 200 -rgba true -double false -depth true -ident Single - - # create second Togl widget, share display lists with first widget - togl .f1.o2 -width 200 -height 200 -rgba true -double true -depth true -ident Double -sharelist Single - - scale .sx -label {X Axis} -from 0 -to 360 -command {setAngle x} -orient horizontal - scale .sy -label {Y Axis} -from 0 -to 360 -command {setAngle y} -orient horizontal - button .btn -text Quit -command exit - - bind .f1.o1 { - motion_event [lindex [%W config -width] 4] \ - [lindex [%W config -height] 4] \ - %x %y - } - - bind .f1.o2 { - motion_event [lindex [%W config -width] 4] \ - [lindex [%W config -height] 4] \ - %x %y - } - - pack .f1.o1 .f1.o2 -side left -padx 3 -pady 3 -fill both -expand t - pack .f1 -fill both -expand t - pack .sx -fill x - pack .sy -fill x - pack .btn -fill x -} - - - -# This is called when mouse button 1 is pressed and moved in either of -# the OpenGL windows. -proc motion_event { width height x y } { - .f1.o1 setXrot [expr 360.0 * $y / $height] - .f1.o2 setXrot [expr 360.0 * $y / $height] - .f1.o1 setYrot [expr 360.0 * ($width - $x) / $width] - .f1.o2 setYrot [expr 360.0 * ($width - $x) / $width] - -# .sx set [expr 360.0 * $y / $height] -# .sy set [expr 360.0 * ($width - $x) / $width] - - .sx set [getXrot] - .sy set [getYrot] -} - -# This is called when a slider is changed. -proc setAngle {axis value} { - global xAngle yAngle zAngle - - switch -exact $axis { - x {.f1.o1 setXrot $value - .f1.o2 setXrot $value} - y {.f1.o1 setYrot $value - .f1.o2 setYrot $value} - } -} - -# Execution starts here! -setup diff --git a/ng/Togl-1.7/gears.c b/ng/Togl-1.7/gears.c deleted file mode 100644 index 9999a720..00000000 --- a/ng/Togl-1.7/gears.c +++ /dev/null @@ -1,402 +0,0 @@ -/* gears.c */ - -/* - * 3-D gear wheels. This program is in the public domain. - * - * Brian Paul - * - * - * Modified to work under Togl as a widget for TK 1997 - * - * Philip Quaife - * - */ - -#include "togl.h" -#include -#include -#include - -#ifndef M_PI -# define M_PI 3.14159265 -#endif - -struct WHIRLYGIZMO -{ - GLint Gear1, Gear2, Gear3; - GLfloat Rotx, Roty, Rotz; - GLfloat Angle; - int Height, Width; -}; - -/* - * Draw a gear wheel. You'll probably want to call this function when - * building a display list since we do a lot of trig here. - * - * Input: inner_radius - radius of hole at center - * outer_radius - radius at center of teeth - * width - width of gear - * teeth - number of teeth - * tooth_depth - depth of tooth - */ -static void -gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, - GLint teeth, GLfloat tooth_depth) -{ - GLint i; - GLfloat r0, r1, r2; - GLfloat angle, da; - GLfloat u, v, len; - - r0 = inner_radius; - r1 = outer_radius - tooth_depth / 2.0; - r2 = outer_radius + tooth_depth / 2.0; - - da = 2.0 * M_PI / teeth / 4.0; - - glShadeModel(GL_FLAT); - - glNormal3f(0.0, 0.0, 1.0); - - /* draw front face */ - glBegin(GL_QUAD_STRIP); - for (i = 0; i <= teeth; i++) { - angle = i * 2.0 * M_PI / teeth; - glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); - glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); - glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), - width * 0.5); - } - glEnd(); - - /* draw front sides of teeth */ - glBegin(GL_QUADS); - da = 2.0 * M_PI / teeth / 4.0; - for (i = 0; i < teeth; i++) { - angle = i * 2.0 * M_PI / teeth; - - glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); - glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); - glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), - width * 0.5); - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), - width * 0.5); - } - glEnd(); - - - glNormal3f(0.0, 0.0, -1.0); - - /* draw back face */ - glBegin(GL_QUAD_STRIP); - for (i = 0; i <= teeth; i++) { - angle = i * 2.0 * M_PI / teeth; - glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); - glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), - -width * 0.5); - glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); - } - glEnd(); - - /* draw back sides of teeth */ - glBegin(GL_QUADS); - da = 2.0 * M_PI / teeth / 4.0; - for (i = 0; i < teeth; i++) { - angle = i * 2.0 * M_PI / teeth; - - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), - -width * 0.5); - glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), - -width * 0.5); - glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); - glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); - } - glEnd(); - - - /* draw outward faces of teeth */ - glBegin(GL_QUAD_STRIP); - for (i = 0; i < teeth; i++) { - angle = i * 2.0 * M_PI / teeth; - - glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); - glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); - u = r2 * cos(angle + da) - r1 * cos(angle); - v = r2 * sin(angle + da) - r1 * sin(angle); - len = sqrt(u * u + v * v); - u /= len; - v /= len; - glNormal3f(v, -u, 0.0); - glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); - glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); - glNormal3f(cos(angle), sin(angle), 0.0); - glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), - width * 0.5); - glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), - -width * 0.5); - u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da); - v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da); - glNormal3f(v, -u, 0.0); - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), - width * 0.5); - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), - -width * 0.5); - glNormal3f(cos(angle), sin(angle), 0.0); - } - - glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5); - glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5); - - glEnd(); - - - glShadeModel(GL_SMOOTH); - - /* draw inside radius cylinder */ - glBegin(GL_QUAD_STRIP); - for (i = 0; i <= teeth; i++) { - angle = i * 2.0 * M_PI / teeth; - glNormal3f(-cos(angle), -sin(angle), 0.0); - glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); - glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); - } - glEnd(); - -} - -/* - * static GLfloat view_rotx=20.0, view_roty=30.0, view_rotz=0.0; static GLint - * gear1, gear2, gear3; static GLfloat angle = 0.0; */ -static GLuint limit; -static GLuint count = 1; - -static GLubyte polycolor[4] = { 255, 255, 255, 255 }; - -static void -draw(Togl *togl) -{ - struct WHIRLYGIZMO *Wg; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - Wg = Togl_GetClientData(togl); - glDisable(GL_TEXTURE_2D); - glPushMatrix(); - glRotatef(Wg->Rotx, 1.0, 0.0, 0.0); - glRotatef(Wg->Roty, 0.0, 1.0, 0.0); - glRotatef(Wg->Rotz, 0.0, 0.0, 1.0); - - glPushMatrix(); - glTranslatef(-3.0, -2.0, 0.0); - glRotatef(Wg->Angle, 0.0, 0.0, 1.0); - glEnable(GL_DEPTH_TEST); - glCallList(Wg->Gear1); - glEnable(GL_DEPTH_TEST); - glPopMatrix(); - - glPushMatrix(); - glTranslatef(3.1, -2.0, 0.0); - glRotatef(-2.0 * Wg->Angle - 9.0, 0.0, 0.0, 1.0); - glCallList(Wg->Gear2); - glPopMatrix(); - - glPushMatrix(); - glTranslatef(-3.1, 4.2, 0.0); - glRotatef(-2.0 * Wg->Angle - 25.0, 0.0, 0.0, 1.0); - glCallList(Wg->Gear3); - glPopMatrix(); - - glPopMatrix(); - - Togl_SwapBuffers(togl); - -} - - -static void -zap(Togl *togl) -{ - struct WHIRLYGIZMO *Wg; - - Wg = Togl_GetClientData(togl); - free(Wg); -} - - -static void -idle(Togl *togl) -{ - struct WHIRLYGIZMO *Wg; - - Wg = Togl_GetClientData(togl); - Wg->Angle += 2.0; - Togl_PostRedisplay(togl); -} - - -/* change view angle, exit upon ESC */ -/* - * static GLenum key(int k, GLenum mask) { switch (k) { case TK_UP: view_rotx - * += 5.0; return GL_TRUE; case TK_DOWN: view_rotx -= 5.0; return GL_TRUE; case - * TK_LEFT: view_roty += 5.0; return GL_TRUE; case TK_RIGHT: view_roty -= 5.0; - * return GL_TRUE; case TK_z: view_rotz += 5.0; return GL_TRUE; case TK_Z: - * view_rotz -= 5.0; return GL_TRUE; } return GL_FALSE; } */ - -/* new window size or exposure */ -static void -reshape(Togl *togl) -{ - int width, height; - - width = Togl_Width(togl); - height = Togl_Height(togl); - glViewport(0, 0, (GLint) width, (GLint) height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - if (width > height) { - GLfloat w = (GLfloat) width / (GLfloat) height; - - glFrustum(-w, w, -1.0, 1.0, 5.0, 60.0); - } else { - GLfloat h = (GLfloat) height / (GLfloat) width; - - glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0); - } - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0, 0.0, -40.0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - -} - - -static void -init(Togl *togl) -{ - struct WHIRLYGIZMO *Wg; - - static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; - static GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; - static GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; - static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 }; - glLightfv(GL_LIGHT0, GL_POSITION, pos); - glEnable(GL_CULL_FACE); - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_DEPTH_TEST); - /* make the gears */ - Wg = malloc(sizeof (*Wg)); - if (!Wg) { - Tcl_SetResult(Togl_Interp(togl), - "\"Cannot allocate client data for widget\"", TCL_STATIC); - } - Wg->Gear1 = glGenLists(1); - glNewList(Wg->Gear1, GL_COMPILE); - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); - gear(1.0, 4.0, 1.0, 20, 0.7); - glEndList(); - - Wg->Gear2 = glGenLists(1); - glNewList(Wg->Gear2, GL_COMPILE); - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); - gear(0.5, 2.0, 2.0, 10, 0.7); - glEndList(); - - Wg->Gear3 = glGenLists(1); - glNewList(Wg->Gear3, GL_COMPILE); - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); - gear(1.3, 2.0, 0.5, 10, 0.7); - glEndList(); - - glEnable(GL_NORMALIZE); - Wg->Height = Togl_Height(togl); - Wg->Width = Togl_Width(togl); - Wg->Angle = 0.0; - Wg->Rotx = 0.0; - Wg->Roty = 0.0; - Wg->Rotz = 0.0; - Togl_SetClientData(togl, (ClientData) Wg); -} - -int -position(Togl *togl, int argc, CONST84 char *argv[]) -{ - struct WHIRLYGIZMO *Wg; - Tcl_Interp *interp = Togl_Interp(togl); - char Result[100]; - - Wg = Togl_GetClientData(togl); - /* error checking */ - if (argc != 2) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName \"", TCL_STATIC); - return TCL_ERROR; - } - - /* Let result string equal value */ - sprintf(Result, "%g %g", Wg->Roty, Wg->Rotx); - - Tcl_SetResult(interp, Result, TCL_VOLATILE); - return TCL_OK; -} - -int -rotate(Togl *togl, int argc, CONST84 char *argv[]) -{ - struct WHIRLYGIZMO *Wg; - Tcl_Interp *interp = Togl_Interp(togl); - - Wg = Togl_GetClientData(togl); - /* error checking */ - if (argc != 4) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName xrot yrot\"", TCL_STATIC); - return TCL_ERROR; - } - - Wg->Roty = atof(argv[2]); - Wg->Rotx = atof(argv[3]); - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - -TOGL_EXTERN int -Gears_Init(Tcl_Interp *interp) -{ - /* - * Initialize Tcl, Tk, and the Togl widget module. - */ -#ifdef USE_TCL_STUBS - if (Tcl_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif -#ifdef USE_TK_STUBS - if (Tk_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif - - if (Togl_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - - /* - * Specify the C callback functions for widget creation, display, - * and reshape. - */ - Togl_CreateFunc(init); - Togl_DestroyFunc(zap); - Togl_DisplayFunc(draw); - Togl_ReshapeFunc(reshape); - Togl_TimerFunc(idle); - Togl_CreateCommand("rotate", rotate); - Togl_CreateCommand("position", position); - return TCL_OK; -} diff --git a/ng/Togl-1.7/gears.tcl b/ng/Togl-1.7/gears.tcl deleted file mode 100755 index ddb2729d..00000000 --- a/ng/Togl-1.7/gears.tcl +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/sh -# the next line restarts using wish \ -exec wish "$0" "$@" - -# Togl - a Tk OpenGL widget -# Copyright (C) 1996-1997 Brian Paul and Ben Bederson -# See the LICENSE file for copyright details. - - -# -# Test Togl using GL Gears Demo -# -# Copyright (C) 1997 Philip Quaife -# - -load [file dirname [info script]]/gears[info sharedlibextension] - -proc setup {} { - global startx starty xangle0 yangle0 xangle yangle RotCnt - global vTime - set RotCnt 1 - set xangle 0.0 - set yangle 0.0 - set vTime 100 - wm title . "Rotating Gear Widget Test" - - label .t -text "Click and drag to rotate image" - pack .t -side top -padx 2 -pady 10 - frame .f - pack .f -side top - button .f.n1 -text " Add " -command AutoRot - button .f.r1 -text "Remove" -command DelRot - button .f.b1 -text " Quit " -command exit - entry .f.t -width 4 -textvariable vTime - pack .f.n1 .f.t .f.r1 .f.b1 -side left -anchor w -padx 5 - newRot .w0 10 - -} -proc AutoRot {} { - global RotCnt vTime - newRot .w$RotCnt $vTime - set RotCnt [expr $RotCnt + 1] -} - -proc DelRot {} { - global RotCnt vTime - if { $RotCnt != 0 } { - set RotCnt [expr $RotCnt - 1] - destroy .w$RotCnt - } -} - -proc newRot {win {tick 100} } { - togl $win -width 200 -height 200 -rgba true -double true -depth true -privatecmap false -time $tick - bind $win {RotStart %x %y %W} - bind $win {RotMove %x %y %W} - pack $win -expand true -fill both -} - -proc RotStart {x y W } { - global startx starty xangle0 yangle0 xangle yangle - set startx $x - set starty $y - set vPos [$W position] - set xangle0 [lindex $vPos 0] - set yangle0 [lindex $vPos 1] - } - -proc RotMove {x y W} { - global startx starty xangle0 yangle0 xangle yangle - set xangle [expr $xangle0 + ($x - $startx) ] - set yangle [expr $yangle0 + ($y - $starty) ] - $W rotate $xangle $yangle - } - -setup diff --git a/ng/Togl-1.7/image.c b/ng/Togl-1.7/image.c deleted file mode 100644 index a4027ce7..00000000 --- a/ng/Togl-1.7/image.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * SGI rgb file reader borrowed from gltk library - */ - -#include "togl.h" /* added by GG to include windows.h */ -#include -#include -#include -#include "image.h" - -#ifndef SEEK_SET -# define SEEK_SET 0 -#endif - - -static void -tkQuit(void) -{ - exit(0); -} - - -/******************************************************************************/ - -typedef struct _rawImageRec -{ - unsigned short imagic; - unsigned short type; - unsigned short dim; - unsigned short sizeX, sizeY, sizeZ; - unsigned long min, max; - unsigned long wasteBytes; - char name[80]; - unsigned long colorMap; - FILE *file; - unsigned char *tmp, *tmpR, *tmpG, *tmpB, *tmpA; - unsigned long rleEnd; - GLuint *rowStart; - GLint *rowSize; -} rawImageRec; - - -/******************************************************************************/ - -static void -ConvertShort(unsigned short *array, long length) -{ - unsigned long b1, b2; - unsigned char *ptr; - - ptr = (unsigned char *) array; - while (length--) { - b1 = *ptr++; - b2 = *ptr++; - *array++ = (b1 << 8) | (b2); - } -} - -static void -ConvertLong(GLuint *array, long length) -{ - unsigned long b1, b2, b3, b4; - unsigned char *ptr; - - ptr = (unsigned char *) array; - while (length--) { - b1 = *ptr++; - b2 = *ptr++; - b3 = *ptr++; - b4 = *ptr++; - *array++ = (b1 << 24) | (b2 << 16) | (b3 << 8) | (b4); - } -} - -static rawImageRec * -RawImageOpen(char *fileName) -{ - union - { - int testWord; - char testByte[4]; - } endianTest; - rawImageRec *raw; - GLenum swapFlag; - int x; - - endianTest.testWord = 1; - if (endianTest.testByte[0] == 1) { - swapFlag = GL_TRUE; - } else { - swapFlag = GL_FALSE; - } - - raw = (rawImageRec *) malloc(sizeof (rawImageRec)); - if (raw == NULL) { - fprintf(stderr, "Out of memory!\n"); - tkQuit(); - } - if ((raw->file = fopen(fileName, "rb")) == NULL) { - perror(fileName); - tkQuit(); - } - - fread(raw, 1, 12, raw->file); - - if (swapFlag) { - ConvertShort(&raw->imagic, 6); - } - - raw->tmp = (unsigned char *) malloc(raw->sizeX * 256); - raw->tmpR = (unsigned char *) malloc(raw->sizeX * 256); - raw->tmpG = (unsigned char *) malloc(raw->sizeX * 256); - raw->tmpB = (unsigned char *) malloc(raw->sizeX * 256); - raw->tmpA = (unsigned char *) malloc(raw->sizeX * 256); - if (raw->tmp == NULL || raw->tmpR == NULL || raw->tmpG == NULL || - raw->tmpB == NULL || raw->tmpA == NULL) { - fprintf(stderr, "Out of memory!\n"); - tkQuit(); - } - - if ((raw->type & 0xFF00) == 0x0100) { - x = raw->sizeY * raw->sizeZ * sizeof (GLuint); - raw->rowStart = (GLuint *) malloc(x); - raw->rowSize = (GLint *) malloc(x); - if (raw->rowStart == NULL || raw->rowSize == NULL) { - fprintf(stderr, "Out of memory!\n"); - tkQuit(); - } - raw->rleEnd = 512 + (2 * x); - fseek(raw->file, 512, SEEK_SET); - fread(raw->rowStart, 1, x, raw->file); - fread(raw->rowSize, 1, x, raw->file); - if (swapFlag) { - ConvertLong(raw->rowStart, x / sizeof (GLuint)); - ConvertLong((GLuint *) raw->rowSize, x / sizeof (GLint)); - } - } - return raw; -} - -static void -RawImageClose(rawImageRec * raw) -{ - - fclose(raw->file); - free(raw->tmp); - free(raw->tmpR); - free(raw->tmpG); - free(raw->tmpB); - free(raw->tmpA); - free(raw); -} - -static void -RawImageGetRow(rawImageRec * raw, unsigned char *buf, int y, int z) -{ - unsigned char *iPtr, *oPtr, pixel; - int count; - - if ((raw->type & 0xFF00) == 0x0100) { - fseek(raw->file, raw->rowStart[y + z * raw->sizeY], SEEK_SET); - fread(raw->tmp, 1, (unsigned int) raw->rowSize[y + z * raw->sizeY], - raw->file); - - iPtr = raw->tmp; - oPtr = buf; - while (1) { - pixel = *iPtr++; - count = (int) (pixel & 0x7F); - if (!count) { - return; - } - if (pixel & 0x80) { - while (count--) { - *oPtr++ = *iPtr++; - } - } else { - pixel = *iPtr++; - while (count--) { - *oPtr++ = pixel; - } - } - } - } else { - fseek(raw->file, 512 + (y * raw->sizeX) + (z * raw->sizeX * raw->sizeY), - SEEK_SET); - fread(buf, 1, raw->sizeX, raw->file); - } -} - -static void -RawImageGetData(rawImageRec * raw, TK_RGBImageRec * final) -{ - unsigned char *ptr; - int i, j; - - final->data = - (unsigned char *) malloc((raw->sizeX + 1) * (raw->sizeY + 1) * 4); - if (final->data == NULL) { - fprintf(stderr, "Out of memory!\n"); - tkQuit(); - } - - ptr = final->data; - for (i = 0; i < (int) (raw->sizeY); i++) { - RawImageGetRow(raw, raw->tmpR, i, 0); - RawImageGetRow(raw, raw->tmpG, i, 1); - RawImageGetRow(raw, raw->tmpB, i, 2); - if (raw->sizeZ == 4) { - /* 4 components */ - RawImageGetRow(raw, raw->tmpA, i, 3); - for (j = 0; j < (int) (raw->sizeX); j++) { - *ptr++ = *(raw->tmpR + j); - *ptr++ = *(raw->tmpG + j); - *ptr++ = *(raw->tmpB + j); - *ptr++ = *(raw->tmpA + j); - } - } else { - /* 3 components */ - for (j = 0; j < (int) (raw->sizeX); j++) { - *ptr++ = *(raw->tmpR + j); - *ptr++ = *(raw->tmpG + j); - *ptr++ = *(raw->tmpB + j); - } - } - } -} - -TK_RGBImageRec * -tkRGBImageLoad(char *fileName) -{ - rawImageRec *raw; - TK_RGBImageRec *final; - - raw = RawImageOpen(fileName); - final = (TK_RGBImageRec *) malloc(sizeof (TK_RGBImageRec)); - if (final == NULL) { - fprintf(stderr, "Out of memory!\n"); - tkQuit(); - } - final->sizeX = raw->sizeX; - final->sizeY = raw->sizeY; - final->sizeZ = raw->sizeZ; - RawImageGetData(raw, final); - RawImageClose(raw); - return final; -} - -/******************************************************************************/ diff --git a/ng/Togl-1.7/image.h b/ng/Togl-1.7/image.h deleted file mode 100644 index 47babb74..00000000 --- a/ng/Togl-1.7/image.h +++ /dev/null @@ -1,14 +0,0 @@ -/* image.h */ - -#ifndef IMAGE_H -# define IMAGE_H - -typedef struct _TK_RGBImageRec -{ - int sizeX, sizeY, sizeZ; - unsigned char *data; -} TK_RGBImageRec; - -extern TK_RGBImageRec *tkRGBImageLoad(char *fileName); - -#endif diff --git a/ng/Togl-1.7/index.c b/ng/Togl-1.7/index.c deleted file mode 100644 index 8e26e26c..00000000 --- a/ng/Togl-1.7/index.c +++ /dev/null @@ -1,184 +0,0 @@ -/* $Id: index.c,v 1.10 2005/04/23 07:49:13 gregcouch Exp $ */ - -/* - * Togl - a Tk OpenGL widget - * Copyright (C) 1996-1997 Brian Paul and Ben Bederson - * See the LICENSE file for copyright details. - */ - - -/* - * An example Togl program using color-index mode. - */ - - -#include "togl.h" -#include -#include - - -/* - * The following variable is a special hack that is needed in order for - * Sun shared libraries to be used for Tcl. - */ -#ifdef SUN -extern int matherr(); -int *tclDummyMathPtr = (int *) matherr; -#endif - - -/* Our color indexes: */ -static unsigned long black, red, green, blue; - -/* Rotation angle */ -static float Angle = 0.0; - - -/* - * Togl widget create callback. This is called by Tcl/Tk when the widget has - * been realized. Here's where one may do some one-time context setup or - * initializations. - */ -void -create_cb(Togl *togl) -{ - /* allocate color indexes */ - black = Togl_AllocColor(togl, 0.0, 0.0, 0.0); - red = Togl_AllocColor(togl, 1.0, 0.0, 0.0); - green = Togl_AllocColor(togl, 0.0, 1.0, 0.0); - blue = Togl_AllocColor(togl, 0.0, 0.0, 1.0); - - /* If we were using a private read/write colormap we'd setup our color - * table with something like this: */ - /* - * black = 1; Togl_SetColor( togl, black, 0.0, 0.0, 0.0 ); red = 2; - * Togl_SetColor( togl, red, 1.0, 0.0, 0.0 ); green = 3; Togl_SetColor( - * togl, green, 0.0, 1.0, 0.0 ); blue = 4; Togl_SetColor( togl, blue, 0.0, - * 0.0, 1.0 ); */ - - glShadeModel(GL_FLAT); - glDisable(GL_DITHER); -} - - -/* - * Togl widget reshape callback. This is called by Tcl/Tk when the widget - * has been resized. Typically, we call glViewport and perhaps setup the - * projection matrix. - */ -void -reshape_cb(Togl *togl) -{ - int width = Togl_Width(togl); - int height = Togl_Height(togl); - float aspect = (float) width / (float) height; - - glViewport(0, 0, width, height); - - /* Set up projection transform */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-aspect, aspect, -1.0, 1.0, -1.0, 1.0); - - /* Change back to model view transform for rendering */ - glMatrixMode(GL_MODELVIEW); -} - - -/* - * Togl widget display callback. This is called by Tcl/Tk when the widget's - * contents have to be redrawn. Typically, we clear the color and depth - * buffers, render our objects, then swap the front/back color buffers. - */ -void -display_cb(Togl *togl) -{ - glClearIndex(black); - glClear(GL_COLOR_BUFFER_BIT); - - glPushMatrix(); - glTranslatef(0.3, -0.3, 0.0); - glRotatef(Angle, 0.0, 0.0, 1.0); - glIndexi(red); - glBegin(GL_TRIANGLES); - glVertex2f(-0.5, -0.3); - glVertex2f(0.5, -0.3); - glVertex2f(0.0, 0.6); - glEnd(); - glPopMatrix(); - - glPushMatrix(); - glRotatef(Angle, 0.0, 0.0, 1.0); - glIndexi(green); - glBegin(GL_TRIANGLES); - glVertex2f(-0.5, -0.3); - glVertex2f(0.5, -0.3); - glVertex2f(0.0, 0.6); - glEnd(); - glPopMatrix(); - - glPushMatrix(); - glTranslatef(-0.3, 0.3, 0.0); - glRotatef(Angle, 0.0, 0.0, 1.0); - glIndexi(blue); - glBegin(GL_TRIANGLES); - glVertex2f(-0.5, -0.3); - glVertex2f(0.5, -0.3); - glVertex2f(0.0, 0.6); - glEnd(); - glPopMatrix(); - - glFlush(); - Togl_SwapBuffers(togl); -} - - -void -timer_cb(Togl *togl) -{ - Angle += 5.0; - Togl_PostRedisplay(togl); -} - - -TOGL_EXTERN int -Index_Init(Tcl_Interp *interp) -{ - /* - * Initialize Tcl, Tk, and the Togl widget module. - */ -#ifdef USE_TCL_STUBS - if (Tcl_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif -#ifdef USE_TK_STUBS - if (Tk_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif - - if (Togl_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - - /* - * Specify the C callback functions for widget creation, display, - * and reshape. - */ - Togl_CreateFunc(create_cb); - Togl_DisplayFunc(display_cb); - Togl_ReshapeFunc(reshape_cb); - Togl_TimerFunc(timer_cb); - - /* - * Make a new Togl widget command so the Tcl code can set a C variable. - */ - /* NONE */ - - /* - * Call Tcl_CreateCommand for application-specific commands, if - * they weren't already created by the init procedures called above. - */ - return TCL_OK; -} diff --git a/ng/Togl-1.7/index.tcl b/ng/Togl-1.7/index.tcl deleted file mode 100644 index ce6b7a7f..00000000 --- a/ng/Togl-1.7/index.tcl +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh -# the next line restarts using wish \ -exec wish "$0" "$@" - -# $Id: index.tcl,v 1.5 2001/12/20 13:59:31 beskow Exp $ - -# Togl - a Tk OpenGL widget -# Copyright (C) 1996 Brian Paul and Ben Bederson -# See the LICENSE file for copyright details. - - -# $Log: index.tcl,v $ -# Revision 1.5 2001/12/20 13:59:31 beskow -# Improved error-handling in togl.c in case of window creation failure -# Added pkgIndex target to makefile -# Updated documentation to reflect stubs-interface (Togl.html + new README.stubs) -# Added tk8.4a3 headers -# Removed obsolete Tk internal headers -# -# Revision 1.4 2001/01/29 18:11:53 brianp -# Jonas Beskow's changes to use Tcl/Tk stub interface -# -# Revision 1.3 1998/01/24 14:05:50 brianp -# added quit button (Ben Bederson) -# -# Revision 1.2 1997/04/11 01:37:34 brianp -# added a timer to rotate the triangles -# -# Revision 1.1 1996/10/23 23:18:11 brianp -# Initial revision -# - - -# A Tk/OpenGL widget demo using color-index mode. - -load [file dirname [info script]]/index[info sharedlibextension] - -proc setup {} { - wm title . "Color index demo" - - togl .win -width 200 -height 200 -rgba false -double true -privatecmap false -time 10 - button .btn -text Quit -command exit - - pack .win -expand true -fill both - pack .btn -expand true -fill both -} - - - -# Execution starts here! -setup diff --git a/ng/Togl-1.7/overlay.c b/ng/Togl-1.7/overlay.c deleted file mode 100644 index c4f403ff..00000000 --- a/ng/Togl-1.7/overlay.c +++ /dev/null @@ -1,194 +0,0 @@ -/* $Id: overlay.c,v 1.7 2005/04/23 07:49:13 gregcouch Exp $ */ - -/* - * Togl - a Tk OpenGL widget - * Copyright (C) 1996-1997 Brian Paul and Ben Bederson - * See the LICENSE file for copyright details. - */ - - -/* - * An example Togl program using an overlay. - */ - - -#include "togl.h" -#include -#include - - -/* - * The following variable is a special hack that is needed in order for - * Sun shared libraries to be used for Tcl. - */ -#ifdef SUN -extern int matherr(); -int *tclDummyMathPtr = (int *) matherr; -#endif - - -/* Overlay color indexes: */ -static unsigned long Red, Green; - - -/* - * Togl widget create callback. This is called by Tcl/Tk when the widget has - * been realized. Here's where one may do some one-time context setup or - * initializations. - */ -void -create_cb(Togl *togl) -{ - /* allocate overlay color indexes */ - Red = Togl_AllocColorOverlay(togl, 1.0, 0.0, 0.0); - Green = Togl_AllocColorOverlay(togl, 0.0, 1.0, 0.0); - - /* in this demo we always show the overlay */ - if (Togl_ExistsOverlay(togl)) { - Togl_ShowOverlay(togl); - printf("Red and green lines are in the overlay\n"); - } else { - printf("Sorry, this display doesn't support overlays\n"); - } -} - - -/* - * Togl widget reshape callback. This is called by Tcl/Tk when the widget - * has been resized. Typically, we call glViewport and perhaps setup the - * projection matrix. - */ -void -reshape_cb(Togl *togl) -{ - int width = Togl_Width(togl); - int height = Togl_Height(togl); - float aspect = (float) width / (float) height; - - /* Set up viewing for normal plane's context */ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-aspect, aspect, -1.0, 1.0, -1.0, 1.0); - glMatrixMode(GL_MODELVIEW); - - /* Set up viewing for overlay plane's context */ - if (Togl_ExistsOverlay(togl)) { - Togl_UseLayer(togl, TOGL_OVERLAY); - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); - glMatrixMode(GL_MODELVIEW); - Togl_UseLayer(togl, TOGL_NORMAL); - } -} - - -/* - * Togl widget overlay display callback. This is called by Tcl/Tk when the - * overlay has to be redrawn. - */ -void -overlay_display_cb(Togl *togl) -{ - glClear(GL_COLOR_BUFFER_BIT); - - glIndexi(Red); - glBegin(GL_LINES); - glVertex2f(-1.0, -1.0); - glVertex2f(1.0, 1.0); - glVertex2f(-1.0, 1.0); - glVertex2f(1.0, -1.0); - glEnd(); - - glIndexi(Green); - glBegin(GL_LINE_LOOP); - glVertex2f(-0.5, -0.5); - glVertex2f(0.5, -0.5); - glVertex2f(0.5, 0.5); - glVertex2f(-0.5, 0.5); - glEnd(); - glFlush(); -} - - -/* - * Togl widget display callback. This is called by Tcl/Tk when the widget's - * contents have to be redrawn. Typically, we clear the color and depth - * buffers, render our objects, then swap the front/back color buffers. - */ -void -display_cb(Togl *togl) -{ - glClear(GL_COLOR_BUFFER_BIT); - - glLoadIdentity(); - - glBegin(GL_TRIANGLES); - - glColor3f(1.0, 0.0, 1.0); - glVertex2f(-0.5, -0.3); - glVertex2f(0.5, -0.3); - glVertex2f(0.0, 0.6); - - glColor3f(1.0, 1.0, 0.0); - glVertex2f(-0.5 + 0.2, -0.3 - 0.2); - glVertex2f(0.5 + 0.2, -0.3 - 0.2); - glVertex2f(0.0 + 0.2, 0.6 - 0.2); - - glColor3f(0.0, 1.0, 1.0); - glVertex2f(-0.5 + 0.4, -0.3 - 0.4); - glVertex2f(0.5 + 0.4, -0.3 - 0.4); - glVertex2f(0.0 + 0.4, 0.6 - 0.4); - - glEnd(); - - glFlush(); -} - - -/* - * Called by Tk_Main() to let me initialize the modules (Togl) I will need. - */ -TOGL_EXTERN int -Overlay_Init(Tcl_Interp *interp) -{ - /* - * Initialize Tcl, Tk, and the Togl widget module. - */ -#ifdef USE_TCL_STUBS - if (Tcl_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif -#ifdef USE_TK_STUBS - if (Tk_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif - if (Togl_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - - /* - * Specify the C callback functions for widget creation, display, - * and reshape. - */ - Togl_CreateFunc(create_cb); - Togl_DisplayFunc(display_cb); - Togl_ReshapeFunc(reshape_cb); - - Togl_OverlayDisplayFunc(overlay_display_cb); - - /* - * Make a new Togl widget command so the Tcl code can set a C variable. - */ - /* NONE */ - - /* - * Call Tcl_CreateCommand for application-specific commands, if - * they weren't already created by the init procedures called above. - */ - return TCL_OK; -} diff --git a/ng/Togl-1.7/overlay.tcl b/ng/Togl-1.7/overlay.tcl deleted file mode 100644 index 0be48bc6..00000000 --- a/ng/Togl-1.7/overlay.tcl +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh -# the next line restarts using wish \ -exec wish "$0" "$@" - -# $Id: overlay.tcl,v 1.4 2001/12/20 13:59:31 beskow Exp $ - -# Togl - a Tk OpenGL widget -# Copyright (C) 1996 Brian Paul and Ben Bederson -# See the LICENSE file for copyright details. - - -# $Log: overlay.tcl,v $ -# Revision 1.4 2001/12/20 13:59:31 beskow -# Improved error-handling in togl.c in case of window creation failure -# Added pkgIndex target to makefile -# Updated documentation to reflect stubs-interface (Togl.html + new README.stubs) -# Added tk8.4a3 headers -# Removed obsolete Tk internal headers -# -# Revision 1.3 2001/01/29 18:11:53 brianp -# Jonas Beskow's changes to use Tcl/Tk stub interface -# -# Revision 1.2 1998/01/24 14:05:50 brianp -# added quit button (Ben Bederson) -# -# Revision 1.1 1997/03/07 01:26:38 brianp -# Initial revision -# -# - - -# A Tk/OpenGL widget demo using an overlay. - -load [file dirname [info script]]/overlay[info sharedlibextension] - -proc setup {} { - wm title . "Overlay demo" - - togl .win -width 200 -height 200 -rgba true -double false -overlay true - button .btn -text Quit -command exit - - pack .win -expand true -fill both - pack .btn -expand true -fill both -} - - - -# Execution starts here! -setup diff --git a/ng/Togl-1.7/pkgIndex.tcl.in b/ng/Togl-1.7/pkgIndex.tcl.in deleted file mode 100644 index af071e36..00000000 --- a/ng/Togl-1.7/pkgIndex.tcl.in +++ /dev/null @@ -1,5 +0,0 @@ -# -# Tcl package index file -# -package ifneeded @PACKAGE_NAME@ @PACKAGE_VERSION@ \ - [list load [file join $dir @PKG_LIB_FILE@]] diff --git a/ng/Togl-1.7/stereo.c b/ng/Togl-1.7/stereo.c deleted file mode 100644 index 0a33f1ee..00000000 --- a/ng/Togl-1.7/stereo.c +++ /dev/null @@ -1,352 +0,0 @@ -/* $Id: stereo.c,v 1.6 2005/04/23 07:49:13 gregcouch Exp $ */ - -/* - * Togl - a Tk OpenGL widget - * Copyright (C) 1996-1997 Brian Paul and Ben Bederson - * See the LICENSE file for copyright details. - */ - -#include "togl.h" -#include -#include - -/* - * The following variable is a special hack that is needed in order for - * Sun shared libraries to be used for Tcl. - */ -#ifdef SUN -extern int matherr(); -int *tclDummyMathPtr = (int *) matherr; -#endif - - -static GLuint FontBase; -static float xAngle = 0.0, yAngle = 0.0, zAngle = 0.0; -static GLfloat CornerX, CornerY, CornerZ; /* where to print strings */ -static GLfloat scale = 1.0; - - - -/* - * Togl widget create callback. This is called by Tcl/Tk when the widget has - * been realized. Here's where one may do some one-time context setup or - * initializations. - */ -void -create_cb(Togl *togl) -{ - FontBase = Togl_LoadBitmapFont(togl, TOGL_BITMAP_8_BY_13); - if (!FontBase) { - printf("Couldn't load font!\n"); - exit(1); - } -} - - -/* - * Togl widget reshape callback. This is called by Tcl/Tk when the widget - * has been resized. Typically, we call glViewport and perhaps setup the - * projection matrix. - */ -void -reshape_cb(Togl *togl) -{ - int width = Togl_Width(togl); - int height = Togl_Height(togl); - float aspect = (float) width / (float) height; - - glViewport(0, 0, width, height); - - /* Set up projection transform */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-aspect, aspect, -1.0, 1.0, 1.0, 10.0); - - CornerX = -aspect; - CornerY = -1.0; - CornerZ = -1.1; - - /* Change back to model view transform for rendering */ - glMatrixMode(GL_MODELVIEW); -} - - - -static void -print_string(const char *s) -{ - glCallLists(strlen(s), GL_UNSIGNED_BYTE, s); -} - - -/* - * Togl widget display callback. This is called by Tcl/Tk when the widget's - * contents have to be redrawn. Typically, we clear the color and depth - * buffers, render our objects, then swap the front/back color buffers. - */ -void -display_cb(Togl *togl) -{ - const char *ident; - GLfloat eyeDist = 2.0; - GLfloat eyeOffset = 0.05; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - glLoadIdentity(); /* Reset modelview matrix to the identity - * matrix */ - glTranslatef(0.0, 0.0, -3.0); /* Move the camera back three units */ - glScalef(scale, scale, scale); /* Zoom in and out */ - glRotatef(xAngle, 1.0, 0.0, 0.0); /* Rotate by X, Y, and Z angles */ - glRotatef(yAngle, 0.0, 1.0, 0.0); - glRotatef(zAngle, 0.0, 0.0, 1.0); - - glEnable(GL_DEPTH_TEST); - - /* stereo right eye */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - Togl_StereoFrustum(-1, 1, -1, 1, 1, 10, eyeDist, eyeOffset); - glMatrixMode(GL_MODELVIEW); -#ifdef OLD_STEREO - Togl_OldStereoDrawBuffer(GL_BACK_RIGHT); - Togl_OldStereoClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -#else - glDrawBuffer(GL_BACK_RIGHT); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -#endif - - /* Front face */ - glBegin(GL_QUADS); - glColor3f(0.0, 0.7, 0.1); /* Green */ - glVertex3f(-1.0, 1.0, 1.0); - glVertex3f(1.0, 1.0, 1.0); - glVertex3f(1.0, -1.0, 1.0); - glVertex3f(-1.0, -1.0, 1.0); - /* Back face */ - glColor3f(0.9, 1.0, 0.0); /* Yellow */ - glVertex3f(-1.0, 1.0, -1.0); - glVertex3f(1.0, 1.0, -1.0); - glVertex3f(1.0, -1.0, -1.0); - glVertex3f(-1.0, -1.0, -1.0); - /* Top side face */ - glColor3f(0.2, 0.2, 1.0); /* Blue */ - glVertex3f(-1.0, 1.0, 1.0); - glVertex3f(1.0, 1.0, 1.0); - glVertex3f(1.0, 1.0, -1.0); - glVertex3f(-1.0, 1.0, -1.0); - /* Bottom side face */ - glColor3f(0.7, 0.0, 0.1); /* Red */ - glVertex3f(-1.0, -1.0, 1.0); - glVertex3f(1.0, -1.0, 1.0); - glVertex3f(1.0, -1.0, -1.0); - glVertex3f(-1.0, -1.0, -1.0); - glEnd(); - - /* stereo left eye */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - Togl_StereoFrustum(-1, 1, -1, 1, 1, 10, eyeDist, -eyeOffset); - glMatrixMode(GL_MODELVIEW); - -#ifdef OLD_STEREO - Togl_OldStereoDrawBuffer(GL_BACK_LEFT); - Togl_OldStereoClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -#else - glDrawBuffer(GL_BACK_LEFT); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -#endif - - /* Front face */ - glBegin(GL_QUADS); - glColor3f(0.0, 0.7, 0.1); /* Green */ - glVertex3f(-1.0, 1.0, 1.0); - glVertex3f(1.0, 1.0, 1.0); - glVertex3f(1.0, -1.0, 1.0); - glVertex3f(-1.0, -1.0, 1.0); - /* Back face */ - glColor3f(0.9, 1.0, 0.0); /* Yellow */ - glVertex3f(-1.0, 1.0, -1.0); - glVertex3f(1.0, 1.0, -1.0); - glVertex3f(1.0, -1.0, -1.0); - glVertex3f(-1.0, -1.0, -1.0); - /* Top side face */ - glColor3f(0.2, 0.2, 1.0); /* Blue */ - glVertex3f(-1.0, 1.0, 1.0); - glVertex3f(1.0, 1.0, 1.0); - glVertex3f(1.0, 1.0, -1.0); - glVertex3f(-1.0, 1.0, -1.0); - /* Bottom side face */ - glColor3f(0.7, 0.0, 0.1); /* Red */ - glVertex3f(-1.0, -1.0, 1.0); - glVertex3f(1.0, -1.0, 1.0); - glVertex3f(1.0, -1.0, -1.0); - glVertex3f(-1.0, -1.0, -1.0); - glEnd(); - - - glDisable(GL_DEPTH_TEST); - glLoadIdentity(); - glColor3f(1.0, 1.0, 1.0); - glRasterPos3f(CornerX, CornerY, CornerZ); - glListBase(FontBase); - /* ident = Togl_Ident( togl ); if (strcmp(ident,"Single")==0) { - * print_string( "Single buffered" ); } else { print_string( "Double - * buffered" ); } */ - print_string(Togl_Ident(togl)); - Togl_SwapBuffers(togl); -} - - -int -setXrot_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName setXrot ?angle?\"", - TCL_STATIC); - return TCL_ERROR; - } - - xAngle = atof(argv[2]); - - /* printf( "before %f ", xAngle ); */ - - if (xAngle < 0.0) { - xAngle += 360.0; - } else if (xAngle > 360.0) { - xAngle -= 360.0; - } - - /* printf( "after %f \n", xAngle ); */ - - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -int -setYrot_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName setYrot ?angle?\"", - TCL_STATIC); - return TCL_ERROR; - } - - yAngle = atof(argv[2]); - - if (yAngle < 0.0) { - yAngle += 360.0; - } else if (yAngle > 360.0) { - yAngle -= 360.0; - } - - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -int -getXrot_cb(ClientData clientData, Tcl_Interp *interp, - int argc, CONST84 char *argv[]) -{ - sprintf(interp->result, "%d", (int) xAngle); - return TCL_OK; -} - - -int -getYrot_cb(ClientData clientData, Tcl_Interp *interp, - int argc, CONST84 char *argv[]) -{ - sprintf(interp->result, "%d", (int) yAngle); - return TCL_OK; -} - - -int -scale_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName scale ?value?\"", - TCL_STATIC); - return TCL_ERROR; - } - - scale = atof(argv[2]); - - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -TOGL_EXTERN int -Stereo_Init(Tcl_Interp *interp) -{ - /* - * Initialize Tcl, Tk, and the Togl widget module. - */ -#ifdef USE_TCL_STUBS - if (Tcl_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif -#ifdef USE_TK_STUBS - if (Tk_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif - - if (Togl_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - - /* - * Specify the C callback functions for widget creation, display, - * and reshape. - */ - Togl_CreateFunc(create_cb); - Togl_DisplayFunc(display_cb); - Togl_ReshapeFunc(reshape_cb); - - /* - * Make a new Togl widget command so the Tcl code can set a C variable. - */ - - Togl_CreateCommand("setXrot", setXrot_cb); - Togl_CreateCommand("setYrot", setYrot_cb); - Togl_CreateCommand("scale", scale_cb); - - /* - * Call Tcl_CreateCommand for application-specific commands, if - * they weren't already created by the init procedures called above. - */ - - Tcl_CreateCommand(interp, "getXrot", getXrot_cb, (ClientData) NULL, - (Tcl_CmdDeleteProc *) NULL); - Tcl_CreateCommand(interp, "getYrot", getYrot_cb, (ClientData) NULL, - (Tcl_CmdDeleteProc *) NULL); - - return TCL_OK; -} diff --git a/ng/Togl-1.7/stereo.tcl b/ng/Togl-1.7/stereo.tcl deleted file mode 100644 index ea5fc89f..00000000 --- a/ng/Togl-1.7/stereo.tcl +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/sh -# the next line restarts using wish \ -exec wish "$0" "$@" - -# $Id: stereo.tcl,v 1.4 2004/12/21 05:28:39 gregcouch Exp $ - -# Togl - a Tk OpenGL widget -# Copyright (C) 1996 Brian Paul and Ben Bederson -# See the LICENSE file for copyright details. - - -# $Log: stereo.tcl,v $ -# Revision 1.4 2004/12/21 05:28:39 gregcouch -# Apply outstanding patches and Mac OS X support. -# -# Revision 1.3 2001/12/20 13:59:31 beskow -# Improved error-handling in togl.c in case of window creation failure -# Added pkgIndex target to makefile -# Updated documentation to reflect stubs-interface (Togl.html + new README.stubs) -# Added tk8.4a3 headers -# Removed obsolete Tk internal headers -# -# Revision 1.2 2001/01/29 18:11:53 brianp -# Jonas Beskow's changes to use Tcl/Tk stub interface -# -# Revision 1.1 1997/10/01 02:53:12 brianp -# Initial revision -# -# -# Revision 1.1 1997/9/28 18:54:46 Ben Evans -# Initial revision. Based on double.tcl -# - - -# An Tk/OpenGL widget demo with two windows, one single buffered and the -# other double buffered. - -load [file dirname [info script]]/stereo[info sharedlibextension] - -proc setup {} { - global scale - set scale 1.0 - wm title . "Full Screen Stereo Buffering" - - frame .f1 - togl .f1.o1 -width 200 -height 200 -rgba true -stereo true -double true -depth true -ident "stereo buffer" - - scale .sx -label {X Axis} -from 0 -to 360 -command {setAngle x} -orient horizontal - scale .sy -label {Y Axis} -from 0 -to 360 -command {setAngle y} -orient horizontal - button .btn -text Quit -command exit - - bind .f1.o1 { - motion_event [lindex [%W config -width] 4] \ - [lindex [%W config -height] 4] \ - %x %y - } - - bind .f1.o1 { - set startx %x - set starty %y - set scale0 $scale - } - - bind .f1.o1 { - set q [ expr ($starty - %y) / 400.0 ] - set scale [expr $scale0 * exp($q)] - .f1.o1 scale $scale - } - - pack .f1.o1 -side left -padx 3 -pady 3 -fill both -expand t - pack .f1 -fill both -expand t - pack .sx -fill x - pack .sy -fill x - pack .btn -fill x - - if {[string first $::tcl_platform(os) IRIX] != -1} { - puts "use /usr/gfx/setmon -n 60 to reset display and /usr/gfx/setmon -n STR_RECT to put in display in stereo mode" - } - -} - - - -# This is called when mouse button 1 is pressed and moved in either of -# the OpenGL windows. -proc motion_event { width height x y } { - .f1.o1 setXrot [expr 360.0 * $y / $height] - .f1.o1 setYrot [expr 360.0 * ($width - $x) / $width] - -# .sx set [expr 360.0 * $y / $height] -# .sy set [expr 360.0 * ($width - $x) / $width] - - .sx set [getXrot] - .sy set [getYrot] -} - -# This is called when a slider is changed. -proc setAngle {axis value} { - global xAngle yAngle zAngle - - switch -exact $axis { - x {.f1.o1 setXrot $value} - y {.f1.o1 setYrot $value} - } -} - -# Execution starts here! -setup diff --git a/ng/Togl-1.7/tclconfig/README.txt b/ng/Togl-1.7/tclconfig/README.txt deleted file mode 100644 index 59b5a3e8..00000000 --- a/ng/Togl-1.7/tclconfig/README.txt +++ /dev/null @@ -1,26 +0,0 @@ -These files comprise the basic building blocks for a Tcl Extension -Architecture (TEA) extension. For more information on TEA see: - - http://www.tcl.tk/doc/tea/ - -This package is part of the Tcl project at SourceForge, and latest -sources should be available there: - - http://tcl.sourceforge.net/ - -This package is a freely available open source package. You can do -virtually anything you like with it, such as modifying it, redistributing -it, and selling it either in whole or in part. - -CONTENTS -======== -The following is a short description of the files you will find in -the sample extension. - -README.txt This file - -install-sh Program used for copying binaries and script files - to their install locations. - -tcl.m4 Collection of Tcl autoconf macros. Included by a package's - aclocal.m4 to define TEA_* macros. diff --git a/ng/Togl-1.7/tclconfig/install-sh b/ng/Togl-1.7/tclconfig/install-sh deleted file mode 100644 index 0ff4b6a0..00000000 --- a/ng/Togl-1.7/tclconfig/install-sh +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/sh - -# -# install - install a program, script, or datafile -# This comes from X11R5; it is not part of GNU. -# -# $XConsortium: install.sh,v 1.2 89/12/18 14:47:22 jim Exp $ -# -# This script is compatible with the BSD install script, but was written -# from scratch. -# - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" - -instcmd="$mvprog" -chmodcmd="" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -fi - -if [ x"$dst" = x ] -then - echo "install: no destination specified" - exit 1 -fi - - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - -if [ -d $dst ] -then - dst="$dst"/`basename $src` -fi - -# Make a temp file name in the proper directory. - -dstdir=`dirname $dst` -dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - -$doit $instcmd $src $dsttmp - -# and set any options; do chmod last to preserve setuid bits - -if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; fi -if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; fi -if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; fi -if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; fi - -# Now rename the file to the real destination. - -$doit $rmcmd $dst -$doit $mvcmd $dsttmp $dst - - -exit 0 diff --git a/ng/Togl-1.7/tclconfig/tcl.m4 b/ng/Togl-1.7/tclconfig/tcl.m4 deleted file mode 100644 index 2862ae18..00000000 --- a/ng/Togl-1.7/tclconfig/tcl.m4 +++ /dev/null @@ -1,3959 +0,0 @@ -# tcl.m4 -- -# -# This file provides a set of autoconf macros to help TEA-enable -# a Tcl extension. -# -# Copyright (c) 1999-2000 Ajuba Solutions. -# Copyright (c) 2002-2005 ActiveState Corporation. -# -# See the file "license.terms" for information on usage and redistribution -# of this file, and for a DISCLAIMER OF ALL WARRANTIES. -# -# RCS: @(#) $Id: tcl.m4,v 1.4 2006/01/06 00:09:00 gregcouch Exp $ - -AC_PREREQ(2.50) - -# Possible values for key variables defined: -# -# TEA_WINDOWINGSYSTEM - win32 aqua x11 (mirrors 'tk windowingsystem') -# TEA_PLATFORM - windows unix -# - -#------------------------------------------------------------------------ -# TEA_PATH_TCLCONFIG -- -# -# Locate the tclConfig.sh file and perform a sanity check on -# the Tcl compile flags -# -# Arguments: -# none -# -# Results: -# -# Adds the following arguments to configure: -# --with-tcl=... -# -# Defines the following vars: -# TCL_BIN_DIR Full path to the directory containing -# the tclConfig.sh file -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_PATH_TCLCONFIG, [ - dnl Make sure we are initialized - AC_REQUIRE([TEA_INIT]) - # - # Ok, lets find the tcl configuration - # First, look for one uninstalled. - # the alternative search directory is invoked by --with-tcl - # - - if test x"${no_tcl}" = x ; then - # we reset no_tcl in case something fails here - no_tcl=true - AC_ARG_WITH(tcl, [ --with-tcl directory containing tcl configuration (tclConfig.sh)], with_tclconfig=${withval}) - AC_MSG_CHECKING([for Tcl configuration]) - AC_CACHE_VAL(ac_cv_c_tclconfig,[ - - # First check to see if --with-tcl was specified. - if test x"${with_tclconfig}" != x ; then - case ${with_tclconfig} in - */tclConfig.sh ) - if test -f ${with_tclconfig}; then - AC_MSG_WARN([--with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself]) - with_tclconfig=`echo ${with_tclconfig} | sed 's!/tclConfig\.sh$!!'` - fi ;; - esac - if test -f "${with_tclconfig}/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)` - else - AC_MSG_ERROR([${with_tclconfig} directory doesn't contain tclConfig.sh]) - fi - fi - - # then check for a private Tcl installation - if test x"${ac_cv_c_tclconfig}" = x ; then - for i in \ - ../tcl \ - `ls -dr ../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ../tcl[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ - ../../tcl \ - `ls -dr ../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \ - ../../../tcl \ - `ls -dr ../../../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ../../../tcl[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do - if test -f "$i/unix/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd $i/unix; pwd)` - break - fi - done - fi - - # on Darwin, check in Framework installation locations - if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then - for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ - `ls -d /Library/Frameworks 2>/dev/null` \ - `ls -d /Network/Library/Frameworks 2>/dev/null` \ - `ls -d /System/Library/Frameworks 2>/dev/null` \ - ; do - if test -f "$i/Tcl.framework/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd $i/Tcl.framework; pwd)` - break - fi - done - fi - - # check in a few common install locations - if test x"${ac_cv_c_tclconfig}" = x ; then - for i in `ls -d ${libdir} 2>/dev/null` \ - `ls -d ${exec_prefix}/lib 2>/dev/null` \ - `ls -d ${prefix}/lib 2>/dev/null` \ - `ls -d /usr/local/lib 2>/dev/null` \ - `ls -d /usr/contrib/lib 2>/dev/null` \ - `ls -d /usr/lib 2>/dev/null` \ - ; do - if test -f "$i/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd $i; pwd)` - break - fi - done - fi - - # check in a few other private locations - if test x"${ac_cv_c_tclconfig}" = x ; then - for i in \ - ${srcdir}/../tcl \ - `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do - if test -f "$i/unix/tclConfig.sh" ; then - ac_cv_c_tclconfig=`(cd $i/unix; pwd)` - break - fi - done - fi - ]) - - if test x"${ac_cv_c_tclconfig}" = x ; then - TCL_BIN_DIR="# no Tcl configs found" - AC_MSG_WARN("Cannot find Tcl configuration definitions") - exit 0 - else - no_tcl= - TCL_BIN_DIR=${ac_cv_c_tclconfig} - AC_MSG_RESULT([found $TCL_BIN_DIR/tclConfig.sh]) - fi - fi -]) - -#------------------------------------------------------------------------ -# TEA_PATH_TKCONFIG -- -# -# Locate the tkConfig.sh file -# -# Arguments: -# none -# -# Results: -# -# Adds the following arguments to configure: -# --with-tk=... -# -# Defines the following vars: -# TK_BIN_DIR Full path to the directory containing -# the tkConfig.sh file -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_PATH_TKCONFIG, [ - # - # Ok, lets find the tk configuration - # First, look for one uninstalled. - # the alternative search directory is invoked by --with-tk - # - - if test x"${no_tk}" = x ; then - # we reset no_tk in case something fails here - no_tk=true - AC_ARG_WITH(tk, [ --with-tk directory containing tk configuration (tkConfig.sh)], with_tkconfig=${withval}) - AC_MSG_CHECKING([for Tk configuration]) - AC_CACHE_VAL(ac_cv_c_tkconfig,[ - - # First check to see if --with-tkconfig was specified. - if test x"${with_tkconfig}" != x ; then - case ${with_tkconfig} in - */tkConfig.sh ) - if test -f ${with_tkconfig}; then - AC_MSG_WARN([--with-tk argument should refer to directory containing tkConfig.sh, not to tkConfig.sh itself]) - with_tkconfig=`echo ${with_tkconfig} | sed 's!/tkConfig\.sh$!!'` - fi ;; - esac - if test -f "${with_tkconfig}/tkConfig.sh" ; then - ac_cv_c_tkconfig=`(cd ${with_tkconfig}; pwd)` - else - AC_MSG_ERROR([${with_tkconfig} directory doesn't contain tkConfig.sh]) - fi - fi - - # then check for a private Tk library - if test x"${ac_cv_c_tkconfig}" = x ; then - for i in \ - ../tk \ - `ls -dr ../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ../tk[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \ - ../../tk \ - `ls -dr ../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ../../tk[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \ - ../../../tk \ - `ls -dr ../../../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ../../../tk[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do - if test -f "$i/unix/tkConfig.sh" ; then - ac_cv_c_tkconfig=`(cd $i/unix; pwd)` - break - fi - done - fi - - # on Darwin, check in Framework installation locations - if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tkconfig}" = x ; then - for i in `ls -d ~/Library/Frameworks 2>/dev/null` \ - `ls -d /Library/Frameworks 2>/dev/null` \ - `ls -d /Network/Library/Frameworks 2>/dev/null` \ - `ls -d /System/Library/Frameworks 2>/dev/null` \ - ; do - if test -f "$i/Tk.framework/tkConfig.sh" ; then - ac_cv_c_tkconfig=`(cd $i/Tk.framework; pwd)` - break - fi - done - fi - - # check in a few common install locations - if test x"${ac_cv_c_tkconfig}" = x ; then - for i in `ls -d ${libdir} 2>/dev/null` \ - `ls -d ${exec_prefix}/lib 2>/dev/null` \ - `ls -d ${prefix}/lib 2>/dev/null` \ - `ls -d /usr/local/lib 2>/dev/null` \ - `ls -d /usr/contrib/lib 2>/dev/null` \ - `ls -d /usr/lib 2>/dev/null` \ - ; do - if test -f "$i/tkConfig.sh" ; then - ac_cv_c_tkconfig=`(cd $i; pwd)` - break - fi - done - fi - # check in a few other private locations - if test x"${ac_cv_c_tkconfig}" = x ; then - for i in \ - ${srcdir}/../tk \ - `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]].[[0-9]]* 2>/dev/null` \ - `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do - if test -f "$i/unix/tkConfig.sh" ; then - ac_cv_c_tkconfig=`(cd $i/unix; pwd)` - break - fi - done - fi - ]) - - if test x"${ac_cv_c_tkconfig}" = x ; then - TK_BIN_DIR="# no Tk configs found" - AC_MSG_WARN("Cannot find Tk configuration definitions") - exit 0 - else - no_tk= - TK_BIN_DIR=${ac_cv_c_tkconfig} - AC_MSG_RESULT([found $TK_BIN_DIR/tkConfig.sh]) - fi - fi -]) - -#------------------------------------------------------------------------ -# TEA_LOAD_TCLCONFIG -- -# -# Load the tclConfig.sh file -# -# Arguments: -# -# Requires the following vars to be set: -# TCL_BIN_DIR -# -# Results: -# -# Subst the following vars: -# TCL_BIN_DIR -# TCL_SRC_DIR -# TCL_LIB_FILE -# -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_LOAD_TCLCONFIG, [ - AC_MSG_CHECKING([for existence of $TCL_BIN_DIR/tclConfig.sh]) - - if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then - AC_MSG_RESULT([loading]) - . $TCL_BIN_DIR/tclConfig.sh - else - AC_MSG_RESULT([file not found]) - fi - - # - # If the TCL_BIN_DIR is the build directory (not the install directory), - # then set the common variable name to the value of the build variables. - # For example, the variable TCL_LIB_SPEC will be set to the value - # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC - # instead of TCL_BUILD_LIB_SPEC since it will work with both an - # installed and uninstalled version of Tcl. - # - - if test -f $TCL_BIN_DIR/Makefile ; then - TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC} - TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC} - TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH} - fi - - # - # eval is required to do the TCL_DBGX substitution - # - - eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\"" - eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\"" - eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\"" - - eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\"" - eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\"" - eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\"" - - AC_SUBST(TCL_VERSION) - AC_SUBST(TCL_BIN_DIR) - AC_SUBST(TCL_SRC_DIR) - - AC_SUBST(TCL_LIB_FILE) - AC_SUBST(TCL_LIB_FLAG) - AC_SUBST(TCL_LIB_SPEC) - - AC_SUBST(TCL_STUB_LIB_FILE) - AC_SUBST(TCL_STUB_LIB_FLAG) - AC_SUBST(TCL_STUB_LIB_SPEC) - - AC_SUBST(TCL_LIBS) - AC_SUBST(TCL_DEFS) - AC_SUBST(TCL_EXTRA_CFLAGS) - AC_SUBST(TCL_LD_FLAGS) - AC_SUBST(TCL_SHLIB_LD_LIBS) - #AC_SUBST(TCL_BUILD_LIB_SPEC) - #AC_SUBST(TCL_BUILD_STUB_LIB_SPEC) -]) - -#------------------------------------------------------------------------ -# TEA_LOAD_TKCONFIG -- -# -# Load the tkConfig.sh file -# -# Arguments: -# -# Requires the following vars to be set: -# TK_BIN_DIR -# -# Results: -# -# Sets the following vars that should be in tkConfig.sh: -# TK_BIN_DIR -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_LOAD_TKCONFIG, [ - AC_MSG_CHECKING([for existence of ${TK_BIN_DIR}/tkConfig.sh]) - - if test -f "${TK_BIN_DIR}/tkConfig.sh" ; then - AC_MSG_RESULT([loading]) - . $TK_BIN_DIR/tkConfig.sh - else - AC_MSG_RESULT([could not find ${TK_BIN_DIR}/tkConfig.sh]) - fi - - # - # If the TK_BIN_DIR is the build directory (not the install directory), - # then set the common variable name to the value of the build variables. - # For example, the variable TK_LIB_SPEC will be set to the value - # of TK_BUILD_LIB_SPEC. An extension should make use of TK_LIB_SPEC - # instead of TK_BUILD_LIB_SPEC since it will work with both an - # installed and uninstalled version of Tcl. - # - - if test -f $TK_BIN_DIR/Makefile ; then - TK_LIB_SPEC=${TK_BUILD_LIB_SPEC} - TK_STUB_LIB_SPEC=${TK_BUILD_STUB_LIB_SPEC} - TK_STUB_LIB_PATH=${TK_BUILD_STUB_LIB_PATH} - fi - - # Ensure windowingsystem is defined - if test "${TEA_PLATFORM}" = "unix" ; then - case ${TK_DEFS} in - *MAC_OSX_TK*) - AC_DEFINE(MAC_OSX_TK, 1, [Are we building against Mac OS X TkAqua?]) - TEA_WINDOWINGSYSTEM="aqua" - ;; - *) - TEA_WINDOWINGSYSTEM="x11" - ;; - esac - elif test "${TEA_PLATFORM}" = "windows" ; then - TEA_WINDOWINGSYSTEM="win32" - fi - - # - # eval is required to do the TK_DBGX substitution - # - - eval "TK_LIB_FILE=\"${TK_LIB_FILE}\"" - eval "TK_LIB_FLAG=\"${TK_LIB_FLAG}\"" - eval "TK_LIB_SPEC=\"${TK_LIB_SPEC}\"" - - eval "TK_STUB_LIB_FILE=\"${TK_STUB_LIB_FILE}\"" - eval "TK_STUB_LIB_FLAG=\"${TK_STUB_LIB_FLAG}\"" - eval "TK_STUB_LIB_SPEC=\"${TK_STUB_LIB_SPEC}\"" - - AC_SUBST(TK_VERSION) - AC_SUBST(TK_BIN_DIR) - AC_SUBST(TK_SRC_DIR) - - AC_SUBST(TK_LIB_FILE) - AC_SUBST(TK_LIB_FLAG) - AC_SUBST(TK_LIB_SPEC) - - AC_SUBST(TK_STUB_LIB_FILE) - AC_SUBST(TK_STUB_LIB_FLAG) - AC_SUBST(TK_STUB_LIB_SPEC) - - AC_SUBST(TK_LIBS) - AC_SUBST(TK_XINCLUDES) -]) - -#------------------------------------------------------------------------ -# TEA_ENABLE_SHARED -- -# -# Allows the building of shared libraries -# -# Arguments: -# none -# -# Results: -# -# Adds the following arguments to configure: -# --enable-shared=yes|no -# -# Defines the following vars: -# STATIC_BUILD Used for building import/export libraries -# on Windows. -# -# Sets the following vars: -# SHARED_BUILD Value of 1 or 0 -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_ENABLE_SHARED, [ - AC_MSG_CHECKING([how to build libraries]) - AC_ARG_ENABLE(shared, - [ --enable-shared build and link with shared libraries [--enable-shared]], - [tcl_ok=$enableval], [tcl_ok=yes]) - - if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - tcl_ok=$enableval - else - tcl_ok=yes - fi - - if test "$tcl_ok" = "yes" ; then - AC_MSG_RESULT([shared]) - SHARED_BUILD=1 - else - AC_MSG_RESULT([static]) - SHARED_BUILD=0 - AC_DEFINE(STATIC_BUILD, 1, [Is this a static build?]) - fi - AC_SUBST(SHARED_BUILD) -]) - -#------------------------------------------------------------------------ -# TEA_ENABLE_THREADS -- -# -# Specify if thread support should be enabled. If "yes" is specified -# as an arg (optional), threads are enabled by default, "no" means -# threads are disabled. "yes" is the default. -# -# TCL_THREADS is checked so that if you are compiling an extension -# against a threaded core, your extension must be compiled threaded -# as well. -# -# Note that it is legal to have a thread enabled extension run in a -# threaded or non-threaded Tcl core, but a non-threaded extension may -# only run in a non-threaded Tcl core. -# -# Arguments: -# none -# -# Results: -# -# Adds the following arguments to configure: -# --enable-threads -# -# Sets the following vars: -# THREADS_LIBS Thread library(s) -# -# Defines the following vars: -# TCL_THREADS -# _REENTRANT -# -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_ENABLE_THREADS, [ - AC_ARG_ENABLE(threads, [ --enable-threads build with threads], - [tcl_ok=$enableval], [tcl_ok=yes]) - - if test "${enable_threads+set}" = set; then - enableval="$enable_threads" - tcl_ok=$enableval - else - tcl_ok=yes - fi - - if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then - TCL_THREADS=1 - - if test "${TEA_PLATFORM}" != "windows" ; then - # We are always OK on Windows, so check what this platform wants. - AC_DEFINE(USE_THREAD_ALLOC, 1, - [Do we want to use the threaded memory allocator?]) - AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) - AC_DEFINE(_THREAD_SAFE, 1, [Do we want the thread-safe OS API?]) - AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no) - if test "$tcl_ok" = "no"; then - # Check a little harder for __pthread_mutex_init in the - # same library, as some systems hide it there until - # pthread.h is defined. We could alternatively do an - # AC_TRY_COMPILE with pthread.h, but that will work with - # libpthread really doesn't exist, like AIX 4.2. - # [Bug: 4359] - AC_CHECK_LIB(pthread, __pthread_mutex_init, - tcl_ok=yes, tcl_ok=no) - fi - - if test "$tcl_ok" = "yes"; then - # The space is needed - THREADS_LIBS=" -lpthread" - else - AC_CHECK_LIB(pthreads, pthread_mutex_init, - tcl_ok=yes, tcl_ok=no) - if test "$tcl_ok" = "yes"; then - # The space is needed - THREADS_LIBS=" -lpthreads" - else - AC_CHECK_LIB(c, pthread_mutex_init, - tcl_ok=yes, tcl_ok=no) - if test "$tcl_ok" = "no"; then - AC_CHECK_LIB(c_r, pthread_mutex_init, - tcl_ok=yes, tcl_ok=no) - if test "$tcl_ok" = "yes"; then - # The space is needed - THREADS_LIBS=" -pthread" - else - TCL_THREADS=0 - AC_MSG_WARN("Don t know how to find pthread lib on your system - thread support disabled") - fi - fi - fi - fi - -dnl # Not needed in TEA -dnl # Does the pthread-implementation provide -dnl # 'pthread_attr_setstacksize' ? -dnl -dnl ac_saved_libs=$LIBS -dnl LIBS="$LIBS $THREADS_LIBS" -dnl AC_CHECK_FUNCS(pthread_attr_setstacksize) -dnl LIBS=$ac_saved_libs - fi - else - TCL_THREADS=0 - fi - # Do checking message here to not mess up interleaved configure output - AC_MSG_CHECKING([for building with threads]) - if test "${TCL_THREADS}" = "1"; then - AC_DEFINE(TCL_THREADS, 1, [Are we building with threads enabled?]) - #LIBS="$LIBS $THREADS_LIBS" - AC_MSG_RESULT([yes (default)]) - else - AC_MSG_RESULT([no]) - fi - # TCL_THREADS sanity checking. See if our request for building with - # threads is the same as the way Tcl was built. If not, warn the user. - case ${TCL_DEFS} in - *THREADS=1*) - if test "${TCL_THREADS}" = "0"; then - AC_MSG_WARN([ - Building ${PACKAGE_NAME} without threads enabled, but building against Tcl - that IS thread-enabled. It is recommended to use --enable-threads.]) - fi - ;; - *) - if test "${TCL_THREADS}" = "1"; then - AC_MSG_WARN([ - --enable-threads requested, but building against a Tcl that is NOT - thread-enabled. This is an OK configuration that will also run in - a thread-enabled core.]) - fi - ;; - esac - AC_SUBST(TCL_THREADS) -]) - -#------------------------------------------------------------------------ -# TEA_ENABLE_SYMBOLS -- -# -# Specify if debugging symbols should be used -# Memory (TCL_MEM_DEBUG) debugging can also be enabled. -# -# Arguments: -# none -# -# Requires the following vars to be set: -# CFLAGS_DEBUG -# CFLAGS_OPTIMIZE -# LDFLAGS_DEBUG -# LDFLAGS_OPTIMIZE -# -# Results: -# -# Adds the following arguments to configure: -# --enable-symbols -# -# Defines the following vars: -# CFLAGS_DEFAULT Sets to CFLAGS_DEBUG if true -# Sets to CFLAGS_OPTIMIZE if false -# LDFLAGS_DEFAULT Sets to LDFLAGS_DEBUG if true -# Sets to LDFLAGS_OPTIMIZE if false -# DBGX Formerly used as debug library extension; -# always blank now. -# -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_ENABLE_SYMBOLS, [ - dnl Make sure we are initialized - AC_REQUIRE([TEA_CONFIG_CFLAGS]) - - DBGX="" - - AC_MSG_CHECKING([for build with symbols]) - AC_ARG_ENABLE(symbols, [ --enable-symbols build with debugging symbols [--disable-symbols]], [tcl_ok=$enableval], [tcl_ok=no]) - if test "$tcl_ok" = "no"; then - CFLAGS_DEFAULT="${CFLAGS_OPTIMIZE}" - LDFLAGS_DEFAULT="${LDFLAGS_OPTIMIZE}" - AC_MSG_RESULT([no]) - else - CFLAGS_DEFAULT="${CFLAGS_DEBUG}" - LDFLAGS_DEFAULT="${LDFLAGS_DEBUG}" - if test "$tcl_ok" = "yes"; then - AC_MSG_RESULT([yes (standard debugging)]) - fi - fi - if test "${TEA_PLATFORM}" != "windows" ; then - LDFLAGS_DEFAULT="${LDFLAGS}" - fi - - AC_SUBST(TCL_DBGX) - AC_SUBST(CFLAGS_DEFAULT) - AC_SUBST(LDFLAGS_DEFAULT) - - if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then - AC_DEFINE(TCL_MEM_DEBUG, 1, [Is memory debugging enabled?]) - fi - - if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then - if test "$tcl_ok" = "all"; then - AC_MSG_RESULT([enabled symbols mem debugging]) - else - AC_MSG_RESULT([enabled $tcl_ok debugging]) - fi - fi -]) - -#------------------------------------------------------------------------ -# TEA_ENABLE_LANGINFO -- -# -# Allows use of modern nl_langinfo check for better l10n. -# This is only relevant for Unix. -# -# Arguments: -# none -# -# Results: -# -# Adds the following arguments to configure: -# --enable-langinfo=yes|no (default is yes) -# -# Defines the following vars: -# HAVE_LANGINFO Triggers use of nl_langinfo if defined. -# -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_ENABLE_LANGINFO, [ - AC_ARG_ENABLE(langinfo, - [ --enable-langinfo use nl_langinfo if possible to determine - encoding at startup, otherwise use old heuristic], - [langinfo_ok=$enableval], [langinfo_ok=yes]) - - HAVE_LANGINFO=0 - if test "$langinfo_ok" = "yes"; then - AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no]) - fi - AC_MSG_CHECKING([whether to use nl_langinfo]) - if test "$langinfo_ok" = "yes"; then - AC_CACHE_VAL(tcl_cv_langinfo_h, - AC_TRY_COMPILE([#include ], [nl_langinfo(CODESET);], - [tcl_cv_langinfo_h=yes],[tcl_cv_langinfo_h=no])) - AC_MSG_RESULT($tcl_cv_langinfo_h) - if test $tcl_cv_langinfo_h = yes; then - AC_DEFINE(HAVE_LANGINFO, 1, [Do we have nl_langinfo()?]) - fi - else - AC_MSG_RESULT([$langinfo_ok]) - fi -]) - -#-------------------------------------------------------------------- -# TEA_CONFIG_CFLAGS -# -# Try to determine the proper flags to pass to the compiler -# for building shared libraries and other such nonsense. -# -# Arguments: -# none -# -# Results: -# -# Defines the following vars: -# -# DL_OBJS - Name of the object file that implements dynamic -# loading for Tcl on this system. -# DL_LIBS - Library file(s) to include in tclsh and other base -# applications in order for the "load" command to work. -# LDFLAGS - Flags to pass to the compiler when linking object -# files into an executable application binary such -# as tclsh. -# LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib", -# that tell the run-time dynamic linker where to look -# for shared libraries such as libtcl.so. Depends on -# the variable LIB_RUNTIME_DIR in the Makefile. -# SHLIB_CFLAGS - Flags to pass to cc when compiling the components -# of a shared library (may request position-independent -# code, among other things). -# SHLIB_LD - Base command to use for combining object files -# into a shared library. -# SHLIB_LD_LIBS - Dependent libraries for the linker to scan when -# creating shared libraries. This symbol typically -# goes at the end of the "ld" commands that build -# shared libraries. The value of the symbol is -# "${LIBS}" if all of the dependent libraries should -# be specified when creating a shared library. If -# dependent libraries should not be specified (as on -# SunOS 4.x, where they cause the link to fail, or in -# general if Tcl and Tk aren't themselves shared -# libraries), then this symbol has an empty string -# as its value. -# SHLIB_SUFFIX - Suffix to use for the names of dynamically loadable -# extensions. An empty string means we don't know how -# to use shared libraries on this platform. -# TCL_LIB_FILE - Name of the file that contains the Tcl library, such -# as libtcl7.8.so or libtcl7.8.a. -# TCL_LIB_SUFFIX -Specifies everything that comes after the "libtcl" -# in the shared library name, using the -# ${PACKAGE_VERSION} variable to put the version in -# the right place. This is used by platforms that -# need non-standard library names. -# Examples: ${PACKAGE_VERSION}.so.1.1 on NetBSD, -# since it needs to have a version after the .so, and -# ${PACKAGE_VERSION}.a on AIX, since the Tcl shared -# library needs to have a .a extension whereas shared -# objects for loadable extensions have a .so -# extension. Defaults to -# ${PACKAGE_VERSION}${SHLIB_SUFFIX}. -# TCL_NEEDS_EXP_FILE - -# 1 means that an export file is needed to link to a -# shared library. -# TCL_EXP_FILE - The name of the installed export / import file which -# should be used to link to the Tcl shared library. -# Empty if Tcl is unshared. -# TCL_BUILD_EXP_FILE - -# The name of the built export / import file which -# should be used to link to the Tcl shared library. -# Empty if Tcl is unshared. -# CFLAGS_DEBUG - -# Flags used when running the compiler in debug mode -# CFLAGS_OPTIMIZE - -# Flags used when running the compiler in optimize mode -# CFLAGS - We add CFLAGS to pass to the compiler -# -# Subst's the following vars: -# DL_LIBS -# CFLAGS_DEBUG -# CFLAGS_OPTIMIZE -# CFLAGS_WARNING -# -# STLIB_LD -# SHLIB_LD -# SHLIB_CFLAGS -# LDFLAGS_DEBUG -# LDFLAGS_OPTIMIZE -#-------------------------------------------------------------------- - -AC_DEFUN(TEA_CONFIG_CFLAGS, [ - dnl Make sure we are initialized - AC_REQUIRE([TEA_INIT]) - - # Step 0: Enable 64 bit support? - - AC_MSG_CHECKING([if 64bit support is enabled]) - AC_ARG_ENABLE(64bit,[ --enable-64bit enable 64bit support (where applicable)], [do64bit=$enableval], [do64bit=no]) - AC_MSG_RESULT([$do64bit]) - - # Step 0.b: Enable Solaris 64 bit VIS support? - - AC_MSG_CHECKING([if 64bit Sparc VIS support is requested]) - AC_ARG_ENABLE(64bit-vis,[ --enable-64bit-vis enable 64bit Sparc VIS support], [do64bitVIS=$enableval], [do64bitVIS=no]) - AC_MSG_RESULT([$do64bitVIS]) - - if test "$do64bitVIS" = "yes"; then - # Force 64bit on with VIS - do64bit=yes - fi - - # Step 0.c: Cross-compiling options for Windows/CE builds? - - if test "${TEA_PLATFORM}" = "windows" ; then - AC_MSG_CHECKING([if Windows/CE build is requested]) - AC_ARG_ENABLE(wince,[ --enable-wince enable Win/CE support (where applicable)], [doWince=$enableval], [doWince=no]) - AC_MSG_RESULT($doWince) - fi - - # Step 1: set the variable "system" to hold the name and version number - # for the system. This can usually be done via the "uname" command, but - # there are a few systems, like Next, where this doesn't work. - - AC_MSG_CHECKING([system version (for dynamic loading)]) - if test -f /usr/lib/NextStep/software_version; then - system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` - else - system=`uname -s`-`uname -r` - if test "$?" -ne 0 ; then - AC_MSG_RESULT([unknown (can't find uname command)]) - system=unknown - else - # Special check for weird MP-RAS system (uname returns weird - # results, and the version is kept in special file). - - if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then - system=MP-RAS-`awk '{print $3}' /etc/.relid` - fi - if test "`uname -s`" = "AIX" ; then - system=AIX-`uname -v`.`uname -r` - fi - if test "${TEA_PLATFORM}" = "windows" ; then - system=windows - fi - AC_MSG_RESULT([$system]) - fi - fi - - # Step 2: check for existence of -ldl library. This is needed because - # Linux can use either -ldl or -ldld for dynamic loading. - - AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no) - - # Step 3: set configuration options based on system name and version. - # This is similar to Tcl's unix/tcl.m4 except that we've added a - # "windows" case and CC_SEARCH_FLAGS becomes LD_SEARCH_FLAGS for us - # (and we have no CC_SEARCH_FLAGS). - - do64bit_ok=no - LDFLAGS_ORIG="$LDFLAGS" - TCL_EXPORT_FILE_SUFFIX="" - UNSHARED_LIB_SUFFIX="" - TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`' - ECHO_VERSION='`echo ${PACKAGE_VERSION}`' - TCL_LIB_VERSIONS_OK=ok - CFLAGS_DEBUG=-g - if test "$GCC" = "yes" ; then - CFLAGS_OPTIMIZE=-O2 - CFLAGS_WARNING="-Wall -Wno-implicit-int" - else - CFLAGS_OPTIMIZE=-O - CFLAGS_WARNING="" - fi - TCL_NEEDS_EXP_FILE=0 - TCL_BUILD_EXP_FILE="" - TCL_EXP_FILE="" -dnl FIXME: Replace AC_CHECK_PROG with AC_CHECK_TOOL once cross compiling is fixed. -dnl AC_CHECK_TOOL(AR, ar, :) - AC_CHECK_PROG(AR, ar, ar) - STLIB_LD='${AR} cr' - LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH" - case $system in - windows) - # This is a 2-stage check to make sure we have the 64-bit SDK - # We have to know where the SDK is installed. - # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs - # MACHINE is IX86 for LINK, but this is used by the manifest, - # which requires x86|amd64|ia64. - MACHINE="X86" - if test "$do64bit" != "no" ; then - if test "x${MSSDK}x" = "xx" ; then - MSSDK="C:/Progra~1/Microsoft Platform SDK" - fi - MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'` - PATH64="" - case "$do64bit" in - amd64|x64|yes) - MACHINE="AMD64" ; # default to AMD64 64-bit build - PATH64="${MSSDK}/Bin/Win64/x86/AMD64" - ;; - ia64) - MACHINE="IA64" - PATH64="${MSSDK}/Bin/Win64" - ;; - esac - if test ! -d "${PATH64}" ; then - AC_MSG_WARN([Could not find 64-bit $MACHINE SDK to enable 64bit mode]) - AC_MSG_WARN([Ensure latest Platform SDK is installed]) - do64bit="no" - else - AC_MSG_RESULT([ Using 64-bit $MACHINE mode]) - do64bit_ok="yes" - fi - fi - - if test "$doWince" != "no" ; then - if test "$do64bit" != "no" ; then - AC_MSG_ERROR([Windows/CE and 64-bit builds incompatible]) - fi - if test "$GCC" = "yes" ; then - AC_MSG_ERROR([Windows/CE and GCC builds incompatible]) - fi - TEA_PATH_CELIB - # Set defaults for common evc4/PPC2003 setup - # Currently Tcl requires 300+, possibly 420+ for sockets - CEVERSION=420; # could be 211 300 301 400 420 ... - TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ... - ARCH=ARM; # could be ARM MIPS X86EM ... - PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002" - if test "$doWince" != "yes"; then - # If !yes then the user specified something - # Reset ARCH to allow user to skip specifying it - ARCH= - eval `echo $doWince | awk -F, '{ \ - if (length([$]1)) { printf "CEVERSION=\"%s\"\n", [$]1; \ - if ([$]1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \ - if (length([$]2)) { printf "TARGETCPU=\"%s\"\n", toupper([$]2) }; \ - if (length([$]3)) { printf "ARCH=\"%s\"\n", toupper([$]3) }; \ - if (length([$]4)) { printf "PLATFORM=\"%s\"\n", [$]4 }; \ - }'` - if test "x${ARCH}" = "x" ; then - ARCH=$TARGETCPU; - fi - fi - OSVERSION=WCE$CEVERSION; - if test "x${WCEROOT}" = "x" ; then - WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0" - if test ! -d "${WCEROOT}" ; then - WCEROOT="C:/Program Files/Microsoft eMbedded Tools" - fi - fi - if test "x${SDKROOT}" = "x" ; then - SDKROOT="C:/Program Files/Windows CE Tools" - if test ! -d "${SDKROOT}" ; then - SDKROOT="C:/Windows CE Tools" - fi - fi - WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'` - SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` - if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ - -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then - AC_MSG_ERROR([could not find PocketPC SDK or target compiler to enable WinCE mode [$CEVERSION,$TARGETCPU,$ARCH,$PLATFORM]]) - doWince="no" - else - # We could PATH_NOSPACE these, but that's not important, - # as long as we quote them when used. - CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include" - if test -d "${CEINCLUDE}/${TARGETCPU}" ; then - CEINCLUDE="${CEINCLUDE}/${TARGETCPU}" - fi - CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" - fi - fi - - if test "$GCC" != "yes" ; then - if test "${SHARED_BUILD}" = "0" ; then - runtime=-MT - else - runtime=-MD - fi - - if test "$do64bit" != "no" ; then - # All this magic is necessary for the Win64 SDK RC1 - hobbs - CC="\"${PATH64}/cl.exe\"" - CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\"" - RC="\"${MSSDK}/bin/rc.exe\"" - lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\"" - LINKBIN="\"${PATH64}/link.exe\"" - CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d" - CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" - # Avoid 'unresolved external symbol __security_cookie' - # errors, c.f. http://support.microsoft.com/?id=894573 - TEA_ADD_LIBS([bufferoverflowU.lib]) - elif test "$doWince" != "no" ; then - CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin" - if test "${TARGETCPU}" = "X86"; then - CC="\"${CEBINROOT}/cl.exe\"" - else - CC="\"${CEBINROOT}/cl${ARCH}.exe\"" - fi - CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\"" - RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\"" - arch=`echo ${ARCH} | awk '{print tolower([$]0)}'` - defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS" - if test "${SHARED_BUILD}" = "1" ; then - # Static CE builds require static celib as well - defs="${defs} _DLL" - fi - for i in $defs ; do - AC_DEFINE_UNQUOTED($i, 1, [WinCE def ]$i) - done - AC_DEFINE_UNQUOTED(_WIN32_WCE, $CEVERSION, [_WIN32_WCE version]) - AC_DEFINE_UNQUOTED(UNDER_CE, $CEVERSION, [UNDER_CE version]) - CFLAGS_DEBUG="-nologo -Zi -Od" - CFLAGS_OPTIMIZE="-nologo -Ox" - lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'` - lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo" - LINKBIN="\"${CEBINROOT}/link.exe\"" - AC_SUBST(CELIB_DIR) - else - RC="rc" - lflags="-nologo" - LINKBIN="link" - CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d" - CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}" - fi - fi - - if test "$GCC" = "yes"; then - # mingw gcc mode - RC="windres" - CFLAGS_DEBUG="-g" - CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" - SHLIB_LD="$CC -shared" - UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' - LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}" - LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}" - else - SHLIB_LD="${LINKBIN} -dll ${lflags}" - # link -lib only works when -lib is the first arg - STLIB_LD="${LINKBIN} -lib ${lflags}" - UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib' - PATHTYPE=-w - # For information on what debugtype is most useful, see: - # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp - # This essentially turns it all on. - LDFLAGS_DEBUG="-debug:full -debugtype:both -warn:2" - LDFLAGS_OPTIMIZE="-release" - if test "$doWince" != "no" ; then - LDFLAGS_CONSOLE="-link ${lflags}" - LDFLAGS_WINDOW=${LDFLAGS_CONSOLE} - else - LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}" - LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}" - fi - fi - - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".dll" - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll' - - TCL_LIB_VERSIONS_OK=nodots - # Bogus to avoid getting this turned off - DL_OBJS="tclLoadNone.obj" - ;; - AIX-*) - if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then - # AIX requires the _r compiler when gcc isn't being used - case "${CC}" in - *_r) - # ok ... - ;; - *) - CC=${CC}_r - ;; - esac - AC_MSG_RESULT([Using $CC for compiling with threads]) - fi - LIBS="$LIBS -lc" - SHLIB_CFLAGS="" - SHLIB_SUFFIX=".so" - SHLIB_LD_LIBS='${LIBS}' - - DL_OBJS="tclLoadDl.o" - LD_LIBRARY_PATH_VAR="LIBPATH" - - # AIX v<=4.1 has some different flags than 4.2+ - if test "$system" = "AIX-4.1" -o "`uname -v`" -lt "4" ; then - #LIBOBJS="$LIBOBJS tclLoadAix.o" - AC_LIBOBJ([tclLoadAix]) - DL_LIBS="-lld" - fi - - # Check to enable 64-bit flags for compiler/linker on AIX 4+ - if test "$do64bit" = "yes" -a "`uname -v`" -gt "3" ; then - if test "$GCC" = "yes" ; then - AC_MSG_WARN("64bit mode not supported with GCC on $system") - else - do64bit_ok=yes - CFLAGS="$CFLAGS -q64" - LDFLAGS="$LDFLAGS -q64" - RANLIB="${RANLIB} -X64" - AR="${AR} -X64" - SHLIB_LD_FLAGS="-b64" - fi - fi - - if test "`uname -m`" = "ia64" ; then - # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC - SHLIB_LD="/usr/ccs/bin/ld -G -z text" - # AIX-5 has dl* in libc.so - DL_LIBS="" - if test "$GCC" = "yes" ; then - LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' - else - LD_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}' - fi - else - if test "$GCC" = "yes" ; then - SHLIB_LD="gcc -shared" - else - SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry" - fi - SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix ${SHLIB_LD} ${SHLIB_LD_FLAGS}" - DL_LIBS="-ldl" - LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' - TCL_NEEDS_EXP_FILE=1 - TCL_EXPORT_FILE_SUFFIX='${PACKAGE_VERSION}.exp' - fi - - # On AIX <=v4 systems, libbsd.a has to be linked in to support - # non-blocking file IO. This library has to be linked in after - # the MATH_LIBS or it breaks the pow() function. The way to - # insure proper sequencing, is to add it to the tail of MATH_LIBS. - # This library also supplies gettimeofday. - # - # AIX does not have a timezone field in struct tm. When the AIX - # bsd library is used, the timezone global and the gettimeofday - # methods are to be avoided for timezone deduction instead, we - # deduce the timezone by comparing the localtime result on a - # known GMT value. - - AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes, libbsd=no) - if test $libbsd = yes; then - MATH_LIBS="$MATH_LIBS -lbsd" - AC_DEFINE(USE_DELTA_FOR_TZ, 1, [Do we need a special AIX hack for timezones?]) - fi - ;; - BeOS*) - SHLIB_CFLAGS="-fPIC" - SHLIB_LD="${CC} -nostart" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - ;; - BSD/OS-2.1*|BSD/OS-3*) - SHLIB_CFLAGS="" - SHLIB_LD="shlicc -r" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - LD_SEARCH_FLAGS="" - ;; - BSD/OS-4.*) - SHLIB_CFLAGS="-export-dynamic -fPIC" - SHLIB_LD="cc -shared" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - LDFLAGS="$LDFLAGS -export-dynamic" - LD_SEARCH_FLAGS="" - ;; - dgux*) - SHLIB_CFLAGS="-K PIC" - SHLIB_LD="cc -G" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - LD_SEARCH_FLAGS="" - ;; - HP-UX-*.11.*) - # Use updated header definitions where possible - AC_DEFINE(_XOPEN_SOURCE_EXTENDED, 1, [Do we want to use the XOPEN network library?]) - - SHLIB_SUFFIX=".sl" - AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) - if test "$tcl_ok" = yes; then - SHLIB_CFLAGS="+z" - SHLIB_LD="ld -b" - SHLIB_LD_LIBS='${LIBS}' - DL_OBJS="tclLoadShl.o" - DL_LIBS="-ldld" - LDFLAGS="$LDFLAGS -Wl,-E" - LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.' - LD_LIBRARY_PATH_VAR="SHLIB_PATH" - fi - if test "$GCC" = "yes" ; then - SHLIB_LD="gcc -shared" - SHLIB_LD_LIBS='${LIBS}' - LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' - fi - - # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc - #CFLAGS="$CFLAGS +DAportable" - - # Check to enable 64-bit flags for compiler/linker - if test "$do64bit" = "yes" ; then - if test "$GCC" = "yes" ; then - hpux_arch=`${CC} -dumpmachine` - case $hpux_arch in - hppa64*) - # 64-bit gcc in use. Fix flags for GNU ld. - do64bit_ok=yes - SHLIB_LD="${CC} -shared" - SHLIB_LD_LIBS='${LIBS}' - ;; - *) - AC_MSG_WARN("64bit mode not supported with GCC on $system") - ;; - esac - else - do64bit_ok=yes - CFLAGS="$CFLAGS +DD64" - LDFLAGS="$LDFLAGS +DD64" - fi - fi - ;; - HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*) - SHLIB_SUFFIX=".sl" - AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no) - if test "$tcl_ok" = yes; then - SHLIB_CFLAGS="+z" - SHLIB_LD="ld -b" - SHLIB_LD_LIBS="" - DL_OBJS="tclLoadShl.o" - DL_LIBS="-ldld" - LDFLAGS="$LDFLAGS -Wl,-E" - LD_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.' - fi - LD_LIBRARY_PATH_VAR="SHLIB_PATH" - ;; - IRIX-4.*) - SHLIB_CFLAGS="-G 0" - SHLIB_SUFFIX=".a" - SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" - SHLIB_LD_LIBS='${LIBS}' - DL_OBJS="tclLoadAout.o" - DL_LIBS="" - LDFLAGS="$LDFLAGS -Wl,-D,08000000" - LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' - SHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' - ;; - IRIX-5.*) - SHLIB_CFLAGS="" - SHLIB_LD="ld -shared -rdata_shared" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' - ;; - IRIX-6.*|IRIX64-6.5*) - SHLIB_CFLAGS="" - SHLIB_LD="ld -n32 -shared -rdata_shared" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' - if test "$GCC" = "yes" ; then - CFLAGS="$CFLAGS -mabi=n32" - LDFLAGS="$LDFLAGS -mabi=n32" - else - case $system in - IRIX-6.3) - # Use to build 6.2 compatible binaries on 6.3. - CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS" - ;; - *) - CFLAGS="$CFLAGS -n32" - ;; - esac - LDFLAGS="$LDFLAGS -n32" - fi - ;; - IRIX64-6.*) - SHLIB_CFLAGS="" - SHLIB_LD="ld -n32 -shared -rdata_shared" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' - - # Check to enable 64-bit flags for compiler/linker - - if test "$do64bit" = "yes" ; then - if test "$GCC" = "yes" ; then - AC_MSG_WARN([64bit mode not supported by gcc]) - else - do64bit_ok=yes - SHLIB_LD="ld -64 -shared -rdata_shared" - CFLAGS="$CFLAGS -64" - LDFLAGS="$LDFLAGS -64" - fi - fi - ;; - Linux*) - SHLIB_CFLAGS="-fPIC" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - - CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" - # egcs-2.91.66 on Redhat Linux 6.0 generates lots of warnings - # when you inline the string and math operations. Turn this off to - # get rid of the warnings. - - #CFLAGS_OPTIMIZE="${CFLAGS_OPTIMIZE} -D__NO_STRING_INLINES -D__NO_MATH_INLINES" - - if test "$have_dl" = yes; then - SHLIB_LD="${CC} -shared" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - LDFLAGS="$LDFLAGS -Wl,--export-dynamic" - LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' - else - AC_CHECK_HEADER(dld.h, [ - SHLIB_LD="ld -shared" - DL_OBJS="tclLoadDld.o" - DL_LIBS="-ldld" - LD_SEARCH_FLAGS=""]) - fi - if test "`uname -m`" = "alpha" ; then - CFLAGS="$CFLAGS -mieee" - fi - - # The combo of gcc + glibc has a bug related - # to inlining of functions like strtod(). The - # -fno-builtin flag should address this problem - # but it does not work. The -fno-inline flag - # is kind of overkill but it works. - # Disable inlining only when one of the - # files in compat/*.c is being linked in. - if test x"${USE_COMPAT}" != x ; then - CFLAGS="$CFLAGS -fno-inline" - fi - - ;; - GNU*) - SHLIB_CFLAGS="-fPIC" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - - if test "$have_dl" = yes; then - SHLIB_LD="${CC} -shared" - DL_OBJS="" - DL_LIBS="-ldl" - LDFLAGS="$LDFLAGS -Wl,--export-dynamic" - LD_SEARCH_FLAGS="" - else - AC_CHECK_HEADER(dld.h, [ - SHLIB_LD="ld -shared" - DL_OBJS="" - DL_LIBS="-ldld" - LD_SEARCH_FLAGS=""]) - fi - if test "`uname -m`" = "alpha" ; then - CFLAGS="$CFLAGS -mieee" - fi - ;; - MP-RAS-02*) - SHLIB_CFLAGS="-K PIC" - SHLIB_LD="cc -G" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - LD_SEARCH_FLAGS="" - ;; - MP-RAS-*) - SHLIB_CFLAGS="-K PIC" - SHLIB_LD="cc -G" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - LDFLAGS="$LDFLAGS -Wl,-Bexport" - LD_SEARCH_FLAGS="" - ;; - NetBSD-*|FreeBSD-[[1-2]].*) - # Not available on all versions: check for include file. - AC_CHECK_HEADER(dlfcn.h, [ - # NetBSD/SPARC needs -fPIC, -fpic will not do. - SHLIB_CFLAGS="-fPIC" - SHLIB_LD="ld -Bshareable -x" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' - AC_MSG_CHECKING([for ELF]) - AC_EGREP_CPP(yes, [ -#ifdef __ELF__ - yes -#endif - ], - AC_MSG_RESULT([yes]) - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so', - AC_MSG_RESULT([no]) - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0' - ) - ], [ - SHLIB_CFLAGS="" - SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".a" - DL_OBJS="tclLoadAout.o" - DL_LIBS="" - LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' - ]) - - # FreeBSD doesn't handle version numbers with dots. - - UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' - TCL_LIB_VERSIONS_OK=nodots - ;; - OpenBSD-*) - SHLIB_LD="${CC} -shared" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - LD_SEARCH_FLAGS="" - AC_MSG_CHECKING(for ELF) - AC_EGREP_CPP(yes, [ -#ifdef __ELF__ - yes -#endif - ], - [AC_MSG_RESULT(yes) - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0'], - [AC_MSG_RESULT(no) - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0'] - ) - - # OpenBSD doesn't do version numbers with dots. - UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' - TCL_LIB_VERSIONS_OK=nodots - ;; - FreeBSD-*) - # FreeBSD 3.* and greater have ELF. - SHLIB_CFLAGS="-fPIC" - SHLIB_LD="ld -Bshareable -x" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - LDFLAGS="$LDFLAGS -export-dynamic" - LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' - if test "${TCL_THREADS}" = "1" ; then - # The -pthread needs to go in the CFLAGS, not LIBS - LIBS=`echo $LIBS | sed s/-pthread//` - CFLAGS="$CFLAGS -pthread" - LDFLAGS="$LDFLAGS -pthread" - fi - case $system in - FreeBSD-3.*) - # FreeBSD-3 doesn't handle version numbers with dots. - UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so' - TCL_LIB_VERSIONS_OK=nodots - ;; - esac - ;; - Darwin-*) - CFLAGS_OPTIMIZE="-Os" - SHLIB_CFLAGS="-fno-common" - if test $do64bit = yes; then - do64bit_ok=yes - CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5" - fi - SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS}' - AC_CACHE_CHECK([if ld accepts -single_module flag], tcl_cv_ld_single_module, [ - hold_ldflags=$LDFLAGS - LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module" - AC_TRY_LINK(, [int i;], tcl_cv_ld_single_module=yes, tcl_cv_ld_single_module=no) - LDFLAGS=$hold_ldflags]) - if test $tcl_cv_ld_single_module = yes; then - SHLIB_LD="${SHLIB_LD} -Wl,-single_module" - fi - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".dylib" - DL_OBJS="tclLoadDyld.o" - DL_LIBS="" - # Don't use -prebind when building for Mac OS X 10.4 or later only: - test -z "${MACOSX_DEPLOYMENT_TARGET}" || \ - test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F. '{print [$]2}'`" -lt 4 && \ - LDFLAGS="$LDFLAGS -prebind" - LDFLAGS="$LDFLAGS -headerpad_max_install_names" - AC_CACHE_CHECK([if ld accepts -search_paths_first flag], tcl_cv_ld_search_paths_first, [ - hold_ldflags=$LDFLAGS - LDFLAGS="$LDFLAGS -Wl,-search_paths_first" - AC_TRY_LINK(, [int i;], tcl_cv_ld_search_paths_first=yes, tcl_cv_ld_search_paths_first=no) - LDFLAGS=$hold_ldflags]) - if test $tcl_cv_ld_search_paths_first = yes; then - LDFLAGS="$LDFLAGS -Wl,-search_paths_first" - fi - LD_SEARCH_FLAGS="" - LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH" - ;; - NEXTSTEP-*) - SHLIB_CFLAGS="" - SHLIB_LD="cc -nostdlib -r" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadNext.o" - DL_LIBS="" - LD_SEARCH_FLAGS="" - ;; - OS/390-*) - CFLAGS_OPTIMIZE="" # Optimizer is buggy - AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h - [Should OS/390 do the right thing with sockets?]) - ;; - OSF1-1.0|OSF1-1.1|OSF1-1.2) - # OSF/1 1.[012] from OSF, and derivatives, including Paragon OSF/1 - SHLIB_CFLAGS="" - # Hack: make package name same as library name - SHLIB_LD='ld -R -export $@:' - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadOSF.o" - DL_LIBS="" - LD_SEARCH_FLAGS="" - ;; - OSF1-1.*) - # OSF/1 1.3 from OSF using ELF, and derivatives, including AD2 - SHLIB_CFLAGS="-fPIC" - if test "$SHARED_BUILD" = "1" ; then - SHLIB_LD="ld -shared" - else - SHLIB_LD="ld -non_shared" - fi - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - LD_SEARCH_FLAGS="" - ;; - OSF1-V*) - # Digital OSF/1 - SHLIB_CFLAGS="" - if test "$SHARED_BUILD" = "1" ; then - SHLIB_LD="${CC} -shared" - else - SHLIB_LD="${CC} -non_shared" - fi - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}' - if test "$GCC" = "yes" ; then - CFLAGS="$CFLAGS -mieee" - else - CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee" - fi - # see pthread_intro(3) for pthread support on osf1, k.furukawa - if test "${TCL_THREADS}" = "1" ; then - CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE" - CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64" - LIBS=`echo $LIBS | sed s/-lpthreads//` - if test "$GCC" = "yes" ; then - LIBS="$LIBS -lpthread -lmach -lexc" - else - CFLAGS="$CFLAGS -pthread" - LDFLAGS="$LDFLAGS -pthread" - fi - fi - - ;; - QNX-6*) - # QNX RTP - # This may work for all QNX, but it was only reported for v6. - SHLIB_CFLAGS="-fPIC" - SHLIB_LD="ld -Bshareable -x" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - # dlopen is in -lc on QNX - DL_LIBS="" - LD_SEARCH_FLAGS="" - ;; - RISCos-*) - SHLIB_CFLAGS="-G 0" - SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".a" - DL_OBJS="tclLoadAout.o" - DL_LIBS="" - LDFLAGS="$LDFLAGS -Wl,-D,08000000" - LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' - ;; - SCO_SV-3.2*) - # Note, dlopen is available only on SCO 3.2.5 and greater. However, - # this test works, since "uname -s" was non-standard in 3.2.4 and - # below. - if test "$GCC" = "yes" ; then - SHLIB_CFLAGS="-fPIC -melf" - LDFLAGS="$LDFLAGS -melf -Wl,-Bexport" - else - SHLIB_CFLAGS="-Kpic -belf" - LDFLAGS="$LDFLAGS -belf -Wl,-Bexport" - fi - SHLIB_LD="ld -G" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - LD_SEARCH_FLAGS="" - ;; - SINIX*5.4*) - SHLIB_CFLAGS="-K PIC" - SHLIB_LD="cc -G" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - LD_SEARCH_FLAGS="" - ;; - SunOS-4*) - SHLIB_CFLAGS="-PIC" - SHLIB_LD="ld" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' - - # SunOS can't handle version numbers with dots in them in library - # specs, like -ltcl7.5, so use -ltcl75 instead. Also, it - # requires an extra version number at the end of .so file names. - # So, the library has to have a name like libtcl75.so.1.0 - - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.1.0' - UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' - TCL_LIB_VERSIONS_OK=nodots - ;; - SunOS-5.[[0-6]]) - # Careful to not let 5.10+ fall into this case - - # Note: If _REENTRANT isn't defined, then Solaris - # won't define thread-safe library routines. - - AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) - AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, - [Do we really want to follow the standard? Yes we do!]) - - SHLIB_CFLAGS="-KPIC" - - # Note: need the LIBS below, otherwise Tk won't find Tcl's - # symbols when dynamically loaded into tclsh. - - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - if test "$GCC" = "yes" ; then - SHLIB_LD="$CC -shared" - LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' - else - SHLIB_LD="/usr/ccs/bin/ld -G -z text" - LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' - fi - ;; - SunOS-5*) - - # Note: If _REENTRANT isn't defined, then Solaris - # won't define thread-safe library routines. - - AC_DEFINE(_REENTRANT, 1, [Do we want the reentrant OS API?]) - AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, - [Do we really want to follow the standard? Yes we do!]) - - SHLIB_CFLAGS="-KPIC" - - # Check to enable 64-bit flags for compiler/linker - if test "$do64bit" = "yes" ; then - arch=`isainfo` - if test "$arch" = "sparcv9 sparc" ; then - if test "$GCC" = "yes" ; then - if test "`gcc -dumpversion` | awk -F. '{print $1}'" -lt "3" ; then - AC_MSG_WARN([64bit mode not supported with GCC < 3.2 on $system]) - else - do64bit_ok=yes - CFLAGS="$CFLAGS -m64 -mcpu=v9" - LDFLAGS="$LDFLAGS -m64 -mcpu=v9" - SHLIB_CFLAGS="-fPIC" - fi - else - do64bit_ok=yes - if test "$do64bitVIS" = "yes" ; then - CFLAGS="$CFLAGS -xarch=v9a" - LDFLAGS="$LDFLAGS -xarch=v9a" - else - CFLAGS="$CFLAGS -xarch=v9" - LDFLAGS="$LDFLAGS -xarch=v9" - fi - # Solaris 64 uses this as well - #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64" - fi - elif test "$arch" = "amd64 i386" ; then - if test "$GCC" = "yes" ; then - AC_MSG_WARN([64bit mode not supported with GCC on $system]) - else - do64bit_ok=yes - CFLAGS="$CFLAGS -xarch=amd64" - LDFLAGS="$LDFLAGS -xarch=amd64" - fi - else - AC_MSG_WARN([64bit mode not supported for $arch]) - fi - fi - - # Note: need the LIBS below, otherwise Tk won't find Tcl's - # symbols when dynamically loaded into tclsh. - - SHLIB_LD_LIBS='${LIBS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - if test "$GCC" = "yes" ; then - SHLIB_LD="$CC -shared" - LD_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}' - if test "$do64bit" = "yes" ; then - # We need to specify -static-libgcc or we need to - # add the path to the sparv9 libgcc. - # JH: static-libgcc is necessary for core Tcl, but may - # not be necessary for extensions. - SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc" - # for finding sparcv9 libgcc, get the regular libgcc - # path, remove so name and append 'sparcv9' - #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..." - #LD_SEARCH_FLAGS="${LD_SEARCH_FLAGS},-R,$v9gcclibdir" - fi - else - SHLIB_LD="/usr/ccs/bin/ld -G -z text" - LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}' - fi - ;; - ULTRIX-4.*) - SHLIB_CFLAGS="-G 0" - SHLIB_SUFFIX=".a" - SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0" - SHLIB_LD_LIBS='${LIBS}' - DL_OBJS="tclLoadAout.o" - DL_LIBS="" - LDFLAGS="$LDFLAGS -Wl,-D,08000000" - LD_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' - if test "$GCC" != "yes" ; then - CFLAGS="$CFLAGS -DHAVE_TZSET -std1" - fi - ;; - UNIX_SV* | UnixWare-5*) - SHLIB_CFLAGS="-KPIC" - SHLIB_LD="cc -G" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers - # that don't grok the -Bexport option. Test that it does. - hold_ldflags=$LDFLAGS - AC_MSG_CHECKING(for ld accepts -Bexport flag) - LDFLAGS="$LDFLAGS -Wl,-Bexport" - AC_TRY_LINK(, [int i;], [found=yes], - [LDFLAGS=$hold_ldflags found=no]) - AC_MSG_RESULT([$found]) - LD_SEARCH_FLAGS="" - ;; - esac - - if test "$do64bit" != "no" -a "$do64bit_ok" = "no" ; then - AC_MSG_WARN([64bit support being disabled -- don't know magic for this platform]) - fi - - # Step 4: If pseudo-static linking is in use (see K. B. Kenny, "Dynamic - # Loading for Tcl -- What Became of It?". Proc. 2nd Tcl/Tk Workshop, - # New Orleans, LA, Computerized Processes Unlimited, 1994), then we need - # to determine which of several header files defines the a.out file - # format (a.out.h, sys/exec.h, or sys/exec_aout.h). At present, we - # support only a file format that is more or less version-7-compatible. - # In particular, - # - a.out files must begin with `struct exec'. - # - the N_TXTOFF on the `struct exec' must compute the seek address - # of the text segment - # - The `struct exec' must contain a_magic, a_text, a_data, a_bss - # and a_entry fields. - # The following compilation should succeed if and only if either sys/exec.h - # or a.out.h is usable for the purpose. - # - # Note that the modified COFF format used on MIPS Ultrix 4.x is usable; the - # `struct exec' includes a second header that contains information that - # duplicates the v7 fields that are needed. - - if test "x$DL_OBJS" = "xtclLoadAout.o" ; then - AC_MSG_CHECKING([sys/exec.h]) - AC_TRY_COMPILE([#include ],[ - struct exec foo; - unsigned long seek; - int flag; -#if defined(__mips) || defined(mips) - seek = N_TXTOFF (foo.ex_f, foo.ex_o); -#else - seek = N_TXTOFF (foo); -#endif - flag = (foo.a_magic == OMAGIC); - return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; - ], tcl_ok=usable, tcl_ok=unusable) - AC_MSG_RESULT([$tcl_ok]) - if test $tcl_ok = usable; then - AC_DEFINE(USE_SYS_EXEC_H, 1, - [Should we use when doing dynamic loading?]) - else - AC_MSG_CHECKING([a.out.h]) - AC_TRY_COMPILE([#include ],[ - struct exec foo; - unsigned long seek; - int flag; -#if defined(__mips) || defined(mips) - seek = N_TXTOFF (foo.ex_f, foo.ex_o); -#else - seek = N_TXTOFF (foo); -#endif - flag = (foo.a_magic == OMAGIC); - return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; - ], tcl_ok=usable, tcl_ok=unusable) - AC_MSG_RESULT([$tcl_ok]) - if test $tcl_ok = usable; then - AC_DEFINE(USE_A_OUT_H, 1, - [Should we use when doing dynamic loading?]) - else - AC_MSG_CHECKING([sys/exec_aout.h]) - AC_TRY_COMPILE([#include ],[ - struct exec foo; - unsigned long seek; - int flag; -#if defined(__mips) || defined(mips) - seek = N_TXTOFF (foo.ex_f, foo.ex_o); -#else - seek = N_TXTOFF (foo); -#endif - flag = (foo.a_midmag == OMAGIC); - return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry; - ], tcl_ok=usable, tcl_ok=unusable) - AC_MSG_RESULT([$tcl_ok]) - if test $tcl_ok = usable; then - AC_DEFINE(USE_SYS_EXEC_AOUT_H, 1, - [Should we use when doing dynamic loading?]) - else - DL_OBJS="" - fi - fi - fi - fi - - # Step 5: disable dynamic loading if requested via a command-line switch. - - AC_ARG_ENABLE(load, [ --disable-load disallow dynamic loading and "load" command], - [tcl_ok=$enableval], [tcl_ok=yes]) - if test "$tcl_ok" = "no"; then - DL_OBJS="" - fi - - if test "x$DL_OBJS" != "x" ; then - BUILD_DLTEST="\$(DLTEST_TARGETS)" - else - echo "Can't figure out how to do dynamic loading or shared libraries" - echo "on this system." - SHLIB_CFLAGS="" - SHLIB_LD="" - SHLIB_SUFFIX="" - DL_OBJS="tclLoadNone.o" - DL_LIBS="" - LDFLAGS="$LDFLAGS_ORIG" - LD_SEARCH_FLAGS="" - BUILD_DLTEST="" - fi - - # If we're running gcc, then change the C flags for compiling shared - # libraries to the right flags for gcc, instead of those for the - # standard manufacturer compiler. - - if test "$DL_OBJS" != "tclLoadNone.o" ; then - if test "$GCC" = "yes" ; then - case $system in - AIX-*) - ;; - BSD/OS*) - ;; - IRIX*) - ;; - NetBSD-*|FreeBSD-*) - ;; - Darwin-*) - ;; - RISCos-*) - ;; - SCO_SV-3.2*) - ;; - ULTRIX-4.*) - ;; - windows) - ;; - *) - SHLIB_CFLAGS="-fPIC" - ;; - esac - fi - fi - - if test "$SHARED_LIB_SUFFIX" = "" ; then - SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}' - fi - if test "$UNSHARED_LIB_SUFFIX" = "" ; then - UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a' - fi - - AC_SUBST(DL_LIBS) - AC_SUBST(CFLAGS_DEBUG) - AC_SUBST(CFLAGS_OPTIMIZE) - AC_SUBST(CFLAGS_WARNING) - - AC_SUBST(STLIB_LD) - AC_SUBST(SHLIB_LD) - AC_SUBST(SHLIB_CFLAGS) - AC_SUBST(SHLIB_LD_LIBS) - AC_SUBST(LDFLAGS_DEBUG) - AC_SUBST(LDFLAGS_OPTIMIZE) - AC_SUBST(LD_LIBRARY_PATH_VAR) - - # These must be called after we do the basic CFLAGS checks and - # verify any possible 64-bit or similar switches are necessary - TEA_TCL_EARLY_FLAGS - TEA_TCL_64BIT_FLAGS -]) - -#-------------------------------------------------------------------- -# TEA_SERIAL_PORT -# -# Determine which interface to use to talk to the serial port. -# Note that #include lines must begin in leftmost column for -# some compilers to recognize them as preprocessor directives, -# and some build environments have stdin not pointing at a -# pseudo-terminal (usually /dev/null instead.) -# -# Arguments: -# none -# -# Results: -# -# Defines only one of the following vars: -# HAVE_SYS_MODEM_H -# USE_TERMIOS -# USE_TERMIO -# USE_SGTTY -# -#-------------------------------------------------------------------- - -AC_DEFUN(TEA_SERIAL_PORT, [ - AC_CHECK_HEADERS(sys/modem.h) - AC_MSG_CHECKING([termios vs. termio vs. sgtty]) - AC_CACHE_VAL(tcl_cv_api_serial, [ - AC_TRY_RUN([ -#include - -int main() { - struct termios t; - if (tcgetattr(0, &t) == 0) { - cfsetospeed(&t, 0); - t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; - return 0; - } - return 1; -}], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) - if test $tcl_cv_api_serial = no ; then - AC_TRY_RUN([ -#include - -int main() { - struct termio t; - if (ioctl(0, TCGETA, &t) == 0) { - t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; - return 0; - } - return 1; -}], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) - fi - if test $tcl_cv_api_serial = no ; then - AC_TRY_RUN([ -#include - -int main() { - struct sgttyb t; - if (ioctl(0, TIOCGETP, &t) == 0) { - t.sg_ospeed = 0; - t.sg_flags |= ODDP | EVENP | RAW; - return 0; - } - return 1; -}], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) - fi - if test $tcl_cv_api_serial = no ; then - AC_TRY_RUN([ -#include -#include - -int main() { - struct termios t; - if (tcgetattr(0, &t) == 0 - || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { - cfsetospeed(&t, 0); - t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB; - return 0; - } - return 1; -}], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no) - fi - if test $tcl_cv_api_serial = no; then - AC_TRY_RUN([ -#include -#include - -int main() { - struct termio t; - if (ioctl(0, TCGETA, &t) == 0 - || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { - t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB; - return 0; - } - return 1; - }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no) - fi - if test $tcl_cv_api_serial = no; then - AC_TRY_RUN([ -#include -#include - -int main() { - struct sgttyb t; - if (ioctl(0, TIOCGETP, &t) == 0 - || errno == ENOTTY || errno == ENXIO || errno == EINVAL) { - t.sg_ospeed = 0; - t.sg_flags |= ODDP | EVENP | RAW; - return 0; - } - return 1; -}], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none) - fi]) - case $tcl_cv_api_serial in - termios) AC_DEFINE(USE_TERMIOS, 1, [Use the termios API for serial lines]);; - termio) AC_DEFINE(USE_TERMIO, 1, [Use the termio API for serial lines]);; - sgtty) AC_DEFINE(USE_SGTTY, 1, [Use the sgtty API for serial lines]);; - esac - AC_MSG_RESULT([$tcl_cv_api_serial]) -]) - -#-------------------------------------------------------------------- -# TEA_MISSING_POSIX_HEADERS -# -# Supply substitutes for missing POSIX header files. Special -# notes: -# - stdlib.h doesn't define strtol, strtoul, or -# strtod insome versions of SunOS -# - some versions of string.h don't declare procedures such -# as strstr -# -# Arguments: -# none -# -# Results: -# -# Defines some of the following vars: -# NO_DIRENT_H -# NO_ERRNO_H -# NO_VALUES_H -# HAVE_LIMITS_H or NO_LIMITS_H -# NO_STDLIB_H -# NO_STRING_H -# NO_SYS_WAIT_H -# NO_DLFCN_H -# HAVE_SYS_PARAM_H -# -# HAVE_STRING_H ? -# -# tkUnixPort.h checks for HAVE_LIMITS_H, so do both HAVE and -# CHECK on limits.h -#-------------------------------------------------------------------- - -AC_DEFUN(TEA_MISSING_POSIX_HEADERS, [ - AC_MSG_CHECKING([dirent.h]) - AC_CACHE_VAL(tcl_cv_dirent_h, - AC_TRY_LINK([#include -#include ], [ -#ifndef _POSIX_SOURCE -# ifdef __Lynx__ - /* - * Generate compilation error to make the test fail: Lynx headers - * are only valid if really in the POSIX environment. - */ - - missing_procedure(); -# endif -#endif -DIR *d; -struct dirent *entryPtr; -char *p; -d = opendir("foobar"); -entryPtr = readdir(d); -p = entryPtr->d_name; -closedir(d); -], tcl_cv_dirent_h=yes, tcl_cv_dirent_h=no)) - - if test $tcl_cv_dirent_h = no; then - AC_DEFINE(NO_DIRENT_H, 1, [Do we have ?]) - fi - - AC_MSG_RESULT([$tcl_ok]) - AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H, 1, [Do we have ?])]) - AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H, 1, [Do we have ?])]) - AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H, 1, [Do we have ?])]) - AC_CHECK_HEADER(limits.h, - [AC_DEFINE(HAVE_LIMITS_H, 1, [Do we have ?])], - [AC_DEFINE(NO_LIMITS_H, 1, [Do we have ?])]) - AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0) - AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0) - AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0) - AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0) - if test $tcl_ok = 0; then - AC_DEFINE(NO_STDLIB_H, 1, [Do we have ?]) - fi - AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0) - AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0) - AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0) - - # See also memmove check below for a place where NO_STRING_H can be - # set and why. - - if test $tcl_ok = 0; then - AC_DEFINE(NO_STRING_H, 1, [Do we have ?]) - fi - - AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H, 1, [Do we have ?])]) - AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H, 1, [Do we have ?])]) - - # OS/390 lacks sys/param.h (and doesn't need it, by chance). - AC_HAVE_HEADERS(sys/param.h) - -]) - -#-------------------------------------------------------------------- -# TEA_PATH_X -# -# Locate the X11 header files and the X11 library archive. Try -# the ac_path_x macro first, but if it doesn't find the X stuff -# (e.g. because there's no xmkmf program) then check through -# a list of possible directories. Under some conditions the -# autoconf macro will return an include directory that contains -# no include files, so double-check its result just to be safe. -# -# This should be called after TEA_CONFIG_CFLAGS as setting the -# LIBS line can confuse some configure macro magic. -# -# Arguments: -# none -# -# Results: -# -# Sets the following vars: -# XINCLUDES -# XLIBSW -# LIBS (appends to) -# TEA_WINDOWINGSYSTEM -# -#-------------------------------------------------------------------- - -AC_DEFUN(TEA_PATH_X, [ - if test "${TEA_WINDOWINGSYSTEM}" = "x11" ; then - TEA_PATH_UNIX_X - fi -]) - -AC_DEFUN(TEA_PATH_UNIX_X, [ - AC_PATH_X - not_really_there="" - if test "$no_x" = ""; then - if test "$x_includes" = ""; then - AC_TRY_CPP([#include ], , not_really_there="yes") - else - if test ! -r $x_includes/X11/Intrinsic.h; then - not_really_there="yes" - fi - fi - fi - if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then - AC_MSG_CHECKING([for X11 header files]) - XINCLUDES="# no special path needed" - AC_TRY_CPP([#include ], , XINCLUDES="nope") - if test "$XINCLUDES" = nope; then - dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include" - for i in $dirs ; do - if test -r $i/X11/Intrinsic.h; then - AC_MSG_RESULT([$i]) - XINCLUDES=" -I$i" - break - fi - done - fi - else - if test "$x_includes" != ""; then - XINCLUDES=-I$x_includes - else - XINCLUDES="# no special path needed" - fi - fi - if test "$XINCLUDES" = nope; then - AC_MSG_RESULT([could not find any!]) - XINCLUDES="# no include files found" - fi - - if test "$no_x" = yes; then - AC_MSG_CHECKING([for X11 libraries]) - XLIBSW=nope - dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib" - for i in $dirs ; do - if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl; then - AC_MSG_RESULT([$i]) - XLIBSW="-L$i -lX11" - x_libraries="$i" - break - fi - done - else - if test "$x_libraries" = ""; then - XLIBSW=-lX11 - else - XLIBSW="-L$x_libraries -lX11" - fi - fi - if test "$XLIBSW" = nope ; then - AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow) - fi - if test "$XLIBSW" = nope ; then - AC_MSG_RESULT([could not find any! Using -lX11.]) - XLIBSW=-lX11 - fi - if test x"${XLIBSW}" != x ; then - PKG_LIBS="${PKG_LIBS} ${XLIBSW}" - fi -]) - -#-------------------------------------------------------------------- -# TEA_BLOCKING_STYLE -# -# The statements below check for systems where POSIX-style -# non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. -# On these systems (mostly older ones), use the old BSD-style -# FIONBIO approach instead. -# -# Arguments: -# none -# -# Results: -# -# Defines some of the following vars: -# HAVE_SYS_IOCTL_H -# HAVE_SYS_FILIO_H -# USE_FIONBIO -# O_NONBLOCK -# -#-------------------------------------------------------------------- - -AC_DEFUN(TEA_BLOCKING_STYLE, [ - AC_CHECK_HEADERS(sys/ioctl.h) - AC_CHECK_HEADERS(sys/filio.h) - AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O]) - if test -f /usr/lib/NextStep/software_version; then - system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` - else - system=`uname -s`-`uname -r` - if test "$?" -ne 0 ; then - system=unknown - else - # Special check for weird MP-RAS system (uname returns weird - # results, and the version is kept in special file). - - if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then - system=MP-RAS-`awk '{print $3}' /etc/.relid` - fi - if test "`uname -s`" = "AIX" ; then - system=AIX-`uname -v`.`uname -r` - fi - fi - fi - case $system in - # There used to be code here to use FIONBIO under AIX. However, it - # was reported that FIONBIO doesn't work under AIX 3.2.5. Since - # using O_NONBLOCK seems fine under AIX 4.*, I removed the FIONBIO - # code (JO, 5/31/97). - - OSF*) - AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) - AC_MSG_RESULT([FIONBIO]) - ;; - SunOS-4*) - AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) - AC_MSG_RESULT([FIONBIO]) - ;; - ULTRIX-4.*) - AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) - AC_MSG_RESULT([FIONBIO]) - ;; - *) - AC_MSG_RESULT([O_NONBLOCK]) - ;; - esac -]) - -#-------------------------------------------------------------------- -# TEA_TIME_HANLDER -# -# Checks how the system deals with time.h, what time structures -# are used on the system, and what fields the structures have. -# -# Arguments: -# none -# -# Results: -# -# Defines some of the following vars: -# USE_DELTA_FOR_TZ -# HAVE_TM_GMTOFF -# HAVE_TM_TZADJ -# HAVE_TIMEZONE_VAR -# -#-------------------------------------------------------------------- - -AC_DEFUN(TEA_TIME_HANDLER, [ - AC_CHECK_HEADERS(sys/time.h) - AC_HEADER_TIME - AC_STRUCT_TIMEZONE - - AC_CHECK_FUNCS(gmtime_r localtime_r) - - AC_MSG_CHECKING([tm_tzadj in struct tm]) - AC_CACHE_VAL(tcl_cv_member_tm_tzadj, - AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_tzadj;], - tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no)) - AC_MSG_RESULT([$tcl_cv_member_tm_tzadj]) - if test $tcl_cv_member_tm_tzadj = yes ; then - AC_DEFINE(HAVE_TM_TZADJ, 1, [Should we use the tm_tzadj field of struct tm?]) - fi - - AC_MSG_CHECKING([tm_gmtoff in struct tm]) - AC_CACHE_VAL(tcl_cv_member_tm_gmtoff, - AC_TRY_COMPILE([#include ], [struct tm tm; tm.tm_gmtoff;], - tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no)) - AC_MSG_RESULT([$tcl_cv_member_tm_gmtoff]) - if test $tcl_cv_member_tm_gmtoff = yes ; then - AC_DEFINE(HAVE_TM_GMTOFF, 1, [Should we use the tm_gmtoff field of struct tm?]) - fi - - # - # Its important to include time.h in this check, as some systems - # (like convex) have timezone functions, etc. - # - AC_MSG_CHECKING([long timezone variable]) - AC_CACHE_VAL(tcl_cv_timezone_long, - AC_TRY_COMPILE([#include ], - [extern long timezone; - timezone += 1; - exit (0);], - tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no)) - AC_MSG_RESULT([$tcl_cv_timezone_long]) - if test $tcl_cv_timezone_long = yes ; then - AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) - else - # - # On some systems (eg IRIX 6.2), timezone is a time_t and not a long. - # - AC_MSG_CHECKING([time_t timezone variable]) - AC_CACHE_VAL(tcl_cv_timezone_time, - AC_TRY_COMPILE([#include ], - [extern time_t timezone; - timezone += 1; - exit (0);], - tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no)) - AC_MSG_RESULT([$tcl_cv_timezone_time]) - if test $tcl_cv_timezone_time = yes ; then - AC_DEFINE(HAVE_TIMEZONE_VAR, 1, [Should we use the global timezone variable?]) - fi - fi -]) - -#-------------------------------------------------------------------- -# TEA_BUGGY_STRTOD -# -# Under Solaris 2.4, strtod returns the wrong value for the -# terminating character under some conditions. Check for this -# and if the problem exists use a substitute procedure -# "fixstrtod" (provided by Tcl) that corrects the error. -# Also, on Compaq's Tru64 Unix 5.0, -# strtod(" ") returns 0.0 instead of a failure to convert. -# -# Arguments: -# none -# -# Results: -# -# Might defines some of the following vars: -# strtod (=fixstrtod) -# -#-------------------------------------------------------------------- - -AC_DEFUN(TEA_BUGGY_STRTOD, [ - AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0) - if test "$tcl_strtod" = 1; then - AC_MSG_CHECKING([for Solaris2.4/Tru64 strtod bugs]) - AC_CACHE_VAL(tcl_cv_strtod_buggy,[ - AC_TRY_RUN([ - extern double strtod(); - int main() - { - char *string = "NaN", *spaceString = " "; - char *term; - double value; - value = strtod(string, &term); - if ((term != string) && (term[-1] == 0)) { - exit(1); - } - value = strtod(spaceString, &term); - if (term == (spaceString+1)) { - exit(1); - } - exit(0); - }], tcl_cv_strtod_buggy=1, tcl_cv_strtod_buggy=0, tcl_cv_strtod_buggy=0)]) - if test "$tcl_cv_strtod_buggy" = 1; then - AC_MSG_RESULT([ok]) - else - AC_MSG_RESULT([buggy]) - #LIBOBJS="$LIBOBJS fixstrtod.o" - AC_LIBOBJ([fixstrtod]) - USE_COMPAT=1 - AC_DEFINE(strtod, fixstrtod, [Do we want to use the strtod() in compat?]) - fi - fi -]) - -#-------------------------------------------------------------------- -# TEA_TCL_LINK_LIBS -# -# Search for the libraries needed to link the Tcl shell. -# Things like the math library (-lm) and socket stuff (-lsocket vs. -# -lnsl) are dealt with here. -# -# Arguments: -# Requires the following vars to be set in the Makefile: -# DL_LIBS -# LIBS -# MATH_LIBS -# -# Results: -# -# Subst's the following var: -# TCL_LIBS -# MATH_LIBS -# -# Might append to the following vars: -# LIBS -# -# Might define the following vars: -# HAVE_NET_ERRNO_H -# -#-------------------------------------------------------------------- - -AC_DEFUN(TEA_TCL_LINK_LIBS, [ - #-------------------------------------------------------------------- - # On a few very rare systems, all of the libm.a stuff is - # already in libc.a. Set compiler flags accordingly. - # Also, Linux requires the "ieee" library for math to work - # right (and it must appear before "-lm"). - #-------------------------------------------------------------------- - - AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm") - AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"]) - - #-------------------------------------------------------------------- - # Interactive UNIX requires -linet instead of -lsocket, plus it - # needs net/errno.h to define the socket-related error codes. - #-------------------------------------------------------------------- - - AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"]) - AC_CHECK_HEADER(net/errno.h, [ - AC_DEFINE(HAVE_NET_ERRNO_H, 1, [Do we have ?])]) - - #-------------------------------------------------------------------- - # Check for the existence of the -lsocket and -lnsl libraries. - # The order here is important, so that they end up in the right - # order in the command line generated by make. Here are some - # special considerations: - # 1. Use "connect" and "accept" to check for -lsocket, and - # "gethostbyname" to check for -lnsl. - # 2. Use each function name only once: can't redo a check because - # autoconf caches the results of the last check and won't redo it. - # 3. Use -lnsl and -lsocket only if they supply procedures that - # aren't already present in the normal libraries. This is because - # IRIX 5.2 has libraries, but they aren't needed and they're - # bogus: they goof up name resolution if used. - # 4. On some SVR4 systems, can't use -lsocket without -lnsl too. - # To get around this problem, check for both libraries together - # if -lsocket doesn't work by itself. - #-------------------------------------------------------------------- - - tcl_checkBoth=0 - AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1) - if test "$tcl_checkSocket" = 1; then - AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt, - LIBS="$LIBS -lsocket", tcl_checkBoth=1)]) - fi - if test "$tcl_checkBoth" = 1; then - tk_oldLibs=$LIBS - LIBS="$LIBS -lsocket -lnsl" - AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs]) - fi - AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname, - [LIBS="$LIBS -lnsl"])]) - - # Don't perform the eval of the libraries here because DL_LIBS - # won't be set until we call TEA_CONFIG_CFLAGS - - TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}' - AC_SUBST(TCL_LIBS) - AC_SUBST(MATH_LIBS) -]) - -#-------------------------------------------------------------------- -# TEA_TCL_EARLY_FLAGS -# -# Check for what flags are needed to be passed so the correct OS -# features are available. -# -# Arguments: -# None -# -# Results: -# -# Might define the following vars: -# _ISOC99_SOURCE -# _LARGEFILE64_SOURCE -# -#-------------------------------------------------------------------- - -AC_DEFUN(TEA_TCL_EARLY_FLAG,[ - AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]), - AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no, - AC_TRY_COMPILE([[#define ]$1[ 1 -]$2], $3, - [tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes, - [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no))) - if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then - AC_DEFINE($1, 1, [Add the ]$1[ flag when building]) - tcl_flags="$tcl_flags $1" - fi -]) - -AC_DEFUN(TEA_TCL_EARLY_FLAGS,[ - AC_MSG_CHECKING([for required early compiler flags]) - tcl_flags="" - TEA_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include ], - [char *p = (char *)strtoll; char *q = (char *)strtoull;]) - TEA_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include ], - [struct stat64 buf; int i = stat64("/", &buf);]) - if test "x${tcl_flags}" = "x" ; then - AC_MSG_RESULT([none]) - else - AC_MSG_RESULT([${tcl_flags}]) - fi -]) - -#-------------------------------------------------------------------- -# TEA_TCL_64BIT_FLAGS -# -# Check for what is defined in the way of 64-bit features. -# -# Arguments: -# None -# -# Results: -# -# Might define the following vars: -# TCL_WIDE_INT_IS_LONG -# TCL_WIDE_INT_TYPE -# HAVE_STRUCT_DIRENT64 -# HAVE_STRUCT_STAT64 -# HAVE_TYPE_OFF64_T -# -#-------------------------------------------------------------------- - -AC_DEFUN(TEA_TCL_64BIT_FLAGS, [ - AC_MSG_CHECKING([for 64-bit integer type]) - AC_CACHE_VAL(tcl_cv_type_64bit,[ - tcl_cv_type_64bit=none - # See if the compiler knows natively about __int64 - AC_TRY_COMPILE(,[__int64 value = (__int64) 0;], - tcl_type_64bit=__int64, tcl_type_64bit="long long") - # See if we should use long anyway Note that we substitute in the - # type that is our current guess for a 64-bit type inside this check - # program, so it should be modified only carefully... - AC_TRY_COMPILE(,[switch (0) { - case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; - }],tcl_cv_type_64bit=${tcl_type_64bit})]) - if test "${tcl_cv_type_64bit}" = none ; then - AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Are wide integers to be implemented with C 'long's?]) - AC_MSG_RESULT([using long]) - elif test "${tcl_cv_type_64bit}" = "__int64" \ - -a "${TEA_PLATFORM}" = "windows" ; then - # We actually want to use the default tcl.h checks in this - # case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER* - AC_MSG_RESULT([using Tcl header defaults]) - else - AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit}, - [What type should be used to define wide integers?]) - AC_MSG_RESULT([${tcl_cv_type_64bit}]) - - # Now check for auxiliary declarations - AC_MSG_CHECKING([for struct dirent64]) - AC_CACHE_VAL(tcl_cv_struct_dirent64,[ - AC_TRY_COMPILE([#include -#include ],[struct dirent64 p;], - tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)]) - if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then - AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in ?]) - fi - AC_MSG_RESULT([${tcl_cv_struct_dirent64}]) - - AC_MSG_CHECKING([for struct stat64]) - AC_CACHE_VAL(tcl_cv_struct_stat64,[ - AC_TRY_COMPILE([#include ],[struct stat64 p; -], - tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)]) - if test "x${tcl_cv_struct_stat64}" = "xyes" ; then - AC_DEFINE(HAVE_STRUCT_STAT64, 1, [Is 'struct stat64' in ?]) - fi - AC_MSG_RESULT([${tcl_cv_struct_stat64}]) - - AC_MSG_CHECKING([for off64_t]) - AC_CACHE_VAL(tcl_cv_type_off64_t,[ - AC_TRY_COMPILE([#include ],[off64_t offset; -], - tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)]) - if test "x${tcl_cv_type_off64_t}" = "xyes" ; then - AC_DEFINE(HAVE_TYPE_OFF64_T, 1, [Is off64_t in ?]) - fi - AC_MSG_RESULT([${tcl_cv_type_off64_t}]) - fi -]) - -## -## Here ends the standard Tcl configuration bits and starts the -## TEA specific functions -## - -#------------------------------------------------------------------------ -# TEA_INIT -- -# -# Init various Tcl Extension Architecture (TEA) variables. -# This should be the first called TEA_* macro. -# -# Arguments: -# none -# -# Results: -# -# Defines and substs the following vars: -# CYGPATH -# EXEEXT -# Defines only: -# TEA_INITED -# TEA_PLATFORM (windows or unix) -# -# "cygpath" is used on windows to generate native path names for include -# files. These variables should only be used with the compiler and linker -# since they generate native path names. -# -# EXEEXT -# Select the executable extension based on the host type. This -# is a lightweight replacement for AC_EXEEXT that doesn't require -# a compiler. -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_INIT, [ - # TEA extensions pass this us the version of TEA they think they - # are compatible with. - TEA_VERSION="3.4" - - AC_MSG_CHECKING([for correct TEA configuration]) - if test x"${PACKAGE_NAME}" = x ; then - AC_MSG_ERROR([ -The PACKAGE_NAME variable must be defined by your TEA configure.in]) - fi - if test x"$1" = x ; then - AC_MSG_ERROR([ -TEA version not specified.]) - elif test "$1" != "${TEA_VERSION}" ; then - AC_MSG_RESULT([warning: requested TEA version "$1", have "${TEA_VERSION}"]) - else - AC_MSG_RESULT([ok (TEA ${TEA_VERSION})]) - fi - case "`uname -s`" in - *win32*|*WIN32*|*CYGWIN_NT*|*CYGWIN_9*|*CYGWIN_ME*|*MINGW32_*) - AC_CHECK_PROG(CYGPATH, cygpath, cygpath -w, echo) - EXEEXT=".exe" - TEA_PLATFORM="windows" - ;; - *) - CYGPATH=echo - EXEEXT="" - TEA_PLATFORM="unix" - ;; - esac - - # Check if exec_prefix is set. If not use fall back to prefix. - # Note when adjusted, so that TEA_PREFIX can correct for this. - # This is needed for recursive configures, since autoconf propagates - # $prefix, but not $exec_prefix (doh!). - if test x$exec_prefix = xNONE ; then - exec_prefix_default=yes - exec_prefix=$prefix - fi - - AC_SUBST(EXEEXT) - AC_SUBST(CYGPATH) - - # This package name must be replaced statically for AC_SUBST to work - AC_SUBST(PKG_LIB_FILE) - # Substitute STUB_LIB_FILE in case package creates a stub library too. - AC_SUBST(PKG_STUB_LIB_FILE) - - # We AC_SUBST these here to ensure they are subst'ed, - # in case the user doesn't call TEA_ADD_... - AC_SUBST(PKG_STUB_SOURCES) - AC_SUBST(PKG_STUB_OBJECTS) - AC_SUBST(PKG_TCL_SOURCES) - AC_SUBST(PKG_HEADERS) - AC_SUBST(PKG_INCLUDES) - AC_SUBST(PKG_LIBS) - AC_SUBST(PKG_CFLAGS) -]) - -#------------------------------------------------------------------------ -# TEA_ADD_SOURCES -- -# -# Specify one or more source files. Users should check for -# the right platform before adding to their list. -# It is not important to specify the directory, as long as it is -# in the generic, win or unix subdirectory of $(srcdir). -# -# Arguments: -# one or more file names -# -# Results: -# -# Defines and substs the following vars: -# PKG_SOURCES -# PKG_OBJECTS -#------------------------------------------------------------------------ -AC_DEFUN(TEA_ADD_SOURCES, [ - vars="$@" - for i in $vars; do - case $i in - [\$]*) - # allow $-var names - PKG_SOURCES="$PKG_SOURCES $i" - PKG_OBJECTS="$PKG_OBJECTS $i" - ;; - *) - # check for existence - allows for generic/win/unix VPATH - if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ - -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ - ; then - AC_MSG_ERROR([could not find source file '$i']) - fi - PKG_SOURCES="$PKG_SOURCES $i" - # this assumes it is in a VPATH dir - i=`basename $i` - # handle user calling this before or after TEA_SETUP_COMPILER - if test x"${OBJEXT}" != x ; then - j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" - else - j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" - fi - PKG_OBJECTS="$PKG_OBJECTS $j" - ;; - esac - done - AC_SUBST(PKG_SOURCES) - AC_SUBST(PKG_OBJECTS) -]) - -#------------------------------------------------------------------------ -# TEA_ADD_STUB_SOURCES -- -# -# Specify one or more source files. Users should check for -# the right platform before adding to their list. -# It is not important to specify the directory, as long as it is -# in the generic, win or unix subdirectory of $(srcdir). -# -# Arguments: -# one or more file names -# -# Results: -# -# Defines and substs the following vars: -# PKG_STUB_SOURCES -# PKG_STUB_OBJECTS -#------------------------------------------------------------------------ -AC_DEFUN(TEA_ADD_STUB_SOURCES, [ - vars="$@" - for i in $vars; do - # check for existence - allows for generic/win/unix VPATH - if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \ - -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ - ; then - AC_MSG_ERROR([could not find stub source file '$i']) - fi - PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" - # this assumes it is in a VPATH dir - i=`basename $i` - # handle user calling this before or after TEA_SETUP_COMPILER - if test x"${OBJEXT}" != x ; then - j="`echo $i | sed -e 's/\.[[^.]]*$//'`.${OBJEXT}" - else - j="`echo $i | sed -e 's/\.[[^.]]*$//'`.\${OBJEXT}" - fi - PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j" - done - AC_SUBST(PKG_STUB_SOURCES) - AC_SUBST(PKG_STUB_OBJECTS) -]) - -#------------------------------------------------------------------------ -# TEA_ADD_TCL_SOURCES -- -# -# Specify one or more Tcl source files. These should be platform -# independent runtime files. -# -# Arguments: -# one or more file names -# -# Results: -# -# Defines and substs the following vars: -# PKG_TCL_SOURCES -#------------------------------------------------------------------------ -AC_DEFUN(TEA_ADD_TCL_SOURCES, [ - vars="$@" - for i in $vars; do - # check for existence, be strict because it is installed - if test ! -f "${srcdir}/$i" ; then - AC_MSG_ERROR([could not find tcl source file '${srcdir}/$i']) - fi - PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" - done - AC_SUBST(PKG_TCL_SOURCES) -]) - -#------------------------------------------------------------------------ -# TEA_ADD_HEADERS -- -# -# Specify one or more source headers. Users should check for -# the right platform before adding to their list. -# -# Arguments: -# one or more file names -# -# Results: -# -# Defines and substs the following vars: -# PKG_HEADERS -#------------------------------------------------------------------------ -AC_DEFUN(TEA_ADD_HEADERS, [ - vars="$@" - for i in $vars; do - # check for existence, be strict because it is installed - if test ! -f "${srcdir}/$i" ; then - AC_MSG_ERROR([could not find header file '${srcdir}/$i']) - fi - PKG_HEADERS="$PKG_HEADERS $i" - done - AC_SUBST(PKG_HEADERS) -]) - -#------------------------------------------------------------------------ -# TEA_ADD_INCLUDES -- -# -# Specify one or more include dirs. Users should check for -# the right platform before adding to their list. -# -# Arguments: -# one or more file names -# -# Results: -# -# Defines and substs the following vars: -# PKG_INCLUDES -#------------------------------------------------------------------------ -AC_DEFUN(TEA_ADD_INCLUDES, [ - vars="$@" - for i in $vars; do - PKG_INCLUDES="$PKG_INCLUDES $i" - done - AC_SUBST(PKG_INCLUDES) -]) - -#------------------------------------------------------------------------ -# TEA_ADD_LIBS -- -# -# Specify one or more libraries. Users should check for -# the right platform before adding to their list. For Windows, -# libraries provided in "foo.lib" format will be converted to -# "-lfoo" when using GCC (mingw). -# -# Arguments: -# one or more file names -# -# Results: -# -# Defines and substs the following vars: -# PKG_LIBS -#------------------------------------------------------------------------ -AC_DEFUN(TEA_ADD_LIBS, [ - vars="$@" - for i in $vars; do - if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then - # Convert foo.lib to -lfoo for GCC. No-op if not *.lib - i=`echo "$i" | sed -e 's/^\([[^-]].*\)\.lib[$]/-l\1/i'` - fi - PKG_LIBS="$PKG_LIBS $i" - done - AC_SUBST(PKG_LIBS) -]) - -#------------------------------------------------------------------------ -# TEA_ADD_CFLAGS -- -# -# Specify one or more CFLAGS. Users should check for -# the right platform before adding to their list. -# -# Arguments: -# one or more file names -# -# Results: -# -# Defines and substs the following vars: -# PKG_CFLAGS -#------------------------------------------------------------------------ -AC_DEFUN(TEA_ADD_CFLAGS, [ - PKG_CFLAGS="$PKG_CFLAGS $@" - AC_SUBST(PKG_CFLAGS) -]) - -#------------------------------------------------------------------------ -# TEA_PREFIX -- -# -# Handle the --prefix=... option by defaulting to what Tcl gave -# -# Arguments: -# none -# -# Results: -# -# If --prefix or --exec-prefix was not specified, $prefix and -# $exec_prefix will be set to the values given to Tcl when it was -# configured. -#------------------------------------------------------------------------ -AC_DEFUN(TEA_PREFIX, [ - if test "${prefix}" = "NONE"; then - prefix_default=yes - if test x"${TCL_PREFIX}" != x; then - AC_MSG_NOTICE([--prefix defaulting to TCL_PREFIX ${TCL_PREFIX}]) - prefix=${TCL_PREFIX} - else - AC_MSG_NOTICE([--prefix defaulting to /usr/local]) - prefix=/usr/local - fi - fi - if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \ - -o x"${exec_prefix_default}" = x"yes" ; then - if test x"${TCL_EXEC_PREFIX}" != x; then - AC_MSG_NOTICE([--exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}]) - exec_prefix=${TCL_EXEC_PREFIX} - else - AC_MSG_NOTICE([--exec-prefix defaulting to ${prefix}]) - exec_prefix=$prefix - fi - fi -]) - -#------------------------------------------------------------------------ -# TEA_SETUP_COMPILER_CC -- -# -# Do compiler checks the way we want. This is just a replacement -# for AC_PROG_CC in TEA configure.in files to make them cleaner. -# -# Arguments: -# none -# -# Results: -# -# Sets up CC var and other standard bits we need to make executables. -#------------------------------------------------------------------------ -AC_DEFUN(TEA_SETUP_COMPILER_CC, [ - # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE) - # in this macro, they need to go into TEA_SETUP_COMPILER instead. - - # If the user did not set CFLAGS, set it now to keep - # the AC_PROG_CC macro from adding "-g -O2". - if test "${CFLAGS+set}" != "set" ; then - CFLAGS="" - fi - - AC_PROG_CC - AC_PROG_CPP - - AC_PROG_INSTALL - - #-------------------------------------------------------------------- - # Checks to see if the make program sets the $MAKE variable. - #-------------------------------------------------------------------- - - AC_PROG_MAKE_SET - - #-------------------------------------------------------------------- - # Find ranlib - #-------------------------------------------------------------------- - - AC_PROG_RANLIB - - #-------------------------------------------------------------------- - # Determines the correct binary file extension (.o, .obj, .exe etc.) - #-------------------------------------------------------------------- - - AC_OBJEXT - AC_EXEEXT -]) - -#------------------------------------------------------------------------ -# TEA_SETUP_COMPILER -- -# -# Do compiler checks that use the compiler. This must go after -# TEA_SETUP_COMPILER_CC, which does the actual compiler check. -# -# Arguments: -# none -# -# Results: -# -# Sets up CC var and other standard bits we need to make executables. -#------------------------------------------------------------------------ -AC_DEFUN(TEA_SETUP_COMPILER, [ - # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here. - AC_REQUIRE([TEA_SETUP_COMPILER_CC]) - - #------------------------------------------------------------------------ - # If we're using GCC, see if the compiler understands -pipe. If so, use it. - # It makes compiling go faster. (This is only a performance feature.) - #------------------------------------------------------------------------ - - if test -z "$no_pipe" -a -n "$GCC"; then - AC_MSG_CHECKING([if the compiler understands -pipe]) - OLDCC="$CC" - CC="$CC -pipe" - AC_TRY_COMPILE(,, AC_MSG_RESULT([yes]), CC="$OLDCC" - AC_MSG_RESULT([no])) - fi - - #-------------------------------------------------------------------- - # Common compiler flag setup - #-------------------------------------------------------------------- - - AC_C_BIGENDIAN - if test "${TEA_PLATFORM}" = "unix" ; then - TEA_TCL_LINK_LIBS - TEA_MISSING_POSIX_HEADERS - # Let the user call this, because if it triggers, they will - # need a compat/strtod.c that is correct. Users can also - # use Tcl_GetDouble(FromObj) instead. - #TEA_BUGGY_STRTOD - fi -]) - -#------------------------------------------------------------------------ -# TEA_MAKE_LIB -- -# -# Generate a line that can be used to build a shared/unshared library -# in a platform independent manner. -# -# Arguments: -# none -# -# Requires: -# -# Results: -# -# Defines the following vars: -# CFLAGS - Done late here to note disturb other AC macros -# MAKE_LIB - Command to execute to build the Tcl library; -# differs depending on whether or not Tcl is being -# compiled as a shared library. -# MAKE_SHARED_LIB Makefile rule for building a shared library -# MAKE_STATIC_LIB Makefile rule for building a static library -# MAKE_STUB_LIB Makefile rule for building a stub library -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_MAKE_LIB, [ - if test "${TEA_PLATFORM}" = "windows" -a "$GCC" != "yes"; then - MAKE_STATIC_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_OBJECTS)" - MAKE_SHARED_LIB="\${SHLIB_LD} \${SHLIB_LD_LIBS} \${LDFLAGS_DEFAULT} -out:\[$]@ \$(PKG_OBJECTS)" - MAKE_STUB_LIB="\${STLIB_LD} -out:\[$]@ \$(PKG_STUB_OBJECTS)" - else - MAKE_STATIC_LIB="\${STLIB_LD} \[$]@ \$(PKG_OBJECTS)" - MAKE_SHARED_LIB="\${SHLIB_LD} -o \[$]@ \$(PKG_OBJECTS) \${SHLIB_LD_LIBS}" - MAKE_STUB_LIB="\${STLIB_LD} \[$]@ \$(PKG_STUB_OBJECTS)" - fi - - if test "${SHARED_BUILD}" = "1" ; then - MAKE_LIB="${MAKE_SHARED_LIB} " - else - MAKE_LIB="${MAKE_STATIC_LIB} " - fi - - #-------------------------------------------------------------------- - # Shared libraries and static libraries have different names. - # Use the double eval to make sure any variables in the suffix is - # substituted. (@@@ Might not be necessary anymore) - #-------------------------------------------------------------------- - - if test "${TEA_PLATFORM}" = "windows" ; then - if test "${SHARED_BUILD}" = "1" ; then - # We force the unresolved linking of symbols that are really in - # the private libraries of Tcl and Tk. - SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}`\"" - if test x"${TK_BIN_DIR}" != x ; then - SHLIB_LD_LIBS="${SHLIB_LD_LIBS} \"`${CYGPATH} ${TK_BIN_DIR}/${TK_STUB_LIB_FILE}`\"" - fi - eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" - else - eval eval "PKG_LIB_FILE=${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" - fi - # Some packages build there own stubs libraries - eval eval "PKG_STUB_LIB_FILE=${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" - # These aren't needed on Windows (either MSVC or gcc) - RANLIB=: - RANLIB_STUB=: - else - RANLIB_STUB="${RANLIB}" - if test "${SHARED_BUILD}" = "1" ; then - SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TCL_STUB_LIB_SPEC}" - if test x"${TK_BIN_DIR}" != x ; then - SHLIB_LD_LIBS="${SHLIB_LD_LIBS} ${TK_STUB_LIB_SPEC}" - fi - eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${SHARED_LIB_SUFFIX}" - RANLIB=: - else - eval eval "PKG_LIB_FILE=lib${PACKAGE_NAME}${UNSHARED_LIB_SUFFIX}" - fi - # Some packages build there own stubs libraries - eval eval "PKG_STUB_LIB_FILE=lib${PACKAGE_NAME}stub${UNSHARED_LIB_SUFFIX}" - fi - - # These are escaped so that only CFLAGS is picked up at configure time. - # The other values will be substituted at make time. - CFLAGS="${CFLAGS} \${CFLAGS_DEFAULT} \${CFLAGS_WARNING}" - if test "${SHARED_BUILD}" = "1" ; then - CFLAGS="${CFLAGS} \${SHLIB_CFLAGS}" - fi - - AC_SUBST(MAKE_LIB) - AC_SUBST(MAKE_SHARED_LIB) - AC_SUBST(MAKE_STATIC_LIB) - AC_SUBST(MAKE_STUB_LIB) - AC_SUBST(RANLIB_STUB) -]) - -#------------------------------------------------------------------------ -# TEA_LIB_SPEC -- -# -# Compute the name of an existing object library located in libdir -# from the given base name and produce the appropriate linker flags. -# -# Arguments: -# basename The base name of the library without version -# numbers, extensions, or "lib" prefixes. -# extra_dir Extra directory in which to search for the -# library. This location is used first, then -# $prefix/$exec-prefix, then some defaults. -# -# Requires: -# TEA_INIT and TEA_PREFIX must be called first. -# -# Results: -# -# Defines the following vars: -# ${basename}_LIB_NAME The computed library name. -# ${basename}_LIB_SPEC The computed linker flags. -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_LIB_SPEC, [ - AC_MSG_CHECKING([for $1 library]) - - # Look in exec-prefix for the library (defined by TEA_PREFIX). - - tea_lib_name_dir="${exec_prefix}/lib" - - # Or in a user-specified location. - - if test x"$2" != x ; then - tea_extra_lib_dir=$2 - else - tea_extra_lib_dir=NONE - fi - - for i in \ - `ls -dr ${tea_extra_lib_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ - `ls -dr ${tea_extra_lib_dir}/lib$1[[0-9]]* 2>/dev/null ` \ - `ls -dr ${tea_lib_name_dir}/$1[[0-9]]*.lib 2>/dev/null ` \ - `ls -dr ${tea_lib_name_dir}/lib$1[[0-9]]* 2>/dev/null ` \ - `ls -dr /usr/lib/$1[[0-9]]*.lib 2>/dev/null ` \ - `ls -dr /usr/lib/lib$1[[0-9]]* 2>/dev/null ` \ - `ls -dr /usr/local/lib/$1[[0-9]]*.lib 2>/dev/null ` \ - `ls -dr /usr/local/lib/lib$1[[0-9]]* 2>/dev/null ` ; do - if test -f "$i" ; then - tea_lib_name_dir=`dirname $i` - $1_LIB_NAME=`basename $i` - $1_LIB_PATH_NAME=$i - break - fi - done - - if test "${TEA_PLATFORM}" = "windows"; then - $1_LIB_SPEC=\"`${CYGPATH} ${$1_LIB_PATH_NAME} 2>/dev/null`\" - else - # Strip off the leading "lib" and trailing ".a" or ".so" - - tea_lib_name_lib=`echo ${$1_LIB_NAME}|sed -e 's/^lib//' -e 's/\.[[^.]]*$//' -e 's/\.so.*//'` - $1_LIB_SPEC="-L${tea_lib_name_dir} -l${tea_lib_name_lib}" - fi - - if test "x${$1_LIB_NAME}" = x ; then - AC_MSG_ERROR([not found]) - else - AC_MSG_RESULT([${$1_LIB_SPEC}]) - fi -]) - -#------------------------------------------------------------------------ -# TEA_PRIVATE_TCL_HEADERS -- -# -# Locate the private Tcl include files -# -# Arguments: -# -# Requires: -# TCL_SRC_DIR Assumes that TEA_LOAD_TCLCONFIG has -# already been called. -# -# Results: -# -# Substs the following vars: -# TCL_TOP_DIR_NATIVE -# TCL_GENERIC_DIR_NATIVE -# TCL_UNIX_DIR_NATIVE -# TCL_WIN_DIR_NATIVE -# TCL_BMAP_DIR_NATIVE -# TCL_TOOL_DIR_NATIVE -# TCL_PLATFORM_DIR_NATIVE -# TCL_BIN_DIR_NATIVE -# TCL_INCLUDES -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_PRIVATE_TCL_HEADERS, [ - AC_MSG_CHECKING([for Tcl private include files]) - - TCL_SRC_DIR_NATIVE=`${CYGPATH} ${TCL_SRC_DIR}` - TCL_TOP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}\" - TCL_GENERIC_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/generic\" - TCL_UNIX_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/unix\" - TCL_WIN_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/win\" - TCL_BMAP_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/bitmaps\" - TCL_TOOL_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/tools\" - TCL_COMPAT_DIR_NATIVE=\"${TCL_SRC_DIR_NATIVE}/compat\" - - if test "${TEA_PLATFORM}" = "windows"; then - TCL_PLATFORM_DIR_NATIVE=${TCL_WIN_DIR_NATIVE} - else - TCL_PLATFORM_DIR_NATIVE=${TCL_UNIX_DIR_NATIVE} - fi - # We want to ensure these are substituted so as not to require - # any *_NATIVE vars be defined in the Makefile - TCL_INCLUDES="-I${TCL_GENERIC_DIR_NATIVE} -I${TCL_PLATFORM_DIR_NATIVE}" - if test "`uname -s`" = "Darwin"; then - # If Tcl was built as a framework, attempt to use - # the framework's Headers and PrivateHeaders directories - case ${TCL_DEFS} in - *TCL_FRAMEWORK*) - if test -d "${TCL_BIN_DIR}/Headers" -a -d "${TCL_BIN_DIR}/PrivateHeaders"; then - TCL_INCLUDES="-I\"${TCL_BIN_DIR}/Headers\" -I\"${TCL_BIN_DIR}/PrivateHeaders\" ${TCL_INCLUDES}"; else - TCL_INCLUDES="${TCL_INCLUDES} ${TCL_INCLUDE_SPEC} `echo "${TCL_INCLUDE_SPEC}" | sed -e 's/Headers/PrivateHeaders/'`"; fi - ;; - esac - fi - - AC_SUBST(TCL_TOP_DIR_NATIVE) - AC_SUBST(TCL_GENERIC_DIR_NATIVE) - AC_SUBST(TCL_UNIX_DIR_NATIVE) - AC_SUBST(TCL_WIN_DIR_NATIVE) - AC_SUBST(TCL_BMAP_DIR_NATIVE) - AC_SUBST(TCL_TOOL_DIR_NATIVE) - AC_SUBST(TCL_PLATFORM_DIR_NATIVE) - - AC_SUBST(TCL_INCLUDES) - AC_MSG_RESULT([Using srcdir found in tclConfig.sh: ${TCL_SRC_DIR}]) -]) - -#------------------------------------------------------------------------ -# TEA_PUBLIC_TCL_HEADERS -- -# -# Locate the installed public Tcl header files -# -# Arguments: -# None. -# -# Requires: -# CYGPATH must be set -# -# Results: -# -# Adds a --with-tclinclude switch to configure. -# Result is cached. -# -# Substs the following vars: -# TCL_INCLUDES -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_PUBLIC_TCL_HEADERS, [ - AC_MSG_CHECKING([for Tcl public headers]) - - AC_ARG_WITH(tclinclude, [ --with-tclinclude directory containing the public Tcl header files], with_tclinclude=${withval}) - - AC_CACHE_VAL(ac_cv_c_tclh, [ - # Use the value from --with-tclinclude, if it was given - - if test x"${with_tclinclude}" != x ; then - if test -f "${with_tclinclude}/tcl.h" ; then - ac_cv_c_tclh=${with_tclinclude} - else - AC_MSG_ERROR([${with_tclinclude} directory does not contain tcl.h]) - fi - else - # If Tcl was built as a framework, attempt to use - # the framework's Headers directory - case ${TCL_DEFS} in - *TCL_FRAMEWORK*) - list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`" - ;; - *) - list="" - ;; - esac - - # Look in the source dir only if Tcl is not installed, - # and in that situation, look there before installed locations. - if test -f "$TCL_BIN_DIR/Makefile" ; then - list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`" - fi - - # Check order: pkg --prefix location, Tcl's --prefix location, - # relative to directory of tclConfig.sh. - - eval "temp_includedir=${includedir}" - list="$list \ - `ls -d ${temp_includedir} 2>/dev/null` \ - `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ - `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" - if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then - list="$list /usr/local/include /usr/include" - if test x"${TCL_INCLUDE_SPEC}" != x ; then - d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'` - list="$list `ls -d ${d} 2>/dev/null`" - fi - fi - for i in $list ; do - if test -f "$i/tcl.h" ; then - ac_cv_c_tclh=$i - break - fi - done - fi - ]) - - # Print a message based on how we determined the include path - - if test x"${ac_cv_c_tclh}" = x ; then - AC_MSG_ERROR([tcl.h not found. Please specify its location with --with-tclinclude]) - else - AC_MSG_RESULT([${ac_cv_c_tclh}]) - fi - - # Convert to a native path and substitute into the output files. - - INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}` - - TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" - - AC_SUBST(TCL_INCLUDES) -]) - -#------------------------------------------------------------------------ -# TEA_PRIVATE_TK_HEADERS -- -# -# Locate the private Tk include files -# -# Arguments: -# -# Requires: -# TK_SRC_DIR Assumes that TEA_LOAD_TKCONFIG has -# already been called. -# -# Results: -# -# Substs the following vars: -# TK_INCLUDES -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_PRIVATE_TK_HEADERS, [ - AC_MSG_CHECKING([for Tk private include files]) - - TK_SRC_DIR_NATIVE=`${CYGPATH} ${TK_SRC_DIR}` - TK_TOP_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}\" - TK_UNIX_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/unix\" - TK_WIN_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/win\" - TK_GENERIC_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/generic\" - TK_XLIB_DIR_NATIVE=\"${TK_SRC_DIR_NATIVE}/xlib\" - if test "${TEA_PLATFORM}" = "windows"; then - TK_PLATFORM_DIR_NATIVE=${TK_WIN_DIR_NATIVE} - else - TK_PLATFORM_DIR_NATIVE=${TK_UNIX_DIR_NATIVE} - fi - # We want to ensure these are substituted so as not to require - # any *_NATIVE vars be defined in the Makefile - TK_INCLUDES="-I${TK_GENERIC_DIR_NATIVE} -I${TK_PLATFORM_DIR_NATIVE}" - if test "${TEA_WINDOWINGSYSTEM}" = "win32" \ - -o "${TEA_WINDOWINGSYSTEM}" = "aqua"; then - TK_INCLUDES="${TK_INCLUDES} -I${TK_XLIB_DIR_NATIVE}" - fi - if test "${TEA_WINDOWINGSYSTEM}" = "aqua"; then - TK_INCLUDES="${TK_INCLUDES} -I${TK_SRC_DIR_NATIVE}/macosx" - fi - if test "`uname -s`" = "Darwin"; then - # If Tk was built as a framework, attempt to use - # the framework's Headers and PrivateHeaders directories - case ${TK_DEFS} in - *TK_FRAMEWORK*) - if test -d "${TK_BIN_DIR}/Headers" -a -d "${TK_BIN_DIR}/PrivateHeaders"; then - TK_INCLUDES="-I\"${TK_BIN_DIR}/Headers\" -I\"${TK_BIN_DIR}/PrivateHeaders\" ${TK_INCLUDES}"; fi - ;; - esac - fi - - AC_SUBST(TK_TOP_DIR_NATIVE) - AC_SUBST(TK_UNIX_DIR_NATIVE) - AC_SUBST(TK_WIN_DIR_NATIVE) - AC_SUBST(TK_GENERIC_DIR_NATIVE) - AC_SUBST(TK_XLIB_DIR_NATIVE) - AC_SUBST(TK_PLATFORM_DIR_NATIVE) - - AC_SUBST(TK_INCLUDES) - AC_MSG_RESULT([Using srcdir found in tkConfig.sh: ${TK_SRC_DIR}]) -]) - -#------------------------------------------------------------------------ -# TEA_PUBLIC_TK_HEADERS -- -# -# Locate the installed public Tk header files -# -# Arguments: -# None. -# -# Requires: -# CYGPATH must be set -# -# Results: -# -# Adds a --with-tkinclude switch to configure. -# Result is cached. -# -# Substs the following vars: -# TK_INCLUDES -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_PUBLIC_TK_HEADERS, [ - AC_MSG_CHECKING([for Tk public headers]) - - AC_ARG_WITH(tkinclude, [ --with-tkinclude directory containing the public Tk header files.], with_tkinclude=${withval}) - - AC_CACHE_VAL(ac_cv_c_tkh, [ - # Use the value from --with-tkinclude, if it was given - - if test x"${with_tkinclude}" != x ; then - if test -f "${with_tkinclude}/tk.h" ; then - ac_cv_c_tkh=${with_tkinclude} - else - AC_MSG_ERROR([${with_tkinclude} directory does not contain tk.h]) - fi - else - # If Tk was built as a framework, attempt to use - # the framework's Headers directory. - case ${TK_DEFS} in - *TK_FRAMEWORK*) - list="`ls -d ${TK_BIN_DIR}/Headers 2>/dev/null`" - ;; - *) - list="" - ;; - esac - - # Look in the source dir only if Tk is not installed, - # and in that situation, look there before installed locations. - if test -f "$TK_BIN_DIR/Makefile" ; then - list="$list `ls -d ${TK_SRC_DIR}/generic 2>/dev/null`" - fi - - # Check order: pkg --prefix location, Tk's --prefix location, - # relative to directory of tkConfig.sh, Tcl's --prefix location, - # relative to directory of tclConfig.sh. - - eval "temp_includedir=${includedir}" - list="$list \ - `ls -d ${temp_includedir} 2>/dev/null` \ - `ls -d ${TK_PREFIX}/include 2>/dev/null` \ - `ls -d ${TK_BIN_DIR}/../include 2>/dev/null` \ - `ls -d ${TCL_PREFIX}/include 2>/dev/null` \ - `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`" - if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then - list="$list /usr/local/include /usr/include" - fi - for i in $list ; do - if test -f "$i/tk.h" ; then - ac_cv_c_tkh=$i - break - fi - done - fi - ]) - - # Print a message based on how we determined the include path - - if test x"${ac_cv_c_tkh}" = x ; then - AC_MSG_ERROR([tk.h not found. Please specify its location with --with-tkinclude]) - else - AC_MSG_RESULT([${ac_cv_c_tkh}]) - fi - - # Convert to a native path and substitute into the output files. - - INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tkh}` - - TK_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" - - AC_SUBST(TK_INCLUDES) - - if test "${TEA_WINDOWINGSYSTEM}" = "win32" \ - -o "${TEA_WINDOWINGSYSTEM}" = "aqua"; then - # On Windows and Aqua, we need the X compat headers - AC_MSG_CHECKING([for X11 header files]) - if test ! -r "${INCLUDE_DIR_NATIVE}/X11/Xlib.h"; then - INCLUDE_DIR_NATIVE="`${CYGPATH} ${TK_SRC_DIR}/xlib`" - TK_XINCLUDES=-I\"${INCLUDE_DIR_NATIVE}\" - AC_SUBST(TK_XINCLUDES) - fi - AC_MSG_RESULT([${INCLUDE_DIR_NATIVE}]) - fi -]) - -#------------------------------------------------------------------------ -# TEA_PROG_TCLSH -# Determine the fully qualified path name of the tclsh executable -# in the Tcl build directory or the tclsh installed in a bin -# directory. This macro will correctly determine the name -# of the tclsh executable even if tclsh has not yet been -# built in the build directory. The tclsh found is always -# associated with a tclConfig.sh file. This tclsh should be used -# only for running extension test cases. It should never be -# or generation of files (like pkgIndex.tcl) at build time. -# -# Arguments -# none -# -# Results -# Subst's the following values: -# TCLSH_PROG -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_PROG_TCLSH, [ - AC_MSG_CHECKING([for tclsh]) - if test -f "${TCL_BIN_DIR}/Makefile" ; then - # tclConfig.sh is in Tcl build directory - if test "${TEA_PLATFORM}" = "windows"; then - TCLSH_PROG="${TCL_BIN_DIR}/tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" - else - TCLSH_PROG="${TCL_BIN_DIR}/tclsh" - fi - else - # tclConfig.sh is in install location - if test "${TEA_PLATFORM}" = "windows"; then - TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}${TCL_MINOR_VERSION}${TCL_DBGX}${EXEEXT}" - else - TCLSH_PROG="tclsh${TCL_MAJOR_VERSION}.${TCL_MINOR_VERSION}${TCL_DBGX}" - fi - list="`ls -d ${TCL_PREFIX}/bin 2>/dev/null` \ - `ls -d ${TCL_BIN_DIR}/../bin 2>/dev/null`" - for i in $list ; do - if test -f "$i/${TCLSH_PROG}" ; then - REAL_TCL_BIN_DIR="`cd "$i"; pwd`" - break - fi - done - TCLSH_PROG="${REAL_TCL_BIN_DIR}/${TCLSH_PROG}" - fi - AC_MSG_RESULT(${TCLSH_PROG}) - AC_SUBST(TCLSH_PROG) -]) - -#------------------------------------------------------------------------ -# TEA_PROG_WISH -# Determine the fully qualified path name of the wish executable -# in the Tk build directory or the wish installed in a bin -# directory. This macro will correctly determine the name -# of the wish executable even if wish has not yet been -# built in the build directory. The wish found is always -# associated with a tkConfig.sh file. This wish should be used -# only for running extension test cases. It should never be -# or generation of files (like pkgIndex.tcl) at build time. -# -# Arguments -# none -# -# Results -# Subst's the following values: -# WISH_PROG -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_PROG_WISH, [ - AC_MSG_CHECKING([for wish]) - if test -f "${TK_BIN_DIR}/Makefile" ; then - # tkConfig.sh is in Tk build directory - if test "${TEA_PLATFORM}" = "windows"; then - WISH_PROG="${TK_BIN_DIR}/wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" - else - WISH_PROG="${TK_BIN_DIR}/wish" - fi - else - # tkConfig.sh is in install location - if test "${TEA_PLATFORM}" = "windows"; then - WISH_PROG="wish${TK_MAJOR_VERSION}${TK_MINOR_VERSION}${TK_DBGX}${EXEEXT}" - else - WISH_PROG="wish${TK_MAJOR_VERSION}.${TK_MINOR_VERSION}${TK_DBGX}" - fi - list="`ls -d ${TK_PREFIX}/bin 2>/dev/null` \ - `ls -d ${TK_BIN_DIR}/../bin 2>/dev/null`" - for i in $list ; do - if test -f "$i/${WISH_PROG}" ; then - REAL_TK_BIN_DIR="`cd "$i"; pwd`" - break - fi - done - WISH_PROG="${REAL_TK_BIN_DIR}/${WISH_PROG}" - fi - AC_MSG_RESULT(${WISH_PROG}) - AC_SUBST(WISH_PROG) -]) - -#------------------------------------------------------------------------ -# TEA_PATH_CONFIG -- -# -# Locate the ${1}Config.sh file and perform a sanity check on -# the ${1} compile flags. These are used by packages like -# [incr Tk] that load *Config.sh files from more than Tcl and Tk. -# -# Arguments: -# none -# -# Results: -# -# Adds the following arguments to configure: -# --with-$1=... -# -# Defines the following vars: -# $1_BIN_DIR Full path to the directory containing -# the $1Config.sh file -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_PATH_CONFIG, [ - # - # Ok, lets find the $1 configuration - # First, look for one uninstalled. - # the alternative search directory is invoked by --with-$1 - # - - if test x"${no_$1}" = x ; then - # we reset no_$1 in case something fails here - no_$1=true - AC_ARG_WITH($1, [ --with-$1 directory containing $1 configuration ($1Config.sh)], with_$1config=${withval}) - AC_MSG_CHECKING([for $1 configuration]) - AC_CACHE_VAL(ac_cv_c_$1config,[ - - # First check to see if --with-$1 was specified. - if test x"${with_$1config}" != x ; then - case ${with_$1config} in - */$1Config.sh ) - if test -f ${with_$1config}; then - AC_MSG_WARN([--with-$1 argument should refer to directory containing $1Config.sh, not to $1Config.sh itself]) - with_$1config=`echo ${with_$1config} | sed 's!/$1Config\.sh$!!'` - fi;; - esac - if test -f "${with_$1config}/$1Config.sh" ; then - ac_cv_c_$1config=`(cd ${with_$1config}; pwd)` - else - AC_MSG_ERROR([${with_$1config} directory doesn't contain $1Config.sh]) - fi - fi - - # then check for a private $1 installation - if test x"${ac_cv_c_$1config}" = x ; then - for i in \ - ../$1 \ - `ls -dr ../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ - `ls -dr ../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ - `ls -dr ../$1*[[0-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ - ../../$1 \ - `ls -dr ../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ - `ls -dr ../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ - `ls -dr ../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ - ../../../$1 \ - `ls -dr ../../../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ - `ls -dr ../../../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ - `ls -dr ../../../$1*[[0-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ../../../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ - ${srcdir}/../$1 \ - `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]*.[[0-9]]* 2>/dev/null` \ - `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]][[0-9]] 2>/dev/null` \ - `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]] 2>/dev/null` \ - `ls -dr ${srcdir}/../$1*[[0-9]].[[0-9]]* 2>/dev/null` \ - ; do - if test -f "$i/$1Config.sh" ; then - ac_cv_c_$1config=`(cd $i; pwd)` - break - fi - if test -f "$i/unix/$1Config.sh" ; then - ac_cv_c_$1config=`(cd $i/unix; pwd)` - break - fi - done - fi - - # check in a few common install locations - if test x"${ac_cv_c_$1config}" = x ; then - for i in `ls -d ${libdir} 2>/dev/null` \ - `ls -d ${exec_prefix}/lib 2>/dev/null` \ - `ls -d ${prefix}/lib 2>/dev/null` \ - `ls -d /usr/local/lib 2>/dev/null` \ - `ls -d /usr/contrib/lib 2>/dev/null` \ - `ls -d /usr/lib 2>/dev/null` \ - ; do - if test -f "$i/$1Config.sh" ; then - ac_cv_c_$1config=`(cd $i; pwd)` - break - fi - done - fi - ]) - - if test x"${ac_cv_c_$1config}" = x ; then - $1_BIN_DIR="# no $1 configs found" - AC_MSG_WARN("Cannot find $1 configuration definitions") - exit 0 - else - no_$1= - $1_BIN_DIR=${ac_cv_c_$1config} - AC_MSG_RESULT([found $$1_BIN_DIR/$1Config.sh]) - fi - fi -]) - -#------------------------------------------------------------------------ -# TEA_LOAD_CONFIG -- -# -# Load the $1Config.sh file -# -# Arguments: -# -# Requires the following vars to be set: -# $1_BIN_DIR -# -# Results: -# -# Subst the following vars: -# $1_SRC_DIR -# $1_LIB_FILE -# $1_LIB_SPEC -# -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_LOAD_CONFIG, [ - AC_MSG_CHECKING([for existence of ${$1_BIN_DIR}/$1Config.sh]) - - if test -f "${$1_BIN_DIR}/$1Config.sh" ; then - AC_MSG_RESULT([loading]) - . ${$1_BIN_DIR}/$1Config.sh - else - AC_MSG_RESULT([file not found]) - fi - - # - # If the $1_BIN_DIR is the build directory (not the install directory), - # then set the common variable name to the value of the build variables. - # For example, the variable $1_LIB_SPEC will be set to the value - # of $1_BUILD_LIB_SPEC. An extension should make use of $1_LIB_SPEC - # instead of $1_BUILD_LIB_SPEC since it will work with both an - # installed and uninstalled version of Tcl. - # - - if test -f ${$1_BIN_DIR}/Makefile ; then - AC_MSG_WARN([Found Makefile - using build library specs for $1]) - $1_LIB_SPEC=${$1_BUILD_LIB_SPEC} - $1_STUB_LIB_SPEC=${$1_BUILD_STUB_LIB_SPEC} - $1_STUB_LIB_PATH=${$1_BUILD_STUB_LIB_PATH} - fi - - AC_SUBST($1_VERSION) - AC_SUBST($1_BIN_DIR) - AC_SUBST($1_SRC_DIR) - - AC_SUBST($1_LIB_FILE) - AC_SUBST($1_LIB_SPEC) - - AC_SUBST($1_STUB_LIB_FILE) - AC_SUBST($1_STUB_LIB_SPEC) - AC_SUBST($1_STUB_LIB_PATH) -]) - -#------------------------------------------------------------------------ -# TEA_PATH_CELIB -- -# -# Locate Keuchel's celib emulation layer for targeting Win/CE -# -# Arguments: -# none -# -# Results: -# -# Adds the following arguments to configure: -# --with-celib=... -# -# Defines the following vars: -# CELIB_DIR Full path to the directory containing -# the include and platform lib files -#------------------------------------------------------------------------ - -AC_DEFUN(TEA_PATH_CELIB, [ - # First, look for one uninstalled. - # the alternative search directory is invoked by --with-celib - - if test x"${no_celib}" = x ; then - # we reset no_celib in case something fails here - no_celib=true - AC_ARG_WITH(celib,[ --with-celib=DIR use Windows/CE support library from DIR], with_celibconfig=${withval}) - AC_MSG_CHECKING([for Windows/CE celib directory]) - AC_CACHE_VAL(ac_cv_c_celibconfig,[ - # First check to see if --with-celibconfig was specified. - if test x"${with_celibconfig}" != x ; then - if test -d "${with_celibconfig}/inc" ; then - ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` - else - AC_MSG_ERROR([${with_celibconfig} directory doesn't contain inc directory]) - fi - fi - - # then check for a celib library - if test x"${ac_cv_c_celibconfig}" = x ; then - for i in \ - ../celib-palm-3.0 \ - ../celib \ - ../../celib-palm-3.0 \ - ../../celib \ - `ls -dr ../celib-*3.[[0-9]]* 2>/dev/null` \ - ${srcdir}/../celib-palm-3.0 \ - ${srcdir}/../celib \ - `ls -dr ${srcdir}/../celib-*3.[[0-9]]* 2>/dev/null` \ - ; do - if test -d "$i/inc" ; then - ac_cv_c_celibconfig=`(cd $i; pwd)` - break - fi - done - fi - ]) - if test x"${ac_cv_c_celibconfig}" = x ; then - AC_MSG_ERROR([Cannot find celib support library directory]) - else - no_celib= - CELIB_DIR=${ac_cv_c_celibconfig} - CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'` - AC_MSG_RESULT([found $CELIB_DIR]) - fi - fi -]) diff --git a/ng/Togl-1.7/texture.c b/ng/Togl-1.7/texture.c deleted file mode 100644 index 6a6f39f9..00000000 --- a/ng/Togl-1.7/texture.c +++ /dev/null @@ -1,608 +0,0 @@ -/* $Id: texture.c,v 1.10 2005/04/23 07:49:14 gregcouch Exp $ */ - -/* - * Togl - a Tk OpenGL widget - * Copyright (C) 1996-1997 Brian Paul and Ben Bederson - * See the LICENSE file for copyright details. - */ - - -/* - * An example Togl program demonstrating texture mapping - */ - - -#include "togl.h" -#include -#include -#if defined(TOGL_AGL) || defined(TOGL_AGL_CLASSIC) -# include -#else -# include -#endif -#include "image.h" - - -/* - * The following variable is a special hack that is needed in order for - * Sun shared libraries to be used for Tcl. - */ -#ifdef SUN -extern int matherr(); -int *tclDummyMathPtr = (int *) matherr; -#endif - -#define CHECKER 0 -#define FACE 1 -#define TREE 2 - - -static GLenum minfilter = GL_NEAREST_MIPMAP_LINEAR; -static GLenum magfilter = GL_LINEAR; -static GLenum swrap = GL_REPEAT; -static GLenum twrap = GL_REPEAT; -static GLenum envmode = GL_MODULATE; -static GLubyte polycolor[4] = { 255, 255, 255, 255 }; -static int image = CHECKER; -static GLfloat coord_scale = 1.0; -static GLfloat xrot = 0.0; -static GLfloat yrot = 0.0; -static GLfloat scale = 1.0; - -static GLint width, height; - -static GLboolean blend = GL_FALSE; - - -/* - * Load a texture image. n is one of CHECKER, FACE or TREE. - */ -void -texture_image(int n) -{ - if (n == CHECKER) { -#define WIDTH 64 -#define HEIGHT 64 - GLubyte teximage[WIDTH * HEIGHT][4]; - int i, j; - - for (i = 0; i < HEIGHT; i++) { - for (j = 0; j < WIDTH; j++) { - GLubyte value; - - value = ((i / 4 + j / 4) % 2) ? 0xff : 0x00; - teximage[i * WIDTH + j][0] = value; - teximage[i * WIDTH + j][1] = value; - teximage[i * WIDTH + j][2] = value; - teximage[i * WIDTH + j][3] = value; - } - } - - glEnable(GL_TEXTURE_2D); - gluBuild2DMipmaps(GL_TEXTURE_2D, 4, WIDTH, HEIGHT, - GL_RGBA, GL_UNSIGNED_BYTE, teximage); - blend = GL_FALSE; - -#undef WIDTH -#undef HEIGHT - } else if (n == FACE) { - TK_RGBImageRec *img = tkRGBImageLoad("ben.rgb"); - - if (img) { - glEnable(GL_TEXTURE_2D); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - gluBuild2DMipmaps(GL_TEXTURE_2D, img->sizeZ, img->sizeX, img->sizeY, - img->sizeZ == 3 ? GL_RGB : GL_RGBA, - GL_UNSIGNED_BYTE, img->data); - - blend = GL_TRUE; - } - } else if (n == TREE) { - TK_RGBImageRec *img = tkRGBImageLoad("tree2.rgba"); - - if (img) { - glEnable(GL_TEXTURE_2D); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - gluBuild2DMipmaps(GL_TEXTURE_2D, img->sizeZ, img->sizeX, img->sizeY, - img->sizeZ == 3 ? GL_RGB : GL_RGBA, - GL_UNSIGNED_BYTE, img->data); - - blend = GL_TRUE; - } - } else { - abort(); - } -} - - -/* - * Togl widget create callback. This is called by Tcl/Tk when the widget has - * been realized. Here's where one may do some one-time context setup or - * initializations. - */ -void -create_cb(Togl *togl) -{ - glEnable(GL_DEPTH_TEST); /* Enable depth buffering */ - - texture_image(CHECKER); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magfilter); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilter); -} - - -/* - * Togl widget reshape callback. This is called by Tcl/Tk when the widget - * has been resized. Typically, we call glViewport and perhaps setup the - * projection matrix. - */ -void -reshape_cb(Togl *togl) -{ - width = Togl_Width(togl); - height = Togl_Height(togl); - - glViewport(0, 0, width, height); - -} - - -static void -check_error(char *where) -{ - GLenum error; - - while (1) { - error = glGetError(); - if (error == GL_NO_ERROR) { - break; - } - printf("OpenGL error near %s: %s\n", where, gluErrorString(error)); - } -} - - - -/* - * Togl widget display callback. This is called by Tcl/Tk when the widget's - * contents have to be redrawn. Typically, we clear the color and depth - * buffers, render our objects, then swap the front/back color buffers. - */ -void -display_cb(Togl *togl) -{ - float aspect = (float) width / (float) height; - - check_error("begin display\n"); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - /* Draw background image */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - glDisable(GL_TEXTURE_2D); - glDisable(GL_DEPTH_TEST); - glBegin(GL_POLYGON); - glColor3f(0.0, 0.0, 0.3); - glVertex2f(-1.0, -1.0); - glColor3f(0.0, 0.0, 0.3); - glVertex2f(1.0, -1.0); - glColor3f(0.0, 0.0, 0.9); - glVertex2f(1.0, 1.0); - glColor3f(0.0, 0.0, 0.9); - glVertex2f(-1.0, 1.0); - glEnd(); - - /* draw textured object */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-aspect, aspect, -1.0, 1.0, 2.0, 10.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0, 0.0, -5.0); - glScalef(scale, scale, scale); - glRotatef(yrot, 0.0, 1.0, 0.0); - glRotatef(xrot, 1.0, 0.0, 0.0); - - glEnable(GL_DEPTH_TEST); - glEnable(GL_TEXTURE_2D); - glColor4ubv(polycolor); - - if (blend) { - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); - } - - glBegin(GL_POLYGON); - glTexCoord2f(0.0, 0.0); - glVertex2f(-1.0, -1.0); - glTexCoord2f(coord_scale, 0.0); - glVertex2f(1.0, -1.0); - glTexCoord2f(coord_scale, coord_scale); - glVertex2f(1.0, 1.0); - glTexCoord2f(0.0, coord_scale); - glVertex2f(-1.0, 1.0); - glEnd(); - - glDisable(GL_BLEND); - - Togl_SwapBuffers(togl); -} - - -/* - * Called when a magnification filter radio button is pressed. - */ -int -magfilter_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - if (strcmp(argv[2], "GL_NEAREST") == 0) { - magfilter = GL_NEAREST; - } else if (strcmp(argv[2], "GL_LINEAR") == 0) { - magfilter = GL_LINEAR; - } else { - Tcl_SetResult(interp, "unknown magnification filter type", TCL_STATIC); - return TCL_ERROR; - } - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magfilter); - Togl_PostRedisplay(togl); - - return TCL_OK; -} - - -/* - * Called when a minification filter radio button is pressed. - */ -int -minfilter_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - if (strcmp(argv[2], "GL_NEAREST") == 0) { - minfilter = GL_NEAREST; - } else if (strcmp(argv[2], "GL_LINEAR") == 0) { - minfilter = GL_LINEAR; - } else if (strcmp(argv[2], "GL_NEAREST_MIPMAP_NEAREST") == 0) { - minfilter = GL_NEAREST_MIPMAP_NEAREST; - } else if (strcmp(argv[2], "GL_LINEAR_MIPMAP_NEAREST") == 0) { - minfilter = GL_LINEAR_MIPMAP_NEAREST; - } else if (strcmp(argv[2], "GL_NEAREST_MIPMAP_LINEAR") == 0) { - minfilter = GL_NEAREST_MIPMAP_LINEAR; - } else if (strcmp(argv[2], "GL_LINEAR_MIPMAP_LINEAR") == 0) { - minfilter = GL_LINEAR_MIPMAP_LINEAR; - } else { - Tcl_SetResult(interp, "unknown minification filter type", TCL_STATIC); - return TCL_ERROR; - } - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilter); - Togl_PostRedisplay(togl); - - return TCL_OK; -} - - -int -xrot_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName setXrot ?angle?\"", - TCL_STATIC); - return TCL_ERROR; - } - - xrot = atof(argv[2]); - - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -int -yrot_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName setYrot ?angle?\"", - TCL_STATIC); - return TCL_ERROR; - } - - yrot = atof(argv[2]); - - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -int -scale_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName scale ?value?\"", - TCL_STATIC); - return TCL_ERROR; - } - - scale = atof(argv[2]); - - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -/* - * Called when S texture coordinate wrapping is changed. - */ -int -swrap_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName swrap ?mode?\"", - TCL_STATIC); - return TCL_ERROR; - } - - if (strcmp(argv[2], "GL_CLAMP") == 0) { - swrap = GL_CLAMP; - } else if (strcmp(argv[2], "GL_REPEAT") == 0) { - swrap = GL_REPEAT; - } else { - Tcl_SetResult(interp, "unknown wrap value", TCL_STATIC); - return TCL_ERROR; - } - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, swrap); - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -/* - * Called when T texture coordinate wrapping is changed. - */ -int -twrap_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName twrap ?mode?\"", - TCL_STATIC); - return TCL_ERROR; - } - - if (strcmp(argv[2], "GL_CLAMP") == 0) { - twrap = GL_CLAMP; - } else if (strcmp(argv[2], "GL_REPEAT") == 0) { - twrap = GL_REPEAT; - } else { - Tcl_SetResult(interp, "unknown wrap value", TCL_STATIC); - return TCL_ERROR; - } - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, twrap); - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -/* - * Called when the texture environment mode is changed. - */ -int -envmode_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName envmode ?mode?\"", - TCL_STATIC); - return TCL_ERROR; - } - - if (strcmp(argv[2], "GL_MODULATE") == 0) { - envmode = GL_MODULATE; - } else if (strcmp(argv[2], "GL_DECAL") == 0) { - envmode = GL_DECAL; - } else if (strcmp(argv[2], "GL_BLEND") == 0) { - envmode = GL_BLEND; - } else { - Tcl_SetResult(interp, "unknown texture env mode", TCL_STATIC); - return TCL_ERROR; - } - - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, envmode); - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -/* - * Called when the polygon color is changed. - */ -int -polycolor_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 5) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName polycolor ?r? ?g? ?b?\"", - TCL_STATIC); - return TCL_ERROR; - } - - polycolor[0] = atoi(argv[2]); - polycolor[1] = atoi(argv[3]); - polycolor[2] = atoi(argv[4]); - - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -/* - * Called when the texture image is to be changed - */ -int -image_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName image ?name?\"", - TCL_STATIC); - return TCL_ERROR; - } - - if (strcmp(argv[2], "CHECKER") == 0) { - texture_image(CHECKER); - } else if (strcmp(argv[2], "FACE") == 0) { - texture_image(FACE); - } else if (strcmp(argv[2], "TREE") == 0) { - texture_image(TREE); - } else { - Tcl_SetResult(interp, "unknown texture image", TCL_STATIC); - return TCL_ERROR; - } - - Togl_PostRedisplay(togl); - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -/* - * Called when the texture coordinate scale is changed. - */ -int -coord_scale_cb(Togl *togl, int argc, CONST84 char *argv[]) -{ - Tcl_Interp *interp = Togl_Interp(togl); - float s; - - /* error checking */ - if (argc != 3) { - Tcl_SetResult(interp, - "wrong # args: should be \"pathName coord_scale ?scale?\"", - TCL_STATIC); - return TCL_ERROR; - } - - s = atof(argv[2]); - if (s > 0.0 && s < 10.0) { - coord_scale = s; - Togl_PostRedisplay(togl); - } - - /* Let result string equal value */ - strcpy(interp->result, argv[2]); - return TCL_OK; -} - - -TOGL_EXTERN int -Texture_Init(Tcl_Interp *interp) -{ - /* - * Initialize Tcl, Tk, and the Togl widget module. - */ -#ifdef USE_TCL_STUBS - if (Tcl_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif -#ifdef USE_TK_STUBS - if (Tk_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif - - if (Togl_Init(interp) == TCL_ERROR) { - return TCL_ERROR; - } - - /* - * Specify the C callback functions for widget creation, display, - * and reshape. - */ - Togl_CreateFunc(create_cb); - Togl_DisplayFunc(display_cb); - Togl_ReshapeFunc(reshape_cb); - - /* - * Make a new Togl widget command so the Tcl code can set a C variable. - */ - Togl_CreateCommand("min_filter", minfilter_cb); - Togl_CreateCommand("mag_filter", magfilter_cb); - Togl_CreateCommand("xrot", xrot_cb); - Togl_CreateCommand("yrot", yrot_cb); - Togl_CreateCommand("scale", scale_cb); - Togl_CreateCommand("swrap", swrap_cb); - Togl_CreateCommand("twrap", twrap_cb); - Togl_CreateCommand("envmode", envmode_cb); - Togl_CreateCommand("polycolor", polycolor_cb); - Togl_CreateCommand("image", image_cb); - Togl_CreateCommand("coord_scale", coord_scale_cb); - - /* - * Call Tcl_CreateCommand for application-specific commands, if - * they weren't already created by the init procedures called above. - */ - - return TCL_OK; -} diff --git a/ng/Togl-1.7/texture.tcl b/ng/Togl-1.7/texture.tcl deleted file mode 100644 index 6333c069..00000000 --- a/ng/Togl-1.7/texture.tcl +++ /dev/null @@ -1,283 +0,0 @@ -#!/bin/sh -# the next line restarts using wish \ -exec wish "$0" "$@" - -# $Id: texture.tcl,v 1.5 2001/12/20 13:59:31 beskow Exp $ - -# Togl - a Tk OpenGL widget -# Copyright (C) 1996 Brian Paul and Ben Bederson -# See the LICENSE file for copyright details. - - -# $Log: texture.tcl,v $ -# Revision 1.5 2001/12/20 13:59:31 beskow -# Improved error-handling in togl.c in case of window creation failure -# Added pkgIndex target to makefile -# Updated documentation to reflect stubs-interface (Togl.html + new README.stubs) -# Added tk8.4a3 headers -# Removed obsolete Tk internal headers -# -# Revision 1.4 2001/01/29 18:11:53 brianp -# Jonas Beskow's changes to use Tcl/Tk stub interface -# -# Revision 1.3 1998/01/24 14:05:50 brianp -# added quit button (Ben Bederson) -# -# Revision 1.2 1997/09/30 23:54:46 brianp -# new layout -# -# Revision 1.1 1996/10/23 23:18:36 brianp -# Initial revision -# - - -# Togl texture map demo - -load [file dirname [info script]]/texture[info sharedlibextension] - - -# Called magnification filter changes -proc new_magfilter {} { - global magfilter - .f1.view mag_filter $magfilter -} - - -# Called minification filter changes -proc new_minfilter {} { - global minfilter - .f1.view min_filter $minfilter -} - - -# Called when texture image radio button changes -proc new_image {} { - global teximage - .f1.view image $teximage -} - - -# Called when texture S wrap button changes -proc new_swrap {} { - global swrap - .f1.view swrap $swrap -} - - -# Called when texture T wrap button changes -proc new_twrap {} { - global twrap - .f1.view twrap $twrap -} - - -# Called when texture environment radio button selected -proc new_env {} { - global envmode - .f1.view envmode $envmode -} - - -# Called when polygon color sliders change -proc new_color { foo } { - global poly_red poly_green poly_blue - .f1.view polycolor $poly_red $poly_green $poly_blue -} - - -proc new_coord_scale { name element op } { - global coord_scale - .f1.view coord_scale $coord_scale -} - - - - -# Make the widgets -proc setup {} { - global magfilter - global minfilter - global teximage - global swrap - global twrap - global envmode - global poly_red - global poly_green - global poly_blue - global coord_scale - global startx starty # location of mouse when button pressed - global xangle yangle - global xangle0 yangle0 - global scale scale0 - - wm title . "Texture Map Options" - - ### Two frames: top half and bottom half - frame .f1 - frame .f2 - - ### The OpenGL window - togl .f1.view -width 250 -height 250 -rgba true -double true -depth true - - - ### Filter radio buttons - frame .f1.filter -relief ridge -borderwidth 3 - - frame .f1.filter.mag -relief ridge -borderwidth 2 - - label .f1.filter.mag.label -text "Magnification Filter" -anchor w - radiobutton .f1.filter.mag.nearest -text GL_NEAREST -anchor w -variable magfilter -value GL_NEAREST -command new_magfilter - radiobutton .f1.filter.mag.linear -text GL_LINEAR -anchor w -variable magfilter -value GL_LINEAR -command new_magfilter - - frame .f1.filter.min -relief ridge -borderwidth 2 - - label .f1.filter.min.label -text "Minification Filter" -anchor w - radiobutton .f1.filter.min.nearest -text GL_NEAREST -anchor w -variable minfilter -value GL_NEAREST -command new_minfilter - radiobutton .f1.filter.min.linear -text GL_LINEAR -anchor w -variable minfilter -value GL_LINEAR -command new_minfilter - radiobutton .f1.filter.min.nearest_mipmap_nearest -text GL_NEAREST_MIPMAP_NEAREST -anchor w -variable minfilter -value GL_NEAREST_MIPMAP_NEAREST -command new_minfilter - radiobutton .f1.filter.min.linear_mipmap_nearest -text GL_LINEAR_MIPMAP_NEAREST -anchor w -variable minfilter -value GL_LINEAR_MIPMAP_NEAREST -command new_minfilter - radiobutton .f1.filter.min.nearest_mipmap_linear -text GL_NEAREST_MIPMAP_LINEAR -anchor w -variable minfilter -value GL_NEAREST_MIPMAP_LINEAR -command new_minfilter - radiobutton .f1.filter.min.linear_mipmap_linear -text GL_LINEAR_MIPMAP_LINEAR -anchor w -variable minfilter -value GL_LINEAR_MIPMAP_LINEAR -command new_minfilter - - pack .f1.filter.mag -fill x - pack .f1.filter.mag.label -fill x - pack .f1.filter.mag.nearest -side top -fill x - pack .f1.filter.mag.linear -side top -fill x - - pack .f1.filter.min -fill both -expand true - pack .f1.filter.min.label -side top -fill x - pack .f1.filter.min.nearest -side top -fill x - pack .f1.filter.min.linear -side top -fill x - pack .f1.filter.min.nearest_mipmap_nearest -side top -fill x - pack .f1.filter.min.linear_mipmap_nearest -side top -fill x - pack .f1.filter.min.nearest_mipmap_linear -side top -fill x - pack .f1.filter.min.linear_mipmap_linear -side top -fill x - - - ### Texture coordinate scale and wrapping - frame .f2.coord -relief ridge -borderwidth 3 - frame .f2.coord.scale -relief ridge -borderwidth 2 - label .f2.coord.scale.label -text "Max Texture Coord" -anchor w - entry .f2.coord.scale.entry -textvariable coord_scale - trace variable coord_scale w new_coord_scale - - frame .f2.coord.s -relief ridge -borderwidth 2 - label .f2.coord.s.label -text "GL_TEXTURE_WRAP_S" -anchor w - radiobutton .f2.coord.s.repeat -text "GL_REPEAT" -anchor w -variable swrap -value GL_REPEAT -command new_swrap - radiobutton .f2.coord.s.clamp -text "GL_CLAMP" -anchor w -variable swrap -value GL_CLAMP -command new_swrap - - frame .f2.coord.t -relief ridge -borderwidth 2 - label .f2.coord.t.label -text "GL_TEXTURE_WRAP_T" -anchor w - radiobutton .f2.coord.t.repeat -text "GL_REPEAT" -anchor w -variable twrap -value GL_REPEAT -command new_twrap - radiobutton .f2.coord.t.clamp -text "GL_CLAMP" -anchor w -variable twrap -value GL_CLAMP -command new_twrap - - pack .f2.coord.scale -fill both -expand true - pack .f2.coord.scale.label -side top -fill x - pack .f2.coord.scale.entry -side top -fill x - - pack .f2.coord.s -fill x - pack .f2.coord.s.label -side top -fill x - pack .f2.coord.s.repeat -side top -fill x - pack .f2.coord.s.clamp -side top -fill x - - pack .f2.coord.t -fill x - pack .f2.coord.t.label -side top -fill x - pack .f2.coord.t.repeat -side top -fill x - pack .f2.coord.t.clamp -side top -fill x - - - ### Texture image radio buttons (just happens to fit into the coord frame) - frame .f2.env -relief ridge -borderwidth 3 - frame .f2.env.image -relief ridge -borderwidth 2 - label .f2.env.image.label -text "Texture Image" -anchor w - radiobutton .f2.env.image.checker -text "Checker" -anchor w -variable teximage -value CHECKER -command new_image - radiobutton .f2.env.image.tree -text "Tree" -anchor w -variable teximage -value TREE -command new_image - radiobutton .f2.env.image.face -text "Face" -anchor w -variable teximage -value FACE -command new_image - pack .f2.env.image -fill x - pack .f2.env.image.label -side top -fill x - pack .f2.env.image.checker -side top -fill x - pack .f2.env.image.tree -side top -fill x - pack .f2.env.image.face -side top -fill x - - - ### Texture Environment - label .f2.env.label -text "GL_TEXTURE_ENV_MODE" -anchor w - radiobutton .f2.env.modulate -text "GL_MODULATE" -anchor w -variable envmode -value GL_MODULATE -command new_env - radiobutton .f2.env.decal -text "GL_DECAL" -anchor w -variable envmode -value GL_DECAL -command new_env - radiobutton .f2.env.blend -text "GL_BLEND" -anchor w -variable envmode -value GL_BLEND -command new_env - pack .f2.env.label -fill x - pack .f2.env.modulate -side top -fill x - pack .f2.env.decal -side top -fill x - pack .f2.env.blend -side top -fill x - - ### Polygon color - frame .f2.color -relief ridge -borderwidth 3 - label .f2.color.label -text "Polygon color" -anchor w - scale .f2.color.red -label Red -from 0 -to 255 -orient horizontal -variable poly_red -command new_color - scale .f2.color.green -label Green -from 0 -to 255 -orient horizontal -variable poly_green -command new_color - scale .f2.color.blue -label Blue -from 0 -to 255 -orient horizontal -variable poly_blue -command new_color - pack .f2.color.label -fill x - pack .f2.color.red -side top -fill x - pack .f2.color.green -side top -fill x - pack .f2.color.blue -side top -fill x - - - ### Main widgets - pack .f1.view -side left -fill both -expand true - pack .f1.filter -side left -fill y - pack .f1 -side top -fill both -expand true - - pack .f2.coord .f2.env -side left -fill both - pack .f2.color -fill x - pack .f2 -side top -fill x - - button .btn -text Quit -command exit - pack .btn -expand true -fill both - - bind .f1.view { - set startx %x - set starty %y - set xangle0 $xangle - set yangle0 $yangle - } - - bind .f1.view { - set xangle [expr $xangle0 + (%x - $startx) / 3.0 ] - set yangle [expr $yangle0 + (%y - $starty) / 3.0 ] - .f1.view yrot $xangle - .f1.view xrot $yangle - } - - bind .f1.view { - set startx %x - set starty %y - set scale0 $scale - } - - bind .f1.view { - set q [ expr ($starty - %y) / 400.0 ] - set scale [expr $scale0 * exp($q)] - .f1.view scale $scale - } - - # set default values: - set minfilter GL_NEAREST_MIPMAP_LINEAR - set magfilter GL_LINEAR - set swrap GL_REPEAT - set twrap GL_REPEAT - set envmode GL_MODULATE - set teximage CHECKER - set poly_red 255 - set poly_green 255 - set poly_blue 255 - set coord_scale 1.0 - - set xangle 0.0 - set yangle 0.0 - set scale 1.0 -} - - -# Execution starts here! -setup - diff --git a/ng/Togl-1.7/tkMacOSX.h b/ng/Togl-1.7/tkMacOSX.h deleted file mode 100644 index 25e677e2..00000000 --- a/ng/Togl-1.7/tkMacOSX.h +++ /dev/null @@ -1,35 +0,0 @@ -/* This file isn't installed by default */ -/* - * tkMacOSXInt.h -- - * - * Declarations of Macintosh specific exported variables and procedures. - * - * Copyright (c) 1995-1997 Sun Microsystems, Inc. - * Copyright 2001, Apple Computer, Inc. - * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tkMacOSX.h,v 1.1 2005/04/22 02:00:07 gregcouch Exp $ - */ - -#ifndef _TKMAC -#define _TKMAC - -#include -#include "tkInt.h" - -/* - * Structures and function types for handling Netscape-type in process - * embedding where Tk does not control the top-level - */ - -typedef int (Tk_MacOSXEmbedRegisterWinProc) (int winID, Tk_Window window); -typedef GWorldPtr (Tk_MacOSXEmbedGetGrafPortProc) (Tk_Window window); -typedef int (Tk_MacOSXEmbedMakeContainerExistProc) (Tk_Window window); -typedef void (Tk_MacOSXEmbedGetClipProc) (Tk_Window window, RgnHandle rgn); -typedef void (Tk_MacOSXEmbedGetOffsetInParentProc) (Tk_Window window, Point *ulCorner); - -#include "tkPlatDecls.h" - -#endif /* _TKMAC */ diff --git a/ng/Togl-1.7/togl.c b/ng/Togl-1.7/togl.c deleted file mode 100644 index a1b75d1e..00000000 --- a/ng/Togl-1.7/togl.c +++ /dev/null @@ -1,4033 +0,0 @@ -/* $Id: togl.c,v 1.73 2005/10/26 07:40:22 gregcouch Exp $ */ - -/* vi:set sw=4: */ - -/* - * Togl - a Tk OpenGL widget - * - * Copyright (C) 1996-2002 Brian Paul and Ben Bederson - * See the LICENSE file for copyright details. - */ - -/* - * Currently we support X11, Win32 and Macintosh only - */ - -#include "togl.h" - -/* Use TCL_STUPID to cast (const char *) to (char *) where the Tcl function - * prototype argument should really be const */ -#define TCL_STUPID (char *) - -/* Use WIDGREC to cast widgRec arguments */ -#define WIDGREC (char *) - -/*** Windows headers ***/ -#if defined(TOGL_WGL) -# define WIN32_LEAN_AND_MEAN -# include -# undef WIN32_LEAN_AND_MEAN -# include - -/*** X Window System headers ***/ -#elif defined(TOGL_X11) -# include -# include -# include /* for XA_RGB_DEFAULT_MAP atom */ -# if defined(__vms) -# include /* for XmuLookupStandardColormap */ -# else -# include /* for XmuLookupStandardColormap */ -# endif -# include - -/*** Mac headers ***/ -#elif defined(TOGL_AGL_CLASSIC) -# include -# include -# include -# include - -#elif defined(TOGL_AGL) -# define Cursor QDCursor -# include -# undef Cursor -# include "tkMacOSX.h" -# include /* usa MacDrawable */ -# include - -#else /* make sure only one platform defined */ -# error Unsupported platform, or confused platform defines... -#endif - -/*** Standard C headers ***/ -#include -#include -#include - -#ifdef TOGL_WGL -# include -#endif - -#if TK_MAJOR_VERSION < 8 -# error Sorry Togl requires Tcl/Tk ver 8.0 or higher. -#endif - -#if defined(TOGL_AGL_CLASSIC) -# if TK_MAJOR_VERSION < 8 || (TK_MAJOR_VERSION == 8 && TK_MINOR_VERSION < 3) -# error Sorry Mac classic version requires Tcl/Tk ver 8.3.0 or higher. -# endif -#endif /* TOGL_AGL_CLASSIC */ - -#if defined(TOGL_AGL) -# if TK_MAJOR_VERSION < 8 || (TK_MAJOR_VERSION == 8 && TK_MINOR_VERSION < 4) -# error Sorry Mac Aqua version requires Tcl/Tk ver 8.4.0 or higher. -# endif -#endif /* TOGL_AGL */ - -/* workaround for bug #123153 in tcl ver8.4a2 (tcl.h) */ -#if defined(Tcl_InitHashTable) && defined(USE_TCL_STUBS) -# undef Tcl_InitHashTable -# define Tcl_InitHashTable (tclStubsPtr->tcl_InitHashTable) -#endif -#if TK_MAJOR_VERSION > 8 || (TK_MAJOR_VERSION == 8 && TK_MINOR_VERSION >= 4) -# define HAVE_TK_SETCLASSPROCS -/* pointer to Tk_SetClassProcs function in the stub table */ - -static void (*SetClassProcsPtr) - _ANSI_ARGS_((Tk_Window, Tk_ClassProcs *, ClientData)); -#endif - -/* - * Copy of TkClassProcs declarations form tkInt.h - * (this is needed for Tcl ver =< 8.4a3) - */ - -typedef Window (TkClassCreateProc) _ANSI_ARGS_((Tk_Window tkwin, - Window parent, ClientData instanceData)); -typedef void (TkClassGeometryProc) _ANSI_ARGS_((ClientData instanceData)); -typedef void (TkClassModalProc) _ANSI_ARGS_((Tk_Window tkwin, - XEvent *eventPtr)); -typedef struct TkClassProcs -{ - TkClassCreateProc *createProc; - TkClassGeometryProc *geometryProc; - TkClassModalProc *modalProc; -} TkClassProcs; - - -/* Defaults */ -#define DEFAULT_WIDTH "400" -#define DEFAULT_HEIGHT "400" -#define DEFAULT_IDENT "" -#define DEFAULT_FONTNAME "fixed" -#define DEFAULT_TIME "1" - - -#ifdef TOGL_WGL -/* Maximum size of a logical palette corresponding to a colormap in color index - * mode. */ -# define MAX_CI_COLORMAP_SIZE 4096 - -# if TOGL_USE_FONTS != 1 -/* - * copy of TkWinColormap from tkWinInt.h - */ - -typedef struct -{ - HPALETTE palette; /* Palette handle used when drawing. */ - UINT size; /* Number of entries in the palette. */ - int stale; /* 1 if palette needs to be realized, otherwise - * 0. If the palette is stale, then an idle - * handler is scheduled to realize the palette. */ - Tcl_HashTable refCounts; /* Hash table of palette entry reference counts - * indexed by pixel value. */ -} TkWinColormap; -# else -# include "tkWinInt.h" -# endif - -static LRESULT(CALLBACK *tkWinChildProc) (HWND hwnd, UINT message, - WPARAM wParam, LPARAM lParam) = NULL; - -# define TK_WIN_CHILD_CLASS_NAME "TkChild" - -#endif /* TOGL_WGL */ - - -#define MAX(a,b) (((a)>(b))?(a):(b)) - -#define TCL_ERR(interp, string) \ - do { \ - Tcl_ResetResult(interp); \ - Tcl_AppendResult(interp, string, NULL); \ - return TCL_ERROR; \ - } while (0) - -/* The constant DUMMY_WINDOW is used to signal window creation failure from the - * Togl_CreateWindow() */ -#define DUMMY_WINDOW ((Window) -1) - -#define ALL_EVENTS_MASK \ - (KeyPressMask | \ - KeyReleaseMask | \ - ButtonPressMask | \ - ButtonReleaseMask | \ - EnterWindowMask | \ - LeaveWindowMask | \ - PointerMotionMask | \ - ExposureMask | \ - VisibilityChangeMask | \ - FocusChangeMask | \ - PropertyChangeMask | \ - ColormapChangeMask) - -struct Togl -{ - Togl *Next; /* next in linked list */ - -#if defined(TOGL_WGL) - HDC tglGLHdc; /* Device context of device that OpenGL calls - * will be drawn on */ - HGLRC tglGLHglrc; /* OpenGL rendering context to be made current */ - int CiColormapSize; /* (Maximum) size of colormap in color index - * mode */ -#elif defined(TOGL_X11) - GLXContext GlCtx; /* Normal planes GLX context */ -#elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - AGLContext aglCtx; -#endif /* TOGL_WGL */ - - Display *display; /* X's token for the window's display. */ - Tk_Window TkWin; /* Tk window structure */ - Tcl_Interp *Interp; /* Tcl interpreter */ - Tcl_Command widgetCmd; /* Token for togl's widget command */ -#ifndef NO_TK_CURSOR - Tk_Cursor Cursor; /* The widget's cursor */ -#endif - int Width, Height; /* Dimensions of window */ - int SetGrid; /* positive is grid size for window manager */ - int TimerInterval; /* Time interval for timer in milliseconds */ -#if (TCL_MAJOR_VERSION * 100 + TCL_MINOR_VERSION) >= 705 - Tcl_TimerToken timerHandler; /* Token for togl's timer handler */ -#else - Tk_TimerToken timerHandler; /* Token for togl's timer handler */ -#endif - Bool RgbaFlag; /* configuration flags (ala GLX parameters) */ - int RgbaRed; - int RgbaGreen; - int RgbaBlue; - Bool DoubleFlag; - Bool DepthFlag; - int DepthSize; - Bool AccumFlag; - int AccumRed; - int AccumGreen; - int AccumBlue; - int AccumAlpha; - Bool AlphaFlag; - int AlphaSize; - Bool StencilFlag; - int StencilSize; - Bool PrivateCmapFlag; - Bool OverlayFlag; - Bool StereoFlag; -#ifdef __sgi - Bool OldStereoFlag; -#endif - int AuxNumber; - Bool Indirect; - int PixelFormat; - const char *ShareList; /* name (ident) of Togl to share dlists with */ - const char *ShareContext; /* name (ident) to share OpenGL context with */ - - const char *Ident; /* User's identification string */ - ClientData Client_Data; /* Pointer to user data */ - - Bool UpdatePending; /* Should normal planes be redrawn? */ - - Togl_Callback *CreateProc; /* Callback when widget is created */ - Togl_Callback *DisplayProc; /* Callback when widget is rendered */ - Togl_Callback *ReshapeProc; /* Callback when window size changes */ - Togl_Callback *DestroyProc; /* Callback when widget is destroyed */ - Togl_Callback *TimerProc; /* Callback when widget is idle */ - - /* Overlay stuff */ -#if defined(TOGL_X11) - GLXContext OverlayCtx; /* Overlay planes OpenGL context */ -#elif defined(TOGL_WGL) - HGLRC tglGLOverlayHglrc; -#endif /* TOGL_X11 */ - - Window OverlayWindow; /* The overlay window, or 0 */ - Togl_Callback *OverlayDisplayProc; /* Overlay redraw proc */ - Bool OverlayUpdatePending; /* Should overlay be redrawn? */ - Colormap OverlayCmap; /* colormap for overlay is created */ - int OverlayTransparentPixel; /* transparent pixel */ - Bool OverlayIsMapped; - - /* for DumpToEpsFile: Added by Miguel A. de Riera Pasenau 10.01.1997 */ - XVisualInfo *VisInfo; /* Visual info of the current */ - /* context needed for DumpToEpsFile */ - GLfloat *EpsRedMap; /* Index2RGB Maps for Color index modes */ - GLfloat *EpsGreenMap; - GLfloat *EpsBlueMap; - GLint EpsMapSize; /* = Number of indices in our Togl */ -}; - - -/* NTNTNT need to change to handle Windows Data Types */ -/* - * Prototypes for functions local to this file - */ -static int Togl_Cmd(ClientData clientData, Tcl_Interp *interp, - int argc, CONST84 char **argv); -static void Togl_EventProc(ClientData clientData, XEvent *eventPtr); -static Window Togl_CreateWindow(Tk_Window, Window, ClientData); -static void Togl_WorldChanged(ClientData); - -#ifdef MESA_COLOR_HACK -static int get_free_color_cells(Display *display, int screen, - Colormap colormap); -static void free_default_color_cells(Display *display, Colormap colormap); -#endif -static void ToglCmdDeletedProc(ClientData); - - - -#if defined(__sgi) -/* SGI-only stereo */ -static void oldStereoMakeCurrent(Display *dpy, Window win, GLXContext ctx); -static void oldStereoInit(Togl *togl, int stereoEnabled); -#endif - -#if defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) -static void SetMacBufRect(Togl *togl); -#endif - - -/* - * Setup Togl widget configuration options: - */ - -static Tk_ConfigSpec configSpecs[] = { - {TK_CONFIG_PIXELS, TCL_STUPID "-height", "height", "Height", - DEFAULT_HEIGHT, Tk_Offset(Togl, Height), 0, NULL}, - - {TK_CONFIG_PIXELS, TCL_STUPID "-width", "width", "Width", - DEFAULT_WIDTH, Tk_Offset(Togl, Width), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-setgrid", "setGrid", "SetGrid", - "0", Tk_Offset(Togl, SetGrid), 0}, - - {TK_CONFIG_BOOLEAN, TCL_STUPID "-rgba", "rgba", "Rgba", - "true", Tk_Offset(Togl, RgbaFlag), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-redsize", "redsize", "RedSize", - "1", Tk_Offset(Togl, RgbaRed), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-greensize", "greensize", "GreenSize", - "1", Tk_Offset(Togl, RgbaGreen), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-bluesize", "bluesize", "BlueSize", - "1", Tk_Offset(Togl, RgbaBlue), 0, NULL}, - - {TK_CONFIG_BOOLEAN, TCL_STUPID "-double", "double", "Double", - "false", Tk_Offset(Togl, DoubleFlag), 0, NULL}, - - {TK_CONFIG_BOOLEAN, TCL_STUPID "-depth", "depth", "Depth", - "false", Tk_Offset(Togl, DepthFlag), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-depthsize", "depthsize", "DepthSize", - "1", Tk_Offset(Togl, DepthSize), 0, NULL}, - - {TK_CONFIG_BOOLEAN, TCL_STUPID "-accum", "accum", "Accum", - "false", Tk_Offset(Togl, AccumFlag), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-accumredsize", "accumredsize", "AccumRedSize", - "1", Tk_Offset(Togl, AccumRed), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-accumgreensize", "accumgreensize", - "AccumGreenSize", - "1", Tk_Offset(Togl, AccumGreen), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-accumbluesize", "accumbluesize", - "AccumBlueSize", - "1", Tk_Offset(Togl, AccumBlue), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-accumalphasize", "accumalphasize", - "AccumAlphaSize", - "1", Tk_Offset(Togl, AccumAlpha), 0, NULL}, - - {TK_CONFIG_BOOLEAN, TCL_STUPID "-alpha", "alpha", "Alpha", - "false", Tk_Offset(Togl, AlphaFlag), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-alphasize", "alphasize", "AlphaSize", - "1", Tk_Offset(Togl, AlphaSize), 0, NULL}, - - {TK_CONFIG_BOOLEAN, TCL_STUPID "-stencil", "stencil", "Stencil", - "false", Tk_Offset(Togl, StencilFlag), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-stencilsize", "stencilsize", "StencilSize", - "1", Tk_Offset(Togl, StencilSize), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-auxbuffers", "auxbuffers", "AuxBuffers", - "0", Tk_Offset(Togl, AuxNumber), 0, NULL}, - - {TK_CONFIG_BOOLEAN, TCL_STUPID "-privatecmap", "privateCmap", "PrivateCmap", - "false", Tk_Offset(Togl, PrivateCmapFlag), 0, NULL}, - - {TK_CONFIG_BOOLEAN, TCL_STUPID "-overlay", "overlay", "Overlay", - "false", Tk_Offset(Togl, OverlayFlag), 0, NULL}, - - {TK_CONFIG_BOOLEAN, TCL_STUPID "-stereo", "stereo", "Stereo", - "false", Tk_Offset(Togl, StereoFlag), 0, NULL}, - -#ifdef __sgi - {TK_CONFIG_BOOLEAN, TCL_STUPID "-oldstereo", "oldstereo", "OldStereo", - "false", Tk_Offset(Togl, OldStereoFlag), 0, NULL}, -#endif - -#ifndef NO_TK_CURSOR - {TK_CONFIG_ACTIVE_CURSOR, TCL_STUPID "-cursor", "cursor", "Cursor", - "", Tk_Offset(Togl, Cursor), TK_CONFIG_NULL_OK}, -#endif - - {TK_CONFIG_INT, TCL_STUPID "-time", "time", "Time", - DEFAULT_TIME, Tk_Offset(Togl, TimerInterval), 0, NULL}, - - {TK_CONFIG_STRING, TCL_STUPID "-sharelist", "sharelist", "ShareList", - NULL, Tk_Offset(Togl, ShareList), 0, NULL}, - - {TK_CONFIG_STRING, TCL_STUPID "-sharecontext", "sharecontext", - "ShareContext", NULL, Tk_Offset(Togl, ShareContext), 0, NULL}, - - {TK_CONFIG_STRING, TCL_STUPID "-ident", "ident", "Ident", - DEFAULT_IDENT, Tk_Offset(Togl, Ident), 0, NULL}, - - {TK_CONFIG_BOOLEAN, TCL_STUPID "-indirect", "indirect", "Indirect", - "false", Tk_Offset(Togl, Indirect), 0, NULL}, - - {TK_CONFIG_INT, TCL_STUPID "-pixelformat", "pixelFormat", "PixelFormat", - "0", Tk_Offset(Togl, PixelFormat), 0, NULL}, - - {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL} -}; - - -/* - * Default callback pointers. When a new Togl widget is created it - * will be assigned these initial callbacks. - */ -static Togl_Callback *DefaultCreateProc = NULL; -static Togl_Callback *DefaultDisplayProc = NULL; -static Togl_Callback *DefaultReshapeProc = NULL; -static Togl_Callback *DefaultDestroyProc = NULL; -static Togl_Callback *DefaultOverlayDisplayProc = NULL; -static Togl_Callback *DefaultTimerProc = NULL; -static ClientData DefaultClientData = NULL; -static Tcl_HashTable CommandTable; - -/* - * Head of linked list of all Togl widgets - */ -static Togl *ToglHead = NULL; - -/* - * Add given togl widget to linked list. - */ -static void -AddToList(Togl *t) -{ - t->Next = ToglHead; - ToglHead = t; -} - -/* - * Remove given togl widget from linked list. - */ -static void -RemoveFromList(Togl *t) -{ - Togl *prev = NULL; - Togl *pos = ToglHead; - - while (pos) { - if (pos == t) { - if (prev) { - prev->Next = pos->Next; - } else { - ToglHead = pos->Next; - } - return; - } - prev = pos; - pos = pos->Next; - } -} - -/* - * Return pointer to togl widget given a user identifier string. - */ -static Togl * -FindTogl(const char *ident) -{ - Togl *t = ToglHead; - - while (t) { - if (strcmp(t->Ident, ident) == 0) - return t; - t = t->Next; - } - return NULL; -} - - -#if defined(TOGL_X11) -/* - * Return pointer to another togl widget with same OpenGL context. - */ -static Togl * -FindToglWithSameContext(Togl *togl) -{ - Togl *t; - - for (t = ToglHead; t != NULL; t = t->Next) { - if (t == togl) - continue; -# if defined(TOGL_WGL) - if (t->tglGLHglrc == togl->tglGLHglrc) -# elif defined(TOGL_X11) - if (t->GlCtx == togl->GlCtx) -# elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - if (t->aglCtx == togl->aglCtx) -# endif - return t; - } - return NULL; -} -#endif - -#ifdef USE_OVERLAY -/* - * Return pointer to another togl widget with same OpenGL overlay context. - */ -static Togl * -FindToglWithSameOverlayContext(Togl *togl) -{ - Togl *t; - - for (t = ToglHead; t != NULL; t = t->Next) { - if (t == togl) - continue; -# if defined(TOGL_X11) - if (t->OverlayCtx == togl->OverlayCtx) -# elif defined(TOGL_WGL) - if (t->tglGLOverlayHglrc == togl->tglGLOverlayHglrc) -# endif - return t; - } - return NULL; -} -#endif - -#if defined(TOGL_X11) -/* - * Return an X colormap to use for OpenGL RGB-mode rendering. - * Input: dpy - the X display - * scrnum - the X screen number - * visinfo - the XVisualInfo as returned by glXChooseVisual() - * Return: an X Colormap or 0 if there's a _serious_ error. - */ -static Colormap -get_rgb_colormap(Display *dpy, - int scrnum, const XVisualInfo *visinfo, Tk_Window tkwin) -{ - Atom hp_cr_maps; - Status status; - int numCmaps; - int i; - XStandardColormap *standardCmaps; - Window root = XRootWindow(dpy, scrnum); - Bool using_mesa; - - /* - * First check if visinfo's visual matches the default/root visual. - */ - if (visinfo->visual == Tk_Visual(tkwin)) { - /* use the default/root colormap */ - Colormap cmap; - - cmap = Tk_Colormap(tkwin); -# ifdef MESA_COLOR_HACK - (void) get_free_color_cells(dpy, scrnum, cmap); -# endif - return cmap; - } - - /* - * Check if we're using Mesa. - */ - if (strstr(glXQueryServerString(dpy, scrnum, GLX_VERSION), "Mesa")) { - using_mesa = True; - } else { - using_mesa = False; - } - - /* - * Next, if we're using Mesa and displaying on an HP with the "Color - * Recovery" feature and the visual is 8-bit TrueColor, search for a - * special colormap initialized for dithering. Mesa will know how to - * dither using this colormap. - */ - if (using_mesa) { - hp_cr_maps = XInternAtom(dpy, "_HP_RGB_SMOOTH_MAP_LIST", True); - if (hp_cr_maps -# ifdef __cplusplus - && visinfo->visual->c_class == TrueColor -# else - && visinfo->visual->class == TrueColor -# endif - && visinfo->depth == 8) { - status = XGetRGBColormaps(dpy, root, &standardCmaps, - &numCmaps, hp_cr_maps); - if (status) { - for (i = 0; i < numCmaps; i++) { - if (standardCmaps[i].visualid == visinfo->visual->visualid) { - Colormap cmap = standardCmaps[i].colormap; - - (void) XFree(standardCmaps); - return cmap; - } - } - (void) XFree(standardCmaps); - } - } - } - - /* - * Next, try to find a standard X colormap. - */ -# if !HP && !SUN -# ifndef SOLARIS_BUG - status = XmuLookupStandardColormap(dpy, visinfo->screen, - visinfo->visualid, visinfo->depth, XA_RGB_DEFAULT_MAP, - /* replace */ False, /* retain */ True); - if (status == 1) { - status = XGetRGBColormaps(dpy, root, &standardCmaps, - &numCmaps, XA_RGB_DEFAULT_MAP); - if (status == 1) { - for (i = 0; i < numCmaps; i++) { - if (standardCmaps[i].visualid == visinfo->visualid) { - Colormap cmap = standardCmaps[i].colormap; - - (void) XFree(standardCmaps); - return cmap; - } - } - (void) XFree(standardCmaps); - } - } -# endif -# endif - - /* - * If we get here, give up and just allocate a new colormap. - */ - return XCreateColormap(dpy, root, visinfo->visual, AllocNone); -} -#elif defined(TOGL_WGL) - -/* Code to create RGB palette is taken from the GENGL sample program of Win32 - * SDK */ - -static unsigned char threeto8[8] = { - 0, 0111 >> 1, 0222 >> 1, 0333 >> 1, 0444 >> 1, 0555 >> 1, 0666 >> 1, 0377 -}; - -static unsigned char twoto8[4] = { - 0, 0x55, 0xaa, 0xff -}; - -static unsigned char oneto8[2] = { - 0, 255 -}; - -static int defaultOverride[13] = { - 0, 3, 24, 27, 64, 67, 88, 173, 181, 236, 247, 164, 91 -}; - -static PALETTEENTRY defaultPalEntry[20] = { - {0, 0, 0, 0}, - {0x80, 0, 0, 0}, - {0, 0x80, 0, 0}, - {0x80, 0x80, 0, 0}, - {0, 0, 0x80, 0}, - {0x80, 0, 0x80, 0}, - {0, 0x80, 0x80, 0}, - {0xC0, 0xC0, 0xC0, 0}, - - {192, 220, 192, 0}, - {166, 202, 240, 0}, - {255, 251, 240, 0}, - {160, 160, 164, 0}, - - {0x80, 0x80, 0x80, 0}, - {0xFF, 0, 0, 0}, - {0, 0xFF, 0, 0}, - {0xFF, 0xFF, 0, 0}, - {0, 0, 0xFF, 0}, - {0xFF, 0, 0xFF, 0}, - {0, 0xFF, 0xFF, 0}, - {0xFF, 0xFF, 0xFF, 0} -}; - -static unsigned char -ComponentFromIndex(int i, UINT nbits, UINT shift) -{ - unsigned char val; - - val = (unsigned char) (i >> shift); - switch (nbits) { - - case 1: - val &= 0x1; - return oneto8[val]; - - case 2: - val &= 0x3; - return twoto8[val]; - - case 3: - val &= 0x7; - return threeto8[val]; - - default: - return 0; - } -} - -static Colormap -Win32CreateRgbColormap(PIXELFORMATDESCRIPTOR pfd) -{ - TkWinColormap *cmap = (TkWinColormap *) ckalloc(sizeof (TkWinColormap)); - LOGPALETTE *pPal; - int n, i; - - n = 1 << pfd.cColorBits; - pPal = (PLOGPALETTE) LocalAlloc(LMEM_FIXED, sizeof (LOGPALETTE) - + n * sizeof (PALETTEENTRY)); - pPal->palVersion = 0x300; - pPal->palNumEntries = n; - for (i = 0; i < n; i++) { - pPal->palPalEntry[i].peRed = - ComponentFromIndex(i, pfd.cRedBits, pfd.cRedShift); - pPal->palPalEntry[i].peGreen = - ComponentFromIndex(i, pfd.cGreenBits, pfd.cGreenShift); - pPal->palPalEntry[i].peBlue = - ComponentFromIndex(i, pfd.cBlueBits, pfd.cBlueShift); - pPal->palPalEntry[i].peFlags = 0; - } - - /* fix up the palette to include the default GDI palette */ - if ((pfd.cColorBits == 8) - && (pfd.cRedBits == 3) && (pfd.cRedShift == 0) - && (pfd.cGreenBits == 3) && (pfd.cGreenShift == 3) - && (pfd.cBlueBits == 2) && (pfd.cBlueShift == 6)) { - for (i = 1; i <= 12; i++) - pPal->palPalEntry[defaultOverride[i]] = defaultPalEntry[i]; - } - - cmap->palette = CreatePalette(pPal); - LocalFree(pPal); - cmap->size = n; - cmap->stale = 0; - - /* Since this is a private colormap of a fix size, we do not need a valid - * hash table, but a dummy one */ - - Tcl_InitHashTable(&cmap->refCounts, TCL_ONE_WORD_KEYS); - return (Colormap) cmap; -} - -static Colormap -Win32CreateCiColormap(Togl *togl) -{ - /* Create a colormap with size of togl->CiColormapSize and set all entries - * to black */ - - LOGPALETTE logPalette; - TkWinColormap *cmap = (TkWinColormap *) ckalloc(sizeof (TkWinColormap)); - - logPalette.palVersion = 0x300; - logPalette.palNumEntries = 1; - logPalette.palPalEntry[0].peRed = 0; - logPalette.palPalEntry[0].peGreen = 0; - logPalette.palPalEntry[0].peBlue = 0; - logPalette.palPalEntry[0].peFlags = 0; - - cmap->palette = CreatePalette(&logPalette); - cmap->size = togl->CiColormapSize; - ResizePalette(cmap->palette, cmap->size); /* sets new entries to black */ - cmap->stale = 0; - - /* Since this is a private colormap of a fix size, we do not need a valid - * hash table, but a dummy one */ - - Tcl_InitHashTable(&cmap->refCounts, TCL_ONE_WORD_KEYS); - return (Colormap) cmap; -} -#endif /* TOGL_X11 */ - - - -/* - * Togl_Init - * - * Called upon system startup to create Togl command. - */ -int -Togl_Init(Tcl_Interp *interp) -{ - int major, minor, patchLevel, releaseType; - -#ifdef USE_TCL_STUBS - if (Tcl_InitStubs(interp, "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif -#ifdef USE_TK_STUBS - if (Tk_InitStubs(interp, TCL_STUPID "8.1", 0) == NULL) { - return TCL_ERROR; - } -#endif - - /* Skip all this on Tcl/Tk 8.0 or older. Seems to work */ -#if TCL_MAJOR_VERSION * 100 + TCL_MINOR_VERSION > 800 - Tcl_GetVersion(&major, &minor, &patchLevel, &releaseType); - -# ifdef HAVE_TK_SETCLASSPROCS - if (major > 8 - || (major == 8 - && (minor > 4 - || (minor == 4 && (releaseType > 0 - || patchLevel >= 2))))) { -# ifdef USE_TK_STUBS - SetClassProcsPtr = tkStubsPtr->tk_SetClassProcs; -# else - SetClassProcsPtr = Tk_SetClassProcs; -# endif - } else { - SetClassProcsPtr = NULL; - } -# else - if (major > 8 - || (major == 8 - && (minor > 4 - || (minor == 4 && (releaseType > 0 - || patchLevel >= 2))))) { - TCL_ERR(interp, - "Sorry, this instance of Togl was not compiled to work with Tcl/Tk 8.4a2 or higher."); - } -# endif - -#endif - - if (Tcl_PkgProvide(interp, "Togl", TOGL_VERSION) != TCL_OK) { - return TCL_ERROR; - } - - if (Tcl_CreateCommand(interp, "togl", Togl_Cmd, - (ClientData) Tk_MainWindow(interp), NULL) == NULL) - return TCL_ERROR; - - Tcl_InitHashTable(&CommandTable, TCL_STRING_KEYS); - - return TCL_OK; -} - - -/* - * Register a C function to be called when an Togl widget is realized. - */ -void -Togl_CreateFunc(Togl_Callback *proc) -{ - DefaultCreateProc = proc; -} - - -/* - * Register a C function to be called when an Togl widget must be redrawn. - */ -void -Togl_DisplayFunc(Togl_Callback *proc) -{ - DefaultDisplayProc = proc; -} - - -/* - * Register a C function to be called when an Togl widget is resized. - */ -void -Togl_ReshapeFunc(Togl_Callback *proc) -{ - DefaultReshapeProc = proc; -} - - -/* - * Register a C function to be called when an Togl widget is destroyed. - */ -void -Togl_DestroyFunc(Togl_Callback *proc) -{ - DefaultDestroyProc = proc; -} - - -/* - * Register a C function to be called from TimerEventHandler. - */ -void -Togl_TimerFunc(Togl_Callback *proc) -{ - DefaultTimerProc = proc; -} - - -/* - * Reset default callback pointers to NULL. - */ -void -Togl_ResetDefaultCallbacks(void) -{ - DefaultCreateProc = NULL; - DefaultDisplayProc = NULL; - DefaultReshapeProc = NULL; - DefaultDestroyProc = NULL; - DefaultOverlayDisplayProc = NULL; - DefaultTimerProc = NULL; - DefaultClientData = NULL; -} - - -/* - * Change the create callback for a specific Togl widget. - */ -void -Togl_SetCreateFunc(Togl *togl, Togl_Callback *proc) -{ - togl->CreateProc = proc; -} - - -/* - * Change the display/redraw callback for a specific Togl widget. - */ -void -Togl_SetDisplayFunc(Togl *togl, Togl_Callback *proc) -{ - togl->DisplayProc = proc; -} - - -/* - * Change the reshape callback for a specific Togl widget. - */ -void -Togl_SetReshapeFunc(Togl *togl, Togl_Callback *proc) -{ - togl->ReshapeProc = proc; -} - - -/* - * Change the destroy callback for a specific Togl widget. - */ -void -Togl_SetDestroyFunc(Togl *togl, Togl_Callback *proc) -{ - togl->DestroyProc = proc; -} - - -/* - * Togl_Timer - * - * Gets called from Tk_CreateTimerHandler. - */ -static void -Togl_Timer(ClientData clientData) -{ - Togl *togl = (Togl *) clientData; - - if (togl->TimerProc) { - togl->TimerProc(togl); - - /* Re-register this callback since Tcl/Tk timers are "one-shot". That - * is, after the timer callback is called it not normally called again. - * * * * * * * * * That's not the behavior we want for Togl. */ -#if (TK_MAJOR_VERSION * 100 + TK_MINOR_VERSION) >= 401 - togl->timerHandler = - Tcl_CreateTimerHandler(togl->TimerInterval, Togl_Timer, - (ClientData) togl); -#else - togl->timerHandler = - Tk_CreateTimerHandler(togl->TimeInterval, Togl_Timer, - (ClientData) togl); -#endif - } -} - - -/* - * Change the timer callback for a specific Togl widget. - * Pass NULL to disable the callback. - */ -void -Togl_SetTimerFunc(Togl *togl, Togl_Callback *proc) -{ - togl->TimerProc = proc; - if (proc) { -#if (TK_MAJOR_VERSION * 100 + TK_MINOR_VERSION) >= 401 - togl->timerHandler = - Tcl_CreateTimerHandler(togl->TimerInterval, Togl_Timer, - (ClientData) togl); -#else - togl->timerHandler = - Tk_CreateTimerHandler(togl->TimeInterval, Togl_Timer, - (ClientData) togl); -#endif - } -} - - - -/* - * Togl_CreateCommand - * - * Declares a new C sub-command of Togl callable from Tcl. - * Every time the sub-command is called from Tcl, the - * C routine will be called with all the arguments from Tcl. - */ -void -Togl_CreateCommand(char *cmd_name, Togl_CmdProc *cmd_proc) -{ - int new_item; - Tcl_HashEntry *entry; - - entry = Tcl_CreateHashEntry(&CommandTable, cmd_name, &new_item); - Tcl_SetHashValue(entry, cmd_proc); -} - - -/* - * Togl_MakeCurrent - * - * Bind the OpenGL rendering context to the specified - * Togl widget. - */ -void -Togl_MakeCurrent(const Togl *togl) -{ -#if defined(TOGL_WGL) - int res = wglMakeCurrent(togl->tglGLHdc, togl->tglGLHglrc); - - assert(res == TRUE); - -#elif defined(TOGL_X11) - if (!togl->GlCtx) - return; - (void) glXMakeCurrent(togl->display, - togl->TkWin ? Tk_WindowId(togl->TkWin) : None, togl->GlCtx); -# if defined(__sgi) - if (togl->OldStereoFlag) - oldStereoMakeCurrent(togl->display, - togl->TkWin ? Tk_WindowId(togl->TkWin) : None, togl->GlCtx); - -# endif /*__sgi STEREO */ - -#elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - if (!togl->aglCtx) - return; - aglSetCurrentContext(togl->aglCtx); -#endif -} - - -#ifdef TOGL_AGL_CLASSIC -/* tell OpenGL which part of the Mac window to render to */ -static void -SetMacBufRect(Togl *togl) -{ - GLint wrect[4]; - - /* set wrect[0,1] to lower left corner of widget */ - wrect[2] = ((TkWindow *) (togl->TkWin))->changes.width; - wrect[3] = ((TkWindow *) (togl->TkWin))->changes.height; - wrect[0] = ((TkWindow *) (togl->TkWin))->privatePtr->xOff; - wrect[1] = - ((TkWindow *) (togl->TkWin))->privatePtr->toplevel->portPtr-> - portRect.bottom - wrect[3] - - ((TkWindow *) (togl->TkWin))->privatePtr->yOff; - aglSetInteger(togl->aglCtx, AGL_BUFFER_RECT, wrect); - aglEnable(togl->aglCtx, AGL_BUFFER_RECT); - aglUpdateContext(togl->aglCtx); -} -#elif defined(TOGL_AGL) -/* tell OpenGL which part of the Mac window to render to */ -static void -SetMacBufRect(Togl *togl) -{ - GLint wrect[4]; - - /* set wrect[0,1] to lower left corner of widget */ - wrect[2] = Tk_Width(togl->TkWin); - wrect[3] = Tk_Height(togl->TkWin); - wrect[0] = ((TkWindow *) (togl->TkWin))->privatePtr->xOff; - - Rect r; - - GetPortBounds(((TkWindow *) (togl->TkWin))->privatePtr->toplevel->grafPtr, - &r); - - wrect[1] = r.bottom - - wrect[3] - ((TkWindow *) (togl->TkWin))->privatePtr->yOff; - - aglSetInteger(togl->aglCtx, AGL_BUFFER_RECT, wrect); - aglEnable(togl->aglCtx, AGL_BUFFER_RECT); - aglUpdateContext(togl->aglCtx); -} -#endif - -/* - * Called when the widget's contents must be redrawn. Basically, we - * just call the user's render callback function. - * - * Note that the parameter type is ClientData so this function can be - * passed to Tk_DoWhenIdle(). - */ -static void -Togl_Render(ClientData clientData) -{ - Togl *togl = (Togl *) clientData; - - if (togl->DisplayProc) { - -#ifdef TOGL_AGL_CLASSIC - /* Mac is complicated here because OpenGL needs to know what part of - * the parent window to render into, and it seems that region need to - * be invalidated before drawing, so that QuickDraw will allow OpenGL - * to transfer pixels into that part of the window. I'm not even - * totally sure how or why this works as it does, since this aspect of - * Mac OpenGL seems to be totally undocumented. This was put together - * by trial and error! (thiessen) */ - MacRegion r; - RgnPtr rp = &r; - GrafPtr curPort, parentWin; - - parentWin = (GrafPtr) - (((MacDrawable *) (Tk_WindowId(togl->TkWin)))->toplevel-> - portPtr); - if (!parentWin) - return; -#endif - - Togl_MakeCurrent(togl); - -#ifdef TOGL_AGL_CLASSIC - /* Set QuickDraw port and clipping region */ - GetPort(&curPort); - SetPort(parentWin); - r.rgnBBox.left = ((TkWindow *) (togl->TkWin))->privatePtr->xOff; - r.rgnBBox.right = - r.rgnBBox.left + ((TkWindow *) (togl->TkWin))->changes.width - - 1; - r.rgnBBox.top = ((TkWindow *) (togl->TkWin))->privatePtr->yOff; - r.rgnBBox.bottom = - r.rgnBBox.top + ((TkWindow *) (togl->TkWin))->changes.height - - 1; - r.rgnSize = sizeof (Region); - InvalRgn(&rp); - SetClip(&rp); - /* this may seem an odd place to put this, with possibly redundant - * calls to aglSetInteger(AGL_BUFFER_RECT...), but for some reason - * performance is actually a lot better if this is called before every - * render... */ - SetMacBufRect(togl); -#endif - -#ifdef TOGL_AGL - SetMacBufRect(togl); -#endif - - togl->DisplayProc(togl); - -#ifdef TOGL_AGL_CLASSIC - SetPort(curPort); /* restore previous port */ -#endif - - } -#if defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - else { - /* Always need to update on resize */ - SetMacBufRect(togl); - } -#endif - togl->UpdatePending = False; -} - - -static void -RenderOverlay(ClientData clientData) -{ - Togl *togl = (Togl *) clientData; - - if (togl->OverlayFlag && togl->OverlayDisplayProc) { - -#if defined(TOGL_WGL) - int res = wglMakeCurrent(togl->tglGLHdc, togl->tglGLHglrc); - - assert(res == TRUE); - -#elif defined(TOGL_X11) - (void) glXMakeCurrent(Tk_Display(togl->TkWin), - togl->OverlayWindow, togl->OverlayCtx); -# if defined(__sgi) - if (togl->OldStereoFlag) - oldStereoMakeCurrent(Tk_Display(togl->TkWin), - togl->OverlayWindow, togl->OverlayCtx); - -# endif /*__sgi STEREO */ - -#endif /* TOGL_WGL */ - - togl->OverlayDisplayProc(togl); - } - togl->OverlayUpdatePending = False; -} - - -/* - * It's possible to change with this function or in a script some - * options like RGBA - ColorIndex ; Z-buffer and so on - */ -int -Togl_Configure(Tcl_Interp *interp, Togl *togl, - int argc, const char *argv[], int flags) -{ - Bool oldRgbaFlag = togl->RgbaFlag; - int oldRgbaRed = togl->RgbaRed; - int oldRgbaGreen = togl->RgbaGreen; - int oldRgbaBlue = togl->RgbaBlue; - Bool oldDoubleFlag = togl->DoubleFlag; - Bool oldDepthFlag = togl->DepthFlag; - int oldDepthSize = togl->DepthSize; - Bool oldAccumFlag = togl->AccumFlag; - int oldAccumRed = togl->AccumRed; - int oldAccumGreen = togl->AccumGreen; - int oldAccumBlue = togl->AccumBlue; - int oldAccumAlpha = togl->AccumAlpha; - Bool oldAlphaFlag = togl->AlphaFlag; - int oldAlphaSize = togl->AlphaSize; - Bool oldStencilFlag = togl->StencilFlag; - int oldStencilSize = togl->StencilSize; - int oldAuxNumber = togl->AuxNumber; - int oldWidth = togl->Width; - int oldHeight = togl->Height; - int oldSetGrid = togl->SetGrid; - - if (Tk_ConfigureWidget(interp, togl->TkWin, configSpecs, - argc, argv, WIDGREC togl, flags) == TCL_ERROR) { - return (TCL_ERROR); - } -#ifndef USE_OVERLAY - if (togl->OverlayFlag) { - TCL_ERR(interp, "Sorry, overlay was disabled"); - } -#endif - - - if (togl->Width != oldWidth || togl->Height != oldHeight - || togl->SetGrid != oldSetGrid) { - Togl_WorldChanged((ClientData) togl); - /* this added per Lou Arata */ - Tk_ResizeWindow(togl->TkWin, togl->Width, togl->Height); - - if (togl->ReshapeProc && -#if defined(TOGL_WGL) - togl->tglGLHglrc -#elif defined(TOGL_X11) - togl->GlCtx -#elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - togl->aglCtx -#endif - ) { - Togl_MakeCurrent(togl); - togl->ReshapeProc(togl); - } - } - - if (togl->RgbaFlag != oldRgbaFlag - || togl->RgbaRed != oldRgbaRed - || togl->RgbaGreen != oldRgbaGreen - || togl->RgbaBlue != oldRgbaBlue - || togl->DoubleFlag != oldDoubleFlag - || togl->DepthFlag != oldDepthFlag - || togl->DepthSize != oldDepthSize - || togl->AccumFlag != oldAccumFlag - || togl->AccumRed != oldAccumRed - || togl->AccumGreen != oldAccumGreen - || togl->AccumBlue != oldAccumBlue - || togl->AccumAlpha != oldAccumAlpha - || togl->AlphaFlag != oldAlphaFlag - || togl->AlphaSize != oldAlphaSize - || togl->StencilFlag != oldStencilFlag - || togl->StencilSize != oldStencilSize - || togl->AuxNumber != oldAuxNumber) { -#ifdef MESA_COLOR_HACK - free_default_color_cells(Tk_Display(togl->TkWin), - Tk_Colormap(togl->TkWin)); -#endif - } -#if defined(__sgi) - oldStereoInit(togl, togl->OldStereoFlag); -#endif - - return TCL_OK; -} - - -static int -Togl_Widget(ClientData clientData, Tcl_Interp *interp, int argc, - CONST84 char *argv[]) -{ - Togl *togl = (Togl *) clientData; - int result = TCL_OK; - Tcl_HashEntry *entry; - Tcl_HashSearch search; - Togl_CmdProc *cmd_proc; - - if (argc < 2) { - Tcl_AppendResult(interp, "wrong # args: should be \"", - argv[0], " ?options?\"", NULL); - return TCL_ERROR; - } - - Tk_Preserve((ClientData) togl); - - if (!strncmp(argv[1], "configure", MAX(1, strlen(argv[1])))) { - if (argc == 2) { - /* Return list of all configuration parameters */ - result = Tk_ConfigureInfo(interp, togl->TkWin, configSpecs, - WIDGREC togl, (char *) NULL, 0); - } else if (argc == 3) { - if (strcmp(argv[2], "-extensions") == 0) { - /* Return a list of OpenGL extensions available */ - const char *extensions; - - extensions = (const char *) glGetString(GL_EXTENSIONS); - Tcl_SetResult(interp, TCL_STUPID extensions, TCL_STATIC); - result = TCL_OK; - } else { - /* Return a specific configuration parameter */ - result = Tk_ConfigureInfo(interp, togl->TkWin, configSpecs, - WIDGREC togl, argv[2], 0); - } - } else { - /* Execute a configuration change */ - result = Togl_Configure(interp, togl, argc - 2, argv + 2, - TK_CONFIG_ARGV_ONLY); - } - } else if (!strncmp(argv[1], "render", MAX(1, strlen(argv[1])))) { - /* force the widget to be redrawn */ - Togl_Render((ClientData) togl); - } else if (!strncmp(argv[1], "swapbuffers", MAX(1, strlen(argv[1])))) { - /* force the widget to be redrawn */ - Togl_SwapBuffers(togl); - } else if (!strncmp(argv[1], "makecurrent", MAX(1, strlen(argv[1])))) { - /* force the widget to be redrawn */ - Togl_MakeCurrent(togl); - } -#if TOGL_USE_FONTS == 1 - else if (!strncmp(argv[1], "loadbitmapfont", MAX(1, strlen(argv[1])))) { - if (argc == 3) { - GLuint fontbase; - Tcl_Obj *fontbaseAsTclObject; - - fontbase = Togl_LoadBitmapFont(togl, argv[2]); - if (fontbase) { - fontbaseAsTclObject = Tcl_NewIntObj(fontbase); - Tcl_SetObjResult(interp, fontbaseAsTclObject); - result = TCL_OK; - } else { - Tcl_AppendResult(interp, "Could not allocate font", NULL); - result = TCL_ERROR; - } - } else { - Tcl_AppendResult(interp, "wrong # args", NULL); - result = TCL_ERROR; - } - } else if (!strncmp(argv[1], "unloadbitmapfont", MAX(1, strlen(argv[1])))) { - if (argc == 3) { - Togl_UnloadBitmapFont(togl, atoi(argv[2])); - result = TCL_OK; - } else { - Tcl_AppendResult(interp, "wrong # args", NULL); - result = TCL_ERROR; - } - } -#endif /* TOGL_USE_FONTS */ - else { - /* Probably a user-defined function */ - entry = Tcl_FindHashEntry(&CommandTable, argv[1]); - if (entry != NULL) { - cmd_proc = (Togl_CmdProc *) Tcl_GetHashValue(entry); - result = cmd_proc(togl, argc, argv); - } else { - Tcl_AppendResult(interp, "Togl: Unknown option: ", argv[1], "\n", - "Try: configure or render\n", - "or one of the user-defined commands:\n", NULL); - entry = Tcl_FirstHashEntry(&CommandTable, &search); - while (entry) { - Tcl_AppendResult(interp, " ", - Tcl_GetHashKey(&CommandTable, entry), "\n", NULL); - entry = Tcl_NextHashEntry(&search); - } - result = TCL_ERROR; - } - } - - Tk_Release((ClientData) togl); - return result; -} - - - -/* - * Togl_Cmd - * - * Called when Togl is executed - creation of a Togl widget. - * * Creates a new window - * * Creates an 'Togl' data structure - * * Creates an event handler for this window - * * Creates a command that handles this object - * * Configures this Togl for the given arguments - */ -static int -Togl_Cmd(ClientData clientData, Tcl_Interp *interp, int argc, - CONST84 char **argv) -{ - const char *name; - Tk_Window mainwin = (Tk_Window) clientData; - Tk_Window tkwin; - Togl *togl; - - if (argc <= 1) { - TCL_ERR(interp, "wrong # args: should be \"pathName read filename\""); - } - - /* Create the window. */ - name = argv[1]; - tkwin = Tk_CreateWindowFromPath(interp, mainwin, name, (char *) NULL); - if (tkwin == NULL) { - return TCL_ERROR; - } - - Tk_SetClass(tkwin, "Togl"); - - /* Create Togl data structure */ - togl = (Togl *) malloc(sizeof (Togl)); - if (!togl) { - return TCL_ERROR; - } - - togl->Next = NULL; -#if defined(TOGL_WGL) - togl->tglGLHdc = NULL; - togl->tglGLHglrc = NULL; -#elif defined(TOGL_X11) - togl->GlCtx = NULL; - togl->OverlayCtx = NULL; -#elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - togl->aglCtx = NULL; -#endif /* TOGL_WGL */ - togl->display = Tk_Display(tkwin); - togl->TkWin = tkwin; - togl->Interp = interp; -#ifndef NO_TK_CURSOR - togl->Cursor = None; -#endif - togl->Width = 0; - togl->Height = 0; - togl->SetGrid = 0; - togl->TimerInterval = 0; - togl->RgbaFlag = True; - togl->RgbaRed = 1; - togl->RgbaGreen = 1; - togl->RgbaBlue = 1; - togl->DoubleFlag = False; - togl->DepthFlag = False; - togl->DepthSize = 1; - togl->AccumFlag = False; - togl->AccumRed = 1; - togl->AccumGreen = 1; - togl->AccumBlue = 1; - togl->AccumAlpha = 1; - togl->AlphaFlag = False; - togl->AlphaSize = 1; - togl->StencilFlag = False; - togl->StencilSize = 1; - togl->OverlayFlag = False; - togl->StereoFlag = False; -#ifdef __sgi - togl->OldStereoFlag = False; -#endif - togl->AuxNumber = 0; - togl->Indirect = False; - togl->PixelFormat = 0; - togl->UpdatePending = False; - togl->OverlayUpdatePending = False; - togl->CreateProc = DefaultCreateProc; - togl->DisplayProc = DefaultDisplayProc; - togl->ReshapeProc = DefaultReshapeProc; - togl->DestroyProc = DefaultDestroyProc; - togl->TimerProc = DefaultTimerProc; - togl->OverlayDisplayProc = DefaultOverlayDisplayProc; - togl->ShareList = NULL; - togl->ShareContext = NULL; - togl->Ident = NULL; - togl->Client_Data = DefaultClientData; - - /* for EPS Output */ - togl->EpsRedMap = togl->EpsGreenMap = togl->EpsBlueMap = NULL; - togl->EpsMapSize = 0; - - /* Create command event handler */ - togl->widgetCmd = Tcl_CreateCommand(interp, Tk_PathName(tkwin), - Togl_Widget, (ClientData) togl, - (Tcl_CmdDeleteProc *) ToglCmdDeletedProc); - /* - * Setup the Tk_ClassProcs callbacks to point at our own window creation - * function - * - * We need to check at runtime if we should use the new Tk_SetClassProcs() - * API or if we need to modify the window structure directly */ - - -#ifdef HAVE_TK_SETCLASSPROCS - - if (SetClassProcsPtr != NULL) { /* use public API (Tk 8.4+) */ - Tk_ClassProcs *procsPtr; - - procsPtr = (Tk_ClassProcs *) Tcl_Alloc(sizeof (Tk_ClassProcs)); - procsPtr->size = sizeof (Tk_ClassProcs); - procsPtr->createProc = Togl_CreateWindow; - procsPtr->worldChangedProc = Togl_WorldChanged; - procsPtr->modalProc = NULL; - /* Tk_SetClassProcs(togl->TkWin,procsPtr,(ClientData)togl); */ - (SetClassProcsPtr) (togl->TkWin, procsPtr, (ClientData) togl); - } else -#endif - { /* use private API */ - /* - * We need to set these fields in the Tk_FakeWin structure: dummy17 = - * classProcsPtr dummy18 = instanceData */ - TkClassProcs *procsPtr; - Tk_FakeWin *winPtr = (Tk_FakeWin *) (togl->TkWin); - - procsPtr = (TkClassProcs *) Tcl_Alloc(sizeof (TkClassProcs)); - procsPtr->createProc = Togl_CreateWindow; - procsPtr->geometryProc = Togl_WorldChanged; - procsPtr->modalProc = NULL; - winPtr->dummy17 = (char *) procsPtr; - winPtr->dummy18 = (ClientData) togl; - } - - Tk_CreateEventHandler(tkwin, - ExposureMask | StructureNotifyMask, Togl_EventProc, - (ClientData) togl); - - /* Configure Togl widget */ - if (Togl_Configure(interp, togl, argc - 2, argv + 2, 0) == TCL_ERROR) { - Tk_DestroyWindow(tkwin); - Tcl_AppendResult(interp, "Couldn't configure togl widget\n", NULL); - goto error; - } - - /* - * If OpenGL window wasn't already created by Togl_Configure() we - * create it now. We can tell by checking if the GLX context has - * been initialized. - */ - if (! -#if defined(TOGL_WGL) - togl->tglGLHdc -#elif defined(TOGL_X11) - togl->GlCtx -#elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - togl->aglCtx -#endif - ) { - Tk_MakeWindowExist(togl->TkWin); - if (Tk_WindowId(togl->TkWin) == DUMMY_WINDOW) { - return TCL_ERROR; - } - Togl_MakeCurrent(togl); - } - - /* If defined, call create callback */ - if (togl->CreateProc) { - togl->CreateProc(togl); - } - - /* If defined, call reshape proc */ - if (togl->ReshapeProc) { - togl->ReshapeProc(togl); - } - - /* If defined, setup timer */ - if (togl->TimerProc) { - (void) Tk_CreateTimerHandler(togl->TimerInterval, Togl_Timer, - (ClientData) togl); - } - - Tcl_AppendResult(interp, Tk_PathName(tkwin), NULL); - - /* Add to linked list */ - AddToList(togl); - - return TCL_OK; - - error: - (void) Tcl_DeleteCommand(interp, "togl"); - /* free(togl); Don't free it, if we do a crash occurs later... */ - return TCL_ERROR; -} - - -#ifdef USE_OVERLAY - -/* - * Do all the setup for overlay planes - * Return: TCL_OK or TCL_ERROR - */ -static int -SetupOverlay(Togl *togl) -{ -# if defined(TOGL_X11) - -# ifdef GLX_TRANSPARENT_TYPE_EXT - static int ovAttributeList[] = { - GLX_BUFFER_SIZE, 2, - GLX_LEVEL, 1, - GLX_TRANSPARENT_TYPE_EXT, GLX_TRANSPARENT_INDEX_EXT, - None - }; -# else - static int ovAttributeList[] = { - GLX_BUFFER_SIZE, 2, - GLX_LEVEL, 1, - None - }; -# endif - - Display *dpy; - XVisualInfo *visinfo; - TkWindow *winPtr = (TkWindow *) togl->TkWin; - - XSetWindowAttributes swa; - Tcl_HashEntry *hPtr; - int new_flag; - - dpy = Tk_Display(togl->TkWin); - - visinfo = glXChooseVisual(dpy, Tk_ScreenNumber(winPtr), ovAttributeList); - if (!visinfo) { - Tcl_AppendResult(togl->Interp, Tk_PathName(winPtr), - ": No suitable overlay index visual available", (char *) NULL); - togl->OverlayCtx = 0; - togl->OverlayWindow = 0; - togl->OverlayCmap = 0; - return TCL_ERROR; - } -# ifdef GLX_TRANSPARENT_INDEX_EXT - { - int fail = - glXGetConfig(dpy, visinfo, GLX_TRANSPARENT_INDEX_VALUE_EXT, - &togl->OverlayTransparentPixel); - - if (fail) - togl->OverlayTransparentPixel = 0; /* maybe, maybe ... */ - } -# else - togl->OverlayTransparentPixel = 0; /* maybe, maybe ... */ -# endif - - /* share display lists with normal layer context */ - togl->OverlayCtx = - glXCreateContext(dpy, visinfo, togl->GlCtx, !togl->Indirect); - - swa.colormap = XCreateColormap(dpy, XRootWindow(dpy, visinfo->screen), - visinfo->visual, AllocNone); - togl->OverlayCmap = swa.colormap; - - swa.border_pixel = 0; - swa.event_mask = ALL_EVENTS_MASK; - togl->OverlayWindow = XCreateWindow(dpy, Tk_WindowId(togl->TkWin), 0, 0, - togl->Width, togl->Height, 0, - visinfo->depth, InputOutput, - visinfo->visual, CWBorderPixel | CWColormap | CWEventMask, &swa); - - hPtr = Tcl_CreateHashEntry(&winPtr->dispPtr->winTable, - (char *) togl->OverlayWindow, &new_flag); - Tcl_SetHashValue(hPtr, winPtr); - - /* XMapWindow( dpy, togl->OverlayWindow ); */ - togl->OverlayIsMapped = False; - - /* Make sure window manager installs our colormap */ - XSetWMColormapWindows(dpy, togl->OverlayWindow, &togl->OverlayWindow, 1); - - return TCL_OK; - -# elif defined(TOGL_WGL) || defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - /* not yet implemented on these */ - return TCL_ERROR; -# endif -} - -#endif /* USE_OVERLAY */ - - - -#ifdef TOGL_WGL -# define TOGL_CLASS_NAME "Togl Class" -static Bool ToglClassInitialized = False; - -static LRESULT CALLBACK -Win32WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - LONG result; - Togl *togl = (Togl *) GetWindowLong(hwnd, 0); - WNDCLASS childClass; - - switch (message) { - case WM_WINDOWPOSCHANGED: - /* Should be processed by DefWindowProc, otherwise a double buffered - * context is not properly resized when the corresponding window is - * resized. */ - break; - case WM_DESTROY: - if (togl->tglGLHglrc) { - wglDeleteContext(togl->tglGLHglrc); - } - if (togl->tglGLHdc) { - ReleaseDC(hwnd, togl->tglGLHdc); - } - free(togl); - break; - default: -# if USE_STATIC_LIB - return TkWinChildProc(hwnd, message, wParam, lParam); -# else - /* - * OK, since TkWinChildProc is not explicitly exported in the - * dynamic libraries, we have to retrieve it from the class info - * registered with windows. - * - */ - if (tkWinChildProc == NULL) { - GetClassInfo(Tk_GetHINSTANCE(), TK_WIN_CHILD_CLASS_NAME, - &childClass); - tkWinChildProc = childClass.lpfnWndProc; - } - return tkWinChildProc(hwnd, message, wParam, lParam); -# endif - } - result = DefWindowProc(hwnd, message, wParam, lParam); - Tcl_ServiceAll(); - return result; -} -#endif /* TOGL_WGL */ - - - -/* - * Togl_CreateWindow - * - * Window creation function, invoked as a callback from Tk_MakeWindowExist. - * Creates an OpenGL window for the Togl widget. - */ -static Window -Togl_CreateWindow(Tk_Window tkwin, Window parent, ClientData instanceData) -{ - - Togl *togl = (Togl *) instanceData; - XVisualInfo *visinfo = NULL; - Display *dpy; - Colormap cmap; - int scrnum; - Window window; - -#if defined(TOGL_X11) - Bool directCtx = True; - int attrib_list[1000]; - int attrib_count; - int dummy; - XSetWindowAttributes swa; - -# define MAX_ATTEMPTS 12 - static int ci_depths[MAX_ATTEMPTS] = { - 8, 4, 2, 1, 12, 16, 8, 4, 2, 1, 12, 16 - }; - static int dbl_flags[MAX_ATTEMPTS] = { - 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1 - }; -#elif defined(TOGL_WGL) - HWND hwnd, parentWin; - int pixelformat; - HANDLE hInstance; - WNDCLASS ToglClass; - PIXELFORMATDESCRIPTOR pfd; - XVisualInfo VisInf; -#elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - GLint attribs[20]; - int na; - AGLPixelFormat fmt; - XVisualInfo VisInf; -#endif /* TOGL_X11 */ - - - dpy = Tk_Display(togl->TkWin); - -#if defined(TOGL_X11) - /* Make sure OpenGL's GLX extension supported */ - if (!glXQueryExtension(dpy, &dummy, &dummy)) { - Tcl_SetResult(togl->Interp, - TCL_STUPID "Togl: X server has no OpenGL GLX extension", - TCL_STATIC); - return DUMMY_WINDOW; - } - - if (togl->ShareContext && FindTogl(togl->ShareContext)) { - /* share OpenGL context with existing Togl widget */ - Togl *shareWith = FindTogl(togl->ShareContext); - - assert(shareWith != NULL); - assert(shareWith->GlCtx != NULL); - togl->GlCtx = shareWith->GlCtx; - togl->VisInfo = shareWith->VisInfo; - visinfo = togl->VisInfo; - } else { - if (togl->PixelFormat) { - XVisualInfo template; - int count = 1; - - template.visualid = togl->PixelFormat; - visinfo = XGetVisualInfo(dpy, VisualIDMask, &template, &count); - if (visinfo == NULL) { - Tcl_SetResult(togl->Interp, - TCL_STUPID "Togl: couldn't choose pixel format", - TCL_STATIC); - - return DUMMY_WINDOW; - } - /* fill in flags normally passed in that affect behavior */ - (void) glXGetConfig(dpy, visinfo, GLX_RGBA, &togl->RgbaFlag); - (void) glXGetConfig(dpy, visinfo, GLX_DOUBLEBUFFER, - &togl->DoubleFlag); - (void) glXGetConfig(dpy, visinfo, GLX_STEREO, &togl->StereoFlag); - } else { - int attempt; - - /* It may take a few tries to get a visual */ - for (attempt = 0; attempt < MAX_ATTEMPTS; attempt++) { - attrib_count = 0; - attrib_list[attrib_count++] = GLX_USE_GL; - if (togl->RgbaFlag) { - /* RGB[A] mode */ - attrib_list[attrib_count++] = GLX_RGBA; - attrib_list[attrib_count++] = GLX_RED_SIZE; - attrib_list[attrib_count++] = togl->RgbaRed; - attrib_list[attrib_count++] = GLX_GREEN_SIZE; - attrib_list[attrib_count++] = togl->RgbaGreen; - attrib_list[attrib_count++] = GLX_BLUE_SIZE; - attrib_list[attrib_count++] = togl->RgbaBlue; - if (togl->AlphaFlag) { - attrib_list[attrib_count++] = GLX_ALPHA_SIZE; - attrib_list[attrib_count++] = togl->AlphaSize; - } - - /* for EPS Output */ - if (togl->EpsRedMap) - free(togl->EpsRedMap); - if (togl->EpsGreenMap) - free(togl->EpsGreenMap); - if (togl->EpsBlueMap) - free(togl->EpsBlueMap); - togl->EpsRedMap = togl->EpsGreenMap = togl->EpsBlueMap = - NULL; - togl->EpsMapSize = 0; - } else { - /* Color index mode */ - int depth; - - attrib_list[attrib_count++] = GLX_BUFFER_SIZE; - depth = ci_depths[attempt]; - attrib_list[attrib_count++] = depth; - } - if (togl->DepthFlag) { - attrib_list[attrib_count++] = GLX_DEPTH_SIZE; - attrib_list[attrib_count++] = togl->DepthSize; - } - if (togl->DoubleFlag || dbl_flags[attempt]) { - attrib_list[attrib_count++] = GLX_DOUBLEBUFFER; - } - if (togl->StencilFlag) { - attrib_list[attrib_count++] = GLX_STENCIL_SIZE; - attrib_list[attrib_count++] = togl->StencilSize; - } - if (togl->AccumFlag) { - attrib_list[attrib_count++] = GLX_ACCUM_RED_SIZE; - attrib_list[attrib_count++] = togl->AccumRed; - attrib_list[attrib_count++] = GLX_ACCUM_GREEN_SIZE; - attrib_list[attrib_count++] = togl->AccumGreen; - attrib_list[attrib_count++] = GLX_ACCUM_BLUE_SIZE; - attrib_list[attrib_count++] = togl->AccumBlue; - if (togl->AlphaFlag) { - attrib_list[attrib_count++] = GLX_ACCUM_ALPHA_SIZE; - attrib_list[attrib_count++] = togl->AccumAlpha; - } - } - if (togl->AuxNumber != 0) { - attrib_list[attrib_count++] = GLX_AUX_BUFFERS; - attrib_list[attrib_count++] = togl->AuxNumber; - } - if (togl->Indirect) { - directCtx = False; - } - - if (togl->StereoFlag) { - attrib_list[attrib_count++] = GLX_STEREO; - } - attrib_list[attrib_count++] = None; - - visinfo = glXChooseVisual(dpy, Tk_ScreenNumber(togl->TkWin), - attrib_list); - if (visinfo) { - /* found a GLX visual! */ - break; - } - } - - togl->VisInfo = visinfo; - - if (visinfo == NULL) { - Tcl_SetResult(togl->Interp, - TCL_STUPID "Togl: couldn't get visual", TCL_STATIC); - return DUMMY_WINDOW; - } - - /* - * Create a new OpenGL rendering context. - */ - if (togl->ShareList) { - /* share display lists with existing togl widget */ - Togl *shareWith = FindTogl(togl->ShareList); - GLXContext shareCtx; - - if (shareWith) - shareCtx = shareWith->GlCtx; - else - shareCtx = None; - togl->GlCtx = - glXCreateContext(dpy, visinfo, shareCtx, directCtx); - } else { - /* don't share display lists */ - togl->GlCtx = glXCreateContext(dpy, visinfo, None, directCtx); - } - - if (togl->GlCtx == NULL) { - Tcl_SetResult(togl->Interp, - TCL_STUPID "could not create rendering context", - TCL_STATIC); - return DUMMY_WINDOW; - } - - } - } - - -#endif /* TOGL_X11 */ - -#ifdef TOGL_WGL - parentWin = Tk_GetHWND(parent); - hInstance = Tk_GetHINSTANCE(); - if (!ToglClassInitialized) { - ToglClassInitialized = True; - ToglClass.style = CS_HREDRAW | CS_VREDRAW; - ToglClass.cbClsExtra = 0; - ToglClass.cbWndExtra = 4; /* to save struct Togl* */ - ToglClass.hInstance = hInstance; - ToglClass.hbrBackground = NULL; - ToglClass.lpszMenuName = NULL; - ToglClass.lpszClassName = TOGL_CLASS_NAME; - ToglClass.lpfnWndProc = Win32WinProc; - ToglClass.hIcon = NULL; - ToglClass.hCursor = NULL; - if (!RegisterClass(&ToglClass)) { - Tcl_SetResult(togl->Interp, - TCL_STUPID "unable register Togl window class", TCL_STATIC); - return DUMMY_WINDOW; - } - } - - hwnd = CreateWindow(TOGL_CLASS_NAME, NULL, - WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, - togl->Width, togl->Height, parentWin, NULL, hInstance, NULL); - SetWindowLong(hwnd, 0, (LONG) togl); - SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); - - togl->tglGLHdc = GetDC(hwnd); - - pfd.nSize = sizeof (PIXELFORMATDESCRIPTOR); - pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL; - if (togl->DoubleFlag) { - pfd.dwFlags |= PFD_DOUBLEBUFFER; - } - /* The stereo flag is not supported in the current generic OpenGL - * implementation, but may be supported by specific hardware devices. */ - if (togl->StereoFlag) { - pfd.dwFlags |= PFD_STEREO; - } - - if (togl->PixelFormat) { - pixelformat = togl->PixelFormat; - } else { - pfd.cColorBits = togl->RgbaRed + togl->RgbaGreen + togl->RgbaBlue; - pfd.iPixelType = togl->RgbaFlag ? PFD_TYPE_RGBA : PFD_TYPE_COLORINDEX; - /* Alpha bitplanes are not supported in the current generic OpenGL - * implementation, but may be supported by specific hardware devices. */ - pfd.cAlphaBits = togl->AlphaFlag ? togl->AlphaSize : 0; - pfd.cAccumBits = togl->AccumFlag ? (togl->AccumRed + togl->AccumGreen + - togl->AccumBlue + togl->AccumAlpha) : 0; - pfd.cDepthBits = togl->DepthFlag ? togl->DepthSize : 0; - pfd.cStencilBits = togl->StencilFlag ? togl->StencilSize : 0; - /* Auxiliary buffers are not supported in the current generic OpenGL - * implementation, but may be supported by specific hardware devices. */ - pfd.cAuxBuffers = togl->AuxNumber; - pfd.iLayerType = PFD_MAIN_PLANE; - - if ((pixelformat = ChoosePixelFormat(togl->tglGLHdc, &pfd)) == 0) { - Tcl_SetResult(togl->Interp, - TCL_STUPID "Togl: couldn't choose pixel format", - TCL_STATIC); - return DUMMY_WINDOW; - } - } - if (SetPixelFormat(togl->tglGLHdc, pixelformat, &pfd) == FALSE) { - Tcl_SetResult(togl->Interp, - TCL_STUPID "Togl: couldn't choose pixel format", TCL_STATIC); - return DUMMY_WINDOW; - } - - /* Get the actual pixel format */ - DescribePixelFormat(togl->tglGLHdc, pixelformat, sizeof (pfd), &pfd); - if (togl->PixelFormat) { - /* fill in flags normally passed in that affect behavior */ - togl->RgbaFlag = pfd.iPixelType == PFD_TYPE_RGBA; - togl->DoubleFlag = pfd.cDepthBits > 0; - togl->StereoFlag = (pfd.dwFlags & PFD_STEREO) != 0; - // TODO: set depth flag, and more - } else if (togl->StereoFlag && (pfd.dwFlags & PFD_STEREO) == 0) { - Tcl_SetResult(togl->Interp, - TCL_STUPID "Togl: couldn't choose stereo pixel format", - TCL_STATIC); - return DUMMY_WINDOW; - } - - if (togl->ShareContext && FindTogl(togl->ShareContext)) { - /* share OpenGL context with existing Togl widget */ - Togl *shareWith = FindTogl(togl->ShareContext); - - assert(shareWith); - assert(shareWith->tglGLHglrc); - togl->tglGLHglrc = shareWith->tglGLHglrc; - togl->VisInfo = shareWith->VisInfo; - visinfo = togl->VisInfo; - } else { - /* - * Create a new OpenGL rendering context. And check to share lists. - */ - togl->tglGLHglrc = wglCreateContext(togl->tglGLHdc); - - if (togl->ShareList) { - /* share display lists with existing togl widget */ - Togl *shareWith = FindTogl(togl->ShareList); - - if (shareWith) - wglShareLists(shareWith->tglGLHglrc, togl->tglGLHglrc); - } - - if (!togl->tglGLHglrc) { - Tcl_SetResult(togl->Interp, - TCL_STUPID "could not create rendering context", - TCL_STATIC); - return DUMMY_WINDOW; - } - - /* Just for portability, define the simplest visinfo */ - visinfo = &VisInf; - visinfo->visual = DefaultVisual(dpy, DefaultScreen(dpy)); - visinfo->depth = visinfo->visual->bits_per_rgb; - togl->VisInfo = visinfo; - } - -#endif /* TOGL_WGL */ - - - /* - * find a colormap - */ - scrnum = Tk_ScreenNumber(togl->TkWin); - if (togl->RgbaFlag) { - /* Colormap for RGB mode */ -#if defined(TOGL_X11) - cmap = get_rgb_colormap(dpy, scrnum, visinfo, togl->TkWin); - -#elif defined(TOGL_WGL) - if (pfd.dwFlags & PFD_NEED_PALETTE) { - cmap = Win32CreateRgbColormap(pfd); - } else { - cmap = DefaultColormap(dpy, scrnum); - } - /* for EPS Output */ - if (togl->EpsRedMap) - free(togl->EpsRedMap); - if (togl->EpsGreenMap) - free(togl->EpsGreenMap); - if (togl->EpsBlueMap) - free(togl->EpsBlueMap); - togl->EpsRedMap = togl->EpsGreenMap = togl->EpsBlueMap = NULL; - togl->EpsMapSize = 0; - -#elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - cmap = DefaultColormap(dpy, scrnum); - /* for EPS Output */ - if (togl->EpsRedMap) - free(togl->EpsRedMap); - if (togl->EpsGreenMap) - free(togl->EpsGreenMap); - if (togl->EpsBlueMap) - free(togl->EpsBlueMap); - togl->EpsRedMap = togl->EpsGreenMap = togl->EpsBlueMap = NULL; - togl->EpsMapSize = 0; -#endif /* TOGL_X11 */ - } else { - /* Colormap for CI mode */ -#ifdef TOGL_WGL - togl->CiColormapSize = 1 << pfd.cColorBits; - togl->CiColormapSize = togl->CiColormapSize < MAX_CI_COLORMAP_SIZE ? - togl->CiColormapSize : MAX_CI_COLORMAP_SIZE; - -#endif /* TOGL_WGL */ - if (togl->PrivateCmapFlag) { - /* need read/write colormap so user can store own color entries */ -#if defined(TOGL_X11) - cmap = XCreateColormap(dpy, XRootWindow(dpy, visinfo->screen), - visinfo->visual, AllocAll); -#elif defined(TOGL_WGL) - cmap = Win32CreateCiColormap(togl); -#elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - /* need to figure out how to do this correctly on Mac... */ - cmap = DefaultColormap(dpy, scrnum); -#endif /* TOGL_X11 */ - } else { - if (visinfo->visual == DefaultVisual(dpy, scrnum)) { - /* share default/root colormap */ - cmap = Tk_Colormap(togl->TkWin); - } else { - /* make a new read-only colormap */ - cmap = XCreateColormap(dpy, XRootWindow(dpy, visinfo->screen), - visinfo->visual, AllocNone); - } - } - } - -#if !defined(TOGL_AGL) - /* Make sure Tk knows to switch to the new colormap when the cursor is over - * this window when running in color index mode. */ - (void) Tk_SetWindowVisual(togl->TkWin, visinfo->visual, visinfo->depth, - cmap); -#endif - -#ifdef TOGL_WGL - /* Install the colormap */ - SelectPalette(togl->tglGLHdc, ((TkWinColormap *) cmap)->palette, TRUE); - RealizePalette(togl->tglGLHdc); -#endif /* TOGL_WGL */ - -#if defined(TOGL_X11) - swa.colormap = cmap; - swa.border_pixel = 0; - swa.event_mask = ALL_EVENTS_MASK; - window = XCreateWindow(dpy, parent, - 0, 0, togl->Width, togl->Height, - 0, visinfo->depth, - InputOutput, visinfo->visual, - CWBorderPixel | CWColormap | CWEventMask, &swa); - /* Make sure window manager installs our colormap */ - (void) XSetWMColormapWindows(dpy, window, &window, 1); - -#elif defined(TOGL_WGL) - window = Tk_AttachHWND(togl->TkWin, hwnd); - -#elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - { - TkWindow *winPtr = (TkWindow *) togl->TkWin; - - window = TkpMakeWindow(winPtr, parent); - } -#endif /* TOGL_X11 */ - -#ifdef USE_OVERLAY - if (togl->OverlayFlag) { - if (SetupOverlay(togl) == TCL_ERROR) { - fprintf(stderr, "Warning: couldn't setup overlay.\n"); - togl->OverlayFlag = False; - } - } -#endif /* USE_OVERLAY */ - - /* Request the X window to be displayed */ - (void) XMapWindow(dpy, window); - -#if defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - if (togl->ShareContext && FindTogl(togl->ShareContext)) { - /* share OpenGL context with existing Togl widget */ - Togl *shareWith = FindTogl(togl->ShareContext); - - assert(shareWith); - assert(shareWith->aglCtx); - togl->aglCtx = shareWith->aglCtx; - togl->VisInfo = shareWith->VisInfo; - visinfo = togl->VisInfo; - - } else { - AGLContext shareCtx = NULL; - - if (togl->PixelFormat) { - /* fill in RgbaFlag, DoubleFlag, and StereoFlag */ - fmt = (AGLPixelFormat) togl->PixelFormat; - GLint has_rgba, has_doublebuf, has_stereo; - - if (aglDescribePixelFormat(fmt, AGL_RGBA, &has_rgba) && - aglDescribePixelFormat(fmt, AGL_DOUBLEBUFFER, - &has_doublebuf) - && aglDescribePixelFormat(fmt, AGL_STEREO, &has_stereo)) { - togl->RgbaFlag = (has_rgba ? True : False); - togl->DoubleFlag = (has_doublebuf ? True : False); - togl->StereoFlag = (has_stereo ? True : False); - } else { - Tcl_SetResult(togl->Interp, - TCL_STUPID - "Togl: failed querying pixel format attributes", - TCL_STATIC); - return DUMMY_WINDOW; - } - } else { - - /* Need to do this after mapping window, so MacDrawable structure - * is more completely filled in */ - na = 0; - attribs[na++] = AGL_MINIMUM_POLICY; - attribs[na++] = AGL_ROBUST; - if (togl->RgbaFlag) { - /* RGB[A] mode */ - attribs[na++] = AGL_RGBA; - attribs[na++] = AGL_RED_SIZE; - attribs[na++] = togl->RgbaRed; - attribs[na++] = AGL_GREEN_SIZE; - attribs[na++] = togl->RgbaGreen; - attribs[na++] = AGL_BLUE_SIZE; - attribs[na++] = togl->RgbaBlue; - if (togl->AlphaFlag) { - attribs[na++] = AGL_ALPHA_SIZE; - attribs[na++] = togl->AlphaSize; - } - } else { - /* Color index mode */ - attribs[na++] = AGL_BUFFER_SIZE; - attribs[na++] = 8; - } - if (togl->DepthFlag) { - attribs[na++] = AGL_DEPTH_SIZE; - attribs[na++] = togl->DepthSize; - } - if (togl->DoubleFlag) { - attribs[na++] = AGL_DOUBLEBUFFER; - } - if (togl->StencilFlag) { - attribs[na++] = AGL_STENCIL_SIZE; - attribs[na++] = togl->StencilSize; - } - if (togl->AccumFlag) { - attribs[na++] = AGL_ACCUM_RED_SIZE; - attribs[na++] = togl->AccumRed; - attribs[na++] = AGL_ACCUM_GREEN_SIZE; - attribs[na++] = togl->AccumGreen; - attribs[na++] = AGL_ACCUM_BLUE_SIZE; - attribs[na++] = togl->AccumBlue; - if (togl->AlphaFlag) { - attribs[na++] = AGL_ACCUM_ALPHA_SIZE; - attribs[na++] = togl->AccumAlpha; - } - } - if (togl->AuxNumber != 0) { - attribs[na++] = AGL_AUX_BUFFERS; - attribs[na++] = togl->AuxNumber; - } - attribs[na++] = AGL_NONE; - - if ((fmt = aglChoosePixelFormat(NULL, 0, attribs)) == NULL) { - Tcl_SetResult(togl->Interp, - TCL_STUPID "Togl: couldn't choose pixel format", - TCL_STATIC); - return DUMMY_WINDOW; - } - } - - /* - * Check whether to share lists. - */ - if (togl->ShareList) { - /* share display lists with existing togl widget */ - Togl *shareWith = FindTogl(togl->ShareList); - - if (shareWith) - shareCtx = shareWith->aglCtx; - } - if ((togl->aglCtx = aglCreateContext(fmt, shareCtx)) == NULL) { - GLenum err = aglGetError(); - - aglDestroyPixelFormat(fmt); - if (err == AGL_BAD_MATCH) - Tcl_SetResult(togl->Interp, - TCL_STUPID - "Togl: couldn't create context, shared context doesn't match", - TCL_STATIC); - else if (err == AGL_BAD_CONTEXT) - Tcl_SetResult(togl->Interp, - TCL_STUPID - "Togl: couldn't create context, bad shared context", - TCL_STATIC); - else if (err == AGL_BAD_PIXELFMT) - Tcl_SetResult(togl->Interp, - TCL_STUPID - "Togl: couldn't create context, bad pixel format", - TCL_STATIC); - else - Tcl_SetResult(togl->Interp, - TCL_STUPID - "Togl: couldn't create context, unknown reason", - TCL_STATIC); - return DUMMY_WINDOW; - } - - aglDestroyPixelFormat(fmt); - if (!aglSetDrawable(togl->aglCtx, -# if defined(TOGL_AGL) - ((MacDrawable *) (window))->toplevel->grafPtr -# else - ((MacDrawable *) (window))->toplevel->portPtr -# endif - )) { - aglDestroyContext(togl->aglCtx); - Tcl_SetResult(togl->Interp, - TCL_STUPID "Togl: couldn't set drawable", TCL_STATIC); - return DUMMY_WINDOW; - } - - /* Just for portability, define the simplest visinfo */ - visinfo = &VisInf; - visinfo->visual = DefaultVisual(dpy, DefaultScreen(dpy)); - visinfo->depth = visinfo->visual->bits_per_rgb; - - Tk_SetWindowVisual(togl->TkWin, visinfo->visual, visinfo->depth, cmap); - } -#endif /* TOGL_AGL_CLASSIC || TOGL_AGL */ - -#if defined(TOGL_X11) - /* Check for a single/double buffering snafu */ - { - int dbl_flag; - - if (glXGetConfig(dpy, visinfo, GLX_DOUBLEBUFFER, &dbl_flag)) { - if (!togl->DoubleFlag && dbl_flag) { - /* We requested single buffering but had to accept a */ - /* double buffered visual. Set the GL draw buffer to */ - /* be the front buffer to simulate single buffering. */ - glDrawBuffer(GL_FRONT); - } - } - } -#endif /* TOGL_X11 */ - - /* for EPS Output */ - if (!togl->RgbaFlag) { - int index_size; - -#if defined(TOGL_X11) || defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - GLint index_bits; - - glGetIntegerv(GL_INDEX_BITS, &index_bits); - index_size = 1 << index_bits; -#elif defined(TOGL_WGL) - index_size = togl->CiColormapSize; -#endif /* TOGL_X11 */ - if (togl->EpsMapSize != index_size) { - if (togl->EpsRedMap) - free(togl->EpsRedMap); - if (togl->EpsGreenMap) - free(togl->EpsGreenMap); - if (togl->EpsBlueMap) - free(togl->EpsBlueMap); - togl->EpsMapSize = index_size; - togl->EpsRedMap = (GLfloat *) calloc(index_size, sizeof (GLfloat)); - togl->EpsGreenMap = - (GLfloat *) calloc(index_size, sizeof (GLfloat)); - togl->EpsBlueMap = (GLfloat *) calloc(index_size, sizeof (GLfloat)); - } - } - - return window; -} - -/* - * Togl_WorldChanged - * - * Add support for setgrid option. - */ -static void -Togl_WorldChanged(ClientData instanceData) -{ - Togl *togl = (Togl *) instanceData; - - Tk_GeometryRequest(togl->TkWin, togl->Width, togl->Height); - Tk_SetInternalBorder(togl->TkWin, 0); - if (togl->SetGrid > 0) { - Tk_SetGrid(togl->TkWin, togl->Width / togl->SetGrid, - togl->Height / togl->SetGrid, togl->SetGrid, togl->SetGrid); - } else { - Tk_UnsetGrid(togl->TkWin); - } -} - -/* - * ToglCmdDeletedProc - * - * This procedure is invoked when a widget command is deleted. If - * the widget isn't already in the process of being destroyed, - * this command destroys it. - * - * Results: - * None. - * - * Side effects: - * The widget is destroyed. - * - *---------------------------------------------------------------------- - */ -static void -ToglCmdDeletedProc(ClientData clientData) -{ - Togl *togl = (Togl *) clientData; - Tk_Window tkwin = togl->TkWin; - - /* - * This procedure could be invoked either because the window was - * destroyed and the command was then deleted (in which case tkwin - * is NULL) or because the command was deleted, and then this procedure - * destroys the widget. - */ - - if (togl && tkwin) { - Tk_DeleteEventHandler(tkwin, - ExposureMask | StructureNotifyMask, - Togl_EventProc, (ClientData) togl); - } -#if defined(TOGL_X11) - if (togl->GlCtx) { - if (FindToglWithSameContext(togl) == NULL) - glXDestroyContext(togl->display, togl->GlCtx); - togl->GlCtx = NULL; - } -# ifdef USE_OVERLAY - if (togl->OverlayCtx) { - Tcl_HashEntry *entryPtr; - TkWindow *winPtr = (TkWindow *) togl->TkWin; - - if (winPtr) { - entryPtr = Tcl_FindHashEntry(&winPtr->dispPtr->winTable, - (char *) togl->OverlayWindow); - Tcl_DeleteHashEntry(entryPtr); - } - if (FindToglWithSameOverlayContext(togl) == NULL) - glXDestroyContext(togl->display, togl->OverlayCtx); - togl->OverlayCtx = NULL; - } -# endif /* USE_OVERLAY */ -#endif - /* TODO: delete contexts on other platforms */ - - if (tkwin != NULL) { - if (togl->SetGrid > 0) { - Tk_UnsetGrid(tkwin); - } - togl->TkWin = NULL; - Tk_DestroyWindow(tkwin); - } -} - - -/* - * Togl_Destroy - * - * Gets called when an Togl widget is destroyed. - */ -static void -Togl_Destroy( -#if (TK_MAJOR_VERSION * 100 + TK_MINOR_VERSION) >= 401 - char * -#else - ClientData -#endif - clientData) -{ - Togl *togl = (Togl *) clientData; - - Tk_FreeOptions(configSpecs, WIDGREC togl, togl->display, 0); - -#ifndef NO_TK_CURSOR - if (togl->Cursor != None) { - Tk_FreeCursor(togl->display, togl->Cursor); - } -#endif - if (togl->DestroyProc) { - togl->DestroyProc(togl); - } - - /* remove from linked list */ - RemoveFromList(togl); - -#if !defined(TOGL_WGL) - /* TODO: why not on Windows? */ - free(togl); -#endif -} - - - -/* - * This gets called to handle Togl window configuration events - */ -static void -Togl_EventProc(ClientData clientData, XEvent *eventPtr) -{ - Togl *togl = (Togl *) clientData; - - switch (eventPtr->type) { - case Expose: - if (eventPtr->xexpose.count == 0) { - if (!togl->UpdatePending - && eventPtr->xexpose.window == Tk_WindowId(togl->TkWin)) { - Togl_PostRedisplay(togl); - } -#if defined(TOGL_X11) - if (!togl->OverlayUpdatePending && togl->OverlayFlag - && togl->OverlayIsMapped - && eventPtr->xexpose.window == togl->OverlayWindow) { - Togl_PostOverlayRedisplay(togl); - } -#endif /* TOGL_X11 */ - } - break; - case ConfigureNotify: - if (togl->Width != Tk_Width(togl->TkWin) - || togl->Height != Tk_Height(togl->TkWin)) { - togl->Width = Tk_Width(togl->TkWin); - togl->Height = Tk_Height(togl->TkWin); - (void) XResizeWindow(Tk_Display(togl->TkWin), - Tk_WindowId(togl->TkWin), togl->Width, togl->Height); -#if defined(TOGL_X11) - if (togl->OverlayFlag) { - (void) XResizeWindow(Tk_Display(togl->TkWin), - togl->OverlayWindow, togl->Width, togl->Height); - (void) XRaiseWindow(Tk_Display(togl->TkWin), - togl->OverlayWindow); - } -#endif /* TOGL_X11 */ - Togl_MakeCurrent(togl); - if (togl->ReshapeProc) { - togl->ReshapeProc(togl); - } else { - glViewport(0, 0, togl->Width, togl->Height); -#if defined(TOGL_X11) - if (togl->OverlayFlag) { - Togl_UseLayer(togl, TOGL_OVERLAY); - glViewport(0, 0, togl->Width, togl->Height); - Togl_UseLayer(togl, TOGL_NORMAL); - } -#endif /* TOGL_X11 */ - } -#ifndef TOGL_WGL /* causes double redisplay on Win32 platform */ - Togl_PostRedisplay(togl); -#endif /* TOGL_WGL */ - } - break; - case MapNotify: -#if defined(TOGL_AGL) - { - /* - * See comment for the UnmapNotify case below. - */ - AGLDrawable d = TkMacOSXGetDrawablePort(Tk_WindowId(togl->TkWin)); - - aglSetDrawable(togl->aglCtx, d); - } -#endif /* TOGL_AGL */ - break; - case UnmapNotify: -#if defined(TOGL_AGL) - { - /* - * For Mac OS X Aqua, Tk subwindows are not implemented as - * separate Aqua windows. They are just different regions of - * a single Aqua window. To unmap them they are just not drawn. - * Have to disconnect the AGL context otherwise they will continue - * to be displayed directly by Aqua. - */ - aglSetDrawable(togl->aglCtx, NULL); - } -#endif /* TOGL_AGL */ - break; - case DestroyNotify: - if (togl->TkWin != NULL) { - if (togl->SetGrid > 0) { - Tk_UnsetGrid(togl->TkWin); - } - togl->TkWin = NULL; -#if (TCL_MAJOR_VERSION * 100 + TCL_MINOR_VERSION) >= 800 - /* This function new in Tcl/Tk 8.0 */ - (void) Tcl_DeleteCommandFromToken(togl->Interp, togl->widgetCmd); -#endif - } - if (togl->TimerProc != NULL) { -#if (TK_MAJOR_VERSION * 100 + TK_MINOR_VERSION) >= 401 - Tcl_DeleteTimerHandler(togl->timerHandler); -#else - Tk_DeleteTimerHandler(togl->timerHandler); -#endif - - } - if (togl->UpdatePending) { -#if (TCL_MAJOR_VERSION * 100 + TCL_MINOR_VERSION) >= 705 - Tcl_CancelIdleCall(Togl_Render, (ClientData) togl); -#else - Tk_CancelIdleCall(Togl_Render, (ClientData) togl); -#endif - } -#if (TK_MAJOR_VERSION * 100 + TK_MINOR_VERSION) >= 401 - Tcl_EventuallyFree((ClientData) togl, Togl_Destroy); -#else - Tk_EventuallyFree((ClientData) togl, Togl_Destroy); -#endif - - break; - default: - /* nothing */ - ; - } -} - - - -void -Togl_PostRedisplay(Togl *togl) -{ - if (!togl->UpdatePending) { - togl->UpdatePending = True; - Tk_DoWhenIdle(Togl_Render, (ClientData) togl); - } -} - - - -void -Togl_SwapBuffers(const Togl *togl) -{ - if (togl->DoubleFlag) { -#if defined(TOGL_WGL) - int res = SwapBuffers(togl->tglGLHdc); - - assert(res == TRUE); -#elif defined(TOGL_X11) - glXSwapBuffers(Tk_Display(togl->TkWin), Tk_WindowId(togl->TkWin)); -#elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - aglSwapBuffers(togl->aglCtx); -#endif /* TOGL_WGL */ - } else { - glFlush(); - } -} - - - -const char * -Togl_Ident(const Togl *togl) -{ - return togl->Ident; -} - - -int -Togl_Width(const Togl *togl) -{ - return togl->Width; -} - - -int -Togl_Height(const Togl *togl) -{ - return togl->Height; -} - - -Tcl_Interp * -Togl_Interp(const Togl *togl) -{ - return togl->Interp; -} - - -Tk_Window -Togl_TkWin(const Togl *togl) -{ - return togl->TkWin; -} - - -#if defined(TOGL_X11) -/* - * A replacement for XAllocColor. This function should never - * fail to allocate a color. When XAllocColor fails, we return - * the nearest matching color. If we have to allocate many colors - * this function isn't too efficient; the XQueryColors() could be - * done just once. - * Written by Michael Pichler, Brian Paul, Mark Kilgard - * Input: dpy - X display - * cmap - X colormap - * cmapSize - size of colormap - * In/Out: color - the XColor struct - * Output: exact - 1=exact color match, 0=closest match - */ -static void -noFaultXAllocColor(Display *dpy, Colormap cmap, int cmapSize, - XColor *color, int *exact) -{ - XColor *ctable, subColor; - int i, bestmatch; - double mindist; /* 3*2^16^2 exceeds long int precision. */ - - /* First try just using XAllocColor. */ - if (XAllocColor(dpy, cmap, color)) { - *exact = 1; - return; - } - - /* Retrieve color table entries. */ - /* XXX alloca candidate. */ - ctable = (XColor *) malloc(cmapSize * sizeof (XColor)); - for (i = 0; i < cmapSize; i++) { - ctable[i].pixel = i; - } - (void) XQueryColors(dpy, cmap, ctable, cmapSize); - - /* Find best match. */ - bestmatch = -1; - mindist = 0; - for (i = 0; i < cmapSize; i++) { - double dr = (double) color->red - (double) ctable[i].red; - double dg = (double) color->green - (double) ctable[i].green; - double db = (double) color->blue - (double) ctable[i].blue; - double dist = dr * dr + dg * dg + db * db; - - if (bestmatch < 0 || dist < mindist) { - bestmatch = i; - mindist = dist; - } - } - - /* Return result. */ - subColor.red = ctable[bestmatch].red; - subColor.green = ctable[bestmatch].green; - subColor.blue = ctable[bestmatch].blue; - free(ctable); - /* Try to allocate the closest match color. This should only fail if the - * cell is read/write. Otherwise, we're incrementing the cell's reference - * count. */ - if (!XAllocColor(dpy, cmap, &subColor)) { - /* do this to work around a problem reported by Frank Ortega */ - subColor.pixel = (unsigned long) bestmatch; - subColor.red = ctable[bestmatch].red; - subColor.green = ctable[bestmatch].green; - subColor.blue = ctable[bestmatch].blue; - subColor.flags = DoRed | DoGreen | DoBlue; - } - *color = subColor; -} - -#elif defined(TOGL_WGL) - -static UINT -Win32AllocColor(const Togl *togl, float red, float green, float blue) -{ - /* Modified version of XAllocColor emulation of Tk. - returns index, - * instead of color itself - allocates logical palette entry even for - * non-palette devices */ - - TkWinColormap *cmap = (TkWinColormap *) Tk_Colormap(togl->TkWin); - UINT index; - COLORREF newColor, closeColor; - PALETTEENTRY entry, closeEntry; - int new, refCount; - Tcl_HashEntry *entryPtr; - - entry.peRed = (unsigned char) (red * 255 + .5); - entry.peGreen = (unsigned char) (green * 255 + .5); - entry.peBlue = (unsigned char) (blue * 255 + .5); - entry.peFlags = 0; - - /* - * Find the nearest existing palette entry. - */ - - newColor = RGB(entry.peRed, entry.peGreen, entry.peBlue); - index = GetNearestPaletteIndex(cmap->palette, newColor); - GetPaletteEntries(cmap->palette, index, 1, &closeEntry); - closeColor = RGB(closeEntry.peRed, closeEntry.peGreen, closeEntry.peBlue); - - /* - * If this is not a duplicate and colormap is not full, allocate a new entry. - */ - - if (newColor != closeColor) { - if (cmap->size == (unsigned int) togl->CiColormapSize) { - entry = closeEntry; - } else { - cmap->size++; - ResizePalette(cmap->palette, cmap->size); - index = cmap->size - 1; - SetPaletteEntries(cmap->palette, index, 1, &entry); - SelectPalette(togl->tglGLHdc, cmap->palette, TRUE); - RealizePalette(togl->tglGLHdc); - } - } - newColor = PALETTERGB(entry.peRed, entry.peGreen, entry.peBlue); - entryPtr = Tcl_CreateHashEntry(&cmap->refCounts, (char *) newColor, &new); - if (new) { - refCount = 1; - } else { - refCount = ((int) Tcl_GetHashValue(entryPtr)) + 1; - } - Tcl_SetHashValue(entryPtr, (ClientData) refCount); - - /* for EPS output */ - togl->EpsRedMap[index] = (GLfloat) (entry.peRed / 255.0); - togl->EpsGreenMap[index] = (GLfloat) (entry.peGreen / 255.0); - togl->EpsBlueMap[index] = (GLfloat) (entry.peBlue / 255.0); - return index; -} - -static void -Win32FreeColor(const Togl *togl, unsigned long index) -{ - TkWinColormap *cmap = (TkWinColormap *) Tk_Colormap(togl->TkWin); - COLORREF cref; - UINT count, refCount; - PALETTEENTRY entry, *entries; - Tcl_HashEntry *entryPtr; - - if (index >= cmap->size) { - panic("Tried to free a color that isn't allocated."); - } - GetPaletteEntries(cmap->palette, index, 1, &entry); - cref = PALETTERGB(entry.peRed, entry.peGreen, entry.peBlue); - entryPtr = Tcl_FindHashEntry(&cmap->refCounts, (char *) cref); - if (!entryPtr) { - panic("Tried to free a color that isn't allocated."); - } - refCount = (int) Tcl_GetHashValue(entryPtr) - 1; - if (refCount == 0) { - count = cmap->size - index; - entries = (PALETTEENTRY *) ckalloc(sizeof (PALETTEENTRY) * count); - GetPaletteEntries(cmap->palette, index + 1, count, entries); - SetPaletteEntries(cmap->palette, index, count, entries); - SelectPalette(togl->tglGLHdc, cmap->palette, TRUE); - RealizePalette(togl->tglGLHdc); - ckfree((char *) entries); - cmap->size--; - Tcl_DeleteHashEntry(entryPtr); - } else { - Tcl_SetHashValue(entryPtr, (ClientData) refCount); - } -} - -static void -Win32SetColor(const Togl *togl, - unsigned long index, float red, float green, float blue) -{ - TkWinColormap *cmap = (TkWinColormap *) Tk_Colormap(togl->TkWin); - PALETTEENTRY entry; - - entry.peRed = (unsigned char) (red * 255 + .5); - entry.peGreen = (unsigned char) (green * 255 + .5); - entry.peBlue = (unsigned char) (blue * 255 + .5); - entry.peFlags = 0; - SetPaletteEntries(cmap->palette, index, 1, &entry); - SelectPalette(togl->tglGLHdc, cmap->palette, TRUE); - RealizePalette(togl->tglGLHdc); - - /* for EPS output */ - togl->EpsRedMap[index] = (GLfloat) (entry.peRed / 255.0); - togl->EpsGreenMap[index] = (GLfloat) (entry.peGreen / 255.0); - togl->EpsBlueMap[index] = (GLfloat) (entry.peBlue / 255.0); -} -#endif /* TOGL_X11 */ - - -unsigned long -Togl_AllocColor(const Togl *togl, float red, float green, float blue) -{ - if (togl->RgbaFlag) { - (void) fprintf(stderr, - "Error: Togl_AllocColor illegal in RGBA mode.\n"); - return 0; - } - /* TODO: maybe not... */ - if (togl->PrivateCmapFlag) { - (void) fprintf(stderr, - "Error: Togl_FreeColor illegal with private colormap\n"); - return 0; - } -#if defined(TOGL_X11) - { - XColor xcol; - int exact; - - xcol.red = (short) (red * 65535.0); - xcol.green = (short) (green * 65535.0); - xcol.blue = (short) (blue * 65535.0); - - noFaultXAllocColor(Tk_Display(togl->TkWin), Tk_Colormap(togl->TkWin), - Tk_Visual(togl->TkWin)->map_entries, &xcol, &exact); - /* for EPS output */ - togl->EpsRedMap[xcol.pixel] = (float) xcol.red / 65535.0; - togl->EpsGreenMap[xcol.pixel] = (float) xcol.green / 65535.0; - togl->EpsBlueMap[xcol.pixel] = (float) xcol.blue / 65535.0; - - return xcol.pixel; - } - -#elif defined(TOGL_WGL) - return Win32AllocColor(togl, red, green, blue); - -#elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - /* still need to implement this on Mac... */ - return 0; - -#endif /* TOGL_X11 */ -} - - - -void -Togl_FreeColor(const Togl *togl, unsigned long pixel) -{ - if (togl->RgbaFlag) { - (void) fprintf(stderr, - "Error: Togl_AllocColor illegal in RGBA mode.\n"); - return; - } - /* TODO: maybe not... */ - if (togl->PrivateCmapFlag) { - (void) fprintf(stderr, - "Error: Togl_FreeColor illegal with private colormap\n"); - return; - } -#if defined(TOGL_X11) - (void) XFreeColors(Tk_Display(togl->TkWin), Tk_Colormap(togl->TkWin), - &pixel, 1, 0); -#elif defined(TOGL_WGL) - Win32FreeColor(togl, pixel); -#endif /* TOGL_X11 */ -} - - - -void -Togl_SetColor(const Togl *togl, - unsigned long index, float red, float green, float blue) -{ - - if (togl->RgbaFlag) { - (void) fprintf(stderr, - "Error: Togl_AllocColor illegal in RGBA mode.\n"); - return; - } - if (!togl->PrivateCmapFlag) { - (void) fprintf(stderr, - "Error: Togl_SetColor requires a private colormap\n"); - return; - } -#if defined(TOGL_X11) - { - XColor xcol; - - xcol.pixel = index; - xcol.red = (short) (red * 65535.0); - xcol.green = (short) (green * 65535.0); - xcol.blue = (short) (blue * 65535.0); - xcol.flags = DoRed | DoGreen | DoBlue; - - (void) XStoreColor(Tk_Display(togl->TkWin), Tk_Colormap(togl->TkWin), - &xcol); - - /* for EPS output */ - togl->EpsRedMap[xcol.pixel] = (float) xcol.red / 65535.0; - togl->EpsGreenMap[xcol.pixel] = (float) xcol.green / 65535.0; - togl->EpsBlueMap[xcol.pixel] = (float) xcol.blue / 65535.0; - } -#elif defined(TOGL_WGL) - Win32SetColor(togl, index, red, green, blue); -#endif /* TOGL_X11 */ -} - - -#if TOGL_USE_FONTS == 1 - -# if defined(TOGL_WGL) -# include "tkWinInt.h" -# include "tkFont.h" - -/* - * The following structure represents Windows' implementation of a font. - */ - -typedef struct WinFont -{ - TkFont font; /* Stuff used by generic font package. Must be - * first in structure. */ - HFONT hFont; /* Windows information about font. */ - HWND hwnd; /* Toplevel window of application that owns - * this font, used for getting HDC. */ - int widths[256]; /* Widths of first 256 chars in this font. */ -} WinFont; -# endif /* TOGL_WGL */ - - -# define MAX_FONTS 1000 -static GLuint ListBase[MAX_FONTS]; -static GLuint ListCount[MAX_FONTS]; - - - -/* - * Load the named bitmap font as a sequence of bitmaps in a display list. - * fontname may be one of the predefined fonts like TOGL_BITMAP_8_BY_13 - * or an X font name, or a Windows font name, etc. - */ -GLuint -Togl_LoadBitmapFont(const Togl *togl, const char *fontname) -{ - static Bool FirstTime = True; - -# if defined(TOGL_X11) - XFontStruct *fontinfo; -# elif defined(TOGL_WGL) - WinFont *winfont; - HFONT oldFont; - TEXTMETRIC tm; -# endif - /* TOGL_X11 */ - int first, last, count; - GLuint fontbase; - const char *name; - - /* Initialize the ListBase and ListCount arrays */ - if (FirstTime) { - int i; - - for (i = 0; i < MAX_FONTS; i++) { - ListBase[i] = ListCount[i] = 0; - } - FirstTime = False; - } - - /* - * This method of selecting X fonts according to a TOGL_ font name - * is a kludge. To be fixed when I find time... - */ - if (fontname == TOGL_BITMAP_8_BY_13) { - name = "8x13"; - } else if (fontname == TOGL_BITMAP_9_BY_15) { - name = "9x15"; - } else if (fontname == TOGL_BITMAP_TIMES_ROMAN_10) { - name = "-adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1"; - } else if (fontname == TOGL_BITMAP_TIMES_ROMAN_24) { - name = "-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1"; - } else if (fontname == TOGL_BITMAP_HELVETICA_10) { - name = "-adobe-helvetica-medium-r-normal--10-100-75-75-p-57-iso8859-1"; - } else if (fontname == TOGL_BITMAP_HELVETICA_12) { - name = "-adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1"; - } else if (fontname == TOGL_BITMAP_HELVETICA_18) { - name = "-adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1"; - } else if (!fontname) { - name = DEFAULT_FONTNAME; - } else { - name = (const char *) fontname; - } - - assert(name); - -# if defined(TOGL_X11) - fontinfo = (XFontStruct *) XLoadQueryFont(Tk_Display(togl->TkWin), name); - if (!fontinfo) { - return 0; - } - first = fontinfo->min_char_or_byte2; - last = fontinfo->max_char_or_byte2; -# elif defined(TOGL_WGL) - winfont = (WinFont *) Tk_GetFont(togl->Interp, togl->TkWin, name); - if (!winfont) { - return 0; - } - oldFont = SelectObject(togl->tglGLHdc, winfont->hFont); - GetTextMetrics(togl->tglGLHdc, &tm); - first = tm.tmFirstChar; - last = tm.tmLastChar; -# elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - first = 10; /* don't know how to determine font range on - * Mac... */ - last = 127; -# endif - /* TOGL_X11 */ - - count = last - first + 1; - fontbase = glGenLists((GLuint) (last + 1)); - if (fontbase == 0) { -# ifdef TOGL_WGL - SelectObject(togl->tglGLHdc, oldFont); - Tk_FreeFont((Tk_Font) winfont); -# endif - /* TOGL_WGL */ - return 0; - } -# if defined(TOGL_WGL) - wglUseFontBitmaps(togl->tglGLHdc, first, count, (int) fontbase + first); - SelectObject(togl->tglGLHdc, oldFont); - Tk_FreeFont((Tk_Font) winfont); -# elif defined(TOGL_X11) - glXUseXFont(fontinfo->fid, first, count, (int) fontbase + first); -# elif defined(TOGL_AGL_CLASSIC) || defined(TOGL_AGL) - aglUseFont(togl->aglCtx, 1, 0, 14, /* for now, only app font, regular - * 14-point */ - 10, 118, fontbase + first); -# endif - - /* Record the list base and number of display lists for - * Togl_UnloadBitmapFont(). */ - { - int i; - - for (i = 0; i < MAX_FONTS; i++) { - if (ListBase[i] == 0) { - ListBase[i] = fontbase; - ListCount[i] = last + 1; - break; - } - } - } - - return fontbase; -} - - - -/* - * Release the display lists which were generated by Togl_LoadBitmapFont(). - */ -void -Togl_UnloadBitmapFont(const Togl *togl, GLuint fontbase) -{ - int i; - - (void) togl; - for (i = 0; i < MAX_FONTS; i++) { - if (ListBase[i] == fontbase) { - glDeleteLists(ListBase[i], ListCount[i]); - ListBase[i] = ListCount[i] = 0; - return; - } - } -} - -#endif /* TOGL_USE_FONTS */ - - -/* - * Overlay functions - */ - - -void -Togl_UseLayer(Togl *togl, int layer) -{ - if (!togl->OverlayWindow) - return; - if (layer == TOGL_OVERLAY) { -#if defined(TOGL_WGL) - int res = wglMakeCurrent(togl->tglGLHdc, togl->tglGLOverlayHglrc); - - assert(res == TRUE); -#elif defined(TOGL_X11) - (void) glXMakeCurrent(Tk_Display(togl->TkWin), - togl->OverlayWindow, togl->OverlayCtx); -# if defined(__sgi) - if (togl->OldStereoFlag) - oldStereoMakeCurrent(Tk_Display(togl->TkWin), - togl->OverlayWindow, togl->OverlayCtx); -# endif - /* __sgi STEREO */ -#endif /* TOGL_WGL */ - } else if (layer == TOGL_NORMAL) { -#if defined(TOGL_WGL) - int res = wglMakeCurrent(togl->tglGLHdc, togl->tglGLHglrc); - - assert(res == TRUE); -#elif defined(TOGL_X11) - (void) glXMakeCurrent(Tk_Display(togl->TkWin), - Tk_WindowId(togl->TkWin), togl->GlCtx); -# if defined(__sgi) - if (togl->OldStereoFlag) - oldStereoMakeCurrent(Tk_Display(togl->TkWin), - Tk_WindowId(togl->TkWin), togl->GlCtx); -# endif - /* __sgi STEREO */ -#endif /* TOGL_WGL */ - } else { - /* error */ - } -} - - -void -Togl_ShowOverlay(Togl *togl) -{ -#if defined(TOGL_X11) /* not yet implemented on Windows */ - if (togl->OverlayWindow) { - (void) XMapWindow(Tk_Display(togl->TkWin), togl->OverlayWindow); - (void) XInstallColormap(Tk_Display(togl->TkWin), togl->OverlayCmap); - togl->OverlayIsMapped = True; - } -#endif /* TOGL_X11 */ -} - - -void -Togl_HideOverlay(Togl *togl) -{ - if (togl->OverlayWindow && togl->OverlayIsMapped) { - (void) XUnmapWindow(Tk_Display(togl->TkWin), togl->OverlayWindow); - togl->OverlayIsMapped = False; - } -} - - -void -Togl_PostOverlayRedisplay(Togl *togl) -{ - if (!togl->OverlayUpdatePending - && togl->OverlayWindow && togl->OverlayDisplayProc) { - Tk_DoWhenIdle(RenderOverlay, (ClientData) togl); - togl->OverlayUpdatePending = True; - } -} - - -void -Togl_OverlayDisplayFunc(Togl_Callback *proc) -{ - DefaultOverlayDisplayProc = proc; -} - - -int -Togl_ExistsOverlay(const Togl *togl) -{ - return togl->OverlayFlag; -} - - -int -Togl_GetOverlayTransparentValue(const Togl *togl) -{ - return togl->OverlayTransparentPixel; -} - - -int -Togl_IsMappedOverlay(const Togl *togl) -{ - return togl->OverlayFlag && togl->OverlayIsMapped; -} - - -unsigned long -Togl_AllocColorOverlay(const Togl *togl, float red, float green, float blue) -{ -#if defined(TOGL_X11) /* not yet implemented on Windows */ - if (togl->OverlayFlag && togl->OverlayCmap) { - XColor xcol; - - xcol.red = (short) (red * 65535.0); - xcol.green = (short) (green * 65535.0); - xcol.blue = (short) (blue * 65535.0); - if (!XAllocColor(Tk_Display(togl->TkWin), togl->OverlayCmap, &xcol)) - return (unsigned long) -1; - return xcol.pixel; - } -#endif /* TOGL_X11 */ - return (unsigned long) -1; -} - - -void -Togl_FreeColorOverlay(const Togl *togl, unsigned long pixel) -{ -#if defined(TOGL_X11) /* not yet implemented on Windows */ - if (togl->OverlayFlag && togl->OverlayCmap) { - (void) XFreeColors(Tk_Display(togl->TkWin), togl->OverlayCmap, &pixel, - 1, 0); - } -#endif /* TOGL_X11 */ -} - - -/* - * User client data - */ - -void -Togl_ClientData(ClientData clientData) -{ - DefaultClientData = clientData; -} - - -ClientData -Togl_GetClientData(const Togl *togl) -{ - return togl->Client_Data; -} - - -void -Togl_SetClientData(Togl *togl, ClientData clientData) -{ - togl->Client_Data = clientData; -} - - -/* - * X11-only functions - * Contributed by Miguel A. De Riera Pasenau (miguel@DALILA.UPC.ES) - */ - -Display * -Togl_Display(const Togl *togl) -{ - return Tk_Display(togl->TkWin); -} - -Screen * -Togl_Screen(const Togl *togl) -{ - return Tk_Screen(togl->TkWin); -} - -int -Togl_ScreenNumber(const Togl *togl) -{ - return Tk_ScreenNumber(togl->TkWin); -} - -Colormap -Togl_Colormap(const Togl *togl) -{ - return Tk_Colormap(togl->TkWin); -} - - - -#ifdef MESA_COLOR_HACK -/* - * Let's know how many free colors do we have - */ -# if 0 -static unsigned char rojo[] = { 4, 39, 74, 110, 145, 181, 216, 251 }, verde[] = { -4, 39, 74, 110, 145, 181, 216, 251}, azul[] = { -4, 39, 74, 110, 145, 181, 216, 251}; - -unsigned char rojo[] = { 4, 36, 72, 109, 145, 182, 218, 251 }, verde[] = { -4, 36, 72, 109, 145, 182, 218, 251}, azul[] = { -4, 36, 72, 109, 145, 182, 218, 251}; - -azul[] = { -0, 85, 170, 255}; -# endif - -# define RLEVELS 5 -# define GLEVELS 9 -# define BLEVELS 5 - -/* to free dithered_rgb_colormap pixels allocated by Mesa */ -static unsigned long *ToglMesaUsedPixelCells = NULL; -static int ToglMesaUsedFreeCells = 0; - -static int -get_free_color_cells(Display *display, int screen, Colormap colormap) -{ - if (!ToglMesaUsedPixelCells) { - XColor xcol; - int i; - int colorsfailed, ncolors = XDisplayCells(display, screen); - - long r, g, b; - - ToglMesaUsedPixelCells = - (unsigned long *) calloc(ncolors, sizeof (unsigned long)); - - /* Allocate X colors and initialize color_table[], red_table[], etc */ - /* de Mesa 2.1: xmesa1.c setup_dithered_(...) */ - i = colorsfailed = 0; - for (r = 0; r < RLEVELS; r++) - for (g = 0; g < GLEVELS; g++) - for (b = 0; b < BLEVELS; b++) { - int exact; - - xcol.red = (r * 65535) / (RLEVELS - 1); - xcol.green = (g * 65535) / (GLEVELS - 1); - xcol.blue = (b * 65535) / (BLEVELS - 1); - noFaultXAllocColor(display, colormap, ncolors, - &xcol, &exact); - ToglMesaUsedPixelCells[i++] = xcol.pixel; - if (!exact) { - colorsfailed++; - } - } - ToglMesaUsedFreeCells = i; - - XFreeColors(display, colormap, ToglMesaUsedPixelCells, - ToglMesaUsedFreeCells, 0x00000000); - } - return ToglMesaUsedFreeCells; -} - - -static void -free_default_color_cells(Display *display, Colormap colormap) -{ - if (ToglMesaUsedPixelCells) { - XFreeColors(display, colormap, ToglMesaUsedPixelCells, - ToglMesaUsedFreeCells, 0x00000000); - free(ToglMesaUsedPixelCells); - ToglMesaUsedPixelCells = NULL; - ToglMesaUsedFreeCells = 0; - } -} -#endif - - -/* - * Generate EPS file. - * Contributed by Miguel A. De Riera Pasenau (miguel@DALILA.UPC.ES) - */ - -/* Function that creates a EPS File from a created pixmap on the current - * context. Based on the code from Copyright (c) Mark J. Kilgard, 1996. - * Parameters: name_file, b&w / Color flag, redraw function. The redraw - * function is needed in order to draw things into the new created pixmap. */ - -/* Copyright (c) Mark J. Kilgard, 1996. */ - -static GLvoid * -grabPixels(int inColor, unsigned int width, unsigned int height) -{ - GLvoid *buffer; - GLint swapbytes, lsbfirst, rowlength; - GLint skiprows, skippixels, alignment; - GLenum format; - unsigned int size; - - if (inColor) { - format = GL_RGB; - size = width * height * 3; - } else { - format = GL_LUMINANCE; - size = width * height * 1; - } - - buffer = (GLvoid *) malloc(size); - if (buffer == NULL) - return NULL; - - /* Save current modes. */ - glGetIntegerv(GL_PACK_SWAP_BYTES, &swapbytes); - glGetIntegerv(GL_PACK_LSB_FIRST, &lsbfirst); - glGetIntegerv(GL_PACK_ROW_LENGTH, &rowlength); - glGetIntegerv(GL_PACK_SKIP_ROWS, &skiprows); - glGetIntegerv(GL_PACK_SKIP_PIXELS, &skippixels); - glGetIntegerv(GL_PACK_ALIGNMENT, &alignment); - /* Little endian machines (DEC Alpha for example) could benefit from - * setting GL_PACK_LSB_FIRST to GL_TRUE instead of GL_FALSE, but this would - * * * * * * * * * require changing the generated bitmaps too. */ - glPixelStorei(GL_PACK_SWAP_BYTES, GL_FALSE); - glPixelStorei(GL_PACK_LSB_FIRST, GL_FALSE); - glPixelStorei(GL_PACK_ROW_LENGTH, 0); - glPixelStorei(GL_PACK_SKIP_ROWS, 0); - glPixelStorei(GL_PACK_SKIP_PIXELS, 0); - glPixelStorei(GL_PACK_ALIGNMENT, 1); - - /* Actually read the pixels. */ - glReadPixels(0, 0, width, height, format, - GL_UNSIGNED_BYTE, (GLvoid *) buffer); - - /* Restore saved modes. */ - glPixelStorei(GL_PACK_SWAP_BYTES, swapbytes); - glPixelStorei(GL_PACK_LSB_FIRST, lsbfirst); - glPixelStorei(GL_PACK_ROW_LENGTH, rowlength); - glPixelStorei(GL_PACK_SKIP_ROWS, skiprows); - glPixelStorei(GL_PACK_SKIP_PIXELS, skippixels); - glPixelStorei(GL_PACK_ALIGNMENT, alignment); - return buffer; -} - - -static int -generateEPS(const char *filename, int inColor, - unsigned int width, unsigned int height) -{ - FILE *fp; - GLvoid *pixels; - unsigned char *curpix; - unsigned int components, i; - int pos; - unsigned int bitpixel; - - pixels = grabPixels(inColor, width, height); - if (pixels == NULL) - return 1; - if (inColor) - components = 3; /* Red, green, blue. */ - else - components = 1; /* Luminance. */ - - fp = fopen(filename, "w"); - if (fp == NULL) { - return 2; - } - (void) fprintf(fp, "%%!PS-Adobe-2.0 EPSF-1.2\n"); - (void) fprintf(fp, "%%%%Creator: OpenGL pixmap render output\n"); - (void) fprintf(fp, "%%%%BoundingBox: 0 0 %d %d\n", width, height); - (void) fprintf(fp, "%%%%EndComments\n"); - - i = (((width * height) + 7) / 8) / 40; /* # of lines, 40 bytes per - * line */ - (void) fprintf(fp, "%%%%BeginPreview: %d %d %d %d\n%%", width, height, 1, - i); - pos = 0; - curpix = (unsigned char *) pixels; - for (i = 0; i < width * height * components;) { - bitpixel = 0; - if (inColor) { - double pix = 0; - - pix = 0.30 * (double) curpix[i] + 0.59 * (double) curpix[i + 1] + - 0.11 * (double) curpix[i + 2]; - i += 3; - if (pix > 127.0) - bitpixel |= 0x80; - pix = 0.30 * (double) curpix[i] + 0.59 * (double) curpix[i + 1] + - 0.11 * (double) curpix[i + 2]; - i += 3; - if (pix > 127.0) - bitpixel |= 0x40; - pix = 0.30 * (double) curpix[i] + 0.59 * (double) curpix[i + 1] + - 0.11 * (double) curpix[i + 2]; - i += 3; - if (pix > 127.0) - bitpixel |= 0x20; - pix = 0.30 * (double) curpix[i] + 0.59 * (double) curpix[i + 1] + - 0.11 * (double) curpix[i + 2]; - i += 3; - if (pix > 127.0) - bitpixel |= 0x10; - pix = 0.30 * (double) curpix[i] + 0.59 * (double) curpix[i + 1] + - 0.11 * (double) curpix[i + 2]; - i += 3; - if (pix > 127.0) - bitpixel |= 0x08; - pix = 0.30 * (double) curpix[i] + 0.59 * (double) curpix[i + 1] + - 0.11 * (double) curpix[i + 2]; - i += 3; - if (pix > 127.0) - bitpixel |= 0x04; - pix = 0.30 * (double) curpix[i] + 0.59 * (double) curpix[i + 1] + - 0.11 * (double) curpix[i + 2]; - i += 3; - if (pix > 127.0) - bitpixel |= 0x02; - pix = 0.30 * (double) curpix[i] + 0.59 * (double) curpix[i + 1] + - 0.11 * (double) curpix[i + 2]; - i += 3; - if (pix > 127.0) - bitpixel |= 0x01; - } else { - if (curpix[i++] > 0x7f) - bitpixel |= 0x80; - if (curpix[i++] > 0x7f) - bitpixel |= 0x40; - if (curpix[i++] > 0x7f) - bitpixel |= 0x20; - if (curpix[i++] > 0x7f) - bitpixel |= 0x10; - if (curpix[i++] > 0x7f) - bitpixel |= 0x08; - if (curpix[i++] > 0x7f) - bitpixel |= 0x04; - if (curpix[i++] > 0x7f) - bitpixel |= 0x02; - if (curpix[i++] > 0x7f) - bitpixel |= 0x01; - } - (void) fprintf(fp, "%02x", bitpixel); - if (++pos >= 40) { - (void) fprintf(fp, "\n%%"); - pos = 0; - } - } - if (pos) - (void) fprintf(fp, "\n%%%%EndPreview\n"); - else - (void) fprintf(fp, "%%EndPreview\n"); - - (void) fprintf(fp, "gsave\n"); - (void) fprintf(fp, "/bwproc {\n"); - (void) fprintf(fp, " rgbproc\n"); - (void) fprintf(fp, " dup length 3 idiv string 0 3 0\n"); - (void) fprintf(fp, " 5 -1 roll {\n"); - (void) fprintf(fp, " add 2 1 roll 1 sub dup 0 eq\n"); - (void) fprintf(fp, " { pop 3 idiv 3 -1 roll dup 4 -1 roll dup\n"); - (void) fprintf(fp, " 3 1 roll 5 -1 roll put 1 add 3 0 }\n"); - (void) fprintf(fp, " { 2 1 roll } ifelse\n"); - (void) fprintf(fp, " } forall\n"); - (void) fprintf(fp, " pop pop pop\n"); - (void) fprintf(fp, "} def\n"); - (void) fprintf(fp, "systemdict /colorimage known not {\n"); - (void) fprintf(fp, " /colorimage {\n"); - (void) fprintf(fp, " pop\n"); - (void) fprintf(fp, " pop\n"); - (void) fprintf(fp, " /rgbproc exch def\n"); - (void) fprintf(fp, " { bwproc } image\n"); - (void) fprintf(fp, " } def\n"); - (void) fprintf(fp, "} if\n"); - (void) fprintf(fp, "/picstr %d string def\n", width * components); - (void) fprintf(fp, "%d %d scale\n", width, height); - (void) fprintf(fp, "%d %d %d\n", width, height, 8); - (void) fprintf(fp, "[%d 0 0 %d 0 0]\n", width, height); - (void) fprintf(fp, "{currentfile picstr readhexstring pop}\n"); - (void) fprintf(fp, "false %d\n", components); - (void) fprintf(fp, "colorimage\n"); - - curpix = (unsigned char *) pixels; - pos = 0; - for (i = width * height * components; i != 0; i--) { - (void) fprintf(fp, "%02hx", *curpix++); - if (++pos >= 40) { - (void) fprintf(fp, "\n"); - pos = 0; - } - } - if (pos) - (void) fprintf(fp, "\n"); - - (void) fprintf(fp, "grestore\n"); - free(pixels); - if (fclose(fp) != 0) - return 1; - return 0; -} - - -/* int Togl_DumpToEpsFile( const Togl *togl, const char *filename, int inColor, - * void (*user_redraw)(void)) */ -/* changed by GG */ -int -Togl_DumpToEpsFile(const Togl *togl, const char *filename, - int inColor, void (*user_redraw) (const Togl *)) -{ - Bool using_mesa = False; - -#if 0 - Pixmap eps_pixmap; - GLXPixmap eps_glxpixmap; - XVisualInfo *vi = togl->VisInfo; - Window win = Tk_WindowId(togl->TkWin); -#endif - int retval; - unsigned int width = togl->Width, height = togl->Height; - -#if defined(TOGL_X11) - Display *dpy = Tk_Display(togl->TkWin); - int scrnum = Tk_ScreenNumber(togl->TkWin); - - if (strstr(glXQueryServerString(dpy, scrnum, GLX_VERSION), "Mesa")) - using_mesa = True; - else -#endif /* TOGL_X11 */ - using_mesa = False; - /* I don't use Pixmap do drawn into, because the code should link with Mesa - * libraries and OpenGL libraries, and the which library we use at run time - * should not matter, but the name of the calls differs one from another: - * MesaGl: glXCreateGLXPixmapMESA( dpy, vi, eps_pixmap, - * Tk_Colormap(togl->TkWin)) OpenGl: glXCreateGLXPixmap( dpy, vi, - * eps_pixmap); instead of this I read direct from back buffer of the - * screeen. */ -#if 0 - eps_pixmap = XCreatePixmap(dpy, win, width, height, vi->depth); - if (using_mesa) - eps_glxpixmap = - glXCreateGLXPixmapMESA(dpy, vi, eps_pixmap, - Tk_Colormap(togl->TkWin)); - else - eps_glxpixmap = glXCreateGLXPixmap(dpy, vi, eps_pixmap); - - glXMakeCurrent(dpy, eps_glxpixmap, togl->GlCtx); - user_redraw(); -#endif - if (!togl->RgbaFlag) { - -#if defined(TOGL_WGL) - /* Due to the lack of a unique inverse mapping from the frame buffer to - * the logical palette we need a translation map from the complete - * logical palette. */ - { - int n, i; - TkWinColormap *cmap = (TkWinColormap *) Tk_Colormap(togl->TkWin); - LPPALETTEENTRY entry = - malloc(togl->EpsMapSize * sizeof (PALETTEENTRY)); - n = GetPaletteEntries(cmap->palette, 0, togl->EpsMapSize, entry); - for (i = 0; i < n; i++) { - togl->EpsRedMap[i] = (GLfloat) (entry[i].peRed / 255.0); - togl->EpsGreenMap[i] = (GLfloat) (entry[i].peGreen / 255.0); - togl->EpsBlueMap[i] = (GLfloat) (entry[i].peBlue / 255.0); - } - free(entry); - } -#endif /* TOGL_WGL */ - - glPixelMapfv(GL_PIXEL_MAP_I_TO_R, togl->EpsMapSize, togl->EpsRedMap); - glPixelMapfv(GL_PIXEL_MAP_I_TO_G, togl->EpsMapSize, togl->EpsGreenMap); - glPixelMapfv(GL_PIXEL_MAP_I_TO_B, togl->EpsMapSize, togl->EpsBlueMap); - } - /* user_redraw(); */ - user_redraw(togl); /* changed by GG */ - /* glReadBuffer( GL_FRONT); */ - /* by default it read GL_BACK in double buffer mode */ - glFlush(); - retval = generateEPS(filename, inColor, width, height); -#if 0 - glXMakeCurrent(dpy, win, togl->GlCtx); - glXDestroyGLXPixmap(dpy, eps_glxpixmap); - XFreePixmap(dpy, eps_pixmap); -#endif - return retval; -} - -/* - * Full screen stereo for SGI graphics - * Contributed by Ben Evans (Ben.Evans@anusf.anu.edu.au) - * This code was based on SGI's /usr/share/src/OpenGL/teach/stereo - */ - -#if defined(__sgi) - -static struct stereoStateRec -{ - Bool useSGIStereo; - Display *currentDisplay; - Window currentWindow; - GLXContext currentContext; - GLenum currentDrawBuffer; - int currentStereoBuffer; - Bool enabled; - char *stereoCommand; - char *restoreCommand; -} stereo; - -/* call instead of glDrawBuffer */ -void -Togl_OldStereoDrawBuffer(GLenum mode) -{ - if (stereo.useSGIStereo) { - stereo.currentDrawBuffer = mode; - switch (mode) { - case GL_FRONT: - case GL_BACK: - case GL_FRONT_AND_BACK: - /* - ** Simultaneous drawing to both left and right buffers isn't - ** really possible if we don't have a stereo capable visual. - ** For now just fall through and use the left buffer. - */ - case GL_LEFT: - case GL_FRONT_LEFT: - case GL_BACK_LEFT: - stereo.currentStereoBuffer = STEREO_BUFFER_LEFT; - break; - case GL_RIGHT: - case GL_FRONT_RIGHT: - stereo.currentStereoBuffer = STEREO_BUFFER_RIGHT; - mode = GL_FRONT; - break; - case GL_BACK_RIGHT: - stereo.currentStereoBuffer = STEREO_BUFFER_RIGHT; - mode = GL_BACK; - break; - default: - break; - } - if (stereo.currentDisplay && stereo.currentWindow) { - glXWaitGL(); /* sync with GL command stream before calling X - */ - XSGISetStereoBuffer(stereo.currentDisplay, - stereo.currentWindow, stereo.currentStereoBuffer); - glXWaitX(); /* sync with X command stream before calling GL - */ - } - } - glDrawBuffer(mode); -} - -/* call instead of glClear */ -void -Togl_OldStereoClear(GLbitfield mask) -{ - GLenum drawBuffer; - - if (stereo.useSGIStereo) { - drawBuffer = stereo.currentDrawBuffer; - switch (drawBuffer) { - case GL_FRONT: - Togl_OldStereoDrawBuffer(GL_FRONT_RIGHT); - glClear(mask); - Togl_OldStereoDrawBuffer(drawBuffer); - break; - case GL_BACK: - Togl_OldStereoDrawBuffer(GL_BACK_RIGHT); - glClear(mask); - Togl_OldStereoDrawBuffer(drawBuffer); - break; - case GL_FRONT_AND_BACK: - Togl_OldStereoDrawBuffer(GL_RIGHT); - glClear(mask); - Togl_OldStereoDrawBuffer(drawBuffer); - break; - case GL_LEFT: - case GL_FRONT_LEFT: - case GL_BACK_LEFT: - case GL_RIGHT: - case GL_FRONT_RIGHT: - case GL_BACK_RIGHT: - default: - break; - } - } - glClear(mask); -} - -static void -oldStereoMakeCurrent(Display *dpy, Window win, GLXContext ctx) -{ - - if (dpy && (dpy != stereo.currentDisplay)) { - int event, error; - - /* Make sure new Display supports SGIStereo */ - if (XSGIStereoQueryExtension(dpy, &event, &error) == False) { - dpy = NULL; - } - } - if (dpy && win && (win != stereo.currentWindow)) { - /* Make sure new Window supports SGIStereo */ - if (XSGIQueryStereoMode(dpy, win) == X_STEREO_UNSUPPORTED) { - win = None; - } - } - if (ctx && (ctx != stereo.currentContext)) { - GLint drawBuffer; - - glGetIntegerv(GL_DRAW_BUFFER, &drawBuffer); - Togl_OldStereoDrawBuffer((GLenum) drawBuffer); - } - stereo.currentDisplay = dpy; - stereo.currentWindow = win; - stereo.currentContext = ctx; -} - - -/* call before using stereo */ -static void -oldStereoInit(Togl *togl, int stereoEnabled) -{ - stereo.useSGIStereo = stereoEnabled; - stereo.currentDisplay = NULL; - stereo.currentWindow = None; - stereo.currentContext = NULL; - stereo.currentDrawBuffer = GL_NONE; - stereo.currentStereoBuffer = STEREO_BUFFER_NONE; - stereo.enabled = False; -} - -#endif /* __sgi STEREO */ - - -void -Togl_StereoFrustum(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, - GLfloat zNear, GLfloat zFar, GLfloat eyeDist, GLfloat eyeOffset) -{ - GLfloat eyeShift = (eyeDist - zNear) * (eyeOffset / eyeDist); - - glFrustum(left + eyeShift, right + eyeShift, bottom, top, zNear, zFar); - glTranslatef(-eyeShift, 0, 0); -} - - -#ifdef TOGL_AGL_CLASSIC -/* needed to make shared library on Mac with CodeWarrior; should be overridden - * by user app */ -/* - * int main(int argc, char *argv[]) { return -1; } */ - -/* the following code is borrowed from tkMacAppInit.c */ - -/* - *---------------------------------------------------------------------- - * - * MacintoshInit -- - * - * This procedure calls Mac specific initialization calls. Most of - * these calls must be made as soon as possible in the startup - * process. - * - * Results: - * Returns TCL_OK if everything went fine. If it didn't the - * application should probably fail. - * - * Side effects: - * Inits the application. - * - *---------------------------------------------------------------------- - */ - -int -Togl_MacInit(void) -{ - int i; - long result, mask = 0x0700; /* mask = system 7.x */ - -# if GENERATING68K && !GENERATINGCFM - SetApplLimit(GetApplLimit() - (TK_MAC_68K_STACK_GROWTH)); -# endif - MaxApplZone(); - for (i = 0; i < 4; i++) { - (void) MoreMasters(); - } - - /* - * Tk needs us to set the qd pointer it uses. This is needed - * so Tk doesn't have to assume the availability of the qd global - * variable. Which in turn allows Tk to be used in code resources. - */ - tcl_macQdPtr = &qd; - - /* - * If appearance is present, then register Tk as an Appearance client - * This means that the mapping from non-Appearance to Appearance cdefs - * will be done for Tk regardless of the setting in the Appearance - * control panel. - */ - if (TkMacHaveAppearance()) { - RegisterAppearanceClient(); - } - - InitGraf(&tcl_macQdPtr->thePort); - InitFonts(); - InitWindows(); - InitMenus(); - InitDialogs((long) NULL); - InitCursor(); - - /* - * Make sure we are running on system 7 or higher - */ - if ((NGetTrapAddress(_Gestalt, ToolTrap) == - NGetTrapAddress(_Unimplemented, ToolTrap)) - || (((Gestalt(gestaltSystemVersion, &result) != noErr) - || (result < mask)))) { - panic("Tcl/Tk requires System 7 or higher."); - } - - /* - * Make sure we have color quick draw - * (this means we can't run on 68000 macs) - */ - if (((Gestalt(gestaltQuickdrawVersion, &result) != noErr) - || (result < gestalt32BitQD13))) { - panic("Tk requires Color QuickDraw."); - } - - FlushEvents(everyEvent, 0); - SetEventMask(everyEvent); - - Tcl_MacSetEventProc(TkMacConvertEvent); - return TCL_OK; -} - -int -Togl_MacSetupMainInterp(Tcl_Interp *interp) -{ - TkMacInitAppleEvents(interp); - TkMacInitMenus(interp); - return TCL_OK; -} - -#endif /* TOGL_AGL_CLASSIC */ diff --git a/ng/Togl-1.7/togl.h b/ng/Togl-1.7/togl.h deleted file mode 100644 index 0135c99f..00000000 --- a/ng/Togl-1.7/togl.h +++ /dev/null @@ -1,244 +0,0 @@ -/* $Id: togl.h,v 1.28 2005/10/27 07:45:48 gregcouch Exp $ */ - -/* vi:set sw=4: */ - -/* - * Togl - a Tk OpenGL widget - * - * Copyright (C) 1996-1998 Brian Paul and Ben Bederson - * See the LICENSE file for copyright details. - */ - - -#ifndef TOGL_H -# define TOGL_H - -#if !defined TOGL_X11 && !defined TOGL_WGL && !defined TOGL_AGL_CLASSIC && !defined TOGL_AGL -# include "togl_ws.h" -#endif - -# ifdef TOGL_WGL -# define WIN32_LEAN_AND_MEAN -# include -# undef WIN32_LEAN_AND_MEAN -# if defined(_MSC_VER) -# define DllEntryPoint DllMain -# endif -# endif - -# ifdef _WIN32 -# define TOGL_EXTERN __declspec(dllexport) extern -# else -# define TOGL_EXTERN extern -# endif /* _WIN32 */ - -# ifdef TOGL_AGL_CLASSIC -# ifndef MAC_TCL -# define MAC_TCL 1 -# endif -# endif - -# ifdef TOGL_AGL -# ifndef MAC_OSX_TCL -# define MAC_OSX_TCL 1 -# endif -# ifndef MAC_OSX_TK -# define MAC_OSX_TK 1 -# endif -# endif - -# include -# include -# if defined(TOGL_AGL) || defined(TOGL_AGL_CLASSIC) -# include -# else -# include -# endif - -# ifdef __sgi -# include -# include -# endif - -# ifndef CONST84 -# define CONST84 -# endif - -# ifndef NULL -# define NULL 0 -# endif - -# ifndef TOGL_USE_FONTS -# define TOGL_USE_FONTS 1 /* needed for demos */ -# endif - -# ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -# endif - -# define TOGL_VERSION "1.7" -# define TOGL_MAJOR_VERSION 1 -# define TOGL_MINOR_VERSION 7 - -/* - * "Standard" fonts which can be specified to Togl_LoadBitmapFont() - */ -# define TOGL_BITMAP_8_BY_13 ((char *) 1) -# define TOGL_BITMAP_9_BY_15 ((char *) 2) -# define TOGL_BITMAP_TIMES_ROMAN_10 ((char *) 3) -# define TOGL_BITMAP_TIMES_ROMAN_24 ((char *) 4) -# define TOGL_BITMAP_HELVETICA_10 ((char *) 5) -# define TOGL_BITMAP_HELVETICA_12 ((char *) 6) -# define TOGL_BITMAP_HELVETICA_18 ((char *) 7) - -/* - * Normal and overlay plane constants - */ -# define TOGL_NORMAL 1 -# define TOGL_OVERLAY 2 - -struct Togl; -typedef struct Togl Togl; - -typedef void (Togl_Callback) (Togl *togl); -typedef int (Togl_CmdProc) (Togl *togl, int argc, CONST84 char *argv[]); - -TOGL_EXTERN int Togl_Init(Tcl_Interp *interp); - -/* - * Default/initial callback setup functions - */ - -TOGL_EXTERN void Togl_CreateFunc(Togl_Callback *proc); -TOGL_EXTERN void Togl_DisplayFunc(Togl_Callback *proc); -TOGL_EXTERN void Togl_ReshapeFunc(Togl_Callback *proc); -TOGL_EXTERN void Togl_DestroyFunc(Togl_Callback *proc); -TOGL_EXTERN void Togl_TimerFunc(Togl_Callback *proc); -TOGL_EXTERN void Togl_ResetDefaultCallbacks(void); - -/* - * Change callbacks for existing widget - */ - -TOGL_EXTERN void Togl_SetCreateFunc(Togl *togl, Togl_Callback *proc); -TOGL_EXTERN void Togl_SetDisplayFunc(Togl *togl, Togl_Callback *proc); -TOGL_EXTERN void Togl_SetReshapeFunc(Togl *togl, Togl_Callback *proc); -TOGL_EXTERN void Togl_SetDestroyFunc(Togl *togl, Togl_Callback *proc); -TOGL_EXTERN void Togl_SetTimerFunc(Togl *togl, Togl_Callback *proc); - -/* - * Miscellaneous - */ - -TOGL_EXTERN int Togl_Configure(Tcl_Interp *interp, Togl *togl, - int argc, const char *argv[], int flags); -TOGL_EXTERN void Togl_MakeCurrent(const Togl *togl); -TOGL_EXTERN void Togl_CreateCommand(char *cmd_name, Togl_CmdProc *cmd_proc); -TOGL_EXTERN void Togl_PostRedisplay(Togl *togl); -TOGL_EXTERN void Togl_SwapBuffers(const Togl *togl); - -/* - * Query functions - */ - -TOGL_EXTERN const char *Togl_Ident(const Togl *togl); -TOGL_EXTERN int Togl_Width(const Togl *togl); -TOGL_EXTERN int Togl_Height(const Togl *togl); -TOGL_EXTERN Tcl_Interp *Togl_Interp(const Togl *togl); -TOGL_EXTERN Tk_Window Togl_TkWin(const Togl *togl); - -/* - * Color Index mode - */ - -TOGL_EXTERN unsigned long Togl_AllocColor(const Togl *togl, float red, - float green, float blue); -TOGL_EXTERN void Togl_FreeColor(const Togl *togl, unsigned long index); -TOGL_EXTERN void Togl_SetColor(const Togl *togl, unsigned long index, - float red, float green, float blue); - -# if TOGL_USE_FONTS == 1 -/* - * Bitmap fonts - */ - -TOGL_EXTERN GLuint Togl_LoadBitmapFont(const Togl *togl, const char *fontname); -TOGL_EXTERN void Togl_UnloadBitmapFont(const Togl *togl, GLuint fontbase); - -# endif -/* - * Overlay functions - */ - -TOGL_EXTERN void Togl_UseLayer(Togl *togl, int layer); -TOGL_EXTERN void Togl_ShowOverlay(Togl *togl); -TOGL_EXTERN void Togl_HideOverlay(Togl *togl); -TOGL_EXTERN void Togl_PostOverlayRedisplay(Togl *togl); -TOGL_EXTERN void Togl_OverlayDisplayFunc(Togl_Callback *proc); -TOGL_EXTERN int Togl_ExistsOverlay(const Togl *togl); -TOGL_EXTERN int Togl_GetOverlayTransparentValue(const Togl *togl); -TOGL_EXTERN int Togl_IsMappedOverlay(const Togl *togl); -TOGL_EXTERN unsigned long Togl_AllocColorOverlay(const Togl *togl, - float red, float green, float blue); -TOGL_EXTERN void Togl_FreeColorOverlay(const Togl *togl, unsigned long index); - -/* - * User client data - */ - -TOGL_EXTERN void Togl_ClientData(ClientData clientData); -TOGL_EXTERN ClientData Togl_GetClientData(const Togl *togl); -TOGL_EXTERN void Togl_SetClientData(Togl *togl, ClientData clientData); - -# ifdef TOGL_X11 -/* - * X11-only commands. - * Contributed by Miguel A. De Riera Pasenau (miguel@DALILA.UPC.ES) - */ - -TOGL_EXTERN Display *Togl_Display(const Togl *togl); -TOGL_EXTERN Screen *Togl_Screen(const Togl *togl); -TOGL_EXTERN int Togl_ScreenNumber(const Togl *togl); -TOGL_EXTERN Colormap Togl_Colormap(const Togl *togl); - -# endif -# ifdef __sgi -/* - * SGI stereo-only commands. - * Contributed by Ben Evans (Ben.Evans@anusf.anu.edu.au) - */ - -TOGL_EXTERN void Togl_OldStereoDrawBuffer(GLenum mode); -TOGL_EXTERN void Togl_OldStereoClear(GLbitfield mask); -# endif - -TOGL_EXTERN void Togl_StereoFrustum(GLfloat left, GLfloat right, GLfloat bottom, - GLfloat top, GLfloat near, GLfloat far, GLfloat eyeDist, - GLfloat eyeOffset); - -/* - * Generate EPS file. - * Contributed by Miguel A. De Riera Pasenau (miguel@DALILA.UPC.ES) - */ - -TOGL_EXTERN int Togl_DumpToEpsFile(const Togl *togl, const char *filename, - int inColor, void (*user_redraw) (const Togl *)); - -# ifdef TOGL_AGL_CLASSIC -/* - * Mac-specific setup functions - */ -extern int Togl_MacInit(void); -extern int Togl_MacSetupMainInterp(Tcl_Interp *interp); -# endif - -# ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -# endif - - -#endif diff --git a/ng/Togl-1.7/togl_ws.h.in b/ng/Togl-1.7/togl_ws.h.in deleted file mode 100644 index 3a01a9c3..00000000 --- a/ng/Togl-1.7/togl_ws.h.in +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef TOGL_WS_H -# define TOGL_WS_H - -/* define windowing system togl is compiled with */ -# define @TOGL_WINDOWINGSYSTEM@ - -#endif diff --git a/ng/Togl-1.7/tree2.rgba b/ng/Togl-1.7/tree2.rgba deleted file mode 100644 index 67b02799..00000000 Binary files a/ng/Togl-1.7/tree2.rgba and /dev/null differ diff --git a/ng/drawing.tcl b/ng/drawing.tcl index 3bc7c652..14d5d33b 100644 --- a/ng/drawing.tcl +++ b/ng/drawing.tcl @@ -27,14 +27,6 @@ if { [Ng_GetToglVersion] == 2 } { # puts "have Togl 2.1" set toglok 1 } -} { - # Togl 1.7 - if {[catch {togl .ndraw -width 400 -height 300 -rgba true -double true -depth true -privatecmap false -stereo false -indirect false }] } { - puts "no OpenGL" - } { - # puts "have Togl 1.7" - set toglok 1 - } } if { $toglok == 1} { diff --git a/ng/togl_1_7.h b/ng/togl_1_7.h deleted file mode 100644 index 0135c99f..00000000 --- a/ng/togl_1_7.h +++ /dev/null @@ -1,244 +0,0 @@ -/* $Id: togl.h,v 1.28 2005/10/27 07:45:48 gregcouch Exp $ */ - -/* vi:set sw=4: */ - -/* - * Togl - a Tk OpenGL widget - * - * Copyright (C) 1996-1998 Brian Paul and Ben Bederson - * See the LICENSE file for copyright details. - */ - - -#ifndef TOGL_H -# define TOGL_H - -#if !defined TOGL_X11 && !defined TOGL_WGL && !defined TOGL_AGL_CLASSIC && !defined TOGL_AGL -# include "togl_ws.h" -#endif - -# ifdef TOGL_WGL -# define WIN32_LEAN_AND_MEAN -# include -# undef WIN32_LEAN_AND_MEAN -# if defined(_MSC_VER) -# define DllEntryPoint DllMain -# endif -# endif - -# ifdef _WIN32 -# define TOGL_EXTERN __declspec(dllexport) extern -# else -# define TOGL_EXTERN extern -# endif /* _WIN32 */ - -# ifdef TOGL_AGL_CLASSIC -# ifndef MAC_TCL -# define MAC_TCL 1 -# endif -# endif - -# ifdef TOGL_AGL -# ifndef MAC_OSX_TCL -# define MAC_OSX_TCL 1 -# endif -# ifndef MAC_OSX_TK -# define MAC_OSX_TK 1 -# endif -# endif - -# include -# include -# if defined(TOGL_AGL) || defined(TOGL_AGL_CLASSIC) -# include -# else -# include -# endif - -# ifdef __sgi -# include -# include -# endif - -# ifndef CONST84 -# define CONST84 -# endif - -# ifndef NULL -# define NULL 0 -# endif - -# ifndef TOGL_USE_FONTS -# define TOGL_USE_FONTS 1 /* needed for demos */ -# endif - -# ifdef __cplusplus -/* *INDENT-OFF* */ -extern "C" { -/* *INDENT-ON* */ -# endif - -# define TOGL_VERSION "1.7" -# define TOGL_MAJOR_VERSION 1 -# define TOGL_MINOR_VERSION 7 - -/* - * "Standard" fonts which can be specified to Togl_LoadBitmapFont() - */ -# define TOGL_BITMAP_8_BY_13 ((char *) 1) -# define TOGL_BITMAP_9_BY_15 ((char *) 2) -# define TOGL_BITMAP_TIMES_ROMAN_10 ((char *) 3) -# define TOGL_BITMAP_TIMES_ROMAN_24 ((char *) 4) -# define TOGL_BITMAP_HELVETICA_10 ((char *) 5) -# define TOGL_BITMAP_HELVETICA_12 ((char *) 6) -# define TOGL_BITMAP_HELVETICA_18 ((char *) 7) - -/* - * Normal and overlay plane constants - */ -# define TOGL_NORMAL 1 -# define TOGL_OVERLAY 2 - -struct Togl; -typedef struct Togl Togl; - -typedef void (Togl_Callback) (Togl *togl); -typedef int (Togl_CmdProc) (Togl *togl, int argc, CONST84 char *argv[]); - -TOGL_EXTERN int Togl_Init(Tcl_Interp *interp); - -/* - * Default/initial callback setup functions - */ - -TOGL_EXTERN void Togl_CreateFunc(Togl_Callback *proc); -TOGL_EXTERN void Togl_DisplayFunc(Togl_Callback *proc); -TOGL_EXTERN void Togl_ReshapeFunc(Togl_Callback *proc); -TOGL_EXTERN void Togl_DestroyFunc(Togl_Callback *proc); -TOGL_EXTERN void Togl_TimerFunc(Togl_Callback *proc); -TOGL_EXTERN void Togl_ResetDefaultCallbacks(void); - -/* - * Change callbacks for existing widget - */ - -TOGL_EXTERN void Togl_SetCreateFunc(Togl *togl, Togl_Callback *proc); -TOGL_EXTERN void Togl_SetDisplayFunc(Togl *togl, Togl_Callback *proc); -TOGL_EXTERN void Togl_SetReshapeFunc(Togl *togl, Togl_Callback *proc); -TOGL_EXTERN void Togl_SetDestroyFunc(Togl *togl, Togl_Callback *proc); -TOGL_EXTERN void Togl_SetTimerFunc(Togl *togl, Togl_Callback *proc); - -/* - * Miscellaneous - */ - -TOGL_EXTERN int Togl_Configure(Tcl_Interp *interp, Togl *togl, - int argc, const char *argv[], int flags); -TOGL_EXTERN void Togl_MakeCurrent(const Togl *togl); -TOGL_EXTERN void Togl_CreateCommand(char *cmd_name, Togl_CmdProc *cmd_proc); -TOGL_EXTERN void Togl_PostRedisplay(Togl *togl); -TOGL_EXTERN void Togl_SwapBuffers(const Togl *togl); - -/* - * Query functions - */ - -TOGL_EXTERN const char *Togl_Ident(const Togl *togl); -TOGL_EXTERN int Togl_Width(const Togl *togl); -TOGL_EXTERN int Togl_Height(const Togl *togl); -TOGL_EXTERN Tcl_Interp *Togl_Interp(const Togl *togl); -TOGL_EXTERN Tk_Window Togl_TkWin(const Togl *togl); - -/* - * Color Index mode - */ - -TOGL_EXTERN unsigned long Togl_AllocColor(const Togl *togl, float red, - float green, float blue); -TOGL_EXTERN void Togl_FreeColor(const Togl *togl, unsigned long index); -TOGL_EXTERN void Togl_SetColor(const Togl *togl, unsigned long index, - float red, float green, float blue); - -# if TOGL_USE_FONTS == 1 -/* - * Bitmap fonts - */ - -TOGL_EXTERN GLuint Togl_LoadBitmapFont(const Togl *togl, const char *fontname); -TOGL_EXTERN void Togl_UnloadBitmapFont(const Togl *togl, GLuint fontbase); - -# endif -/* - * Overlay functions - */ - -TOGL_EXTERN void Togl_UseLayer(Togl *togl, int layer); -TOGL_EXTERN void Togl_ShowOverlay(Togl *togl); -TOGL_EXTERN void Togl_HideOverlay(Togl *togl); -TOGL_EXTERN void Togl_PostOverlayRedisplay(Togl *togl); -TOGL_EXTERN void Togl_OverlayDisplayFunc(Togl_Callback *proc); -TOGL_EXTERN int Togl_ExistsOverlay(const Togl *togl); -TOGL_EXTERN int Togl_GetOverlayTransparentValue(const Togl *togl); -TOGL_EXTERN int Togl_IsMappedOverlay(const Togl *togl); -TOGL_EXTERN unsigned long Togl_AllocColorOverlay(const Togl *togl, - float red, float green, float blue); -TOGL_EXTERN void Togl_FreeColorOverlay(const Togl *togl, unsigned long index); - -/* - * User client data - */ - -TOGL_EXTERN void Togl_ClientData(ClientData clientData); -TOGL_EXTERN ClientData Togl_GetClientData(const Togl *togl); -TOGL_EXTERN void Togl_SetClientData(Togl *togl, ClientData clientData); - -# ifdef TOGL_X11 -/* - * X11-only commands. - * Contributed by Miguel A. De Riera Pasenau (miguel@DALILA.UPC.ES) - */ - -TOGL_EXTERN Display *Togl_Display(const Togl *togl); -TOGL_EXTERN Screen *Togl_Screen(const Togl *togl); -TOGL_EXTERN int Togl_ScreenNumber(const Togl *togl); -TOGL_EXTERN Colormap Togl_Colormap(const Togl *togl); - -# endif -# ifdef __sgi -/* - * SGI stereo-only commands. - * Contributed by Ben Evans (Ben.Evans@anusf.anu.edu.au) - */ - -TOGL_EXTERN void Togl_OldStereoDrawBuffer(GLenum mode); -TOGL_EXTERN void Togl_OldStereoClear(GLbitfield mask); -# endif - -TOGL_EXTERN void Togl_StereoFrustum(GLfloat left, GLfloat right, GLfloat bottom, - GLfloat top, GLfloat near, GLfloat far, GLfloat eyeDist, - GLfloat eyeOffset); - -/* - * Generate EPS file. - * Contributed by Miguel A. De Riera Pasenau (miguel@DALILA.UPC.ES) - */ - -TOGL_EXTERN int Togl_DumpToEpsFile(const Togl *togl, const char *filename, - int inColor, void (*user_redraw) (const Togl *)); - -# ifdef TOGL_AGL_CLASSIC -/* - * Mac-specific setup functions - */ -extern int Togl_MacInit(void); -extern int Togl_MacSetupMainInterp(Tcl_Interp *interp); -# endif - -# ifdef __cplusplus -/* *INDENT-OFF* */ -} -/* *INDENT-ON* */ -# endif - - -#endif