diff src/gl2ps-renderer.cc @ 9798:2d6a5af744b6

printing for fltk backend using gl2ps
author Shai Ayal <shaiay@users.sourceforge.net>
date Tue, 10 Nov 2009 19:48:02 -0500
parents
children 92d8f35ff217
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gl2ps-renderer.cc	Tue Nov 10 19:48:02 2009 -0500
@@ -0,0 +1,148 @@
+/*
+
+Copyright (C) 2009 Shai Ayal
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if defined (HAVE_OPENGL)
+
+#include <cstdio>
+
+#include "lo-mappers.h"
+#include "oct-locbuf.h"
+
+#include "gl2ps-renderer.h"
+#include "gl2ps.h"
+
+void 
+glps_renderer::draw (const graphics_object& go) 
+{
+  static bool in_draw = false;
+  
+  if (!in_draw) 
+    {
+      in_draw = true;
+
+      FILE *fp = fopen (filename.c_str (), "wb");
+      GLint buffsize = 0, state = GL2PS_OVERFLOW;
+      GLint viewport[4];
+
+      glGetIntegerv (GL_VIEWPORT, viewport);
+
+      while (state == GL2PS_OVERFLOW)
+	{ 
+	  buffsize += 1024*1024;
+	  gl2psBeginPage ("glps_renderer figure", "Octave", viewport,
+			  GL2PS_EPS, GL2PS_BSP_SORT,
+			  (GL2PS_SILENT | GL2PS_SIMPLE_LINE_OFFSET
+			   | GL2PS_NO_BLENDING | GL2PS_OCCLUSION_CULL
+			   | GL2PS_BEST_ROOT), GL_RGBA, 0, NULL, 0, 0, 0,
+			  buffsize, fp, filename.c_str () );
+
+	  opengl_renderer::draw (go);
+	  state = gl2psEndPage ();
+	}
+
+      fclose (fp);
+
+      in_draw = 0;
+    }
+  else
+    opengl_renderer::draw (go); 
+}
+
+Matrix 
+glps_renderer::render_text (const std::string& txt,
+			    double x, double y, double z,
+			    int ha, int va, double rotation)
+{
+  Matrix retval = Matrix (1, 4, 0.0);
+
+  if (txt.empty ())
+    return retval;
+
+  int gl2psa=GL2PS_TEXT_BL;
+  if (ha == 0)
+    {
+      if (va == 0 || va == 3)
+	gl2psa=GL2PS_TEXT_BL;
+      else if (va == 2)
+	gl2psa=GL2PS_TEXT_TL;
+      else if (va == 1)
+	gl2psa=GL2PS_TEXT_CL;
+    }
+  else if (ha == 2)
+    {
+      if (va == 0 || va == 3)
+	gl2psa=GL2PS_TEXT_BR;
+      else if (va == 2)
+	gl2psa=GL2PS_TEXT_TR;
+      else if (va == 1)
+	gl2psa=GL2PS_TEXT_CR;
+    }
+  else if (ha == 1)
+    {
+      if (va == 0 || va == 3)
+	gl2psa=GL2PS_TEXT_B;
+      else if (va == 2)
+	gl2psa=GL2PS_TEXT_T;
+      else if (va == 1)
+	gl2psa=GL2PS_TEXT_C;
+    }
+
+  glRasterPos3d (x, y, z);
+
+  gl2psTextOpt (txt.c_str (), fontname.c_str (), fontsize, gl2psa, rotation);
+
+  // FIXME -- we have no way of getting a bounding box from gl2ps
+  return retval;
+}
+
+void
+glps_renderer::set_font (const base_properties& props)
+{
+  fontsize = props.get ("fontsize").double_value ();
+
+  caseless_str fn = props.get ("fontname").string_value ();
+  fontname = "";
+  if (fn == "times" || fn == "times-roman")
+    fontname = "Times-Roman";
+  else if (fn == "courier")
+    fontname = "Courier";
+  else if (fn == "symbol")
+    fontname = "Symbol";
+  else if (fn == "zapfdingbats")
+    fontname = "ZapfDingbats";
+  else 
+    fontname = "Helvetica";
+
+  // FIXME -- add support for bold and italic
+}
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/