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);