/* -*- c++ -*- * Copyright ©2008 Hugo Mills * * This software is distributed under the terms of the GNU GPL v3 * For more information on the GPL, see the file COPYING or * visit http://www.gnu.org/ * * This software is distributed without warranty */ #ifndef RENDERCONTEXT_H #define RENDERCONTEXT_H #include "magellan/xfview.h" #include "magellan/content.h" #include "magellan/output.h" #include "magellan/xfmap.h" #include "magellan/xforbit.h" #include "magellan/xfsphere.h" #include "mdisplay.h" class RenderContext { public: RenderContext(int l, MDisplay* disp, XfView* port = NULL) : layer(l), myviewport(false), viewport(port), display(disp) { if(port == NULL) { if(display != NULL) viewport = display->getviewport(); else std::cerr << "Error: viewport uninitialised" << std::endl; } } // We don't use the default shallow copy constructor RenderContext(const RenderContext&); virtual ~RenderContext(); virtual void render(Output* bitmap) const { display->plot(bitmap, viewport); } int left(void) const { return viewport->bottom_left[0]; } int bottom(void) const { return viewport->bottom_left[1]; } int right(void) const { return viewport->top_right[0]; } int top(void) const { return viewport->top_right[1]; } const ivec2& bl(void) const { return viewport->bottom_left; } const ivec2& tr(void) const { return viewport->top_right; } int xsize(void) const { return right() - left(); } int ysize(void) const { return top() - bottom(); } virtual int size(void) const { return xsize() * ysize(); } bool operator<(const RenderContext& that) const; bool overlaps(const RenderContext* that) const; bool contains(const RenderContext* that) const; bool contains_point(const ivec2&) const; bool bestsplit(RenderContext** r0, RenderContext** r1, const RenderContext* what) const; virtual void halve(RenderContext** r0, RenderContext** r1) const; int epsilon(const RenderContext* that) const; MDisplay* getdisplay(void) { return display; } XfView* getviewport(void) { return viewport; } protected: int layer; bool myviewport; // Do we own this viewport, or does someone else? XfView* viewport; MDisplay* display; bool slice(RenderContext** r0, RenderContext** r1, const ivec2& from, const ivec2& to) const; int canslice(const ivec2& from, const ivec2& to) const; std::ostream& print(std::ostream&) const; friend std::ostream& operator<<(std::ostream&, const RenderContext&); }; inline std::ostream& operator<<(std::ostream& o, const RenderContext& r) { return r.print(o); } #endif