From fa7898ab784bafbdeef20f6afdcae2c11099d8fc Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Fri, 8 Mar 2002 22:12:41 +0000 Subject: [PATCH] gl2ps update --- Graphics/gl2ps.cpp | 252 ++++++++++++++++++++++++--------------------- Graphics/gl2ps.h | 46 ++++++--- 2 files changed, 165 insertions(+), 133 deletions(-) diff --git a/Graphics/gl2ps.cpp b/Graphics/gl2ps.cpp index 3256bb51ff..56b7161950 100644 --- a/Graphics/gl2ps.cpp +++ b/Graphics/gl2ps.cpp @@ -2,7 +2,7 @@ * GL2PS, an OpenGL to PostScript Printing Library * Copyright (C) 1999-2002 Christophe Geuzaine * - * $Id: gl2ps.cpp,v 1.37 2002-02-15 00:32:35 geuzaine Exp $ + * $Id: gl2ps.cpp,v 1.38 2002-03-08 22:12:41 geuzaine Exp $ * * E-mail: geuz@geuz.org * URL: http://www.geuz.org/gl2ps/ @@ -34,14 +34,14 @@ /* The static gl2ps context. gl2ps is not thread safe (we should create a local GL2PScontext during gl2psBeginPage). */ -static GL2PScontext gl2ps; +static GL2PScontext *gl2ps=NULL; /* Some 'system' utility routines */ GLvoid gl2psMsg(GLint level, char *fmt, ...){ va_list args; - if(!(gl2ps.options & GL2PS_SILENT)){ + if(!(gl2ps->options & GL2PS_SILENT)){ switch(level){ case GL2PS_INFO : fprintf(stderr, "GL2PS info: "); break; case GL2PS_WARNING : fprintf(stderr, "GL2PS warning: "); break; @@ -457,7 +457,7 @@ GLint gl2psFindRoot(GL2PSlist *primitives, GL2PSprimitive **root){ GL2PSprimitive *prim1, *prim2; GL2PSplane plane; - if(gl2ps.options & GL2PS_BEST_ROOT){ + if(gl2ps->options & GL2PS_BEST_ROOT){ *root = *(GL2PSprimitive**)gl2psListPointer(primitives, 0); for(i=0 ; i<gl2psListNbr(primitives) ; i++){ prim1 = *(GL2PSprimitive**)gl2psListPointer(primitives, i); @@ -844,9 +844,9 @@ GLvoid gl2psAddPolyPrimitive(GLshort type, GLshort numverts, memcpy(prim->verts, verts, numverts * sizeof(GL2PSvertex)); prim->boundary = boundary; - if(gl2ps.options & GL2PS_SIMPLE_LINE_OFFSET){ + if(gl2ps->options & GL2PS_SIMPLE_LINE_OFFSET){ if(type == GL2PS_LINE){ - if(gl2ps.sort == GL2PS_SIMPLE_SORT){ + if(gl2ps->sort == GL2PS_SIMPLE_SORT){ prim->verts[0].xyz[2] -= 1.; prim->verts[1].xyz[2] -= 1.; } @@ -858,13 +858,13 @@ GLvoid gl2psAddPolyPrimitive(GLshort type, GLshort numverts, } else if(offset && type == GL2PS_TRIANGLE){ - if(gl2ps.sort == GL2PS_SIMPLE_SORT){ - factor = gl2ps.offset[0]; - units = gl2ps.offset[1]; + if(gl2ps->sort == GL2PS_SIMPLE_SORT){ + factor = gl2ps->offset[0]; + units = gl2ps->offset[1]; } else{ - factor = gl2ps.offset[0] / 800.; - units = gl2ps.offset[1] / 800.; + factor = gl2ps->offset[0] / 800.; + units = gl2ps->offset[1] / 800.; } area = @@ -898,13 +898,13 @@ GLvoid gl2psAddPolyPrimitive(GLshort type, GLshort numverts, prim->dash = dash; prim->width = width; /* we should maybe use floats */ - if(gl2ps.sort == GL2PS_SIMPLE_SORT){ + if(gl2ps->sort == GL2PS_SIMPLE_SORT){ for(i = 0; i < numverts; i++) prim->depth += prim->verts[i].xyz[2]; prim->depth /= (GLfloat)numverts; } - gl2psListAdd(gl2ps.primitives, &prim); + gl2psListAdd(gl2ps->primitives, &prim); } GLint gl2psGetVertex(GL2PSvertex *v, GLfloat *p){ @@ -914,12 +914,12 @@ GLint gl2psGetVertex(GL2PSvertex *v, GLfloat *p){ v->xyz[1] = p[1]; v->xyz[2] = 1000. * p[2]; - if(gl2ps.colormode == GL_COLOR_INDEX && gl2ps.colorsize > 0){ + if(gl2ps->colormode == GL_COLOR_INDEX && gl2ps->colorsize > 0){ i = (GLint)(p[3] + 0.5); - v->rgba[0] = gl2ps.colormap[i][0]; - v->rgba[1] = gl2ps.colormap[i][1]; - v->rgba[2] = gl2ps.colormap[i][2]; - v->rgba[3] = gl2ps.colormap[i][3]; + v->rgba[0] = gl2ps->colormap[i][0]; + v->rgba[1] = gl2ps->colormap[i][1]; + v->rgba[2] = gl2ps->colormap[i][2]; + v->rgba[3] = gl2ps->colormap[i][3]; return 4; } else{ @@ -950,12 +950,12 @@ GLint gl2psParseFeedbackBuffer(GLvoid){ return GL2PS_NO_FEEDBACK; } - current = gl2ps.feedback; - boundary = gl2ps.boundary = 0; + current = gl2ps->feedback; + boundary = gl2ps->boundary = 0; while(used > 0){ - if(boundary) gl2ps.boundary = 1; + if(boundary) gl2ps->boundary = 1; switch((GLint)*current){ case GL_POINT_TOKEN : @@ -1086,7 +1086,7 @@ GLvoid gl2psPrintPostScriptHeader(GLvoid){ Smooth-shaded triangle: x3 y3 r3 g3 b3 x2 y2 r2 g2 b2 x1 y1 r1 g1 b1 ST */ - fprintf(gl2ps.stream, + fprintf(gl2ps->stream, "%%!PS-Adobe-3.0\n" "%%%%Title: %s\n" "%%%%Creator: GL2PS, an OpenGL to PostScript Printing Library, v. %g\n" @@ -1148,35 +1148,35 @@ GLvoid gl2psPrintPostScriptHeader(GLvoid){ "%%%%EndSetup\n" "%%%%Page: 1 1\n" "%%%%BeginPageSetup\n", - gl2ps.title, GL2PS_VERSION, gl2ps.producer, ctime(&now), - (gl2ps.options & GL2PS_LANDSCAPE) ? "Landscape" : "Portrait", - (gl2ps.options & GL2PS_LANDSCAPE) ? viewport[3] : viewport[2], - (gl2ps.options & GL2PS_LANDSCAPE) ? viewport[2] : viewport[3], - (gl2ps.options & GL2PS_LANDSCAPE) ? viewport[1] : viewport[0], - (gl2ps.options & GL2PS_LANDSCAPE) ? viewport[0] : viewport[1], - (gl2ps.options & GL2PS_LANDSCAPE) ? viewport[3] : viewport[2], - (gl2ps.options & GL2PS_LANDSCAPE) ? viewport[2] : viewport[3]); - if (gl2ps.options & GL2PS_LANDSCAPE) - fprintf(gl2ps.stream, + gl2ps->title, GL2PS_VERSION, gl2ps->producer, ctime(&now), + (gl2ps->options & GL2PS_LANDSCAPE) ? "Landscape" : "Portrait", + (gl2ps->options & GL2PS_LANDSCAPE) ? viewport[3] : viewport[2], + (gl2ps->options & GL2PS_LANDSCAPE) ? viewport[2] : viewport[3], + (gl2ps->options & GL2PS_LANDSCAPE) ? viewport[1] : viewport[0], + (gl2ps->options & GL2PS_LANDSCAPE) ? viewport[0] : viewport[1], + (gl2ps->options & GL2PS_LANDSCAPE) ? viewport[3] : viewport[2], + (gl2ps->options & GL2PS_LANDSCAPE) ? viewport[2] : viewport[3]); + if (gl2ps->options & GL2PS_LANDSCAPE) + fprintf(gl2ps->stream, "%d 0 translate 90 rotate\n", viewport[3]); - fprintf(gl2ps.stream, + fprintf(gl2ps->stream, "%%%%EndPageSetup\n" "mark\n" "gsave\n" "1.0 1.0 scale\n"); - if(gl2ps.options & GL2PS_DRAW_BACKGROUND){ - if(gl2ps.colormode == GL_RGBA || gl2ps.colorsize == 0) + if(gl2ps->options & GL2PS_DRAW_BACKGROUND){ + if(gl2ps->colormode == GL_RGBA || gl2ps->colorsize == 0) glGetFloatv(GL_COLOR_CLEAR_VALUE, rgba); else{ glGetIntegerv(GL_INDEX_CLEAR_VALUE, &index); - rgba[0] = gl2ps.colormap[index][0]; - rgba[1] = gl2ps.colormap[index][1]; - rgba[2] = gl2ps.colormap[index][2]; + rgba[0] = gl2ps->colormap[index][0]; + rgba[1] = gl2ps->colormap[index][1]; + rgba[2] = gl2ps->colormap[index][2]; rgba[3] = 0.; } - fprintf(gl2ps.stream, + fprintf(gl2ps->stream, "%g %g %g C\n" "newpath %d %d moveto %d %d lineto %d %d lineto %d %d lineto\n" "closepath fill\n", @@ -1193,7 +1193,7 @@ GLvoid gl2psPrintPostScriptHeader(GLvoid){ rgba[0] = prim->verts[0].rgba[0]; \ rgba[1] = prim->verts[0].rgba[1]; \ rgba[2] = prim->verts[0].rgba[2]; \ - fprintf(gl2ps.stream, "%g %g %g C\n", rgba[0], rgba[1], rgba[2]); \ + fprintf(gl2ps->stream, "%g %g %g C\n", rgba[0], rgba[1], rgba[2]); \ } #define CLEARCOLOR rgba[0] = rgba[1] = rgba[2] = -1. @@ -1207,30 +1207,30 @@ GLvoid gl2psPrintPostScriptPrimitive(GLvoid *a, GLvoid *b){ prim = *(GL2PSprimitive**) a; - if(gl2ps.options & GL2PS_OCCLUSION_CULL && prim->depth >= 0.) return; + if(gl2ps->options & GL2PS_OCCLUSION_CULL && prim->depth >= 0.) return; switch(prim->type){ case GL2PS_TEXT : PRINTCOLOR; - fprintf(gl2ps.stream, "(%s) %g %g %d /%s S\n", + fprintf(gl2ps->stream, "(%s) %g %g %d /%s S\n", prim->text->str, prim->verts[0].xyz[0], prim->verts[0].xyz[1], prim->text->fontsize, prim->text->fontname); break; case GL2PS_POINT : PRINTCOLOR; - fprintf(gl2ps.stream, "%g %g %g P\n", + fprintf(gl2ps->stream, "%g %g %g P\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1], 0.5*prim->width); break; case GL2PS_LINE : if(linewidth != prim->width){ linewidth = prim->width; - fprintf(gl2ps.stream, "%g W\n", linewidth); + fprintf(gl2ps->stream, "%g W\n", linewidth); } if(prim->dash) - fprintf(gl2ps.stream, "[%d] 0 setdash\n", prim->dash); - if(gl2ps.shade && !gl2psVertsSameColor(prim)){ + fprintf(gl2ps->stream, "[%d] 0 setdash\n", prim->dash); + if(gl2ps->shade && !gl2psVertsSameColor(prim)){ CLEARCOLOR; - fprintf(gl2ps.stream, "%g %g %g %g %g %g %g %g %g %g SL\n", + fprintf(gl2ps->stream, "%g %g %g %g %g %g %g %g %g %g SL\n", prim->verts[1].xyz[0], prim->verts[1].xyz[1], prim->verts[1].rgba[0], prim->verts[1].rgba[1], prim->verts[1].rgba[2], prim->verts[0].xyz[0], @@ -1239,17 +1239,17 @@ GLvoid gl2psPrintPostScriptPrimitive(GLvoid *a, GLvoid *b){ } else{ PRINTCOLOR; - fprintf(gl2ps.stream, "%g %g %g %g L\n", + fprintf(gl2ps->stream, "%g %g %g %g L\n", prim->verts[1].xyz[0], prim->verts[1].xyz[1], prim->verts[0].xyz[0], prim->verts[0].xyz[1]); } if(prim->dash) - fprintf(gl2ps.stream, "[] 0 setdash\n"); + fprintf(gl2ps->stream, "[] 0 setdash\n"); break; case GL2PS_TRIANGLE : - if(gl2ps.shade && !gl2psVertsSameColor(prim)){ + if(gl2ps->shade && !gl2psVertsSameColor(prim)){ CLEARCOLOR; - fprintf(gl2ps.stream, "%g %g %g %g %g %g %g %g %g %g %g %g %g %g %g ST\n", + fprintf(gl2ps->stream, "%g %g %g %g %g %g %g %g %g %g %g %g %g %g %g ST\n", prim->verts[2].xyz[0], prim->verts[2].xyz[1], prim->verts[2].rgba[0], prim->verts[2].rgba[1], prim->verts[2].rgba[2], prim->verts[1].xyz[0], @@ -1261,7 +1261,7 @@ GLvoid gl2psPrintPostScriptPrimitive(GLvoid *a, GLvoid *b){ } else{ PRINTCOLOR; - fprintf(gl2ps.stream, "%g %g %g %g %g %g T\n", + fprintf(gl2ps->stream, "%g %g %g %g %g %g T\n", prim->verts[2].xyz[0], prim->verts[2].xyz[1], prim->verts[1].xyz[0], prim->verts[1].xyz[1], prim->verts[0].xyz[0], prim->verts[0].xyz[1]); @@ -1277,7 +1277,7 @@ GLvoid gl2psPrintPostScriptPrimitive(GLvoid *a, GLvoid *b){ } void gl2psPrintPostScriptFooter(GLvoid){ - fprintf(gl2ps.stream, + fprintf(gl2ps->stream, "grestore\n" "showpage\n" "cleartomark\n" @@ -1296,26 +1296,26 @@ GLvoid gl2psPrintTeXHeader(GLvoid){ glGetIntegerv(GL_VIEWPORT, viewport); - if(gl2ps.filename && strlen(gl2ps.filename)<256){ - for(i=strlen(gl2ps.filename)-1 ; i>=0 ; i--){ - if(gl2ps.filename[i] == '.'){ - strncpy(name, gl2ps.filename, i); + if(gl2ps->filename && strlen(gl2ps->filename)<256){ + for(i=strlen(gl2ps->filename)-1 ; i>=0 ; i--){ + if(gl2ps->filename[i] == '.'){ + strncpy(name, gl2ps->filename, i); name[i]='\0'; break; } } - if(i<=0) strcpy(name, gl2ps.filename); + if(i<=0) strcpy(name, gl2ps->filename); } else strcpy(name, "unnamed"); - fprintf(gl2ps.stream, + fprintf(gl2ps->stream, "\\setlength{\\unitlength}{1pt}\n" "\\begin{picture}(0,0)\n" "\\includegraphics{%s}\n" "\\end{picture}%%\n" "%s\\begin{picture}(%d,%d)(0,0)\n", - name, (gl2ps.options & GL2PS_LANDSCAPE) ? "\\rotatebox{90}{" : "", + name, (gl2ps->options & GL2PS_LANDSCAPE) ? "\\rotatebox{90}{" : "", viewport[2],viewport[3]); } @@ -1326,7 +1326,7 @@ GLvoid gl2psPrintTeXPrimitive(GLvoid *a, GLvoid *b){ switch(prim->type){ case GL2PS_TEXT : - fprintf(gl2ps.stream, "\\put(%g,%g){\\makebox(0,0)[lb]{%s}}\n", + fprintf(gl2ps->stream, "\\put(%g,%g){\\makebox(0,0)[lb]{%s}}\n", prim->verts[0].xyz[0], prim->verts[0].xyz[1], prim->text->str); break; default : @@ -1335,55 +1335,54 @@ GLvoid gl2psPrintTeXPrimitive(GLvoid *a, GLvoid *b){ } void gl2psPrintTeXFooter(GLvoid){ - fprintf(gl2ps.stream, "\\end{picture}%s\n", - (gl2ps.options & GL2PS_LANDSCAPE) ? "}" : ""); + fprintf(gl2ps->stream, "\\end{picture}%s\n", + (gl2ps->options & GL2PS_LANDSCAPE) ? "}" : ""); } /* The public routines */ -GLvoid gl2psBeginPage(char *title, char *producer, - GLint format, GLint sort, GLint options, - GLint colormode, GLint colorsize, GL2PSrgba *colormap, - GLint buffersize, FILE *stream, char *filename){ - - gl2ps.format = format; - gl2ps.title = title; - gl2ps.producer = producer; - gl2ps.filename = filename; - gl2ps.sort = sort; - gl2ps.options = options; - gl2ps.colormode = colormode; - gl2ps.buffersize = buffersize > 0 ? buffersize : 2048 * 2048; - gl2ps.feedback = (GLfloat*)gl2psMalloc(gl2ps.buffersize * sizeof(GLfloat)); - gl2ps.primitives = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*)); - - if(gl2ps.colormode == GL_RGBA){ - gl2ps.colorsize = 0; - gl2ps.colormap = NULL; +GL2PSDLL_API GLvoid gl2psBeginPage(char *title, char *producer, + GLint format, GLint sort, GLint options, + GLint colormode, GLint colorsize, + GL2PSrgba *colormap, GLint buffersize, + FILE *stream, char *filename){ + gl2ps = (GL2PScontext*)gl2psMalloc(sizeof(GL2PScontext)); + gl2ps->format = format; + gl2ps->title = title; + gl2ps->producer = producer; + gl2ps->filename = filename; + gl2ps->sort = sort; + gl2ps->options = options; + gl2ps->colormode = colormode; + gl2ps->buffersize = buffersize > 0 ? buffersize : 2048 * 2048; + gl2ps->feedback = (GLfloat*)gl2psMalloc(gl2ps->buffersize * sizeof(GLfloat)); + gl2ps->primitives = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*)); + + if(gl2ps->colormode == GL_RGBA){ + gl2ps->colorsize = 0; + gl2ps->colormap = NULL; } - else if(gl2ps.colormode == GL_COLOR_INDEX){ + else if(gl2ps->colormode == GL_COLOR_INDEX){ if(!colorsize || !colormap) gl2psMsg(GL2PS_ERROR, "Missing colormap for GL_COLOR_INDEX rendering"); - if(gl2ps.colormap) - gl2psFree(gl2ps.colormap); - gl2ps.colorsize = colorsize; - gl2ps.colormap = (GL2PSrgba*)gl2psMalloc(gl2ps.colorsize * sizeof(GL2PSrgba)); - memcpy(gl2ps.colormap, colormap, gl2ps.colorsize * sizeof(GL2PSrgba)); + gl2ps->colorsize = colorsize; + gl2ps->colormap = (GL2PSrgba*)gl2psMalloc(gl2ps->colorsize * sizeof(GL2PSrgba)); + memcpy(gl2ps->colormap, colormap, gl2ps->colorsize * sizeof(GL2PSrgba)); } else gl2psMsg(GL2PS_ERROR, "Unknown color mode in gl2psBeginPage"); if(stream) - gl2ps.stream = stream; + gl2ps->stream = stream; else gl2psMsg(GL2PS_ERROR, "Bad file pointer"); - glFeedbackBuffer(gl2ps.buffersize, GL_3D_COLOR, gl2ps.feedback); + glFeedbackBuffer(gl2ps->buffersize, GL_3D_COLOR, gl2ps->feedback); glRenderMode(GL_FEEDBACK); } -GLint gl2psEndPage(GLvoid){ +GL2PSDLL_API GLint gl2psEndPage(GLvoid){ GL2PSbsptree *root; GL2PSxyz eye={0., 0., 100000.}; GLint shademodel, res; @@ -1391,19 +1390,22 @@ GLint gl2psEndPage(GLvoid){ void (*pprim)(GLvoid *a, GLvoid *b) = 0; void (*pfoot)(GLvoid) = 0; + if(!gl2ps) + gl2psMsg(GL2PS_ERROR, "Uninitialized gl2ps context"); + glGetIntegerv(GL_SHADE_MODEL, &shademodel); - gl2ps.shade = (shademodel == GL_SMOOTH); + gl2ps->shade = (shademodel == GL_SMOOTH); - if(gl2ps.format & GL2PS_TEX) + if(gl2ps->format & GL2PS_TEX) res = GL2PS_SUCCESS; else res = gl2psParseFeedbackBuffer(); - if(gl2ps.feedback) gl2psFree(gl2ps.feedback); + if(gl2ps->feedback) gl2psFree(gl2ps->feedback); if(res == GL2PS_SUCCESS){ - switch(gl2ps.format){ + switch(gl2ps->format){ case GL2PS_TEX : phead = gl2psPrintTeXHeader; pprim = gl2psPrintTeXPrimitive; @@ -1420,25 +1422,25 @@ GLint gl2psEndPage(GLvoid){ } phead(); - switch(gl2ps.sort){ + switch(gl2ps->sort){ case GL2PS_NO_SORT : - gl2psListAction(gl2ps.primitives, pprim); - gl2psListAction(gl2ps.primitives, gl2psFreePrimitive); - gl2psListDelete(gl2ps.primitives); + gl2psListAction(gl2ps->primitives, pprim); + gl2psListAction(gl2ps->primitives, gl2psFreePrimitive); + gl2psListDelete(gl2ps->primitives); res = GL2PS_SUCCESS; break; case GL2PS_SIMPLE_SORT : - gl2psListSort(gl2ps.primitives, gl2psCompareDepth); - gl2psListActionInverse(gl2ps.primitives, pprim); - gl2psListAction(gl2ps.primitives, gl2psFreePrimitive); - gl2psListDelete(gl2ps.primitives); + gl2psListSort(gl2ps->primitives, gl2psCompareDepth); + gl2psListActionInverse(gl2ps->primitives, pprim); + gl2psListAction(gl2ps->primitives, gl2psFreePrimitive); + gl2psListDelete(gl2ps->primitives); res = GL2PS_SUCCESS; break; case GL2PS_BSP_SORT : root = (GL2PSbsptree*)gl2psMalloc(sizeof(GL2PSbsptree)); - gl2psBuildBspTree(root, gl2ps.primitives); - if(gl2ps.boundary) gl2psBuildPolygonBoundary(root); - if(gl2ps.options & GL2PS_OCCLUSION_CULL){ + gl2psBuildBspTree(root, gl2ps->primitives); + if(gl2ps->boundary) gl2psBuildPolygonBoundary(root); + if(gl2ps->options & GL2PS_OCCLUSION_CULL){ gl2psTraverseBspTree(root, eye, -(float)GL2PS_EPSILON, gl2psLess, gl2psAddInImage); } @@ -1451,21 +1453,26 @@ GLint gl2psEndPage(GLvoid){ gl2psMsg(GL2PS_ERROR, "Unknown sorting algorithm"); } pfoot(); - fflush(gl2ps.stream); + fflush(gl2ps->stream); } - if(gl2ps.colormap) gl2psFree(gl2ps.colormap); + if(gl2ps->colormap) gl2psFree(gl2ps->colormap); + + gl2psFree(gl2ps); + gl2ps = NULL; return res; } -GLvoid gl2psText(char *str, char *fontname, GLint fontsize){ +GL2PSDLL_API GLvoid gl2psText(char *str, char *fontname, GLint fontsize){ GLfloat pos[4]; GL2PSprimitive *prim; GLboolean valid; - if(gl2ps.options & GL2PS_NO_TEXT) return; + if(!gl2ps) return; + + if(gl2ps->options & GL2PS_NO_TEXT) return; glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid); if(!valid) return; /* the primitive is culled */ @@ -1490,18 +1497,20 @@ GLvoid gl2psText(char *str, char *fontname, GLint fontsize){ prim->text->fontname = fontname; prim->text->fontsize = fontsize; - if(!gl2ps.primitives) + if(!gl2ps->primitives) gl2psMsg(GL2PS_ERROR, "gl2psText should be called inside gl2psBeginPage/gl2psEndPage"); else - gl2psListAdd(gl2ps.primitives, &prim); + gl2psListAdd(gl2ps->primitives, &prim); } -GLvoid gl2psEnable(GLint mode){ +GL2PSDLL_API GLvoid gl2psEnable(GLint mode){ + if(!gl2ps) return; + switch(mode){ case GL2PS_POLYGON_OFFSET_FILL : glPassThrough(GL2PS_BEGIN_POLYGON_OFFSET_FILL); - glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &gl2ps.offset[0]); - glGetFloatv(GL_POLYGON_OFFSET_UNITS, &gl2ps.offset[1]); + glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &gl2ps->offset[0]); + glGetFloatv(GL_POLYGON_OFFSET_UNITS, &gl2ps->offset[1]); break; case GL2PS_POLYGON_BOUNDARY : glPassThrough(GL2PS_BEGIN_POLYGON_BOUNDARY); @@ -1515,7 +1524,9 @@ GLvoid gl2psEnable(GLint mode){ } } -GLvoid gl2psDisable(GLint mode){ +GL2PSDLL_API GLvoid gl2psDisable(GLint mode){ + if(!gl2ps) return; + switch(mode){ case GL2PS_POLYGON_OFFSET_FILL : glPassThrough(GL2PS_END_POLYGON_OFFSET_FILL); @@ -1532,12 +1543,17 @@ GLvoid gl2psDisable(GLint mode){ } } -GLvoid gl2psPointSize(GLfloat value){ +GL2PSDLL_API GLvoid gl2psPointSize(GLfloat value){ + if(!gl2ps) return; + glPassThrough(GL2PS_SET_POINT_SIZE); glPassThrough(value); } -GLvoid gl2psLineWidth(GLfloat value){ +GL2PSDLL_API GLvoid gl2psLineWidth(GLfloat value){ + if(!gl2ps) return; + glPassThrough(GL2PS_SET_LINE_WIDTH); glPassThrough(value); } + diff --git a/Graphics/gl2ps.h b/Graphics/gl2ps.h index c16e26ef23..f26532313b 100644 --- a/Graphics/gl2ps.h +++ b/Graphics/gl2ps.h @@ -2,7 +2,7 @@ * GL2PS, an OpenGL to PostScript Printing Library * Copyright (C) 1999-2002 Christophe Geuzaine * - * $Id: gl2ps.h,v 1.19 2002-02-15 00:32:35 geuzaine Exp $ + * $Id: gl2ps.h,v 1.20 2002-03-08 22:12:41 geuzaine Exp $ * * E-mail: geuz@geuz.org * URL: http://www.geuz.org/gl2ps/ @@ -29,17 +29,32 @@ #include <stdio.h> #include <stdlib.h> +/* To generate a Windows dll, you have to define GL2PSDLL at compile + time */ + #ifdef WIN32 #include <windows.h> -#endif +#ifdef GL2PSDLL +#ifdef GL2PSDLL_EXPORTS +#define GL2PSDLL_API __declspec(dllexport) +#else +#define GL2PSDLL_API __declspec(dllimport) +#endif /* GL2PSDLL_EXPORTS */ +#else +#define GL2PSDLL_API +#endif /* GL2PSDLL */ +#else +#define GL2PSDLL_API +#endif /* WIN32 */ #ifdef __APPLE__ #include <OpenGL/gl.h> #else #include <GL/gl.h> -#endif +#endif /* __APPLE__ */ -#define GL2PS_VERSION 0.52 + +#define GL2PS_VERSION 0.53 #define GL2PS_NONE 0 /* Output file format */ @@ -171,19 +186,20 @@ typedef struct { extern "C" { #endif -GLvoid gl2psBeginPage(char *title, char *producer, - GLint format, GLint sort, GLint options, - GLint colormode, GLint colorsize, GL2PSrgba *colormap, - GLint buffersize, FILE *stream, char *filename); -GLint gl2psEndPage(GLvoid); -GLvoid gl2psText(char *str, char *fontname, GLint size); -GLvoid gl2psEnable(GLint mode); -GLvoid gl2psDisable(GLint mode); -GLvoid gl2psPointSize(GLfloat value); -GLvoid gl2psLineWidth(GLfloat value); +GL2PSDLL_API GLvoid gl2psBeginPage(char *title, char *producer, + GLint format, GLint sort, GLint options, + GLint colormode, GLint colorsize, + GL2PSrgba *colormap, GLint buffersize, + FILE *stream, char *filename); +GL2PSDLL_API GLint gl2psEndPage(GLvoid); +GL2PSDLL_API GLvoid gl2psText(char *str, char *fontname, GLint size); +GL2PSDLL_API GLvoid gl2psEnable(GLint mode); +GL2PSDLL_API GLvoid gl2psDisable(GLint mode); +GL2PSDLL_API GLvoid gl2psPointSize(GLfloat value); +GL2PSDLL_API GLvoid gl2psLineWidth(GLfloat value); #ifdef __cplusplus }; #endif -#endif +#endif /* __GL2PS_H__ */ -- GitLab