diff --git a/libgui/graphics/Backend.cc b/libgui/graphics/Backend.cc --- a/libgui/graphics/Backend.cc +++ b/libgui/graphics/Backend.cc @@ -172,6 +172,21 @@ } } +void Backend::print_figure (const graphics_object& go, + const std::string& term, + const std::string& file_cmd, bool /*mono*/, + const std::string& /*debug_file*/) const +{ + if (go.get_properties ().is_visible ()) + { + ObjectProxy* proxy = toolkitObjectProxy (go); + + if (proxy) + proxy->print (QString::fromStdString (file_cmd), + QString::fromStdString (term)); + } +} + Object* Backend::toolkitObject (const graphics_object& go) { ObjectProxy* proxy = toolkitObjectProxy (go); diff --git a/libgui/graphics/Backend.h b/libgui/graphics/Backend.h --- a/libgui/graphics/Backend.h +++ b/libgui/graphics/Backend.h @@ -54,6 +54,11 @@ void finalize (const graphics_object& obj); + void print_figure (const graphics_object& go, + const std::string& term, + const std::string& file_cmd, bool /*mono*/, + const std::string& /*debug_file*/) const; + static Object* toolkitObject (const graphics_object& go); static ObjectProxy* toolkitObjectProxy (const graphics_object& go); diff --git a/libgui/graphics/Canvas.cc b/libgui/graphics/Canvas.cc --- a/libgui/graphics/Canvas.cc +++ b/libgui/graphics/Canvas.cc @@ -35,6 +35,11 @@ #include "GLCanvas.h" #include "QtHandlesUtils.h" +#include "file-ops.h" +#include "gl-render.h" +#include "gl2ps-renderer.h" +#include "sysdep.h" + namespace QtHandles { @@ -51,6 +56,30 @@ m_redrawBlocked = block; } +void Canvas::print (const QString& file_cmd, const QString& term) +{ +#ifdef HAVE_GL2PS_H + graphics_object obj = gh_manager::get_object (m_handle); + + if (obj.valid_object ()) + { + graphics_object figObj (obj.get_ancestor ("figure")); + + std::string cmd = file_cmd.toStdString (); + + FILE *fp = octave_popen (cmd.c_str (), "w"); + + glps_renderer rend (fp, term.toStdString ()); + + rend.draw (figObj, cmd); + + octave_pclose (fp); + } +#else + error ("print: printing not available without gl2ps library"); +#endif +} + void Canvas::updateCurrentPoint(const graphics_object& fig, const graphics_object& obj, QMouseEvent* event) { diff --git a/libgui/graphics/Canvas.h b/libgui/graphics/Canvas.h --- a/libgui/graphics/Canvas.h +++ b/libgui/graphics/Canvas.h @@ -51,6 +51,8 @@ void redraw (bool sync = false); void blockRedraw (bool block = true); + void print (const QString& file_cmd, const QString& term); + void addEventMask (int m) { m_eventMask |= m; } void clearEventMask (int m) { m_eventMask &= (~m); } void setEventMask (int m) { m_eventMask = m; } diff --git a/libgui/graphics/Figure.cc b/libgui/graphics/Figure.cc --- a/libgui/graphics/Figure.cc +++ b/libgui/graphics/Figure.cc @@ -235,6 +235,14 @@ } } +void Figure::print (const QString& file_cmd, const QString& term) +{ + Canvas* canvas = m_container->canvas (m_handle); + + if (canvas) + canvas->print (file_cmd, term); +} + void Figure::beingDeleted (void) { Canvas* canvas = m_container->canvas (m_handle.value (), false); diff --git a/libgui/graphics/Figure.h b/libgui/graphics/Figure.h --- a/libgui/graphics/Figure.h +++ b/libgui/graphics/Figure.h @@ -82,6 +82,7 @@ protected: void redraw (void); + void print (const QString& file_cmd, const QString& term); void update (int pId); void updateBoundingBox (bool internal = false, int flags = 0); void beingDeleted (void); diff --git a/libgui/graphics/Object.cc b/libgui/graphics/Object.cc --- a/libgui/graphics/Object.cc +++ b/libgui/graphics/Object.cc @@ -24,6 +24,7 @@ #include #endif +#include #include #include "Backend.h" @@ -113,6 +114,14 @@ redraw (); } +void Object::slotPrint (const QString& file_cmd, const QString& term) +{ + gh_manager::auto_lock lock; + + if (object ().valid_object ()) + print (file_cmd, term); +} + void Object::update (int /* pId */) { } @@ -131,6 +140,10 @@ { } +void Object::print (const QString& file_cmd, const QString& term) +{ +} + void Object::beingDeleted (void) { } diff --git a/libgui/graphics/Object.h b/libgui/graphics/Object.h --- a/libgui/graphics/Object.h +++ b/libgui/graphics/Object.h @@ -28,6 +28,7 @@ #include "graphics.h" class QObject; +class QString; class QWidget; namespace QtHandles @@ -80,6 +81,7 @@ void slotUpdate (int pId); void slotFinalize (void); void slotRedraw (void); + void slotPrint (const QString& file_cmd, const QString& term); void objectDestroyed (QObject *obj = 0); @@ -90,6 +92,7 @@ virtual void update (int pId); virtual void finalize (void); virtual void redraw (void); + virtual void print (const QString& file_cmd, const QString& term); virtual void beingDeleted (void); diff --git a/libgui/graphics/ObjectProxy.cc b/libgui/graphics/ObjectProxy.cc --- a/libgui/graphics/ObjectProxy.cc +++ b/libgui/graphics/ObjectProxy.cc @@ -24,6 +24,8 @@ #include #endif +#include + #include "oct-mutex.h" #include "Object.h" @@ -50,6 +52,8 @@ m_object, SLOT (slotFinalize (void))); disconnect (this, SIGNAL (sendRedraw (void)), m_object, SLOT (slotRedraw (void))); + disconnect (this, SIGNAL (sendPrint (const QString&, const QString&)), + m_object, SLOT (slotPrint (const QString&, const QString&))); } m_object = obj; @@ -62,6 +66,8 @@ m_object, SLOT (slotFinalize (void))); connect (this, SIGNAL (sendRedraw (void)), m_object, SLOT (slotRedraw (void))); + connect (this, SIGNAL (sendPrint (const QString&, const QString&)), + m_object, SLOT (slotPrint (const QString&, const QString&))); } } } @@ -91,4 +97,9 @@ emit sendRedraw (); } + void ObjectProxy::print (const QString& file_cmd, const QString& term) +{ + emit sendPrint (file_cmd, term); +} + }; diff --git a/libgui/graphics/ObjectProxy.h b/libgui/graphics/ObjectProxy.h --- a/libgui/graphics/ObjectProxy.h +++ b/libgui/graphics/ObjectProxy.h @@ -25,6 +25,8 @@ #include +class QString; + namespace QtHandles { @@ -40,6 +42,7 @@ void update (int pId); void finalize (void); void redraw (void); + void print (const QString& file_cmd, const QString& term); Object* object (void) { return m_object; } void setObject (Object* obj); @@ -48,6 +51,7 @@ void sendUpdate (int pId); void sendFinalize (void); void sendRedraw (void); + void sendPrint (const QString& file_cmd, const QString& term); private: void init (Object* obj); diff --git a/scripts/plot/util/module.mk b/scripts/plot/util/module.mk --- a/scripts/plot/util/module.mk +++ b/scripts/plot/util/module.mk @@ -8,7 +8,6 @@ plot_util_PRIVATE_FCN_FILES = \ plot/util/private/__add_default_menu__.m \ plot/util/private/__fltk_ginput__.m \ - plot/util/private/__fltk_print__.m \ plot/util/private/__ghostscript__.m \ plot/util/private/__gnuplot_get_var__.m \ plot/util/private/__gnuplot_ginput__.m \ @@ -19,6 +18,7 @@ plot/util/private/__gnuplot_version__.m \ plot/util/private/__go_draw_axes__.m \ plot/util/private/__go_draw_figure__.m \ + plot/util/private/__opengl_print__.m \ plot/util/private/__print_parse_opts__.m \ plot/util/private/__tight_eps_bbox__.m diff --git a/scripts/plot/util/print.m b/scripts/plot/util/print.m --- a/scripts/plot/util/print.m +++ b/scripts/plot/util/print.m @@ -428,7 +428,7 @@ case "gnuplot" opts = __gnuplot_print__ (opts); otherwise - opts = __fltk_print__ (opts); + opts = __opengl_print__ (opts); endswitch unwind_protect_cleanup diff --git a/scripts/plot/util/private/__fltk_print__.m b/scripts/plot/util/private/__opengl_print__.m rename from scripts/plot/util/private/__fltk_print__.m rename to scripts/plot/util/private/__opengl_print__.m --- a/scripts/plot/util/private/__fltk_print__.m +++ b/scripts/plot/util/private/__opengl_print__.m @@ -17,11 +17,11 @@ ## . ## -*- texinfo -*- -## @deftypefn {Function File} {} __fltk_print__ (@var{@dots{}}) +## @deftypefn {Function File} {} __opengl_print__ (@var{@dots{}}) ## Undocumented internal function. ## @end deftypefn -function opts = __fltk_print__ (opts) +function opts = __opengl_print__ (opts) dos_shell = (ispc () && ! isunix ()); @@ -160,7 +160,7 @@ for n = 1:numel (pipeline) if (opts.debug) - fprintf ("fltk-pipeline: '%s'\n", pipeline{n}); + fprintf ("opengl-pipeline: '%s'\n", pipeline{n}); endif drawnow (gl2ps_device{n}, strcat ('|',pipeline{n})); endfor