Blame c++/contourgl/swrender.h

Ivan Mahonin 93cbac
/*
Ivan Mahonin 93cbac
    ......... 2015 Ivan Mahonin
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
    This program is free software: you can redistribute it and/or modify
Ivan Mahonin 93cbac
    it under the terms of the GNU General Public License as published by
Ivan Mahonin 93cbac
    the Free Software Foundation, either version 3 of the License, or
Ivan Mahonin 93cbac
    (at your option) any later version.
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
    This program 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
Ivan Mahonin 93cbac
    GNU General Public License for more details.
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
    You should have received a copy of the GNU General Public License
Ivan Mahonin 93cbac
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
Ivan Mahonin 93cbac
*/
Ivan Mahonin 93cbac
Ivan Mahonin 572d9c
#ifndef _SWRENDER_H_
Ivan Mahonin 572d9c
#define _SWRENDER_H_
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#include <cstring>
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#include "polyspan.h"
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
class Color {
Ivan Mahonin 93cbac
public:
Ivan Mahonin 93cbac
	typedef float type;
Ivan Mahonin 7c6b57
	union {
Ivan Mahonin 7c6b57
		struct { type r, g, b, a; };
Ivan Mahonin 7c6b57
		struct { type channels[4]; };
Ivan Mahonin 7c6b57
	};
Ivan Mahonin 7c6b57
Ivan Mahonin 93cbac
	Color(): r(), g(), b(), a() { }
Ivan Mahonin 93cbac
	Color(type r, type g, type b, type a): r(r), g(g), b(b), a(a) { }
Ivan Mahonin 93cbac
	Color(const Color &color, type a): r(color.r), g(color.g), b(color.b), a(color.a*a) { }
Ivan Mahonin 93cbac
};
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
class Surface {
Ivan Mahonin 93cbac
public:
Ivan Mahonin 93cbac
	const int width, height;
Ivan Mahonin 93cbac
	Color * const data;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	Surface(int width, int height):
Ivan Mahonin 93cbac
		width(width), height(height), data(new Color[width*height])
Ivan Mahonin 93cbac
		{ clear(); }
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	~Surface()
Ivan Mahonin 5890eb
		{ delete[] data; }
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	void clear() { memset(data, 0, count()*sizeof(Color)); }
Ivan Mahonin 93cbac
	int count() const { return width*height; }
Ivan Mahonin f83e6b
	int data_size() const { return count()*sizeof(Color); }
Ivan Mahonin 93cbac
	Color* operator[] (int row) { return data + row*width; }
Ivan Mahonin 93cbac
	const Color* operator[] (int row) const { return data + row*width; }
Ivan Mahonin 93cbac
};
Ivan Mahonin 93cbac
Ivan Mahonin 572d9c
class SwRender {
Ivan Mahonin 93cbac
public:
Ivan Mahonin 93cbac
	static void fill(
Ivan Mahonin 93cbac
		Surface &target,
Ivan Mahonin 93cbac
		const Color &color );
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	static void fill(
Ivan Mahonin 93cbac
		Surface &target,
Ivan Mahonin 93cbac
		const Color &color,
Ivan Mahonin 93cbac
		int left,
Ivan Mahonin 93cbac
		int top,
Ivan Mahonin 93cbac
		int width,
Ivan Mahonin 93cbac
		int height );
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	static void row(
Ivan Mahonin 93cbac
		Surface &target,
Ivan Mahonin 93cbac
		const Color &color,
Ivan Mahonin 93cbac
		int left,
Ivan Mahonin 93cbac
		int top,
Ivan Mahonin 93cbac
		int length );
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	static void row_alpha(
Ivan Mahonin 93cbac
		Surface &target,
Ivan Mahonin 93cbac
		const Color &color,
Ivan Mahonin 93cbac
		Color::type alpha,
Ivan Mahonin 93cbac
		int left,
Ivan Mahonin 93cbac
		int top,
Ivan Mahonin 93cbac
		int length );
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	static void polyspan(
Ivan Mahonin 93cbac
		Surface &target,
Ivan Mahonin 93cbac
		const Polyspan &polyspan,
Ivan Mahonin 93cbac
		const Color &color,
Ivan Mahonin 93cbac
		bool evenodd,
Ivan Mahonin 93cbac
		bool invert );
Ivan Mahonin 93cbac
};
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#endif