diff -pruN blender-2.42a.orig/source/blender/makesdna/DNA_scene_types.h blender-2.42a/source/blender/makesdna/DNA_scene_types.h
--- blender-2.42a.orig/source/blender/makesdna/DNA_scene_types.h	2006-08-26 12:50:40.000000000 +0200
+++ blender-2.42a/source/blender/makesdna/DNA_scene_types.h	2006-08-26 12:51:15.000000000 +0200
@@ -491,6 +491,9 @@ typedef struct Scene {
 #define R_FRAMESERVER   25
 #define R_CINEON	26
 #define R_DPX		27
+#define R_EPS   28
+#define R_PDF   29
+#define R_SVG   30
 
 /* subimtype, flag options for imtype */
 #define R_OPENEXR_HALF	1
diff -pruN blender-2.42a.orig/source/blender/src/buttons_scene.c blender-2.42a/source/blender/src/buttons_scene.c
--- blender-2.42a.orig/source/blender/src/buttons_scene.c	2006-08-26 12:50:43.000000000 +0200
+++ blender-2.42a/source/blender/src/buttons_scene.c	2006-08-26 12:51:15.000000000 +0200
@@ -1112,6 +1112,17 @@ static char *imagetype_pup(void)
 	sprintf(appendstring, formatstring, "OpenEXR", R_OPENEXR);
 	strcat(string, appendstring);
 #endif
+
+  /* vector output formats */
+	strcpy(formatstring, "|%s %%x%d");  // EPS
+	strcat(formatstring, "|%s %%x%d");	// add space for PDF
+	strcat(formatstring, "|%s %%x%d");	// add space for SVG
+	sprintf(appendstring, formatstring,
+			"EPS",            R_EPS,
+			"PDF",            R_PDF,
+			"SVG",            R_SVG);
+	strcat(string, appendstring);
+  
 	
 	if (G.have_libtiff) {
 		strcpy(formatstring, "|%s %%x%d");
diff -pruN blender-2.42a.orig/source/blender/src/screendump.c blender-2.42a/source/blender/src/screendump.c
--- blender-2.42a.orig/source/blender/src/screendump.c	2006-08-26 12:50:44.000000000 +0200
+++ blender-2.42a/source/blender/src/screendump.c	2006-08-26 12:54:38.000000000 +0200
@@ -33,6 +33,8 @@
 
 #include <string.h>
 
+#include <gl2ps.h>
+
 #include "MEM_guardedalloc.h"
 
 #include "BLI_blenlib.h"
@@ -59,12 +61,102 @@
 #include "BIF_writeimage.h"
 
 #include "BSE_filesel.h"
+#include "BSE_drawview.h"
 
 #include "mydevice.h"
 
 static unsigned int *dumprect=0;
 static int dumpsx, dumpsy;
 
+/* 
+ * Proof of concept of vector output via gl2ps.
+ *
+ * gl2ps iw written by Christophe Geuzaine.
+ * See http://www.geuz.org/gl2ps/ for more infos.
+ * 
+ * Antonio Ospite <ospite@studenti.unina.it>
+ */
+
+int writeimage_vector(char *name, GLint filetype, GLint options)
+{
+  FILE *fp;
+  GLint buffsize = 0;
+  GLint state = GL2PS_OVERFLOW;
+  GLint viewport[4];
+
+  if((fp=fopen(name, "wb")) == NULL)
+    return(FALSE);
+
+  /* restore the viewport to the 3d view window */
+  areawinset(curarea->win); 
+  
+  /* get the viewport */
+  glGetIntegerv(GL_VIEWPORT, viewport);
+
+  gl2psEnable(GL2PS_BLEND); 
+  //gl2psEnable(GL2PS_POLYGON_OFFSET_FILL); 
+
+  while( state == GL2PS_OVERFLOW )
+  {
+    buffsize += 1024*1024;
+
+    gl2psBeginPage( "3dView Dump", //Title
+                    "Blender", //Producer
+                    viewport, // the viewport
+                    filetype, //Format
+                    GL2PS_BSP_SORT, //Sorting method
+                    options, // Options
+                    GL_RGBA, //Color mode
+                    0, //Colorsize (ONLY for GL_COLOR_INDEX mode)
+                    NULL, //Colortable (ONLY for GL_COLOR_INDEX mode)
+                    0, 0, 0, //nr, ng, nb (use default)
+                    buffsize,
+                    fp, name );
+
+    /* redraw the 3dView using OpenGL */
+    drawview3dspace(curarea, curarea->spacedata.first);
+    
+    state = gl2psEndPage();
+  }
+
+  fclose(fp);
+
+  return(TRUE);
+}
+
+
+void write_screendump_vector(char *name)
+{
+  GLint filetype = GL2PS_EPS;
+  GLint options = GL2PS_OCCLUSION_CULL | GL2PS_BEST_ROOT | GL2PS_TIGHT_BOUNDING_BOX;
+    
+	strcpy(G.ima, name);
+	BLI_convertstringcode(name, G.sce, G.scene->r.cfra);
+
+	if(saveover(name)) {
+		waitcursor(1);
+
+    switch(G.scene->r.imtype) {
+      case R_EPS:
+        filetype = GL2PS_EPS;
+        break;
+      case R_PDF:
+        filetype = GL2PS_PDF;
+        break;
+      case R_SVG:
+        filetype = GL2PS_SVG;
+        break;
+      default:
+        break;
+    }
+    
+  if(!writeimage_vector(name, filetype, options))
+    fprintf(stderr, "Cant't dump the 3dView to a vector format!\n");
+
+  waitcursor(0);
+  }
+}
+
 void write_screendump(char *name)
 {
 	ImBuf *ibuf;
@@ -106,6 +198,20 @@ void BIF_screendump(int fscreen)
 	static int wasmenu= 0;
 	int x=0, y=0;
 	char imstr[64];
+  
+
+  /* handle dump in vector format */
+  if(ELEM3(G.scene->r.imtype, R_EPS, R_PDF, R_SVG)) {
+    
+    if(curarea->spacetype != SPACE_VIEW3D) {
+      /* Using gl2ps we can dump only the 3dView to a vector format */
+      error("When dumping in vector format be sure to have 3dView as the active Subwindow!");
+    } else {
+      save_image_filesel_str(imstr);
+      activate_fileselect(FILE_SPECIAL, imstr, G.ima, write_screendump_vector);
+    }
+    return;
+  }
 
 	/* this sets dumpsx/y to zero if ismenu==0 */
 	ismenu= uiIsMenu(&x, &y, &dumpsx, &dumpsy);
diff -pruN blender-2.42a.orig/source/blender/src/writeimage.c blender-2.42a/source/blender/src/writeimage.c
--- blender-2.42a.orig/source/blender/src/writeimage.c	2006-08-26 12:50:44.000000000 +0200
+++ blender-2.42a/source/blender/src/writeimage.c	2006-08-26 12:59:57.000000000 +0200
@@ -203,6 +203,16 @@ void save_image_filesel_str(char *str)
 		case R_TARGA:
 			strcpy(str, "Save Targa");
 			break;
+
+		case R_EPS:
+			strcpy(str, "Save EPS");
+			break;
+		case R_PDF:
+			strcpy(str, "Save PDF");
+			break;
+		case R_SVG:
+			strcpy(str, "Save SVG");
+			break;
 			
 			/* default we save jpeg, also for all movie formats */
 		case R_JPEG90:
@@ -220,6 +230,12 @@ void save_image_filesel_str(char *str)
 void BIF_save_rendered_image_fs(int zbuf)
 {
 	RenderResult rres;
+
+  /* Do not save rendered image in vector format */
+  if(ELEM3(G.scene->r.imtype, R_EPS, R_PDF, R_SVG)) {
+		error("Cannot save image in vector format, use \"Dump Subwindow\" instead.");
+		return;
+  }
 	
 	RE_GetResultImage(RE_GetRender(G.scene->id.name), &rres);
 
