PyObject* PyImaging_MapBuffer(PyObject* self, PyObject* args) { int y, size; Imaging im; PyObject* target; Py_buffer view; char* mode; char* codec; PyObject* bbox; int offset; int xsize, ysize; int stride; int ystep; if (!PyArg_ParseTuple(args, "O(ii)sOi(sii)", &target, &xsize, &ysize, &codec, &bbox, &offset, &mode, &stride, &ystep)) return NULL; if (!PyImaging_CheckBuffer(target)) { PyErr_SetString(PyExc_TypeError, "expected string or buffer"); return NULL; } if (stride <= 0) { if (!strcmp(mode, "L") || !strcmp(mode, "P")) stride = xsize; else if (!strncmp(mode, "I;16", 4)) stride = xsize * 2; else stride = xsize * 4; } size = ysize * stride; /* check buffer size */ if (PyImaging_GetBuffer(target, &view) < 0) return NULL; if (view.len < 0) { PyErr_SetString(PyExc_ValueError, "buffer has negative size"); return NULL; } if (offset + size > view.len) { PyErr_SetString(PyExc_ValueError, "buffer is not large enough"); return NULL; } im = ImagingNewPrologueSubtype( mode, xsize, ysize, sizeof(ImagingBufferInstance) ); if (!im) return NULL; /* setup file pointers */ if (ystep > 0) for (y = 0; y < ysize; y++) im->image[y] = (char*)view.buf + offset + y * stride; else for (y = 0; y < ysize; y++) im->image[ysize-y-1] = (char*)view.buf + offset + y * stride; im->destroy = mapping_destroy_buffer; Py_INCREF(target); ((ImagingBufferInstance*) im)->target = target; ((ImagingBufferInstance*) im)->view = view; if (!ImagingNewEpilogue(im)) return NULL; return PyImagingNew(im); }
int PyPath_Flatten(PyObject* data, double **pxy) { int i, j, n; double *xy; if (PyPath_Check(data)) { /* This was another path object. */ PyPathObject *path = (PyPathObject*) data; xy = alloc_array(path->count); if (!xy) return -1; memcpy(xy, path->xy, 2 * path->count * sizeof(double)); *pxy = xy; return path->count; } if (PyImaging_CheckBuffer(data)) { /* Assume the buffer contains floats */ float* ptr; int n = PyImaging_ReadBuffer(data, (const void**) &ptr); n /= 2 * sizeof(float); xy = alloc_array(n); if (!xy) return -1; for (i = 0; i < n+n; i++) xy[i] = ptr[i]; *pxy = xy; return n; } if (!PySequence_Check(data)) { PyErr_SetString(PyExc_TypeError, "argument must be sequence"); return -1; } j = 0; n = PyObject_Length(data); /* Just in case __len__ breaks (or doesn't exist) */ if (PyErr_Occurred()) return -1; /* Allocate for worst case */ xy = alloc_array(n); if (!xy) return -1; /* Copy table to path array */ if (PyList_Check(data)) { for (i = 0; i < n; i++) { double x, y; PyObject *op = PyList_GET_ITEM(data, i); if (PyFloat_Check(op)) xy[j++] = PyFloat_AS_DOUBLE(op); else if (PyInt_Check(op)) xy[j++] = (float) PyInt_AS_LONG(op); else if (PyNumber_Check(op)) xy[j++] = PyFloat_AsDouble(op); else if (PyArg_ParseTuple(op, "dd", &x, &y)) { xy[j++] = x; xy[j++] = y; } else { free(xy); return -1; } } } else if (PyTuple_Check(data)) { for (i = 0; i < n; i++) { double x, y; PyObject *op = PyTuple_GET_ITEM(data, i); if (PyFloat_Check(op)) xy[j++] = PyFloat_AS_DOUBLE(op); else if (PyInt_Check(op)) xy[j++] = (float) PyInt_AS_LONG(op); else if (PyNumber_Check(op)) xy[j++] = PyFloat_AsDouble(op); else if (PyArg_ParseTuple(op, "dd", &x, &y)) { xy[j++] = x; xy[j++] = y; } else { free(xy); return -1; } } } else { for (i = 0; i < n; i++) { double x, y; PyObject *op = PySequence_GetItem(data, i); if (!op) { /* treat IndexError as end of sequence */ if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_IndexError)) { PyErr_Clear(); break; } else { free(xy); return -1; } } if (PyFloat_Check(op)) xy[j++] = PyFloat_AS_DOUBLE(op); else if (PyInt_Check(op)) xy[j++] = (float) PyInt_AS_LONG(op); else if (PyNumber_Check(op)) xy[j++] = PyFloat_AsDouble(op); else if (PyArg_ParseTuple(op, "dd", &x, &y)) { xy[j++] = x; xy[j++] = y; } else { Py_DECREF(op); free(xy); return -1; } Py_DECREF(op); } } if (j & 1) { PyErr_SetString(PyExc_ValueError, "wrong number of coordinates"); free(xy); return -1; } *pxy = xy; return j/2; }