Salome HOME
Patch for gl2ps-1.3.9+, which allows use it for ParaView version 5.3.0 and higher.
authorrnv <rnv@opencascade.com>
Fri, 9 Jun 2017 13:03:21 +0000 (16:03 +0300)
committerrnv <rnv@opencascade.com>
Fri, 9 Jun 2017 13:03:21 +0000 (16:03 +0300)
config/patches/gl2ps.002_for_pv.patch [new file with mode: 0644]

diff --git a/config/patches/gl2ps.002_for_pv.patch b/config/patches/gl2ps.002_for_pv.patch
new file mode 100644 (file)
index 0000000..fae9b0a
--- /dev/null
@@ -0,0 +1,300 @@
+diff -Naur gl2ps-1.3.9-svn-20160620_SRC_orig/gl2ps.c gl2ps-1.3.9-svn-20160620_SRC_modif/gl2ps.c
+--- gl2ps-1.3.9-svn-20160620_SRC_orig/gl2ps.c  2016-06-13 01:01:29.000000000 +0300
++++ gl2ps-1.3.9-svn-20160620_SRC_modif/gl2ps.c 2017-04-03 12:15:38.395464392 +0300
+@@ -42,6 +42,11 @@
+ #include <time.h>
+ #include <float.h>
++// not defined until VC8 (VS2005)
++#if _MSC_VER && _MSC_VER < 1400 && !defined(vsnprintf)
++#define vsnprintf _vsnprintf
++#endif
++
+ #if defined(GL2PS_HAVE_ZLIB)
+ #include <zlib.h>
+ #endif
+@@ -163,6 +168,7 @@
+   GLushort pattern;
+   char boundary, offset, culled;
+   GLint factor;
++  GLint sortid; /* Used to stabilize qsort sorting */
+   GLfloat width, ofactor, ounits;
+   GL2PSvertex *verts;
+   union {
+@@ -597,6 +603,15 @@
+   qsort(list->array, list->n, list->size, fcmp);
+ }
++/* Must be a list of GL2PSprimitives. */
++static void gl2psListAssignSortIds(GL2PSlist *list)
++{
++  GLint i;
++  for(i = 0; i < gl2psListNbr(list); i++){
++    (*(GL2PSprimitive**)gl2psListPointer(list, i))->sortid = i;
++  }
++}
++
+ static void gl2psListAction(GL2PSlist *list, void (*action)(void *data))
+ {
+   GLint i;
+@@ -850,7 +865,8 @@
+ static GLint gl2psAddText(GLint type, const char *str, const char *fontname,
+                           GLshort fontsize, GLint alignment, GLfloat angle,
+-                          GL2PSrgba color)
++                          GL2PSrgba color, GLboolean setblpos,
++                          GLfloat blx, GLfloat bly)
+ {
+   GLfloat pos[4];
+   GL2PSprimitive *prim;
+@@ -875,11 +891,16 @@
+   prim = (GL2PSprimitive*)gl2psMalloc(sizeof(GL2PSprimitive));
+   prim->type = type;
+   prim->boundary = 0;
+-  prim->numverts = 1;
+-  prim->verts = (GL2PSvertex*)gl2psMalloc(sizeof(GL2PSvertex));
++  prim->numverts = setblpos ? 2 : 1;
++  prim->verts = (GL2PSvertex*)gl2psMalloc(sizeof(GL2PSvertex) * prim->numverts);
+   prim->verts[0].xyz[0] = pos[0];
+   prim->verts[0].xyz[1] = pos[1];
+   prim->verts[0].xyz[2] = pos[2];
++  if (setblpos) {
++    prim->verts[1].xyz[0] = blx;
++    prim->verts[1].xyz[1] = bly;
++    prim->verts[1].xyz[2] = 0;
++  }
+   prim->culled = 0;
+   prim->offset = 0;
+   prim->ofactor = 0.0;
+@@ -1434,7 +1455,8 @@
+     return 1;
+   }
+   else{
+-    return 0;
++    /* Ensure that initial ordering is preserved when depths match. */
++    return q->sortid < w->sortid ? -1 : 1;
+   }
+ }
+@@ -3492,8 +3514,47 @@
+   }
+ }
+-static void gl2psPutPDFSpecial(GL2PSstring *text)
++/*
++  This is used for producing alligned text in PDF. (x, y) is the anchor for the
++  alligned text, (xbl, ybl) is the bottom left corner. Rotation happens
++  around (x, y).*/
++static void gl2psPutPDFTextBL(GL2PSstring *text, int cnt, GLfloat x, GLfloat y,
++                              GLfloat xbl, GLfloat ybl)
+ {
++  if(text->angle == 0.0F){
++    gl2ps->streamlength += gl2psPrintf
++      ("BT\n"
++       "/F%d %d Tf\n"
++       "%f %f Td\n"
++       "(%s) Tj\n"
++       "ET\n",
++       cnt, text->fontsize, xbl, ybl, text->str);
++  }
++  else{
++    GLfloat a, ca, sa;
++    GLfloat pi = 3.141593F;
++    GLfloat i = atan2(y - ybl, x - xbl);
++    GLfloat r = sqrt((y - ybl) * (y - ybl) + (x - xbl) * (x - xbl));
++
++    a = (GLfloat)(pi * text->angle / 180.0F);
++    sa = (GLfloat)sin(a);
++    ca = (GLfloat)cos(a);
++    gl2ps->streamlength += gl2psPrintf
++      ("BT\n"
++       "/F%d %d Tf\n"
++       "%f %f %f %f %f %f Tm\n"
++       "(%s) Tj\n"
++       "ET\n",
++       cnt, text->fontsize,
++       ca, sa, -sa, ca,
++       xbl + r * (cos(i) - cos(i + a)), ybl + r * (sin(i) - sin(i+a)), text->str);
++  }
++}
++
++
++static void gl2psPutPDFSpecial(int prim, int sec, GL2PSstring *text)
++{
++  gl2ps->streamlength += gl2psPrintf("/GS%d%d gs\n", prim, sec);
+   gl2ps->streamlength += gl2psPrintf("%s\n", text->str);
+ }
+@@ -3689,7 +3750,7 @@
+ static void gl2psPDFgroupListWriteMainStream(void)
+ {
+-  int i, j, lastel;
++  int i, j, lastel, count;
+   GL2PSprimitive *prim = NULL, *prev = NULL;
+   GL2PSpdfgroup *gro;
+   GL2PStriangle t;
+@@ -3697,7 +3758,9 @@
+   if(!gl2ps->pdfgrouplist)
+     return;
+-  for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){
++  count = gl2psListNbr(gl2ps->pdfgrouplist);
++
++  for(i = 0; i < count; ++i){
+     gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i);
+     lastel = gl2psListNbr(gro->ptrlist) - 1;
+@@ -3863,14 +3926,26 @@
+       for(j = 0; j <= lastel; ++j){
+         prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j);
+         gl2ps->streamlength += gl2psPrintPDFFillColor(prim->verts[0].rgba);
+-        gl2psPutPDFText(prim->data.text, gro->fontno, prim->verts[0].xyz[0],
+-                        prim->verts[0].xyz[1]);
++        if (prim->numverts == 2) {
++          gl2psPutPDFTextBL(prim->data.text, gro->fontno, prim->verts[0].xyz[0],
++                            prim->verts[0].xyz[1],
++                            prim->verts[1].xyz[0],
++                            prim->verts[1].xyz[1]);
++        }
++        else {
++          gl2psPutPDFText(prim->data.text, gro->fontno, prim->verts[0].xyz[0],
++                          prim->verts[0].xyz[1]);
++        }
+       }
+       break;
+     case GL2PS_SPECIAL:
++      lastel = gl2psListNbr(gro->ptrlist) - 1;
++      if(lastel < 0)
++        continue;
++
+       for(j = 0; j <= lastel; ++j){
+         prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j);
+-        gl2psPutPDFSpecial(prim->data.text);
++        gl2psPutPDFSpecial(i, j, prim->data.text);
+       }
+     default:
+       break;
+@@ -3883,17 +3958,39 @@
+ static int gl2psPDFgroupListWriteGStateResources(void)
+ {
+   GL2PSpdfgroup *gro;
++  GL2PSprimitive* prim;
++  float op = 1;
+   int offs = 0;
+-  int i;
++  int i, j;
++  int index = 0;
++  int lastel;
+   offs += fprintf(gl2ps->stream,
+                   "/ExtGState\n"
+                   "<<\n"
+                   "/GSa 7 0 R\n");
++
+   for(i = 0; i < gl2psListNbr(gl2ps->pdfgrouplist); ++i){
+     gro = (GL2PSpdfgroup*)gl2psListPointer(gl2ps->pdfgrouplist, i);
+     if(gro->gsno >= 0)
++    {
+       offs += fprintf(gl2ps->stream, "/GS%d %d 0 R\n", gro->gsno, gro->gsobjno);
++      index = gro->gsno;
++    }
++
++    lastel = gl2psListNbr(gro->ptrlist) - 1;
++    if(lastel < 0)
++      continue;
++
++    for(j = 0; j <= lastel; ++j)
++    {
++      prim = *(GL2PSprimitive**)gl2psListPointer(gro->ptrlist, j);
++      if (prim->type == GL2PS_SPECIAL)
++      {
++      op = prim->verts[0].rgba[3];
++      offs += fprintf(gl2ps->stream, "/GS%d%d <<\n /CA %f\n /ca %f\n >>\n", i, j, op, op);
++      }
++    }
+   }
+   offs += fprintf(gl2ps->stream, ">>\n");
+   return offs;
+@@ -5659,6 +5756,7 @@
+     gl2psListReset(gl2ps->primitives);
+     break;
+   case GL2PS_SIMPLE_SORT :
++    gl2psListAssignSortIds(gl2ps->primitives);
+     gl2psListSort(gl2ps->primitives, gl2psCompareDepth);
+     if(gl2ps->options & GL2PS_OCCLUSION_CULL){
+       gl2psListActionInverse(gl2ps->primitives, gl2psAddInImageTree);
+@@ -5970,24 +6068,39 @@
+                                      GL2PSrgba color)
+ {
+   return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle,
+-                      color);
++                      color, GL_FALSE, 0, 0);
++}
++
++/**
++ * This version of gl2psTextOptColor is used to go around the
++ * fact that PDF does not support text allignment. The extra parameters
++ * (blx, bly) represent the bottom left corner of the text bounding box.
++ */
++GL2PSDLL_API GLint gl2psTextOptColorBL(const char *str, const char *fontname,
++                                       GLshort fontsize, GLint alignment, GLfloat angle,
++                                       GL2PSrgba color, GLfloat blx, GLfloat bly)
++{
++  return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle,
++                      color, GL_TRUE, blx, bly);
+ }
++
+ GL2PSDLL_API GLint gl2psTextOpt(const char *str, const char *fontname,
+                                 GLshort fontsize, GLint alignment, GLfloat angle)
+ {
+-  return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, NULL);
++  return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, alignment, angle, NULL,
++                      GL_FALSE, 0, 0);
+ }
+ GL2PSDLL_API GLint gl2psText(const char *str, const char *fontname, GLshort fontsize)
+ {
+   return gl2psAddText(GL2PS_TEXT, str, fontname, fontsize, GL2PS_TEXT_BL, 0.0F,
+-                      NULL);
++                      NULL, GL_FALSE, 0, 0);
+ }
+-GL2PSDLL_API GLint gl2psSpecial(GLint format, const char *str)
++GL2PSDLL_API GLint gl2psSpecial(GLint format, const char *str, GL2PSrgba rgba)
+ {
+-  return gl2psAddText(GL2PS_SPECIAL, str, "", 0, format, 0.0F, NULL);
++  return gl2psAddText(GL2PS_SPECIAL, str, "", 0, format, 0.0F, rgba, GL_FALSE, 0, 0);
+ }
+ GL2PSDLL_API GLint gl2psDrawPixels(GLsizei width, GLsizei height,
+diff -Naur gl2ps-1.3.9-svn-20160620_SRC_orig/gl2ps.h gl2ps-1.3.9-svn-20160620_SRC_modif/gl2ps.h
+--- gl2ps-1.3.9-svn-20160620_SRC_orig/gl2ps.h  2016-01-17 02:01:36.000000000 +0300
++++ gl2ps-1.3.9-svn-20160620_SRC_modif/gl2ps.h 2017-04-03 12:37:34.712023470 +0300
+@@ -202,7 +202,10 @@
+ GL2PSDLL_API GLint gl2psTextOptColor(const char *str, const char *fontname,
+                                      GLshort fontsize, GLint align, GLfloat angle,
+                                      GL2PSrgba color);
+-GL2PSDLL_API GLint gl2psSpecial(GLint format, const char *str);
++GL2PSDLL_API GLint gl2psTextOptColorBL(const char *str, const char *fontname,
++                                     GLshort fontsize, GLint alignment, GLfloat angle,
++                                     GL2PSrgba color, GLfloat blx, GLfloat bly);
++GL2PSDLL_API GLint gl2psSpecial(GLint format, const char *str, GL2PSrgba rgba);
+ GL2PSDLL_API GLint gl2psDrawPixels(GLsizei width, GLsizei height,
+                                    GLint xorig, GLint yorig,
+                                    GLenum format, GLenum type, const void *pixels);
+diff -Naur gl2ps-1.3.9-svn-20160620_SRC_orig/gl2psTest.c gl2ps-1.3.9-svn-20160620_SRC_modif/gl2psTest.c
+--- gl2ps-1.3.9-svn-20160620_SRC_orig/gl2psTest.c      2015-10-18 01:02:00.000000000 +0300
++++ gl2ps-1.3.9-svn-20160620_SRC_modif/gl2psTest.c     2017-04-03 12:39:08.752428106 +0300
+@@ -292,8 +292,8 @@
+   glRasterPos2d(x, 1.15);
+   printstring(format_string, 0.);
+-
+-  gl2psSpecial(GL2PS_TEX, "% This should only be printed in LaTeX output!");
++  GL2PSrgba rgba = {-1.0F, -1.0F, -1.0F, -1.0F};
++  gl2psSpecial(GL2PS_TEX, "% This should only be printed in LaTeX output!", rgba);
+ }
+ void cube()