# HG changeset patch # User Pantxo Diribarne # Date 1399839890 -7200 # Node ID 1288a2f2776939dfc12a8f1ab1eb010e5690acc4 # Parent 89e275a4f6f65b92b6230fa8e724255d1895abef Handle non "points" fontunits properties (bug # 40158) * graphics.in.h (axes and text properties): new hidden, read-only properties "fontsize_points" * graphics.in.h (text properties): declare custom set/update methods for "fontunits" property * graphics.cc (text::properties::set_fontunits, text::properties::update_fontunits): new methods borrowed from axes::properties * graphics.cc (text::properties::update_font, axes::properties::update_font): use new property "fontsize_points" * gl-render.cc (opengl_renderer::set_font): use new property "fontsize_points" * gl-render.cc (opengl_renderer::draw_text): call set_font * gl2ps-renderer.cc (glps_renderer::set_font): use new property "fontsize_points" diff -r 89e275a4f6f6 -r 1288a2f27769 libinterp/corefcn/gl-render.cc --- a/libinterp/corefcn/gl-render.cc Sat Aug 23 17:53:48 2014 -0400 +++ b/libinterp/corefcn/gl-render.cc Sun May 11 22:24:50 2014 +0200 @@ -2652,6 +2652,8 @@ if (props.get_string ().is_empty ()) return; + set_font (props); + Matrix pos = xform.scale (props.get_data_position ()); const Matrix bbox = props.get_extent_matrix (); @@ -2886,7 +2888,7 @@ text_renderer.set_font (props.get ("fontname").string_value (), props.get ("fontweight").string_value (), props.get ("fontangle").string_value (), - props.get ("fontsize").double_value ()); + props.get ("fontsize_points").double_value ()); #endif } diff -r 89e275a4f6f6 -r 1288a2f27769 libinterp/corefcn/gl2ps-renderer.cc --- a/libinterp/corefcn/gl2ps-renderer.cc Sat Aug 23 17:53:48 2014 -0400 +++ b/libinterp/corefcn/gl2ps-renderer.cc Sun May 11 22:24:50 2014 +0200 @@ -182,7 +182,7 @@ { opengl_renderer::set_font (props); - fontsize = props.get ("fontsize").double_value (); + fontsize = props.get ("fontsize_points").double_value (); caseless_str fn = props.get ("fontname").string_value (); fontname = ""; diff -r 89e275a4f6f6 -r 1288a2f27769 libinterp/corefcn/graphics.cc --- a/libinterp/corefcn/graphics.cc Sat Aug 23 17:53:48 2014 -0400 +++ b/libinterp/corefcn/graphics.cc Sun May 11 22:24:50 2014 +0200 @@ -6197,7 +6197,7 @@ text_renderer.set_font (get ("fontname").string_value (), get ("fontweight").string_value (), get ("fontangle").string_value (), - get ("fontsize").double_value ()); + get ("fontsize_points").double_value ()); #endif #endif } @@ -7816,6 +7816,40 @@ } void +text::properties::set_fontunits (const octave_value& v) +{ + if (! error_state) + { + caseless_str old_fontunits = get_fontunits (); + if (fontunits.set (v, true)) + { + update_fontunits (old_fontunits); + mark_modified (); + } + } +} + +void +text::properties::update_fontunits (const caseless_str& old_units) +{ + caseless_str new_units = get_fontunits (); + double parent_height = 0; + double fsz = get_fontsize (); + + if (new_units == "normalized") + { + graphics_object go (gh_manager::get_object (get___myhandle__ ())); + graphics_object ax (go.get_ancestor ("axes")); + + parent_height = ax.get_properties ().get_boundingbox (true).elem (3); + } + + fsz = convert_font_size (fsz, old_units, new_units, parent_height); + + set_fontsize (octave_value (fsz)); +} + +void text::properties::update_font (void) { #ifdef HAVE_FREETYPE @@ -7823,7 +7857,7 @@ renderer.set_font (get ("fontname").string_value (), get ("fontweight").string_value (), get ("fontangle").string_value (), - get ("fontsize").double_value ()); + get ("fontsize_points").double_value ()); #endif renderer.set_color (get_color_rgb ()); #endif diff -r 89e275a4f6f6 -r 1288a2f27769 libinterp/corefcn/graphics.in.h --- a/libinterp/corefcn/graphics.in.h Sat Aug 23 17:53:48 2014 -0400 +++ b/libinterp/corefcn/graphics.in.h Sun May 11 22:24:50 2014 +0200 @@ -3848,6 +3848,8 @@ row_vector_property xmtick h , Matrix () row_vector_property ymtick h , Matrix () row_vector_property zmtick h , Matrix () + // hidden property for text rendering + double_property fontsize_points hgr , 0 END_PROPERTIES protected: @@ -4368,7 +4370,7 @@ radio_property fontangle u , "{normal}|italic|oblique" string_property fontname u , OCTAVE_DEFAULT_FONTNAME double_property fontsize u , 10 - radio_property fontunits , "inches|centimeters|normalized|{points}|pixels" + radio_property fontunits SU , "inches|centimeters|normalized|{points}|pixels" radio_property fontweight u , "light|{normal}|demi|bold" radio_property horizontalalignment mu , "{left}|center|right" radio_property interpreter u , "{tex}|none|latex" @@ -4394,6 +4396,8 @@ radio_property horizontalalignmentmode hu , "{auto}|manual" radio_property verticalalignmentmode hu , "{auto}|manual" radio_property autopos_tag h , "{none}|xlabel|ylabel|zlabel|title" + // hidden property for text rendering + double_property fontsize_points hgr , 0 END_PROPERTIES Matrix get_data_position (void) const; @@ -4458,6 +4462,7 @@ void update_verticalalignment (void) { update_text_extent (); } void update_units (void); + void update_fontunits (const caseless_str& old_fontunits); private: std::string cached_units;