From f8c64c8f1dc697ce4a91a95bb7b6a2e7e0216ea8 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 2 Aug 2010 10:03:14 -0600 Subject: [PATCH] ... --- src/calibre/utils/magick/__init__.py | 14 ++++------ src/calibre/utils/magick/magick.c | 42 ++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/calibre/utils/magick/__init__.py b/src/calibre/utils/magick/__init__.py index fdd1af333a..b584f2d2f8 100644 --- a/src/calibre/utils/magick/__init__.py +++ b/src/calibre/utils/magick/__init__.py @@ -50,17 +50,16 @@ class Image(_magick.Image): @dynamic_property def format(self): def fget(self): - ans = super(Image, self).format - return ans.decode('utf-8', 'ignore').lower() + return self.format_.decode('utf-8', 'ignore').lower() def fset(self, val): - super(Image, self).format = str(val) - return property(fget=fget, fset=fset, doc=_magick.Image.format.__doc__) + self.format_ = str(val) + return property(fget=fget, fset=fset, doc=_magick.Image.format_.__doc__) @dynamic_property def size(self): def fget(self): - return super(Image, self).size + return self.size_ def fset(self, val): filter = 'CatromFilter' if len(val) > 2: @@ -69,9 +68,8 @@ class Image(_magick.Image): blur = 1.0 if len(val) > 3: blur = float(val[3]) - super(Image, self).format = (int(val[0]), int(val[1]), filter, - blur) - return property(fget=fget, fset=fset, doc=_magick.Image.size.__doc__) + self.size_ = (int(val[0]), int(val[1]), filter, blur) + return property(fget=fget, fset=fset, doc=_magick.Image.size_.__doc__) def save(self, path, format=None): diff --git a/src/calibre/utils/magick/magick.c b/src/calibre/utils/magick/magick.c index cf1c4c3872..9389364bdc 100644 --- a/src/calibre/utils/magick/magick.c +++ b/src/calibre/utils/magick/magick.c @@ -52,10 +52,15 @@ static PyObject * magick_Image_load(magick_Image *self, PyObject *args, PyObject *kwargs) { const char *data; Py_ssize_t dlen; + MagickBooleanType res; if (!PyArg_ParseTuple(args, "s#", &data, &dlen)) return NULL; - if (!MagickReadImageBlob(self->wand, data, dlen)) + Py_BEGIN_ALLOW_THREADS + res = MagickReadImageBlob(self->wand, data, dlen); + Py_END_ALLOW_THREADS + + if (!res) return magick_set_exception(self->wand); Py_RETURN_NONE; @@ -75,7 +80,10 @@ magick_Image_export(magick_Image *self, PyObject *args, PyObject *kwargs) { return NULL; } + Py_BEGIN_ALLOW_THREADS data = MagickGetImageBlob(self->wand, &len); + Py_END_ALLOW_THREADS + if (data == NULL || len < 1) return magick_set_exception(self->wand); @@ -100,6 +108,7 @@ magick_Image_size_setter(magick_Image *self, PyObject *val, void *closure) { Py_ssize_t width, height; FilterTypes filter; double blur; + MagickBooleanType res; if (val == NULL) { return -1; @@ -126,7 +135,11 @@ magick_Image_size_setter(magick_Image *self, PyObject *val, void *closure) { return -1; } - if (!MagickResizeImage(self->wand, width, height, filter, blur)) { + Py_BEGIN_ALLOW_THREADS + res = MagickResizeImage(self->wand, width, height, filter, blur); + Py_END_ALLOW_THREADS + + if (!res) { magick_set_exception(self->wand); return -1; } @@ -143,6 +156,25 @@ magick_Image_format_getter(magick_Image *self, void *closure) { return Py_BuildValue("s", fmt); } +static int +magick_Image_format_setter(magick_Image *self, PyObject *val, void *closure) { + char *fmt; + + if (val == NULL) { + return -1; + PyErr_SetString(PyExc_TypeError, "Cannot delete image format"); + } + + fmt = PyString_AsString(val); + if (fmt == NULL) return -1; + + if (!MagickSetImageFormat(self->wand, fmt)) { + PyErr_SetString(PyExc_ValueError, "Unknown image format"); + return -1; + } + + return 0; +} static PyMethodDef magick_Image_methods[] = { {"load", (PyCFunction)magick_Image_load, METH_VARARGS, @@ -157,13 +189,13 @@ static PyMethodDef magick_Image_methods[] = { }; static PyGetSetDef magick_Image_getsetters[] = { - {(char *)"size", + {(char *)"size_", (getter)magick_Image_size_getter, (setter)magick_Image_size_setter, (char *)"Image size (width, height). When setting pass in (width, height, filter, blur). See MagickResizeImage docs.", NULL}, - {(char *)"format", - (getter)magick_Image_format_getter, NULL, + {(char *)"format_", + (getter)magick_Image_format_getter, (setter)magick_Image_format_setter, (char *)"Image format", NULL},