Skip to content
Snippets Groups Projects
Select Git revision
  • 20a9d05a1c1245319a9414e6f182166b19e1265a
  • master default
  • cgnsUnstructured
  • partitioning
  • poppler
  • HighOrderBLCurving
  • gmsh_3_0_4
  • gmsh_3_0_3
  • gmsh_3_0_2
  • gmsh_3_0_1
  • gmsh_3_0_0
  • gmsh_2_16_0
  • gmsh_2_15_0
  • gmsh_2_14_1
  • gmsh_2_14_0
  • gmsh_2_13_2
  • gmsh_2_13_1
  • gmsh_2_12_0
  • gmsh_2_11_0
  • gmsh_2_10_1
  • gmsh_2_10_0
  • gmsh_2_9_3
  • gmsh_2_9_2
  • gmsh_2_9_1
  • gmsh_2_9_0
  • gmsh_2_8_6
26 results

VERSIONS

Blame
  • Forked from gmsh / gmsh
    Source project has a limited visibility.
    gl2ps.tex 40.07 KiB
    %  $Id: gl2ps.tex,v 1.217 2006-08-11 16:17:09 geuzaine Exp $
    %
    %  GL2PS, an OpenGL to PostScript Printing Library
    %  Copyright (C) 1999-2006 Christophe Geuzaine <geuz@geuz.org>
    % 
    %  This program is free software; you can redistribute it and/or
    %  modify it under the terms of either:
    % 
    %  a) the GNU Library General Public License as published by the Free
    %  Software Foundation, either version 2 of the License, or (at your
    %  option) any later version; or
    % 
    %  b) the GL2PS License as published by Christophe Geuzaine, either
    %  version 2 of the License, or (at your option) any later version.
    % 
    %  This program is distributed in the hope that it will be useful, but
    %  WITHOUT ANY WARRANTY; without even the implied warranty of
    %  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See either
    %  the GNU Library General Public License or the GL2PS License for
    %  more details.
    % 
    %  You should have received a copy of the GNU Library General Public
    %  License along with this library in the file named "COPYING.LGPL";
    %  if not, write to the Free Software Foundation, Inc., 675 Mass Ave,
    %  Cambridge, MA 02139, USA.
    % 
    %  You should have received a copy of the GL2PS License with this
    %  library in the file named "COPYING.GL2PS"; if not, I will be glad
    %  to provide one.
    % 
    %  For the latest info about gl2ps, see http://www.geuz.org/gl2ps/.
    %  Please report all bugs and problems to <gl2ps@geuz.org>.
    
    \documentclass[10pt]{article}
    
    \pagestyle{headings}
    \setcounter{tocdepth}{2}
    \sloppypar
    
    \usepackage[colorlinks=true,urlcolor=blue]{hyperref}
    \usepackage{graphicx}
    
    \ifx\pdfoutput\undefined\else
      \pdfinfo{
        /Title (GL2PS: an OpenGL to PostScript printing library)
        /Author (Christophe Geuzaine)
        /Subject (Documentation)
        /Keywords (OpenGL, PostScript, PDF, SVG, Printing)
      } 
    \fi
    
    \newcommand{\dd}{\begingroup\Url}
    \newcommand{\email}[2]{\href{mailto:#2}{#1}}
    \newcommand{\noemail}[2]{#1}
    
    %%tth: \def\dd#1{\textmd{\texttt{#1}}}
    
    \begin{document}
    
    \title{GL2PS: an OpenGL to PostScript printing library}
    \author{Christophe Geuzaine}
    \date{Version 1.3.1, August 11 2006}
    
    \maketitle
    
    \special{html:<center>
    <table width="50%" cellspacing="2" cellpadding="2" border="0">
    <tr>
    <td><a href="http://geuz.org/gl2ps/outBspCulledCompressed.ps.gz"><img
         src="http://geuz.org/gl2ps/outThumbnail.png" alt="PS"></a></td>
    <td><a href="http://geuz.org/gl2ps/outBspCulledCompressed.eps.gz"><img
         src="http://geuz.org/gl2ps/outThumbnail.png" alt="EPS"></a></td>
    <td><a href="http://geuz.org/gl2ps/outBspCulledCompressed.pdf"><img
         src="http://geuz.org/gl2ps/outThumbnail.png" alt="PDF"></a></td>
    <td><a href="http://geuz.org/gl2ps/outBspCulledCompressed.svgz"><img
         src="http://geuz.org/gl2ps/outThumbnail.png" alt="SVG"></a></td>
    </tr>
    <tr>
    <td colspan="4"><small><em>Example: compressed
    <a href="http://geuz.org/gl2ps/outBspCulledCompressed.ps.gz">PS</a>,
    <a href="http://geuz.org/gl2ps/outBspCulledCompressed.eps.gz">EPS</a>,
    <a href="http://geuz.org/gl2ps/outBspCulledCompressed.pdf">PDF</a> and
    <a href="http://geuz.org/gl2ps/outBspCulledCompressed.svgz">SVG</a>
    files created with the <tt>gl2psTest.c</tt> 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 
    <a href="http://geuz.org/gl2ps/outBitmap.png">PNG</a> screenshot of 
    the OpenGL window.</em></small></td>
    </tr>
    </table>
    </center>
    <h2>Download</h2>
    The latest stable version of GL2PS is
    <a href="http://geuz.org/gl2ps/src/gl2ps-1.3.1.tgz">gl2ps-1.3.1.tgz</a>.
    Older versions and nightly CVS snapshots are available 
    <a href="http://geuz.org/gl2ps/src/">here</a>.
    <p>
    For questions and discussions about GL2PS features, resources, bugs, 
    etc., see the <a href="http://geuz.org/mailman/listinfo/gl2ps/">gl2ps</a>
    mailing list. You can also subscribe to the
    <a href="http://geuz.org/mailman/listinfo/gl2ps-announce/">gl2ps-announce</a>
    mailing list to be notified automatically when a new version of GL2PS
    is released.
    <h2>Documentation</h2>}
    
    \tableofcontents
    
    \section{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~\ref{sec:links}) 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 Scalar Vector Graphics (SVG)
    files, as well as \LaTeX\ files for the text fragments. GL2PS also
    provides limited, experiemental support for Portable LaTeX Graphics
    (PGF). Adding new vector output formats should be relatively easy; you
    can also use the excellent \href{http://www.pstoedit.net}{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 \url{http://www.geuz.org/gl2ps/} and is released under
    the GNU Library General Public License (see
    \href{http://www.geuz.org/gl2ps/COPYING.LGPL}{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 \href{http://www.geuz.org/gl2ps/COPYING.GL2PS}{COPYING.GL2PS}). Any
    corrections, questions or suggestions should be e-mailed to the GL2PS
    mailing list \email{gl2ps@geuz.org}{gl2ps@geuz.org}.
    
    The interface consists of fourteen functions, all beginning with the prefix
    \dd{gl2ps}. All the data structures and the symbolic constants peculiar to
    GL2PS begin with \dd{GL2PS}.
    
    \section{Usage}
    
    % -------------------------------------------------------------------------
    
    \subsection{\texttt{gl2psBeginPage} and \texttt{gl2psEndPage}}
    \label{sec:gl2psBeginPage}
    
    \subsubsection{Specification}
    
    \begin{verbatim}
    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 )
    \end{verbatim}
    
    \begin{verbatim}
    GLint gl2psEndPage( void )
    \end{verbatim}
    
    \subsubsection{Description and arguments}
    
    \dd{gl2psBeginPage} and \dd{gl2psEndPage} delimit the OpenGL commands that
    will be caught in the feedback buffer (see section~\ref{sec:limitations})
    and output to \dd{stream}. The arguments given to \dd{gl2psBeginPage}
    determine the way primitives are handled:
    
    \begin{description}
    \item[\dd{title}] Specifies the plot title. For PostScript output, this
      string is placed in the \texttt{\%\%Title} field.
    
    \item[\dd{producer}] Specifies the plot producer. For PostScript output,
      this string is placed in the \texttt{\%\%For} field.
    
    \item[\dd{viewport}] Specifies the plot viewport. The viewport can for
      example be obtained with a call to \dd{glGetIntegerv(GL_VIEWPORT,
      viewport)}. This argument is ignored if the
      \dd{GL2PS_USE_CURRENT_VIEWPORT} option is set.
    
    \item[\dd{format}] Specifies the output format, chosen among:
    
    \begin{description}
    \item[\dd{GL2PS_PS}] The output stream will be in PostScript format. 
    \item[\dd{GL2PS_EPS}] The output stream will be in Encapsulated PostScript
      format.
    \item[\dd{GL2PS_PDF}] The output stream will be in Portable Document Format.
    \item[\dd{GL2PS_TEX}] The output will be a \LaTeX\ file containing only the
      text strings of the plot (cf.\ section~\ref{sec:gl2psText}), as well as an
      \verb+\includegraphics+ command including a graphic file having the same
      basename as \dd{filename}.\footnote{The two steps to generate a \LaTeX\
      plot with GL2PS are thus:
      \begin{enumerate}
      \item generate the PostScript or PDF file (e.g.\ \dd{file.ps} or
        \dd{file.pdf}) with no text strings, using the \dd{GL2PS_PS},
        \dd{GL2PS_EPS} or \dd{GL2PS_PDF} format combined with the
        \dd{GL2PS_NO_TEXT} option;
      \item generate the \LaTeX\ file \dd{file.tex}, using the \dd{GL2PS_TEX}
        format and specifying \dd{file.tex} as the \dd{filename} argument to
        \dd{gl2psBeginPage}.
      \end{enumerate}
      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 pdf\LaTeX\ with the same \dd{file.tex}.}
    \item[\dd{GL2PS_SVG}] The output stream will be in Scalar Vector
      Graphics format.
    \item[\dd{GL2PS_PGF}] (Experimental) The output stream will be in
      Portable LaTeX Graphics format.
    \end{description}
    
    \item[\dd{sort}] Specifies the sorting algorithm, chosen among:
    
    \begin{description}
    \item[\dd{GL2PS_NO_SORT}] The primitives are not sorted, and are output in
      \dd{stream} in the order they appear in the feedback buffer. This is
      sufficient for two-dimensional scenes.
    \item[\dd{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.
    \item[\dd{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.
    \end{description}
    
    \item[\dd{options}] Sets global plot options, chosen among (multiple options
      can be combined with the bitwise inclusive OR symbol \dd{|}):
    
    \begin{description}
    \item[\dd{GL2PS_NONE}] No option.
    \item[\dd{GL2PS_DRAW_BACKGROUND}] The background frame is drawn in the
      plot.
    \item[\dd{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
      \dd{GL2PS_POLYGON_OFFSET_FILL} functionality
      (cf. section~\ref{sec:gl2psEnable}), 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.
    \item[\dd{GL2PS_SILENT}] All the messages written by GL2PS on the error
      stream are suppressed.
    \item[\dd{GL2PS_BEST_ROOT}] The construction of the BSP tree is optimized by
      choosing the root primitives leading to the minimum number of splits.
    \item[\dd{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.
    \item[\dd{GL2PS_NO_PIXMAP}] All the pixmaps are suppressed from the output
      stream.
    \item[\dd{GL2PS_LANDSCAPE}] The plot is output in landscape orientation
      instead of portrait.
    \item[\dd{GL2PS_NO_PS3_SHADING}] (for PostScript output only) No use is made
      of the \dd{shfill} PostScript level 3 operator. Using \dd{shfill} enhances
      the plotting of smooth shaded primitives but can lead to problems when
      converting PostScript files into PDF files. See also options \dd{nr},
      \dd{ng}, \dd{nb} below.
    \item[\dd{GL2PS_NO_BLENDING}] Blending (transparency) is disabled
      alltogether (regardless of the current \dd{GL_BLEND} or \dd{GL2PS_BLEND}
      status).
    \item[\dd{GL2PS_OCCLUSION_CULL}] All the hidden polygons are removed from
      the output, thus substantially reducing the size of the output file.
    \item[\dd{GL2PS_USE_CURRENT_VIEWPORT}] The current OpenGL viewport is used
      instead of \dd{viewport}.
    \item[\dd{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.
    \item[\dd{GL2PS_COMPRESS}] The output stream is compressed. For this option
      to take effect you need to compile GL2PS with \dd{HAVE_ZLIB},
      \dd{HAVE_LIBZ} or \dd{GL2PS_HAVE_ZLIB} defined, and link the executable
      with the zlib library (\url{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.
    \end{description}
    
    \item[\dd{colormode}] Specifies the color mode: \dd{GL_RGBA} or
      \dd{GL_COLOR_INDEX}.
    \item[\dd{colorsize}] Specifies the size of the colormap if \dd{colormode}
      is \dd{GL_COLOR_INDEX}.
    \item[\dd{colortable}] Contains the colormap if \dd{colormode} is
      \dd{GL_COLOR_INDEX}. This colormap must contain \dd{colorsize} elements of
      type \dd{GL2PSrgba}.
    \item[\dd{nr}, \dd{ng}, \dd{nb}] (for PostScript and SVG output only)
      Controls the number of flat-shaded \mbox{(sub-)triangles} used to
      approximate a smooth-shaded triangle. (For PostScript output, this
      is only used when the \dd{shfill} operator is not supported by the
      system or when the \dd{GL2PS_NO_PS3_SHADING} option is set.)  The
      arguments \dd{nr}, \dd{ng} and \dd{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/\mathtt{nr}$ for the red component, $1/\mathtt{ng}$ for the green
      component and $1/\mathtt{nb}$ for the blue component. If the
      arguments are set to zero, default values are used.
    \item[\dd{buffersize}] Specifies the size of the feedback buffer.
    \item[\dd{stream}] Specifies the stream to which data is printed.
    \item[\dd{filename}] (for \LaTeX\ output only) Specifies a name for
      the stream to which data is printed.
    \end{description}
    
    \subsubsection{Return value}
    
    \noindent\dd{gl2psBeginPage} returns:
    \begin{description}
    \item[\dd{GL2PS_ERROR}] if an error occurred;
    \item[\dd{GL2PS_SUCCESS}] otherwise.
    \end{description}
    
    \noindent\dd{gl2psEndPage} returns:
    \begin{description}
    \item[\dd{GL2PS_NO_FEEDBACK}] if the feedback buffer is empty;
    \item[\dd{GL2PS_OVERFLOW}] if the size of the feedback buffer given to
    \dd{gl2psBeginPage} is not large enough;
    \item[\dd{GL2PS_UNINITIALIZED}] if \dd{gl2psEndPage} is called when the
    library is not initialized (e.g.\ if \dd{gl2psEndPage} is called before
    \dd{gl2psBeginPage});
    \item[\dd{GL2PS_ERROR}] if an error occurred;
    \item[\dd{GL2PS_SUCCESS}] otherwise.
    \end{description}
    
    % -------------------------------------------------------------------------
    
    \subsection{\texttt{gl2psText} and \texttt{gl2psTextOpt}}
    \label{sec:gl2psText}
    
    \subsubsection{Specification}
    
    \begin{verbatim}
    GLint gl2psText( const char *string, const char *fontname,
                     GLint fontsize )
    GLint gl2psTextOpt( const char *string, const char *fontname,
                        GLint fontsize, GLint align, GLfloat angle )
    \end{verbatim}
    
    \subsubsection{Description and arguments}
    
    \dd{gl2psText} and \dd{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 \dd{glRasterPos} OpenGL commands). Beware
    that text will be sorted according to the current raster position
    only. The arguments are:
    
    \begin{description}
    \item[\dd{string}] Specifies the text string to print.
    \item[\dd{fontname}] Specifies the PostScript name of a valid Type 1
      font\footnote{The names of the 14 standard Type 1 fonts are as
        follows: \dd{Times-Roman}, \dd{Times-Bold}, \dd{Times-Italic},
        \dd{Times-BoldItalic}, \dd{Helvetica}, \dd{Helvetica-Bold},
        \dd{Helvetica-Oblique}, \dd{Helvetica-BoldOblique}, \dd{Courier},
        \dd{Courier-Bold}, \dd{Courier-Oblique}, \dd{Courier-BoldOblique},
        \dd{Symbol} and \dd{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.}.  This has no
      effect for \LaTeX\ and PGF output.
    \item[\dd{fontsize}] Specifies the size of the font.
    \end{description}
    
    The additional arguments for \dd{gl2psTextOpt} are:
    
    \begin{description}
    \item[\dd{align}] (for PostScript, \LaTeX\ and PGF output only)
      Specifies the text string alignment with respect to the current
      raster position. Valid choices are \dd{GL2PS_TEXT_C}
      (center-center), \dd{GL2PS_TEXT_CL} (center-left),
      \dd{GL2PS_TEXT_CR} (center-right), \dd{GL2PS_TEXT_B}
      (bottom-center), \dd{GL2PS_TEXT_BL} (bottom-left) \dd{GL2PS_TEXT_BR}
      (bottom-right), \dd{GL2PS_TEXT_T} (top-center), \dd{GL2PS_TEXT_TL}
      (top-left) and \dd{GL2PS_TEXT_TR} (top-right). The default alignment
      used by \dd{gl2psText} is \dd{GL2PS_TEXT_BL}.
    
    \begin{verbatim}
    +---+ +---+ +---+ +---+ +---+ +---+ +-o-+ o---+ +---o
    | o | o   | |   o |   | |   | |   | |   | |   | |   |
    +---+ +---+ +---+ +-o-+ o---+ +---o +---+ +---+ +---+
     C     CL    CR    B     BL    BR    T     TL    TR
    \end{verbatim}
    
    \item[\dd{angle}] (for PostScript, \LaTeX\ and PGF output only)
      Specifies a rotation angle for the text string (counter-clockwise,
      in degrees).
    \end{description}
    
    \subsubsection{Return value}
    
    \noindent\dd{gl2psText} and \dd{gl2psTextOpt} return:
    \begin{description}
    \item[\dd{GL2PS_UNINITIALIZED}] if \dd{string} is \dd{NULL} or if the
    library is not initialized;
    \item[\dd{GL2PS_ERROR}] if an error occurred;
    \item[\dd{GL2PS_SUCCESS}] otherwise.
    \end{description}
    
    % -------------------------------------------------------------------------
    
    \subsection{\texttt{gl2psDrawPixels}}
    \label{sec:gl2psDrawPixels}
    
    \subsubsection{Specification}
    
    \begin{verbatim}
    GLint gl2psDrawPixels( GLsizei width, GLsizei height,
                           GLint xorig, GLint yorig,
                           GLenum format, GLenum type,
                           const void *pixels )
    \end{verbatim}
    
    \subsubsection{Description and arguments}
    
    \dd{gl2psDrawPixels} emulates the \dd{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
    \dd{HAVE_LIBPNG} or \dd{GL2PS_HAVE_LIBPNG} defined, and the executable
    must be linked with the PNG library (\url{http://www.libpng.org}).
    
    The bitmap image is inserted at the current raster position (set by
    one of the \dd{glRasterPos} OpenGL commands). Beware that the image
    will be sorted according to the position of the current raster
    position only. The arguments are:
    
    \begin{description}
    \item[\dd{width}] Specifies the width of the image.
    \item[\dd{height}] Specifies the height of the image.
    \item[\dd{xorig}, \dd{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.
    \item[\dd{format}] Specifies the format of the pixel data. \dd{GL_RGB} and
      \dd{GL_RGBA} are the only values accepted at the moment.
    \item[\dd{type}] Specifies the data type for pixels. \dd{GL_FLOAT} is the
      only value accepted at the moment.
    \item[\dd{pixels}] Specifies a pointer to the pixel data.
    \end{description}
    
    \subsubsection{Return value}
    
    \noindent\dd{gl2psDrawPixels} returns:
    \begin{description}
    \item[\dd{GL2PS_UNINITIALIZED}] if \dd{pixels} is \dd{NULL} or if the
      library is not initialized;
    \item[\dd{GL2PS_ERROR}] if an error occurred;
    \item[\dd{GL2PS_SUCCESS}] otherwise.
    \end{description}
    
    % -------------------------------------------------------------------------
    
    \subsection{\texttt{gl2psSpecial}}
    \label{sec:gl2psSpecial}
    
    \subsubsection{Specification}
    
    \begin{verbatim}
    GLint gl2psSpecial( GLint format, const char *str )
    \end{verbatim}
    
    \subsubsection{Description and arguments}
    
    \dd{gl2psSpecial} permits to output an arbitrary command string in an
    output stream of a given format. The arguments are:
    
    \begin{description}
    \item[\dd{format}] Specifies the output format for which the special
      string will be printed. If the stream format (specified with
      \dd{gl2psBeginPage}, see Section~\ref{sec:gl2psBeginPage}) does not
      match \dd{format}, the command has no effect.
    \item[\dd{str}] Specifies the string to print.
    \end{description}
    
    \subsubsection{Return value}
    
    \noindent\dd{gl2psSpecial} returns:
    \begin{description}
    \item[\dd{GL2PS_UNINITIALIZED}] if \dd{str} is \dd{NULL} or if the
      library is not initialized;
    \item[\dd{GL2PS_ERROR}] if an error occurred;
    \item[\dd{GL2PS_SUCCESS}] otherwise.
    \end{description}
    
    % -------------------------------------------------------------------------
    
    \subsection{\texttt{gl2psEnable} and \texttt{gl2psDisable}}
    \label{sec:gl2psEnable}
    
    \subsubsection{Specification}
    
    \begin{verbatim}
    GLint gl2psEnable( GLint mode )
    \end{verbatim}
    
    \begin{verbatim}
    GLint gl2psDisable( GLint mode )
    \end{verbatim}
    
    \subsubsection{Description and arguments}
    
    \dd{gl2psEnable} and \dd{gl2psDisable} delimit OpenGL commands to which a local
    \dd{mode} is applied. These modes are:
    
    \begin{description}
    \item[\dd{GL2PS_LINE_STIPPLE}] Emulates the \dd{GL_LINE_STIPPLE}
      functionality. The stippling pattern and repetition factor are taken
      as the current values of the corresponding OpenGL stippling options
      (set with \dd{glLineStipple}). You thus need to call
      \dd{gl2psEnable(GL2PS_LINE_STIPPLE)} \emph{after} calling
      \dd{glLineStipple(factor, pattern)}.
    \item[\dd{GL2PS_POLYGON_OFFSET_FILL}] Emulates the
      \dd{GL_POLYGON_OFFSET_FILL} functionality. The value of the offset is
      taken as the current value of the corresponding OpenGL offset (set with
      \dd{glPolygonOffset}).
    \item[\dd{GL2PS_BLEND}] Emulates the \dd{GL_BLEND} functionality.
      (Warning: this might change in future releases.)
    \item[\dd{GL2PS_POLYGON_BOUNDARY}] Not implemented yet.
    \end{description}
    
    \subsubsection{Return value}
    
    \noindent\dd{gl2psEnable} and \dd{gl2psDisable} return:
    \begin{description}
    \item[\dd{GL2PS_UNINITIALIZED}] if the library is not initialized;
    \item[\dd{GL2PS_ERROR}] if an error occurred;
    \item[\dd{GL2PS_SUCCESS}] otherwise.
    \end{description}
    
    % -------------------------------------------------------------------------
    
    \subsection{\texttt{gl2psPointSize} and \texttt{gl2psLineWidth}}
    \label{sec:gl2psPointSize}
    
    \subsubsection{Specification}
    
    \begin{verbatim}
    GLint gl2psPointSize( GLfloat value )
    \end{verbatim}
    
    \begin{verbatim}
    GLint gl2psLineWidth( GLfloat value )
    \end{verbatim}
    
    \subsubsection{Description and arguments}
    
    \dd{gl2psPointSize} and \dd{gl2psLineSize} emulate the standard
    \dd{glPointSize} and the \dd{glLineWidth} functions. They are necessary
    since the point sizes and line widths are not saved in the OpenGL feedback
    buffer.
    
    \subsubsection{Return value}
    
    \noindent\dd{gl2psPointSize} and \dd{gl2psLineWidth} return:
    \begin{description}
    \item[\dd{GL2PS_UNINITIALIZED}] if the library is not initialized;
    \item[\dd{GL2PS_ERROR}] if an error occurred;
    \item[\dd{GL2PS_SUCCESS}] otherwise.
    \end{description}
    
    % -------------------------------------------------------------------------
    
    \subsection{\texttt{gl2psBlendFunc}}
    \label{sec:gl2psBlendFunc}
    
    \subsubsection{Specification}
    
    \begin{verbatim}
    GLint gl2psBlendFunc( GLenum sfactor, GLenum dfactor )
    \end{verbatim}
    
    \subsubsection{Description and arguments}
    
    \dd{gl2psBlendFunc} emulates the \dd{glBlendFunc} function.
    
    \subsubsection{Return value}
    
    \noindent\dd{gl2psBlendFunc} returns:
    \begin{description}
    \item[\dd{GL2PS_UNINITIALIZED}] if the library is not initialized;
    \item[\dd{GL2PS_WARNING}] if the blending mode is not (yet) supported;
    \item[\dd{GL2PS_SUCCESS}] otherwise.
    \end{description}
    
    % -------------------------------------------------------------------------
    
    \subsection{\texttt{gl2psBeginViewport} and \texttt{gl2psEndViewport}}
    \label{sec:gl2psBeginViewport}
    
    \subsubsection{Specification}
    
    \begin{verbatim}
    GLint gl2psBeginViewport ( GLint viewport[4] )
    \end{verbatim}
    
    \begin{verbatim}
    GLint gl2psEndViewport ( void )
    \end{verbatim}
    
    \subsubsection{Description and arguments}
    
    \dd{gl2psBeginViewport} and \dd{gl2psEndViewport} permit to output different
    viewports\footnote{See the description of \dd{glViewport} and \dd{glScissor}
    in the OpenGL documentation.} in the output stream. Each viewport is sorted
    separately and has its own background frame. The argument given to
    \dd{gl2psBeginViewport} specifies the viewport (obtained for example with a
    call to \dd{glGetIntegerv(GL_VIEWPORT, viewport)}).
    
    \subsubsection{Return value}
    
    \noindent\dd{gl2psBeginViewport} returns:
    \begin{description}
    \item[\dd{GL2PS_UNINITIALIZED}] if the library is not initialized;
    \item[\dd{GL2PS_ERROR}] if an error occurred;
    \item[\dd{GL2PS_SUCCESS}] otherwise.
    \end{description}
    
    \noindent\dd{gl2psEndViewport} returns:
    \begin{description}
    \item[\dd{GL2PS_NO_FEEDBACK}] if the feedback buffer is empty;
    \item[\dd{GL2PS_OVERFLOW}] if the size of the feedback buffer given to
      \dd{gl2psBeginPage} is not large enough;
    \item[\dd{GL2PS_UNINITIALIZED}] if \dd{gl2psEndViewport} is called when the
      library is not initialized;
    \item[\dd{GL2PS_ERROR}] if an error occurred;
    \item[\dd{GL2PS_SUCCESS}] otherwise.
    \end{description}
    
    % -------------------------------------------------------------------------
    
    \subsection{\texttt{gl2psSetOptions}}
    \label{sec:gl2psSetOptions}
    
    \subsubsection{Specification}
    
    \begin{verbatim}
    GLint gl2psSetOptions ( GLint options )
    \end{verbatim}
    
    \subsubsection{Description and arguments}
    
    \dd{gl2psSetOptions} permits to change the global options initially
    set using the \dd{options} argument to
    \dd{gl2psBeginPage} (see section~\ref{sec:gl2psBeginPage}). 
    
    \dd{gl2psSetOptions} can for example be used to force GL2PS to print
    the background for selected viewports, by setting/unsetting
    \dd{GL2PS_DRAW_BACKGROUND} before calling \dd{gl2psBeginViewport}.
    
    \subsubsection{Return value}
    
    \noindent\dd{gl2psSetOptions} returns:
    \begin{description}
    \item[\dd{GL2PS_UNINITIALIZED}] if the library is not initialized;
    \item[\dd{GL2PS_SUCCESS}] otherwise.
    \end{description}
    
    % -------------------------------------------------------------------------
    
    \section{Example}
    
    Here is a typical calling sequence to produce BSP sorted PostScript output
    in the file \dd{"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 \dd{draw()} function contains all the OpenGL commands.
    
    \begin{verbatim}
    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);
    \end{verbatim}
    
    \noindent To output the text \dd{"MyText"} at the current raster position, the
    \dd{draw()} function should contain something like:
    
    \begin{verbatim}
    gl2psText("MyText", "Courier", 12);
    \end{verbatim}
    
    Complete example programs (\dd{gl2psTestSimple.c} and \dd{gl2psTest.c})
    are included in the distribution.
    
    %\begin{figure}
    %\scalebox{0.85}{\input{outLatex.tex}}
    %\caption{Sample output of the test program}
    %\end{figure}
    
    \section{Tips and tricks}
    \label{sec:tips}
    
    Here are, in no particular order, some useful tips and solutions to common
    problems:
    \begin{itemize}
    \item For PDF (both compressed and non-compressed) and for compressed
      PostScript and SVG output, files should always be opened in binary
      mode, i.e., with \dd{fopen(..., "wb")}, instead of \dd{fopen(...,
        "w")}.
    \item Blending is not yet very well supported by many viewers/printers. To
      disable blending entirely, add \dd{GL2PS_NO_BLENDING} to the list of
      options passed to \dd{gl2psBeginPage}.
    \item Make sure that localization is turned off when using GL2PS, via:
    \begin{verbatim}
      unsigned char *oldlocale = setlocale(LC_NUMERIC, "C");
    
      /* gl2ps drawing stuff */
    
      setlocale(LC_NUMERIC, oldlocale);
    \end{verbatim}
      French or German localizations would for example lead to corrupted output
      files, as they represent the decimal point by a comma.
    \item If you plan to convert PostScript files into PDF files, you may need
      to disable the use of the Level 3 PostScript \dd{shfill} operator, i.e.,
      add \dd{GL2PS_NO_PS3_SHADING} to the list of options passed to
      \dd{gl2psBeginPage}. (Note that you can also edit the output file \emph{a
        posteriori}---just set \dd{/tryPS3shading} to \dd{false} in the
      PostScript file header.) The best way to generate PDF files is of course
      to set the \dd{format} argument to \dd{GL2PS_PDF} in the
      \dd{gl2psBeginPage} call...
    \item By default, GL2PS checks if blending is globally enabled in
      \dd{gl2psBeginPage()}. To enable blending for selected primitives
      only, you should use \dd{gl2psEnable(GL2PS_BLEND)} and
      \dd{gl2psDisable(GL2PS_BLEND)} pairs around the OpenGL calls that
      need blending. (Warning: this might change in future releases.)
    \item \dd{gl2psEnable(GL2PS_LINE_STIPPLE)} uses the current values of
      the OpenGL stippling options to compute the stippling pattern and
      repetition factor. You thus need to call
      \dd{gl2psEnable(GL2PS_LINE_STIPPLE)} \emph{after} calling
      \dd{glLineStipple(factor, pattern)}.
     \end{itemize}
    
    \section{Limitations}
    \label{sec:limitations}
    
    GL2PS works by capturing the contents of the OpenGL feedback
    buffer\footnote{See the description of \dd{glFeedbackBuffer} and
    \dd{glRenderMode(GL_FEEDBACK)} in the OpenGL documentation.}. 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~\ref{sec:gl2psText}, \ref{sec:gl2psDrawPixels},
    \ref{sec:gl2psEnable} and \ref{sec:gl2psPointSize}).
    
    Other limitations include:
    \begin{itemize}
    \item 
    Rendering large and/or complicated scenes is slow and/or can lead to large
    output files. This is normal: vector-based images are not destined to
    replace bitmap images. They just offer an alternative when high quality
    (especially for 2D and small 3D plots) and ease of manipulation (how do you
    change the scale, the labels or the colors in a bitmap picture long after
    the picture was produced, and without altering its quality?) are important.
    \item
    Transparency is only supported for PDF and SVG output.
    \item
    GL2PS does not support textures, fog effects, etc.
    \end{itemize}
    
    % Other implementation Notes:
    %
    % OpenGL feedback buffer
    % describe Simple depth sort
    %          3D BSP tree
    %          2D BSP image tree for occlusion culling
    % float vs. double
    % polygon offsets
    % PostScript shading
    %
    % From the GLpr FAQ:
    %
    % 3. Can GLpr handle 2D texture mapping?
    % 
    %    Only for pixel-based output (i.e., captured with glpImage()).  GLpr
    %    cannot duplicate the effects of texture mapping for vector
    %    (move-draw) output.  Unfortunately, the information required is not
    %    present in the OpenGL feedback buffer.  
    %
    % 4. Can GLpr handle 1D texture mapping?
    %
    %    Not in the present release.  However, future releases may provide
    %    support for 1D texture maps (e.g.\ color lookup).
    %
    % Add references:
    % - Fuchs, Kedem and Naylor for the BSP
    % - Kilgard+OpenGL spec for the feedback buffer
    
    \section{Contributors}
    \label{sec:contrib}
    
    \noemail{Michael Sweet}{mike@easysw.com} for the original implementation of
    the feedback buffer parser; 
    %
    \noemail{Bruce Naylor}{naylor@comp-graphics.com} for BSP tree and occlusion
    culling hints;
    %
    \noemail{Marc Um{\'e}}{marc.ume@digitalgraphics.be} for the original list
    code;
    %
    \noemail{Jean-Fran\c{c}ois Remacle}{remacle@gce.ucl.ac.be} for plane equation
    fixes; 
    %
    \noemail{Bart Kaptein}{B.L.Kaptein@lumc.nl} for memory leak fixes;
    %
    \noemail{Quy Nguyen-Dai}{quy@nguyendai.org} for output file size optimization;
    %
    \noemail{Sam Buss}{sbuss@ucsd.edu} for the \dd{shfill}-based smooth shaded
    triangle code;
    %
    \noemail{Shane Hill}{Shane.Hill@dsto.defence.gov.au} for the landscape option
    implementation;
    %
    \noemail{Romain Boman}{r_boman@yahoo.fr} for the Windows dll generation;
    %
    \noemail{Diego Santa Cruz}{Diego.SantaCruz@epfl.ch} for the new optimized
    shaded triangle code and the \dd{shfill} management;
    %
    \noemail{Shahzad Muzaffar}{Shahzad.Muzaffar@cern.ch} and \noemail{Lassi
    Tuura}{lassi.tuura@cern.ch} for the new occlusion culling code, the
    improvement of \dd{GL2PS_BEST_ROOT} and the imagemap support;
    %
    \noemail{Guy Barrand}{barrand@lal.in2p3.fr} for his work on
    \dd{gl2psDrawPixels} and the new viewport management;
    %
    \noemail{Rouben Rostamian}{rostamian@umbc.edu} and \noemail{Prabhu
    Ramachandran}{prabhu@aero.iitm.ernet.in} for various bug reports and fixes;
    %
    \noemail{Micha Bieber}{bieber@traits.de} for the PDF code;
    %
    \noemail{Olivier Couet}{couet@mail.cern.ch} for the initial SVG code;
    %
    \noemail{Fabian Wenzel}{wenzel@tu-harburg.de} for the PGF code and the
    backend reorganization;
    %
    \noemail{Shai Ayal}{shaiay@gmail.com} for rotated text support in
    PostScript;
    %
    \noemail{Ian D. Gay}{gay@sfu.ca} for 64 bit arch patch;
    %
    \noemail{Cosmin Truta}{cosmin@cs.toronto.edu} and \noemail{Baiju
      Devani}{} for various bug fixes and the new \dd{gl2psSpecial} code.
    
    \section{Links}
    \label{sec:links}
    
    Projects similar to \dd{GL2PS} include: Mark Kilgard's original
    ``rendereps'' tutorial
    (\url{http://www.opengl.org/developers/code/mjktips/Feedback.html});
    Michael Sweet's GLP library
    (\url{http://www.easysw.com/~mike/opengl/}); the GLpr library from CEI
    international (\url{http://www.ceintl.com/}; this product does not
    seem to be available anymore).
    
    %\noemail{Toby White}{tow@sdf.lonestar.org} maintains a Python wrapper for
    %\dd{GL2PS}, available at \url{http://tow.freeshell.org/software.html}.
    
    \section{Versions}
    
    \begin{description}
    \item[0.1] (Feb 12, 2000) First distributed version.
    \item[0.2] (Feb 20, 2000) Added \dd{GL2PS_POLYGON_BOUNDARY} and
      \dd{GL2PS_BEST_ROOT}. API change: changed arguments of \dd{gl2psBeginPage}
      and \dd{gl2psText}. Corrected some memory allocation stuff. First version
      of this user's guide.
    \item[0.21] (Mar 16, 2000) Initialization fixes.
    \item[0.3] (Jul 29, 2000) Code cleanup. Added \dd{GL2PS_LINE_STIPPLE}.
    \item[0.31] (Aug 14, 2000) Better handling of erroneous primitives.
    \item[0.32] (May 23, 2001) Fixed memory leaks.
    \item[0.4] (Jun 12, 2001) Added \dd{gl2psPointSize} and
      \dd{gl2psLineWidth}. Some code cleanup to allow easier generation of
      vector file formats other than postscript.
    \item[0.41] (Aug 6, 2001) Fixed string allocation (1 char too short). Set
      smaller default line width.
    \item[0.42] (Oct 8, 2001) Optimization of output file size. PostScript
      header cleanup. Better line width computation.
    \item[0.5] (Nov 19, 2001) API change: new \dd{format} and \dd{filename}
      arguments for \dd{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.
    \item[0.51] (Jan 22, 2002) Fixed erroneous drawing of text primitives lying
      outside the viewport.
    \item[0.52] (Feb 14, 2002) New \dd{GL2PS_LANDSCAPE} option.
    \item[0.53] (Mar 11, 2002) New \dd{GL2PSDLL} compilation flag to allow the
      generation of a Windows dll.
    \item[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.
    \item[0.61] (Jun 21, 2002) Fixed the fix for the sorting of text objects;
      introduced tolerance for floating point comparisons.
    \item[0.62] (Sep 6, 2002) New \dd{GL2PS_EPS} option to produce Encapsulated
      PostScript files; optimized drawing of shaded primitives; new
      \dd{GL2PS_NO_PS3_SHADING} option and \dd{gl2psNumShadeColors} function to
      control the use of the PostScript level 3 \dd{shfill} operator (usually
      not well handled when converting to PDF).
    \item[0.63] (Nov 12, 2002) Changed \dd{GLvoid} to \dd{void} to accommodate
      some SUN compilers; made subdivision parameters modifiable a posteriori in
      the output file; revised documentation.
    \item[0.7] (Dec 11, 2002) Occlusion culling (\dd{GL2PS_OCCLUSION_CULL}) is
      (finally!) working thanks to the great work of Shahzad Muzaffar; enhanced
      \dd{GL2PS_BEST_ROOT}.
    \item[0.71] (Dec 13, 2002) Removed C++ style comments inadvertently left in
      the code; added example program \dd{gl2psTest.c} to the distribution.
    \item[0.72] (Jan 21, 2003) Fixed crash in occlusion culling code; enhanced
      documentation.
    \item[0.73] (Jan 30, 2003) Minor code cleanup.
    \item[0.8] (Mar 10, 2003) API change: \dd{gl2psNumShadeColors} has been
      removed and the color subdivision parameters \dd{nr}, \dd{ng} and \dd{nb}
      are now given as arguments to \dd{gl2psBeginPage}; API change:
      \dd{gl2psBeginPage} takes an additional argument (\dd{viewport}) to
      specify the print viewport; new \dd{gl2psDrawPixels} interface to produce
      mixed mode (vector+raster) PostScript output; new \dd{gl2psBeginViewport}
      and \dd{gl2psEndViewport} interface to handle multiple OpenGL viewports;
      fixed small bug in occlusion culling code; better error handling.
    \item[0.81] (Mar 22, 2003) Fixed small typos in comments and documentation.
    \item[0.9.0] (Jun 2, 2003) Fixed smooth shading detection for mixed
      smooth/flat shaded scenes; new library numbering scheme
      (``major.minor.patch'').
    \item[0.9.1] (Jun 12, 2003) Fixed two \dd{GL2PS_TEX} output bugs
      (\dd{glRenderMode} not reset to \dd{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''.
    \item[0.9.2] (Jul 4, 2003) Improved occlusion culling; new
      \dd{GL2PS_USE_CURRENT_VIEWPORT} option.
    \item[1.0.0] (Sep 24, 2003) Native PDF support contributed by Micha
      Bieber.
    \item[1.1.0] (Nov 4, 2003) New \dd{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 \dd{COPYING.GL2PS}).
    \item[1.1.1] (Nov 9, 2003) Small memory optimization; documentation update
      (binary files, fonts).
    \item[1.1.2] (Nov 16, 2003) Fixed various compiler warnings (mostly
      for Windows Visual C++).
    \item[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).
    \item[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
     \dd{gl2psBeginPage}.
    \item[1.2.2] (Sep 21, 2004) Fixed a couple of small bugs in the example
      code.
    \item[1.2.3] (Dec 23, 2004) Fixed small bugs in (unused) PostScript pixmap
      code; better scaling of the z-buffer (improves
      \dd{GL2PS_SIMPLE_LINE_OFFSET} and occlusion culling); added support
      for general stippling patterns.
    \item[1.2.4] (Apr 27, 2005) Fixed feedback buffer test for
      \dd{GL2PS_TEX} output; fixed missing brace in \LaTeX\ output for
      text aligned using \dd{GL2PS_TEXT_C}; fixed clipping in
      multi-viewport PostScript output when \dd{GL2PS_DRAW_BACKGROUND} is
      not set; new \dd{gl2psSetOptions} interface to change the current
      options on the fly.
    \item[1.2.5] (Jun 18, 2005) Fixed a couple of uninitialized variables in
      PDF code; new \dd{GL2PS_TIGHT_BOUNDING_BOX} option; added rotated
      text support for PostScript output.
    \item[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 \dd{gl2psTestSimple.c} to the
      distribution.
    \item[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.
    \item[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 \dd{gl2psSpecial}
      to print device-specific strings in the output stream.
    \item[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.
    \end{description}
    
    \end{document}