Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
for transformation_type, transformation in transformations:
values = [size(surface, value) for value in transformation.split(' ')]
if transformation_type == 'matrix':
matrix = cairo.Matrix(*values).multiply(matrix)
elif transformation_type == 'rotate':
angle = radians(float(values.pop(0)))
x, y = values or (0, 0)
matrix.translate(x, y)
matrix.rotate(angle)
matrix.translate(-x, -y)
elif transformation_type == 'skewX':
tangent = tan(radians(float(values[0])))
matrix = cairo.Matrix(1, 0, tangent, 1, 0, 0).multiply(matrix)
elif transformation_type == 'skewY':
tangent = tan(radians(float(values[0])))
matrix = cairo.Matrix(1, tangent, 0, 1, 0, 0).multiply(matrix)
elif transformation_type == 'translate':
if len(values) == 1:
values += (0,)
matrix.translate(*values)
elif transformation_type == 'scale':
if len(values) == 1:
values = 2 * values
matrix.scale(*values)
try:
matrix.invert()
except cairo.Error:
# Matrix not invertible, clip the surface to an empty path
active_path = surface.context.copy_path()
surface.context.new_path()
surface.context.clip()
def transform(surface, string, gradient=None):
"""Transform ``surface`` or ``gradient`` if supplied using ``string``.
See http://www.w3.org/TR/SVG/coords.html#TransformAttribute
"""
if not string:
return
transformations = re.findall(r'(\w+) ?\( ?(.*?) ?\)', normalize(string))
matrix = cairo.Matrix()
for transformation_type, transformation in transformations:
values = [size(surface, value) for value in transformation.split(' ')]
if transformation_type == 'matrix':
matrix = cairo.Matrix(*values).multiply(matrix)
elif transformation_type == 'rotate':
angle = radians(float(values.pop(0)))
x, y = values or (0, 0)
matrix.translate(x, y)
matrix.rotate(angle)
matrix.translate(-x, -y)
elif transformation_type == 'skewX':
tangent = tan(radians(float(values[0])))
matrix = cairo.Matrix(1, 0, tangent, 1, 0, 0).multiply(matrix)
elif transformation_type == 'skewY':
tangent = tan(radians(float(values[0])))
matrix = cairo.Matrix(1, tangent, 0, 1, 0, 0).multiply(matrix)
transformations = re.findall(r'(\w+) ?\( ?(.*?) ?\)', normalize(string))
matrix = cairo.Matrix()
for transformation_type, transformation in transformations:
values = [size(surface, value) for value in transformation.split(' ')]
if transformation_type == 'matrix':
matrix = cairo.Matrix(*values).multiply(matrix)
elif transformation_type == 'rotate':
angle = radians(float(values.pop(0)))
x, y = values or (0, 0)
matrix.translate(x, y)
matrix.rotate(angle)
matrix.translate(-x, -y)
elif transformation_type == 'skewX':
tangent = tan(radians(float(values[0])))
matrix = cairo.Matrix(1, 0, tangent, 1, 0, 0).multiply(matrix)
elif transformation_type == 'skewY':
tangent = tan(radians(float(values[0])))
matrix = cairo.Matrix(1, tangent, 0, 1, 0, 0).multiply(matrix)
elif transformation_type == 'translate':
if len(values) == 1:
values += (0,)
matrix.translate(*values)
elif transformation_type == 'scale':
if len(values) == 1:
values = 2 * values
matrix.scale(*values)
try:
matrix.invert()
except cairo.Error:
# Matrix not invertible, clip the surface to an empty path
def transform(surface, string, gradient=None):
"""Transform ``surface`` or ``gradient`` if supplied using ``string``.
See http://www.w3.org/TR/SVG/coords.html#TransformAttribute
"""
if not string:
return
transformations = re.findall(r'(\w+) ?\( ?(.*?) ?\)', normalize(string))
matrix = cairo.Matrix()
for transformation_type, transformation in transformations:
values = [size(surface, value) for value in transformation.split(' ')]
if transformation_type == 'matrix':
matrix = cairo.Matrix(*values).multiply(matrix)
elif transformation_type == 'rotate':
angle = radians(float(values.pop(0)))
x, y = values or (0, 0)
matrix.translate(x, y)
matrix.rotate(angle)
matrix.translate(-x, -y)
elif transformation_type == 'skewX':
tangent = tan(radians(float(values[0])))
matrix = cairo.Matrix(1, 0, tangent, 1, 0, 0).multiply(matrix)
elif transformation_type == 'skewY':
tangent = tan(radians(float(values[0])))
matrix = cairo.Matrix(1, tangent, 0, 1, 0, 0).multiply(matrix)
elif transformation_type == 'translate':
if len(values) == 1:
values += (0,)
matrix.translate(*values)
x2 = size(surface, gradient_node.get('x2', '100%'), width_ref)
y1 = size(surface, gradient_node.get('y1', '0%'), height_ref)
y2 = size(surface, gradient_node.get('y2', '0%'), height_ref)
gradient_pattern = cairo.LinearGradient(x1, y1, x2, y2)
elif gradient_node.tag == 'radialGradient':
r = size(surface, gradient_node.get('r', '50%'), diagonal_ref)
cx = size(surface, gradient_node.get('cx', '50%'), width_ref)
cy = size(surface, gradient_node.get('cy', '50%'), height_ref)
fx = size(surface, gradient_node.get('fx', str(cx)), width_ref)
fy = size(surface, gradient_node.get('fy', str(cy)), height_ref)
gradient_pattern = cairo.RadialGradient(fx, fy, 0, cx, cy, r)
# Apply matrix to set coordinate system for gradient
if gradient_node.get('gradientUnits') != 'userSpaceOnUse':
gradient_pattern.set_matrix(cairo.Matrix(
1 / width, 0, 0, 1 / height, - x / width, - y / height))
# Apply transform of gradient
transform(
surface, gradient_node.get('gradientTransform'), gradient_pattern)
# Apply gradient (
if 'viewBox' not in pattern_node:
pattern_node['width'] = pattern_width
pattern_node['height'] = pattern_height
if pattern_node.get('patternContentUnits') == 'objectBoundingBox':
pattern_node['transform'] = 'scale({}, {})'.format(
width, height)
# Fail if pattern has an invalid size
if pattern_width == 0.0 or pattern_height == 0.0:
return False
from .surface import SVGSurface # circular import
pattern_surface = SVGSurface(pattern_node, None, surface.dpi, surface)
pattern_pattern = cairo.SurfacePattern(pattern_surface.cairo)
pattern_pattern.set_extend(cairo.EXTEND_REPEAT)
pattern_pattern.set_matrix(cairo.Matrix(
pattern_surface.width / pattern_width, 0, 0,
pattern_surface.height / pattern_height, -x, -y))
surface.context.set_source(pattern_pattern)
return True