def test_group_scale(self): lot = objects.Animation() ref_sl = lot.add_layer(objects.ShapeLayer()) ref_rect = ref_sl.add_shape(objects.Rect()) ref_rect.position.value = NVector(128, 128) ref_rect.size.value = NVector(256, 256) ref_sl.add_shape(objects.Fill(Color(1, 0, 0))) ref_sl.transform.opacity.value = 80 sl = lot.add_layer(objects.ShapeLayer()) rect = sl.add_shape(objects.Rect()) rect.position.value = NVector(128, 128) rect.size.value = NVector(256, 256) sl.add_shape(objects.Fill(Color(1, 1, 0))) sl.transform.scale.value = NVector(180, 50) sl.transform.position.value = NVector(256, 256) sl.transform.anchor_point.value = NVector(128, 128) sif = builder.to_sif(lot) self.assertEqual(len(sif.layers), 2) self.assertIsInstance(sif.layers[0], api.GroupLayer) self.assertIsInstance(sif.layers[1], api.GroupLayer) self.assertAlmostEqual(sif.layers[0].amount.value, 1) self.assertAlmostEqual(sif.layers[1].amount.value, 0.8) self.assert_nvector_equal(sif.layers[0].transformation.offset.value, NVector(256, 256)) self.assert_nvector_equal(sif.layers[0].origin.value, NVector(128, 128)) self.assert_nvector_equal(sif.layers[0].transformation.scale.value, NVector(1.8, .5)) self.assert_nvector_equal(sif.layers[1].transformation.offset.value, NVector(0, 0)) self.assert_nvector_equal(sif.layers[1].origin.value, NVector(0, 0)) self.assert_nvector_equal(sif.layers[1].transformation.scale.value, NVector(1, 1))
def test_group_rotate(self): lot = objects.Animation() ref_sl = lot.add_layer(objects.ShapeLayer()) ref_rect = ref_sl.add_shape(objects.Rect()) ref_rect.position.value = NVector(128, 128) ref_rect.size.value = NVector(256, 256) ref_sl.add_shape(objects.Fill(Color(1, 0, 0))) ref_sl.transform.opacity.value = 80 sl = lot.add_layer(objects.ShapeLayer()) rect = sl.add_shape(objects.Rect()) rect.position.value = NVector(128, 128) rect.size.value = NVector(256, 256) sl.add_shape(objects.Fill(Color(1, 1, 0))) sl.transform.rotation.value = 20 sif = builder.to_sif(lot) self.assertEqual(len(sif.layers), 2) self.assertIsInstance(sif.layers[0], api.GroupLayer) self.assertIsInstance(sif.layers[1], api.GroupLayer) self.assertAlmostEqual(sif.layers[0].amount.value, 1) self.assertAlmostEqual(sif.layers[1].amount.value, 0.8) self.assertAlmostEqual(sif.layers[0].transformation.angle.value, 20) self.assertAlmostEqual(sif.layers[1].transformation.angle.value, 0)
def test_animated_real(self): lot = objects.Animation() ref_sl = lot.add_layer(objects.ShapeLayer()) ref_rect = ref_sl.add_shape(objects.Rect()) ref_rect.position.value = NVector(128, 128) ref_rect.size.value = NVector(256, 256) ref_sl.add_shape(objects.Fill(Color(1, 0, 0))) ref_sl.transform.opacity.add_keyframe(0, 100) ref_sl.transform.opacity.add_keyframe(30, 0) ref_sl.transform.opacity.add_keyframe(60, 100) sif = builder.to_sif(lot) self.assertEqual(len(sif.layers), 1) self.assertIsInstance(sif.layers[0], api.GroupLayer) amount = sif.layers[0].amount self.assertAlmostEqual(amount.keyframes[0].value, 1) self.assertAlmostEqual(amount.keyframes[1].value, 0) self.assertAlmostEqual(amount.keyframes[2].value, 1) self.assertEqual(amount.keyframes[0].time, api.FrameTime.frame(0)) self.assertEqual(amount.keyframes[1].time, api.FrameTime.frame(30)) self.assertEqual(amount.keyframes[2].time, api.FrameTime.frame(60))
def test_inkscape_center(self): parser = SvgParser() element = ElementTree.Element("g") group = objects.Rect(NVector(100, 200), NVector(300, 400)) dest_transform = objects.Transform() element.attrib[parser.qualified("inkscape", "transform-center-x")] = 0 element.attrib[parser.qualified("inkscape", "transform-center-y")] = 0 parser.parse_transform(element, group, dest_transform) self.assert_transform( dest_transform, anchor_point=NVector(100, 200), position=NVector(100, 200), scale=NVector(100, 100), rotation=0, skew_axis=0, skew=0, ) element.attrib[parser.qualified("inkscape", "transform-center-x")] = 20 element.attrib[parser.qualified("inkscape", "transform-center-y")] = -30 parser.parse_transform(element, group, dest_transform) self.assert_transform( dest_transform, anchor_point=NVector(120, 230), position=NVector(120, 230), scale=NVector(100, 100), rotation=0, skew_axis=0, skew=0, )
def test_animated_vector(self): lot = objects.Animation() ref_sl = lot.add_layer(objects.ShapeLayer()) ref_rect = ref_sl.add_shape(objects.Rect()) ref_rect.position.value = NVector(128, 128) ref_rect.size.value = NVector(256, 256) ref_sl.add_shape(objects.Fill(Color(1, 0, 0))) ref_sl.transform.opacity.value = 80 sl = lot.add_layer(objects.ShapeLayer()) rect = sl.add_shape(objects.Rect()) rect.position.value = NVector(128, 128) rect.size.value = NVector(256, 256) sl.add_shape(objects.Fill(Color(1, 1, 0))) sl.transform.position.add_keyframe(0, NVector(0, 0)) sl.transform.position.add_keyframe(30, NVector(256, 256)) sl.transform.position.add_keyframe(60, NVector(0, 0)) sif = builder.to_sif(lot) self.assertEqual(len(sif.layers), 2) self.assertIsInstance(sif.layers[0], api.GroupLayer) self.assertIsInstance(sif.layers[1], api.GroupLayer) self.assertAlmostEqual(sif.layers[0].amount.value, 1) self.assertAlmostEqual(sif.layers[1].amount.value, 0.8) self.assert_nvector_equal(sif.layers[1].transformation.offset.value, NVector(0, 0)) off = sif.layers[0].transformation.offset self.assert_nvector_equal(off.keyframes[0].value, NVector(0, 0)) self.assert_nvector_equal(off.keyframes[1].value, NVector(256, 256)) self.assert_nvector_equal(off.keyframes[2].value, NVector(0, 0)) self.assertEqual(off.keyframes[0].time, api.FrameTime.frame(0)) self.assertEqual(off.keyframes[1].time, api.FrameTime.frame(30)) self.assertEqual(off.keyframes[2].time, api.FrameTime.frame(60)) self.assertEqual(off.keyframes[0].before, api.Interpolation.Linear) self.assertEqual(off.keyframes[1].before, api.Interpolation.Linear) self.assertEqual(off.keyframes[2].before, api.Interpolation.Linear) self.assertEqual(off.keyframes[0].after, api.Interpolation.Linear) self.assertEqual(off.keyframes[1].after, api.Interpolation.Linear) self.assertEqual(off.keyframes[2].after, api.Interpolation.Linear)
def test_boundingbox(self): sh = objects.Rect() sh.position.value = [30, 40] sh.size.value = [10, 20] bb = sh.bounding_box() c = bb.center() self.assertEqual(bb.x1, 30 - 5) self.assertEqual(bb.y1, 40 - 10) self.assertEqual(bb.x2, 30 + 5) self.assertEqual(bb.y2, 40 + 10) self.assertEqual(c[0], 30) self.assertEqual(c[1], 40)
def test_shape_group(self): lot = objects.Animation() sl = lot.add_layer(objects.ShapeLayer()) gr1 = sl.add_shape(objects.Group()) gr1.name = "Group Shape 1" rect = gr1.add_shape(objects.Rect()) rect.position.value = NVector(128, 256) rect.size.value = NVector(128, 256) gr1.add_shape(objects.Fill(Color(1, .25, 0))) gr2 = sl.add_shape(objects.Group()) gr2.name = "Group Shape 2" rect = gr2.add_shape(objects.Rect()) rect.position.value = NVector(256+128, 256) rect.size.value = NVector(128, 256) gr2.add_shape(objects.Fill(Color(.25, 0, 1))) sif = builder.to_sif(lot) self.assertEqual(len(sif.layers), 1) self.assertIsInstance(sif.layers[0], api.GroupLayer) grp = sif.layers[0] self.assertEqual(len(grp.layers), 2) sg1 = grp.layers[1] sg2 = grp.layers[0] self.assertIsInstance(sg1, api.GroupLayer) self.assertIsInstance(sg2, api.GroupLayer) self.assertEqual(sg1.desc, "Group Shape 1") self.assertEqual(sg2.desc, "Group Shape 2") self.assertEqual(len(sg1.layers), 1) self.assertEqual(len(sg2.layers), 1) self.assertIsInstance(sg1.layers[0], api.RegionLayer) self.assertIsInstance(sg2.layers[0], api.RegionLayer) self.assert_nvector_equal(sg1.layers[0].color.value, sif.make_color(1, .25, 0)) self.assert_nvector_equal(sg2.layers[0].color.value, sif.make_color(.25, 0, 1))
def test_multi_trans(self): parser = SvgParser() element = ElementTree.Element("g") group = objects.Rect(NVector(100, 200), NVector(300, 400)) dest_transform = objects.Transform() element.attrib["transform"] = "scale(0.7, 0.5) rotate(45) translate(12, 34)" parser.parse_transform(element, group, dest_transform) self.assert_transform( dest_transform, anchor_point=NVector(0, 0), position=NVector(12, 34), scale=NVector(70, 50), rotation=45, skew_axis=0, skew=0, )
def test_empty(self): sh = objects.Rect() self.assertDictEqual( sh.to_dict(), { "ty": "rc", "d": 0, "p": { "a": 0, "k": [0, 0] }, "s": { "a": 0, "k": [0, 0] }, "r": { "a": 0, "k": 0 }, })
def test_matrix(self): parser = SvgParser() element = ElementTree.Element("g") group = objects.Rect(NVector(100, 200), NVector(300, 400)) dest_transform = objects.Transform() m = TransformMatrix() m.scale(0.7, 0.5) m.rotate(-math.pi/4) m.translate(12, 34) element.attrib["transform"] = m.to_css_2d() parser.parse_transform(element, group, dest_transform) self.assert_transform( dest_transform, anchor_point=NVector(0, 0), position=NVector(12, 34), scale=NVector(70, 50), rotation=45, skew_axis=0, skew=0, )
def test_animated_fill(self): lot = objects.Animation() ref_sl = lot.add_layer(objects.ShapeLayer()) ref_rect = ref_sl.add_shape(objects.Rect()) ref_rect.position.value = NVector(128, 128) ref_rect.size.value = NVector(256, 256) fill = ref_sl.add_shape(objects.Fill()) fill.opacity.add_keyframe(0, 100) fill.opacity.add_keyframe(30, 50) fill.opacity.add_keyframe(60, 100) fill.color.add_keyframe(0, NVector(1, 0, 0)) fill.color.add_keyframe(30, NVector(0, 1, 0)) fill.color.add_keyframe(60, NVector(1, 0, 0)) sif = builder.to_sif(lot) self.assertEqual(len(sif.layers), 1) self.assertIsInstance(sif.layers[0], api.GroupLayer) amount = sif.layers[0].layers[0].amount self.assertAlmostEqual(amount.keyframes[0].value, 1) self.assertAlmostEqual(amount.keyframes[1].value, 0.5) self.assertAlmostEqual(amount.keyframes[2].value, 1) self.assertEqual(amount.keyframes[0].time, api.FrameTime.frame(0)) self.assertEqual(amount.keyframes[1].time, api.FrameTime.frame(30)) self.assertEqual(amount.keyframes[2].time, api.FrameTime.frame(60)) color = sif.layers[0].layers[0].color self.assert_nvector_equal(color.keyframes[0].value, sif.make_color(1, 0, 0)) self.assert_nvector_equal(color.keyframes[1].value, sif.make_color(0, 1, 0)) self.assert_nvector_equal(color.keyframes[2].value, sif.make_color(1, 0, 0)) self.assertEqual(color.keyframes[0].time, api.FrameTime.frame(0)) self.assertEqual(color.keyframes[1].time, api.FrameTime.frame(30)) self.assertEqual(color.keyframes[2].time, api.FrameTime.frame(60))
def test_rect(self): lot = objects.Animation() sl = lot.add_layer(objects.ShapeLayer()) rect = sl.add_shape(objects.Rect()) rect.position.value = NVector(256, 256) rect.size.value = NVector(128, 256) sl.add_shape(objects.Fill(Color(1, .25, 0))) sif = builder.to_sif(lot) self.assertEqual(len(sif.layers), 1) self.assertIsInstance(sif.layers[0], api.GroupLayer) grp = sif.layers[0] self.assertEqual(len(grp.layers), 1) self.assertIsInstance(grp.layers[0], api.RegionLayer) self.assertTrue(grp.active) rgl = grp.layers[0] self.assertEqual(len(rgl.bline.points), 4) self.assert_nvector_equal(rgl.origin.value, rect.position.value) self.assert_nvector_equal(rgl.color.value, sif.make_color(1, .25, 0)) self.assertTrue(rgl.active) self.assert_nvector_equal(rgl.bline.points[0].point.value, NVector(-64, -128)) self.assert_nvector_equal(rgl.bline.points[1].point.value, NVector(+64, -128)) self.assert_nvector_equal(rgl.bline.points[2].point.value, NVector(+64, +128)) self.assert_nvector_equal(rgl.bline.points[3].point.value, NVector(-64, +128)) self.assert_nvector_equal(rgl.bline.points[0].t1.value, NVector(0, 0)) self.assert_nvector_equal(rgl.bline.points[1].t1.value, NVector(0, 0)) self.assert_nvector_equal(rgl.bline.points[2].t1.value, NVector(0, 0)) self.assert_nvector_equal(rgl.bline.points[3].t1.value, NVector(0, 0)) self.assert_nvector_equal(rgl.bline.points[0].t2.value, NVector(0, 0)) self.assert_nvector_equal(rgl.bline.points[1].t2.value, NVector(0, 0)) self.assert_nvector_equal(rgl.bline.points[2].t2.value, NVector(0, 0)) self.assert_nvector_equal(rgl.bline.points[3].t2.value, NVector(0, 0))
def test_sized(self): sh = objects.Rect() sh.size.value = [10, 20] sh.position.value = [30, 40] sh.name = "foo" self.assertDictEqual( sh.to_dict(), { "ty": "rc", "d": 0, "p": { "a": 0, "k": [30, 40] }, "s": { "a": 0, "k": [10, 20] }, "r": { "a": 0, "k": 0 }, "nm": "foo", })
an = objects.Animation(59) layer = objects.ShapeLayer() an.add_layer(layer) g1 = layer.add_shape(objects.Group()) circle = g1.add_shape(objects.Ellipse()) circle.size.value = Point(100, 100) circle.position.value = Point(200, 100) g1.add_shape(objects.Fill(Color(1, 0, 0))) g1.add_shape(objects.Stroke(Color(0, 0, 0), 5)) g2 = layer.add_shape(objects.Group()) star = g2.add_shape(objects.Star()) star.inner_radius.value = 20 star.outer_radius.value = 50 star.position.value = Point(300, 100) g2.add_shape(objects.Fill(Color(0, 1, 0))) g2.add_shape(objects.Stroke(Color(0, 0, 0), 5)) g3 = layer.add_shape(objects.Group()) rect = g3.add_shape(objects.Rect()) rect.size.value = Point(100, 100) rect.position.value = Point(100, 100) g3.add_shape(objects.Fill(Color(0, 0, 1))) g3.add_shape(objects.Stroke(Color(1, 1, 1), 5)) script.script_main(an)
from lottie import objects from lottie import Point, Color an = objects.Animation(59) layer = objects.ShapeLayer() an.add_layer(layer) circle = layer.add_shape(objects.Ellipse()) circle.size.value = Point(100, 100) circle.position.value = Point(220, 110) star = layer.add_shape(objects.Star()) star.inner_radius.value = 20 star.outer_radius.value = 50 star.position.value = Point(330, 110) rect = layer.add_shape(objects.Rect()) rect.size.value = Point(100, 100) rect.position.value = Point(110, 110) rrect = layer.add_shape(objects.Rect()) rrect.size.value = Point(100, 100) rrect.position.value = Point(110, 220) rrect.rounded.value = 30 fill = layer.add_shape(objects.Fill(Color(1, 1, 0))) stroke = layer.add_shape(objects.Stroke(Color(0, 0, 0), 25)) script.script_main(an)
(easing.EaseIn(1 / 5), Color(0, 1 / 5, 0)), (easing.EaseIn(1 / 10), Color(0, 1 / 10, 0)), (easing.Sigmoid(1), Color(0, 0, 1)), (easing.Sigmoid(1 / 2), Color(0, 0, 1 / 2)), (easing.Sigmoid(1 / 3), Color(0, 0, 1 / 3)), (easing.Sigmoid(1 / 5), Color(0, 0, 1 / 5)), (easing.Sigmoid(1 / 10), Color(0, 0, 1 / 10)), ] height = 512 / len(easings) width = height for i in range(len(easings)): group = layer.add_shape(objects.Group()) rectgroup = group.add_shape(objects.Group()) rect = rectgroup.add_shape(objects.Rect()) rect.size.value = Size(width, height) y = i * height + height / 2 group.transform.position.add_keyframe(0, Point(width / 2, y), easings[i][0]) group.transform.position.add_keyframe(90, Point(512 - width / 2, y), easings[i][0]) group.transform.position.add_keyframe(180, Point(width / 2, y), easings[i][0]) rectgroup.add_shape(objects.Fill(easings[i][1])) bezgroup = group.insert_shape(0, objects.Group()) bez = group.transform.position.keyframes[0].bezier() bezgroup.transform.scale.value = Size(100 * width, -100 * height) bezgroup.transform.position.value = Point(-width / 2, width / 2) bezgroup.add_shape(objects.Path()).shape.value = bez
circle.size.add_keyframe(60, Point(100, 100)) circle.position.add_keyframe(0, Point(220, 110)) circle.position.add_keyframe(20, Point(180, 110)) circle.position.add_keyframe(40, Point(220, 110)) star = shapes.add_shape(objects.Star()) star.inner_radius.add_keyframe(0, 20) star.inner_radius.add_keyframe(30, 50) star.inner_radius.add_keyframe(60, 20) star.outer_radius.value = 50 #star.inner_roundness.value = 100 #star.outer_roundness.value = 40 star.rotation.value = 45 star.position.value = Point(330, 110) rect = shapes.add_shape(objects.Rect()) rect.size.add_keyframe(0, Point(100, 100)) rect.size.add_keyframe(30, Point(50, 120)) rect.size.add_keyframe(60, Point(100, 100)) rect.position.add_keyframe(0, Point(110, 110)) rect.position.add_keyframe(20, Point(80, 110)) rect.position.add_keyframe(40, Point(110, 110)) rrect = shapes.add_shape(objects.Rect()) rrect.size.value = Point(100, 100) rrect.position.value = Point(440, 110) rrect.rounded.add_keyframe(0, 0) rrect.rounded.add_keyframe(30, 30) rrect.rounded.add_keyframe(60, 0) fill = shapes.add_shape(objects.Fill(Color(1, 1, 0)))
"lib")) from lottie.utils import script from lottie import objects from lottie.utils.animation import follow_path from lottie import Point, Color an = objects.Animation(180) layer = objects.ShapeLayer() an.add_layer(layer) group = layer.add_shape(objects.Group()) ball = group.add_shape(objects.Ellipse()) ball.size.value = Point(10, 10) r1 = group.add_shape(objects.Rect()) r1.size.value = Point(50, 10) r2 = group.add_shape(objects.Group()) r2.add_shape(objects.Rect()).size.value = Point(50, 10) r2 = r2.transform group.add_shape(objects.Fill(Color(0, 1, 0))) group = layer.add_shape(objects.Group()) bez = group.add_shape(objects.Path()) bez.shape.value.add_point(Point(256, 128), Point(0, 0), Point(64, 64)) bez.shape.value.add_point(Point(256, 256), Point(-64, -64), Point(-64, 64)) bez.shape.value.add_point(Point(256, 256 + 120), Point(0, 0), Point(0, 0)) group.add_shape(objects.Stroke(Color(1, 0, 0), 10))
sys.path.insert( 0, os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "lib")) from lottie.utils import script from lottie import objects from lottie.parsers.svg import parse_svg_file from lottie import Point, Color an = parse_svg_file( os.path.join(os.path.dirname(os.path.abspath(__file__)), "blep.svg")) maskshape = objects.Star() maskshape.inner_radius.value = 100 maskshape.outer_radius.value = 200 maskshape.rotation.value = 180 maskshape.position.value = Point(256, 256) #maskshape.size.value = Point(256, 256) maskbez = maskshape.to_bezier() mask = objects.Mask(maskbez.shape.value) an.layers[0].masks = [mask] g = an.layers[0].add_shape(objects.Group()) r = g.add_shape(objects.Rect()) r.position.value = Point(256, 256) r.size.value = Point(512, 512) g.add_shape(objects.Fill(Color(1, 1, 1))) script.script_main(an)
def add_shape(shape, color, parent): g = parent.add_shape(objects.Group()) s = g.add_shape(shape) g.add_shape(objects.Fill(color)) return s face1 = add_shape(objects.Ellipse(), Color(1, 1, 0), layer) face2 = add_shape(objects.Ellipse(), Color(0, 1, 0), layer) side = layer.add_shape(objects.Group()) side1 = add_shape(objects.Ellipse(), Color(1, 0, 0), side) side2 = add_shape(objects.Ellipse(), Color(1, 0, 0), side) sider = add_shape(objects.Rect(), Color(1, 0, 0), side) width = 10 face1.size.add_keyframe(rot_time*0, Point(256, 256), easing.EaseIn()) face1.size.add_keyframe(rot_time*1, Point(0, 256)) face1.size.add_keyframe(rot_time*2, Point(0, 256)) face1.size.add_keyframe(rot_time*3, Point(0, 256), easing.EaseOut()) face1.size.add_keyframe(rot_time*4, Point(256, 256)) face1.position.add_keyframe(rot_time*0, Point(256, 256), easing.EaseIn()) face1.position.add_keyframe(rot_time*1, Point(256-width, 256)) face1.position.add_keyframe(rot_time*2, Point(256-width, 256)) face1.position.add_keyframe(rot_time*3, Point(256+width, 256), easing.EaseOut()) face1.position.add_keyframe(rot_time*4, Point(256, 256))