From 14717a5e9287be8b189bffcccd9ec9e568b4cc36 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 8 Mar 2011 15:34:41 -0700 Subject: [PATCH] ImageMagick wrapper: Add API to get and set stroke and fill colors on a drawing wand --- src/calibre/utils/magick/__init__.py | 20 +++++++ src/calibre/utils/magick/magick.c | 82 ++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) diff --git a/src/calibre/utils/magick/__init__.py b/src/calibre/utils/magick/__init__.py index 834a798de5..6be5580d17 100644 --- a/src/calibre/utils/magick/__init__.py +++ b/src/calibre/utils/magick/__init__.py @@ -95,6 +95,26 @@ class DrawingWand(_magick.DrawingWand): # {{{ self.font_size_ = float(val) return property(fget=fget, fset=fset, doc=_magick.DrawingWand.font_size_.__doc__) + @dynamic_property + def stroke_color(self): + def fget(self): + return self.stroke_color_.color + def fset(self, val): + col = PixelWand() + col.color = unicode(val) + self.stroke_color_ = col + return property(fget=fget, fset=fset, doc=_magick.DrawingWand.font_size_.__doc__) + + @dynamic_property + def fill_color(self): + def fget(self): + return self.fill_color_.color + def fset(self, val): + col = PixelWand() + col.color = unicode(val) + self.fill_color_ = col + return property(fget=fget, fset=fset, doc=_magick.DrawingWand.font_size_.__doc__) + # }}} class Image(_magick.Image): # {{{ diff --git a/src/calibre/utils/magick/magick.c b/src/calibre/utils/magick/magick.c index 869b77c736..84c5f3a2ed 100644 --- a/src/calibre/utils/magick/magick.c +++ b/src/calibre/utils/magick/magick.c @@ -263,6 +263,78 @@ magick_DrawingWand_fontsize_setter(magick_DrawingWand *self, PyObject *val, void // }}} +// DrawingWand.stroke_color {{{ +static PyObject * +magick_DrawingWand_stroke_color_getter(magick_DrawingWand *self, void *closure) { + NULL_CHECK(NULL) + magick_PixelWand *pw; + PixelWand *wand = NewPixelWand(); + + if (wand == NULL) return PyErr_NoMemory(); + DrawGetStrokeColor(self->wand, wand); + + pw = (magick_PixelWand*) magick_PixelWandType.tp_alloc(&magick_PixelWandType, 0); + if (pw == NULL) return PyErr_NoMemory(); + pw->wand = wand; + return Py_BuildValue("O", (PyObject *)pw); +} + +static int +magick_DrawingWand_stroke_color_setter(magick_DrawingWand *self, PyObject *val, void *closure) { + NULL_CHECK(-1) + if (val == NULL) { + PyErr_SetString(PyExc_TypeError, "Cannot delete DrawingWand stroke color"); + return -1; + } + + magick_PixelWand *pw; + + pw = (magick_PixelWand*)val; + if (!IsPixelWand(pw->wand)) { PyErr_SetString(PyExc_TypeError, "Invalid PixelWand"); return -1; } + + DrawSetStrokeColor(self->wand, pw->wand); + + return 0; +} + +// }}} + +// DrawingWand.fill_color {{{ +static PyObject * +magick_DrawingWand_fill_color_getter(magick_DrawingWand *self, void *closure) { + NULL_CHECK(NULL) + magick_PixelWand *pw; + PixelWand *wand = NewPixelWand(); + + if (wand == NULL) return PyErr_NoMemory(); + DrawGetFillColor(self->wand, wand); + + pw = (magick_PixelWand*) magick_PixelWandType.tp_alloc(&magick_PixelWandType, 0); + if (pw == NULL) return PyErr_NoMemory(); + pw->wand = wand; + return Py_BuildValue("O", (PyObject *)pw); +} + +static int +magick_DrawingWand_fill_color_setter(magick_DrawingWand *self, PyObject *val, void *closure) { + NULL_CHECK(-1) + if (val == NULL) { + PyErr_SetString(PyExc_TypeError, "Cannot delete DrawingWand fill color"); + return -1; + } + + magick_PixelWand *pw; + + pw = (magick_PixelWand*)val; + if (!IsPixelWand(pw->wand)) { PyErr_SetString(PyExc_TypeError, "Invalid PixelWand"); return -1; } + + DrawSetFillColor(self->wand, pw->wand); + + return 0; +} + +// }}} + // DrawingWand.text_antialias {{{ static PyObject * magick_DrawingWand_textantialias_getter(magick_DrawingWand *self, void *closure) { @@ -336,6 +408,16 @@ static PyGetSetDef magick_DrawingWand_getsetters[] = { (char *)"DrawingWand fontsize", NULL}, + {(char *)"stroke_color_", + (getter)magick_DrawingWand_stroke_color_getter, (setter)magick_DrawingWand_stroke_color_setter, + (char *)"DrawingWand stroke color", + NULL}, + + {(char *)"fill_color_", + (getter)magick_DrawingWand_fill_color_getter, (setter)magick_DrawingWand_fill_color_setter, + (char *)"DrawingWand fill color", + NULL}, + {(char *)"text_antialias", (getter)magick_DrawingWand_textantialias_getter, (setter)magick_DrawingWand_textantialias_setter, (char *)"DrawingWand text antialias",