Exemple #1
0
	PyObject * draw_line(PyObject * self, PyObject * arguments)
	{
		int
			start_x,
			start_y,
			end_x,
			end_y,
			colour;

		if(!PyArg_ParseTuple(arguments, "iiiii", &start_x, &start_y, &end_x, &end_y, &colour))
			return 0;

		fix_coordinate(start_x, max_x);
		fix_coordinate(start_y, max_y);

		fix_coordinate(end_x, max_x);
		fix_coordinate(end_y, max_y);

		colour &= 0xff;

		d2_draw_line(start_x, start_y, end_x, end_y, colour, 0xff);

		Py_INCREF(Py_None);
		return Py_None;
	}
Exemple #2
0
	PyObject * draw_text(PyObject * self, PyObject * arguments)
	{
		char * text;

		int
			x,
			y;

		PyObject * bool_object;

		if(!PyArg_ParseTuple(arguments, "sii|O", &text, &x, &y, &bool_object))
			return 0;

		fix_coordinate(x, max_x);
		fix_coordinate(y, max_y);

		bool centered = (bool_object == Py_True);

		::draw_text(text, x, y, 0, centered);

		Py_INCREF(Py_None);
		return Py_None;
	}
void process_wave_form(ail::bmp & bmp, std::size_t x, std::size_t y, std::size_t height, sample_pair const & pair)
{
	enum method_type
	{
		method_one_colour,
		method_global_gradient,
		method_individual_gradient,
		method_individual_exponential_gradient
	};
	long const outer_colour = 0x000000;
	long const inner_colour1 = 0xff;
	long const inner_colour2 = 0x00;

	//method_type const method = method_individual_exponential_gradient;
	method_type const method = method_one_colour;

	std::size_t amplitude = height / 2;
	std::size_t const maximum = 0x10000 >> 1;
	double factor = static_cast<double>(amplitude) / maximum;
	std::size_t middle_y = y + amplitude;
	std::size_t upper_y = static_cast<std::size_t>(static_cast<double>(middle_y) - pair.maximum * factor);
	std::size_t lower_y = static_cast<std::size_t>(static_cast<double>(middle_y) - pair.minimum * factor);
	//std::cout << "Pre fix: (" << upper_y << ", " << lower_y << ")" << std::endl;
	fix_coordinate(upper_y, y, height);
	fix_coordinate(lower_y, y, height);
	//std::cout << "(" << upper_y << ", " << lower_y << ")" << std::endl;
	for(std::size_t i = y; i < upper_y; i++)
		bmp.set_pixel(x, i, outer_colour);
	for(std::size_t i = upper_y; i <= lower_y; i++)
	{
		double progress;
		long colour;
		switch(method)
		{
			case method_one_colour:
				colour = 0xffffff;
				break;

			case method_global_gradient:
				progress = std::fabs((static_cast<double>(i) - static_cast<double>(y + amplitude)) / amplitude);
				break;

			case method_individual_gradient:
			case method_individual_exponential_gradient:
			{

				double divisor;
				if(i < middle_y)
					divisor = static_cast<double>(middle_y - upper_y);
				else
					divisor = static_cast<double>(lower_y - middle_y);

				if(divisor == 0)
					progress = 0.0;
				else
					progress = std::fabs((static_cast<double>(i) - static_cast<double>(middle_y)) / divisor);

				if(progress < 0.0)
					progress = 0.0;
				else if(progress > 1.0)
					progress = 1.0;

				if(method == method_individual_exponential_gradient)
					progress = std::pow(progress, 8.0);
				break;
			}
		}
		
		if(method != method_one_colour)
		{
			long pixel = static_cast<long>(progress * inner_colour2 + (1.0 - progress) * inner_colour1);
			colour = (pixel << 16) | (pixel << 8) | pixel;
		}

		bmp.set_pixel(x, i, colour);
	}
	for(std::size_t i = lower_y + 1; i < y + height; i++)
		bmp.set_pixel(x, i, outer_colour);
}