Mercurial > hg > octave-nkf
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
new file mode 100644 --- /dev/null +++ b/src/gl2ps-renderer.cc @@ -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: *** +*/