home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / mesa-1.2.8 / src / fortran.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  11KB  |  538 lines

  1. /* $Id: fortran.c,v 1.4 1995/11/03 17:38:54 brianp Exp $ */
  2.  
  3. /*
  4.  * Mesa 3-D graphics library
  5.  * Version:  1.2
  6.  * Copyright (C) 1995  Brian Paul  (brianp@ssec.wisc.edu)
  7.  *
  8.  * This library is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Library General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2 of the License, or (at your option) any later version.
  12.  *
  13.  * This library is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Library General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Library General Public
  19.  * License along with this library; if not, write to the Free
  20.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  */
  22.  
  23.  
  24. /*
  25. $Log: fortran.c,v $
  26.  * Revision 1.4  1995/11/03  17:38:54  brianp
  27.  * added casts for C++ compilation
  28.  *
  29.  * Revision 1.3  1995/10/21  13:39:51  brianp
  30.  * updated some comments
  31.  *
  32.  * Revision 1.2  1995/10/17  21:33:09  brianp
  33.  * added fglDisable, fglGenLists, fglGetString, fglGetError, fglIsEnabled
  34.  * fglIsList, and  fglRenderMode
  35.  *
  36.  * Revision 1.1  1995/10/12  17:01:40  brianp
  37.  * Initial revision
  38.  *
  39.  */
  40.  
  41.  
  42.  
  43. /*
  44.  * Fortran wrappers for Mesa functions.
  45.  *
  46.  * To implement the Fortran interface we have to be aware of a few
  47.  * Fortran/C calling conventions which vary from system to system.
  48.  *
  49.  * 1. function naming:  If a Fortran program calls fglAccum then the
  50.  *    name of the C wrapper function might have to be fglaccum, fglaccum_,
  51.  *    or FGLACCUM depending on your system's Fortran/C linking convention.
  52.  *
  53.  * 2. argument passing:  the following table shows what Fortran data type
  54.  *    corresponds to each GL data type used in function arguments.
  55.  *    Remember, Fortran passes all arguments by reference while C passes
  56.  *    arguments by value.
  57.  *
  58.  *    C GL<type>         Fortran
  59.  *    -------------      ----------
  60.  *    GLboolean          logical*1
  61.  *    GLbyte             integer*1
  62.  *    GLubyte            integer*1
  63.  *    GLshort            integer*2
  64.  *    GLushort           integer*2
  65.  *    GLint              integer*4
  66.  *    GLuint             integer*4
  67.  *    GLenum             integer*4
  68.  *    GLsizei            integer*4
  69.  *    GLfloat            real*4
  70.  *    GLclampf           real*4
  71.  *    GLdouble           real*8
  72.  *    GLclampd           real*8
  73.  */
  74.  
  75.  
  76.  
  77. #ifdef FBIND
  78.  
  79.  
  80. #include <string.h>
  81. #include "GL/gl.h"
  82. #include "macros.h"
  83.  
  84.  
  85.  
  86.  
  87. /*
  88.  * Mapping of Fortran types to C types:
  89.  */
  90. #define INT1  GLbyte *
  91. #define INT2  GLshort *
  92. #define INT4  GLint *
  93. #define REAL4  GLfloat *
  94. #define REAL8  GLdouble *
  95. #define CHAR8  void *
  96. #define LOGICAL1  GLboolean *
  97. #define CHAR256  char *
  98.  
  99.  
  100.  
  101. /*
  102.  * Three methods of renaming a C function which is to be called from Fortran:
  103.  *  0 = no change in function name
  104.  *  1 = use all lowercase name (AIX, HPUX)
  105.  *  2 = use all lowercase name with underscore suffix (IRIX, SunOS,
  106.  *         OSF/1, Linux)
  107.  *  3 = use all uppercase name (Cray)
  108.  */
  109.  
  110.  
  111.  
  112.  
  113.  
  114. #if FBIND==1
  115. #  define fglAccum          fglaccum
  116. #  define fglAlphaFunc      fglalphafunc
  117. #  define fglBegin          fglbegin
  118. #  define fglClear          fglclear
  119. #  define fglClearColor     fglclearcolor
  120. #  define fglClearDepth     fglcleardepth
  121. #  define fglClearStencil   fglclearstencil
  122. #  define fglColor3d        fglcolor3d
  123. #  define fglColor4d        fglcolor4d
  124. #  define fglColor3f        fglcolor3f
  125. #  define fglColor4f        fglcolor4f
  126. #  define fglDisable        fgldisable
  127. #  define fglDrawPixels     fgldrawpixels
  128. #  define fglEnable         fglenable
  129. #  define fglEnd            fglend
  130. #  define fglGenLists       fglgenlists
  131. #  define fglGetString      fglgetstring
  132. #  define fglGetError       fglgeterror
  133. #  define fglIsEnabled      fglisenabled
  134. #  define fglIsList         fglislist
  135. #  define fglLoadIdentity   fglloadidentity
  136. #  define fglLoadMatrixd    fglloadmatrixd
  137. #  define fglLoadMatrixf    fglloadmatrixf
  138. #  define fglMatrixMode     fglmatrixmode
  139. #  define fglMultMatrixd    fglmultmatrixd
  140. #  define fglMultMatrixf    fglmultmatrixf
  141. #  define fglRenderMode     fglrendermode
  142. #  define fglRotated        fglrotated
  143. #  define fglRotatef        fglrotatef
  144. #  define fglScaled         fglscaled
  145. #  define fglScalef         fglscalef
  146. #  define fglTranslated     fgltranslated
  147. #  define fglTranslatef     fgltranslatef
  148. #  define fglVertex2f       fglvertex2f
  149. #  define fglVertex2i       fglvertex2i
  150. #  define fglVertex3f       fglvertex3f
  151. #  define fglVertex4f       fglvertex4f
  152. #  define fglViewport       fglviewport
  153. #elif FBIND==2
  154. #  define fglAccum          fglaccum_
  155. #  define fglAlphaFunc      fglalphafunc_
  156. #  define fglBegin          fglbegin_
  157. #  define fglClear          fglclear_
  158. #  define fglClearColor     fglclearcolor_
  159. #  define fglClearDepth     fglcleardepth_
  160. #  define fglClearStencil   fglclearstencil_
  161. #  define fglColor3d        fglcolor3d_
  162. #  define fglColor4d        fglcolor4d_
  163. #  define fglColor3f        fglcolor3f_
  164. #  define fglColor4f        fglcolor4f_
  165. #  define fglDisable        fgldisable_
  166. #  define fglDrawPixels     fgldrawpixels_
  167. #  define fglEnable         fglenable_
  168. #  define fglEnd            fglend_
  169. #  define fglGenLists       fglgenlists_
  170. #  define fglGetString      fglgetstring_
  171. #  define fglGetError       fglgeterror_
  172. #  define fglIsEnabled      fglisenabled_
  173. #  define fglIsList         fglislist_
  174. #  define fglLoadIdentity   fglloadidentity_
  175. #  define fglLoadMatrixd    fglloadmatrixd_
  176. #  define fglLoadMatrixf    fglloadmatrixf_
  177. #  define fglMatrixMode     fglmatrixmode_
  178. #  define fglMultMatrixd    fglmultmatrixd_
  179. #  define fglMultMatrixf    fglmultmatrixf_
  180. #  define fglRenderMode     fglrendermode_
  181. #  define fglRotated        fglrotated_
  182. #  define fglRotatef        fglrotatef_
  183. #  define fglScaled         fglscaled_
  184. #  define fglScalef         fglscalef_
  185. #  define fglTranslated     fgltranslated_
  186. #  define fglTranslatef     fgltranslatef_
  187. #  define fglVertex2f       fglvertex2f_
  188. #  define fglVertex2i       fglvertex2i_
  189. #  define fglVertex3f       fglvertex3f_
  190. #  define fglVertex4f       fglvertex4f_
  191. #  define fglViewport       fglviewport_
  192. #elif FBIND==3
  193. #  define fglAccum          FGLACCUM
  194. #  define fglAlphaFunc      FGLALPHAFUNC
  195. #  define fglBegin          FGLBEGIN
  196. #endif
  197.  
  198.  
  199.  
  200. void fglAccum ( INT4 op, REAL4 value )
  201. {
  202.    glAccum( (GLenum) *op, *value );
  203. }
  204.  
  205.  
  206. void fglAlphaFunc ( INT4 func, REAL4 ref )
  207. {
  208.    glAlphaFunc( (GLenum) *func, *ref );
  209. }
  210.  
  211.  
  212. void fglBegin ( INT4 mode )
  213. {
  214.    glBegin( (GLenum) *mode );
  215. }
  216.  
  217.  
  218. void fglBitmap ( INT4 width, INT4 height, REAL4 xorig, REAL4 yorig,
  219.                  REAL4 xmove, REAL4 ymove, void *bitmap )
  220. {
  221.    glBitmap( *width, *height, *xorig, *yorig, *xmove, *ymove,
  222.              (GLubyte *) bitmap );
  223. }
  224.  
  225.  
  226. void fglBlendColorEXT ( REAL4 red, REAL4 green, REAL4 blue, REAL4 alpha )
  227. {
  228.    glBlendColorEXT( *red, *green, *blue, *alpha );
  229. }
  230.  
  231.  
  232. void fglBlendEquationEXT ( INT4 mode )
  233. {
  234.    glBlendEquationEXT( (GLenum) *mode );
  235. }
  236.  
  237.  
  238. void fglBlendFunc ( INT4 sfactor, INT4 dfactor )
  239. {
  240.    glBlendFunc( (GLenum) *sfactor, (GLenum) *dfactor );
  241. }
  242.  
  243.  
  244. void fglCallList ( INT4 list )
  245. {
  246.    glCallList( *list );
  247. }
  248.  
  249.  
  250. void fglCallLists ( INT4 n, INT4 type, void *lists )
  251. {
  252.    glCallLists( *n, (GLenum) *type, lists );
  253. }
  254.  
  255.  
  256. void fglClear ( INT4 mask )
  257. {
  258.    glClear( (GLbitfield) *mask );
  259. }
  260.  
  261.  
  262. void fglClearAccum ( REAL4 r, REAL4 g, REAL4 b, REAL4 a )
  263. {
  264.    glClearAccum( *r, *g, *b, *a );
  265. }
  266.  
  267.  
  268. void fglClearColor ( REAL4 r, REAL4 g, REAL4 b, REAL4 a )
  269. {
  270.    glClearColor( *r, *g, *b, *a );
  271. }
  272.  
  273.  
  274. void fglClearDepth ( REAL4 depth )
  275. {
  276.    glClearDepth( *depth );
  277. }
  278.  
  279.  
  280. void fglClearStencil ( INT4 s )
  281. {
  282.    glClearStencil( *s );
  283. }
  284.  
  285.  
  286. void fglClipPlane ( INT4 plane, void *equation )
  287. {
  288.    glClipPlane( (GLenum) *plane, (GLdouble *) equation );
  289. }
  290.  
  291.  
  292. void fglColor3d ( REAL8 r, REAL8 g, REAL8 b )
  293. {
  294.    glColor3d( *r, *g, *b );
  295. }
  296.  
  297. void fglColor4d ( REAL8 r, REAL8 g, REAL8 b, REAL8 a )
  298. {
  299.    glColor4d( *r, *g, *b, *a );
  300. }
  301.  
  302.  
  303. void fglColor3f ( REAL4 r, REAL4 g, REAL4 b )
  304. {
  305.    glColor3f( *r, *g, *b );
  306. }
  307.  
  308. void fglColor4f ( REAL4 r, REAL4 g, REAL4 b, REAL4 a )
  309. {
  310.    glColor4f( *r, *g, *b, *a );
  311. }
  312.  
  313.  
  314. /* MORE */
  315.  
  316.  
  317.  
  318. void fglDisable ( INT4 cap )
  319. {
  320.    glDisable( (GLenum) *cap );
  321. }
  322.  
  323. void fglDrawPixels ( INT4 width, INT4 height, INT4 format, INT4 type,
  324.                      CHAR8 pixels )
  325. {
  326.    glDrawPixels( *width, *height, (GLenum) *format, (GLenum) *type, pixels );
  327. }
  328.  
  329.  
  330. void fglEdgeFlag ( LOGICAL1 flag )
  331. {
  332.    glEdgeFlag( *flag );
  333. }
  334.  
  335.  
  336. void fglEdgeFlagv ( CHAR8 flag )
  337. {
  338.    GLboolean *f = (GLboolean *) flag;
  339.    glEdgeFlagv( f );
  340. }
  341.  
  342.  
  343. void fglEnable ( INT4 cap )
  344. {
  345.    glEnable( (GLenum) *cap );
  346. }
  347.  
  348.  
  349. void fglEnd ( void )
  350. {
  351.    glEnd();
  352. }
  353.  
  354.  
  355. GLint fglGenLists ( INT4 range )
  356. {
  357.    return glGenLists( *range );
  358. }
  359.  
  360.  
  361. /*
  362.  * Implementing a C function which returns a characters string via a
  363.  * Fortran invokation is tricky.  This solution works on IRIX.
  364.  */
  365. void fglGetString ( char result[], int length, INT4 name )
  366. {
  367.    int i;
  368.    char *str;
  369.  
  370.    for (i=0;i<length;i++) {
  371.       result[i] = ' ';
  372.    }
  373.    str = (char *) glGetString( (GLenum) *name );
  374.    if (str) {
  375.       int len = strlen(str);
  376.       if (len>0) {
  377.          strncpy( result, str, MIN2(len,length) );
  378.       }
  379.    }
  380. }
  381.  
  382.  
  383. GLint fglGetError ( void )
  384. {
  385.    return glGetError();
  386. }
  387.  
  388.  
  389. GLboolean fglIsEnabled ( INT4 cap )
  390. {
  391.    return glIsEnabled( (GLenum) *cap );
  392. }
  393.  
  394.  
  395. GLboolean fglIsList ( INT4 list )
  396. {
  397.    return glIsList( *list );
  398. }
  399.  
  400.  
  401.  
  402. /* MORE */
  403.  
  404. void fglLoadIdentity( void )
  405. {
  406.    glLoadIdentity();
  407. }
  408.  
  409.  
  410. void fglLoadMatrixd( CHAR8 m )
  411. {
  412.    glLoadMatrixd( (GLdouble *) m );
  413. }
  414.  
  415.  
  416. void fglLoadMatrixf( CHAR8 m )
  417. {
  418.    glLoadMatrixf( (GLfloat *) m );
  419. }
  420.  
  421.  
  422. void fglMatrixMode( INT4 mode )
  423. {
  424.    glMatrixMode( (GLenum) *mode );
  425. }
  426.  
  427.  
  428. void fglMultMatrixd( CHAR8 m )
  429. {
  430.    glMultMatrixd( (GLdouble *) m );
  431. }
  432.  
  433.  
  434. void fglMultMatrixf( CHAR8 m )
  435. {
  436.    glMultMatrixf( (GLfloat *) m );
  437. }
  438.  
  439.  
  440. /* MORE */
  441.  
  442.  
  443. GLint fglRenderMode ( INT4 mode )
  444. {
  445.    return glRenderMode( (GLenum) *mode );
  446. }
  447.  
  448.  
  449. void fglRotated ( REAL8 angle, REAL8 ax, REAL8 ay, REAL8 az )
  450. {
  451.    glRotated( *angle, *ax, *ay, *az );
  452. }
  453.  
  454.  
  455. void fglRotatef ( REAL4 angle, REAL4 ax, REAL4 ay, REAL4 az )
  456. {
  457.    glRotatef( *angle, *ax, *ay, *az );
  458. }
  459.  
  460.  
  461. void fglScaled ( REAL8 sx, REAL8 sy, REAL8 sz )
  462. {
  463.    glScaled( *sx, *sy, *sz );
  464. }
  465.  
  466.  
  467. void fglScalef ( REAL4 sx, REAL4 sy, REAL4 sz )
  468. {
  469.    glScalef( *sx, *sy, *sz );
  470. }
  471.  
  472.  
  473. void fglTranslated ( REAL8 tx, REAL8 ty, REAL8 tz )
  474. {
  475.    glTranslated( *tx, *ty, *tz );
  476. }
  477.  
  478.  
  479. void fglTranslatef ( REAL4 tx, REAL4 ty, REAL4 tz )
  480. {
  481.    glTranslatef( *tx, *ty, *tz );
  482. }
  483.  
  484.  
  485.  
  486.  
  487. /* MORE */
  488.  
  489.  
  490.  
  491. void fglVertex2f ( REAL4 x, REAL4 y )
  492. {
  493.    glVertex2f( *x, *y );
  494. }
  495.  
  496. void fglVertex2i ( INT4 x, INT4 y )
  497. {
  498.    glVertex2i( *x, *y );
  499. }
  500.  
  501. void fglVertex3f ( REAL4 x, REAL4 y, REAL4 z )
  502. {
  503.    glVertex3f( *x, *y, *z );
  504. }
  505.  
  506. void fglVertex4f ( REAL4 x, REAL4 y, REAL4 z, REAL4 w )
  507. {
  508.    glVertex4f( *x, *y, *z, *w );
  509. }
  510.  
  511.  
  512. void fglViewport ( INT4 x, INT4 y, INT4 width, INT4 height )
  513. {
  514.    glViewport( *x, *y, *width, *height );
  515. }
  516.  
  517.  
  518. /* MORE */
  519.  
  520.  
  521.  
  522.  
  523. #else /*ifdef FBIND*/
  524.  
  525.  
  526.  
  527. /* If FBIND is not defined, Fortran bindings aren't made.  Need this
  528.  * dummy function for some picky compilers.
  529.  */
  530. static void dummy()
  531. {
  532.    return;
  533. }
  534.  
  535.  
  536.  
  537. #endif /*ifdef FBIND*/
  538.