glut_init.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:10k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994, 1997. */
  2. /* This program is freely distributable without licensing fees
  3.    and is provided without guarantee or warrantee expressed or
  4.    implied. This program is -not- in the public domain. */
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8. #if !defined(_WIN32)
  9. #include <X11/Xlib.h>
  10. #include <X11/Xatom.h>
  11. #endif
  12. /* SGI optimization introduced in IRIX 6.3 to avoid X server
  13.    round trips for interning common X atoms. */
  14. #if defined(_SGI_EXTRA_PREDEFINES) && !defined(NO_FAST_ATOMS)
  15. #include <X11/SGIFastAtom.h>
  16. #else
  17. #define XSGIFastInternAtom(dpy,string,fast_name,how) XInternAtom(dpy,string,how)
  18. #endif
  19. #include "glutint.h"
  20. /* GLUT inter-file variables */
  21. /* *INDENT-OFF* */
  22. char *__glutProgramName = NULL;
  23. int __glutArgc = 0;
  24. char **__glutArgv = NULL;
  25. char *__glutGeometry = NULL;
  26. Display *__glutDisplay = NULL;
  27. int __glutScreen;
  28. Window __glutRoot;
  29. int __glutScreenHeight;
  30. int __glutScreenWidth;
  31. GLboolean __glutIconic = GL_FALSE;
  32. GLboolean __glutDebug = GL_FALSE;
  33. unsigned int __glutDisplayMode =
  34.   GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH;
  35. char *__glutDisplayString = NULL;
  36. int __glutConnectionFD;
  37. XSizeHints __glutSizeHints = {0};
  38. int __glutInitWidth = 300, __glutInitHeight = 300;
  39. int __glutInitX = -1, __glutInitY = -1;
  40. GLboolean __glutForceDirect = GL_FALSE,
  41.   __glutTryDirect = GL_TRUE;
  42. Atom __glutWMDeleteWindow;
  43. /* *INDENT-ON* */
  44. #ifdef _WIN32
  45. void (__cdecl *__glutExitFunc)(int retval) = NULL;
  46. #endif
  47. static Bool synchronize = False;
  48. #if defined(_WIN32)
  49. #ifdef __BORLANDC__
  50. #include <float.h>  /* For masking floating point exceptions. */
  51. #endif
  52. void
  53. __glutOpenWin32Connection(char* display)
  54. {
  55.   static char *classname;
  56.   WNDCLASS  wc;
  57.   HINSTANCE hInstance = GetModuleHandle(NULL);
  58.   
  59.   /* Make sure we register the window only once. */
  60.   if(classname)
  61.     return;
  62. #ifdef __BORLANDC__
  63.   /* Under certain conditions (e.g. while rendering solid surfaces with
  64.      lighting enabled) Microsoft OpenGL libraries cause some illegal
  65.      operations like floating point overflow or division by zero. The
  66.      default behaviour of Microsoft compilers is to mask (ignore)
  67.      floating point exceptions, while Borland compilers do not.  The
  68.      following function of Borland RTL allows to mask exceptions.
  69.      Advice from Pier Giorgio Esposito (mc2172@mclink.it). */
  70.   _control87(MCW_EM,MCW_EM);
  71. #endif
  72.   classname = "GLUT";
  73.   /* Clear (important!) and then fill in the window class structure. */
  74.   memset(&wc, 0, sizeof(WNDCLASS));
  75.   wc.style         = CS_OWNDC;
  76.   wc.lpfnWndProc   = (WNDPROC)__glutWindowProc;
  77.   wc.hInstance     = hInstance;
  78.   wc.hIcon         = LoadIcon(hInstance, "GLUT_ICON");
  79.   wc.hCursor       = LoadCursor(hInstance, IDC_ARROW);
  80.   wc.hbrBackground = NULL;
  81.   wc.lpszMenuName  = NULL;
  82.   wc.lpszClassName = classname;
  83.   if(wc.hIcon == NULL) {
  84.     HINSTANCE hDLLInstance = LoadLibrary("glut32.dll");
  85. if (hDLLInstance == NULL) {
  86.   /* Fill in a default icon if one isn't specified as a resource. */
  87.   wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
  88. } else {
  89.   wc.hIcon = LoadIcon(hDLLInstance, "GLUT_ICON");
  90. }
  91.   }
  92.   
  93.   if(!RegisterClass(&wc)) {
  94.     __glutFatalError("RegisterClass() failed:"
  95.      "Cannot register GLUT window class.");
  96.   }
  97.  
  98.   __glutScreenWidth     = GetSystemMetrics(SM_CXSCREEN);
  99.   __glutScreenHeight    = GetSystemMetrics(SM_CYSCREEN);
  100.   /* Set the root window to NULL because windows creates a top-level
  101.      window when the parent is NULL.  X creates a top-level window
  102.      when the parent is the root window. */
  103.   __glutRoot            = NULL;
  104.   /* Set the display to 1 -- we shouldn't be using this anywhere
  105.      (except as an argument to X calls). */
  106.   __glutDisplay         = (Display*)1;
  107.   /* There isn't any concept of multiple screens in Win32, therefore,
  108.      we don't need to keep track of the screen we're on... it's always
  109.      the same one. */
  110.   __glutScreen          = 0;
  111. }
  112. #else /* !_WIN32 */
  113. void
  114. __glutOpenXConnection(char *display)
  115. {
  116.   int errorBase, eventBase;
  117.   __glutDisplay = XOpenDisplay(display);
  118.   if (!__glutDisplay)
  119.     __glutFatalError("could not open display: %s",
  120.       XDisplayName(display));
  121.   if (synchronize)
  122.     XSynchronize(__glutDisplay, True);
  123.   if (!glXQueryExtension(__glutDisplay, &errorBase, &eventBase))
  124.     __glutFatalError(
  125.       "OpenGL GLX extension not supported by display: %s",
  126.       XDisplayName(display));
  127.   __glutScreen = DefaultScreen(__glutDisplay);
  128.   __glutRoot = RootWindow(__glutDisplay, __glutScreen);
  129.   __glutScreenWidth = DisplayWidth(__glutDisplay, __glutScreen);
  130.   __glutScreenHeight = DisplayHeight(__glutDisplay,
  131.     __glutScreen);
  132.   __glutConnectionFD = ConnectionNumber(__glutDisplay);
  133.   __glutWMDeleteWindow = XSGIFastInternAtom(__glutDisplay,
  134.     "WM_DELETE_WINDOW", SGI_XA_WM_DELETE_WINDOW, False);
  135. }
  136. #endif /* _WIN32 */
  137. void
  138. __glutInitTime(struct timeval *beginning)
  139. {
  140.   static int beenhere = 0;
  141.   static struct timeval genesis;
  142.   if (!beenhere) {
  143.     GETTIMEOFDAY(&genesis);
  144.     beenhere = 1;
  145.   }
  146.   *beginning = genesis;
  147. }
  148. static void
  149. removeArgs(int *argcp, char **argv, int numToRemove)
  150. {
  151.   int i, j;
  152.   for (i = 0, j = numToRemove; argv[j]; i++, j++) {
  153.     argv[i] = argv[j];
  154.   }
  155.   argv[i] = NULL;
  156.   *argcp -= numToRemove;
  157. }
  158. void APIENTRY 
  159. glutInit(int *argcp, char **argv)
  160. {
  161.   char *display = NULL;
  162.   char *str, *geometry = NULL;
  163.   struct timeval unused;
  164.   int i;
  165.   if (__glutDisplay) {
  166.     __glutWarning("glutInit being called a second time.");
  167.     return;
  168.   }
  169.   /* Determine temporary program name. */
  170.   str = strrchr(argv[0], '/');
  171.   if (str == NULL) {
  172.     __glutProgramName = argv[0];
  173.   } else {
  174.     __glutProgramName = str + 1;
  175.   }
  176.   /* Make private copy of command line arguments. */
  177.   __glutArgc = *argcp;
  178.   __glutArgv = (char **) malloc(__glutArgc * sizeof(char *));
  179.   if (!__glutArgv)
  180.     __glutFatalError("out of memory.");
  181.   for (i = 0; i < __glutArgc; i++) {
  182.     __glutArgv[i] = __glutStrdup(argv[i]);
  183.     if (!__glutArgv[i])
  184.       __glutFatalError("out of memory.");
  185.   }
  186.   /* determine permanent program name */
  187.   str = strrchr(__glutArgv[0], '/');
  188.   if (str == NULL) {
  189.     __glutProgramName = __glutArgv[0];
  190.   } else {
  191.     __glutProgramName = str + 1;
  192.   }
  193.   /* parse arguments for standard options */
  194.   for (i = 1; i < __glutArgc; i++) {
  195.     if (!strcmp(__glutArgv[i], "-display")) {
  196. #if defined(_WIN32)
  197.       __glutWarning("-display option not supported by Win32 GLUT.");
  198. #endif
  199.       if (++i >= __glutArgc) {
  200.         __glutFatalError(
  201.           "follow -display option with X display name.");
  202.       }
  203.       display = __glutArgv[i];
  204.       removeArgs(argcp, &argv[1], 2);
  205.     } else if (!strcmp(__glutArgv[i], "-geometry")) {
  206.       if (++i >= __glutArgc) {
  207.         __glutFatalError(
  208.           "follow -geometry option with geometry parameter.");
  209.       }
  210.       geometry = __glutArgv[i];
  211.       removeArgs(argcp, &argv[1], 2);
  212.     } else if (!strcmp(__glutArgv[i], "-direct")) {
  213. #if defined(_WIN32)
  214.       __glutWarning("-direct option not supported by Win32 GLUT.");
  215. #endif
  216.       if (!__glutTryDirect)
  217.         __glutFatalError(
  218.           "cannot force both direct and indirect rendering.");
  219.       __glutForceDirect = GL_TRUE;
  220.       removeArgs(argcp, &argv[1], 1);
  221.     } else if (!strcmp(__glutArgv[i], "-indirect")) {
  222. #if defined(_WIN32)
  223.       __glutWarning("-indirect option not supported by Win32 GLUT.");
  224. #endif
  225.       if (__glutForceDirect)
  226.         __glutFatalError(
  227.           "cannot force both direct and indirect rendering.");
  228.       __glutTryDirect = GL_FALSE;
  229.       removeArgs(argcp, &argv[1], 1);
  230.     } else if (!strcmp(__glutArgv[i], "-iconic")) {
  231.       __glutIconic = GL_TRUE;
  232.       removeArgs(argcp, &argv[1], 1);
  233.     } else if (!strcmp(__glutArgv[i], "-gldebug")) {
  234.       __glutDebug = GL_TRUE;
  235.       removeArgs(argcp, &argv[1], 1);
  236.     } else if (!strcmp(__glutArgv[i], "-sync")) {
  237. #if defined(_WIN32)
  238.       __glutWarning("-sync option not supported by Win32 GLUT.");
  239. #endif
  240.       synchronize = GL_TRUE;
  241.       removeArgs(argcp, &argv[1], 1);
  242.     } else {
  243.       /* Once unknown option encountered, stop command line
  244.          processing. */
  245.       break;
  246.     }
  247.   }
  248. #if defined(_WIN32)
  249.   __glutOpenWin32Connection(display);
  250. #else
  251.   __glutOpenXConnection(display);
  252. #endif
  253.   if (geometry) {
  254.     int flags, x, y, width, height;
  255.     /* Fix bogus "{width|height} may be used before set"
  256.        warning */
  257.     width = 0;
  258.     height = 0;
  259.     flags = XParseGeometry(geometry, &x, &y,
  260.       (unsigned int *) &width, (unsigned int *) &height);
  261.     if (WidthValue & flags) {
  262.       /* Careful because X does not allow zero or negative
  263.          width windows */
  264.       if (width > 0)
  265.         __glutInitWidth = width;
  266.     }
  267.     if (HeightValue & flags) {
  268.       /* Careful because X does not allow zero or negative
  269.          height windows */
  270.       if (height > 0)
  271.         __glutInitHeight = height;
  272.     }
  273.     glutInitWindowSize(__glutInitWidth, __glutInitHeight);
  274.     if (XValue & flags) {
  275.       if (XNegative & flags)
  276.         x = DisplayWidth(__glutDisplay, __glutScreen) +
  277.           x - __glutSizeHints.width;
  278.       /* Play safe: reject negative X locations */
  279.       if (x >= 0)
  280.         __glutInitX = x;
  281.     }
  282.     if (YValue & flags) {
  283.       if (YNegative & flags)
  284.         y = DisplayHeight(__glutDisplay, __glutScreen) +
  285.           y - __glutSizeHints.height;
  286.       /* Play safe: reject negative Y locations */
  287.       if (y >= 0)
  288.         __glutInitY = y;
  289.     }
  290.     glutInitWindowPosition(__glutInitX, __glutInitY);
  291.   }
  292.   __glutInitTime(&unused);
  293. }
  294. #ifdef _WIN32
  295. void APIENTRY 
  296. __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int))
  297. {
  298.   __glutExitFunc = exitfunc;
  299.   glutInit(argcp, argv);
  300. }
  301. #endif
  302. /* CENTRY */
  303. void APIENTRY 
  304. glutInitWindowPosition(int x, int y)
  305. {
  306.   __glutInitX = x;
  307.   __glutInitY = y;
  308.   if (x >= 0 && y >= 0) {
  309.     __glutSizeHints.x = x;
  310.     __glutSizeHints.y = y;
  311.     __glutSizeHints.flags |= USPosition;
  312.   } else {
  313.     __glutSizeHints.flags &= ~USPosition;
  314.   }
  315. }
  316. void APIENTRY 
  317. glutInitWindowSize(int width, int height)
  318. {
  319.   __glutInitWidth = width;
  320.   __glutInitHeight = height;
  321.   if (width > 0 && height > 0) {
  322.     __glutSizeHints.width = width;
  323.     __glutSizeHints.height = height;
  324.     __glutSizeHints.flags |= USSize;
  325.   } else {
  326.     __glutSizeHints.flags &= ~USSize;
  327.   }
  328. }
  329. void APIENTRY 
  330. glutInitDisplayMode(unsigned int mask)
  331. {
  332.   __glutDisplayMode = mask;
  333. }
  334. /* ENDCENTRY */