From 8912a8364bd318047ae8e7e4c0870144dbd6c163 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Fri, 5 Mar 2004 23:47:35 +0000
Subject: [PATCH] New raster ("bitmap") PS/EPS/PDF output

---
 Fltk/Callbacks.cpp      |  69 ++++++++++++---------
 Fltk/Callbacks.h        |   4 +-
 Fltk/GUI.cpp            |  10 +--
 Graphics/CreateFile.cpp | 132 ++++++++++++++++++++++++++--------------
 Graphics/gl2ps.cpp      |  19 +++---
 Mesh/Mesh.h             |  52 ++++++++--------
 doc/FAQ                 |   5 +-
 doc/VERSIONS            |   5 +-
 8 files changed, 175 insertions(+), 121 deletions(-)

diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 8dbf1433a7..bc9a1d791b 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.208 2004-02-28 05:52:37 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.209 2004-03-05 23:47:35 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -465,6 +465,10 @@ void _save_vrml(char *name)
 {
   CreateOutputFile(name, CTX.mesh.format = FORMAT_VRML);
 }
+void _save_ps_raster(char *name)
+{
+  CreateOutputFile(name, FORMAT_PS_RASTER);
+}
 void _save_ps_simple(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -479,6 +483,10 @@ void _save_ps_accurate(char *name)
   CreateOutputFile(name, FORMAT_PS);
   CTX.print.eps_quality = old;
 }
+void _save_eps_raster(char *name)
+{
+  CreateOutputFile(name, FORMAT_EPS_RASTER);
+}
 void _save_eps_simple(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -493,19 +501,9 @@ void _save_eps_accurate(char *name)
   CreateOutputFile(name, FORMAT_EPS);
   CTX.print.eps_quality = old;
 }
-void _save_pstex_simple(char *name)
+void _save_epstex_raster(char *name)
 {
-  int old = CTX.print.eps_quality;
-  CTX.print.eps_quality = 1;
-  CreateOutputFile(name, FORMAT_PSTEX);
-  CTX.print.eps_quality = old;
-}
-void _save_pstex_accurate(char *name)
-{
-  int old = CTX.print.eps_quality;
-  CTX.print.eps_quality = 2;
-  CreateOutputFile(name, FORMAT_PSTEX);
-  CTX.print.eps_quality = old;
+  CreateOutputFile(name, FORMAT_EPSTEX_RASTER);
 }
 void _save_epstex_simple(char *name)
 {
@@ -521,6 +519,10 @@ void _save_epstex_accurate(char *name)
   CreateOutputFile(name, FORMAT_EPSTEX);
   CTX.print.eps_quality = old;
 }
+void _save_pdf_raster(char *name)
+{
+  CreateOutputFile(name, FORMAT_PDF_RASTER);
+}
 void _save_pdf_simple(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -535,6 +537,10 @@ void _save_pdf_accurate(char *name)
   CreateOutputFile(name, FORMAT_PDF);
   CTX.print.eps_quality = old;
 }
+void _save_pdftex_raster(char *name)
+{
+  CreateOutputFile(name, FORMAT_PDFTEX_RASTER);
+}
 void _save_pdftex_simple(char *name)
 {
   int old = CTX.print.eps_quality;
@@ -638,12 +644,15 @@ void file_save_as_cb(CALLBACK_ARGS)
 #if defined(HAVE_LIBPNG)
     {"PNG (*.png)", _save_png},
 #endif
-    {"PostScript fast (*.ps)", _save_ps_simple},
-    {"PostScript accurate (*.ps)", _save_ps_accurate},
-    {"Encapsulated PostScript fast (*.eps)", _save_eps_simple},
-    {"Encapsulated PostScript accurate (*.eps)", _save_eps_accurate},
-    {"PDF fast (*.pdf)", _save_pdf_simple},
-    {"PDF accurate (*.pdf)", _save_pdf_accurate},
+    {"Raster PS (*.ps)", _save_ps_raster},
+    {"Raster EPS (*.eps)", _save_eps_raster},
+    {"Raster PDF (*.pdf)", _save_pdf_raster},
+    {"Vector PS fast (*.ps)", _save_ps_simple},
+    {"Vector PS accurate (*.ps)", _save_ps_accurate},
+    {"Vector EPS fast (*.eps)", _save_eps_simple},
+    {"Vector EPS accurate (*.eps)", _save_eps_accurate},
+    {"Vector PDF fast (*.pdf)", _save_pdf_simple},
+    {"Vector PDF accurate (*.pdf)", _save_pdf_accurate},
     {"PPM (*.ppm)", _save_ppm},
 #if defined(HAVE_LIBJPEG)
     {"LaTeX JPEG part (*.jpg)", _save_jpegtex},
@@ -651,10 +660,12 @@ void file_save_as_cb(CALLBACK_ARGS)
 #if defined(HAVE_LIBPNG)
     {"LaTeX PNG part (*.png)", _save_pngtex},
 #endif
-    {"LaTeX EPS part fast (*.eps)", _save_epstex_simple},
-    {"LaTeX EPS part accurate (*.eps)", _save_epstex_accurate},
-    {"LaTeX PDF part fast (*.pdf)", _save_pdftex_simple},
-    {"LaTeX PDF part accurate (*.pdf)", _save_pdftex_accurate},
+    {"LaTeX Raster EPS part (*.eps)", _save_epstex_raster},
+    {"LaTeX Raster PDF part (*.pdf)", _save_pdftex_raster},
+    {"LaTeX Vector EPS part fast (*.eps)", _save_epstex_simple},
+    {"LaTeX Vector EPS part accurate (*.eps)", _save_epstex_accurate},
+    {"LaTeX Vector PDF part fast (*.pdf)", _save_pdftex_simple},
+    {"LaTeX Vector PDF part accurate (*.pdf)", _save_pdftex_accurate},
     {"LaTeX TeX part (*.tex)", _save_tex},
     {"UCB YUV (*.yuv)", _save_yuv}
   };
@@ -757,16 +768,16 @@ void file_save_as_ps_accurate_cb(CALLBACK_ARGS)
     _save_ps_accurate(file_chooser_get_name(1));
 }
 
-void file_save_as_pstex_simple_cb(CALLBACK_ARGS)
+void file_save_as_epstex_simple_cb(CALLBACK_ARGS)
 {
-  if(file_chooser(0, 1, "Save LaTeX file (PS part)", "*", 0))
-    _save_pstex_simple(file_chooser_get_name(1));
+  if(file_chooser(0, 1, "Save LaTeX file (EPS part)", "*", 0))
+    _save_epstex_simple(file_chooser_get_name(1));
 }
 
-void file_save_as_pstex_accurate_cb(CALLBACK_ARGS)
+void file_save_as_epstex_accurate_cb(CALLBACK_ARGS)
 {
-  if(file_chooser(0, 1, "Save LaTeX file (PS part)", "*", 0))
-    _save_ps_accurate(file_chooser_get_name(1));
+  if(file_chooser(0, 1, "Save LaTeX file (EPS part)", "*", 0))
+    _save_epstex_accurate(file_chooser_get_name(1));
 }
 
 void file_save_as_jpegtex_cb(CALLBACK_ARGS)
diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h
index ed426e70d6..bfb9512082 100644
--- a/Fltk/Callbacks.h
+++ b/Fltk/Callbacks.h
@@ -57,8 +57,8 @@ void file_save_as_gref_cb(CALLBACK_ARGS) ;
 void file_save_as_vrml_cb(CALLBACK_ARGS) ;
 void file_save_as_ps_simple_cb(CALLBACK_ARGS) ;
 void file_save_as_ps_accurate_cb(CALLBACK_ARGS) ;
-void file_save_as_pstex_simple_cb(CALLBACK_ARGS) ;
-void file_save_as_pstex_accurate_cb(CALLBACK_ARGS) ;
+void file_save_as_epstex_simple_cb(CALLBACK_ARGS) ;
+void file_save_as_epstex_accurate_cb(CALLBACK_ARGS) ;
 void file_save_as_jpegtex_cb(CALLBACK_ARGS) ;
 void file_save_as_pngtex_cb(CALLBACK_ARGS) ;
 void file_save_as_tex_cb(CALLBACK_ARGS) ;
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index daef0d4e89..d726ce982e 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.276 2004-03-01 17:58:49 geuzaine Exp $
+// $Id: GUI.cpp,v 1.277 2004-03-05 23:47:35 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -112,8 +112,8 @@ Fl_Menu_Item m_menubar_table[] = {
 #if defined(HAVE_LIBPNG)
          {"PNG (*.png)...",               0, (Fl_Callback *)file_save_as_png_cb, 0},
 #endif
-         {"PostScript fast (*.ps)...",    0, (Fl_Callback *)file_save_as_ps_simple_cb, 0},
-         {"PostScript accurate...",       0, (Fl_Callback *)file_save_as_ps_accurate_cb, 0},
+         {"Vector PS fast (*.ps)...",     0, (Fl_Callback *)file_save_as_ps_simple_cb, 0},
+         {"Vector PS accurate...",        0, (Fl_Callback *)file_save_as_ps_accurate_cb, 0},
          {"PPM (*.ppm)...",               0, (Fl_Callback *)file_save_as_ppm_cb, 0},
 #if defined(HAVE_LIBJPEG)
          {"LaTeX JPEG...",                0, (Fl_Callback *)file_save_as_jpegtex_cb, 0},
@@ -121,8 +121,8 @@ Fl_Menu_Item m_menubar_table[] = {
 #if defined(HAVE_LIBPNG)
          {"LaTeX PNG...",                 0, (Fl_Callback *)file_save_as_pngtex_cb, 0},
 #endif
-         {"LaTeX PostScript fast...",     0, (Fl_Callback *)file_save_as_pstex_simple_cb, 0},
-         {"LaTeX PostScript accurate...", 0, (Fl_Callback *)file_save_as_pstex_accurate_cb, 0},
+         {"LaTeX Vector EPS fast...",     0, (Fl_Callback *)file_save_as_epstex_simple_cb, 0},
+         {"LaTeX Vector EPS accurate...", 0, (Fl_Callback *)file_save_as_epstex_accurate_cb, 0},
          {"LaTeX TeX (*.tex)...",         0, (Fl_Callback *)file_save_as_tex_cb, 0},
          {"UCB YUV (*.yuv)...",           0, (Fl_Callback *)file_save_as_yuv_cb, 0},
          {0},
diff --git a/Graphics/CreateFile.cpp b/Graphics/CreateFile.cpp
index 464203e608..9915765126 100644
--- a/Graphics/CreateFile.cpp
+++ b/Graphics/CreateFile.cpp
@@ -1,4 +1,4 @@
-// $Id: CreateFile.cpp,v 1.52 2004-02-07 01:40:19 geuzaine Exp $
+// $Id: CreateFile.cpp,v 1.53 2004-03-05 23:47:35 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -48,7 +48,7 @@ void FillBuffer(void)
 void CreateOutputFile(char *name, int format)
 {
   FILE *fp;
-  GLint size3d, viewport[4];
+  GLint size3d, viewport[4], width, height;
   char ext[256];
   int len, res, oldformat, psformat, pssort, psoptions;
 
@@ -59,7 +59,9 @@ void CreateOutputFile(char *name, int format)
   CTX.print.format = format;
 
   for(int i = 0; i < 4; i++) viewport[i] = CTX.viewport[i];
-
+  width = viewport[2]-viewport[0];
+  height = viewport[3]-viewport[1];
+  
   switch (format) {
 
   case FORMAT_AUTO:
@@ -89,19 +91,17 @@ void CreateOutputFile(char *name, int format)
     else if(!strcmp(ext, ".png"))
       CreateOutputFile(name, FORMAT_PNG);
     else if(!strcmp(ext, ".ps"))
-      CreateOutputFile(name, FORMAT_PS);
+      CreateOutputFile(name, FORMAT_PS_RASTER);
     else if(!strcmp(ext, ".eps"))
-      CreateOutputFile(name, FORMAT_EPS);
+      CreateOutputFile(name, FORMAT_EPS_RASTER);
     else if(!strcmp(ext, ".pdf"))
-      CreateOutputFile(name, FORMAT_PDF);
+      CreateOutputFile(name, FORMAT_PDF_RASTER);
     else if(!strcmp(ext, ".tex"))
       CreateOutputFile(name, FORMAT_TEX);
-    else if(!strcmp(ext, ".pstex"))
-      CreateOutputFile(name, FORMAT_PSTEX);
     else if(!strcmp(ext, ".epstex"))
-      CreateOutputFile(name, FORMAT_EPSTEX);
+      CreateOutputFile(name, FORMAT_EPSTEX_RASTER);
     else if(!strcmp(ext, ".pdftex"))
-      CreateOutputFile(name, FORMAT_PDFTEX);
+      CreateOutputFile(name, FORMAT_PDFTEX_RASTER);
     else if(!strcmp(ext, ".jpegtex"))
       CreateOutputFile(name, FORMAT_JPEGTEX);
     else if(!strcmp(ext, ".ppm"))
@@ -149,12 +149,12 @@ void CreateOutputFile(char *name, int format)
     CTX.print.gl_fonts = 1;
     if(format == FORMAT_JPEG || format == FORMAT_JPEGTEX){
       Msg(INFO, "Writing JPEG file '%s'", name);
-      create_jpeg(fp, viewport[2]-viewport[0], viewport[3]-viewport[1], CTX.print.jpeg_quality);
+      create_jpeg(fp, width, height, CTX.print.jpeg_quality);
       Msg(INFO, "Wrote JPEG file '%s'", name);
     }
     else{
       Msg(INFO, "Writing PNG file '%s'", name);
-      create_png(fp, viewport[2]-viewport[0], viewport[3]-viewport[1], 100);
+      create_png(fp, width, height, 100);
       Msg(INFO, "Wrote PNG file '%s'", name);
     }
     Msg(STATUS2N, "Wrote '%s'", name);
@@ -171,17 +171,17 @@ void CreateOutputFile(char *name, int format)
     FillBuffer();
     if(format == FORMAT_PPM){
       Msg(INFO, "Writing PPM file '%s'", name);
-      create_ppm(fp, viewport[2]-viewport[0], viewport[3]-viewport[1]);
+      create_ppm(fp, width, height);
       Msg(INFO, "Wrote PPM file '%s'", name);
     }
     else if (format == FORMAT_YUV){
       Msg(INFO, "Writing YUV file '%s'", name);
-      create_yuv(fp, viewport[2]-viewport[0], viewport[3]-viewport[1]);
+      create_yuv(fp, width, height);
       Msg(INFO, "Wrote YUV file '%s'", name);
     }
     else{
       Msg(INFO, "Writing GIF file '%s'", name);
-      create_gif(fp, viewport[2]-viewport[0], viewport[3]-viewport[1],
+      create_gif(fp, width, height,
 		 CTX.print.gif_dither,
 		 CTX.print.gif_sort,
 		 CTX.print.gif_interlace,
@@ -195,50 +195,88 @@ void CreateOutputFile(char *name, int format)
     break;
 
   case FORMAT_PS:
-  case FORMAT_PSTEX:
+  case FORMAT_PS_RASTER:
   case FORMAT_EPS:
+  case FORMAT_EPS_RASTER:
   case FORMAT_EPSTEX:
+  case FORMAT_EPSTEX_RASTER:
   case FORMAT_PDF:
+  case FORMAT_PDF_RASTER:
   case FORMAT_PDFTEX:
+  case FORMAT_PDFTEX_RASTER:
     if(!(fp = fopen(name, "wb"))) {
       Msg(GERROR, "Unable to open file '%s'", name);
       return;
     }
 
-    if(format == FORMAT_PDF || format == FORMAT_PDFTEX){
+    switch(format){
+    case FORMAT_PDF:
+    case FORMAT_PDF_RASTER:
+    case FORMAT_PDFTEX:
+    case FORMAT_PDFTEX_RASTER:
       psformat = GL2PS_PDF;
+      break;
+    case FORMAT_PS:
+    case FORMAT_PS_RASTER:
+      psformat = GL2PS_PS;
+      break;
+    default:
+      psformat = GL2PS_EPS;
+      break;
     }
-    else{
-      if(format == FORMAT_PS || format == FORMAT_PSTEX)
-	psformat = GL2PS_PS;
-      else
-	psformat = GL2PS_EPS;
-    }
-
-    pssort = (CTX.print.eps_quality == 1) ? GL2PS_SIMPLE_SORT : GL2PS_BSP_SORT;
-    psoptions =
-      GL2PS_SIMPLE_LINE_OFFSET | GL2PS_SILENT | 
-      (CTX.print.eps_occlusion_culling ? GL2PS_OCCLUSION_CULL : 0) |
-      (CTX.print.eps_best_root ? GL2PS_BEST_ROOT : 0) |
-      (CTX.print.eps_background ? GL2PS_DRAW_BACKGROUND : 0) |
-      (CTX.print.eps_compress ? GL2PS_COMPRESS : 0) |
-      (format == FORMAT_PSTEX ? GL2PS_NO_TEXT : 0) |
-      (format == FORMAT_EPSTEX ? GL2PS_NO_TEXT : 0) |
-      (format == FORMAT_PDFTEX ? GL2PS_NO_TEXT : 0);
 
-    Msg(INFO, "Writing %s file '%s'", (psformat == GL2PS_PDF) ? "PDF" : "PS/EPS", name);
-
-    size3d = 0;
-    res = GL2PS_OVERFLOW;
-    while(res == GL2PS_OVERFLOW) {
-      size3d += 2048 * 2048;
-      gl2psBeginPage(CTX.base_filename, "Gmsh", viewport, 
-		     psformat, pssort, psoptions, GL_RGBA, 0, NULL, 
-		     0, 0, 0, size3d, fp, name);
-      CTX.print.gl_fonts = 0;
-      FillBuffer();
-      CTX.print.gl_fonts = 1;
-      res = gl2psEndPage();
+    {
+      int raster = 0;
+      float *pixels = NULL;
+      if(format == FORMAT_PS_RASTER || 
+	 format == FORMAT_EPS_RASTER || format == FORMAT_EPSTEX_RASTER ||
+	 format == FORMAT_PDF_RASTER || format == FORMAT_PDFTEX_RASTER){
+	if(format == FORMAT_EPSTEX_RASTER || format == FORMAT_PDFTEX_RASTER)
+	  CTX.print.gl_fonts = 0;
+	FillBuffer();
+	CTX.print.gl_fonts = 1;
+	pixels = new float[width * height * 3];
+	glReadPixels(0, 0, width, height, GL_RGB, GL_FLOAT, pixels);
+	raster = 1;
+      }
+      
+      pssort = (CTX.print.eps_quality == 1) ? GL2PS_SIMPLE_SORT : GL2PS_BSP_SORT;
+      psoptions =
+	GL2PS_SIMPLE_LINE_OFFSET | GL2PS_SILENT | 
+	(CTX.print.eps_occlusion_culling ? GL2PS_OCCLUSION_CULL : 0) |
+	(CTX.print.eps_best_root ? GL2PS_BEST_ROOT : 0) |
+	(CTX.print.eps_background ? GL2PS_DRAW_BACKGROUND : 0) |
+	(CTX.print.eps_compress ? GL2PS_COMPRESS : 0) |
+	(format == FORMAT_EPSTEX ? GL2PS_NO_TEXT : 0) |
+	(format == FORMAT_PDFTEX ? GL2PS_NO_TEXT : 0) |
+	(format == FORMAT_EPSTEX_RASTER ? GL2PS_NO_TEXT : 0) |
+	(format == FORMAT_PDFTEX_RASTER ? GL2PS_NO_TEXT : 0);
+      
+      Msg(INFO, "Writing %s file '%s'", (psformat == GL2PS_PDF) ? "PDF" : "PS/EPS", name);
+      
+      size3d = 0;
+      res = GL2PS_OVERFLOW;
+      while(res == GL2PS_OVERFLOW) {
+	size3d += 2048 * 2048;
+	gl2psBeginPage(CTX.base_filename, "Gmsh", viewport, 
+		       psformat, pssort, psoptions, GL_RGBA, 0, NULL, 
+		       0, 0, 0, size3d, fp, name);
+	if(raster){
+	  glMatrixMode(GL_PROJECTION);
+	  glLoadIdentity();
+	  glPushMatrix();
+	  glRasterPos3f(-1.0, -1.0, -1.0);
+	  gl2psDrawPixels(width, height, 0, 0, GL_RGB, GL_FLOAT, pixels);
+	  glPopMatrix();  
+	  delete [] pixels;
+	}
+	else{
+	  CTX.print.gl_fonts = 0;
+	  FillBuffer();
+	  CTX.print.gl_fonts = 1;
+	}
+	res = gl2psEndPage();
+      }
     }
     Msg(INFO, "Wrote %s file '%s'", (psformat == GL2PS_PDF) ? "PDF" : "PS/EPS", name);
     Msg(STATUS2N, "Wrote '%s'", name);
diff --git a/Graphics/gl2ps.cpp b/Graphics/gl2ps.cpp
index ef2ca30d79..e2462147d0 100644
--- a/Graphics/gl2ps.cpp
+++ b/Graphics/gl2ps.cpp
@@ -1,4 +1,4 @@
-/* $Id: gl2ps.cpp,v 1.83 2003-11-16 16:49:37 geuzaine Exp $ */
+/* $Id: gl2ps.cpp,v 1.84 2004-03-05 23:47:35 geuzaine Exp $ */
 /*
  * GL2PS, an OpenGL to PostScript Printing Library
  * Copyright (C) 1999-2003 Christophe Geuzaine <geuz@geuz.org>
@@ -3082,18 +3082,17 @@ GLint gl2psPrintPrimitives(void){
     return GL2PS_OVERFLOW;
   }
 
-  if(used == 0){
-    return GL2PS_NO_FEEDBACK; /* Empty feedback buffer */
-  }
-
-  if(gl2ps->format == GL2PS_PS || 
-     gl2ps->format == GL2PS_EPS ||
-     gl2ps->format == GL2PS_PDF){
-    gl2psParseFeedbackBuffer(used);
+  if(used > 0){
+    if(gl2ps->format == GL2PS_PS || 
+       gl2ps->format == GL2PS_EPS ||
+       gl2ps->format == GL2PS_PDF){
+      gl2psParseFeedbackBuffer(used);
+    }
   }
 
   if(!gl2psListNbr(gl2ps->primitives)){
-    return GL2PS_SUCCESS; /* Nothing to print */
+    /* Empty feedback buffer and/or nothing else to print */
+    return GL2PS_NO_FEEDBACK;
   }
 
   switch(gl2ps->format){
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
index 8ecbe6ba36..6b323635b4 100644
--- a/Mesh/Mesh.h
+++ b/Mesh/Mesh.h
@@ -28,30 +28,34 @@
 #include "ExtrudeParams.h"
 #include "STL.h"
 
-#define FORMAT_MSH     1
-#define FORMAT_UNV     2
-#define FORMAT_GREF    3
-#define FORMAT_XPM     4
-#define FORMAT_PS      5
-#define FORMAT_BMP     6
-#define FORMAT_GIF     7
-#define FORMAT_GEO     8
-#define FORMAT_JPEG    9
-#define FORMAT_AUTO    10
-#define FORMAT_PPM     11
-#define FORMAT_YUV     12
-#define FORMAT_SMS     14
-#define FORMAT_OPT     15
-#define FORMAT_PSTEX   16
-#define FORMAT_JPEGTEX 17
-#define FORMAT_TEX     18
-#define FORMAT_VRML    19
-#define FORMAT_EPS     20
-#define FORMAT_EPSTEX  21
-#define FORMAT_PNG     22
-#define FORMAT_PNGTEX  23
-#define FORMAT_PDF     24
-#define FORMAT_PDFTEX  25
+#define FORMAT_MSH           1
+#define FORMAT_UNV           2
+#define FORMAT_GREF          3
+#define FORMAT_XPM           4
+#define FORMAT_PS            5
+#define FORMAT_BMP           6
+#define FORMAT_GIF           7
+#define FORMAT_GEO           8
+#define FORMAT_JPEG          9
+#define FORMAT_AUTO          10
+#define FORMAT_PPM           11
+#define FORMAT_YUV           12
+#define FORMAT_SMS           14
+#define FORMAT_OPT           15
+#define FORMAT_JPEGTEX       17
+#define FORMAT_TEX           18
+#define FORMAT_VRML          19
+#define FORMAT_EPS           20
+#define FORMAT_EPSTEX        21
+#define FORMAT_PNG           22
+#define FORMAT_PNGTEX        23
+#define FORMAT_PDF           24
+#define FORMAT_PDFTEX        25
+#define FORMAT_PS_RASTER     26
+#define FORMAT_EPS_RASTER    27
+#define FORMAT_PDF_RASTER    28
+#define FORMAT_EPSTEX_RASTER 29
+#define FORMAT_PDFTEX_RASTER 30
 
 #define CONV_VALUE    0.8
 
diff --git a/doc/FAQ b/doc/FAQ
index 65caf62547..78da465ef6 100644
--- a/doc/FAQ
+++ b/doc/FAQ
@@ -1,4 +1,4 @@
-$Id: FAQ,v 1.33 2004-02-28 01:23:38 geuzaine Exp $
+$Id: FAQ,v 1.34 2004-03-05 23:47:35 geuzaine Exp $
 
 This is the Gmsh FAQ
 
@@ -60,7 +60,8 @@ as well as the GSL (version 1.2 or higher; freely available from
 http://sources.redhat.com/gsl/) and FLTK (version 1.1.x, configured
 with OpenGL support; freely available from http://www.fltk.org)
 installed on your system. You'll also need the jpeg library if you
-want to save jpeg images.
+want to save jpeg images, and the libpng and zlib libraries if you
+want to save png images.
 
 Under Windows, you will need the Cygwin tools and compilers (freely
 available from http://www.cygwin.com).
diff --git a/doc/VERSIONS b/doc/VERSIONS
index cfa8e70a2f..2c72d264e1 100644
--- a/doc/VERSIONS
+++ b/doc/VERSIONS
@@ -1,6 +1,7 @@
-$Id: VERSIONS,v 1.187 2004-03-04 18:05:43 geuzaine Exp $
+$Id: VERSIONS,v 1.188 2004-03-05 23:47:35 geuzaine Exp $
 
-New since 1.51: small bug fixes
+New since 1.51: new raster ("bitmap") PostScript/EPS/PDF output
+formats;
 
 New in 1.51: initial support for visualizing mesh partitions;
 integrated version 2.0 of the MSH mesh file format; new option to
-- 
GitLab