togl.c

来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 2,204 行 · 第 1/5 页

C
2,204
字号
/* $Id: togl.c,v 1.1 2006/08/09 22:56:56 jepler Exp $ *//* * Togl - a Tk OpenGL widget * Version 1.6 * Copyright (C) 1996-2002  Brian Paul and Ben Bederson * See the LICENSE-Togl file for copyright details. *//* * Currently we support X11, Win32 and Macintosh only */#if !defined(WIN32) && !defined(macintosh)#define X11#endif/*** Windows headers ***/#if defined(WIN32) && !defined(X11) && !defined(macintosh)#define WIN32_LEAN_AND_MEAN#include <windows.h>#undef WIN32_LEAN_AND_MEAN#include <winnt.h>/*** X Window System headers ***/#elif defined(X11) && !defined(WIN32) && !defined(macintosh)#include <X11/Xlib.h>#include <X11/Xutil.h>#include <X11/Xatom.h>  /* for XA_RGB_DEFAULT_MAP atom */#if defined(__vms)#include <X11/StdCmap.h>  /* for XmuLookupStandardColormap */#else#include <X11/Xmu/StdCmap.h>  /* for XmuLookupStandardColormap */#endif#include <GL/glx.h>/*** Mac headers ***/#elif defined(macintosh) && !defined(WIN32) && !defined(X11)#include <Gestalt.h>#include <Traps.h>#include <agl.h>#include <tclMacCommonPch.h>#else                           /* make sure only one platform defined */#error Unsupported platform, or confused platform defines...#endif/*** Standard C headers ***/#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <tcl.h>#ifdef USE_LOCAL_TK_H  #include "tk8.4a3.h"#else  #include <tk.h>#endif#ifdef WIN32#  include <tkPlatDecls.h>#endif#if TK_MAJOR_VERSION<8#  error Sorry Togl requires Tcl/Tk ver 8.0 or higher.#endif#if defined(macintosh)#  if TK_MAJOR_VERSION<8 || TK_MINOR_VERSION<3#    error Sorry Mac version requires Tcl/Tk ver 8.3.0 or higher.#  endif#endif /* Mac *//* 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_MINOR_VERSION>=4)#  define HAVE_TK_SETCLASSPROCS#endif/* * Copy of TkClassProcs declarations form tkInt.h * (this is needed for Tcl ver =< 8.4a3) */typedef int (TkBindEvalProc) _ANSI_ARGS_((ClientData clientData,	Tcl_Interp *interp, XEvent *eventPtr, Tk_Window tkwin,	KeySym keySym));typedef void (TkBindFreeProc) _ANSI_ARGS_((ClientData clientData));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;#include "togl.h"/* Defaults */#define DEFAULT_WIDTH		"400"#define DEFAULT_HEIGHT		"400"#define DEFAULT_IDENT		""#define DEFAULT_FONTNAME	"fixed"#define DEFAULT_TIME		"1"#ifdef WIN32/* Maximum size of a logical palette corresponding to a colormap * in color index mode. */#define MAX_CI_COLORMAP_SIZE 4096/*  * 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;static LRESULT (CALLBACK *tkWinChildProc)(HWND hwnd, UINT message,				 WPARAM wParam, LPARAM lParam) = NULL;#define TK_WIN_CHILD_CLASS_NAME "TkChild"#endif /* WIN32 */#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 -1#define ALL_EVENTS_MASK 	\   (KeyPressMask |		\    KeyReleaseMask |		\    ButtonPressMask |		\    ButtonReleaseMask |		\    EnterWindowMask |		\    LeaveWindowMask |		\    PointerMotionMask |		\    ExposureMask |		\    VisibilityChangeMask |	\    FocusChangeMask |		\    PropertyChangeMask |	\    ColormapChangeMask)struct Togl{   struct Togl *Next;           /* next in linked list */#if defined(WIN32)   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(X11)   GLXContext GlCtx;		/* Normal planes GLX context */#elif defined(macintosh)   AGLContext aglCtx;#endif /* WIN32 */   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 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   int RgbaFlag;		/* configuration flags (ala GLX parameters) */   int RgbaRed;   int RgbaGreen;   int RgbaBlue;   int DoubleFlag;   int DepthFlag;   int DepthSize;   int AccumFlag;   int AccumRed;   int AccumGreen;   int AccumBlue;   int AccumAlpha;   int AlphaFlag;   int AlphaSize;   int StencilFlag;   int StencilSize;   int PrivateCmapFlag;   int OverlayFlag;   int StereoFlag;   int AuxNumber;   int Indirect;   char *ShareList;             /* name (ident) of Togl to share dlists with */   char *ShareContext;          /* name (ident) to share OpenGL context with */   char *Ident;				/* User's identification string */   ClientData Client_Data;		/* Pointer to user data */   GLboolean 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(X11)   GLXContext OverlayCtx;		/* Overlay planes OpenGL context */#elif defined(WIN32)   HGLRC tglGLOverlayHglrc;#endif /* X11 */   Window OverlayWindow;		/* The overlay window, or 0 */   Togl_Callback *OverlayDisplayProc;	/* Overlay redraw proc */   GLboolean OverlayUpdatePending;	/* Should overlay be redrawn? */   Colormap OverlayCmap;		/* colormap for overlay is created */   int OverlayTransparentPixel;		/* transparent pixel */   int 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, char **argv);static void Togl_EventProc(ClientData clientData, XEvent *eventPtr);static Window Togl_CreateWindow(Tk_Window, Window, ClientData);#ifdef MESA_COLOR_HACKstatic int get_free_color_cells( Display *display, int screen,                                 Colormap colormap);static void free_default_color_cells( Display *display, Colormap colormap);#endifstatic void ToglCmdDeletedProc( ClientData );#if defined(__sgi) && defined(STEREO)/* SGI-only stereo */static void stereoMakeCurrent( Display *dpy, Window win, GLXContext ctx );static void stereoInit( struct Togl *togl,int stereoEnabled );#endif#ifdef macintoshstatic void SetMacBufRect(struct Togl *togl);#endif/* * Setup Togl widget configuration options: */static Tk_ConfigSpec configSpecs[] = {    {TK_CONFIG_PIXELS, "-height", "height", "Height",     DEFAULT_HEIGHT, Tk_Offset(struct Togl, Height), 0, NULL},    {TK_CONFIG_PIXELS, "-width", "width", "Width",     DEFAULT_WIDTH, Tk_Offset(struct Togl, Width), 0, NULL},    {TK_CONFIG_BOOLEAN, "-rgba", "rgba", "Rgba",     "true", Tk_Offset(struct Togl, RgbaFlag), 0, NULL},    {TK_CONFIG_INT, "-redsize", "redsize", "RedSize",     "1", Tk_Offset(struct Togl, RgbaRed), 0, NULL},    {TK_CONFIG_INT, "-greensize", "greensize", "GreenSize",     "1", Tk_Offset(struct Togl, RgbaGreen), 0, NULL},    {TK_CONFIG_INT, "-bluesize", "bluesize", "BlueSize",     "1", Tk_Offset(struct Togl, RgbaBlue), 0, NULL},    {TK_CONFIG_BOOLEAN, "-double", "double", "Double",     "false", Tk_Offset(struct Togl, DoubleFlag), 0, NULL},    {TK_CONFIG_BOOLEAN, "-depth", "depth", "Depth",     "false", Tk_Offset(struct Togl, DepthFlag), 0, NULL},    {TK_CONFIG_INT, "-depthsize", "depthsize", "DepthSize",     "1", Tk_Offset(struct Togl, DepthSize), 0, NULL},    {TK_CONFIG_BOOLEAN, "-accum", "accum", "Accum",     "false", Tk_Offset(struct Togl, AccumFlag), 0, NULL},    {TK_CONFIG_INT, "-accumredsize", "accumredsize", "AccumRedSize",     "1", Tk_Offset(struct Togl, AccumRed), 0, NULL},    {TK_CONFIG_INT, "-accumgreensize", "accumgreensize", "AccumGreenSize",     "1", Tk_Offset(struct Togl, AccumGreen), 0, NULL},    {TK_CONFIG_INT, "-accumbluesize", "accumbluesize", "AccumBlueSize",     "1", Tk_Offset(struct Togl, AccumBlue), 0, NULL},    {TK_CONFIG_INT, "-accumalphasize", "accumalphasize", "AccumAlphaSize",     "1", Tk_Offset(struct Togl, AccumAlpha), 0, NULL},    {TK_CONFIG_BOOLEAN, "-alpha", "alpha", "Alpha",     "false", Tk_Offset(struct Togl, AlphaFlag), 0, NULL},    {TK_CONFIG_INT, "-alphasize", "alphasize", "AlphaSize",     "1", Tk_Offset(struct Togl, AlphaSize), 0, NULL},    {TK_CONFIG_BOOLEAN, "-stencil", "stencil", "Stencil",     "false", Tk_Offset(struct Togl, StencilFlag), 0, NULL},    {TK_CONFIG_INT, "-stencilsize", "stencilsize", "StencilSize",     "1", Tk_Offset(struct Togl, StencilSize), 0, NULL},    {TK_CONFIG_INT, "-auxbuffers", "auxbuffers", "AuxBuffers",     "0", Tk_Offset(struct Togl, AuxNumber), 0, NULL},    {TK_CONFIG_BOOLEAN, "-privatecmap", "privateCmap", "PrivateCmap",     "false", Tk_Offset(struct Togl, PrivateCmapFlag), 0, NULL},    {TK_CONFIG_BOOLEAN, "-overlay", "overlay", "Overlay",     "false", Tk_Offset(struct Togl, OverlayFlag), 0, NULL},    {TK_CONFIG_BOOLEAN, "-stereo", "stereo", "Stereo",     "false", Tk_Offset(struct Togl, StereoFlag), 0, NULL},#ifndef NO_TK_CURSOR    { TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",     "", Tk_Offset(struct Togl, Cursor), TK_CONFIG_NULL_OK },#endif    {TK_CONFIG_INT, "-time", "time", "Time",     DEFAULT_TIME, Tk_Offset(struct Togl, TimerInterval), 0, NULL},    {TK_CONFIG_STRING, "-sharelist", "sharelist", "ShareList",     NULL, Tk_Offset(struct Togl, ShareList), 0, NULL},    {TK_CONFIG_STRING, "-sharecontext", "sharecontext", "ShareContext",     NULL, Tk_Offset(struct Togl, ShareContext), 0, NULL},    {TK_CONFIG_STRING, "-ident", "ident", "Ident",     DEFAULT_IDENT, Tk_Offset(struct Togl, Ident), 0, NULL},    {TK_CONFIG_BOOLEAN, "-indirect", "indirect", "Indirect",     "false", Tk_Offset(struct Togl, Indirect), 0, NULL},    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,     (char *) 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 struct Togl *ToglHead = NULL;/* * Add given togl widget to linked list. */static void AddToList(struct Togl *t){   t->Next = ToglHead;   ToglHead = t;}/* * Remove given togl widget from linked list. */static void RemoveFromList(struct Togl *t){   struct Togl *prev = NULL;   struct 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 struct Togl *FindTogl(const char *ident){   struct Togl *t = ToglHead;   while (t) {      if (strcmp(t->Ident, ident) == 0)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?