GL2PS: an OpenGL to PostScript printing library

Christophe Geuzaine

PS  EPS  PDF  SVG

Example: PS, EPS, PDF and SVG files created with the gl2psTest.c demo provided in the distribution. This illustrates the handling of smooth shading, intersecting primitives, line stippling, vector text rendering, multiple viewports and mixed vector/bitmap output. Compare with a PNG screenshot of the OpenGL window.

Download

The latest stable version of GL2PS is gl2ps-1.4.2.tgz. Older versions and source snapshots are available here.

To access the Git repository use: 'git clone https://gitlab.onelab.info/gl2ps/gl2ps.git'. Please report all issues on https://gitlab.onelab.info/gl2ps/gl2ps/issues.

To help fund GL2PS development, you can make a donation.

Documentation

Contents

1  Introduction
2  Usage
    2.1  gl2psBeginPage and gl2psEndPage
        2.1.1  Specification
        2.1.2  Description and arguments
        2.1.3  Return value
    2.2  gl2psSorting
        2.2.1  Specification
        2.2.2  Description and arguments
        2.2.3  Return value
    2.3  gl2psText and gl2psTextOpt
        2.3.1  Specification
        2.3.2  Description and arguments
        2.3.3  Return value
    2.4  gl2psDrawPixels
        2.4.1  Specification
        2.4.2  Description and arguments
        2.4.3  Return value
    2.5  gl2psSpecial
        2.5.1  Specification
        2.5.2  Description and arguments
        2.5.3  Return value
    2.6  gl2psEnable and gl2psDisable
        2.6.1  Specification
        2.6.2  Description and arguments
        2.6.3  Return value
    2.7  gl2psPointSize, gl2psLineWidth, gl2psLineCap and gl2psLineJoin
        2.7.1  Specification
        2.7.2  Description and arguments
        2.7.3  Return value
    2.8  gl2psBlendFunc
        2.8.1  Specification
        2.8.2  Description and arguments
        2.8.3  Return value
    2.9  gl2psBeginViewport and gl2psEndViewport
        2.9.1  Specification
        2.9.2  Description and arguments
        2.9.3  Return value
    2.10  gl2psSetOptions and gl2psGetOptions
        2.10.1  Specification
        2.10.2  Description and arguments
        2.10.3  Return value
3  Example
4  Tips and tricks
5  Limitations
6  Contributors
7  Links
8  Versions

1  Introduction

GL2PS is a C library providing high quality vector output for any OpenGL application. The main difference between GL2PS and other similar libraries (see section 7) is the use of sorting algorithms capable of handling intersecting and stretched polygons, as well as non manifold objects. GL2PS provides advanced smooth shading and text rendering, culling of invisible primitives, mixed vector/bitmap output, and much more...
GL2PS can currently create PostScript (PS), Encapsulated PostScript (EPS), Portable Document Format (PDF) and Scalable Vector Graphics (SVG) files, as well as LATEX files for the text fragments. GL2PS also provides limited, experimental support for Portable LaTeX Graphics (PGF). Adding new vector output formats should be relatively easy; you can also use the excellent pstoedit program to transform the PostScript files generated by GL2PS into many other vector formats such as xfig, cgm, wmf, etc.
GL2PS is available at http://www.geuz.org/gl2ps/ and is released under the GNU Library General Public License (see COPYING.LGPL). GL2PS can also be used under an alternative license that allows (amongst other things, and under certain conditions) for static linking with closed-source software (see COPYING.GL2PS). Issues can be reported through https://gitlab.onelab.info/gl2ps/gl2ps/issues.

2  Usage

2.1  gl2psBeginPage and gl2psEndPage

2.1.1  Specification

GLint gl2psBeginPage( const char *title, const char *producer,
                      GLint viewport[4],
                      GLint format, GLint sort, GLint options,
                      GLint colormode, GLint colorsize,
                      GL2PSrgba *colortable,
                      GLint nr, GLint ng, GLint nb,
                      GLint buffersize, FILE *stream,
                      const char *filename )

GLint gl2psEndPage( void )

2.1.2  Description and arguments

gl2psBeginPage and gl2psEndPage delimit the OpenGL commands that will be caught in the feedback buffer (see section 5) and output to stream. The arguments given to gl2psBeginPage determine the way primitives are handled:
title
Specifies the plot title. For PostScript output, this string is placed in the %%Title field.
producer
Specifies the plot producer. For PostScript output, this string is placed in the %%For field.
viewport
Specifies the plot viewport. The viewport can for example be obtained with a call to glGetIntegerv(GL_VIEWPORT, viewport). This argument is ignored if the GL2PS_USE_CURRENT_VIEWPORT option is set.
format
Specifies the output format, chosen among:
GL2PS_PS
The output stream will be in PostScript format.
GL2PS_EPS
The output stream will be in Encapsulated PostScript format.
GL2PS_PDF
The output stream will be in Portable Document Format.
GL2PS_TEX
The output will be a LATEX file containing only the text strings of the plot (cf. section 2.3), as well as an \includegraphics command including a graphic file having the same basename as filename.1
GL2PS_SVG
The output stream will be in Scalable Vector Graphics format.
GL2PS_PGF
(Experimental) The output stream will be in Portable LaTeX Graphics format.
sort
Specifies the sorting algorithm, chosen among:
GL2PS_NO_SORT
The primitives are not sorted, and are output in stream in the order they appear in the feedback buffer. This is sufficient for two-dimensional scenes.
GL2PS_SIMPLE_SORT
The primitives are sorted according to their barycenter. This can be sufficient for simple three-dimensional scenes and/or when correctness is not crucial.
GL2PS_BSP_SORT
The primitives are inserted in a Binary Space Partition (BSP) tree. The tree is then traversed back to front in a painter-like algorithm. This should be used whenever an accurate rendering of a three-dimensional scene is sought. Beware that this algorithm requires a lot more computational time (and memory) than the simple barycentric sort.
options
Sets global plot options, chosen among (multiple options can be combined with the bitwise inclusive OR symbol - ):
GL2PS_NONE
No option.
GL2PS_DRAW_BACKGROUND
The background frame is drawn in the plot.
GL2PS_SIMPLE_LINE_OFFSET
A small offset is added in the z-buffer to all the lines in the plot. This is a simplified version of the GL2PS_POLYGON_OFFSET_FILL functionality (cf. section 2.6), putting all the lines of the rendered image slightly in front of their actual position. This thus performs a simple anti-aliasing solution, e.g. for finite-element-like meshes.
GL2PS_SILENT
All the messages written by GL2PS on the error stream are suppressed.
GL2PS_BEST_ROOT
The construction of the BSP tree is optimized by choosing the root primitives leading to the minimum number of splits.
GL2PS_NO_TEXT
All the text strings are suppressed from the output stream. This is useful to produce the image part of a LATEX plot.
GL2PS_NO_PIXMAP
All the pixmaps are suppressed from the output stream.
GL2PS_LANDSCAPE
The plot is output in landscape orientation instead of portrait.
GL2PS_NO_PS3_SHADING
(for PostScript output only) No use is made of the shfill PostScript level 3 operator. Using shfill enhances the plotting of smooth shaded primitives but can lead to problems when converting PostScript files into PDF files. See also options nr, ng, nb below.
GL2PS_NO_BLENDING
Blending (transparency) is disabled alltogether (regardless of the current GL_BLEND or GL2PS_BLEND status).
GL2PS_OCCLUSION_CULL
All the hidden polygons are removed from the output, thus substantially reducing the size of the output file.
GL2PS_USE_CURRENT_VIEWPORT
The current OpenGL viewport is used instead of viewport.
GL2PS_TIGHT_BOUNDING_BOX
The viewport is ignored and the the plot is generated with a tight bounding box, i.e., a bounding box enclosing as tightly as possible all the OpenGL entities in the scene.
GL2PS_COMPRESS
The output stream is compressed. For this option to take effect you need to compile GL2PS with HAVE_ZLIB, HAVE_LIBZ or GL2PS_HAVE_ZLIB defined, and link the executable with the zlib library (http://www.gzip.org/zlib/).
PostScript or SVG files generated with this option turned on are simply compressed "as a whole", i.e., they are identical to regular PostScript or SVG files compressed with the gzip program. For PDF files the compression is done "locally" for each group of primitives, in accordance with the official PDF specification.
GL2PS_NO_OPENGL_CONTEXT
GL2PS will not query an OpenGL context for information, nor will it create/parse a feedback buffer. This is required for newer OpenGL versions that have deprecated the feedback render mode. Using GL2PS in this mode requires all geometry to be added manually using gl2psAddPolyPrimitive (see https://open.gl/feedback for a replacement to the deprecated OpenGL feedback buffers). gl2psText, gl2psTextOpt, gl2psDrawPixels, and gl2psSpecial are still usable, but require the use of gl2psForceRasterPos to set the raster position.
This option is incompatible with GL2PS_DRAW_BACKGROUND and GL2PS_USE_CURRENT_VIEWPORT, and requires GL2PS_NO_BLENDING to be set. The gl2psBeginPage colormode must be set to GL_RGBA if this option is enabled. If these restrictions are not met, a runtime error will be reported and gl2psBeginPage / gl2psSetOptions will return GL2PS_ERROR.
GL2PS_NO_TEX_FONTSIZE
No fontsize specification is added in the LATEX output.
colormode
Specifies the color mode: GL_RGBA or GL_COLOR_INDEX.
colorsize
Specifies the size of the colormap if colormode is GL_COLOR_INDEX.
colortable
Contains the colormap if colormode is GL_COLOR_INDEX. This colormap must contain colorsize elements of type GL2PSrgba.
nr, ng, nb
(for PostScript and SVG output only) Controls the number of flat-shaded (sub-)triangles used to approximate a smooth-shaded triangle. (For PostScript output, this is only used when the shfill operator is not supported by the system or when the GL2PS_NO_PS3_SHADING option is set.) The arguments nr, ng and nb specify the number of values used for interpolating the full range of red, green and blue color components; that is, a triangle is recursively subdivided until the color difference between two of its vertices is smaller that 1/nr for the red component, 1/ng for the green component and 1/nb for the blue component. If the arguments are set to zero, default values are used.
buffersize
Specifies the size of the feedback buffer.
stream
Specifies the stream to which data is printed.
filename
(for LATEX output only) Specifies a name for the stream to which data is printed.

2.1.3  Return value

gl2psBeginPage returns:
GL2PS_ERROR
if an error occurred;
GL2PS_SUCCESS
otherwise.
gl2psEndPage returns:
GL2PS_NO_FEEDBACK
if the feedback buffer is empty;
GL2PS_OVERFLOW
if the size of the feedback buffer given to gl2psBeginPage is not large enough;
GL2PS_UNINITIALIZED
if gl2psEndPage is called when the library is not initialized (e.g. if gl2psEndPage is called before gl2psBeginPage);
GL2PS_ERROR
if an error occurred;
GL2PS_SUCCESS
otherwise.

2.2  gl2psSorting

2.2.1  Specification

GLint gl2psSorting( GLint value )

2.2.2  Description and arguments

gl2psSorting specify the sorting algorithm for subsequent viewport(s). This function is useful in order to set different sorting algorithms from one viewport to another.

2.2.3  Return value

gl2psSorting returns:
GL2PS_UNINITIALIZED
if the library is not initialized;
GL2PS_ERROR
if an error occurred;
GL2PS_SUCCESS
otherwise.

2.3  gl2psText and gl2psTextOpt

2.3.1  Specification

GLint gl2psText( const char *string, const char *fontname,
                 GLint fontsize )
GLint gl2psTextOpt( const char *string, const char *fontname,
                    GLint fontsize, GLint align, GLfloat angle )

2.3.2  Description and arguments

gl2psText and gl2psTextOpt permit to include a text string in the output stream. The string is inserted at the current raster position (set by one of the glRasterPos OpenGL commands). Beware that text will be sorted according to the current raster position only. The arguments are:
string
Specifies the text string to print.
fontname
Specifies the PostScript name of a valid Type 1 font2. This has no effect for LATEX and PGF output.
fontsize
Specifies the size of the font.
The additional arguments for gl2psTextOpt are:
align
(for PostScript, LATEX and PGF output only) Specifies the text string alignment with respect to the current raster position. Valid choices are GL2PS_TEXT_C (center-center), GL2PS_TEXT_CL (center-left), GL2PS_TEXT_CR (center-right), GL2PS_TEXT_B (bottom-center), GL2PS_TEXT_BL (bottom-left) GL2PS_TEXT_BR (bottom-right), GL2PS_TEXT_T (top-center), GL2PS_TEXT_TL (top-left) and GL2PS_TEXT_TR (top-right). The default alignment used by gl2psText is GL2PS_TEXT_BL.
+---+ +---+ +---+ +---+ +---+ +---+ +-o-+ o---+ +---o
| o | o   | |   o |   | |   | |   | |   | |   | |   |
+---+ +---+ +---+ +-o-+ o---+ +---o +---+ +---+ +---+
 C     CL    CR    B     BL    BR    T     TL    TR

angle
(for PostScript, LATEX and PGF output only) Specifies a rotation angle for the text string (counter-clockwise, in degrees).

2.3.3  Return value

gl2psText and gl2psTextOpt return:
GL2PS_UNINITIALIZED
if string is NULL or if the library is not initialized;
GL2PS_ERROR
if an error occurred;
GL2PS_SUCCESS
otherwise.
Note that gl2ps 1.3.8 introduces a variant of gl2psTextOpt, called gl2psTextOptColor, which takes one additional arguement of type GL2PSrgba. This was introduced for systems which do not keep track of the current raster color in feedback mode.

2.4  gl2psDrawPixels

2.4.1  Specification

GLint gl2psDrawPixels( GLsizei width, GLsizei height,
                       GLint xorig, GLint yorig,
                       GLenum format, GLenum type,
                       const void *pixels )

2.4.2  Description and arguments

gl2psDrawPixels emulates the glDrawPixels function, i.e., permits to embed bitmap images in the PostScript, PDF or SVG output. To embed bitmaps in SVG output, GL2PS needs to be compiled with HAVE_LIBPNG or GL2PS_HAVE_LIBPNG defined, and the executable must be linked with the PNG library (http://www.libpng.org).
The bitmap image is inserted at the current raster position (set by one of the glRasterPos OpenGL commands). Beware that the image will be sorted according to the position of the current raster position only. The arguments are:
width
Specifies the width of the image.
height
Specifies the height of the image.
xorig, yorig
Specify the location of the origin in the image. The origin is measured from the lower left corner of the image, with right and up being the positive axes.
format
Specifies the format of the pixel data. GL_RGB and GL_RGBA are the only values accepted at the moment.
type
Specifies the data type for pixels. GL_FLOAT is the only value accepted at the moment.
pixels
Specifies a pointer to the pixel data.

2.4.3  Return value

gl2psDrawPixels returns:
GL2PS_UNINITIALIZED
if pixels is NULL or if the library is not initialized;
GL2PS_ERROR
if an error occurred;
GL2PS_SUCCESS
otherwise.

2.5  gl2psSpecial

2.5.1  Specification

GLint gl2psSpecial( GLint format, const char *str )

2.5.2  Description and arguments

gl2psSpecial permits to output an arbitrary command string in an output stream of a given format. The arguments are:
format
Specifies the output format for which the special string will be printed. If the stream format (specified with gl2psBeginPage, see Section 2.1) does not match format, the command has no effect.
str
Specifies the string to print.

2.5.3  Return value

gl2psSpecial returns:
GL2PS_UNINITIALIZED
if str is NULL or if the library is not initialized;
GL2PS_ERROR
if an error occurred;
GL2PS_SUCCESS
otherwise.

2.6  gl2psEnable and gl2psDisable

2.6.1  Specification

GLint gl2psEnable( GLint mode )

GLint gl2psDisable( GLint mode )

2.6.2  Description and arguments

gl2psEnable and gl2psDisable delimit OpenGL commands to which a local mode is applied. These modes are:
GL2PS_LINE_STIPPLE
Emulates the GL_LINE_STIPPLE functionality. The stippling pattern and repetition factor are taken as the current values of the corresponding OpenGL stippling options (set with glLineStipple). You thus need to call gl2psEnable(GL2PS_LINE_STIPPLE) after calling glLineStipple(factor, pattern).
GL2PS_POLYGON_OFFSET_FILL
Emulates the GL_POLYGON_OFFSET_FILL functionality. The value of the offset is taken as the current value of the corresponding OpenGL offset (set with glPolygonOffset).
GL2PS_BLEND
Emulates the GL_BLEND functionality. (Warning: this might change in future releases.)
GL2PS_POLYGON_BOUNDARY
Not implemented yet.

2.6.3  Return value

gl2psEnable and gl2psDisable return:
GL2PS_UNINITIALIZED
if the library is not initialized;
GL2PS_ERROR
if an error occurred;
GL2PS_SUCCESS
otherwise.

2.7  gl2psPointSize, gl2psLineWidth, gl2psLineCap and gl2psLineJoin

2.7.1  Specification

GLint gl2psPointSize( GLfloat value )

GLint gl2psLineWidth( GLfloat value )

GLint gl2psLineCap( GLint value )

GLint gl2psLineJoin( GLint value )

2.7.2  Description and arguments

gl2psPointSize and gl2psLineWidth emulate the standard glPointSize and the glLineWidth functions. They are necessary since the point sizes and line widths are not saved in the OpenGL feedback buffer.
gl2psLineCap and gl2psLineJoin let you choose respectively the shape of the lines ending and intersections (for line strips). As those features are not part of OpenGL line options, the output will look different from the corresponding OpenGL scene.
For gl2psLineCap allowed values are GL2PS_LINE_CAP_BUTT (the default), GL2PS_LINE_CAP_ROUND and GL2PS_LINE_CAP_SQUARE. For gl2psLineJoin allowed values are GL2PS_LINE_JOIN_MITER (the default), GL2PS_LINE_JOIN_ROUND and GL2PS_LINE_JOIN_BEVEL.

2.7.3  Return value

gl2psPointSize, gl2psLineWidth, gl2psLineCap and gl2psLineJoin return:
GL2PS_UNINITIALIZED
if the library is not initialized;
GL2PS_ERROR
if an error occurred;
GL2PS_SUCCESS
otherwise.

2.8  gl2psBlendFunc

2.8.1  Specification

GLint gl2psBlendFunc( GLenum sfactor, GLenum dfactor )

2.8.2  Description and arguments

gl2psBlendFunc emulates the glBlendFunc function.

2.8.3  Return value

gl2psBlendFunc returns:
GL2PS_UNINITIALIZED
if the library is not initialized;
GL2PS_WARNING
if the blending mode is not (yet) supported;
GL2PS_SUCCESS
otherwise.

2.9  gl2psBeginViewport and gl2psEndViewport

2.9.1  Specification

GLint gl2psBeginViewport ( GLint viewport[4] )

GLint gl2psEndViewport ( void )

2.9.2  Description and arguments

gl2psBeginViewport and gl2psEndViewport permit to output different viewports3 in the output stream. Each viewport is sorted separately and has its own background frame. The argument given to gl2psBeginViewport specifies the viewport (obtained for example with a call to glGetIntegerv(GL_VIEWPORT, viewport)).

2.9.3  Return value

gl2psBeginViewport returns:
GL2PS_UNINITIALIZED
if the library is not initialized;
GL2PS_ERROR
if an error occurred;
GL2PS_SUCCESS
otherwise.
gl2psEndViewport returns:
GL2PS_NO_FEEDBACK
if the feedback buffer is empty;
GL2PS_OVERFLOW
if the size of the feedback buffer given to gl2psBeginPage is not large enough;
GL2PS_UNINITIALIZED
if gl2psEndViewport is called when the library is not initialized;
GL2PS_ERROR
if an error occurred;
GL2PS_SUCCESS
otherwise.

2.10  gl2psSetOptions and gl2psGetOptions

2.10.1  Specification

GLint gl2psSetOptions ( GLint options )
GLint gl2psGetOptions ( GLint *options )

2.10.2  Description and arguments

gl2psSetOptions permits to change the global options initially set using the options argument to gl2psBeginPage (see section 2.1). gl2psGetOptions permits to retrieve the current options.
gl2psSetOptions can for example be used to force GL2PS to print the background for selected viewports, by setting/unsetting GL2PS_DRAW_BACKGROUND before calling gl2psBeginViewport.

2.10.3  Return value

gl2psSetOptions and gl2psGetOptions return:
GL2PS_UNINITIALIZED
if the library is not initialized;
GL2PS_ERROR
if an error occurs;
GL2PS_SUCCESS
otherwise.

3  Example

Here is a typical calling sequence to produce BSP sorted PostScript output in the file "MyFile", with all the lines slightly shifted front in the z-buffer and all invisible primitives removed to reduce the size of the output file. The draw() function contains all the OpenGL commands.
FILE *fp = fopen("MyFile", "wb");
GLint buffsize = 0, state = GL2PS_OVERFLOW;
GLint viewport[4];

glGetIntegerv(GL_VIEWPORT, viewport);

while( state == GL2PS_OVERFLOW ){
  buffsize += 1024*1024;
  gl2psBeginPage ( "MyTitle", "MySoftware", viewport,
                   GL2PS_EPS, GL2PS_BSP_SORT, GL2PS_SILENT |
                   GL2PS_SIMPLE_LINE_OFFSET | GL2PS_NO_BLENDING |
                   GL2PS_OCCLUSION_CULL | GL2PS_BEST_ROOT,
                   GL_RGBA, 0, NULL, 0, 0, 0, buffsize,
                   fp, "MyFile" );
  draw();
  state = gl2psEndPage();
}

fclose(fp);

To output the text "MyText" at the current raster position, the draw() function should contain something like:
gl2psText("MyText", "Courier", 12);

Complete example programs (gl2psTestSimple.c and gl2psTest.c) are included in the distribution.

4  Tips and tricks

Here are, in no particular order, some useful tips and solutions to common problems:

5  Limitations

GL2PS works by capturing the contents of the OpenGL feedback buffer4. As such, all the OpenGL operations applied in the pipeline after the creation of the feedback buffer will be ignored or have to be duplicated by GL2PS (e.g. font/image rendering, polygon offset or line stippling-see sections 2.3, 2.4, 2.6 and 2.7).
Other limitations include:

6  Contributors

Michael Sweet for the original implementation of the feedback buffer parser; Bruce Naylor for BSP tree and occlusion culling hints; Marc Umé for the original list code; Jean-François Remacle for plane equation fixes; Bart Kaptein for memory leak fixes; Quy Nguyen-Dai for output file size optimization; Sam Buss for the shfill-based smooth shaded triangle code; Shane Hill for the landscape option implementation; Romain Boman for the Windows dll generation; Diego Santa Cruz for the new optimized shaded triangle code and the shfill management; Shahzad Muzaffar and Lassi Tuura for the new occlusion culling code, the improvement of GL2PS_BEST_ROOT and the imagemap support; Guy Barrand for his work on gl2psDrawPixels and the new viewport management; Rouben Rostamian and Prabhu Ramachandran for various bug reports and fixes; Micha Bieber for the PDF code; Olivier Couet for the initial SVG code; Fabian Wenzel for the PGF code and the backend reorganization; Shai Ayal for rotated text support in PostScript; Ian D. Gay for 64 bit arch patch; Cosmin Truta and Baiju Devani for various bug fixes and the new gl2psSpecial code; Alexander Danilov for a polygon offset bug fix; Ben Fletcher for a stippling pattern parser bug report; Jason Anderssen for memory leak fix in pdf code; Sylvestre Ledru for SVG patches; Calixte Denizet for 64 bit patch; Ion Vasilief and Paul Griffiths for rotated text in PDF output; Ben Abbott for text alignment in SVG; David Lonie for VTK patches; Pantxo Diribarne for polygon offset improvement, image scaling fix for SVG and PDF output, PostScript viewport color bug fix, gl2psLineCap, gl2psLineJoin and gl2psSorting; David Lonie for direct addition of promitives (for newer OpenGL APIs without feedback buffer); Dan Lipsa for bug fixes in PDF output.

7  Links

GL2PS was inspired by Mark Kilgard's original "rendereps" tutorial (http://www.opengl.org/resources/code/samples/mjktips/Feedback.html) and Michael Sweet's GLP library (http://www.easysw.com/~mike/opengl/). The (commercial) GLpr library from CEI (http://www.ceintl.com/) used to provide functionality similar to GL2PS but does not seem to be available anymore.

8  Versions

0.1
(Feb 12, 2000) First distributed version.
0.2
(Feb 20, 2000) Added GL2PS_POLYGON_BOUNDARY and GL2PS_BEST_ROOT. API change: changed arguments of gl2psBeginPage and gl2psText. Corrected some memory allocation stuff. First version of this user's guide.
0.21
(Mar 16, 2000) Initialization fixes.
0.3
(Jul 29, 2000) Code cleanup. Added GL2PS_LINE_STIPPLE.
0.31
(Aug 14, 2000) Better handling of erroneous primitives.
0.32
(May 23, 2001) Fixed memory leaks.
0.4
(Jun 12, 2001) Added gl2psPointSize and gl2psLineWidth. Some code cleanup to allow easier generation of vector file formats other than postscript.
0.41
(Aug 6, 2001) Fixed string allocation (1 char too short). Set smaller default line width.
0.42
(Oct 8, 2001) Optimization of output file size. PostScript header cleanup. Better line width computation.
0.5
(Nov 19, 2001) API change: new format and filename arguments for gl2psBeginPage. Better PostScript handling of smooth shaded primitives. Fix handling of zero-length strings. New options for LATEX output. Changed (again) the line width computation.
0.51
(Jan 22, 2002) Fixed erroneous drawing of text primitives lying outside the viewport.
0.52
(Feb 14, 2002) New GL2PS_LANDSCAPE option.
0.53
(Mar 11, 2002) New GL2PSDLL compilation flag to allow the generation of a Windows dll.
0.6
(Jun 4, 2002) Fixed some incoherences in string allocation; fixed sorting of text objects; removed (non functional) occlusion culling code; fixed handling of color and line width attributes when gl2ps was called multiple times inside the same program.
0.61
(Jun 21, 2002) Fixed the fix for the sorting of text objects; introduced tolerance for floating point comparisons.
0.62
(Sep 6, 2002) New GL2PS_EPS option to produce Encapsulated PostScript files; optimized drawing of shaded primitives; new GL2PS_NO_PS3_SHADING option and gl2psNumShadeColors function to control the use of the PostScript level 3 shfill operator (usually not well handled when converting to PDF).
0.63
(Nov 12, 2002) Changed GLvoid to void to accommodate some SUN compilers; made subdivision parameters modifiable a posteriori in the output file; revised documentation.
0.7
(Dec 11, 2002) Occlusion culling (GL2PS_OCCLUSION_CULL) is (finally!) working thanks to the great work of Shahzad Muzaffar; enhanced GL2PS_BEST_ROOT.
0.71
(Dec 13, 2002) Removed C++ style comments inadvertently left in the code; added example program gl2psTest.c to the distribution.
0.72
(Jan 21, 2003) Fixed crash in occlusion culling code; enhanced documentation.
0.73
(Jan 30, 2003) Minor code cleanup.
0.8
(Mar 10, 2003) API change: gl2psNumShadeColors has been removed and the color subdivision parameters nr, ng and nb are now given as arguments to gl2psBeginPage; API change: gl2psBeginPage takes an additional argument (viewport) to specify the print viewport; new gl2psDrawPixels interface to produce mixed mode (vector+raster) PostScript output; new gl2psBeginViewport and gl2psEndViewport interface to handle multiple OpenGL viewports; fixed small bug in occlusion culling code; better error handling.
0.81
(Mar 22, 2003) Fixed small typos in comments and documentation.
0.9.0
(Jun 2, 2003) Fixed smooth shading detection for mixed smooth/flat shaded scenes; new library numbering scheme ("major.minor.patch").
0.9.1
(Jun 12, 2003) Fixed two GL2PS_TEX output bugs (glRenderMode not reset to GL_RENDER + crash when printing empty scenes); changed default pixmap depth to 8 bits per color component; changed default line cap to "Butt cap" and default line join to "Miter join".
0.9.2
(Jul 4, 2003) Improved occlusion culling; new GL2PS_USE_CURRENT_VIEWPORT option.
1.0.0
(Sep 24, 2003) Native PDF support contributed by Micha Bieber.
1.1.0
(Nov 4, 2003) New GL2PS_COMPRESS option to create compressed PostScript and PDF files; fixed small bug in the PDF output that prevented the PDF files to be correctly included in LATEX documents; new alternative license (see COPYING.GL2PS).
1.1.1
(Nov 9, 2003) Small memory optimization; documentation update (binary files, fonts).
1.1.2
(Nov 16, 2003) Fixed various compiler warnings (mostly for Windows Visual C++).
1.2.0
(May 13, 2004) New (experimental...) transparency support for PDF output; fixed bug for empty feedback buffer but non-empty primitive list; fixed more compiler warnings and cleaned up the code (mostly to reduce the global namespace pollution).
1.2.1
(Jul 13, 2004) New imagemap support for PostScript output; new text alignment support for PostScript and LATEX output; new support for rotated text for LATEX output; fixed NULL check on input strings in gl2psBeginPage.
1.2.2
(Sep 21, 2004) Fixed a couple of small bugs in the example code.
1.2.3
(Dec 23, 2004) Fixed small bugs in (unused) PostScript pixmap code; better scaling of the z-buffer (improves GL2PS_SIMPLE_LINE_OFFSET and occlusion culling); added support for general stippling patterns.
1.2.4
(Apr 27, 2005) Fixed feedback buffer test for GL2PS_TEX output; fixed missing brace in LATEX output for text aligned using GL2PS_TEXT_C; fixed clipping in multi-viewport PostScript output when GL2PS_DRAW_BACKGROUND is not set; new gl2psSetOptions interface to change the current options on the fly.
1.2.5
(Jun 18, 2005) Fixed a couple of uninitialized variables in PDF code; new GL2PS_TIGHT_BOUNDING_BOX option; added rotated text support for PostScript output.
1.2.6
(Jun 22, 2005) Fixed crash when creating PDF file with overflowing feedback buffer (bug introduced in 1.2.5); added additional example program gl2psTestSimple.c to the distribution.
1.2.7
(Feb 15, 2006) Fixed bug that could cause sorting to be inverted in BSP mode (bug introduced in 1.2.3); added limited support for SVG and PGF formats; made backend code more generic.
1.3.0
(Aug 8, 2006) Full SVG support; improved line stippling (whenever possible lines are now rendered in a single path); better sorting of text and bitmap elements; new function gl2psSpecial to print device-specific strings in the output stream.
1.3.1
(Aug 11, 2006) Fixed a small bug for multi-viewport PostScript output, where a viewport could be drawn with an unwanted colored outline.
1.3.2
(Nov 5, 2006) Fixed bug in polygon offset computation; fixed landscape mode in SVG; fixed potential out-of-bounds array access in stippling pattern parser.
1.3.3
(Feb 28, 2009) Fixed memory leak in PDF code; added gl2psGetOptions; nicer SVG rendering (crispEdges, font attributes); fixed possible divisions by zero.
1.3.4
(Sep 30, 2009) Added support for rotated text in SVG output; fixed MSVC warnings.
1.3.5
(Oct 16, 2009) Added support for rotated text in PDF output; fixed PDF image output when compiled in 64 bit mode; added cmake configuration.
1.3.6
(Aug 14, 2011) Added support for PixelZoom (set using glPixelZoom) in postscript images; fixed text rotation in TeX; added support for text alignment in SVG; fixed other minor bugs.
1.3.7
(Sep 2, 2012) Minor documentation and build system fixes.
1.3.8
(Nov 27, 2012) Handling of arbitrary length messages in gl2psPrintf; added gl2psTextOptColor; minor fixes.
1.3.9
(Oct 17, 2015) Improved GL_POLYGON_OFFSET_FILL; fixed scaling of images in SVG output.
1.4.0
(Apr 4, 2017) Make it possible to add primitives directly, without parsing the OpenGL feedback buffer, using gl2psAddPolyPrimitive; gl2psBeginPage now accepts a buffersize of 0; new gl2psForceRasterPos, gl2psLineCap and gl2psLineJoin; fixed scaling of images in PDF output; fixed bug leading to corrupted PDF output.
1.4.1
(Apr 1, 2020) Added gl2psSorting to change the sorting algorithm on the fly; fix rotated text in PGF output; use pt instead of px in SVG viewport; new GL2PS_NO_TEX_FONTSIZE option and gl2psSetTexScaling function to control LATEX scaling.
1.4.2
(Apr 7, 2020) Revert dynamic library naming change inadvertently introduced in 1.4.1.

Footnotes:

1The two steps to generate a LATEX  plot with GL2PS are thus:
  1. generate the PostScript or PDF file (e.g. file.ps or file.pdf) with no text strings, using the GL2PS_PS, GL2PS_EPS or GL2PS_PDF format combined with the GL2PS_NO_TEXT option;
  2. generate the LATEX file file.tex, using the GL2PS_TEX format and specifying file.tex as the filename argument to gl2psBeginPage.
You can of course combine the LATEX output with other graphic formats than PostScript or PDF. For example, you could export an image in JPEG or PNG format and use pdfLATEX with the same file.tex.
2The names of the 14 standard Type 1 fonts are as follows: Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique, Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, Symbol and ZapfDingbats. These fonts, or their font metrics and suitable substitution fonts, are guaranteed to be available to the viewer application. Using any other font will result in a non-portable PostScript or PDF file, as GL2PS does not include any font description in its output stream.
3See the description of glViewport and glScissor in the OpenGL documentation.
4See the description of glFeedbackBuffer and glRenderMode(GL_FEEDBACK) in the OpenGL documentation.


File translated from TEX by TTH, version 4.03.
On 30 Apr 2020, 09:57.