Index: src/graphics.h.in =================================================================== RCS file: /cvs/octave/src/graphics.h.in,v retrieving revision 1.48 diff -c -p -r1.48 graphics.h.in *** src/graphics.h.in 22 Jan 2008 19:42:48 -0000 1.48 --- src/graphics.h.in 24 Jan 2008 11:20:05 -0000 *************** private: *** 955,960 **** --- 955,1075 ---- // --------------------------------------------------------------------- + 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 *************** public: *** 1068,1073 **** --- 1183,1190 ---- 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); *************** public: *** 1465,1470 **** --- 1582,1598 ---- 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; *************** public: *** 1629,1751 **** 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); ! } ! ! 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; }; // --------------------------------------------------------------------- --- 1757,1766 ---- return props.get_cdata_property (); } ! graphics_backend get_backend (void) const { return rep->get_backend (); } private: ! base_graphics_object *rep; }; // --------------------------------------------------------------------- *************** public: *** 2013,2024 **** 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; }; --- 2028,2033 ---- Index: src/graphics.cc =================================================================== RCS file: /cvs/octave/src/graphics.cc,v retrieving revision 1.78 diff -c -p -r1.78 graphics.cc *** src/graphics.cc 22 Jan 2008 20:32:00 -0000 1.78 --- src/graphics.cc 24 Jan 2008 11:20:05 -0000 *************** base_properties::delete_children (void) *** 1149,1154 **** --- 1149,1165 ---- 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 *************** Undocumented internal function.\n\ *** 2466,2474 **** { graphics_object go = gh_manager::get_object (h); ! figure::properties& fprops = dynamic_cast (go.get_properties ()); ! ! fprops.get_backend () .print_figure (h, term, file, mono, debug_file); } else --- 2477,2483 ---- { graphics_object go = gh_manager::get_object (h); ! go.get_backend () .print_figure (h, term, file, mono, debug_file); } else