changeset 25643:afb5288a25ad

move text engine classes inside octave namespace * text-engine.cc: Rename from txt-eng.cc. * text-engine.h: Rename from txt-eng.h. Change all uses. * txt-eng.h: Provide for backward-compatibility. * libinterp/corefcn/module.mk: Update. * text-engine.cc, text-engine.h: Move classes inside octave namespace. Change all uses.
author John W. Eaton <jwe@octave.org>
date Thu, 19 Jul 2018 13:28:51 -0400
parents 3b214399f323
children bee8d60413f3
files libinterp/corefcn/base-text-renderer.h libinterp/corefcn/graphics.cc libinterp/corefcn/module.mk libinterp/corefcn/oct-tex-lexer.in.ll libinterp/corefcn/oct-tex-parser.yy libinterp/corefcn/text-engine.cc libinterp/corefcn/text-engine.h libinterp/corefcn/text-renderer.h libinterp/corefcn/txt-eng.cc libinterp/corefcn/txt-eng.h
diffstat 10 files changed, 707 insertions(+), 608 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/base-text-renderer.h	Thu Jul 19 09:09:50 2018 -0400
+++ b/libinterp/corefcn/base-text-renderer.h	Thu Jul 19 13:28:51 2018 -0400
@@ -32,8 +32,8 @@
 #include "dMatrix.h"
 #include "uint8NDArray.h"
 
+#include "text-engine.h"
 #include "text-renderer.h"
-#include "txt-eng.h"
 
 namespace octave
 {
--- a/libinterp/corefcn/graphics.cc	Thu Jul 19 09:09:50 2018 -0400
+++ b/libinterp/corefcn/graphics.cc	Thu Jul 19 13:28:51 2018 -0400
@@ -59,6 +59,7 @@
 #include "ov-fcn-handle.h"
 #include "pager.h"
 #include "parse.h"
+#include "text-engine.h"
 #include "text-renderer.h"
 #include "unwind-prot.h"
 #include "utils.h"
@@ -9921,14 +9922,14 @@
 void
 uicontrol::properties::update_text_extent (void)
 {
-  text_element *elt;
+  octave::text_element *elt;
   octave::text_renderer txt_renderer;
   Matrix box;
 
   // FIXME: parsed content should be cached for efficiency
   // FIXME: support multiline text
 
-  elt = text_parser::parse (get_string_string (), "none");
+  elt = octave::text_parser::parse (get_string_string (), "none");
 
   gh_manager::auto_lock guard;
   txt_renderer.set_font (get_fontname (), get_fontweight (),
--- a/libinterp/corefcn/module.mk	Thu Jul 19 09:09:50 2018 -0400
+++ b/libinterp/corefcn/module.mk	Thu Jul 19 13:28:51 2018 -0400
@@ -86,6 +86,7 @@
   %reldir%/symscope.h \
   %reldir%/symtab.h \
   %reldir%/sysdep.h \
+  %reldir%/text-engine.h \
   %reldir%/text-renderer.h \
   %reldir%/toplev.h \
   %reldir%/txt-eng.h \
@@ -242,11 +243,11 @@
   %reldir%/syscalls.cc \
   %reldir%/sysdep.cc \
   %reldir%/time.cc \
+  %reldir%/text-engine.cc \
   %reldir%/text-renderer.cc \
   %reldir%/toplev.cc \
   %reldir%/tril.cc \
   %reldir%/tsearch.cc \
-  %reldir%/txt-eng.cc \
   %reldir%/typecast.cc \
   %reldir%/urlwrite.cc \
   %reldir%/url-handle-manager.cc \
--- a/libinterp/corefcn/oct-tex-lexer.in.ll	Thu Jul 19 09:09:50 2018 -0400
+++ b/libinterp/corefcn/oct-tex-lexer.in.ll	Thu Jul 19 13:28:51 2018 -0400
@@ -62,7 +62,9 @@
 
 #include "unistd-wrappers.h"
 
-#include "txt-eng.h"
+#include "text-engine.h"
+
+// oct-tex-parser.h must be included after text-engine.h
 #include "oct-tex-parser.h"
 
 // FIXME: with bison 3.x, OCTAVE_TEX_STYPE appears in the generated
@@ -200,7 +202,7 @@
 void *
 octave_tex_realloc (void *ptr, yy_size_t size, yyscan_t)
 {
-  return realloc (ptr, size);
+return realloc (ptr, size);
 }
 
 void
@@ -209,40 +211,41 @@
   free (ptr);
 }
 
-bool
-text_parser_tex::init_lexer (const std::string& s)
+namespace octave
 {
-  if (! scanner)
-    octave_tex_lex_init (&scanner);
+  bool text_parser_tex::init_lexer (const std::string& s)
+  {
+    if (! scanner)
+      octave_tex_lex_init (&scanner);
 
-  if (scanner)
-    {
-      if (buffer_state)
-        {
-          octave_tex__delete_buffer (reinterpret_cast<YY_BUFFER_STATE> (buffer_state),
-                                     scanner);
-          buffer_state = nullptr;
-        }
+    if (scanner)
+      {
+        if (buffer_state)
+          {
+            octave_tex__delete_buffer (reinterpret_cast<YY_BUFFER_STATE> (buffer_state),
+                                       scanner);
+            buffer_state = nullptr;
+          }
 
-      buffer_state = octave_tex__scan_bytes (s.data (), s.length (), scanner);
-    }
+        buffer_state = octave_tex__scan_bytes (s.data (), s.length (), scanner);
+      }
 
-  return (scanner && buffer_state);
-}
+    return (scanner && buffer_state);
+  }
 
-void
-text_parser_tex::destroy_lexer (void)
-{
-  if (buffer_state)
-    {
-      octave_tex__delete_buffer (reinterpret_cast<YY_BUFFER_STATE> (buffer_state),
-                                 scanner);
-      buffer_state = nullptr;
-    }
+  void text_parser_tex::destroy_lexer (void)
+  {
+    if (buffer_state)
+      {
+        octave_tex__delete_buffer (reinterpret_cast<YY_BUFFER_STATE> (buffer_state),
+                                   scanner);
+        buffer_state = nullptr;
+      }
 
-  if (scanner)
-    {
-      octave_tex_lex_destroy (scanner);
-      scanner = nullptr;
-    }
+    if (scanner)
+      {
+        octave_tex_lex_destroy (scanner);
+        scanner = nullptr;
+      }
+  }
 }
--- a/libinterp/corefcn/oct-tex-parser.yy	Thu Jul 19 09:09:50 2018 -0400
+++ b/libinterp/corefcn/oct-tex-parser.yy	Thu Jul 19 13:28:51 2018 -0400
@@ -28,11 +28,13 @@
 #  include "config.h"
 #endif
 
-#include "txt-eng.h"
+#include "text-engine.h"
+
+// oct-tex-parser.h must be included after text-engine.h
 #include "oct-tex-parser.h"
 
 extern int octave_tex_lex (YYSTYPE *, void *);
-static void yyerror (text_parser_tex& parser, const char *s);
+ static void yyerror (octave::text_parser_tex& parser, const char *s);
 
 #define scanner parser.get_scanner ()
 #define yyalloc octave_tex_yyalloc
@@ -51,7 +53,7 @@
 %define api.pure
 // No spaces inside the braces for the prefix definition!
 %define api.prefix {octave_tex_}
-%parse-param { text_parser_tex& parser }
+%parse-param { octave::text_parser_tex& parser }
 %lex-param { void *scanner }
 
 %code requires {#include <string>}
@@ -59,16 +61,16 @@
 %union
 {
   // Leaf symbols produced by the scanner.
-  char                       ch;
-  double                     num;
-  int                        sym;
+  char ch;
+  double num;
+  int sym;
 
   // Used for string buffering.
-  std::string*               str;
+  std::string *str;
 
   // Objects produced by the parser.
-  text_element*              e_base;
-  text_element_list*         e_list;
+  octave::text_element *e_base;
+  octave::text_element_list *e_list;
 }
 
 %token BF IT SL RM
@@ -100,104 +102,105 @@
 
 %%
 
-simple_string                   : CH
-                                  { $$ = new std::string (1, $1); }
-                                | simple_string CH
-                                  { $1->append (1, $2); $$ = $1; }
-                                ;
+simple_string           : CH
+                          { $$ = new std::string (1, $1); }
+                        | simple_string CH
+                          { $1->append (1, $2); $$ = $1; }
+                        ;
 
-symbol_element                  : SYM
-                                  { $$ = new text_element_symbol ($1); }
-                                ;
+symbol_element          : SYM
+                          { $$ = new octave::text_element_symbol ($1); }
+                        ;
 
-font_modifier_element           : BF
-                                  { $$ = new text_element_fontstyle (text_element_fontstyle::bold); }
-                                | IT
-                                  { $$ = new text_element_fontstyle (text_element_fontstyle::italic); }
-                                | SL
-                                  { $$ = new text_element_fontstyle (text_element_fontstyle::oblique); }
-                                | RM
-                                  { $$ = new text_element_fontstyle (text_element_fontstyle::normal); }
-                                ;
+font_modifier_element   : BF
+                          { $$ = new octave::text_element_fontstyle (octave::text_element_fontstyle::bold); }
+                        | IT
+                          { $$ = new octave::text_element_fontstyle (octave::text_element_fontstyle::italic); }
+                        | SL
+                          { $$ = new octave::text_element_fontstyle (octave::text_element_fontstyle::oblique); }
+                        | RM
+                          { $$ = new octave::text_element_fontstyle (octave::text_element_fontstyle::normal); }
+                        ;
 
-fontsize_element                : FONTSIZE START NUM END
-                                  { $$ = new text_element_fontsize ($3); }
-                                ;
+fontsize_element        : FONTSIZE START NUM END
+                          { $$ = new octave::text_element_fontsize ($3); }
+                        ;
 
-fontname_element                : FONTNAME START simple_string END
-                                  {
-                                    $$ = new text_element_fontname (*$3);
-                                    delete $3;
-                                  }
-                                ;
+fontname_element        : FONTNAME START simple_string END
+                          {
+                            $$ = new octave::text_element_fontname (*$3);
+                            delete $3;
+                          }
+                        ;
 
-color_element                   : COLOR START simple_string END
-                                  {
-                                    $$ = new text_element_color (*$3);
-                                    delete $3;
-                                  }
-                                | COLOR_RGB START NUM NUM NUM END
-                                  {
-                                    $$ = new text_element_color ($3, $4, $5);
-                                  }
-                                ;
+color_element           : COLOR START simple_string END
+                          {
+                            $$ = new octave::text_element_color (*$3);
+                            delete $3;
+                          }
+                        | COLOR_RGB START NUM NUM NUM END
+                          {
+                            $$ = new octave::text_element_color ($3, $4, $5);
+                          }
+                        ;
 
-string_element                  : simple_string %prec STR
-                                  {
-                                    $$ = new text_element_string (*$1);
-                                    delete $1;
-                                  }
-                                | scoped_string_element_list
-                                  { $$ = $1; }
-                                | symbol_element
-                                | font_modifier_element
-                                | fontsize_element
-                                | fontname_element
-                                | color_element
-                                | superscript_element %prec SCRIPT
-                                | subscript_element %prec SCRIPT
-                                | combined_script_element
-                                ;
+string_element          : simple_string %prec STR
+                          {
+                            $$ = new octave::text_element_string (*$1);
+                            delete $1;
+                          }
+                        | scoped_string_element_list
+                          { $$ = $1; }
+                        | symbol_element
+                        | font_modifier_element
+                        | fontsize_element
+                        | fontname_element
+                        | color_element
+                        | superscript_element %prec SCRIPT
+                        | subscript_element %prec SCRIPT
+                        | combined_script_element
+                        ;
 
-superscript_element             : SUPER CH
-                                  { $$ = new text_element_superscript ($2); }
-                                | SUPER scoped_string_element_list
-                                  { $$ = new text_element_superscript ($2); }
-                                | SUPER symbol_element
-                                  { $$ = new text_element_superscript ($2); }
-                                ;
+superscript_element     : SUPER CH
+                          { $$ = new octave::text_element_superscript ($2); }
+                        | SUPER scoped_string_element_list
+                          { $$ = new octave::text_element_superscript ($2); }
+                        | SUPER symbol_element
+                          { $$ = new octave::text_element_superscript ($2); }
+                        ;
 
-subscript_element               : SUB CH
-                                  { $$ = new text_element_subscript ($2); }
-                                | SUB scoped_string_element_list
-                                  { $$ = new text_element_subscript ($2); }
-                                | SUB symbol_element
-                                  { $$ = new text_element_subscript ($2); }
-                                ;
+subscript_element       : SUB CH
+                          { $$ = new octave::text_element_subscript ($2); }
+                        | SUB scoped_string_element_list
+                          { $$ = new octave::text_element_subscript ($2); }
+                        | SUB symbol_element
+                          { $$ = new octave::text_element_subscript ($2); }
+                        ;
 
-combined_script_element         : subscript_element superscript_element
-                                  { $$ = new text_element_combined ($1, $2); }
-                                | superscript_element subscript_element
-                                  { $$ = new text_element_combined ($1, $2); }
-                                ;
+combined_script_element : subscript_element superscript_element
+                          { $$ = new octave::text_element_combined ($1, $2); }
+                        | superscript_element subscript_element
+                          { $$ = new octave::text_element_combined ($1, $2); }
+                        ;
 
-string_element_list             : string_element
-                                  { $$ = new text_element_list ($1); }
-                                | string_element_list string_element
-                                  { $1->push_back ($2); $$ = $1; }
-                                ;
+string_element_list     : string_element
+                          { $$ = new octave::text_element_list ($1); }
+                        | string_element_list string_element
+                          { $1->push_back ($2); $$ = $1; }
+                        ;
 
-scoped_string_element_list      : START string_element_list END
-                                  { $$ = $2; }
-                                | START END
-                                  { $$ = new text_element_list (); }
-                                ;
+scoped_string_element_list
+                        : START string_element_list END
+                          { $$ = $2; }
+                        | START END
+                          { $$ = new octave::text_element_list (); }
+                        ;
 
-string                          : // empty
-                                  { parser.set_parse_result (new text_element_string ("")); }
-                                | string_element_list
-                                  { parser.set_parse_result ($1); }
-                                ;
+string                  : // empty
+                          { parser.set_parse_result (new octave::text_element_string ("")); }
+                        | string_element_list
+                          { parser.set_parse_result ($1); }
+                        ;
 
 %%
 
@@ -206,24 +209,27 @@
 #  pragma GCC diagnostic pop
 #endif
 
-text_element*
-text_parser_tex::parse (const std::string& s)
+namespace octave
 {
-  octave_tex_debug = 0;
+  text_element*
+  text_parser_tex::parse (const std::string& s)
+  {
+    octave_tex_debug = 0;
 
-  if (init_lexer (s))
-    {
-      result = nullptr;
+    if (init_lexer (s))
+      {
+        result = nullptr;
 
-      if (octave_tex_parse (*this) == 0)
-        return result;
-    }
+        if (octave_tex_parse (*this) == 0)
+          return result;
+      }
 
-  return new text_element_string (s);
+    return new text_element_string (s);
+  }
 }
 
 static void
-yyerror (text_parser_tex&, const char *s)
+yyerror (octave::text_parser_tex&, const char *s)
 {
   fprintf (stderr, "TeX parse error: %s\n", s);
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libinterp/corefcn/text-engine.cc	Thu Jul 19 13:28:51 2018 -0400
@@ -0,0 +1,42 @@
+/*
+
+Copyright (C) 2013-2018 Michael Goffioul
+
+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
+<https://www.gnu.org/licenses/>.
+
+*/
+
+#if defined (HAVE_CONFIG_H)
+#  include "config.h"
+#endif
+
+#include "text-engine.h"
+#include "oct-tex-symbols.cc"
+
+namespace octave
+{
+  uint32_t
+  text_element_symbol::get_symbol_code (void) const
+  {
+    uint32_t code = invalid_code;
+
+    if (0 <= symbol && symbol < num_symbol_codes)
+      code = symbol_codes[symbol][0];
+
+    return code;
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libinterp/corefcn/text-engine.h	Thu Jul 19 13:28:51 2018 -0400
@@ -0,0 +1,508 @@
+/*
+
+Copyright (C) 2009-2018 Michael Goffioul
+
+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
+<https://www.gnu.org/licenses/>.
+
+*/
+
+#if ! defined (octave_text_engine_h)
+#define octave_text_engine_h 1
+
+#include "octave-config.h"
+
+#include <memory>
+#include <string>
+
+#include "base-list.h"
+#include "caseless-str.h"
+#include "dMatrix.h"
+
+namespace octave
+{
+  class text_element;
+  class text_element_string;
+  class text_element_symbol;
+  class text_element_list;
+  class text_element_subscript;
+  class text_element_superscript;
+  class text_element_combined;
+  class text_element_fontname;
+  class text_element_fontsize;
+  class text_element_fontstyle;
+  class text_element_color;
+
+  class text_processor;
+
+  class
+  OCTINTERP_API
+  text_element
+  {
+  public:
+    text_element (void) { }
+
+    virtual ~text_element (void) = default;
+
+    virtual void accept (text_processor& p) = 0;
+
+  private:
+    text_element (const text_element&);
+  };
+
+  class
+  OCTINTERP_API
+  text_element_string : public text_element
+  {
+  public:
+    text_element_string (const std::string& s = "")
+      : text_element (), str (s) { }
+
+    ~text_element_string (void) = default;
+
+    std::string string_value (void) const { return str; }
+
+    void accept (text_processor& p);
+
+  private:
+    std::string str;
+
+  private:
+    text_element_string (const text_element_string &);
+  };
+
+  class
+  OCTINTERP_API
+  text_element_symbol : public text_element
+  {
+  public:
+    enum { invalid_code = 0xFFFFFFFFU };
+
+  public:
+    text_element_symbol (int sym)
+      : text_element (), symbol (sym) { }
+
+    ~text_element_symbol (void) = default;
+
+    int get_symbol (void) const { return symbol; }
+
+    uint32_t get_symbol_code (void) const;
+
+    void accept (text_processor& p);
+
+  private:
+    int symbol;
+  };
+
+  class
+  OCTINTERP_API
+  text_element_list
+    : public text_element, public base_list<text_element *>
+  {
+  public:
+    text_element_list (void)
+      : text_element (), base_list<text_element*> () { }
+
+    text_element_list (text_element *e)
+      : text_element (), base_list<text_element*> ()
+    {
+      push_back (e);
+    }
+
+    ~text_element_list (void)
+      {
+        while (! empty ())
+          {
+            auto it = begin ();
+            delete (*it);
+            erase (it);
+          }
+      }
+
+    void accept (text_processor& p);
+  };
+
+  class
+  OCTINTERP_API
+  text_element_subscript : public text_element
+  {
+  public:
+    text_element_subscript (text_element *e)
+      : text_element (), elem (e) { }
+
+    text_element_subscript (char c)
+      : text_element ()
+      { elem = new text_element_string (std::string (1, c)); }
+
+    ~text_element_subscript (void)
+      { delete elem; }
+
+    void accept (text_processor& p);
+
+    text_element * get_element (void) { return elem; }
+
+  private:
+    text_element *elem;
+
+  private:
+    text_element_subscript (void);
+  };
+
+  class
+  OCTINTERP_API
+  text_element_superscript : public text_element
+  {
+  public:
+    text_element_superscript (text_element *e)
+      : text_element (), elem (e) { }
+
+    text_element_superscript (char c)
+      : text_element ()
+      { elem = new text_element_string (std::string (1, c)); }
+
+    ~text_element_superscript (void)
+      { delete elem; }
+
+    void accept (text_processor& p);
+
+    text_element * get_element (void) { return elem; }
+
+  private:
+    text_element *elem;
+
+  private:
+    text_element_superscript (void);
+  };
+
+  class
+  OCTINTERP_API
+  text_element_combined : public text_element_list
+  {
+  public:
+    text_element_combined (text_element *e)
+      : text_element_list (e) { }
+
+    text_element_combined (text_element *e1, text_element *e2)
+      : text_element_list(e1)
+      { push_back (e2); }
+
+    void accept (text_processor& p);
+  };
+
+  class
+  OCTINTERP_API
+  text_element_fontstyle : public text_element
+  {
+  public:
+    enum fontstyle
+    {
+      normal,
+      bold,
+      italic,
+      oblique
+    };
+
+    text_element_fontstyle (fontstyle st)
+      : text_element (), style (st) { }
+
+    ~text_element_fontstyle (void) = default;
+
+    fontstyle get_fontstyle (void) const { return style; }
+
+    void accept (text_processor& p);
+
+  private:
+    fontstyle style;
+
+  private:
+    text_element_fontstyle (void);
+  };
+
+  class
+  OCTINTERP_API
+  text_element_fontname : public text_element
+  {
+  public:
+    text_element_fontname (const std::string& fname)
+      : text_element (), name (fname) { }
+
+    ~text_element_fontname (void) = default;
+
+    const std::string& get_fontname (void) const { return name; }
+
+    void accept (text_processor& p);
+
+  private:
+    std::string name;
+
+  private:
+    text_element_fontname (void);
+  };
+
+  class
+  OCTINTERP_API
+  text_element_fontsize : public text_element
+  {
+  public:
+    text_element_fontsize (double fsize)
+      : text_element (), size (fsize) { }
+
+    ~text_element_fontsize (void) = default;
+
+    double get_fontsize (void) const { return size; }
+
+    void accept (text_processor& p);
+
+  private:
+    double size;
+
+  private:
+    text_element_fontsize (void);
+  };
+
+  class
+  OCTINTERP_API
+  text_element_color : public text_element
+  {
+  public:
+    text_element_color (double r, double g, double b)
+      : text_element (), rgb (1, 3, 0.0)
+      {
+        rgb(0) = r;
+        rgb(1) = g;
+        rgb(2) = b;
+      }
+
+    text_element_color (const std::string& cname)
+      : text_element (), rgb (1, 3, 0.0)
+      {
+#define ASSIGN_COLOR(r,g,b) { rgb(0) = r; rgb(1) = g; rgb(2) = b; }
+        if (cname == "red") ASSIGN_COLOR(1, 0, 0)
+        else if (cname == "green") ASSIGN_COLOR(0, 1, 0)
+        else if (cname == "yellow") ASSIGN_COLOR(1, 1, 0)
+        else if (cname == "magenta") ASSIGN_COLOR(1, 0, 1)
+        else if (cname == "blue") ASSIGN_COLOR(0, 0, 1)
+        else if (cname == "black") ASSIGN_COLOR(0, 0, 0)
+        else if (cname == "white") ASSIGN_COLOR(1, 1, 1)
+        else if (cname == "gray") ASSIGN_COLOR(.5, .5, .5)
+        else if (cname == "darkGreen") ASSIGN_COLOR(0, .5, 0)
+        else if (cname == "orange") ASSIGN_COLOR(1, .65, 0)
+        else if (cname == "lightBlue") ASSIGN_COLOR(0.68, .85, .9)
+#undef ASSIGN_COLOR
+      }
+
+    ~text_element_color (void) = default;
+
+    Matrix get_color (void) { return rgb; }
+
+    void accept (text_processor& p);
+
+  private:
+    Matrix rgb;
+  };
+
+  class
+  OCTINTERP_API
+  text_processor
+  {
+  public:
+    virtual void visit (text_element_string& e) = 0;
+
+    virtual void visit (text_element_symbol&) { }
+
+    virtual void visit (text_element_list& e)
+    {
+      for (auto& el_p : e)
+        {
+          el_p->accept (*this);
+        }
+    }
+
+    virtual void visit (text_element_subscript& e)
+    { e.get_element ()->accept (*this); }
+
+    virtual void visit (text_element_superscript& e)
+    { e.get_element ()->accept (*this); }
+
+    virtual void visit (text_element_combined&) { }
+
+    virtual void visit (text_element_fontstyle&) { }
+
+    virtual void visit (text_element_fontname&) { }
+
+    virtual void visit (text_element_fontsize&) { }
+
+    virtual void visit (text_element_color&) { }
+
+    virtual void reset (void) { }
+
+  protected:
+    text_processor (void) { }
+
+    virtual ~text_processor (void) = default;
+  };
+
+#define TEXT_ELEMENT_ACCEPT(cls)                \
+  inline void                                   \
+  cls::accept (text_processor& p)               \
+  {                                             \
+    p.visit (*this);                            \
+  }
+
+  TEXT_ELEMENT_ACCEPT(text_element_string)
+  TEXT_ELEMENT_ACCEPT(text_element_symbol)
+  TEXT_ELEMENT_ACCEPT(text_element_list)
+  TEXT_ELEMENT_ACCEPT(text_element_subscript)
+  TEXT_ELEMENT_ACCEPT(text_element_superscript)
+  TEXT_ELEMENT_ACCEPT(text_element_combined)
+  TEXT_ELEMENT_ACCEPT(text_element_fontstyle)
+  TEXT_ELEMENT_ACCEPT(text_element_fontname)
+  TEXT_ELEMENT_ACCEPT(text_element_fontsize)
+  TEXT_ELEMENT_ACCEPT(text_element_color)
+
+  class
+  OCTINTERP_API
+  text_parser
+  {
+  public:
+    text_parser (void) { }
+
+    virtual ~text_parser (void) = default;
+
+    virtual text_element * parse (const std::string& s) = 0;
+
+  public:
+    static text_element * parse (const std::string& s,
+                                 const caseless_str& interpreter);
+  };
+
+  class
+  OCTINTERP_API
+  text_parser_none : public text_parser
+  {
+  public:
+    text_parser_none (void) : text_parser () { }
+
+    ~text_parser_none (void) = default;
+
+    // FIXME: is it possible to use reference counting to manage the
+    // memory for the object returned by the text parser?  That would be
+    // preferable to having to know when and where to delete the object it
+    // creates...
+
+    text_element * parse (const std::string& s)
+    {
+      return new text_element_string (s);
+    }
+  };
+
+  class
+  OCTINTERP_API
+  text_parser_tex : public text_parser
+  {
+  public:
+    text_parser_tex (void)
+      : text_parser (), scanner (nullptr), buffer_state (nullptr), result (nullptr)
+      { }
+
+    ~text_parser_tex (void)
+      { destroy_lexer (); }
+
+    text_element * parse (const std::string& s);
+
+    void * get_scanner (void) { return scanner; }
+
+    void set_parse_result (text_element *e) { result = e; }
+
+    text_element * get_parse_result (void) { return result; }
+
+  private:
+    bool init_lexer (const std::string& s);
+
+    void destroy_lexer (void);
+
+  private:
+    void *scanner;
+
+    void *buffer_state;
+
+    text_element *result;
+  };
+
+  inline text_element*
+  text_parser::parse (const std::string& s, const caseless_str& interpreter)
+  {
+    std::unique_ptr<text_parser> parser;
+
+    if (interpreter.compare ("tex"))
+      parser.reset (new text_parser_tex ());
+    else
+      parser.reset (new text_parser_none ());
+
+    return parser->parse (s);
+  }
+}
+
+#if defined (OCAVE_USE_DEPRECATED_FUNCTIONS)
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_element' instead")
+typedef octave::text_element text_element;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_element_string' instead")
+typedef octave::text_element_string text_element_string;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_element_symbol' instead")
+typedef octave::text_element_symbol text_element_symbol;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_element_list' instead")
+typedef octave::text_element_list text_element_list;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_element_subscript' instead")
+typedef octave::text_element_subscript text_element_subscript;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_element_superscript' instead")
+typedef octave::text_element_superscript text_element_superscript;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_element_combined' instead")
+typedef octave::text_element_combined text_element_combined;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_element_fontstyle' instead")
+typedef octave::text_element_fontstyle text_element_fontstyle;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_element_fontname' instead")
+typedef octave::text_element_fontname text_element_fontname;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_element_fontsize' instead")
+typedef octave::text_element_fontsize text_element_fontsize;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_element_color' instead")
+typedef octave::text_element_color text_element_color;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_processor' instead")
+typedef octave::text_processor text_processor;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_parser' instead")
+typedef octave::text_parser text_parser;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_parser_none' instead")
+typedef octave::text_parser_none text_parser_none;
+
+OCTAVE_DEPRECATED (5, "use 'octave::text_parser_tex' instead")
+typedef octave::text_parser_tex text_parser_tex;
+
+#endif
+
+#endif
--- a/libinterp/corefcn/text-renderer.h	Thu Jul 19 09:09:50 2018 -0400
+++ b/libinterp/corefcn/text-renderer.h	Thu Jul 19 13:28:51 2018 -0400
@@ -34,11 +34,10 @@
 #include "dMatrix.h"
 #include "uint8NDArray.h"
 
-#include "txt-eng.h"
-
 namespace octave
 {
   class base_text_renderer;
+  class text_element;
 
   class
   OCTINTERP_API
--- a/libinterp/corefcn/txt-eng.cc	Thu Jul 19 09:09:50 2018 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
-
-Copyright (C) 2013-2018 Michael Goffioul
-
-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
-<https://www.gnu.org/licenses/>.
-
-*/
-
-#if defined (HAVE_CONFIG_H)
-#  include "config.h"
-#endif
-
-#include "txt-eng.h"
-#include "oct-tex-symbols.cc"
-
-uint32_t
-text_element_symbol::get_symbol_code (void) const
-{
-  uint32_t code = invalid_code;
-
-  if (0 <= symbol && symbol < num_symbol_codes)
-    code = symbol_codes[symbol][0];
-
-  return code;
-}
--- a/libinterp/corefcn/txt-eng.h	Thu Jul 19 09:09:50 2018 -0400
+++ b/libinterp/corefcn/txt-eng.h	Thu Jul 19 13:28:51 2018 -0400
@@ -1,6 +1,6 @@
 /*
 
-Copyright (C) 2009-2018 Michael Goffioul
+Copyright (C) 2018 John W. Eaton
 
 This file is part of Octave.
 
@@ -25,430 +25,8 @@
 
 #include "octave-config.h"
 
-#include <memory>
-#include <string>
-
-#include "base-list.h"
-#include "caseless-str.h"
-#include "dMatrix.h"
-
-class text_element;
-class text_element_string;
-class text_element_symbol;
-class text_element_list;
-class text_element_subscript;
-class text_element_superscript;
-class text_element_combined;
-class text_element_fontname;
-class text_element_fontsize;
-class text_element_fontstyle;
-class text_element_color;
-
-class text_processor;
-
-class
-OCTINTERP_API
-text_element
-{
-public:
-  text_element (void) { }
-
-  virtual ~text_element (void) = default;
-
-  virtual void accept (text_processor& p) = 0;
-
-private:
-  text_element (const text_element&);
-};
-
-class
-OCTINTERP_API
-text_element_string : public text_element
-{
-public:
-  text_element_string (const std::string& s = "")
-    : text_element (), str (s) { }
-
-  ~text_element_string (void) = default;
-
-  std::string string_value (void) const { return str; }
-
-  void accept (text_processor& p);
-
-private:
-  std::string str;
-
-private:
-  text_element_string (const text_element_string &);
-};
-
-class
-OCTINTERP_API
-text_element_symbol : public text_element
-{
-public:
-  enum { invalid_code = 0xFFFFFFFFU };
-
-public:
-  text_element_symbol (int sym)
-    : text_element (), symbol (sym) { }
-
-  ~text_element_symbol (void) = default;
-
-  int get_symbol (void) const { return symbol; }
-
-  uint32_t get_symbol_code (void) const;
-
-  void accept (text_processor& p);
-
-private:
-  int symbol;
-};
-
-class
-OCTINTERP_API
-text_element_list
-  : public text_element, public octave::base_list<text_element *>
-{
-public:
-  text_element_list (void)
-    : text_element (), octave::base_list<text_element*> () { }
-
-  text_element_list (text_element *e)
-    : text_element (), octave::base_list<text_element*> ()
-  { push_back (e); }
-
-  ~text_element_list (void)
-  {
-    while (! empty ())
-      {
-        auto it = begin ();
-        delete (*it);
-        erase (it);
-      }
-  }
-
-  void accept (text_processor& p);
-};
-
-class
-OCTINTERP_API
-text_element_subscript : public text_element
-{
-public:
-  text_element_subscript (text_element *e)
-    : text_element (), elem (e) { }
-
-  text_element_subscript (char c)
-    : text_element ()
-  { elem = new text_element_string (std::string (1, c)); }
-
-  ~text_element_subscript (void)
-  { delete elem; }
-
-  void accept (text_processor& p);
-
-  text_element * get_element (void) { return elem; }
-
-private:
-  text_element *elem;
-
-private:
-  text_element_subscript (void);
-};
-
-class
-OCTINTERP_API
-text_element_superscript : public text_element
-{
-public:
-  text_element_superscript (text_element *e)
-    : text_element (), elem (e) { }
-
-  text_element_superscript (char c)
-    : text_element ()
-  { elem = new text_element_string (std::string (1, c)); }
-
-  ~text_element_superscript (void)
-  { delete elem; }
-
-  void accept (text_processor& p);
-
-  text_element * get_element (void) { return elem; }
-
-private:
-  text_element *elem;
-
-private:
-  text_element_superscript (void);
-};
-
-class
-OCTINTERP_API
-text_element_combined : public text_element_list
-{
-public:
-  text_element_combined (text_element *e)
-    : text_element_list (e) { }
-
-  text_element_combined (text_element *e1, text_element *e2)
-    : text_element_list(e1)
-  { push_back (e2); }
-
-  void accept (text_processor& p);
-};
-
-class
-OCTINTERP_API
-text_element_fontstyle : public text_element
-{
-public:
-  enum fontstyle
-  {
-    normal,
-    bold,
-    italic,
-    oblique
-  };
-
-  text_element_fontstyle (fontstyle st)
-    : text_element (), style (st) { }
-
-  ~text_element_fontstyle (void) = default;
-
-  fontstyle get_fontstyle (void) const { return style; }
-
-  void accept (text_processor& p);
-
-private:
-  fontstyle style;
-
-private:
-  text_element_fontstyle (void);
-};
-
-class
-OCTINTERP_API
-text_element_fontname : public text_element
-{
-public:
-  text_element_fontname (const std::string& fname)
-    : text_element (), name (fname) { }
-
-  ~text_element_fontname (void) = default;
+#warning "txt-eng.h has been deprecated; use text-engine instead"
 
-  const std::string& get_fontname (void) const { return name; }
-
-  void accept (text_processor& p);
-
-private:
-  std::string name;
-
-private:
-  text_element_fontname (void);
-};
-
-class
-OCTINTERP_API
-text_element_fontsize : public text_element
-{
-public:
-  text_element_fontsize (double fsize)
-    : text_element (), size (fsize) { }
-
-  ~text_element_fontsize (void) = default;
-
-  double get_fontsize (void) const { return size; }
-
-  void accept (text_processor& p);
-
-private:
-  double size;
-
-private:
-  text_element_fontsize (void);
-};
-
-class
-OCTINTERP_API
-text_element_color : public text_element
-{
-public:
-  text_element_color (double r, double g, double b)
-    : text_element (), rgb (1, 3, 0.0)
-  {
-    rgb(0) = r;
-    rgb(1) = g;
-    rgb(2) = b;
-  }
-
-  text_element_color (const std::string& cname)
-    : text_element (), rgb (1, 3, 0.0)
-  {
-#define ASSIGN_COLOR(r,g,b) { rgb(0) = r; rgb(1) = g; rgb(2) = b; }
-    if (cname == "red") ASSIGN_COLOR(1, 0, 0)
-      else if (cname == "green") ASSIGN_COLOR(0, 1, 0)
-        else if (cname == "yellow") ASSIGN_COLOR(1, 1, 0)
-          else if (cname == "magenta") ASSIGN_COLOR(1, 0, 1)
-            else if (cname == "blue") ASSIGN_COLOR(0, 0, 1)
-              else if (cname == "black") ASSIGN_COLOR(0, 0, 0)
-                else if (cname == "white") ASSIGN_COLOR(1, 1, 1)
-                  else if (cname == "gray") ASSIGN_COLOR(.5, .5, .5)
-                    else if (cname == "darkGreen") ASSIGN_COLOR(0, .5, 0)
-                      else if (cname == "orange") ASSIGN_COLOR(1, .65, 0)
-                        else if (cname == "lightBlue") ASSIGN_COLOR(0.68, .85, .9)
-#undef ASSIGN_COLOR
-  }
-
-  ~text_element_color (void) = default;
-
-  Matrix get_color (void) { return rgb; }
-
-  void accept (text_processor& p);
-
-private:
-  Matrix rgb;
-};
-
-class
-OCTINTERP_API
-text_processor
-{
-public:
-  virtual void visit (text_element_string& e) = 0;
-
-  virtual void visit (text_element_symbol&) { }
-
-  virtual void visit (text_element_list& e)
-  {
-    for (auto& el_p : e)
-      {
-        el_p->accept (*this);
-      }
-  }
-
-  virtual void visit (text_element_subscript& e)
-  { e.get_element ()->accept (*this); }
-
-  virtual void visit (text_element_superscript& e)
-  { e.get_element ()->accept (*this); }
-
-  virtual void visit (text_element_combined&) { }
-
-  virtual void visit (text_element_fontstyle&) { }
-
-  virtual void visit (text_element_fontname&) { }
-
-  virtual void visit (text_element_fontsize&) { }
-
-  virtual void visit (text_element_color&) { }
-
-  virtual void reset (void) { }
-
-protected:
-  text_processor (void) { }
-
-  virtual ~text_processor (void) = default;
-};
-
-#define TEXT_ELEMENT_ACCEPT(cls)                \
-  inline void                                   \
-  cls::accept (text_processor& p)               \
-  {                                             \
-    p.visit (*this);                            \
-  }
-
-TEXT_ELEMENT_ACCEPT(text_element_string)
-TEXT_ELEMENT_ACCEPT(text_element_symbol)
-TEXT_ELEMENT_ACCEPT(text_element_list)
-TEXT_ELEMENT_ACCEPT(text_element_subscript)
-TEXT_ELEMENT_ACCEPT(text_element_superscript)
-TEXT_ELEMENT_ACCEPT(text_element_combined)
-TEXT_ELEMENT_ACCEPT(text_element_fontstyle)
-TEXT_ELEMENT_ACCEPT(text_element_fontname)
-TEXT_ELEMENT_ACCEPT(text_element_fontsize)
-TEXT_ELEMENT_ACCEPT(text_element_color)
-
-class
-OCTINTERP_API
-text_parser
-{
-public:
-  text_parser (void) { }
-
-  virtual ~text_parser (void) = default;
-
-  virtual text_element * parse (const std::string& s) = 0;
-
-public:
-  static text_element * parse (const std::string& s,
-                               const caseless_str& interpreter);
-};
-
-class
-OCTINTERP_API
-text_parser_none : public text_parser
-{
-public:
-  text_parser_none (void) : text_parser () { }
-
-  ~text_parser_none (void) = default;
-
-  // FIXME: is it possible to use reference counting to manage the
-  // memory for the object returned by the text parser?  That would be
-  // preferable to having to know when and where to delete the object it
-  // creates...
-
-  text_element * parse (const std::string& s)
-  {
-    return new text_element_string (s);
-  }
-};
-
-class
-OCTINTERP_API
-text_parser_tex : public text_parser
-{
-public:
-  text_parser_tex (void)
-    : text_parser (), scanner (nullptr), buffer_state (nullptr), result (nullptr)
-  { }
-
-  ~text_parser_tex (void)
-  { destroy_lexer (); }
-
-  text_element * parse (const std::string& s);
-
-  void * get_scanner (void) { return scanner; }
-
-  void set_parse_result (text_element *e) { result = e; }
-
-  text_element * get_parse_result (void) { return result; }
-
-private:
-  bool init_lexer (const std::string& s);
-
-  void destroy_lexer (void);
-
-private:
-  void *scanner;
-
-  void *buffer_state;
-
-  text_element *result;
-};
-
-inline text_element*
-text_parser::parse (const std::string& s, const caseless_str& interpreter)
-{
-  std::unique_ptr<text_parser> parser;
-
-  if (interpreter.compare ("tex"))
-    parser.reset (new text_parser_tex ());
-  else
-    parser.reset (new text_parser_none ());
-
-  return parser->parse (s);
-}
+#include "text-engine.h"
 
 #endif