Skip to content
Snippets Groups Projects
Commit 9c067f49 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

- new option to set tight bounding box (required move of header printing)
- rotated text for ps/eps
parent faac9d67
Branches
Tags gl2ps_1_2_5
No related merge requests found
$Id: TODO,v 1.17 2005-04-11 05:00:29 geuzaine Exp $
------------------------------------------------------------------------
* At last, after so many help requests, I have a small contribution --
rotated text in ps output. Actually, I just figured out the ps code,
not the changes needed in gl2ps to implement it. just replace the /S
macro with
/SR { gsave FC translate 0 0 moveto rotate show grestore } BD
which now shows rotated text:
(rotated) -45 100 25 10 /Helvetica SR
All the other "/S??" macros need to be altered accordingly. Tell if
you like the idea.
$Id: TODO,v 1.18 2005-06-18 18:06:20 geuzaine Exp $
------------------------------------------------------------------------
......
% $Id: gl2ps.tex,v 1.196 2005-05-20 23:22:13 geuzaine Exp $
% $Id: gl2ps.tex,v 1.197 2005-06-18 18:06:20 geuzaine Exp $
%
% GL2PS, an OpenGL to PostScript Printing Library
% Copyright (C) 1999-2005 Christophe Geuzaine <geuz@geuz.org>
......@@ -58,13 +58,13 @@
\title{GL2PS: an OpenGL to PostScript printing library}
\author{Christophe Geuzaine}
\date{Version 1.2.4, 27 April 2005}
\date{Version 1.2.5, 18 June 2005}
\maketitle
%%tth: \section*{Download}
%%tth: The current distribution of GL2PS is
%%tth: \href{http://www.geuz.org/gl2ps/src/gl2ps-1.2.4.tgz}{gl2ps-1.2.4.tgz}.
%%tth: \href{http://www.geuz.org/gl2ps/src/gl2ps-1.2.5.tgz}{gl2ps-1.2.5.tgz}.
%%tth: This distribution contains a complete
%%tth: \href{http://www.geuz.org/gl2ps/gl2ps.pdf}
%%tth: {documentation in PDF format}. Older versions are still
......@@ -232,6 +232,10 @@ determine the way primitives are handled:
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
......@@ -347,8 +351,8 @@ The additional arguments for \dd{gl2psTextOpt} are:
C CL CR B BL BR T TL TR
\end{verbatim}
\item[\dd{angle}] (for \LaTeX\ output only) Specifies a rotation angle for
the text string (counter-clockwise, in degrees).
\item[\dd{angle}] (for PostScript and \LaTeX\ output only) Specifies a
rotation angle for the text string (counter-clockwise, in degrees).
\end{description}
\subsubsection{Return value}
......@@ -761,7 +765,10 @@ improvement of \dd{GL2PS_BEST_ROOT} and the imagemap support;
\email{Rouben Rostamian}{rostamian@umbc.edu} and \email{Prabhu
Ramachandran}{prabhu@aero.iitm.ernet.in} for various bug reports and fixes;
%
\email{Micha Bieber}{bieber@traits.de} for the PDF code.
\email{Micha Bieber}{bieber@traits.de} for the PDF code;
%
\email{Shai Ayal}{shaiay@gmail.com} for rotated text support in
PostScript.
\section{Links}
\label{sec:links}
......@@ -875,8 +882,9 @@ does not seem to be available anymore).
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] (?, 2005) Fixed a couple of uninitialized variables in
PDF code;
\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.
\end{description}
\end{document}
/* $Id: gl2ps.c,v 1.210 2005-06-08 22:07:59 geuzaine Exp $ */
/* $Id: gl2ps.c,v 1.211 2005-06-18 18:06:20 geuzaine Exp $ */
/*
* GL2PS, an OpenGL to PostScript Printing Library
* Copyright (C) 1999-2005 Christophe Geuzaine <geuz@geuz.org>
......@@ -215,11 +215,12 @@ typedef struct {
GLboolean boundary, blending;
GLfloat *feedback, offset[2], lastlinewidth;
GLint viewport[4], blendfunc[2], lastfactor;
GL2PSrgba *colormap, lastrgba, threshold;
GL2PSrgba *colormap, lastrgba, threshold, bgcolor;
GLushort lastpattern;
GL2PSlist *primitives;
FILE *stream;
GL2PScompress *compress;
GLboolean header;
/* BSP-specific */
GLint maxbestroot;
......@@ -2334,8 +2335,6 @@ static void gl2psPrintPostScriptImagemap(GLfloat x, GLfloat y,
static void gl2psPrintPostScriptHeader(void)
{
GLint index;
GLfloat rgba[4];
time_t now;
#ifdef GL2PS_HAVE_ZLIB
......@@ -2400,7 +2399,8 @@ static void gl2psPrintPostScriptHeader(void)
/* RGB color: r g b C (replace C by G in output to change from rgb to gray)
Grayscale: r g b G
Font choose: size fontname FC
Text string: (string) x y size fontname SXX
Text string: (string) x y size fontname S??
Rotated text string: (string) angle x y size fontname S??R
Point primitive: x y size P
Line width: width W
Flat-shaded line: x2 y2 x1 y1 L
......@@ -2435,6 +2435,19 @@ static void gl2psPrintPostScriptHeader(void)
"/STC{ FC moveto SW -2 div SH neg rmoveto show } BD\n"
"/STR{ FC moveto SW neg SH neg rmoveto show } BD\n");
/* rotated text routines: same nameanem with R appended */
gl2psPrintf("/FCT { FC translate 0 0 } BD\n"
"/SR { gsave FCT moveto rotate show grestore } BD\n"
"/SBCR{ gsave FCT moveto rotate SW -2 div 0 rmoveto show grestore } BD\n"
"/SBRR{ gsave FCT moveto rotate SW neg 0 rmoveto show grestore } BD\n"
"/SCLR{ gsave FCT moveto rotate 0 SH -2 div rmoveto show grestore} BD\n");
gl2psPrintf("/SCCR{ gsave FCT moveto rotate SW -2 div SH -2 div rmoveto show grestore} BD\n"
"/SCRR{ gsave FCT moveto rotate SW neg SH -2 div rmoveto show grestore} BD\n"
"/STLR{ gsave FCT moveto rotate 0 SH neg rmoveto show grestore } BD\n"
"/STCR{ gsave FCT moveto rotate SW -2 div SH neg rmoveto show grestore } BD\n"
"/STRR{ gsave FCT moveto rotate SW neg SH neg rmoveto show grestore } BD\n");
gl2psPrintf("/P { newpath 0.0 360.0 arc closepath fill } BD\n"
"/L { newpath moveto lineto stroke } BD\n"
"/SL { C moveto C lineto stroke } BD\n"
......@@ -2560,20 +2573,10 @@ static void gl2psPrintPostScriptHeader(void)
"1.0 1.0 scale\n");
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[3] = 0.0F;
}
gl2psPrintf("%g %g %g C\n"
"newpath %d %d moveto %d %d lineto %d %d lineto %d %d lineto\n"
"closepath fill\n",
rgba[0], rgba[1], rgba[2],
gl2ps->bgcolor[0], gl2ps->bgcolor[1], gl2ps->bgcolor[2],
(int)gl2ps->viewport[0], (int)gl2ps->viewport[1], (int)gl2ps->viewport[2],
(int)gl2ps->viewport[1], (int)gl2ps->viewport[2], (int)gl2ps->viewport[3],
(int)gl2ps->viewport[0], (int)gl2ps->viewport[3]);
......@@ -2662,38 +2665,40 @@ static void gl2psPrintPostScriptPrimitive(void *data)
break;
case GL2PS_TEXT :
gl2psPrintPostScriptColor(prim->verts[0].rgba);
gl2psPrintf("(%s) %g %g %d /%s ",
prim->data.text->str, prim->verts[0].xyz[0], prim->verts[0].xyz[1],
gl2psPrintf("(%s) ", prim->data.text->str);
if(prim->data.text->angle)
gl2psPrintf("%g ", prim->data.text->angle);
gl2psPrintf("%g %g %d /%s ",
prim->verts[0].xyz[0], prim->verts[0].xyz[1],
prim->data.text->fontsize, prim->data.text->fontname);
switch(prim->data.text->alignment){
case GL2PS_TEXT_C:
gl2psPrintf("SCC\n");
gl2psPrintf(prim->data.text->angle ? "SCCR\n" : "SCC\n");
break;
case GL2PS_TEXT_CL:
gl2psPrintf("SCL\n");
gl2psPrintf(prim->data.text->angle ? "SCLR\n" : "SCL\n");
break;
case GL2PS_TEXT_CR:
gl2psPrintf("SCR\n");
gl2psPrintf(prim->data.text->angle ? "SCRR\n" : "SCR\n");
break;
case GL2PS_TEXT_B:
gl2psPrintf("SBC\n");
gl2psPrintf(prim->data.text->angle ? "SBCR\n" : "SBC\n");
break;
case GL2PS_TEXT_BR:
gl2psPrintf("SBR\n");
gl2psPrintf(prim->data.text->angle ? "SBRR\n" : "SBR\n");
break;
case GL2PS_TEXT_T:
gl2psPrintf("STC\n");
gl2psPrintf(prim->data.text->angle ? "STCR\n" : "STC\n");
break;
case GL2PS_TEXT_TL:
gl2psPrintf("STL\n");
gl2psPrintf(prim->data.text->angle ? "STLR\n" : "STL\n");
break;
case GL2PS_TEXT_TR:
gl2psPrintf("STR\n");
gl2psPrintf(prim->data.text->angle ? "STRR\n" : "STR\n");
break;
case GL2PS_TEXT_BL:
default:
gl2psPrintf("S\n");
gl2psPrintf(prim->data.text->angle ? "SR\n" : "S\n");
break;
}
break;
......@@ -2812,6 +2817,11 @@ static void gl2psPrintPostScriptBeginViewport(GLint viewport[4])
glRenderMode(GL_FEEDBACK);
if(gl2ps->header){
gl2psPrintPostScriptHeader();
gl2ps->header = GL_FALSE;
}
gl2psPrintf("gsave\n"
"1.0 1.0 scale\n");
......@@ -3563,23 +3573,11 @@ static int gl2psOpenPDFDataStream(void)
static int gl2psOpenPDFDataStreamWritePreface(void)
{
int offs;
GLint index;
GLfloat rgba[4];
offs = gl2psPrintf("/GSa gs\n");
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[3] = 0.0F;
}
offs += gl2psPrintPDFFillColor(rgba);
offs += gl2psPrintPDFFillColor(gl2ps->bgcolor);
offs += gl2psPrintf("%d %d %d %d re\n",
(int)gl2ps->viewport[0], (int)gl2ps->viewport[1],
(int)gl2ps->viewport[2], (int)gl2ps->viewport[3]);
......@@ -4317,15 +4315,18 @@ static void gl2psPrintPDFFooter(void)
static void gl2psPrintPDFBeginViewport(GLint viewport[4])
{
int offs;
int offs = 0;
GLint index;
GLfloat rgba[4];
int x = viewport[0], y = viewport[1], w = viewport[2], h = viewport[3];
offs = 0;
glRenderMode(GL_FEEDBACK);
if(gl2ps->header){
gl2psPrintPDFHeader();
gl2ps->header = GL_FALSE;
}
offs += gl2psPrintf("q\n");
if(gl2ps->options & GL2PS_DRAW_BACKGROUND){
......@@ -4337,7 +4338,7 @@ static void gl2psPrintPDFBeginViewport(GLint viewport[4])
rgba[0] = gl2ps->colormap[index][0];
rgba[1] = gl2ps->colormap[index][1];
rgba[2] = gl2ps->colormap[index][2];
rgba[3] = 0.;
rgba[3] = 0.0F;
}
offs += gl2psPrintPDFFillColor(rgba);
offs += gl2psPrintf("%d %d %d %d re\n"
......@@ -4360,9 +4361,7 @@ static GLint gl2psPrintPDFEndViewport(void)
GLint res;
res = gl2psPrintPrimitives();
gl2ps->streamlength += gl2psPrintf("Q\n");
return res;
}
......@@ -4372,6 +4371,25 @@ static GLint gl2psPrintPDFEndViewport(void)
*
*********************************************************************/
static void gl2psComputeTightBoundingBox(void *data)
{
GL2PSprimitive *prim;
int i;
prim = *(GL2PSprimitive**)data;
for(i = 0; i < prim->numverts; i++){
if(prim->verts[i].xyz[0] < gl2ps->viewport[0])
gl2ps->viewport[0] = (GLint)prim->verts[i].xyz[0];
if(prim->verts[i].xyz[0] > gl2ps->viewport[2])
gl2ps->viewport[2] = (GLint)(prim->verts[i].xyz[0] + 0.5F);
if(prim->verts[i].xyz[1] < gl2ps->viewport[1])
gl2ps->viewport[1] = (GLint)prim->verts[i].xyz[1];
if(prim->verts[i].xyz[1] > gl2ps->viewport[3])
gl2ps->viewport[3] = (GLint)(prim->verts[i].xyz[1] + 0.5F);
}
}
static GLint gl2psPrintPrimitives(void)
{
GL2PSbsptree *root;
......@@ -4391,13 +4409,35 @@ static GLint gl2psPrintPrimitives(void)
gl2psParseFeedbackBuffer(used);
}
gl2psRescaleAndOffset();
if(gl2ps->header){
if(gl2psListNbr(gl2ps->primitives) &&
(gl2ps->options & GL2PS_TIGHT_BOUNDING_BOX)){
gl2ps->viewport[0] = gl2ps->viewport[1] = 100000;
gl2ps->viewport[2] = gl2ps->viewport[3] = -100000;
gl2psListAction(gl2ps->primitives, gl2psComputeTightBoundingBox);
}
switch(gl2ps->format){
case GL2PS_TEX :
gl2psPrintTeXHeader();
break;
case GL2PS_PS :
case GL2PS_EPS :
gl2psPrintPostScriptHeader();
break;
case GL2PS_PDF :
gl2psPrintPDFHeader();
break;
}
gl2ps->header = GL_FALSE;
}
if(!gl2psListNbr(gl2ps->primitives)){
/* empty feedback buffer and/or nothing else to print */
return GL2PS_NO_FEEDBACK;
}
gl2psRescaleAndOffset();
switch(gl2ps->format){
case GL2PS_TEX :
pprim = gl2psPrintTeXPrimitive;
......@@ -4445,13 +4485,8 @@ static GLint gl2psPrintPrimitives(void)
gl2psBuildBspTree) in case there is another viewport */
gl2ps->primitives = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*));
break;
default :
gl2psMsg(GL2PS_ERROR, "Unknown sorting algorithm: %d", gl2ps->sort);
return GL2PS_ERROR;
}
fflush(gl2ps->stream);
return GL2PS_SUCCESS;
}
......@@ -4468,6 +4503,7 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
GLint nr, GLint ng, GLint nb, GLint buffersize,
FILE *stream, const char *filename)
{
GLint index;
int i;
if(gl2ps){
......@@ -4476,9 +4512,50 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
}
gl2ps = (GL2PScontext*)gl2psMalloc(sizeof(GL2PScontext));
gl2ps->maxbestroot = 10;
switch(format){
case GL2PS_TEX :
case GL2PS_PS :
case GL2PS_EPS :
case GL2PS_PDF :
gl2ps->format = format;
break;
default :
gl2psMsg(GL2PS_ERROR, "Unknown output format: %d", format);
gl2psFree(gl2ps);
gl2ps = NULL;
return GL2PS_ERROR;
}
switch(sort){
case GL2PS_NO_SORT :
case GL2PS_SIMPLE_SORT :
case GL2PS_BSP_SORT :
gl2ps->sort = sort;
break;
default :
gl2psMsg(GL2PS_ERROR, "Unknown sorting algorithm: %d", sort);
gl2psFree(gl2ps);
gl2ps = NULL;
return GL2PS_ERROR;
}
if(stream){
gl2ps->stream = stream;
/* In case gl2psEndPage failed (e.g. due to a GL2PS_OVERFLOW) and
we didn't reopen the stream before calling gl2psBeginPage
again, we need to rewind the stream */
rewind(gl2ps->stream);
}
else{
gl2psMsg(GL2PS_ERROR, "Bad file pointer");
gl2psFree(gl2ps);
gl2ps = NULL;
return GL2PS_ERROR;
}
gl2ps->header = GL_TRUE;
gl2ps->maxbestroot = 10;
gl2ps->options = options;
gl2ps->compress = NULL;
gl2ps->imagemap_head = NULL;
......@@ -4527,6 +4604,7 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
if(gl2ps->colormode == GL_RGBA){
gl2ps->colorsize = 0;
gl2ps->colormap = NULL;
glGetFloatv(GL_COLOR_CLEAR_VALUE, gl2ps->bgcolor);
}
else if(gl2ps->colormode == GL_COLOR_INDEX){
if(!colorsize || !colormap){
......@@ -4538,6 +4616,11 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
gl2ps->colorsize = colorsize;
gl2ps->colormap = (GL2PSrgba*)gl2psMalloc(gl2ps->colorsize * sizeof(GL2PSrgba));
memcpy(gl2ps->colormap, colormap, gl2ps->colorsize * sizeof(GL2PSrgba));
glGetIntegerv(GL_INDEX_CLEAR_VALUE, &index);
gl2ps->bgcolor[0] = gl2ps->colormap[index][0];
gl2ps->bgcolor[1] = gl2ps->colormap[index][1];
gl2ps->bgcolor[2] = gl2ps->colormap[index][2];
gl2ps->bgcolor[3] = 0.0F;
}
else{
gl2psMsg(GL2PS_ERROR, "Unknown color mode in gl2psBeginPage");
......@@ -4546,20 +4629,6 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
return GL2PS_ERROR;
}
if(!stream){
gl2psMsg(GL2PS_ERROR, "Bad file pointer");
gl2psFree(gl2ps);
gl2ps = NULL;
return GL2PS_ERROR;
}
else{
gl2ps->stream = stream;
/* In case gl2psEndPage failed (e.g. due to a GL2PS_OVERFLOW) and
we didn't reopen the stream before calling gl2psBeginPage
again, we need to rewind the stream */
rewind(gl2ps->stream);
}
if(!title){
gl2ps->title = (char*)gl2psMalloc(sizeof(char));
gl2ps->title[0] = '\0';
......@@ -4587,28 +4656,6 @@ GL2PSDLL_API GLint gl2psBeginPage(const char *title, const char *producer,
strcpy(gl2ps->filename, filename);
}
switch(gl2ps->format){
case GL2PS_TEX :
gl2psPrintTeXHeader();
break;
case GL2PS_PS :
case GL2PS_EPS :
gl2psPrintPostScriptHeader();
break;
case GL2PS_PDF :
gl2psPrintPDFHeader();
break;
default :
gl2psMsg(GL2PS_ERROR, "Unknown output format: %d", gl2ps->format);
gl2psFree(gl2ps->colormap);
gl2psFree(gl2ps->title);
gl2psFree(gl2ps->producer);
gl2psFree(gl2ps->filename);
gl2psFree(gl2ps);
gl2ps = NULL;
return GL2PS_ERROR;
}
gl2ps->primitives = gl2psListCreate(500, 500, sizeof(GL2PSprimitive*));
gl2ps->feedback = (GLfloat*)gl2psMalloc(gl2ps->buffersize * sizeof(GLfloat));
glFeedbackBuffer(gl2ps->buffersize, GL_3D_COLOR, gl2ps->feedback);
......@@ -4625,8 +4672,6 @@ GL2PSDLL_API GLint gl2psEndPage(void)
res = gl2psPrintPrimitives();
/* print the footer even if gl2psPrintPrimitives didn't succeed, so
that we end up with a valid file */
switch(gl2ps->format){
case GL2PS_TEX :
gl2psPrintTeXFooter();
......
/* $Id: gl2ps.h,v 1.98 2005-05-20 23:22:13 geuzaine Exp $ */
/* $Id: gl2ps.h,v 1.99 2005-06-18 18:06:20 geuzaine Exp $ */
/*
* GL2PS, an OpenGL to PostScript Printing Library
* Copyright (C) 1999-2005 Christophe Geuzaine <geuz@geuz.org>
......@@ -121,6 +121,7 @@
#define GL2PS_USE_CURRENT_VIEWPORT (1<<9)
#define GL2PS_COMPRESS (1<<10)
#define GL2PS_NO_BLENDING (1<<11)
#define GL2PS_TIGHT_BOUNDING_BOX (1<<12)
/* Arguments for gl2psEnable/gl2psDisable */
......
/* $Id: gl2psTest.c,v 1.67 2005-03-22 07:32:29 geuzaine Exp $ */
/* $Id: gl2psTest.c,v 1.68 2005-06-18 18:06:20 geuzaine Exp $ */
/*
* GL2PS, an OpenGL to PostScript Printing Library
* Copyright (C) 1999-2005 Christophe Geuzaine <geuz@geuz.org>
......@@ -552,7 +552,7 @@ void keyboard(unsigned char key, int x, int y){
ext = (format == GL2PS_EPS) ? "eps" : "pdf";
writefile(format, GL2PS_SIMPLE_SORT, opt, 0, "outSimpleCulled", ext);
opt = GL2PS_NO_PS3_SHADING | GL2PS_DRAW_BACKGROUND;
opt = GL2PS_NO_PS3_SHADING | GL2PS_DRAW_BACKGROUND | GL2PS_TIGHT_BOUNDING_BOX;
ext = (format == GL2PS_EPS) ? "eps" : "pdf";
writefile(format, GL2PS_SIMPLE_SORT, opt, 2, "outSimpleShading2", ext);
writefile(format, GL2PS_SIMPLE_SORT, opt, 8, "outSimpleShading8", ext);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment