Ejemplo n.º 1
0
static PyObject*
_curve_apply(PyObject *self, PyObject *args)
{
    char *image_mode;
    PyObject *buffer = NULL, *curve_a = NULL, *curve_r = NULL, *curve_g = NULL, *curve_b = NULL;

    if (!PyArg_ParseTuple(args, "sOOOOO:apply", &image_mode, &buffer, &curve_a, &curve_r, &curve_g, &curve_b)) {
        return NULL;
    }

    unsigned char *points_a = cubic_spline_interpolation(get_curve(curve_a), PyTuple_Size(curve_a), 256),
                  *points_r = cubic_spline_interpolation(get_curve(curve_r), PyTuple_Size(curve_r), 256),
                  *points_g = cubic_spline_interpolation(get_curve(curve_g), PyTuple_Size(curve_g), 256),
                  *points_b = cubic_spline_interpolation(get_curve(curve_b), PyTuple_Size(curve_b), 256);

    Py_ssize_t size = PyString_Size(buffer);
    unsigned char *ptr = (unsigned char *) PyString_AsString(buffer);
    int num_bytes = bytes_per_pixel(image_mode);

    int r_idx = rgb_order(image_mode, 'R'),
        g_idx = rgb_order(image_mode, 'G'),
        b_idx = rgb_order(image_mode, 'B'),
        i = 0, r, g, b;

    size -= num_bytes;

    for (; i <= size; i += num_bytes) {
        r = ptr[i + r_idx];
        g = ptr[i + g_idx];
        b = ptr[i + b_idx];

        r = points_r[r];
        g = points_g[g];
        b = points_b[b];

        r = points_a[r];
        g = points_a[g];
        b = points_a[b];

        ptr[i + r_idx] = ADJUST_COLOR(r);
        ptr[i + g_idx] = ADJUST_COLOR(g);
        ptr[i + b_idx] = ADJUST_COLOR(b);
    }

    free(points_a);
    free(points_r);
    free(points_g);
    free(points_b);

    Py_INCREF(buffer);
    return buffer;
}
Ejemplo n.º 2
0
static PyObject*
_rgb_apply(PyObject *self, PyObject *args)
{
    PyObject *buffer = NULL, *image_mode = NULL, *delta_r = NULL, *delta_g = NULL, *delta_b = NULL;

    if (!PyArg_UnpackTuple(args, "apply", 5, 5, &image_mode, &delta_r, &delta_g, &delta_b, &buffer)) {
        return NULL;
    }

    char *image_mode_str = PyString_AsString(image_mode);
    Py_ssize_t size = PyString_Size(buffer);
    unsigned char *ptr = (unsigned char *) PyString_AsString(buffer);
    int delta_r_int = (int) PyInt_AsLong(delta_r),
        delta_g_int = (int) PyInt_AsLong(delta_g),
        delta_b_int = (int) PyInt_AsLong(delta_b);

    delta_r_int = (255 * delta_r_int) / 100;
    delta_g_int = (255 * delta_g_int) / 100;
    delta_b_int = (255 * delta_b_int) / 100;

    int r_idx = rgb_order(image_mode_str, 'R'),
        g_idx = rgb_order(image_mode_str, 'G'),
        b_idx = rgb_order(image_mode_str, 'B'),
        i = 0, r, g, b;

    size -= 3;
    for (; i <= size; i += 3) {
        r = ptr[i + r_idx];
        g = ptr[i + g_idx];
        b = ptr[i + b_idx];

        r += delta_r_int;
        g += delta_g_int;
        b += delta_b_int;

        ptr[i + r_idx] = ADJUST_COLOR(r);
        ptr[i + g_idx] = ADJUST_COLOR(g);
        ptr[i + b_idx] = ADJUST_COLOR(b);
    }

    Py_INCREF(buffer);
    return buffer;
}
Ejemplo n.º 3
0
static PyObject*
_brightness_apply(PyObject *self, PyObject *args)
{
    PyObject *buffer = NULL, *delta = NULL, *image_mode = NULL;

    if (!PyArg_UnpackTuple(args, "apply", 3, 3, &image_mode, &delta, &buffer)) {
        return NULL;
    }

    char *image_mode_str = PyString_AsString(image_mode);
    Py_ssize_t size = PyString_Size(buffer);
    unsigned char *ptr = (unsigned char *) PyString_AsString(buffer);
    int delta_int = (int) PyInt_AsLong(delta);

    int num_bytes = bytes_per_pixel(image_mode_str);

    delta_int = (255 * delta_int) / 100;

    int i = 0, r, g, b;
    size -= num_bytes;
    for (; i <= size; i += num_bytes) {
        r = ptr[i];
        g = ptr[i + 1];
        b = ptr[i + 2];

        r += delta_int;
        g += delta_int;
        b += delta_int;

        ptr[i] = ADJUST_COLOR(r);
        ptr[i + 1] = ADJUST_COLOR(g);
        ptr[i + 2] = ADJUST_COLOR(b);
    }

    Py_INCREF(buffer);
    return buffer;
}