Mercurial > hg > octave-terminal
changeset 9834:92d8f35ff217
compute bounding boxes for text in opengl graphics backend
author | Shai Ayal <shaiay@users.sourceforge.net> |
---|---|
date | Wed, 18 Nov 2009 23:14:09 -0500 |
parents | 637fa784d102 |
children | 1bb1ed717d2f |
files | src/ChangeLog src/gl-render.cc src/gl-render.h src/gl2ps-renderer.cc |
diffstat | 4 files changed, 55 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,15 @@ +2009-11-14 Shai Ayal <shaiay@users.sourceforge.net> + + * gl-render.cc (opengl_renderer::text_to_pixels): + New function from code in render_text to produce the pixels and + compute bounding box. + (opengl_renderer::render_text): Call text_to_pixels to compute + rotation mode and bounding box. + * gl-renger.h (opengl_renderer::text_to_pixels): Provide decl. + * gl2ps-renderer.cc (glps_renderer::render_text): + Call text_to_pixels to compute bounding box. + (glps_renderer::set_font): Call opengl_renderer::set_font. + 2009-11-18 Michael Godfrey <godfrey@isl.stanford.edu> * txt-eng-ft.cc: Relax font match test.
--- a/src/gl-render.cc +++ b/src/gl-render.cc @@ -3140,18 +3140,16 @@ return ID; } -Matrix -opengl_renderer::render_text (const std::string& txt, - double x, double y, double z, - int halign, int valign, double rotation) +void +opengl_renderer::text_to_pixels (const std::string& txt, + double rotation, + uint8NDArray& pixels, + Matrix& bbox, + int& rot_mode) { -#if HAVE_FREETYPE - if (txt.empty ()) - return Matrix (1, 4, 0.0); - // FIXME: clip "rotation" between 0 and 360 - int rot_mode = ft_render::ROTATION_0; + rot_mode = ft_render::ROTATION_0; if (rotation == 90.0) rot_mode = ft_render::ROTATION_90; @@ -3161,8 +3159,24 @@ rot_mode = ft_render::ROTATION_270; text_element *elt = text_parser_none ().parse (txt); + pixels = text_renderer.render (elt, bbox, rot_mode); + delete elt; +} + +Matrix +opengl_renderer::render_text (const std::string& txt, + double x, double y, double z, + int halign, int valign, double rotation) +{ +#if HAVE_FREETYPE + if (txt.empty ()) + return Matrix (1, 4, 0.0); + Matrix bbox; - uint8NDArray pixels = text_renderer.render (elt, bbox, rot_mode); + uint8NDArray pixels; + int rot_mode; + text_to_pixels (txt, rotation, pixels, bbox, rot_mode); + int x0 = 0, y0 = 0; int w = bbox(2), h = bbox(3); @@ -3216,8 +3230,6 @@ if (! blend) glDisable (GL_BLEND); - delete elt; - return bbox; #else ::warning ("render_text: cannot render text, Freetype library not available");
--- a/src/gl-render.h +++ b/src/gl-render.h @@ -95,9 +95,15 @@ virtual void draw_marker (double x, double y, double z, const Matrix& lc, const Matrix& fc); + virtual void text_to_pixels (const std::string& txt, + double rotation, + uint8NDArray& pixels, + Matrix& bbox, + int& rot_mode); + virtual Matrix render_text (const std::string& txt, - double x, double y, double z, - int halign, int valign, double rotation = 0.0); + double x, double y, double z, + int halign, int valign, double rotation = 0.0); private: opengl_renderer (const opengl_renderer&) { }
--- a/src/gl2ps-renderer.cc +++ b/src/gl2ps-renderer.cc @@ -76,10 +76,8 @@ double x, double y, double z, int ha, int va, double rotation) { - Matrix retval = Matrix (1, 4, 0.0); - if (txt.empty ()) - return retval; + return Matrix (1, 4, 0.0); int gl2psa=GL2PS_TEXT_BL; if (ha == 0) @@ -114,13 +112,21 @@ gl2psTextOpt (txt.c_str (), fontname.c_str (), fontsize, gl2psa, rotation); - // FIXME -- we have no way of getting a bounding box from gl2ps - return retval; + // FIXME? -- we have no way of getting a bounding box from gl2ps, so + // we use freetype + Matrix bbox; + uint8NDArray pixels; + int rot_mode; + text_to_pixels (txt, rotation, pixels, bbox, rot_mode); + + return bbox; } void glps_renderer::set_font (const base_properties& props) { + opengl_renderer::set_font (props); + fontsize = props.get ("fontsize").double_value (); caseless_str fn = props.get ("fontname").string_value ();