Mercurial > octave-nkf
diff libinterp/corefcn/txt-eng-ft.cc @ 17274:0a09d4b40767
Combine successive TeX super- and subscript elements.
* libinterp/corefcn/oct-tex-parser.yy (combined_script_element): New
rule. Add %nonassoc statements to control precedence and resolve
shoft/reduce conflicts.
* libinterp/corefcn/txt-eng.h (class text_element_combined): New class.
(text_processor::visit(text_element_combined)): New method.
* libinterp/corefcn/txt-eng-ft.h
(ft_render::visit(text_element_combined)): Likewise.
* libinterp/corefcn/txt-eng-ft.cc (ft_render::push_new_line): Reset
xoffset/yoffset in MODE_BBOX mode.
(ft_render::process_character): Use xoffset as the current X
advancement and update the line bbox accordingly.
(ft_render::visit(text_element_combined)): New method.
author | Michael Goffioul <michael.goffioul@gmail.com> |
---|---|
date | Sun, 18 Aug 2013 21:39:27 -0400 |
parents | 8ce6cdd272eb |
children | c8809de193a3 |
line wrap: on
line diff
--- a/libinterp/corefcn/txt-eng-ft.cc Sun Aug 18 18:19:48 2013 -0400 +++ b/libinterp/corefcn/txt-eng-ft.cc Sun Aug 18 21:39:27 2013 -0400 @@ -354,6 +354,8 @@ bb(4) = h; line_bbox.push_back (bb); + + xoffset = yoffset = 0; } } break; @@ -609,12 +611,14 @@ FT_Get_Kerning (face, previous, glyph_index, FT_KERNING_DEFAULT, &delta); - bb(2) += (delta.x >> 6); + xoffset += (delta.x >> 6); } - // Extend current line bounding box by the width of the - // current glyph. - bb(2) += (face->glyph->advance.x >> 6); + // Extend current X offset box by the width of the current + // glyph. Then extend the line bounding box if necessary. + + xoffset += (face->glyph->advance.x >> 6); + bb(2) = xmax (bb(2), xoffset); } break; } @@ -781,6 +785,22 @@ } void +ft_render::visit (text_element_combined& e) +{ + int saved_xoffset = xoffset; + int max_xoffset = xoffset; + + for (text_element_combined::iterator it = e.begin (); it != e.end (); ++it) + { + xoffset = saved_xoffset; + (*it)->accept (*this); + max_xoffset = xmax (xoffset, max_xoffset); + } + + xoffset = max_xoffset; +} + +void ft_render::reset (void) { set_mode (MODE_BBOX);