[dia] Renderer::*_rounded_rect methods for PyDia
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] Renderer::*_rounded_rect methods for PyDia
- Date: Sun, 30 Jan 2011 15:44:24 +0000 (UTC)
commit 97c5d4c873e6165b51109dcf13e13c1764298161
Author: Hans Breuer <hans breuer org>
Date: Sun Jan 30 16:21:56 2011 +0100
Renderer::*_rounded_rect methods for PyDia
Original version by Max Wahler http://mail.gnome.org/archives/dia-list/2011-January/msg00063.html
Back-ported the Python site to diasvg.py to serve as example.
plug-ins/python/diasvg.py | 8 +++++
plug-ins/python/pydia-render.c | 62 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 70 insertions(+), 0 deletions(-)
---
diff --git a/plug-ins/python/diasvg.py b/plug-ins/python/diasvg.py
index cd79de8..23a8dc6 100644
--- a/plug-ins/python/diasvg.py
+++ b/plug-ins/python/diasvg.py
@@ -94,10 +94,18 @@ class SvgRenderer :
self.f.write('<rect x="%.3f" y="%.3f" width="%.3f" height="%.3f" fill="none" stroke="%s" stroke-width="%.3f" %s/>\n' \
% ( rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
self._rgb(color), self.line_width, self._stroke_style()))
+ def draw_rounded_rect (self, rect, color, rounding) :
+ self.f.write('<rect x="%.3f" y="%.3f" width="%.3f" height="%.3f" fill="none" stroke="%s" stroke-width="%.3f" %s rx="%.3f" />\n' \
+ % ( rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
+ self._rgb(color), self.line_width, self._stroke_style(), rounding))
def fill_rect (self, rect, color) :
self.f.write('<rect x="%.3f" y="%.3f" width="%.3f" height="%.3f" fill="%s" stroke="none" stroke-width="0"/>\n' \
% ( rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
self._rgb(color)))
+ def fill_rounded_rect (self, rect, color, rounding) :
+ self.f.write('<rect x="%.3f" y="%.3f" width="%.3f" height="%.3f" fill="%s" stroke="none" rx="%.3f" />\n' \
+ % ( rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
+ self._rgb(color), rounding))
def _arc (self, center, width, height, angle1, angle2, color, fill=None) :
# not in the renderer interface
import math
diff --git a/plug-ins/python/pydia-render.c b/plug-ins/python/pydia-render.c
index 74707a5..0dcc643 100644
--- a/plug-ins/python/pydia-render.c
+++ b/plug-ins/python/pydia-render.c
@@ -506,6 +506,36 @@ draw_rect(DiaRenderer *renderer,
}
}
+
+static void
+draw_rounded_rect(DiaRenderer *renderer,
+ Point *ul_corner, Point *lr_corner,
+ Color *colour, real rounding)
+{
+ PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);
+
+ func = PyObject_GetAttrString (self, "draw_rounded_rect");
+ if (func && PyCallable_Check(func)) {
+ Py_INCREF(self);
+ Py_INCREF(func);
+ arg = Py_BuildValue ("(OOd)", PyDiaRectangle_New_FromPoints (ul_corner, lr_corner),
+ PyDiaColor_New (colour), rounding);
+ if (arg) {
+ res = PyEval_CallObject (func, arg);
+ ON_RES(res, FALSE);
+ }
+ Py_XDECREF (arg);
+ Py_DECREF(func);
+ Py_DECREF(self);
+ }
+ else { /* member optional */
+ PyErr_Clear();
+ /* XXX: implementing the same fallback as DiaRenderer would do */
+ DIA_RENDERER_CLASS (parent_class)->draw_rounded_rect (renderer, ul_corner, lr_corner, colour, rounding);
+ }
+}
+
+
static void
fill_rect(DiaRenderer *renderer,
Point *ul_corner, Point *lr_corner,
@@ -537,6 +567,34 @@ fill_rect(DiaRenderer *renderer,
}
static void
+fill_rounded_rect(DiaRenderer *renderer,
+ Point *ul_corner, Point *lr_corner,
+ Color *colour, real rounding)
+{
+ PyObject *func, *res, *arg, *self = PYDIA_RENDERER (renderer);
+
+ func = PyObject_GetAttrString (self, "fill_rounded_rect");
+ if (func && PyCallable_Check(func)) {
+ Py_INCREF(self);
+ Py_INCREF(func);
+ arg = Py_BuildValue ("(OOd)", PyDiaRectangle_New_FromPoints (ul_corner, lr_corner),
+ PyDiaColor_New (colour), rounding);
+ if (arg) {
+ res = PyEval_CallObject (func, arg);
+ ON_RES(res, FALSE);
+ }
+ Py_XDECREF (arg);
+ Py_DECREF(func);
+ Py_DECREF(self);
+ }
+ else { /* member optional */
+ PyErr_Clear();
+ /* XXX: implementing the same fallback as DiaRenderer would do */
+ DIA_RENDERER_CLASS (parent_class)->fill_rounded_rect (renderer, ul_corner, lr_corner, colour, rounding);
+ }
+}
+
+static void
draw_arc(DiaRenderer *renderer,
Point *center,
real width, real height,
@@ -932,5 +990,9 @@ dia_py_renderer_class_init (DiaPyRendererClass *klass)
renderer_class->draw_bezier = draw_bezier;
renderer_class->fill_bezier = fill_bezier;
+
+ /* highest level functions */
+ renderer_class->draw_rounded_rect = draw_rounded_rect;
+ renderer_class->fill_rounded_rect = fill_rounded_rect;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]