diff --git a/Graphics/gl2ps.cpp b/Graphics/gl2ps.cpp index 3c134ea7761440ded8694ae9fe7cacc9688e9b9c..9de4f92f96e05ac5228ad6ac59b9080b0689bbe6 100644 --- a/Graphics/gl2ps.cpp +++ b/Graphics/gl2ps.cpp @@ -2,7 +2,7 @@ * GL2PS, an OpenGL to PostScript Printing Library * Copyright (C) 1999-2003 Christophe Geuzaine * - * $Id: gl2ps.cpp,v 1.65 2003-06-02 18:26:22 geuzaine Exp $ + * $Id: gl2ps.cpp,v 1.66 2003-06-12 17:39:33 geuzaine Exp $ * * E-mail: geuz@geuz.org * URL: http://www.geuz.org/gl2ps/ @@ -1170,26 +1170,14 @@ GLint gl2psGetVertex(GL2PSvertex *v, GLfloat *p){ } } -GLint gl2psParseFeedbackBuffer(void){ +void gl2psParseFeedbackBuffer(GLint used){ char flag, dash = 0; GLshort boundary; - GLint i, used, count, v, vtot, offset = 0; + GLint i, count, v, vtot, offset = 0; GLfloat lwidth = 1., psize = 1.; GLfloat *current; GL2PSvertex vertices[3]; - used = glRenderMode(GL_RENDER); - - if(used < 0){ - gl2psMsg(GL2PS_INFO, "OpenGL feedback buffer overflow"); - return GL2PS_OVERFLOW; - } - - if(used == 0){ - /* gl2psMsg(GL2PS_INFO, "Empty feedback buffer"); */ - return GL2PS_NO_FEEDBACK; - } - current = gl2ps->feedback; boundary = gl2ps->boundary = 0; @@ -1284,8 +1272,6 @@ GLint gl2psParseFeedbackBuffer(void){ break; } } - - return GL2PS_SUCCESS; } GLboolean gl2psSameColor(GL2PSrgba rgba1, GL2PSrgba rgba2){ @@ -1317,38 +1303,35 @@ void gl2psWriteByte(FILE *stream, unsigned char byte){ fprintf(stream, "%x%x", h, l); } -int gl2psGetRGB(GLfloat *pixels, GLsizei width, GLsizei height, GLuint x, GLuint y, - GLfloat *red, GLfloat *green, GLfloat *blue){ +void gl2psGetRGB(GLfloat *pixels, GLsizei width, GLsizei height, GLuint x, GLuint y, + GLfloat *red, GLfloat *green, GLfloat *blue){ /* OpenGL image is from down to up, PS image is up to down */ GLfloat *pimag; pimag = pixels + 3 * (width * (height - 1 - y) + x); *red = *pimag; pimag++; *green = *pimag; pimag++; *blue = *pimag; pimag++; - return 1; } void gl2psPrintPostScriptPixmap(GLfloat x, GLfloat y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLfloat *pixels, FILE *stream){ - typedef unsigned char Uchar; - int status = 1, nbhex, nbyte2, nbyte4, nbyte8; + int nbhex, nbyte2, nbyte4, nbyte8; GLsizei row, col, col_max; float dr, dg, db, fgrey; - Uchar red, green, blue, b, grey; - /* FIXME: this has to be generalized... */ - int shade = 0; - int nbit = 4; + unsigned char red, green, blue, b, grey; - if((width <= 0) || (height <= 0)) return; + /* FIXME: define an option for these? */ + int greyscale = 0; /* set to 1 to output greyscale image */ + int nbits = 8; /* number of bits per color compoment (2, 4 or 8) */ - /* Msg(INFO, "gl2psPrintPostScriptPixmap: x %g y %g w %d h %d", x, y, width, height); */ + if((width <= 0) || (height <= 0)) return; fprintf(stream, "gsave\n"); fprintf(stream, "%.2f %.2f translate\n", x, y); fprintf(stream, "%d %d scale\n", width, height); - if(shade != 0){ /* grey */ + if(greyscale){ /* greyscale, 8 bits per pixel */ fprintf(stream, "/picstr %d string def\n", width); fprintf(stream, "%d %d %d\n", width, height, 8); fprintf(stream, "[ %d 0 0 -%d 0 %d ]\n", width, height, height); @@ -1356,10 +1339,9 @@ void gl2psPrintPostScriptPixmap(GLfloat x, GLfloat y, GLsizei width, GLsizei hei fprintf(stream, "image\n"); for(row = 0; row < height; row++){ for(col = 0; col < width; col++){ - status = gl2psGetRGB(pixels, width, height, - col, row, &dr, &dg, &db) == 0 ? 0 : status; + gl2psGetRGB(pixels, width, height, col, row, &dr, &dg, &db); fgrey = (0.30 * dr + 0.59 * dg + 0.11 * db); - grey = (Uchar)(255. * fgrey); + grey = (unsigned char)(255. * fgrey); gl2psWriteByte(stream, grey); } fprintf(stream, "\n"); @@ -1367,13 +1349,11 @@ void gl2psPrintPostScriptPixmap(GLfloat x, GLfloat y, GLsizei width, GLsizei hei nbhex = width * height * 2; fprintf(stream, "%%%% nbhex digit :%d\n", nbhex); } - else if(nbit == 2){ + else if(nbits == 2){ /* color, 2 bits for r and g and b; rgbs following each other */ nbyte2 = (width * 3)/4; nbyte2 /=3; nbyte2 *=3; col_max = (nbyte2 * 4)/3; - /* 2 bit for r and g and b */ - /* rgbs following each other */ fprintf(stream, "/rgbstr %d string def\n", nbyte2); fprintf(stream, "%d %d %d\n", col_max, height, 2); fprintf(stream, "[ %d 0 0 -%d 0 %d ]\n", col_max, height, height); @@ -1382,39 +1362,33 @@ void gl2psPrintPostScriptPixmap(GLfloat x, GLfloat y, GLsizei width, GLsizei hei fprintf(stream, "colorimage\n" ); for(row = 0; row < height; row++){ for(col = 0; col < col_max; col+=4){ - status = gl2psGetRGB(pixels, width, height, - col, row, &dr, &dg, &db) == 0 ? 0 : status; - red = (Uchar)(3. * dr); - green = (Uchar)(3. * dg); - blue = (Uchar)(3. * db); + gl2psGetRGB(pixels, width, height, col, row, &dr, &dg, &db); + red = (unsigned char)(3. * dr); + green = (unsigned char)(3. * dg); + blue = (unsigned char)(3. * db); b = red; b = (b<<2)+green; b = (b<<2)+blue; - status = gl2psGetRGB(pixels, width, height, - col+1, row, &dr, &dg, &db) == 0 ? 0 : status; - red = (Uchar)(3. * dr); - green = (Uchar)(3. * dg); - blue = (Uchar)(3. * db); + gl2psGetRGB(pixels, width, height, col+1, row, &dr, &dg, &db); + red = (unsigned char)(3. * dr); + green = (unsigned char)(3. * dg); + blue = (unsigned char)(3. * db); b = (b<<2)+red; gl2psWriteByte(stream, b); - b = green; b = (b<<2)+blue; - status = gl2psGetRGB(pixels, width, height, - col+2, row, &dr, &dg, &db) == 0 ? 0 : status; - red = (Uchar)(3. * dr); - green = (Uchar)(3. * dg); - blue = (Uchar)(3. * db); + gl2psGetRGB(pixels, width, height, col+2, row, &dr, &dg, &db); + red = (unsigned char)(3. * dr); + green = (unsigned char)(3. * dg); + blue = (unsigned char)(3. * db); b = (b<<2)+red; b = (b<<2)+green; gl2psWriteByte(stream, b); - b = blue; - status = gl2psGetRGB(pixels,width,height, - col+3, row, &dr, &dg, &db) == 0 ? 0 : status; - red = (Uchar)(3. * dr); - green = (Uchar)(3. * dg); - blue = (Uchar)(3. * db); + gl2psGetRGB(pixels, width, height, col+3, row, &dr, &dg, &db); + red = (unsigned char)(3. * dr); + green = (unsigned char)(3. * dg); + blue = (unsigned char)(3. * db); b = (b<<2)+red; b = (b<<2)+green; b = (b<<2)+blue; @@ -1423,42 +1397,36 @@ void gl2psPrintPostScriptPixmap(GLfloat x, GLfloat y, GLsizei width, GLsizei hei fprintf(stream, "\n"); } } - else if(nbit == 4){ + else if(nbits == 4){ /* color, 4 bits for r and g and b; rgbs following each other */ nbyte4 = (width * 3)/2; nbyte4 /=3; nbyte4 *=3; col_max = (nbyte4 * 2)/3; - /* 4 bit for r and g and b */ - /* rgbs following each other */ fprintf(stream, "/rgbstr %d string def\n", nbyte4); - fprintf(stream, "%d %d %d\n", col_max, height,4); + fprintf(stream, "%d %d %d\n", col_max, height, 4); fprintf(stream, "[ %d 0 0 -%d 0 %d ]\n", col_max, height, height); fprintf(stream, "{ currentfile rgbstr readhexstring pop }\n"); fprintf(stream, "false 3\n"); fprintf(stream, "colorimage\n"); for(row = 0; row < height; row++){ for(col = 0; col < col_max; col+=2){ - status = gl2psGetRGB(pixels, width, height, - col, row, &dr, &dg, &db) == 0 ? 0 : status; - red = (Uchar)(15. * dr); - green = (Uchar)(15. * dg); + gl2psGetRGB(pixels, width, height, col, row, &dr, &dg, &db); + red = (unsigned char)(15. * dr); + green = (unsigned char)(15. * dg); fprintf(stream, "%x%x", red, green); - blue = (Uchar)(15. * db); - - status = gl2psGetRGB(pixels, width, height, - col+1, row, &dr, &dg, &db) == 0 ? 0 : status; - red = (Uchar)(15. * dr); + blue = (unsigned char)(15. * db); + gl2psGetRGB(pixels, width, height, col+1, row, &dr, &dg, &db); + red = (unsigned char)(15. * dr); fprintf(stream,"%x%x",blue,red); - green = (Uchar)(15. * dg); - blue = (Uchar)(15. * db); + green = (unsigned char)(15. * dg); + blue = (unsigned char)(15. * db); fprintf(stream, "%x%x", green, blue); } fprintf(stream, "\n"); } } - else{ + else{ /* color, 8 bits for r and g and b; rgbs following each other */ nbyte8 = width * 3; - /* 8 bit for r and g and b */ fprintf(stream, "/rgbstr %d string def\n", nbyte8); fprintf(stream, "%d %d %d\n", width, height, 8); fprintf(stream, "[ %d 0 0 -%d 0 %d ]\n", width, height, height); @@ -1467,22 +1435,18 @@ void gl2psPrintPostScriptPixmap(GLfloat x, GLfloat y, GLsizei width, GLsizei hei fprintf(stream, "colorimage\n"); for(row = 0; row < height; row++){ for(col = 0; col < width; col++){ - status = gl2psGetRGB(pixels, width, height, - col, row, &dr, &dg, &db) == 0 ? 0 : status; - red = (Uchar)(255. * dr); + gl2psGetRGB(pixels, width, height, col, row, &dr, &dg, &db); + red = (unsigned char)(255. * dr); gl2psWriteByte(stream, red); - green = (Uchar)(255. * dg); + green = (unsigned char)(255. * dg); gl2psWriteByte(stream, green); - blue = (Uchar)(255. * db); + blue = (unsigned char)(255. * db); gl2psWriteByte(stream, blue); } fprintf(stream, "\n"); } } - if(status == 0){ - gl2psMsg(GL2PS_ERROR, "Problem to retrieve some pixel rgb"); - } fprintf(stream, "grestore\n"); } @@ -1543,7 +1507,7 @@ void gl2psPrintPostScriptHeader(void){ fprintf(gl2ps->stream, "%%%%BeginProlog\n" "/gl2psdict 64 dict def gl2psdict begin\n" - "1 setlinecap 1 setlinejoin\n" + "0 setlinecap 0 setlinejoin\n" "/tryPS3shading %s def %% set to false to force subdivision\n" "/rThreshold %g def %% red component subdivision threshold\n" "/gThreshold %g def %% green component subdivision threshold\n" @@ -1917,15 +1881,26 @@ GLint gl2psPrintTeXEndViewport(void){ GLint gl2psPrintPrimitives(void){ GL2PSbsptree *root; GL2PSxyz eye = {0., 0., 100000.}; - GLint res = GL2PS_SUCCESS; + GLint used; void (*pprim)(void *a, void *b) = 0; + used = glRenderMode(GL_RENDER); + + if(used < 0){ + gl2psMsg(GL2PS_INFO, "OpenGL feedback buffer overflow"); + return GL2PS_OVERFLOW; + } + + if(used == 0){ + return GL2PS_NO_FEEDBACK; /* Empty feedback buffer */ + } + if(gl2ps->format == GL2PS_PS || gl2ps->format == GL2PS_EPS){ - res = gl2psParseFeedbackBuffer(); + gl2psParseFeedbackBuffer(used); } - if(res != GL2PS_SUCCESS){ - return res; + if(!gl2psListNbr(gl2ps->primitives)){ + return GL2PS_SUCCESS; /* Nothing to print */ } switch(gl2ps->format){ @@ -1974,13 +1949,12 @@ GLint gl2psPrintPrimitives(void){ break; default : gl2psMsg(GL2PS_ERROR, "Unknown sorting algorithm: %d", gl2ps->sort); - res = GL2PS_ERROR; - break; + return GL2PS_ERROR; } fflush(gl2ps->stream); - return res; + return GL2PS_SUCCESS; } /* The public routines */ diff --git a/Graphics/gl2ps.h b/Graphics/gl2ps.h index 67624ef16c055febd42eaed98ed7b15810bae79f..4c8dd62e9d869d022a4b7210dc61910f987ab2a4 100644 --- a/Graphics/gl2ps.h +++ b/Graphics/gl2ps.h @@ -2,7 +2,7 @@ * GL2PS, an OpenGL to PostScript Printing Library * Copyright (C) 1999-2003 Christophe Geuzaine * - * $Id: gl2ps.h,v 1.39 2003-06-02 18:26:22 geuzaine Exp $ + * $Id: gl2ps.h,v 1.40 2003-06-12 17:39:33 geuzaine Exp $ * * E-mail: geuz@geuz.org * URL: http://www.geuz.org/gl2ps/ @@ -57,7 +57,7 @@ #define GL2PS_MAJOR_VERSION 0 #define GL2PS_MINOR_VERSION 9 -#define GL2PS_PATCH_VERSION 0 +#define GL2PS_PATCH_VERSION 1 #define GL2PS_VERSION (GL2PS_MAJOR_VERSION + \ 0.01 * GL2PS_MINOR_VERSION + \