summaryrefslogtreecommitdiffstats
path: root/share/extensions/ink2canvas_lib/canvas.py
diff options
context:
space:
mode:
Diffstat (limited to 'share/extensions/ink2canvas_lib/canvas.py')
-rw-r--r--share/extensions/ink2canvas_lib/canvas.py191
1 files changed, 191 insertions, 0 deletions
diff --git a/share/extensions/ink2canvas_lib/canvas.py b/share/extensions/ink2canvas_lib/canvas.py
new file mode 100644
index 0000000..c219132
--- /dev/null
+++ b/share/extensions/ink2canvas_lib/canvas.py
@@ -0,0 +1,191 @@
+# coding=utf-8
+#
+# Copyright (C) 2011 Karlisson Bezerra <contact@hacktoon.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+"""
+Convas module for ink2canvas extension
+"""
+
+from inkex import Color
+
+class Canvas(object):
+ """Canvas API helper class"""
+
+ def __init__(self, parent, width, height, context="ctx"):
+ self.obj = context
+ self.code = [] # stores the code
+ self.style = {}
+ self.styleCache = {} # stores the previous style applied
+ self.parent = parent
+ self.width = width
+ self.height = height
+
+ def write(self, text):
+ self.code.append("\t" + text.replace("ctx", self.obj) + "\n")
+
+ def output(self):
+ from textwrap import dedent
+ html = """
+ <!DOCTYPE html>
+ <html>
+ <head>
+ <title>Inkscape Output</title>
+ </head>
+ <body>
+ <canvas id='canvas' width='%d' height='%d'></canvas>
+ <script>
+ var %s = document.getElementById("canvas").getContext("2d");
+ %s
+ </script>
+ </body>
+ </html>
+ """
+ return dedent(html) % (self.width, self.height, self.obj, "".join(self.code))
+
+ def equalStyle(self, style, key):
+ """Checks if the last style used is the same or there's no style yet"""
+ if key in self.styleCache:
+ return True
+ if key not in style:
+ return True
+ return style[key] == self.styleCache[key]
+
+ def beginPath(self):
+ self.write("ctx.beginPath();")
+
+ def createLinearGradient(self, href, x1, y1, x2, y2):
+ data = (href, x1, y1, x2, y2)
+ self.write("var %s = \
+ ctx.createLinearGradient(%f,%f,%f,%f);" % data)
+
+ def createRadialGradient(self, href, cx1, cy1, rx, cx2, cy2, ry):
+ data = (href, cx1, cy1, rx, cx2, cy2, ry)
+ self.write("var %s = ctx.createRadialGradient\
+ (%f,%f,%f,%f,%f,%f);" % data)
+
+ def addColorStop(self, href, pos, color):
+ self.write("%s.addColorStop(%f, %s);" % (href, pos, color))
+
+ def getColor(self, rgb, alpha):
+ return "'{}'".format(str(Color(rgb).to_rgba(alpha)))
+
+ def setGradient(self, href):
+ """
+ for stop in gstops:
+ style = simplestyle.parseStyle(stop.get("style"))
+ stop_color = style["stop-color"]
+ opacity = style["stop-opacity"]
+ color = self.getColor(stop_color, opacity)
+ pos = float(stop.get("offset"))
+ self.addColorStop(href, pos, color)
+ """
+ return None # href
+
+ def setOpacity(self, value):
+ self.write("ctx.globalAlpha = %.1f;" % float(value))
+
+ def setFill(self, value):
+ try:
+ alpha = self.style["fill-opacity"]
+ except:
+ alpha = 1
+ if not value.startswith("url("):
+ fill = self.getColor(value, alpha)
+ self.write("ctx.fillStyle = %s;" % fill)
+
+ def setStroke(self, value):
+ try:
+ alpha = self.style["stroke-opacity"]
+ except:
+ alpha = 1
+ self.write("ctx.strokeStyle = %s;" % self.getColor(value, alpha))
+
+ def setStrokeWidth(self, value):
+ self.write("ctx.lineWidth = %f;" % self.parent.svg.unittouu(value))
+
+ def setStrokeLinecap(self, value):
+ self.write("ctx.lineCap = '%s';" % value)
+
+ def setStrokeLinejoin(self, value):
+ self.write("ctx.lineJoin = '%s';" % value)
+
+ def setStrokeMiterlimit(self, value):
+ self.write("ctx.miterLimit = %s;" % value)
+
+ def setFont(self, value):
+ self.write("ctx.font = \"%s\";" % value)
+
+ def moveTo(self, x, y):
+ self.write("ctx.moveTo(%f, %f);" % (x, y))
+
+ def lineTo(self, x, y):
+ self.write("ctx.lineTo(%f, %f);" % (x, y))
+
+ def quadraticCurveTo(self, cpx, cpy, x, y):
+ data = (cpx, cpy, x, y)
+ self.write("ctx.quadraticCurveTo(%f, %f, %f, %f);" % data)
+
+ def bezierCurveTo(self, x1, y1, x2, y2, x, y):
+ data = (x1, y1, x2, y2, x, y)
+ self.write("ctx.bezierCurveTo(%f, %f, %f, %f, %f, %f);" % data)
+
+ def rect(self, x, y, w, h, rx=0, ry=0):
+ if rx or ry:
+ # rounded rectangle, starts top-left anticlockwise
+ self.moveTo(x, y + ry)
+ self.lineTo(x, y + h - ry)
+ self.quadraticCurveTo(x, y + h, x + rx, y + h)
+ self.lineTo(x + w - rx, y + h)
+ self.quadraticCurveTo(x + w, y + h, x + w, y + h - ry)
+ self.lineTo(x + w, y + ry)
+ self.quadraticCurveTo(x + w, y, x + w - rx, y)
+ self.lineTo(x + rx, y)
+ self.quadraticCurveTo(x, y, x, y + ry)
+ else:
+ self.write("ctx.rect(%f, %f, %f, %f);" % (x, y, w, h))
+
+ def arc(self, x, y, r, a1, a2, flag):
+ data = (x, y, r, a1, a2, flag)
+ self.write("ctx.arc(%f, %f, %f, %f, %.8f, %d);" % data)
+
+ def fillText(self, text, x, y):
+ self.write("ctx.fillText(\"%s\", %f, %f);" % (text, x, y))
+
+ def translate(self, cx, cy):
+ self.write("ctx.translate(%f, %f);" % (cx, cy))
+
+ def rotate(self, angle):
+ self.write("ctx.rotate(%f);" % angle)
+
+ def scale(self, rx, ry):
+ self.write("ctx.scale(%f, %f);" % (rx, ry))
+
+ def transform(self, m11, m12, m21, m22, dx, dy):
+ data = (m11, m12, m21, m22, dx, dy)
+ self.write("ctx.transform(%f, %f, %f, %f, %f, %f);" % data)
+
+ def save(self):
+ self.write("ctx.save();")
+
+ def restore(self):
+ self.write("ctx.restore();")
+
+ def closePath(self):
+ if "fill" in self.style and self.style["fill"] != "none":
+ self.write("ctx.fill();")
+ if "stroke" in self.style and self.style["stroke"] != "none":
+ self.write("ctx.stroke();")