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)