# HG changeset patch # User jwe # Date 1201249488 0 # Node ID f62fb98f1da27915b0da38809350a97eb7a3d760 # Parent 42b70df74c215113f8aadc17832276ece700bfab [project @ 2008-01-25 08:24:48 by jwe] diff -r 42b70df74c21 -r f62fb98f1da2 src/ChangeLog --- a/src/ChangeLog Fri Jan 25 07:19:27 2008 +0000 +++ b/src/ChangeLog Fri Jan 25 08:24:48 2008 +0000 @@ -1,3 +1,12 @@ +2008-01-25 Michael Goffioul + + * graphics.h.in (base_properties::get_backend, + base_graphics_object::get_backend, graphics_backend::get_backend): + New methods for convenient access to the backend. + (figure::get_backend, figure::set_backend): Remove. + * graphics.cc (base_properties::get_backend): New method. + (Fdrawnow): Use graphics_object::get_backend to simplify code. + 2008-01-24 Pascal Dupuis * mxarray.h.in: Include . diff -r 42b70df74c21 -r f62fb98f1da2 src/graphics.cc --- a/src/graphics.cc Fri Jan 25 07:19:27 2008 +0000 +++ b/src/graphics.cc Fri Jan 25 08:24:48 2008 +0000 @@ -1149,6 +1149,17 @@ gh_manager::free (children(i)); } +graphics_backend +base_properties::get_backend (void) const +{ + graphics_object go = gh_manager::get_object (get_parent ()); + + if (go) + return go.get_backend (); + else + return graphics_backend (); +} + // --------------------------------------------------------------------- class gnuplot_backend : public base_graphics_backend @@ -2466,9 +2477,7 @@ { graphics_object go = gh_manager::get_object (h); - figure::properties& fprops = dynamic_cast (go.get_properties ()); - - fprops.get_backend () + go.get_backend () .print_figure (h, term, file, mono, debug_file); } else diff -r 42b70df74c21 -r f62fb98f1da2 src/graphics.h.in --- a/src/graphics.h.in Fri Jan 25 07:19:27 2008 +0000 +++ b/src/graphics.h.in Fri Jan 25 08:24:48 2008 +0000 @@ -955,6 +955,121 @@ // --------------------------------------------------------------------- +class graphics_backend; + +class base_graphics_backend +{ +public: + friend class graphics_backend; + +public: + base_graphics_backend (const std::string& nm) + : name (nm), count (0) { } + + virtual ~base_graphics_backend (void) { } + + std::string get_name (void) const { return name; } + + virtual bool is_valid (void) const { return false; } + + virtual void close_figure (const octave_value&) const + { error ("close_figure: invalid graphics backend"); } + + virtual void redraw_figure (const graphics_handle&) const + { error ("redraw_figure: invalid graphics backend"); } + + virtual void print_figure (const graphics_handle&, const std::string&, + const std::string&, bool, + const std::string& = "") const + { error ("print_figure: invalid graphics backend"); } + + virtual Matrix get_canvas_size (const graphics_handle&) const + { + error ("get_canvas_size: invalid graphics backend"); + return Matrix (1, 2, 0.0); + } + +private: + std::string name; + int count; +}; + +class graphics_backend +{ +public: + graphics_backend (void) + : rep (new base_graphics_backend ("unknown")) + { + rep->count++; + } + + graphics_backend (base_graphics_backend* b) + : rep (b) + { + rep->count++; + } + + graphics_backend (const graphics_backend& b) + : rep (b.rep) + { + rep->count++; + } + + ~graphics_backend (void) + { + if (--rep->count == 0) + delete rep; + } + + graphics_backend& operator = (const graphics_backend& 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 close_figure (const octave_value& pstream) const + { rep->close_figure (pstream); } + + void redraw_figure (const graphics_handle& fh) const + { rep->redraw_figure (fh); } + + void print_figure (const graphics_handle& fh, const std::string& term, + const std::string& file, bool mono, + const std::string& debug_file = "") const + { rep->print_figure (fh, term, file, mono, debug_file); } + + Matrix get_canvas_size (const graphics_handle& fh) const + { return rep->get_canvas_size (fh); } + + OCTINTERP_API static graphics_backend default_backend (void); + + static void register_backend (const graphics_backend& b) + { available_backends[b.get_name ()] = b; } + + static void unregister_backend (const std::string& name) + { available_backends.erase (name); } + +private: + base_graphics_backend *rep; + +private: + static std::map available_backends; +}; + +// --------------------------------------------------------------------- + class base_graphics_object; class OCTINTERP_API base_properties @@ -1068,6 +1183,8 @@ children(n) = h.value (); } + virtual graphics_backend get_backend (void) const; + void set_tag (const octave_value& val) { tag = val; } void set_parent (const octave_value& val); @@ -1465,6 +1582,17 @@ return type () == go_name; } + virtual graphics_backend get_backend (void) const + { + if (valid_object ()) + return get_properties ().get_backend (); + else + { + error ("base_graphics_object::get_backend: invalid graphics object"); + return graphics_backend (); + } + } + protected: // A reference count. int count; @@ -1629,123 +1757,10 @@ return props.get_cdata_property (); } -private: - base_graphics_object *rep; -}; - -// --------------------------------------------------------------------- - -class graphics_backend; - -class base_graphics_backend -{ -public: - friend class graphics_backend; - -public: - base_graphics_backend (const std::string& nm) - : name (nm), count (0) { } - - virtual ~base_graphics_backend (void) { } - - std::string get_name (void) const { return name; } - - virtual bool is_valid (void) const { return false; } - - virtual void close_figure (const octave_value&) const - { error ("close_figure: invalid graphics backend"); } - - virtual void redraw_figure (const graphics_handle&) const - { error ("redraw_figure: invalid graphics backend"); } - - virtual void print_figure (const graphics_handle&, const std::string&, - const std::string&, bool, - const std::string& = "") const - { error ("print_figure: invalid graphics backend"); } - - virtual Matrix get_canvas_size (const graphics_handle&) const - { - error ("get_canvas_size: invalid graphics backend"); - return Matrix (1, 2, 0.0); - } + graphics_backend get_backend (void) const { return rep->get_backend (); } private: - std::string name; - int count; -}; - -class graphics_backend -{ -public: - graphics_backend (void) - : rep (new base_graphics_backend ("unknown")) - { - rep->count++; - } - - graphics_backend (base_graphics_backend* b) - : rep (b) - { - rep->count++; - } - - graphics_backend (const graphics_backend& b) - : rep (b.rep) - { - rep->count++; - } - - ~graphics_backend (void) - { - if (--rep->count == 0) - delete rep; - } - - graphics_backend& operator = (const graphics_backend& 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 close_figure (const octave_value& pstream) const - { rep->close_figure (pstream); } - - void redraw_figure (const graphics_handle& fh) const - { rep->redraw_figure (fh); } - - void print_figure (const graphics_handle& fh, const std::string& term, - const std::string& file, bool mono, - const std::string& debug_file = "") const - { rep->print_figure (fh, term, file, mono, debug_file); } - - Matrix get_canvas_size (const graphics_handle& fh) const - { return rep->get_canvas_size (fh); } - - OCTINTERP_API static graphics_backend default_backend (void); - - static void register_backend (const graphics_backend& b) - { available_backends[b.get_name ()] = b; } - - static void unregister_backend (const std::string& name) - { available_backends.erase (name); } - -private: - base_graphics_backend *rep; - -private: - static std::map available_backends; + base_graphics_object *rep; }; // --------------------------------------------------------------------- @@ -2013,12 +2028,6 @@ bool valid_object (void) const { return true; } - graphics_backend get_backend (void) const - { return xproperties.get_backend (); } - - void set_backend (const graphics_backend& b) - { xproperties.set_backend (b); } - private: property_list default_properties; };