Blame c++/contourgl/polyspan.h

Ivan Mahonin 93cbac
/*
Ivan Mahonin 93cbac
	polyspan.h
Ivan Mahonin 93cbac
	Polyspan Header
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
Ivan Mahonin 93cbac
	Copyright (c) 2007, 2008 Chris Moore
Ivan Mahonin 93cbac
	Copyright (c) 2012-2013 Carlos López
Ivan Mahonin 93cbac
	......... ... 2015 Ivan Mahonin
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	This package is free software; you can redistribute it and/or
Ivan Mahonin 93cbac
	modify it under the terms of the GNU General Public License as
Ivan Mahonin 93cbac
	published by the Free Software Foundation; either version 2 of
Ivan Mahonin 93cbac
	the License, or (at your option) any later version.
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	This package is distributed in the hope that it will be useful,
Ivan Mahonin 93cbac
	but WITHOUT ANY WARRANTY; without even the implied warranty of
Ivan Mahonin 93cbac
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Ivan Mahonin 93cbac
	General Public License for more details.
Ivan Mahonin 93cbac
*/
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#ifndef _POLYSPAN_H_
Ivan Mahonin 93cbac
#define _POLYSPAN_H_
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#include <vector>
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#include "geometry.h"
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
class Polyspan {
Ivan Mahonin 93cbac
public:
Ivan Mahonin 93cbac
	struct PenMark {
Ivan Mahonin 93cbac
		int y, x;
Ivan Mahonin 93cbac
		Real cover, area;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
		PenMark(): y(), x(), cover(), area() { }
Ivan Mahonin 93cbac
		PenMark(int xin, int yin, Real c, Real a):
Ivan Mahonin 93cbac
			y(yin), x(xin), cover(c), area(a) { }
Ivan Mahonin 93cbac
		void set(int xin, int yin, Real c, Real a)
Ivan Mahonin 93cbac
			{ y = yin; x = xin; cover = c; area = a; }
Ivan Mahonin 93cbac
		void setcoord(int xin, int yin)
Ivan Mahonin 93cbac
			{ y = yin; x = xin;	}
Ivan Mahonin 93cbac
		void setcover(Real c, Real a)
Ivan Mahonin 93cbac
			{ cover	= c; area = a; }
Ivan Mahonin 93cbac
		void addcover(Real c, Real a)
Ivan Mahonin 93cbac
			{ cover += c; area += a; }
Ivan Mahonin 93cbac
		bool operator < (const PenMark &rhs) const
Ivan Mahonin 93cbac
			{ return y == rhs.y ? x < rhs.x : y < rhs.y; }
Ivan Mahonin 93cbac
	};
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	typedef	std::vector<PenMark> cover_array;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//for assignment to flags value
Ivan Mahonin 93cbac
	enum PolySpanFlags {
Ivan Mahonin 93cbac
		NotSorted = 0x8000,
Ivan Mahonin 93cbac
		NotClosed =	0x4000
Ivan Mahonin 93cbac
	};
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	enum {
Ivan Mahonin 93cbac
		MAX_SUBDIVISION_SIZE = 64,
Ivan Mahonin 93cbac
		MIN_SUBDIVISION_DRAW_LEVELS = 4
Ivan Mahonin 93cbac
	};
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
private:
Ivan Mahonin 93cbac
	Vector			arc[3*MAX_SUBDIVISION_SIZE + 1];
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	cover_array		covers;
Ivan Mahonin 93cbac
	PenMark			current;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	int				open_index;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//ending position of last primitive
Ivan Mahonin 93cbac
	Real			cur_x;
Ivan Mahonin 93cbac
	Real			cur_y;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//starting position of current primitive list
Ivan Mahonin 93cbac
	Real			close_x;
Ivan Mahonin 93cbac
	Real			close_y;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//flags for the current segment
Ivan Mahonin 93cbac
	int				flags;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//the window that will be drawn (used for clipping)
Ivan Mahonin 93cbac
	ContextRect		window;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//add the current cell, but only if there is information to add
Ivan Mahonin 93cbac
	void addcurrent();
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//move to the next cell (cover values 0 initially), keeping the current if necessary
Ivan Mahonin 93cbac
	void move_pen(int x, int y);
Ivan Mahonin 93cbac
Ivan Mahonin a7f97a
	static bool clip_conic(const Vector *p, const ContextRect &r);
Ivan Mahonin a7f97a
	static Real max_edges_conic(const Vector *p);
Ivan Mahonin 93cbac
	static void subd_conic_stack(Vector *arc);
Ivan Mahonin 93cbac
Ivan Mahonin a7f97a
	static bool clip_cubic(const Vector *p, const ContextRect &r);
Ivan Mahonin a7f97a
	static Real max_edges_cubic(const Vector *p);
Ivan Mahonin 93cbac
	static void subd_cubic_stack(Vector *arc);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
public:
Ivan Mahonin 93cbac
	Polyspan();
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	const ContextRect& get_window() const { return window; }
Ivan Mahonin 93cbac
	const cover_array& get_covers() const { return covers; }
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	bool notclosed() const
Ivan Mahonin 93cbac
		{ return (flags & NotClosed) || (cur_x != close_x) || (cur_y != close_y); }
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//0 out all the variables involved in processing
Ivan Mahonin 93cbac
	void clear();
Ivan Mahonin 93cbac
	void init(const ContextRect &window)
Ivan Mahonin 93cbac
		{ clear(); this->window = window; }
Ivan Mahonin 93cbac
	void init(int minx, int miny, int maxx, int maxy)
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		clear();
Ivan Mahonin 93cbac
		window.minx = minx;
Ivan Mahonin 93cbac
		window.miny = miny;
Ivan Mahonin 93cbac
		window.maxx = maxx;
Ivan Mahonin 93cbac
		window.maxy = maxy;
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//close the primitives with a line (or rendering will not work as expected)
Ivan Mahonin 93cbac
	void close();
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	// Not recommended - destroys any separation of spans currently held
Ivan Mahonin 93cbac
	void merge_all();
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//will sort the marks if they are not sorted
Ivan Mahonin 93cbac
	void sort_marks();
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//encapsulate the current sublist of marks (used for drawing)
Ivan Mahonin 93cbac
	void encapsulate_current();
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//move to start a new primitive list (enclose the last primitive if need be)
Ivan Mahonin 93cbac
	void move_to(Real x, Real y);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	//primitive_to functions
Ivan Mahonin 93cbac
	void line_to(Real x, Real y);
Ivan Mahonin 93cbac
	void conic_to(Real x1, Real y1, Real x, Real y);
Ivan Mahonin 93cbac
	void cubic_to(Real x1, Real y1, Real x2, Real y2, Real x, Real y);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	void draw_scanline(int y, Real x1, Real y1, Real x2, Real y2);
Ivan Mahonin 93cbac
	void draw_line(Real x1, Real y1, Real x2, Real y2);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	Real extract_alpha(Real area, bool evenodd) const;
Ivan Mahonin 93cbac
};
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#endif