Mercurial > octave
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,