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

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994. */
  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. #ifndef WRAPPERS_ONLY
  6. #include <glutint.h>
  7. extern int __Argc;
  8. extern char **__Argv;
  9. static GLUTmenuStateFCB fortranMenuStateFunc;
  10. void
  11. glutnull_(void)
  12. {
  13. }
  14. void
  15. glutinit_(void)
  16. {
  17.   glutInit(&__Argc, __Argv);
  18. }
  19. static void
  20. fortranMenuStateWrapper(int value)
  21. {
  22.   fortranMenuStateFunc(&value);
  23. }
  24. static void
  25. fortranReshapeWrapper(int w, int h)
  26. {
  27.   (*__glutCurrentWindow->freshape) (&w, &h);
  28. }
  29. #if 0  /* XXX No IRIX joystick support for now. */
  30. static void
  31. fortranJoystickWrapper(unsigned int button, int x, int y, int z)
  32. {
  33.   (*__glutCurrentWindow->fjoystick) (&button, &x, &y, &z);
  34. }
  35. #endif
  36. static void
  37. fortranKeyboardWrapper(unsigned char ch, int x, int y)
  38. {
  39.   int chi = ch;
  40.   (*__glutCurrentWindow->fkeyboard) (&chi, &x, &y);
  41. }
  42. static void
  43. fortranKeyboardUpWrapper(unsigned char ch, int x, int y)
  44. {
  45.   int chi = ch;
  46.   (*__glutCurrentWindow->fkeyboardUp) (&chi, &x, &y);
  47. }
  48. static void
  49. fortranMouseWrapper(int btn, int state, int x, int y)
  50. {
  51.   (*__glutCurrentWindow->fmouse) (&btn, &state, &x, &y);
  52. }
  53. static void
  54. fortranMotionWrapper(int x, int y)
  55. {
  56.   (*__glutCurrentWindow->fmotion) (&x, &y);
  57. }
  58. static void
  59. fortranPassiveMotionWrapper(int x, int y)
  60. {
  61.   (*__glutCurrentWindow->fpassive) (&x, &y);
  62. }
  63. static void
  64. fortranEntryWrapper(int state)
  65. {
  66.   (*__glutCurrentWindow->fentry) (&state);
  67. }
  68. static void
  69. fortranVisibilityWrapper(int state)
  70. {
  71.   (*__glutCurrentWindow->fvisibility) (&state);
  72. }
  73. static void
  74. fortranTimerWrapper(int value)
  75. {
  76.   /* Relies on special knowledge that __glutTimerList points to 
  77.      the GLUTtimer* currently being processed! */
  78.   (*__glutTimerList->ffunc) (&value);
  79. }
  80. static void
  81. fortranSelectWrapper(int value)
  82. {
  83.   (*__glutItemSelected->menu->fselect) (&value);
  84. }
  85. static void
  86. fortranSpecialWrapper(int key, int x, int y)
  87. {
  88.   (*__glutCurrentWindow->fspecial) (&key, &x, &y);
  89. }
  90. static void
  91. fortranSpecialUpWrapper(int key, int x, int y)
  92. {
  93.   (*__glutCurrentWindow->fspecialUp) (&key, &x, &y);
  94. }
  95. static void
  96. fortranSpaceballMotionWrapper(int x, int y, int z)
  97. {
  98.   (*__glutCurrentWindow->fspaceMotion) (&x, &y, &z);
  99. }
  100. static void
  101. fortranSpaceballRotateWrapper(int x, int y, int z)
  102. {
  103.   (*__glutCurrentWindow->fspaceRotate) (&x, &y, &z);
  104. }
  105. static void
  106. fortranSpaceballButtonWrapper(int button, int state)
  107. {
  108.   (*__glutCurrentWindow->fspaceButton) (&button, &state);
  109. }
  110. static void
  111. fortranTabletMotionWrapper(int x, int y)
  112. {
  113.   (*__glutCurrentWindow->ftabletMotion) (&x, &y);
  114. }
  115. static void
  116. fortranTabletButtonWrapper(int button, int state, int x, int y)
  117. {
  118.   (*__glutCurrentWindow->ftabletButton) (&button, &state, &x, &y);
  119. }
  120. static void
  121. fortranDialsWrapper(int dial, int value)
  122. {
  123.   (*__glutCurrentWindow->fdials) (&dial, &value);
  124. }
  125. static void
  126. fortranButtonBoxWrapper(int button, int state)
  127. {
  128.   (*__glutCurrentWindow->fbuttonBox) (&button, &state);
  129. }
  130. #endif /* WRAPPERS_ONLY */
  131. #define glutfunc(Name,name,mixed,type) 
  132. void 
  133. glut##name##func(GLUT##type##FCB mixed) 
  134.     if(mixed == (GLUT##type## FCB) glutnull_) { 
  135. glut##Name ## Func(NULL); 
  136.     } else { 
  137. glut##Name##Func(fortran##Name##Wrapper); 
  138. __glutCurrentWindow->f##mixed = mixed; 
  139.     } 
  140. }
  141. glutfunc(Reshape, reshape, reshape, reshape)
  142. glutfunc(Keyboard, keyboard, keyboard, keyboard)
  143. glutfunc(KeyboardUp, keyboardup, keyboardUp, keyboard)
  144. glutfunc(Mouse, mouse, mouse, mouse)
  145. glutfunc(Motion, motion, motion, motion)
  146. glutfunc(Entry, entry, entry, entry)
  147. glutfunc(Visibility, visibility, visibility, visibility)
  148. glutfunc(Special, special, special, special)
  149. glutfunc(SpecialUp, specialup, specialUp, special)
  150. glutfunc(Dials, dials, dials, dials)
  151. glutfunc(SpaceballMotion, spaceballmotion, spaceMotion, spaceMotion)
  152. glutfunc(SpaceballRotate, spaceballrotate, spaceRotate, spaceRotate)
  153. glutfunc(SpaceballButton, spaceballbutton, spaceButton, spaceButton)
  154. glutfunc(PassiveMotion, passivemotion, passive, passive)
  155. glutfunc(ButtonBox, buttonbox, buttonBox, buttonBox)
  156. glutfunc(TabletMotion, tabletmotion, tabletMotion, tabletMotion)
  157. glutfunc(TabletButton, tabletbutton, tabletButton, tabletButton)
  158. /* Special callback cases. */
  159. /* The display has no parameters passed so no need for wrapper. */
  160. void
  161. glutdisplayfunc(GLUTdisplayFCB display)
  162. {
  163.   glutDisplayFunc((GLUTdisplayCB) display);
  164. }
  165. int
  166. glutcreatemenu(GLUTselectFCB select)
  167. {
  168.   int menu;
  169.   menu = glutCreateMenu(fortranSelectWrapper);
  170.   __glutCurrentMenu->fselect = select;
  171.   return menu;
  172. }
  173. void
  174. gluttimerfunc(unsigned long interval, GLUTtimerFCB timer, int value)
  175. {
  176.   glutTimerFunc((unsigned int) interval, fortranTimerWrapper, value);
  177.   /* Relies on special __glutNewTimer variable side effect to
  178.      establish Fortran timer func! */
  179.   __glutNewTimer->ffunc = timer;
  180. }
  181. /* ARGSUSED */
  182. void
  183. glutjoystickfunc(GLUTjoystickFCB joystick, int pollInterval)
  184. {
  185. #if 0  /* XXX No IRIX joystick support for now. */
  186.   if(joystick == (GLUTjoystickFCB) glutnull_) {
  187.     glutJoystickFunc(NULL, pollInterval);
  188.   } else {
  189.     glutJoystickFunc(fortranJoystickWrapper, pollInterval);
  190.     __glutCurrentWindow->fjoystick = joystick;
  191.   }
  192. #endif
  193. }
  194. void
  195. glutidlefunc(GLUTidleFCB idleFunc)
  196. {
  197.   if (idleFunc == (GLUTidleFCB) glutnull_) {
  198.     glutIdleFunc(NULL);
  199.   } else {
  200.     glutIdleFunc(idleFunc);
  201.   }
  202. }
  203. void
  204. glutmenustatefunc(GLUTmenuStateFCB menuStateFunc)
  205. {
  206.   if (menuStateFunc == (GLUTmenuStateFCB) glutnull_) {
  207.     glutMenuStateFunc(NULL);
  208.   } else {
  209.     glutMenuStateFunc(fortranMenuStateWrapper);
  210.     fortranMenuStateFunc = menuStateFunc;
  211.   }
  212. }
  213. void
  214. glutbitmapcharacter(int *font, int ch)
  215. {
  216.   /* 
  217.    * mkf2c gets confused by double pointers and void* pointers.
  218.    * So mkf2c does not complain, we consider the font handle to
  219.    * be an int*.  But we really get an int** since Fortran
  220.    * passes by reference.  So to "pedantically decode" the 
  221.    * pointer, cast it first to int**, then dereference it,
  222.    * then cast the result to a void*.
  223.    */
  224.   void *trueFont = (void *) *((int **) font);
  225.   glutBitmapCharacter(trueFont, ch);
  226. }
  227. void
  228. glutstrokecharacter(int *font, int ch)
  229. {
  230.   /* 
  231.    * mkf2c gets confused by double pointers and void* pointers.
  232.    * So mkf2c does not complain, we consider the font handle to
  233.    * be an int*.  But we really get an int** since Fortran
  234.    * passes by reference.  So to "pedantically decode" the 
  235.    * pointer, cast it first to int**, then dereference it,
  236.    * then cast the result to a void*.
  237.    */
  238.   void *trueFont = (void *) *((int **) font);
  239.   glutStrokeCharacter(trueFont, ch);
  240. }