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))
Exemple #4
0
    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)
Exemple #6
0
    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))
Exemple #8
0
    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,
        )
Exemple #9
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
             },
         })
Exemple #10
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))
Exemple #13
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",
         })
Exemple #14
0
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)
Exemple #16
0
    (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))
Exemple #19
0
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)
Exemple #20
0

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))