File indexing completed on 2025-04-27 04:01:22

0001 import os
0002 import math
0003 
0004 from lottie.parsers.sif import api, ast
0005 from lottie.nvector import NVector, PolarVector
0006 from .. import base
0007 
0008 
0009 class TestParseFile(base.TestCase):
0010     file = os.path.join(os.path.dirname(os.path.abspath(__file__)), "baseline.sif")
0011 
0012     def assert_strong_equal(self, a, b):
0013         ta = type(a)
0014         tb = type(b)
0015         if ta == tb or issubclass(tb, ta):
0016             if ta is float:
0017                 self.assertAlmostEqual(a, b)
0018             elif ta is NVector:
0019                 self.assertEqual(len(a), len(b))
0020                 for ia, ib in zip(a, b):
0021                     self.assertAlmostEqual(ia, ib)
0022             else:
0023                 self.assertEqual(a, b)
0024         else:
0025             self.fail("%s and %s have different types: %s, %s" % (a, b, ta, tb))
0026 
0027     def test_from_xml(self):
0028         canvas = api.Canvas.from_xml_file(self.file)
0029         self._check_file(canvas)
0030 
0031     def _check_file(self, canvas):
0032         self.canvas = canvas
0033         self._check_canvas(canvas)
0034         self._check_layer_polygon(canvas.layers[0])
0035         self._check_layer_zoom(canvas.layers[1])
0036         self._check_layer_group(canvas.layers[2])
0037         self._check_layer_circle_outline(canvas.layers[3])
0038         self._check_layer_region(canvas.layers[5])
0039         self._check_layer_gradient(canvas.layers[6])
0040         self._check_layer_text(canvas.layers[7])
0041 
0042     def _check_canvas(self, canvas):
0043         self.assertIsInstance(canvas, api.Canvas)
0044         self.assertEqual(len(canvas.layers), 8)
0045         self.assert_strong_equal(canvas.version, "1.2")
0046         self.assert_strong_equal(canvas.width, 512.)
0047         self.assert_strong_equal(canvas.height, 512.)
0048         self.assert_strong_equal(canvas.xres, 2834.645752)
0049         self.assert_strong_equal(canvas.yres, 2834.645752)
0050         self.assert_strong_equal(canvas.gamma_r, 2.2)
0051         self.assert_strong_equal(canvas.gamma_g, 2.2)
0052         self.assert_strong_equal(canvas.gamma_b, 2.2)
0053         self.assert_strong_equal(canvas.view_box, NVector(-4.266667, 4.266667, 4.266667, -4.266667))
0054         self.assert_strong_equal(canvas.antialias, True)
0055         self.assert_strong_equal(canvas.fps, 60.)
0056         self.assert_strong_equal(canvas.begin_time, api.FrameTime(0, api.FrameTime.Unit.Frame))
0057         self.assert_strong_equal(canvas.end_time, api.FrameTime(3., api.FrameTime.Unit.Seconds))
0058         self.assert_strong_equal(canvas.bgcolor, NVector(.5, .5, .5, 1.))
0059         self.assertEqual(len(canvas.keyframes), 1)
0060         kf = canvas.keyframes[0]
0061         self.assert_strong_equal(kf.time, api.FrameTime.frame(0))
0062         self.assert_strong_equal(kf.active, True)
0063 
0064     def _check_layer_polygon(self, layer):
0065         self.assertIsInstance(layer, api.PolygonLayer)
0066         self.assert_strong_equal(layer.type, "polygon")
0067         self.assert_strong_equal(layer.desc, "Polygon008")
0068 
0069         self.assert_strong_equal(layer.active, True)
0070         self.assert_strong_equal(layer.exclude_from_rendering, False)
0071         self.assert_strong_equal(layer.version, "0.1")
0072 
0073         self.assert_strong_equal(layer.z_depth.value, 0.)
0074         self.assert_strong_equal(layer.amount.value, 1.)
0075         self.assert_strong_equal(layer.blend_method, api.BlendMethod.Composite)
0076         self.assert_strong_equal(layer.origin.value, NVector(0., 0.))
0077         self.assert_strong_equal(layer.color.value, NVector(1., 1., 1., 1.))
0078         self.assert_strong_equal(layer.origin.value, NVector(0, 0))
0079 
0080         self.assert_strong_equal(layer.invert.value, False)
0081         self.assert_strong_equal(layer.antialias.value, True)
0082         self.assert_strong_equal(layer.feather.value, 0.)
0083         self.assert_strong_equal(layer.blurtype.value, api.BlurType.FastGaussian)
0084         self.assert_strong_equal(layer.winding_style.value, api.WindingStyle.NonZero)
0085 
0086         self.assertIsInstance(layer.points, list)
0087         self.assertEqual(len(layer.points), 5)
0088         self.assert_strong_equal(layer.points[0].value, NVector(-3.4468984604, 0.6007212400))
0089         self.assert_strong_equal(layer.points[4].value, NVector(-2.7399964333, -0.2140279114))
0090 
0091     def _check_layer_zoom(self, layer):
0092         self.assertIsInstance(layer, api.ScaleLayer)
0093         self.assert_strong_equal(layer.type, "zoom")
0094         self.assert_strong_equal(layer.amount.value, 0.4479692780)
0095         self.assert_strong_equal(layer.center.value, NVector(-2.9516866207, 0.7527821660))
0096 
0097     def _check_layer_group(self, layer):
0098         self.assertIsInstance(layer, api.GroupLayer)
0099         self.assert_strong_equal(layer.type, "group")
0100         self.assert_strong_equal(layer.desc, "Group")
0101 
0102         self.assert_strong_equal(layer.origin.value, NVector(0., 0.))
0103         self.assert_strong_equal(layer.time_dilation.value, 1.)
0104         self.assert_strong_equal(layer.time_offset.value, api.FrameTime(0, api.FrameTime.Unit.Seconds))
0105         self.assert_strong_equal(layer.children_lock, False)
0106         self.assert_strong_equal(layer.outline_grow.value, 0.)
0107         self.assert_strong_equal(layer.z_range, False)
0108         self.assert_strong_equal(layer.z_range_position.value, 0.)
0109         self.assert_strong_equal(layer.z_range_depth.value, 0.)
0110         self.assert_strong_equal(layer.z_range_blur.value, 0.)
0111 
0112         trans = layer.transformation
0113         self.assertIsInstance(trans, api.SifTransform)
0114         self.assert_strong_equal(trans.offset.value, NVector(0, 0))
0115         self.assert_strong_equal(trans.angle.value, -89.798615)
0116         self.assert_strong_equal(trans.skew_angle.value, 0.)
0117         self.assert_strong_equal(trans.scale.value, NVector(1, 1))
0118 
0119         canvas = layer.layers
0120         self.assertEqual(len(canvas), 3)
0121         self._check_layer_circle(canvas[0])
0122         self._check_layer_rectangle(canvas[1])
0123         self._check_layer_star(canvas[2])
0124 
0125     def _check_layer_circle(self, layer):
0126         self.assertIsInstance(layer, api.CircleLayer)
0127         self.assert_strong_equal(layer.type, "circle")
0128         self.assert_strong_equal(layer.radius.value, 0.5332824707)
0129         self.assert_strong_equal(layer.feather.value, 0.)
0130         self.assert_strong_equal(layer.origin.value, NVector(-2.7097899914, 2.6285450459))
0131         self.assert_strong_equal(layer.color.value, NVector(1., 0., 0., 1.))
0132         guid = "735D9D04C276A32CAE9D9F045DFF318B"
0133         self.assert_strong_equal(layer.origin.value, self.canvas.get_object(guid))
0134         self.assertIs(layer.origin.value, self.canvas.get_object(guid))
0135 
0136     def _check_layer_rectangle(self, layer):
0137         self.assertIsInstance(layer, api.RectangleLayer)
0138         self.assert_strong_equal(layer.type, "rectangle")
0139         self.assert_strong_equal(layer.color.value, NVector(1., 1., 1., 1.))
0140         self.assert_strong_equal(layer.point1.value, NVector(-1.4219197035, 2.7379217148))
0141         self.assert_strong_equal(layer.point2.value, NVector(-0.2791198790, 1.7953078747))
0142         self.assert_strong_equal(layer.expand.value, 0.)
0143         self.assert_strong_equal(layer.feather_x.value, 0.)
0144         self.assert_strong_equal(layer.feather_y.value, 0.)
0145         self.assert_strong_equal(layer.bevel.value, 0.1666666797)
0146         self.assert_strong_equal(layer.bevCircle.value, True)
0147 
0148     def _check_layer_star(self, layer):
0149         self.assertIsInstance(layer, api.StarLayer)
0150         self.assert_strong_equal(layer.type, "star")
0151         self.assert_strong_equal(layer.feather.value, 0.)
0152         self.assert_strong_equal(layer.radius1.value, 0.9195922852)
0153         self.assert_strong_equal(layer.radius2.value, 0.4597961426)
0154         self.assert_strong_equal(layer.angle.value, 90.)
0155         self.assert_strong_equal(layer.points.value, 5)
0156         self.assert_strong_equal(layer.regular_polygon.value, False)
0157 
0158     def _check_layer_circle_outline(self, layer):
0159         self.assertIsInstance(layer, api.OutlineLayer)
0160         self.assert_strong_equal(layer.type, "outline")
0161         self.assert_strong_equal(layer.desc, "Circle017 Outline")
0162         self.assert_strong_equal(layer.origin.value, NVector(-2.7097899914, 2.6285450459))
0163         self.assertIsInstance(layer.bline, api.Bline)
0164         self.assertEqual(len(layer.bline.points), 4)
0165         self.assert_strong_equal(layer.bline.loop, True)
0166 
0167         guid = "735D9D04C276A32CAE9D9F045DFF318B"
0168         self.assert_strong_equal(layer.origin.value, self.canvas.get_object(guid))
0169         self.assertIs(layer.origin.value, self.canvas.get_object(guid))
0170 
0171         point = layer.bline.points[0]
0172         self.assertIsInstance(point, api.BlinePoint)
0173         self.assert_strong_equal(point.point.value, NVector(0.5332824588, 0))
0174         self.assert_strong_equal(point.width.value, 1.)
0175         self.assert_strong_equal(point.origin.value, 0.5)
0176         self.assert_strong_equal(point.split.value, False)
0177         self.assert_strong_equal(point.split_radius.value, True)
0178         self.assert_strong_equal(point.split_angle.value, False)
0179         self.assert_strong_equal(point.t1.radius.value, 0.8835712761)
0180         self.assert_strong_equal(point.t1.theta.value, 90.)
0181         self.assert_strong_equal(point.t2.radius.value, 0.8835712761)
0182         self.assert_strong_equal(point.t2.theta.value, 90.)
0183 
0184     def _check_layer_region(self, layer):
0185         self.assertIsInstance(layer, api.RegionLayer)
0186         self.assert_strong_equal(layer.type, "region")
0187         self.assertIsInstance(layer.bline, api.Bline)
0188         self.assertEqual(len(layer.bline.points), 3)
0189         self.assert_strong_equal(layer.bline.loop, True)
0190 
0191         point = layer.bline.points[0]
0192         self.assertIsInstance(point, api.BlinePoint)
0193         self.assert_strong_equal(point.point.value, NVector(-0.7645721436, 0.4090138674))
0194         self.assert_strong_equal(point.width.value, 1.)
0195         self.assert_strong_equal(point.origin.value, 0.5)
0196         self.assert_strong_equal(point.split.value, False)
0197         self.assert_strong_equal(point.split_radius.value, False)
0198         self.assert_strong_equal(point.split_angle.value, False)
0199         self.assert_strong_equal(point.t1.radius.value, 1.7138580473)
0200         self.assert_strong_equal(point.t1.theta.value, 53.468349)
0201         self.assert_strong_equal(point.t2.radius.value, 1.7138580473)
0202         self.assert_strong_equal(point.t2.theta.value, 53.468349)
0203 
0204         point = layer.bline.points[1]
0205         self.assertIsInstance(point, api.BlinePoint)
0206         self.assert_strong_equal(point.point.value, NVector(0.7732625604, -0.0648742691))
0207         self.assertIsInstance(point.t1.radius, ast.SifAnimated)
0208         self.assertEqual(len(point.t1.radius.keyframes), 2)
0209         kf = point.t1.radius.keyframes[0]
0210         self.assertIsInstance(kf, api.SifKeyframe)
0211         self.assert_strong_equal(kf.time, api.FrameTime(0, api.FrameTime.Unit.Seconds))
0212         self.assert_strong_equal(kf.before, ast.Interpolation.Clamped)
0213         self.assert_strong_equal(kf.after, ast.Interpolation.Clamped)
0214         self.assert_strong_equal(kf.value, 2.2314351749)
0215         kf = point.t1.radius.keyframes[1]
0216         self.assertIsInstance(kf, api.SifKeyframe)
0217         self.assert_strong_equal(kf.time, api.FrameTime(2, api.FrameTime.Unit.Seconds))
0218         self.assert_strong_equal(kf.before, ast.Interpolation.Clamped)
0219         self.assert_strong_equal(kf.after, ast.Interpolation.Clamped)
0220         self.assert_strong_equal(kf.value, 2.6981012388)
0221 
0222         kf = point.t1.theta.keyframes[0]
0223         self.assertIsInstance(kf, api.SifKeyframe)
0224         self.assert_strong_equal(kf.time, api.FrameTime(0, api.FrameTime.Unit.Seconds))
0225         self.assert_strong_equal(kf.before, ast.Interpolation.Clamped)
0226         self.assert_strong_equal(kf.after, ast.Interpolation.Clamped)
0227         self.assert_strong_equal(kf.value, 19.593754)
0228         kf = point.t1.theta.keyframes[1]
0229         self.assertIsInstance(kf, api.SifKeyframe)
0230         self.assert_strong_equal(kf.time, api.FrameTime(2, api.FrameTime.Unit.Seconds))
0231         self.assert_strong_equal(kf.before, ast.Interpolation.Clamped)
0232         self.assert_strong_equal(kf.after, ast.Interpolation.Clamped)
0233         self.assert_strong_equal(kf.value, -57.534264)
0234 
0235     def _check_layer_gradient(self, layer):
0236         self.assert_strong_equal(layer.desc, "Gradient Group")
0237         gradient = layer.layers[0]
0238         self.assertIsInstance(gradient, api.RadialGradient)
0239         self.assertEqual(len(gradient.gradient.value), 2)
0240         self.assert_strong_equal(gradient.gradient.value[0].pos, 0.)
0241         self.assert_strong_equal(gradient.gradient.value[0].color, NVector(1, 1, 1, 1))
0242         self.assert_strong_equal(gradient.gradient.value[1].pos, 1.)
0243         self.assert_strong_equal(gradient.gradient.value[1].color, NVector(0, 0, 0, 1))
0244         self.assert_strong_equal(layer.layers[1].blend_method, api.BlendMethod.Alpha)
0245 
0246     def _check_layer_text(self, layer):
0247         self.assertIsInstance(layer, api.TextLayer)
0248         self.assert_strong_equal(layer.type, "text")
0249         self.assert_strong_equal(layer.desc, "Foobar")
0250 
0251         self.assert_strong_equal(layer.text.value, "Foobar")
0252         self.assert_strong_equal(layer.family.value, "Sans Serif")
0253         self.assert_strong_equal(layer.style.value, api.FontStyle.Normal)
0254         self.assert_strong_equal(layer.weight.value, 400)
0255         self.assert_strong_equal(layer.compress.value, 1.)
0256         self.assert_strong_equal(layer.size.value, NVector(1., 1.))
0257         self.assert_strong_equal(layer.orient.value, NVector(.5, .5))
0258         self.assert_strong_equal(layer.origin.value, NVector(0.9813190699, -2.9089243412))
0259         self.assert_strong_equal(layer.use_kerning.value, True)
0260         self.assert_strong_equal(layer.grid_fit.value, False)
0261 
0262     def test_round_trip(self):
0263         canvas1 = api.Canvas.from_xml_file(self.file)
0264         canvas2 = api.Canvas.from_xml(canvas1.to_xml())
0265         self._check_file(canvas2)