Mercurial > octave
diff libinterp/corefcn/graphics-toolkit.h @ 23774:41795b504a8b
don't use singleton for gtk_manager
* graphics-handle.h, graphics-toolkit.cc, graphics-toolkit.h,
gtk-manager.cc, gtk-manager.h: New files, extracted from graphics.cc
and graphics.in.h.
* libinterp/corefcn/module.mk: Update.
* graphics.cc (Favailable_graphics_toolkits,
Fregister_graphics_toolkit, Floaded_graphics_toolkits): Now defined
with DEFMETHOD.
* main-window.cc (octave_interpreter::execute): Pass interpreter
object to Fregister_graphics_toolkit.
* interpreter-private.cc, interpreter-private.h
(__get_gtk_manager__): New function.
* interpreter.cc, interpreter.h
(interpreter::m_gtk_manager): New data member.
(interpreter::get_gtk_manager): New function.
(interpreter::cleanup): Update call to unload_all_toolkits.
* __init_qt__.cc (__init__): Pass reference to interpreter.
Update caller.
(__shutdown__): Don't call gtk_manager::unload_toolkit here.
(F__init_qt__): Define with DEFMETHOD.
* __init_fltk__.cc (F__init_fltk__): Access gtk_manager through
interpreter object.
* __init_gnuplot__.cc (gnuplot_graphics_toolkit::close):
Don't call gtk_manager::unload_toolkit here.
F__init_gnuplot__): Access gtk_manager through interpreter object.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 14 Jul 2017 16:05:59 -0400 |
parents | |
children | 194eb4bd202b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libinterp/corefcn/graphics-toolkit.h Fri Jul 14 16:05:59 2017 -0400 @@ -0,0 +1,226 @@ +/* + +Copyright (C) 2007-2017 John W. Eaton + +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 +<http://www.gnu.org/licenses/>. + +*/ + +#if ! defined (octave_graphics_toolkit_h) +#define octave_graphics_toolkit_h 1 + +#include "octave-config.h" + +#include <map> +#include <string> + +#include "dMatrix.h" + +#include "Cell.h" +#include "error.h" +#include "graphics-handle.h" + +class graphics_toolkit; +class graphics_object; + +class base_graphics_toolkit +{ +public: + friend class graphics_toolkit; + +public: + base_graphics_toolkit (const std::string& nm) + : name (nm), count (0) { } + + virtual ~base_graphics_toolkit (void) = default; + + std::string get_name (void) const { return name; } + + virtual bool is_valid (void) const { return false; } + + virtual void redraw_figure (const graphics_object&) const + { gripe_if_tkit_invalid ("redraw_figure"); } + + virtual void print_figure (const graphics_object&, const std::string&, + const std::string&, + const std::string& = "") const + { gripe_if_tkit_invalid ("print_figure"); } + + virtual uint8NDArray get_pixels (const graphics_object&) const + { + gripe_if_tkit_invalid ("get_pixels"); + return uint8NDArray (); + } + + virtual Matrix get_canvas_size (const graphics_handle&) const + { + gripe_if_tkit_invalid ("get_canvas_size"); + return Matrix (1, 2, 0.0); + } + + virtual double get_screen_resolution (void) const + { + gripe_if_tkit_invalid ("get_screen_resolution"); + return 72.0; + } + + virtual Matrix get_screen_size (void) const + { + gripe_if_tkit_invalid ("get_screen_size"); + return Matrix (1, 2, 0.0); + } + + // Callback function executed when the given graphics object + // changes. This allows the graphics toolkit to act on property + // changes if needed. + virtual void update (const graphics_object&, int) + { gripe_if_tkit_invalid ("base_graphics_toolkit::update"); } + + void update (const graphics_handle&, int); + + // Callback function executed when the given graphics object is + // created. This allows the graphics toolkit to do toolkit-specific + // initializations for a newly created object. + virtual bool initialize (const graphics_object&) + { + gripe_if_tkit_invalid ("base_graphics_toolkit::initialize"); + return false; + } + + bool initialize (const graphics_handle&); + + // Callback function executed just prior to deleting the given + // graphics object. This allows the graphics toolkit to perform + // toolkit-specific cleanup operations before an object is deleted. + virtual void finalize (const graphics_object&) + { gripe_if_tkit_invalid ("base_graphics_toolkit::finalize"); } + + void finalize (const graphics_handle&); + + // Close the graphics toolkit. + virtual void close (void) + { gripe_if_tkit_invalid ("base_graphics_toolkit::close"); } + +private: + std::string name; + octave::refcount<int> count; + +private: + void gripe_if_tkit_invalid (const std::string& fname) const + { + if (! is_valid ()) + error ("%s: invalid graphics toolkit", fname.c_str ()); + } +}; + +class graphics_toolkit +{ +public: + graphics_toolkit (void) + : rep (new base_graphics_toolkit ("unknown")) + { + rep->count++; + } + + graphics_toolkit (base_graphics_toolkit *b) + : rep (b) + { + rep->count++; + } + + graphics_toolkit (const graphics_toolkit& b) + : rep (b.rep) + { + rep->count++; + } + + ~graphics_toolkit (void) + { + if (--rep->count == 0) + delete rep; + } + + graphics_toolkit& operator = (const graphics_toolkit& b) + { + if (rep != b.rep) + { + if (--rep->count == 0) + delete rep; + + rep = b.rep; + rep->count++; + } + + return *this; + } + + operator bool (void) const { return rep->is_valid (); } + + std::string get_name (void) const { return rep->get_name (); } + + void redraw_figure (const graphics_object& go) const + { rep->redraw_figure (go); } + + void print_figure (const graphics_object& go, const std::string& term, + const std::string& file, + const std::string& debug_file = "") const + { rep->print_figure (go, term, file, debug_file); } + + uint8NDArray get_pixels (const graphics_object& go) const + { return rep->get_pixels (go); } + + Matrix get_canvas_size (const graphics_handle& fh) const + { return rep->get_canvas_size (fh); } + + double get_screen_resolution (void) const + { return rep->get_screen_resolution (); } + + Matrix get_screen_size (void) const + { return rep->get_screen_size (); } + + // Notifies graphics toolkit that object't property has changed. + void update (const graphics_object& go, int id) + { rep->update (go, id); } + + void update (const graphics_handle& h, int id) + { rep->update (h, id); } + + // Notifies graphics toolkit that new object was created. + bool initialize (const graphics_object& go) + { return rep->initialize (go); } + + bool initialize (const graphics_handle& h) + { return rep->initialize (h); } + + // Notifies graphics toolkit that object was destroyed. + // This is called only for explicitly deleted object. + // Children are deleted implicitly and graphics toolkit isn't notified. + void finalize (const graphics_object& go) + { rep->finalize (go); } + + void finalize (const graphics_handle& h) + { rep->finalize (h); } + + // Close the graphics toolkit. + void close (void) { rep->close (); } + +private: + + base_graphics_toolkit *rep; +}; + +#endif