Blob Blame Raw
#ifndef CONTEXT_H
#define CONTEXT_H


#include <cassert>

#include <cairomm/cairomm.h>

#include "color.h"
#include "vector.h"
#include "curve.h"

class ActivePoint;


class Context {
public:
	Cairo::RefPtr<Cairo::Context> context;
	
	explicit Context(
		const Cairo::RefPtr<Cairo::Context> &context = Cairo::RefPtr<Cairo::Context>()
	): context(context) { }

	Cairo::RefPtr<Cairo::Context> ctx() const { assert(context); return context; }
	Cairo::Context* operator->() const { return context.operator->(); }
	
	Real pixelsize_sqr() const;
	Real pixelsize() const;

	void set_source_rgb(const Color &c) const
		{ ctx()->set_source_rgb(c.r, c.g, c.b); }
	void set_source_rgba(const Color &c) const
		{ ctx()->set_source_rgba(c.r, c.g, c.b, c.a); }
	void set_line_width_px(const Real &pixels) const
		{ ctx()->set_line_width( pixels*pixelsize() ); }
	
	void move_to(const Vector &p) const
		{ ctx()->move_to(p.x, p.y); }
	void line_to(const Vector &p) const
		{ ctx()->line_to(p.x, p.y); }
	
	void point(const ActivePoint &point) const;
	void bezier(const Bezier &bezier, bool jump = false) const;
	void hermite(const Hermite &hermite, bool jump = false) const
		{ bezier(hermite.get_bezier(), jump); }
};


#endif