Blame c++/contourgl/test.cpp

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 7c6b57
#include <cassert>
Ivan Mahonin 7c6b57
Ivan Mahonin 93cbac
#include <fstream>
Ivan Mahonin 93cbac
#include <iostream>
Ivan Mahonin a80036
#include <iomanip>
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#include <GL/gl.h>
Ivan Mahonin 93cbac
#include <GL/glext.h>
Ivan Mahonin 93cbac
#include <GL/glx.h>
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#include "test.h"
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#include "contour.h"
Ivan Mahonin 93cbac
#include "rendersw.h"
Ivan Mahonin 93cbac
#include "contourbuilder.h"
Ivan Mahonin 7c6b57
#include "shaders.h"
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
using namespace std;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
class Test::Helper {
Ivan Mahonin 93cbac
public:
Ivan Mahonin 93cbac
	static void save_rgba(
Ivan Mahonin 93cbac
		const void *buffer,
Ivan Mahonin 93cbac
		int width,
Ivan Mahonin 93cbac
		int height,
Ivan Mahonin 93cbac
		bool flip,
Ivan Mahonin 93cbac
		const string &filename )
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		// create file
Ivan Mahonin 93cbac
		ofstream f(filename.c_str(), ofstream::out | ofstream::trunc | ofstream::binary);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
		// write header
Ivan Mahonin 93cbac
		unsigned char targa_header[] = {
Ivan Mahonin 93cbac
			0,    // Length of the image ID field (0 - no ID field)
Ivan Mahonin 93cbac
			0,    // Whether a color map is included (0 - no colormap)
Ivan Mahonin 93cbac
			2,    // Compression and color types (2 - uncompressed true-color image)
Ivan Mahonin 93cbac
			0, 0, 0, 0, 0, // Color map specification (not need for us)
Ivan Mahonin 93cbac
			0, 0, // X-origin
Ivan Mahonin 93cbac
			0, 0, // Y-origin
Ivan Mahonin 93cbac
			(unsigned char)(width & 0xff), // Image width
Ivan Mahonin 93cbac
			(unsigned char)(width >> 8),
Ivan Mahonin 93cbac
			(unsigned char)(height & 0xff), // Image height
Ivan Mahonin 93cbac
			(unsigned char)(height >> 8),
Ivan Mahonin 93cbac
			32,   // Bits per pixel
Ivan Mahonin 93cbac
			0     // Image descriptor (keep zero for capability)
Ivan Mahonin 93cbac
		};
Ivan Mahonin 93cbac
		f.write((char*)targa_header, sizeof(targa_header));
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
		// write data
Ivan Mahonin 93cbac
		if (flip) {
Ivan Mahonin 93cbac
			int line_size = 4*width;
Ivan Mahonin 93cbac
			const char *end = (char*)buffer;
Ivan Mahonin 93cbac
			const char *current = end + height*line_size;
Ivan Mahonin 93cbac
			while(current > end) {
Ivan Mahonin 93cbac
				current -= line_size;
Ivan Mahonin 93cbac
				f.write(current, line_size);
Ivan Mahonin 93cbac
			}
Ivan Mahonin 93cbac
		} else {
Ivan Mahonin 93cbac
			f.write((const char*)buffer, 4*width*height);
Ivan Mahonin 93cbac
		}
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	static void save_viewport(const string &filename) {
Ivan Mahonin 93cbac
		glFinish();
Ivan Mahonin 7704aa
Ivan Mahonin 7704aa
		GLint  vp[4] = {};
Ivan Mahonin 93cbac
		glGetIntegerv(GL_VIEWPORT, vp);
Ivan Mahonin 7704aa
Ivan Mahonin 7704aa
		GLint draw_buffer = 0, read_buffer = 0;
Ivan Mahonin 7704aa
		glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &draw_buffer);
Ivan Mahonin 7704aa
		glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &read_buffer);
Ivan Mahonin 7704aa
		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, (GLuint)read_buffer);
Ivan Mahonin 7704aa
		glBindFramebuffer(GL_READ_FRAMEBUFFER, (GLuint)draw_buffer);
Ivan Mahonin 7704aa
		glBlitFramebuffer(vp[0], vp[1], vp[2], vp[3], vp[0], vp[1], vp[2], vp[3], GL_COLOR_BUFFER_BIT, GL_NEAREST);
Ivan Mahonin 7704aa
		glFinish();
Ivan Mahonin 7704aa
		glBindFramebuffer(GL_DRAW_FRAMEBUFFER, (GLuint)draw_buffer);
Ivan Mahonin 7704aa
		glBindFramebuffer(GL_READ_FRAMEBUFFER, (GLuint)read_buffer);
Ivan Mahonin 7704aa
Ivan Mahonin 93cbac
		char *buffer = new char[vp[2]*vp[3]*4];
Ivan Mahonin 93cbac
		glReadPixels(vp[0], vp[1], vp[2], vp[3], GL_BGRA, GL_UNSIGNED_BYTE, buffer);
Ivan Mahonin 7704aa
Ivan Mahonin 7704aa
Ivan Mahonin 93cbac
		save_rgba(buffer, vp[2], vp[3], false, filename);
Ivan Mahonin 93cbac
		delete buffer;
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	static void save_surface(const Surface &surface, const string &filename) {
Ivan Mahonin 93cbac
		unsigned char *buffer = new unsigned char[4*surface.count()];
Ivan Mahonin 93cbac
		unsigned char *j = buffer;
Ivan Mahonin 93cbac
		for(Color *i = surface.data, *end = i + surface.count(); i != end; ++i, j += 4) {
Ivan Mahonin 93cbac
			j[0] = (unsigned char)roundf(max(0.f, min(1.f, i->b))*255.f);
Ivan Mahonin 93cbac
			j[1] = (unsigned char)roundf(max(0.f, min(1.f, i->g))*255.f);
Ivan Mahonin 93cbac
			j[2] = (unsigned char)roundf(max(0.f, min(1.f, i->r))*255.f);
Ivan Mahonin 93cbac
			j[3] = (unsigned char)roundf(max(0.f, min(1.f, i->a))*255.f);
Ivan Mahonin 93cbac
		}
Ivan Mahonin 93cbac
		save_rgba(buffer, surface.width, surface.height, false, filename);
Ivan Mahonin 93cbac
		delete buffer;
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	static void draw_contour_strip(const vector<Vector> &c) {
Ivan Mahonin 93cbac
		glBegin(GL_TRIANGLE_STRIP);
Ivan Mahonin 93cbac
		for(vector<Vector>::const_iterator i = c.begin(); i != c.end(); ++i) {
Ivan Mahonin 93cbac
			glVertex2d(i->x, i->y);
Ivan Mahonin 93cbac
			glVertex2d(-1.0, i->y);
Ivan Mahonin 93cbac
		}
Ivan Mahonin 93cbac
		glEnd();
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	static void draw_contour_strip(const Contour &c) {
Ivan Mahonin 93cbac
		glBegin(GL_TRIANGLE_STRIP);
Ivan Mahonin 93cbac
		const Contour::ChunkList &chunks = c.get_chunks();
Ivan Mahonin 93cbac
		Vector prev;
Ivan Mahonin 93cbac
		for(Contour::ChunkList::const_iterator i = chunks.begin(); i != chunks.end(); ++i) {
Ivan Mahonin 93cbac
			if ( i->type == Contour::LINE
Ivan Mahonin 93cbac
			  || i->type == Contour::CLOSE)
Ivan Mahonin 93cbac
			{
Ivan Mahonin 93cbac
				glVertex2d(i->p1.x, i->p1.y);
Ivan Mahonin 93cbac
				glVertex2d(-1.0, i->p1.y);
Ivan Mahonin 93cbac
				prev.x = -1.0;
Ivan Mahonin 93cbac
				prev.y = i->p1.y;
Ivan Mahonin 93cbac
			} else {
Ivan Mahonin 93cbac
				glVertex2d(prev.x, prev.y);
Ivan Mahonin 93cbac
				glVertex2d(prev.x, prev.y);
Ivan Mahonin 93cbac
				glVertex2d(i->p1.x, i->p1.y);
Ivan Mahonin 93cbac
				glVertex2d(i->p1.x, i->p1.y);
Ivan Mahonin 93cbac
				prev = i->p1;
Ivan Mahonin 93cbac
			}
Ivan Mahonin 93cbac
		}
Ivan Mahonin 93cbac
		glEnd();
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 8de121
	static void draw_contour_strip(const int &count) {
Ivan Mahonin 7c6b57
		glDrawArrays(GL_TRIANGLE_STRIP, 4, count);
Ivan Mahonin 8de121
	}
Ivan Mahonin 8de121
Ivan Mahonin 93cbac
	template<typename T>
Ivan Mahonin 93cbac
	static void draw_contour(const T &c, bool even_odd, bool invert) {
Ivan Mahonin 93cbac
		glEnable(GL_STENCIL_TEST);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
		// render mask
Ivan Mahonin 831e90
		GLint draw_buffer;
Ivan Mahonin 831e90
		glGetIntegerv(GL_DRAW_BUFFER, &draw_buffer);
Ivan Mahonin 831e90
		glDrawBuffer(GL_NONE);
Ivan Mahonin 93cbac
		glClear(GL_STENCIL_BUFFER_BIT);
Ivan Mahonin 93cbac
		glStencilFunc(GL_ALWAYS, 0, 0);
Ivan Mahonin 93cbac
		if (even_odd) {
Ivan Mahonin 8de121
			glStencilOp(GL_INCR_WRAP, GL_INCR_WRAP, GL_INCR_WRAP);
Ivan Mahonin 93cbac
		} else {
Ivan Mahonin 93cbac
			glStencilOpSeparate(GL_FRONT, GL_INCR_WRAP, GL_INCR_WRAP, GL_INCR_WRAP);
Ivan Mahonin 93cbac
			glStencilOpSeparate(GL_BACK, GL_DECR_WRAP, GL_DECR_WRAP, GL_DECR_WRAP);
Ivan Mahonin 93cbac
		}
Ivan Mahonin 7c6b57
		Shaders::simple();
Ivan Mahonin 93cbac
		draw_contour_strip(c);
Ivan Mahonin 831e90
		glDrawBuffer((GLenum)draw_buffer);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
		// fill mask
Ivan Mahonin 93cbac
		glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
Ivan Mahonin 93cbac
		if (!even_odd && !invert)
Ivan Mahonin 93cbac
			glStencilFunc(GL_NOTEQUAL, 0, -1);
Ivan Mahonin 93cbac
		if (!even_odd &&  invert)
Ivan Mahonin 93cbac
			glStencilFunc(GL_EQUAL, 0, -1);
Ivan Mahonin 93cbac
		if ( even_odd && !invert)
Ivan Mahonin 93cbac
			glStencilFunc(GL_EQUAL, 1, 1);
Ivan Mahonin 93cbac
		if ( even_odd &&  invert)
Ivan Mahonin 93cbac
			glStencilFunc(GL_EQUAL, 0, 1);
Ivan Mahonin 93cbac
Ivan Mahonin 7c6b57
		Shaders::color(Color(0.f, 0.f, 1.f, 1.f));
Ivan Mahonin 7c6b57
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
Ivan Mahonin 93cbac
Ivan Mahonin 7c6b57
		glDisable(GL_STENCIL_TEST);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 831e90
Ivan Mahonin 831e90
	static Vector get_frame_size() {
Ivan Mahonin 831e90
		int vp[4] = {};
Ivan Mahonin 831e90
		glGetIntegerv(GL_VIEWPORT, vp);
Ivan Mahonin 831e90
		return Vector((Real)vp[2], (Real)vp[3]);
Ivan Mahonin 831e90
	}
Ivan Mahonin 831e90
Ivan Mahonin 93cbac
};
Ivan Mahonin 93cbac
Ivan Mahonin a80036
Test::Wrapper::Wrapper(const std::string &filename):
Ivan Mahonin 6e407d
	filename(filename),
Ivan Mahonin 6e407d
	surface(),
Ivan Mahonin 6e407d
	tga(filename.size() > 4 && filename.substr(filename.size()-4, 4) == ".tga"),
Ivan Mahonin 6e407d
	t(get_clock())
Ivan Mahonin 6e407d
{ }
Ivan Mahonin 6e407d
Ivan Mahonin 6e407d
Test::Wrapper::Wrapper(const std::string &filename, Surface &surface):
Ivan Mahonin 6e407d
	filename(filename),
Ivan Mahonin 6e407d
	surface(&surface),
Ivan Mahonin 6e407d
	tga(filename.size() > 4 && filename.substr(filename.size()-4, 4) == ".tga"),
Ivan Mahonin 6e407d
	t(get_clock())
Ivan Mahonin a80036
{ }
Ivan Mahonin a80036
Ivan Mahonin 93cbac
Test::Wrapper::~Wrapper() {
Ivan Mahonin 6e407d
	if (!surface && tga) glFinish();
Ivan Mahonin a80036
	Real ms = 1000.0*(Real)(get_clock() - t)/(Real)(CLOCKS_PER_SEC);
Ivan Mahonin a80036
	cout << setw(8) << fixed << setprecision(3)
Ivan Mahonin 7704aa
	     << ms << " ms - " << filename << flush << endl;
Ivan Mahonin 93cbac
Ivan Mahonin 6e407d
	if (tga) {
Ivan Mahonin 93cbac
		if (surface)
Ivan Mahonin 93cbac
			Helper::save_surface(*surface, filename);
Ivan Mahonin 93cbac
		else
Ivan Mahonin 93cbac
			Helper::save_viewport(filename);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	if (surface) {
Ivan Mahonin 93cbac
		surface->clear();
Ivan Mahonin 93cbac
	} else {
Ivan Mahonin 93cbac
		glClear(GL_COLOR_BUFFER_BIT);
Ivan Mahonin 93cbac
		glFinish();
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
}
Ivan Mahonin 93cbac
Ivan Mahonin 7c6b57
void Test::check_gl(const std::string &s) {
Ivan Mahonin 7c6b57
	GLenum error = glGetError();
Ivan Mahonin 7c6b57
	if (error) {
Ivan Mahonin 7c6b57
		cout << s << " GL error: 0x" << setbase(16) << error << setbase(10) << endl;
Ivan Mahonin 7c6b57
	}
Ivan Mahonin 7c6b57
}
Ivan Mahonin 7c6b57
Ivan Mahonin 93cbac
void Test::test1() {
Ivan Mahonin 7c6b57
	// OpenGl 2 code
Ivan Mahonin 7c6b57
Ivan Mahonin 93cbac
	vector<Vector> c;
Ivan Mahonin 93cbac
	ContourBuilder::build_simple(c);
Ivan Mahonin 93cbac
	cout << c.size() << " vertices" << endl;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	glPushAttrib(GL_ALL_ATTRIB_BITS);
Ivan Mahonin 6e407d
Ivan Mahonin 6e407d
	int random = (int)get_clock();
Ivan Mahonin 6e407d
	{
Ivan Mahonin 6e407d
		Wrapper t("test_1_control_timer_200000_simple_ops");
Ivan Mahonin 6e407d
		int j = random;
Ivan Mahonin 6e407d
		for(long long i = 0; i < 200000; ++i)
Ivan Mahonin 6e407d
			if (j > i) ++j;
Ivan Mahonin 6e407d
		glColor4f(j%2, j%2, j%2, j%2);
Ivan Mahonin 6e407d
	}
Ivan Mahonin 6e407d
Ivan Mahonin 6e407d
	glColor4f(0.f, 0.f, 1.f, 1.f);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_1_contour.tga");
Ivan Mahonin 93cbac
		glBegin(GL_LINE_STRIP);
Ivan Mahonin 93cbac
		for(vector<Vector>::const_iterator i = c.begin(); i != c.end(); ++i)
Ivan Mahonin 93cbac
			glVertex2d(i->x, i->y);
Ivan Mahonin 93cbac
		glEnd();
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_1_contour_fill.tga");
Ivan Mahonin 93cbac
		Helper::draw_contour(c, false, false);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_1_contour_fill_invert.tga");
Ivan Mahonin 93cbac
		Helper::draw_contour(c, false, true);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_1_contour_evenodd.tga");
Ivan Mahonin 93cbac
		Helper::draw_contour(c, true, false);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_1_contour_evenodd_invert.tga");
Ivan Mahonin 93cbac
		Helper::draw_contour(c, true, true);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	glPopAttrib();
Ivan Mahonin 93cbac
}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
void Test::test2() {
Ivan Mahonin 93cbac
	Contour c, cc;
Ivan Mahonin 93cbac
	ContourBuilder::build(cc);
Ivan Mahonin 93cbac
	cout << cc.get_chunks().size() << " commands" << endl;
Ivan Mahonin 93cbac
Ivan Mahonin 831e90
	Vector frame_size = Helper::get_frame_size();
Ivan Mahonin 831e90
Ivan Mahonin 93cbac
	Rect bounds;
Ivan Mahonin 93cbac
	bounds.p0 = Vector(-1.0, -1.0);
Ivan Mahonin 93cbac
	bounds.p1 = Vector( 1.0,  1.0);
Ivan Mahonin 831e90
	Vector min_size(1.75/frame_size.x, 1.75/frame_size.y);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 6e407d
		Wrapper t("test_2_split");
Ivan Mahonin 93cbac
		cc.split(c, bounds, min_size);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	const Contour::ChunkList &chunks = c.get_chunks();
Ivan Mahonin 93cbac
	cout << chunks.size() << " vertices" << endl;
Ivan Mahonin 93cbac
Ivan Mahonin 7c6b57
	GLuint buffer_id = 0;
Ivan Mahonin 7c6b57
	GLuint array_id = 0;
Ivan Mahonin 8de121
	int count = 0;
Ivan Mahonin a80036
	vector< vec2<float> > vertices;
Ivan Mahonin 8de121
Ivan Mahonin 8de121
	{
Ivan Mahonin 8de121
		Wrapper t("test_2_init_buffer");
Ivan Mahonin 7c6b57
		vertices.resize(4+4*chunks.size());
Ivan Mahonin 7c6b57
		glGenBuffers(1, &buffer_id);
Ivan Mahonin 7c6b57
		glBindBuffer(GL_ARRAY_BUFFER, buffer_id);
Ivan Mahonin 8de121
		glBufferData( GL_ARRAY_BUFFER,
Ivan Mahonin a80036
				      vertices.size()*sizeof(vec2<float>),
Ivan Mahonin 8de121
					  &vertices.front(),
Ivan Mahonin 8de121
					  GL_DYNAMIC_DRAW );
Ivan Mahonin 8de121
		vertices.clear();
Ivan Mahonin 7c6b57
		vertices.reserve(4+4*chunks.size());
Ivan Mahonin 7c6b57
Ivan Mahonin 7c6b57
		glGenVertexArrays(1, &array_id);
Ivan Mahonin 7c6b57
		glBindVertexArray(array_id);
Ivan Mahonin 8de121
Ivan Mahonin 7c6b57
		glEnableVertexAttribArray(0);
Ivan Mahonin 7c6b57
		glVertexAttribPointer(0, 2, GL_FLOAT, GL_TRUE, 0, NULL);
Ivan Mahonin 7704aa
Ivan Mahonin 7c6b57
		Shaders::color(Color(0.f, 0.f, 1.f, 1.f));
Ivan Mahonin 7c6b57
		glDrawArrays(GL_TRIANGLE_STRIP, 0, vertices.size());
Ivan Mahonin 7c6b57
		glFinish();
Ivan Mahonin a80036
		glClear(GL_COLOR_BUFFER_BIT);
Ivan Mahonin a80036
		glFinish();
Ivan Mahonin a80036
	}
Ivan Mahonin 8de121
Ivan Mahonin 8de121
	{
Ivan Mahonin 8de121
		Wrapper t("test_2_prepare_data");
Ivan Mahonin 7c6b57
		vertices.push_back(vec2<float>(bounds.p0.x, bounds.p0.y));
Ivan Mahonin 7c6b57
		vertices.push_back(vec2<float>(bounds.p0.x, bounds.p1.y));
Ivan Mahonin 7c6b57
		vertices.push_back(vec2<float>(bounds.p1.x, bounds.p0.y));
Ivan Mahonin 7c6b57
		vertices.push_back(vec2<float>(bounds.p1.x, bounds.p1.y));
Ivan Mahonin a80036
		vertices.push_back(vec2<float>());
Ivan Mahonin a80036
		vertices.push_back(vec2<float>());
Ivan Mahonin 8de121
		for(Contour::ChunkList::const_iterator i = chunks.begin(); i != chunks.end(); ++i) {
Ivan Mahonin 8de121
			if ( i->type == Contour::LINE
Ivan Mahonin 8de121
			  || i->type == Contour::CLOSE)
Ivan Mahonin 8de121
			{
Ivan Mahonin a80036
				vertices.push_back(vec2<float>(i->p1));
Ivan Mahonin a80036
				vertices.push_back(vec2<float>(-1.f, (float)i->p1.y));
Ivan Mahonin 8de121
			} else {
Ivan Mahonin 8de121
				vertices.push_back(vertices.back());
Ivan Mahonin a80036
				vertices.push_back(vertices.back());
Ivan Mahonin a80036
				vertices.push_back(vec2<float>(i->p1));
Ivan Mahonin a80036
				vertices.push_back(vertices.back());
Ivan Mahonin 8de121
			}
Ivan Mahonin 8de121
		}
Ivan Mahonin 7c6b57
		count = vertices.size() - 4;
Ivan Mahonin 8de121
	}
Ivan Mahonin 8de121
Ivan Mahonin 8de121
	{
Ivan Mahonin 8de121
		Wrapper t("test_2_send_data");
Ivan Mahonin a80036
		glBufferSubData( GL_ARRAY_BUFFER,
Ivan Mahonin a80036
						 0,
Ivan Mahonin 7c6b57
					     vertices.size()*sizeof(vertices.front()),
Ivan Mahonin a80036
					     &vertices.front() );
Ivan Mahonin 8de121
	}
Ivan Mahonin 8de121
Ivan Mahonin 93cbac
	{
Ivan Mahonin 7c6b57
		Wrapper t("test_2_simple_fill.tga");
Ivan Mahonin 7c6b57
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 6e407d
	{
Ivan Mahonin 6e407d
		Wrapper t("test_2_array.tga");
Ivan Mahonin 7c6b57
		glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
Ivan Mahonin 7c6b57
		glDrawArrays(GL_TRIANGLE_STRIP, 4, count);
Ivan Mahonin 7c6b57
		glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
Ivan Mahonin 6e407d
	}
Ivan Mahonin 6e407d
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_2_contour_fill.tga");
Ivan Mahonin 8de121
		Helper::draw_contour(count, false, false);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_2_contour_fill_invert.tga");
Ivan Mahonin 8de121
		Helper::draw_contour(count, false, true);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_2_contour_evenodd.tga");
Ivan Mahonin 8de121
		Helper::draw_contour(count, true, false);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_2_contour_evenodd_invert.tga");
Ivan Mahonin 8de121
		Helper::draw_contour(count, true, true);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin a80036
	glBindBuffer(GL_ARRAY_BUFFER, 0);
Ivan Mahonin 7c6b57
	glDeleteBuffers(1, &buffer_id);
Ivan Mahonin 93cbac
}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
void Test::test3() {
Ivan Mahonin 93cbac
	Contour c;
Ivan Mahonin 93cbac
	ContourBuilder::build(c);
Ivan Mahonin 93cbac
	cout << c.get_chunks().size() << " commands" << endl;
Ivan Mahonin 93cbac
Ivan Mahonin 831e90
	Vector frame_size = Helper::get_frame_size();
Ivan Mahonin 831e90
	int width = (int)frame_size.x;
Ivan Mahonin 831e90
	int height = (int)frame_size.y;
Ivan Mahonin 831e90
Ivan Mahonin 93cbac
	Rect bounds;
Ivan Mahonin 93cbac
	bounds.p0 = Vector(-1.0, -1.0);
Ivan Mahonin 93cbac
	bounds.p1 = Vector( 1.0,  1.0);
Ivan Mahonin 93cbac
	Rect pixel_bounds;
Ivan Mahonin 831e90
	pixel_bounds.p0 = Vector::zero();
Ivan Mahonin 831e90
	pixel_bounds.p1 = frame_size;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	c.transform(bounds, pixel_bounds);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	Polyspan polyspan;
Ivan Mahonin 831e90
	polyspan.init(0, 0, width, height);
Ivan Mahonin 93cbac
Ivan Mahonin 831e90
	Surface surface(width, height);
Ivan Mahonin 93cbac
	Color color(0.f, 0.f, 1.f, 1.f);
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 6e407d
		Wrapper t("test_3_build_polyspan");
Ivan Mahonin 93cbac
		c.to_polyspan(polyspan);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	cout << polyspan.get_covers().size() << " covers" << endl;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	glPushAttrib(GL_ALL_ATTRIB_BITS);
Ivan Mahonin 93cbac
	glColor4d(0.0, 0.0, 1.0, 1.0);
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_3_polyspan_gl_lines.tga");
Ivan Mahonin 93cbac
		glBegin(GL_LINE_STRIP);
Ivan Mahonin 93cbac
		for(Polyspan::cover_array::const_iterator i = polyspan.get_covers().begin(); i != polyspan.get_covers().end(); ++i)
Ivan Mahonin 93cbac
			glVertex2d((double)i->x/1024.0*2.0 - 1.0, (double)i->y/1024.0*2.0 - 1.0);
Ivan Mahonin 93cbac
		glEnd();
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
	glPopAttrib();
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 6e407d
		Wrapper t("test_3_polyspan_sort");
Ivan Mahonin 93cbac
		polyspan.sort_marks();
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_3_polyspan_fill.tga", surface);
Ivan Mahonin 93cbac
		RenderSW::polyspan(surface, polyspan, color, false, false);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_3_polyspan_fill_invert.tga", surface);
Ivan Mahonin 93cbac
		RenderSW::polyspan(surface, polyspan, color, false, true);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_3_polyspan_evenodd.tga", surface);
Ivan Mahonin 93cbac
		RenderSW::polyspan(surface, polyspan, color, true, false);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
	{
Ivan Mahonin 93cbac
		Wrapper t("test_3_polyspan_evenodd_invert.tga", surface);
Ivan Mahonin 93cbac
		RenderSW::polyspan(surface, polyspan, color, true, true);
Ivan Mahonin 93cbac
	}
Ivan Mahonin 93cbac
}
Ivan Mahonin 93cbac