[reportlab-users] problem with renderSVG (patch)
Dirk Datzert
reportlab-users@reportlab.com
Sat, 04 Oct 2003 22:34:29 +0200
Dies ist eine mehrteilige Nachricht im MIME-Format.
--------------8994546B4D18C82B17E46215
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Hi all,
!!! refering to my mail sent earlier !!!
I have a strange problem with renderSVG. I detected this in use with
polyLines, but I think that it is a general problem in renderSVG.
I would say that the StateTracker Code in renderSVG is not working as
expected to work and that polyLine should set fillColor to none.
Regards,
Dirk
--------------8994546B4D18C82B17E46215
Content-Type: text/plain; charset=us-ascii;
name="renderSVG.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="renderSVG.patch"
--- renderSVG.py.orig Fri Sep 26 20:59:52 2003
+++ renderSVG.py Sat Oct 4 22:27:10 2003
@@ -515,6 +515,7 @@
if self._strokeColor != None:
self.setColor(self._strokeColor)
+ self.setFillColor(None)
pairs = []
for i in xrange(len(points)):
pairs.append("%f %f" % (points[i]))
@@ -585,7 +586,11 @@
def closePath(self):
self.path = self.path + 'Z '
+ def saveState(self):
+ '''do nothing for compatibility'''
+ pass
+ restoreState = saveState
class _SVGRenderer(Renderer):
@@ -596,6 +601,26 @@
self._tracker = StateTracker()
self.verbose = 0
+ def pop(self):
+ self._tracker.pop()
+ self.applyState()
+
+ def push(self,node):
+ deltas = getStateDelta(node)
+ self._tracker.push(deltas)
+ self.applyState()
+
+ def applyState(self):
+ s = self._tracker.getState()
+ self._canvas.setLineWidth(s['strokeWidth'])
+ self._canvas.setStrokeColor(s['strokeColor'])
+ self._canvas.setLineCap(s['strokeLineCap'])
+ self._canvas.setLineJoin(s['strokeLineJoin'])
+ da = s['strokeDashArray']
+ da = da and (0,da) or None
+ self._canvas.setDash(da)
+ self._canvas.setFillColor(s['fillColor'])
+ self._canvas.setFont(s['fontName'], s['fontSize'])
def draw(self, drawing, canvas, x, y, showBoundary=rl_config.showBoundary):
"""This is the top level function, which draws the drawing at the given
@@ -610,13 +635,14 @@
#bounding box
if showBoundary:
canvas.rect(x, y, drawing.width, drawing.height)
-
+ canvas.saveState()
deltas = STATE_DEFAULTS.copy()
deltas['transform'] = [1,0,0,1,x,y]
self._tracker.push(deltas)
- self.applyStateChanges(deltas, {})
+ self.applyState()
self.drawNode(drawing)
- self._tracker.pop()
+ self.pop()
+ canvas.restoreState()
finally:
del self._canvas, self._drawing, canvas._drawing
@@ -629,29 +655,20 @@
if self.verbose: print "### begin _SVGRenderer.drawNode"
+ #begin node
self._canvas.comment('begin node %s'%`node`)
- color = self._canvas._color
- if not (isinstance(node, Path) and node.isClipPath):
- pass # self._canvas.saveState()
#apply state changes
- deltas = getStateDelta(node)
- self._tracker.push(deltas)
- self.applyStateChanges(deltas, {})
+ self.push(node)
#draw the object, or recurse
self.drawNodeDispatcher(node)
- rDeltas = self._tracker.pop()
- if not (isinstance(node, Path) and node.isClipPath):
- pass # self._canvas.restoreState()
- self._canvas.comment('end node %s'%`node`)
- self._canvas._color = color
+ # restore the state
+ self.pop()
- #restore things we might have lost (without actually doing anything).
- for k, v in rDeltas.items():
- if self._restores.has_key(k):
- setattr(self._canvas,self._restores[k],v)
+ #end node
+ self._canvas.comment('end node %s'%`node`)
if self.verbose: print "### end _SVGRenderer.drawNode"
--------------8994546B4D18C82B17E46215--