9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches#!/usr/bin/env python
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches'''
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. SanchesCopyright (C) 2011 Karlisson Bezerra <contact@hacktoon.com>
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. SanchesThis program is free software; you can redistribute it and/or modify
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanchesit under the terms of the GNU General Public License as published by
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanchesthe Free Software Foundation; either version 2 of the License, or
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches(at your option) any later version.
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. SanchesThis program is distributed in the hope that it will be useful,
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanchesbut WITHOUT ANY WARRANTY; without even the implied warranty of
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. SanchesMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. SanchesGNU General Public License for more details.
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. SanchesYou should have received a copy of the GNU General Public License
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanchesalong with this program; if not, write to the Free Software
107e00c8104649437b9520d0ba298dba659e7cd7JazzyNicoFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches'''
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanchesimport inkex
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanchesfrom ink2canvas.canvas import Canvas
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanchesimport ink2canvas.svg as svg
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sancheslog = inkex.debug #alias to debug method
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanchesclass Ink2Canvas(inkex.Effect):
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches def __init__(self):
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches inkex.Effect.__init__(self)
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches self.canvas = None
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches def output(self):
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches import sys
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches sys.stdout.write(self.canvas.output())
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches def get_tag_name(self, node):
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches # remove namespace part from "{http://www.w3.org/2000/svg}elem"
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches return node.tag.split("}")[1]
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches def get_gradient_defs(self, elem):
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches url_id = elem.get_gradient_href()
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches # get the gradient element
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches gradient = self.xpathSingle("//*[@id='%s']" % url_id)
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches # get the color stops
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches url_stops = gradient.get(inkex.addNS("href", "xlink"))
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches gstops = self.xpathSingle("//svg:linearGradient[@id='%s']" % url_stops[1:])
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches colors = []
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches for stop in gstops:
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches colors.append(stop.get("style"))
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches if gradient.get("r"):
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches return svg.RadialGradientDef(gradient, colors)
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches else:
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches return svg.LinearGradientDef(gradient, colors)
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches def get_clip_defs(self, elem):
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches if elem.has_clip():
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches pass
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches return
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches def walk_tree(self, root):
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches for node in root:
6b3e4093fc93e70b45d9c383301e23df7a726231apenner if node.tag is inkex.etree.Comment:
6b3e4093fc93e70b45d9c383301e23df7a726231apenner continue
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches tag = self.get_tag_name(node)
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches class_name = tag.capitalize()
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches if not hasattr(svg, class_name):
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches continue
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches gradient = None
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches clip = None
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches # creates a instance of 'elem'
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches # similar to 'elem = Rect(tag, node, ctx)'
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches elem = getattr(svg, class_name)(tag, node, self.canvas)
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches if elem.has_gradient():
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches gradient = self.get_gradient_defs(elem)
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches elem.start(gradient)
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches elem.draw()
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches self.walk_tree(node)
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches elem.end()
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches def effect(self):
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches """Applies the effect"""
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches svg_root = self.document.getroot()
3626239912f1d2e7effe313bd1fab54e10364f09Johan B. C. Engelen width = self.unittouu(svg_root.get("width"))
3626239912f1d2e7effe313bd1fab54e10364f09Johan B. C. Engelen height = self.unittouu(svg_root.get("height"))
1901dc49cd3b0c3cb9745910978271dcd3f1c7ebapenner self.canvas = Canvas(self, width, height)
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches self.walk_tree(svg_root)
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanchesif __name__ == "__main__":
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches ink = Ink2Canvas()
9f5fa9df7a370b2041854ddc23b55b786b538478Felipe C. da S. Sanches ink.affect()