[dia] Renderer::*_rounded_rect methods for PyDia



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]