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; }
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); }