changeset 30198:a87e5f9d5446

improve graphics toolkit rendering failure error message * __check_rendering_capability__.m: New function. * getframe.m, __opengl_print__.m: Use it. * scripts/plot/util/module.mk: Update.
author John W. Eaton <jwe@octave.org>
date Tue, 21 Sep 2021 12:30:32 -0400
parents f692ecc135d6
children 3e419a830e90
files scripts/image/getframe.m scripts/plot/util/__check_rendering_capability__.m scripts/plot/util/module.mk scripts/plot/util/private/__opengl_print__.m
diffstat 4 files changed, 71 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/image/getframe.m	Fri Sep 17 16:13:16 2021 -0400
+++ b/scripts/image/getframe.m	Tue Sep 21 12:30:32 2021 -0400
@@ -102,23 +102,16 @@
     pos = rect;
   endif
 
-  if (strcmp (get (hf, "visible"), "on")
-      || (strcmp (get (hf, "__graphics_toolkit__"), "qt")
-          && (strcmp (get (hf, "__gl_window__"), "on")
-              || __have_feature__ ("QT_OFFSCREEN"))))
+  __check_rendering_capability__ ("getframe", hf);
 
-    ## __get_frame__ requires that the figure "units" is "pixels"
-    unwind_protect
-      units = get (hf, "units");
-      set (hf, "units", "pixels");
-      cdata = __get_frame__ (hf);
-    unwind_protect_cleanup
-      set (hf, "units", units)
-    end_unwind_protect
-
-  else
-    error ("getframe: figure must be visible or qt toolkit must be used with __gl_window__ property 'on' or QT_OFFSCREEN feature available");
-  endif
+  ## __get_frame__ requires that the figure "units" is "pixels"
+  unwind_protect
+    units = get (hf, "units");
+    set (hf, "units", "pixels");
+    cdata = __get_frame__ (hf);
+  unwind_protect_cleanup
+    set (hf, "units", units)
+  end_unwind_protect
 
   i1 = max (floor (pos(1)), 1);
   i2 = min (ceil (pos(1)+pos(3)-1), columns (cdata));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/plot/util/__check_rendering_capability__.m	Tue Sep 21 12:30:32 2021 -0400
@@ -0,0 +1,55 @@
+########################################################################
+##
+## Copyright (C) 2021 The Octave Project Developers
+##
+## See the file COPYRIGHT.md in the top-level directory of this
+## distribution or <https://octave.org/copyright/>.
+##
+## 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/>.
+##
+########################################################################
+
+## -*- texinfo -*-
+## @deftypefn {} {} __check_rendering_capability__ (@var{who}, @var{fig})
+## Undocumented internal function.
+## @end deftypefn
+
+function __check_rendering_capability__ (who, fig)
+
+  if (strcmp (get (fig, "visible"), "on"))
+    return;
+  endif
+
+  toolkit = get (fig, "__graphics_toolkit__");
+  display = getenv ("DISPLAY");
+
+  if (! strcmp (toolkit, "qt"))
+    error ("%s: rendering with %s toolkit requires visible figure (DISPLAY='%s')",
+           who, toolkit, display);
+  endif
+
+  gl_window = get (fig, "__gl_window__");
+  qt_offscreen = __have_feature__ ("QT_OFFSCREEN");
+
+  if (strcmp (gl_window, "on") || qt_offscreen)
+    return;
+  endif
+
+  error ("%s: offscreen rendering with %s toolkit requires __gl_window__='on' or QT_OFFSCREEN feature (__gl_window__='%s'; QT_OFFSCREEN=%d, DISPLAY='%s')",
+         who, toolkit, gl_window, qt_offscreen, display);
+
+endfunction
--- a/scripts/plot/util/module.mk	Fri Sep 17 16:13:16 2021 -0400
+++ b/scripts/plot/util/module.mk	Tue Sep 21 12:30:32 2021 -0400
@@ -26,6 +26,7 @@
 %canon_reldir%_FCN_FILES = \
   %reldir%/.oct-config \
   %reldir%/__actual_axis_position__.m \
+  %reldir%/__check_rendering_capability__.m \
   %reldir%/__default_plot_options__.m \
   %reldir%/__gnuplot_drawnow__.m \
   %reldir%/__next_line_color__.m \
--- a/scripts/plot/util/private/__opengl_print__.m	Fri Sep 17 16:13:16 2021 -0400
+++ b/scripts/plot/util/private/__opengl_print__.m	Tue Sep 21 12:30:32 2021 -0400
@@ -195,18 +195,13 @@
       fprintf ("opengl-pipeline: '%s'\n", pipeline{n});
     endif
 
-    if (strcmp (get (opts.figure, "visible"), "on")
-        || (strcmp (get (opts.figure, "__graphics_toolkit__"), "qt")
-            && (strcmp (get (opts.figure, "__gl_window__"), "on")
-                || __have_feature__ ("QT_OFFSCREEN"))))
-      ## Use toolkits "print_figure" method
-      if (ispc () && ! isunix ())
-        drawnow (gl2ps_device{n}, ['| "' pipeline{n} '"']);
-      else
-        drawnow (gl2ps_device{n}, ["| " pipeline{n}]);
-      endif
+    __check_rendering_capability__ ("print", opts.figure);
+
+    ## Use toolkits "print_figure" method
+    if (ispc () && ! isunix ())
+      drawnow (gl2ps_device{n}, ['| "' pipeline{n} '"']);
     else
-      error ("print: figure must be visible or qt toolkit must be used with __gl_window__ property 'on' or QT_OFFSCREEN feature available");
+      drawnow (gl2ps_device{n}, ["| " pipeline{n}]);
     endif
   endfor