From e177e2a897f4bff86f1b0d15992626bc09a71807 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Wed, 29 Dec 2004 17:48:47 +0000
Subject: [PATCH] use the alignement capabilities of GL2PS for TeX output (this
 allows gmsh to create nicely aligned labels even with equations)

---
 Fltk/Opengl.cpp      | 91 ++++++++++++++++++++++++------------------
 Graphics/Draw.h      |  2 +
 Graphics/Graph2D.cpp | 20 +++++-----
 Graphics/Scale.cpp   | 94 +++++++++++++++++++++++++++-----------------
 4 files changed, 120 insertions(+), 87 deletions(-)

diff --git a/Fltk/Opengl.cpp b/Fltk/Opengl.cpp
index c7d7c1ea39..9e0448b789 100644
--- a/Fltk/Opengl.cpp
+++ b/Fltk/Opengl.cpp
@@ -1,4 +1,4 @@
-// $Id: Opengl.cpp,v 1.46 2004-12-28 23:59:48 geuzaine Exp $
+// $Id: Opengl.cpp,v 1.47 2004-12-29 17:48:47 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -66,62 +66,75 @@ void Draw(void)
   WID->redraw_opengl();
 }
 
-void Draw_String(char *s)
+void Draw_String(char *s, char *font_name, int font_enum, int font_size, int align)
 {
+  if(align > 0){
+    // change the raster position only if not creating TeX files
+    if(CTX.print.gl_fonts || (CTX.print.format != FORMAT_TEX)){
+      GLboolean valid;
+      glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid);
+      if(valid == GL_TRUE){
+	GLfloat pos[4];
+	glGetFloatv(GL_CURRENT_RASTER_POSITION, pos);
+	gl_font(font_enum, font_size);
+	float width = gl_width(s);
+	if(align == 1) // center
+	  glRasterPos2d(pos[0]-width/2., pos[1]);
+	else if(align == 2) // right
+	  glRasterPos2d(pos[0]-width, pos[1]);
+      }
+    }
+  }
+  
   if(CTX.print.gl_fonts) {
-    gl_font(CTX.gl_font_enum, CTX.gl_fontsize);
+    gl_font(font_enum, font_size);
     gl_draw(s);
   }
-  else {        // ps or *tex output
+  else { // ps, pdf or *tex output
     if(CTX.print.format == FORMAT_JPEGTEX ||
        CTX.print.format == FORMAT_PNGTEX)
       return;
-    gl2psText(s, CTX.gl_font, CTX.gl_fontsize);
+    if(CTX.print.format == FORMAT_TEX)
+      gl2psTextOpt(s, font_name, font_size, 
+		   (align == 0) ? GL2PS_TEXT_BL :
+		   (align == 1) ? GL2PS_TEXT_B :
+		   GL2PS_TEXT_BR, 0.);
+    else
+      gl2psText(s, font_name, font_size);
   }
 }
 
+void Draw_String(char *s)
+{
+  Draw_String(s, CTX.gl_font, CTX.gl_font_enum, CTX.gl_fontsize, 0);
+}
+
+void Draw_String_Center(char *s)
+{
+  Draw_String(s, CTX.gl_font, CTX.gl_font_enum, CTX.gl_fontsize, 1);
+}
+
+void Draw_String_Right(char *s)
+{
+  Draw_String(s, CTX.gl_font, CTX.gl_font_enum, CTX.gl_fontsize, 2);
+}
+
 void Draw_String(char *s, double style)
 {
   unsigned int bits = (unsigned int)style;
 
   if(!bits){ // use defaults
     Draw_String(s);
-    return;
   }
-
-  int size = (bits & 0xff);
-  int font = (bits>>8 & 0xff);
-  int align = (bits>>16 & 0xff);
-  
-  int oldsize = CTX.gl_fontsize;
-  int oldfont_enum = CTX.gl_font_enum;
-  char * oldfont = CTX.gl_font;
-  
-  CTX.gl_font_enum = GetFontEnum(font);
-  CTX.gl_font = GetFontName(font);
-  if(size)
-    CTX.gl_fontsize = size;
-  if(align > 0){
-    GLboolean valid;
-    glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID, &valid);
-    if(valid == GL_TRUE){
-      GLfloat pos[4];
-      glGetFloatv(GL_CURRENT_RASTER_POSITION, pos);
-      gl_font(CTX.gl_font_enum, CTX.gl_fontsize);
-      float width = gl_width(s);
-      if(align == 1) // center
-	glRasterPos2d(pos[0]-width/2., pos[1]);
-      else if(align == 2) // right
-	glRasterPos2d(pos[0]-width, pos[1]);
-    }
+  else{
+    int size = (bits & 0xff);
+    int font = (bits>>8 & 0xff);
+    int align = (bits>>16 & 0xff);
+    int font_enum = GetFontEnum(font);
+    char *font_name = GetFontName(font);
+    if(!size) size = CTX.gl_fontsize;
+    Draw_String(s, font_name, font_enum, size, align);
   }
-
-  Draw_String(s);
-  
-  CTX.gl_font_enum = oldfont_enum;
-  CTX.gl_font = oldfont;
-  if(size)
-    CTX.gl_fontsize = oldsize;
 }
 
 void Draw_OnScreenMessages()
diff --git a/Graphics/Draw.h b/Graphics/Draw.h
index 837454f6b1..2ccb9502f9 100644
--- a/Graphics/Draw.h
+++ b/Graphics/Draw.h
@@ -61,6 +61,8 @@ void Draw(void);
 
 void Draw_String(char *s);
 void Draw_String(char *s, double style);
+void Draw_String_Center(char *s);
+void Draw_String_Right(char *s);
 void Draw_Geom(Mesh *m);
 void Draw_Post(void);
 void Draw_Graph2D(void);
diff --git a/Graphics/Graph2D.cpp b/Graphics/Graph2D.cpp
index 4173801e0b..e43f99429b 100644
--- a/Graphics/Graph2D.cpp
+++ b/Graphics/Graph2D.cpp
@@ -1,4 +1,4 @@
-// $Id: Graph2D.cpp,v 1.41 2004-12-28 23:59:48 geuzaine Exp $
+// $Id: Graph2D.cpp,v 1.42 2004-12-29 17:48:47 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -190,9 +190,8 @@ static void Draw_Graph2D(Post_View * v,
     if(v->ShowScale) {
       glColor4ubv((GLubyte *) & CTX.color.text);
       sprintf(label, v->Format, (i == nb) ? ValMin : (ValMax - i * dv));
-      glRasterPos2d(xtop - gl_width(label) - 2 * tic,
-		    ytop - i * dy - font_a / 3.);
-      Draw_String(label);
+      glRasterPos2d(xtop - 2 * tic, ytop - i * dy - font_a / 3.);
+      Draw_String_Right(label);
     }
   }
 
@@ -204,8 +203,8 @@ static void Draw_Graph2D(Post_View * v,
       sprintf(label, "%s (%g)", v->Name, *(double *)List_Pointer(v->Time, v->TimeStep));
     else
       sprintf(label, "%s", v->Name);
-    glRasterPos2d(xtop - gl_width(label) / 2., ytop + font_h + tic);
-    Draw_String(label);
+    glRasterPos2d(xtop, ytop + font_h + tic);
+    Draw_String_Center(label);
   }
 
   // x tics + labels
@@ -279,16 +278,15 @@ static void Draw_Graph2D(Post_View * v,
       else
         sprintf(label, v->AbscissaFormat,
                 AbsMin + i * (AbsMax - AbsMin) / (double)(nb - 1));
-      glRasterPos2d(xtop + i * dx - gl_width(label) / 2.,
-                    ybot - font_h - tic);
-      Draw_String(label);
+      glRasterPos2d(xtop + i * dx, ybot - font_h - tic);
+      Draw_String_Center(label);
     }
   }
   if(v->ShowScale) {
     glColor4ubv((GLubyte *) & CTX.color.text);
     sprintf(label, "%s", v->AbscissaName);
-    glRasterPos2d(xtop + width / 2 - gl_width(label) / 2., ybot - 2 * font_h - 2 * tic);
-    Draw_String(label);
+    glRasterPos2d(xtop + width / 2, ybot - 2 * font_h - 2 * tic);
+    Draw_String_Center(label);
   }
 
   // the curve(s)
diff --git a/Graphics/Scale.cpp b/Graphics/Scale.cpp
index b8cc305071..70042d5158 100644
--- a/Graphics/Scale.cpp
+++ b/Graphics/Scale.cpp
@@ -1,4 +1,4 @@
-// $Id: Scale.cpp,v 1.53 2004-11-25 02:10:32 geuzaine Exp $
+// $Id: Scale.cpp,v 1.54 2004-12-29 17:48:47 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -182,42 +182,55 @@ void draw_scale(Post_View * v,
     if(v->IntervalsType == DRAW_POST_DISCRETE ||
        v->IntervalsType == DRAW_POST_CONTINUOUS) {
       sprintf(label, v->Format, ValMin);
-      if(horizontal)
-	glRasterPos2d(xmin - gl_width(label)/2., ymin + height + tic);
-      else
+      if(horizontal){
+	glRasterPos2d(xmin, ymin + height + tic);
+	Draw_String_Center(label);
+      }
+      else{
 	glRasterPos2d(xmin + width + tic, ymin - font_a / 3.);
-      Draw_String(label);
-
+	Draw_String(label);
+      }
       sprintf(label, v->Format, ValMax);
-      if(horizontal)
-	glRasterPos2d(xmin + width - gl_width(label)/2., ymin + height + tic);
-      else
+      if(horizontal){
+	glRasterPos2d(xmin + width, ymin + height + tic);
+	Draw_String_Center(label);
+      }
+      else{
 	glRasterPos2d(xmin + width + tic, ymin + height - font_a / 3.);
-      Draw_String(label);
+	Draw_String(label);
+      }
     }
     else {
       sprintf(label, v->Format, ValMin);
-      if(horizontal)
-	glRasterPos2d(xmin + (box / 2) - gl_width(label)/2., ymin + height + tic);
-      else
+      if(horizontal){
+	glRasterPos2d(xmin + (box / 2), ymin + height + tic);
+	Draw_String_Center(label);
+      }
+      else{
 	glRasterPos2d(xmin + width + tic, ymin + (box / 2) - font_a / 3.);
-      Draw_String(label);
-
+	Draw_String(label);
+      }
       sprintf(label, v->Format, ValMax);
-      if(horizontal)
-	glRasterPos2d(xmin + width - (box / 2) - gl_width(label)/2., ymin + height + tic);
-      else
+      if(horizontal){
+	glRasterPos2d(xmin + width - (box / 2), ymin + height + tic);
+	Draw_String_Center(label);
+      }
+      else{
 	glRasterPos2d(xmin + width + tic, ymin + height - (box / 2) - font_a / 3.);
-      Draw_String(label);
+	Draw_String(label);
+      }
     }
     if(nbv == -2){
       double Val = v->GVFI(ValMin, ValMax, v->NbIso, v->NbIso/2);
       sprintf(label, v->Format, Val);
-      if(horizontal)
-	glRasterPos2d(xmin + width/2. - gl_width(label)/2., ymin + height + tic);
-      else
+      if(horizontal){
+	glRasterPos2d(xmin + width/2., ymin + height + tic);
+	Draw_String_Center(label);
+      }
+      else{
 	glRasterPos2d(xmin + width + tic, ymin + height/2 - font_a / 3.);
-      Draw_String(label);
+	Draw_String(label);
+      }
     }
   }
   else {
@@ -226,23 +239,28 @@ void draw_scale(Post_View * v,
       for(int i = 0; i < nbv + 1; i++) {
         double Val = v->GVFI(ValMin, ValMax, nbv + 1, i);
         sprintf(label, v->Format, Val);
-	if(horizontal)
-	  glRasterPos2d(xmin + i * cv_box - gl_width(label) / 2., ymin + height + tic);
-	else
+	if(horizontal){
+	  glRasterPos2d(xmin + i * cv_box, ymin + height + tic);
+	  Draw_String_Center(label);
+	}
+	else{
 	  glRasterPos2d(xmin + width + tic, ymin + i * cv_box - font_a / 3.);
-        Draw_String(label);
+	  Draw_String(label);
+	}
       }
     }
     else {
       for(int i = 0; i < nbv; i++) {
         double Val = v->GVFI(ValMin, ValMax, nbv, i);
         sprintf(label, v->Format, Val);
-	if(horizontal)
-	  glRasterPos2d(xmin + (2 * i + 1) * (cv_box / 2) - gl_width(label) / 2., 
-			ymin + height + tic);
-	else
+	if(horizontal){
+	  glRasterPos2d(xmin + (2 * i + 1) * (cv_box / 2), ymin + height + tic);
+	  Draw_String_Center(label);
+	}
+	else{
 	  glRasterPos2d(xmin + width + tic, ymin + (2 * i + 1) * (cv_box / 2) - font_a / 3.);
-        Draw_String(label);
+	  Draw_String(label);
+	}
       }
     }
   }
@@ -255,12 +273,14 @@ void draw_scale(Post_View * v,
   else
     sprintf(label, "%s", v->Name);
 
-  if(horizontal)
-    glRasterPos2d(xmin + width / 2. - gl_width(label) / 2., ymin + height + tic + 1.4*font_h);
-  else
+  if(horizontal){
+    glRasterPos2d(xmin + width / 2., ymin + height + tic + 1.4*font_h);
+    Draw_String_Center(label);
+  }
+  else{
     glRasterPos2d(xmin, ymin - 2 * font_h);
-
-  Draw_String(label);
+    Draw_String(label);
+  }
 }
 
 void Draw_Scales(void)
-- 
GitLab