changeset 29483:af41ebf3d1b3

Differ latex test until actually needed (bug #59546) * base-text-renderer.h (ok): New virtuel method. * latex-text-renderer.cc (m_testing): New bool attribute to store wether the renderer still needs to be tested. (is_usable): Remove method. (ok): Reimplement method. (warn_helper): Now a member function with less arguments. Change use cases. Don't warn while testing unless debug is requested. (make_latex_text_renderer): Return an object without testing. * text-renderer.cc (latex_ok): Remove method. (set_color, set_font): Don't check the latex renderer is functionnal. (text_to_strlist,text_to_pixels, get_extent): Use the latex_renderer.ok () method to test when needed.
author Pantxo Diribarne <pantxo.diribarne@gmail.com>
date Thu, 01 Apr 2021 23:18:50 +0200
parents 67f1d5fc69bb
children bed2fd5b8263
files libinterp/corefcn/base-text-renderer.h libinterp/corefcn/latex-text-renderer.cc libinterp/corefcn/text-renderer.cc libinterp/corefcn/text-renderer.h
diffstat 4 files changed, 48 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/base-text-renderer.h	Fri Apr 02 01:32:39 2021 -0400
+++ b/libinterp/corefcn/base-text-renderer.h	Thu Apr 01 23:18:50 2021 +0200
@@ -77,6 +77,9 @@
     set_font (const std::string& name, const std::string& weight,
               const std::string& angle, double size) = 0;
 
+    virtual bool
+    ok (void) { return true; };
+
     virtual octave_map
     get_system_fonts (void) = 0;
 
--- a/libinterp/corefcn/latex-text-renderer.cc	Fri Apr 02 01:32:39 2021 -0400
+++ b/libinterp/corefcn/latex-text-renderer.cc	Thu Apr 01 23:18:50 2021 +0200
@@ -63,7 +63,8 @@
     latex_renderer (void)
       : m_fontsize (10.0), m_fontname ("cmr"), m_tmp_dir (),
         m_color (dim_vector (1, 3), 0), m_latex_binary ("latex"),
-        m_dvipng_binary ("dvipng"), m_dvisvg_binary ("dvisvgm"), m_debug (false)
+        m_dvipng_binary ("dvipng"), m_dvisvg_binary ("dvisvgm"),
+        m_debug (false), m_testing (true)
       {
         std::string bin = sys::env::getenv ("OCTAVE_LATEX_BINARY");
         if (! bin.empty ())
@@ -141,8 +142,7 @@
 
     octave_map get_system_fonts (void) { return octave_map (); }
 
-    /* method that checks if all required programs are installed */
-    bool is_usable (void);
+    bool ok (void);
 
   private:
 
@@ -156,6 +156,9 @@
               + std::to_string (m_color(2)));
     }
 
+    void warn_helper (std::string caller, std::string txt,std::string cmd,
+                      process_execution_result result);
+
     uint8NDArray render (const std::string& txt, int halign = 0);
 
     bool read_image (const std::string& png_file, uint8NDArray& data) const;
@@ -171,14 +174,17 @@
     std::string m_dvipng_binary;
     std::string m_dvisvg_binary;
     bool m_debug;
+    bool m_testing;
 
   };
 
   bool
-  latex_renderer::is_usable (void)
+  latex_renderer::ok (void)
   {
+    // Only run the test once in a session
     static bool tested = false;
-    static bool ok = false;
+
+    static bool isok = false;
 
     if (! tested)
       {
@@ -188,10 +194,12 @@
         uint8NDArray pixels = render ("?");
 
         if (! pixels.isempty ())
-          ok = true;
+          isok = true;
       }
 
-    return ok;
+    m_testing = false;
+
+    return isok;
   }
 
   std::string
@@ -317,10 +325,13 @@
   }
 
   void
-  warn_helper (std::string caller, std::string txt, std::string cmd,
-               process_execution_result result, bool debug)
+  latex_renderer::warn_helper (std::string caller, std::string txt,
+                               std::string cmd, process_execution_result result)
   {
-    if (! debug)
+    if (m_testing && ! m_debug)
+      return;
+
+    if (! m_debug)
       warning_with_id ("Octave:LaTeX:internal-error",
                        "latex_renderer: unable to compile \"%s\"",
                        txt.c_str ());
@@ -368,12 +379,17 @@
 
     if (result.exit_status () != 0)
       {
-        warn_helper ("latex", txt, cmd, result, m_debug);
+        warn_helper ("latex", txt, cmd, result);
+
+        if (txt != "?")
+          {
+            write_tex_file ("?", halign);
 
-        write_tex_file ("?", halign);
-
-        result = run_command_and_return_output (cmd);
-        if (result.exit_status () != 0)
+            result = run_command_and_return_output (cmd);
+            if (result.exit_status () != 0)
+              return data;
+          }
+        else
           return data;
       }
 
@@ -397,7 +413,7 @@
 
     if (result.exit_status () != 0)
       {
-        warn_helper ("dvisvg", txt, cmd, result, m_debug);
+        warn_helper ("dvisvg", txt, cmd, result);
         return data;
       }
 
@@ -423,7 +439,7 @@
 
     if (result.exit_status () != 0)
       {
-        warn_helper ("dvipng", txt, cmd, result, m_debug);
+        warn_helper ("dvipng", txt, cmd, result);
         return data;
       }
 
@@ -451,7 +467,7 @@
     if (txt.empty ())
       return;
 
-    if (is_usable ())
+    if (ok ())
       pixels = render (txt, halign);
     else
       pixels = uint8NDArray (dim_vector (4, 1, 1), static_cast<uint8_t> (0));
@@ -478,25 +494,8 @@
   base_text_renderer*
   make_latex_text_renderer (void)
   {
-    static bool latex_tested = false;
-    static bool latex_ok = true;
-
-    if (! latex_ok)
-      return nullptr;
-
     latex_renderer *renderer = new latex_renderer ();
 
-    if (! latex_tested)
-      {
-        latex_tested = true;
-        latex_ok = renderer->is_usable ();
-        if (! latex_ok)
-          {
-            delete renderer;
-            renderer = nullptr;
-          }
-      }
-
     return renderer;
   }
 }
--- a/libinterp/corefcn/text-renderer.cc	Fri Apr 02 01:32:39 2021 -0400
+++ b/libinterp/corefcn/text-renderer.cc	Thu Apr 01 23:18:50 2021 +0200
@@ -32,7 +32,6 @@
 #include "errwarn.h"
 #include "ft-text-renderer.h"
 #include "latex-text-renderer.h"
-#include "oct-env.h"
 #include "text-renderer.h"
 
 namespace octave
@@ -66,22 +65,6 @@
     return rep != nullptr;
   }
 
-  bool
-  text_renderer::latex_ok (void) const
-  {
-    static bool warned = false;
-
-    if (! sys::env::getenv ("OCTAVE_LATEX_DEBUG_FLAG").empty ()
-        && ! latex_rep && ! warned)
-      {
-        warning_with_id ("Octave:LaTeX:internal-error",
-                         "latex_renderer: unusable latex tool-chain");
-        warned = true;
-      }
-
-    return latex_rep != nullptr;
-  }
-
   Matrix
   text_renderer::get_extent (text_element *elt, double rotation)
   {
@@ -96,7 +79,7 @@
   {
     static Matrix retval (1, 4, 0.0);
 
-    if (interpreter == "latex" && latex_ok ())
+    if (interpreter == "latex" && latex_rep->ok ())
       retval = latex_rep->get_extent (txt, rotation, interpreter);
     else if (ok ())
       retval = rep->get_extent (txt, rotation, interpreter);
@@ -109,9 +92,6 @@
   {
     if (ok ())
       rep->set_anti_aliasing (val);
-
-    if (latex_ok ())
-      latex_rep->set_anti_aliasing (val);
   }
 
   octave_map
@@ -130,20 +110,20 @@
                            const std::string& angle, double size)
   {
     if (ok ())
-      rep->set_font (name, weight, angle, size);
-
-    if (latex_ok ())
-      latex_rep->set_font (name, weight, angle, size);
+      {
+        rep->set_font (name, weight, angle, size);
+        latex_rep->set_font (name, weight, angle, size);
+      }
   }
 
   void
   text_renderer::set_color (const Matrix& c)
   {
     if (ok ())
-      rep->set_color (c);
-
-    if (latex_ok ())
-      latex_rep->set_color (c);
+      {
+        rep->set_color (c);
+        latex_rep->set_color (c);
+      }
   }
 
   void
@@ -156,7 +136,7 @@
     static Matrix empty_bbox (1, 4, 0.0);
     static uint8NDArray empty_pxls;
 
-    if (interpreter == "latex" && latex_ok ())
+    if (interpreter == "latex" && latex_rep->ok ())
       latex_rep->text_to_pixels (txt, pxls, bbox, halign, valign, rotation,
                                  interpreter, handle_rotation);
     else if (ok ())
@@ -179,7 +159,7 @@
     static Matrix empty_bbox (1, 4, 0.0);
     static std::list<text_renderer::string> empty_lst;
 
-    if (interpreter == "latex" && latex_ok ())
+    if (interpreter == "latex" && latex_rep->ok ())
       latex_rep->text_to_strlist (txt, lst, bbox, halign, valign, rotation,
                                   interpreter);
     else if (ok ())
--- a/libinterp/corefcn/text-renderer.h	Fri Apr 02 01:32:39 2021 -0400
+++ b/libinterp/corefcn/text-renderer.h	Thu Apr 01 23:18:50 2021 +0200
@@ -59,8 +59,6 @@
 
     bool ok (void) const;
 
-    bool latex_ok (void) const;
-
     Matrix get_extent (text_element *elt, double rotation = 0.0);
 
     Matrix get_extent (const std::string& txt, double rotation = 0.0,