Blame c++/contourgl/contour.h

Ivan Mahonin faaf7d
/*
Ivan Mahonin faaf7d
    ......... 2015 Ivan Mahonin
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
    This program is free software: you can redistribute it and/or modify
Ivan Mahonin faaf7d
    it under the terms of the GNU General Public License as published by
Ivan Mahonin faaf7d
    the Free Software Foundation, either version 3 of the License, or
Ivan Mahonin faaf7d
    (at your option) any later version.
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
    This program is distributed in the hope that it will be useful,
Ivan Mahonin faaf7d
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Ivan Mahonin faaf7d
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Ivan Mahonin faaf7d
    GNU General Public License for more details.
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
    You should have received a copy of the GNU General Public License
Ivan Mahonin faaf7d
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
Ivan Mahonin faaf7d
*/
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
#ifndef _CONTOUR_H_
Ivan Mahonin faaf7d
#define _CONTOUR_H_
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
#include <vector>
Ivan Mahonin faaf7d
Ivan Mahonin 93cbac
#include "geometry.h"
Ivan Mahonin 93cbac
#include "polyspan.h"
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
class Contour
Ivan Mahonin faaf7d
{
Ivan Mahonin faaf7d
public:
Ivan Mahonin faaf7d
	enum ChunkType {
Ivan Mahonin faaf7d
		CLOSE,
Ivan Mahonin faaf7d
		MOVE,
Ivan Mahonin faaf7d
		LINE,
Ivan Mahonin faaf7d
		CUBIC,
Ivan Mahonin faaf7d
		CONIC
Ivan Mahonin faaf7d
	};
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	struct Chunk {
Ivan Mahonin faaf7d
		ChunkType type;
Ivan Mahonin faaf7d
		Vector p1, t0, t1;
Ivan Mahonin faaf7d
		Chunk(): type() { }
Ivan Mahonin faaf7d
		Chunk(ChunkType type, const Vector &p1, const Vector &t0 = Vector(), const Vector &t1 = Vector()):
Ivan Mahonin faaf7d
			type(type), p1(p1), t0(t0), t1(t1) { }
Ivan Mahonin faaf7d
	};
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	typedef std::vector<Chunk> ChunkList;
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
private:
Ivan Mahonin faaf7d
	static const Vector blank;
Ivan Mahonin faaf7d
	ChunkList chunks;
Ivan Mahonin faaf7d
	size_t first;
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
public:
Ivan Mahonin faaf7d
	Contour(): first(0) { }
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	void clear();
Ivan Mahonin faaf7d
	void move_to(const Vector &v);
Ivan Mahonin faaf7d
	void line_to(const Vector &v);
Ivan Mahonin faaf7d
	void cubic_to(const Vector &v, const Vector &t0, const Vector &t1);
Ivan Mahonin faaf7d
	void conic_to(const Vector &v, const Vector &t);
Ivan Mahonin faaf7d
	void close();
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	const ChunkList& get_chunks() const { return chunks; }
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	const Vector& current() const
Ivan Mahonin faaf7d
		{ return chunks.empty() ? blank : chunks.back().p1; }
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	void split(Contour &c, const Rect &bounds, const Vector &min_size) const;
Ivan Mahonin faaf7d
Ivan Mahonin 93cbac
	void transform(const Rect &from, const Rect &to);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	void to_polyspan(Polyspan &polyspan) const;
Ivan Mahonin 93cbac
Ivan Mahonin faaf7d
private:
Ivan Mahonin faaf7d
	void line_split(
Ivan Mahonin faaf7d
		Rect &ref_line_bounds,
Ivan Mahonin faaf7d
		const Rect &bounds,
Ivan Mahonin faaf7d
		const Vector &min_size,
Ivan Mahonin faaf7d
		const Vector &p1 );
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	void conic_split(
Ivan Mahonin faaf7d
		Rect &ref_line_bounds,
Ivan Mahonin faaf7d
		const Rect &bounds,
Ivan Mahonin faaf7d
		const Vector &min_size,
Ivan Mahonin faaf7d
		const Vector &p1,
Ivan Mahonin faaf7d
		const Vector &center,
Ivan Mahonin 93cbac
		Real radius,
Ivan Mahonin 93cbac
		Real radians0,
Ivan Mahonin 93cbac
		Real radians1,
Ivan Mahonin faaf7d
		int level = 64 );
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	void cubic_split(
Ivan Mahonin faaf7d
		Rect &ref_line_bounds,
Ivan Mahonin faaf7d
		const Rect &bounds,
Ivan Mahonin faaf7d
		const Vector &min_size,
Ivan Mahonin faaf7d
		const Vector &p1,
Ivan Mahonin faaf7d
		const Vector &bezier_pp0,
Ivan Mahonin faaf7d
		const Vector &bezier_pp1,
Ivan Mahonin faaf7d
		int level = 64 );
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	static bool conic_convert(
Ivan Mahonin faaf7d
		const Vector &p0,
Ivan Mahonin faaf7d
		const Vector &p1,
Ivan Mahonin faaf7d
		const Vector &t,
Ivan Mahonin faaf7d
		Vector &out_center,
Ivan Mahonin 93cbac
		Real &out_radius,
Ivan Mahonin 93cbac
		Real &out_radians0,
Ivan Mahonin 93cbac
		Real &out_radians1 );
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	static Rect conic_bounds(
Ivan Mahonin faaf7d
		const Vector &p0,
Ivan Mahonin faaf7d
		const Vector &p1,
Ivan Mahonin faaf7d
		const Vector &center,
Ivan Mahonin 93cbac
		Real radius,
Ivan Mahonin 93cbac
		Real radians0,
Ivan Mahonin 93cbac
		Real radians1 );
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	static void cubic_convert(
Ivan Mahonin faaf7d
		const Vector &p0,
Ivan Mahonin faaf7d
		const Vector &p1,
Ivan Mahonin faaf7d
		const Vector &t0,
Ivan Mahonin faaf7d
		const Vector &t1,
Ivan Mahonin faaf7d
		Vector &out_bezier_pp0,
Ivan Mahonin faaf7d
		Vector &out_bezier_pp1 );
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
	static Rect cubic_bounds(
Ivan Mahonin faaf7d
		const Vector &p0,
Ivan Mahonin faaf7d
		const Vector &p1,
Ivan Mahonin faaf7d
		const Vector &bezier_pp0,
Ivan Mahonin faaf7d
		const Vector &bezier_pp1 );
Ivan Mahonin faaf7d
};
Ivan Mahonin faaf7d
Ivan Mahonin faaf7d
#endif