python-lottie  0.7.0+dev66cafb9
A framework to work with lottie files and telegram animated stickers (tgs)
nodes.py
Go to the documentation of this file.
1 import enum
2 from lottie.parsers.sif.sif.core import SifNodeMeta, FrameTime
3 from lottie.parsers.sif.sif.enums import Smooth
8 
9 
10 class SifNode(metaclass=SifNodeMeta):
11  def __init__(self, **kw):
12  for node in self._nodes:
13  node.initialize_object(kw, self)
14 
15  def __setattr__(self, name, value):
16  if name in self._nodemap:
17  value = self._nodemap[name].clean(value)
18  return super().__setattr__(name, value)
19 
20  @staticmethod
21  def static_from_dom(cls, xml: minidom.Element, registry: ObjectRegistry):
22  instance = cls()
23  for node in cls._nodes:
24  node.from_xml(instance, xml, registry)
25  return instance
26 
27  @classmethod
28  def from_dom(cls, xml: minidom.Element, registry: ObjectRegistry):
29  return SifNode.static_from_dom(cls, xml, registry)
30 
31  def to_dom(self, dom: minidom.Document):
32  element = dom.createElement(self._tag)
33  for node in self._nodes:
34  node.to_xml(self, element, dom)
35  return element
36 
37 
39  _nodes = [
40  XmlFixedAttribute("type", "transformation")
41  ]
42 
43  @classmethod
44  def from_dom(cls, xml: minidom.Element, registry: ObjectRegistry):
45  if xml.tagName == "bone_link":
46  return SifNode.static_from_dom(BoneLinkTransform, xml, registry)
47 
48  if xml.tagName != "composite":
49  raise ValueError("Invalid transform element: %s" % xml.tagName)
50  return SifNode.static_from_dom(SifTransform, xml, registry)
51 
52 
54  _tag = "composite"
55 
56  _nodes = [
57  XmlAnimatable("offset", "vector", NVector(0, 0)),
58  XmlAnimatable("angle", "angle", 0.),
59  XmlAnimatable("skew_angle", "angle", 0.),
60  XmlAnimatable("scale", "vector", NVector(1, 1)),
61  ]
62 
63 
65  _tag = "composite"
66 
67  _nodes = [
68  XmlFixedAttribute("type", "bline_point"),
69  XmlAnimatable("point", "vector", NVector(0, 0)),
70  XmlAnimatable("width", "real", 1.),
71  XmlAnimatable("origin", "real", .5),
72  XmlAnimatable("split", "bool", False),
73  XmlAnimatable("t1", "vector"),
74  XmlAnimatable("t2", "vector"),
75  XmlAnimatable("split_radius", "bool", True),
76  XmlAnimatable("split_angle", "bool", False),
77  ]
78 
79 
80 class Bline(SifNode):
81  _nodes = [
82  XmlAttribute("loop", bool_str, False),
83  XmlFixedAttribute("type", "bline_point"),
84  XmlList(BlinePoint, "points", "entry"),
85  ]
86 
87 
88 class BlendMethod(enum.Enum):
89  Composite = 0
90  Straight = 1
91  Onto = 13
92  StraightOnto = 21
93  Behind = 12
94  Screen = 16
95  Overlay = 20
96  HardLight = 17
97  Multiply = 6
98  Divide = 7
99  Add = 4
100  Subtract = 5
101  Difference = 18
102  Lighten = 2
103  Darken = 3
104  Color = 8
105  Hue = 9
106  Saturation = 10
107  Luminosity = 11
108  AlphaOver = 19
109  AlphaBrighten = 14
110  AlphaDarken = 15
111  Alpha = 23
112 
113 
114 class BlurType(enum.Enum):
115  Box = 0
116  FastGaussian = 1
117  CrossHatch = 2
118  Gaussian = 3
119  Disc = 4
120 
121 
122 class WindingStyle(enum.Enum):
123  NonZero = 0
124  EvenOdd = 1
125 
126 
127 class Def(SifNode):
128  _nodes = [
129  XmlAttribute("guid", str),
130  XmlAttribute("id", str),
131  ]
132  _subclasses = None
133 
134  @classmethod
135  def from_dom(cls, xml: minidom.Element, registry: ObjectRegistry):
136  actual_class = cls
137  if cls == Def:
138  actual_class = Def.def_types()[xml.tagName]
139 
140  obj = SifNode.static_from_dom(actual_class, xml, registry)
141  if obj.id:
142  registry.register_as(obj, obj.id)
143  if obj.guid:
144  registry.register(obj)
145  return obj
146 
147  @staticmethod
148  def tags():
149  return list(Def.def_types().keys())
150 
151  @staticmethod
152  def def_types():
153  if Def._subclasses is None:
154  Def._subclasses = {}
155  Def._gather_def_types(Def)
156  return Def._subclasses
157 
158  @staticmethod
159  def _gather_def_types(cls):
160  for subcls in cls.__subclasses__():
161  Def._subclasses[subcls._tag] = subcls
162  Def._gather_def_types(subcls)
163 
164 
165 class Duplicate(Def):
166  _nodes = [
167  XmlFixedAttribute("type", "real"),
168  XmlAnimatable("from", "real", 1.),
169  XmlAnimatable("to", "real", 1.),
170  XmlAnimatable("step", "real", 1.),
171  ]
172 
173  @property
174  def from_(self):
175  return getattr(self, "from")
176 
177  @from_.setter
178  def from_(self, value):
179  setattr(self, "from", value)
180 
181 
183  def __init__(self, id, value, typename):
184  self.idid = id
185  self.valuevalue = value
186  self.typetype = TypeDescriptor(typename)
187 
188  def to_dom(self, dom: minidom.Document):
189  element = self.valuevalue.to_dom(dom, self.typetype)
190  element.setAttribute("id", self.idid)
191  return element
192 
193 
194 class Layer(SifNode):
195  _types = None
196 
197  _version = "0.1"
198  _layer_type = None
199 
200  _nodes = [
201  XmlAttribute("type", str),
202  XmlAttribute("active", bool_str, True),
203  XmlAttribute("version", str),
204  XmlAttribute("exclude_from_rendering", bool_str, False),
205  XmlAttribute("desc", str, ""),
206  ]
207 
208  def __init__(self, **kw):
209  kw.setdefault("version", self._version_version)
210  super().__init__(**kw)
211  self.typetype = self._layer_type_layer_type
212 
213  def __repr__(self):
214  return "<%s.%s %r>" % (__name__, self.__class__.__name__, self.desc or self.typetype)
215 
216  def to_dom(self, dom: minidom.Document):
217  element = dom.createElement("layer")
218  for node in self._nodes_nodes:
219  node.to_xml(self, element, dom)
220  return element
221 
222  @classmethod
223  def from_dom(cls, xml: minidom.Element, registry: ObjectRegistry):
224  actual_class = cls
225  if cls == Layer:
226  type = xml.getAttribute("type")
227  actual_class = Layer.layer_types().get(type, Layer)
228 
229  return SifNode.static_from_dom(actual_class, xml, registry)
230 
231  @staticmethod
232  def layer_types():
233  if Layer._types is None:
234  Layer._types = {}
235  Layer._gather_layer_types(Layer)
236  return Layer._types
237 
238  @staticmethod
239  def _gather_layer_types(cls):
240  for subcls in cls.__subclasses__():
241  if subcls._layer_type:
242  Layer._types[subcls._layer_type] = subcls
243  Layer._gather_layer_types(subcls)
244 
245 
247  _nodes = [
248  XmlParam("z_depth", "real", 0.),
249  XmlParam("amount", "real", 1.),
250  XmlParam("blend_method", "integer", BlendMethod.Composite, BlendMethod, static=True),
251  ]
252 
253 
255  _nodes = [
256  XmlParam("origin", "vector", NVector(0, 0)),
257  XmlParamSif("transformation", AbstractTransform, SifTransform),
258  XmlWrapperParam("canvas", XmlWrapper("canvas", XmlList(Layer))),
259 
260  XmlParam("time_dilation", "real", 1.),
261  XmlParam("time_offset", "time", FrameTime(0, FrameTime.Unit.Frame)),
262  XmlParam("children_lock", "bool", False, static=True),
263  XmlParam("outline_grow", "real", 0.),
264  ]
265 
266  def add_layer(self, layer: Layer):
267  self.layers.append(layer)
268  return layer
269 
270 
272  _layer_type = "filter_group"
273 
274  _nodes = [
275  ]
276 
277 
279  _layer_type = "group"
280  _version = "0.3"
281 
282  _nodes = [
283  XmlParam("z_range", "bool", False, static=True),
284  XmlParam("z_range_position", "real", 0.),
285  XmlParam("z_range_depth", "real", 0.),
286  XmlParam("z_range_blur", "real", 0.),
287  ]
288 
289 
291  _layer_type = "switch"
292 
293  _nodes = [
294  XmlParam("layer_name", "string"),
295  XmlParam("layer_depth", "integer", -1),
296  ]
297 
298 
300  _layer_type = "rectangle"
301 
302  _nodes = [
303  XmlParam("color", "color", NVector(0, 0, 0, 1)),
304  XmlParam("point1", "vector", NVector(0, 0)),
305  XmlParam("point2", "vector", NVector(0, 0)),
306  XmlParam("expand", "real", 0.),
307  XmlParam("invert", "bool", False),
308  XmlParam("feather_x", "real", 0.),
309  XmlParam("feather_y", "real", 0.),
310  XmlParam("bevel", "real", 0.),
311  XmlParam("bevCircle", "bool", True),
312  ]
313 
314 
316  _layer_type = "circle"
317 
318  _nodes = [
319  XmlParam("color", "color", NVector(0, 0, 0, 1)),
320  XmlParam("radius", "real", 0.),
321  XmlParam("feather", "real", 0.),
322  XmlParam("origin", "vector", NVector(0, 0)),
323  XmlParam("invert", "bool", False),
324  ]
325 
326 
328  _layer_type = "simple_circle"
329 
330  _nodes = [
331  XmlParam("color", "color", NVector(0, 0, 0, 1)),
332  XmlParam("radius", "real", 0.),
333  XmlParam("center", "vector", NVector(0, 0)),
334  ]
335 
336 
338  _nodes = [
339  XmlParam("color", "color", NVector(0, 0, 0, 1)),
340  XmlParam("origin", "vector", NVector(0, 0)),
341  XmlParam("invert", "bool", False),
342  XmlParam("antialias", "bool", True),
343  XmlParam("feather", "real", 0.),
344  XmlParam("blurtype", "integer", BlurType.FastGaussian, BlurType),
345  XmlParam("winding_style", "integer", WindingStyle.NonZero, WindingStyle),
346  ]
347 
348 
350  _layer_type = "star"
351 
352  _nodes = [
353  XmlParam("radius1", "real", 0.),
354  XmlParam("radius2", "real", 0.),
355  XmlParam("angle", "angle", 0.),
356  XmlParam("points", "integer", 5),
357  XmlParam("regular_polygon", "bool", False),
358  ]
359 
360 
361 class LineCap(enum.Enum):
362  Rounded = 1
363  Squared = 2
364  Peak = 3
365  Flat = 4
366  InnerRounded = 5
367  OffPeak = 6
368 
369 
370 class CuspStyle(enum.Enum):
371  Miter = 0
372  Round = 1
373  Bevel = 2
374 
375 
377  _nodes = [
378  XmlParam("width", "real", 0.1),
379  XmlParam("expand", "real", 0.),
380  XmlParamSif("bline", Bline),
381  ]
382 
383 
385  _layer_type = "outline"
386 
387  _nodes = [
388  XmlParam("sharp_cusps", "bool", True),
389  XmlParam("round_tip[0]", "bool", True),
390  XmlParam("round_tip[1]", "bool", True),
391  XmlParam("homogeneous_width", "bool", True),
392  ]
393 
394  @property
395  def start_tip(self):
396  return LineCap.Rounded if self.round_tip_0 else LineCap.Flat
397 
398  @property
399  def end_tip(self):
400  return LineCap.Rounded if self.round_tip_1 else LineCap.Flat
401 
402  @property
403  def cusp_type(self):
404  return CuspStyle.Miter if self.sharp_cusps else CuspStyle.Round
405 
406 
408  _layer_type = "advanced_outline"
409 
410  _nodes = [
411  XmlParam("start_tip", "integer", LineCap.Rounded, LineCap),
412  XmlParam("end_tip", "integer", LineCap.Rounded, LineCap),
413  XmlParam("cusp_type", "integer", CuspStyle.Miter, CuspStyle),
414  XmlParam("smoothness", "real", 1.),
415  XmlParam("homogeneous", "bool", False),
416  # TODO wplist
417  ]
418 
419 
421  _layer_type = "polygon"
422 
423  _nodes = [
424  XmlDynamicListParam("vector_list", "vector", "points"),
425  ]
426 
427 
429  _layer_type = "region"
430 
431  _nodes = [
432  XmlParamSif("bline", Bline),
433  ]
434 
435 
436 class FontStyle(enum.Enum):
437  Normal = 0
438  Oblique = 1
439  Italic = 2
440 
441 
443  _layer_type = "text"
444 
445  _nodes = [
446  XmlParam("text", "string"),
447  XmlParam("color", "color", NVector(0, 0, 0, 1)),
448  XmlParam("family", "string"),
449  XmlParam("style", "integer", FontStyle.Normal, FontStyle),
450  XmlParam("weight", "integer", 400),
451  XmlParam("compress", "real", 1.),
452  XmlParam("vcompress", "real", 1.),
453  XmlParam("size", "vector", NVector(1, 1)),
454  XmlParam("orient", "vector", NVector(.5, .5)),
455  XmlParam("origin", "vector", NVector(0, 0)),
456  XmlParam("use_kerning", "bool", False),
457  XmlParam("grid_fit", "bool", False),
458  XmlParam("invert", "bool", False),
459  ]
460 
461 
463  pass
464 
465 
466 class TranslateLayer(TransformDown):
467  _layer_type = "translate"
468 
469  _nodes = [
470  XmlParam("origin", "vector", NVector(0, 0)),
471  ]
472 
473 
475  _layer_type = "rotate"
476 
477  _nodes = [
478  XmlParam("origin", "vector", NVector(0, 0)),
479  XmlParam("amount", "angle", 0.),
480  ]
481 
482 
484  _layer_type = "zoom"
485 
486  _nodes = [
487  XmlParam("center", "vector", NVector(0, 0)),
488  XmlParam("amount", "real", 0.),
489  ]
490 
491 
493  _nodes = [
494  XmlParam("gradient", "gradient", []),
495  XmlParam("loop", "bool", False),
496  XmlParam("zigzag", "bool", False),
497  ]
498 
499 
501  _layer_type = "radial_gradient"
502 
503  _nodes = [
504  XmlParam("center", "vector", NVector(0, 0)),
505  XmlParam("radius", "real", 1),
506  ]
507 
508 
510  _layer_type = "linear_gradient"
511 
512  _nodes = [
513  XmlParam("p1", "vector", NVector(0, 0)),
514  XmlParam("p2", "vector", NVector(0, 0)),
515  ]
516 
517 
519  _layer_type = "conical_gradient"
520 
521  _nodes = [
522  XmlParam("gradient", "gradient", []),
523  XmlParam("symmetric", "bool", False),
524  XmlParam("center", "vector", NVector(0, 0)),
525  XmlParam("angle", "angle", 0.),
526  ]
527 
528 
530  _layer_type = "curve_gradient"
531 
532  _nodes = [
533  XmlParam("origin", "vector", NVector(0, 0)),
534  XmlParam("width", "real", 0.0833333358),
535  XmlParamSif("bline", Bline),
536  XmlParam("perpendicular", "bool", False),
537  XmlParam("fast", "bool", True),
538  ]
539 
540 
542  _layer_type = "noise"
543 
544  _nodes = [
545  XmlParam("gradient", "gradient", []),
546  XmlParam("seed", "integer", 0),
547  XmlParam("size", "vector", NVector(1, 1)),
548  XmlParam("smooth", "integer", Smooth.Cosine, Smooth),
549  XmlParam("detail", "integer", 4),
550  XmlParam("speed", "integer", 0.),
551  XmlParam("turbulent", "bool", False),
552  XmlParam("do_alpha", "bool", False),
553  XmlParam("super_sample", "bool", False),
554  ]
555 
556 
558  _layer_type = "spiral_gradient"
559 
560  _nodes = [
561  XmlParam("gradient", "gradient", []),
562  XmlParam("center", "vector", NVector(0, 0)),
563  XmlParam("radius", "real", 0.5),
564  XmlParam("angle", "real", 0),
565  XmlParam("clockwise", "bool", False),
566  ]
567 
568 
570  _tag = "bone_root"
571 
572  _nodes = [
573  XmlFixedAttribute("type", "bone_object"),
574  XmlAttribute("guid", str)
575  ]
576 
577  @classmethod
578  def from_dom(cls, xml: minidom.Element, registry: ObjectRegistry):
579  if xml.tagName == "bone_root":
580  val = SifNode.static_from_dom(BoneRoot, xml, registry)
581  else:
582  val = SifNode.static_from_dom(Bone, xml, registry)
583  registry.register(val)
584  return val
585 
586  def __repr__(self):
587  return "<%s %r>" % (self.__class__.__name__, self.guid)
588 
589 
590 class Bone(BoneRoot):
591  _tag = "bone"
592 
593  _nodes = [
594  XmlWrapper("name", XmlSimpleElement("string", att_name="name")),
595  XmlBoneReference("parent"),
596  XmlAnimatable("origin", "vector", NVector(0, 0)),
597  XmlAnimatable("angle", "angle", 0.),
598  XmlAnimatable("scalelx", "real", 1.),
599  XmlAnimatable("width", "real", .1),
600  XmlAnimatable("scalex", "real", 1.),
601  XmlAnimatable("tipwidth", "real", .1),
602  XmlAnimatable("bone_depth", "real", 0.),
603  XmlAnimatable("length", "real", 1.),
604  ]
605 
606 
608  _tag = "bone_link"
609 
610  _nodes = [
611  XmlBoneReference("bone"),
612  XmlSifElement("base_value", SifTransform),
613  XmlAnimatable("translate", "bool", True),
614  XmlAnimatable("rotate", "bool", True),
615  XmlAnimatable("skew", "bool", True),
616  XmlAnimatable("scale_x", "bool", True),
617  XmlAnimatable("scale_y", "bool", True),
618  ]
619 
620 
622  _layer_type = "skeleton"
623 
624  _nodes = [
625  XmlParam("z_depth", "real", 0.),
626  XmlParam("amount", "real", 1.),
627  XmlParam("name", "string"),
628  XmlStaticListParam("bones", "bone_object")
629  ]
630 
631 
632 class SubsamplingType(enum.Enum):
633  Constant = 0
634  Linear = 1
635  Hyperbolic = 2
636 
637 
639  _layer_type = "MotionBlur"
640 
641  _nodes = [
642  XmlParam("aperture", "time", FrameTime(1, FrameTime.Unit.Seconds)),
643  XmlParam("subsamples_factor", "real", 1.),
644  XmlParam("subsampling_type", "integer", SubsamplingType.Hyperbolic, SubsamplingType),
645  XmlParam("subsample_start", "real", 0.),
646  XmlParam("subsample_end", "real", 1.),
647  ]
648 
649 
651  _layer_type = "blur"
652 
653  _nodes = [
654  XmlParam("size", "vector", NVector(1, 1)),
655  XmlParam("type", "integer", BlurType.FastGaussian, BlurType),
656  ]
657 
658 
660  _layer_type = "radial_blur"
661 
662  _nodes = [
663  XmlParam("origin", "vector", NVector(0, 0)),
664  XmlParam("size", "real", .2),
665  XmlParam("fade_out", "bool", False),
666  ]
667 
668 
670  _layer_type = "curve_warp"
671 
672  _nodes = [
673  XmlParam("origin", "vector", NVector(0, 0)),
674  XmlParam("perp_width", "real", 1.),
675  XmlParam("start_point", "vector", NVector(0, 0)),
676  XmlParam("end_point", "vector", NVector(0, 0)),
677  XmlParamSif("bline", Bline),
678  XmlParam("fast", "bool", True),
679  ]
680 
681 
683  _layer_type = "inside_out"
684 
685  _nodes = [
686  XmlParam("origin", "vector", NVector(0, 0)),
687  ]
688 
689 
691  _layer_type = "noise_distort"
692 
693  _nodes = [
694  XmlParam("displacement", "vector", NVector(0.25, 0.25)),
695  XmlParam("size", "vector", NVector(1, 1)),
696  XmlParam("seed", "integer", 0),
697  XmlParam("smooth", "integer", Smooth.Cosine, Smooth),
698  XmlParam("detail", "integer", 4),
699  XmlParam("speed", "real", 0.),
700  XmlParam("turbulent", "bool", False),
701  ]
702 
703 
705  _layer_type = "skeleton_deformation"
706 
707  _nodes = [
708  XmlParam("displacement", "vector", NVector(0.25, 0.25)),
709  XmlParam("point1", "vector", NVector(0, 0)),
710  XmlParam("point2", "vector", NVector(0, 0)),
711  XmlParam("x_subdivisions", "integer", 32),
712  XmlParam("y_subdivisions", "integer", 32),
713  # TODO bones (pair_bone_object_bone_object)
714  ]
715 
716 
717 class DistortType(enum.Enum):
718  Spherize = 0
719  VerticalBar = 1
720  HorizontalBar = 2
721 
722 
724  _layer_type = "spherize"
725 
726  _nodes = [
727  XmlParam("center", "vector", NVector(0., 0.)),
728  XmlParam("radius", "real", 1.),
729  XmlParam("amount", "real", 1.),
730  XmlParam("clip", "bool", False),
731  XmlParam("type", "integer", DistortType.Spherize, DistortType),
732  ]
733 
734 
736  _layer_type = "stretch"
737 
738  _nodes = [
739  XmlParam("amount", "vector", NVector(1., 1.)),
740  XmlParam("center", "vector", NVector(0., 0.)),
741  ]
742 
743 
745  _layer_type = "twirl"
746 
747  _nodes = [
748  XmlParam("center", "vector", NVector(0., 0.)),
749  XmlParam("radius", "real", 1.),
750  XmlParam("rotations", "real", 0.),
751  XmlParam("distort_inside", "bool", True),
752  XmlParam("distort_outside", "bool", False),
753  ]
754 
755 
757  _layer_type = "warp"
758 
759  _nodes = [
760  XmlParam("src_tl", "vector", NVector(0., 0.)),
761  XmlParam("src_br", "vector", NVector(0., 0.)),
762  XmlParam("dest_tl", "vector", NVector(0., 0.)),
763  XmlParam("dest_tr", "vector", NVector(0., 0.)),
764  XmlParam("dest_bl", "vector", NVector(0., 0.)),
765  XmlParam("dest_br", "vector", NVector(0., 0.)),
766  XmlParam("clip", "bool", True),
767  XmlParam("interpolation", "integer", Smooth.Cubic, Smooth),
768  ]
769 
770 
772  _layer_type = "metaballs"
773 
774  _nodes = [
775  XmlParam("gradient", "gradient", []),
776  XmlDynamicListParam("centers", "vector"),
777  XmlDynamicListParam("radii", "real"),
778  XmlDynamicListParam("weights", "real"),
779  XmlParam("threshold", "real", 0.),
780  XmlParam("threshold1", "real", 1.),
781  XmlParam("positive", "bool", False),
782  ]
783 
784 
786  _layer_type = "clamp"
787 
788  _nodes = [
789  XmlParam("invert_negative", "bool", False),
790  XmlParam("clamp_ceiling", "bool", False),
791  XmlParam("ceiling", "real", 1.),
792  XmlParam("floor", "real", 0.),
793  ]
794 
795 
797  _layer_type = "colorcorrect"
798 
799  _nodes = [
800  XmlParam("hue_adjust", "angle", 0.),
801  XmlParam("brightness", "real", 0.),
802  XmlParam("contrast", "real", 1.),
803  XmlParam("exposure", "real", 0.),
804  XmlParam("gamma", "real", 1.),
805  ]
806 
807 
808 class HalftoneType(enum.Enum):
809  Symmetric = 0
810  LightOnDark = 2
811  Diamond = 3
812  Stripe = 4
813 
814 
816  _layer_type = "halftone2"
817 
818  _nodes = [
819  XmlParam("origin", "vector", NVector(0, 0)),
820  XmlParam("angle", "angle", 0.),
821  XmlParam("size", "vector", NVector(0.25, 0.25)),
822  XmlParam("color_light", "color", NVector(1, 1, 1, 1)),
823  XmlParam("color_dark", "color", NVector(0, 0, 0, 1)),
824  XmlParam("type", "integer", HalftoneType.Symmetric, HalftoneType),
825  ]
826 
827 
829  _layer_type = "halftone3"
830 
831  _nodes = [
832  XmlParam("origin", "vector", NVector(0, 0)),
833  XmlParam("size", "vector", NVector(0.25, 0.25)),
834  XmlParam("type", "integer", HalftoneType.Symmetric, HalftoneType),
835  XmlParam("subtractive", "bool", True),
836 
837  XmlParam("color[0]", "color", NVector(0, 1, 1, 1)),
838  XmlParam("tone[0].origin", "vector", NVector(0, 0)),
839  XmlParam("tone[0].angle", "angle", 0.),
840 
841  XmlParam("color[1]", "color", NVector(1, 0, 1, 1)),
842  XmlParam("tone[1].origin", "vector", NVector(0, 0)),
843  XmlParam("tone[1].angle", "angle", 30.),
844 
845  XmlParam("color[2]", "color", NVector(1, 1, 0, 1)),
846  XmlParam("tone[2].origin", "vector", NVector(0, 0)),
847  XmlParam("tone[2].angle", "angle", 60.),
848  ]
849 
850 
852  _layer_type = "lumakey"
853 
854  _nodes = [
855  ]
856 
857 
859  _layer_type = "julia"
860 
861  _nodes = [
862  XmlParam("icolor", "color", NVector(0, 0, 0, 1)),
863  XmlParam("ocolor", "color", NVector(0, 0, 0, 1)),
864  XmlParam("color_shift", "real", 0.),
865  XmlParam("iterations", "integer", 32),
866  XmlParam("seed", "vector", NVector(0, 0)),
867  XmlParam("bailout", "real", 2.),
868  XmlParam("distort_inside", "bool", True),
869  XmlParam("shade_inside", "bool", True),
870  XmlParam("solid_inside", "bool", False),
871  XmlParam("invert_inside", "bool", False),
872  XmlParam("color_inside", "bool", True),
873  XmlParam("distort_outside", "bool", True),
874  XmlParam("shade_outside", "bool", True),
875  XmlParam("solid_outside", "bool", False),
876  XmlParam("invert_outside", "bool", False),
877  XmlParam("color_outside", "bool", False),
878  XmlParam("color_cycle", "bool", False),
879  XmlParam("smooth_outside", "bool", True),
880  XmlParam("broken", "bool", False),
881  ]
882 
883 
885  _layer_type = "mandelbrot"
886 
887  _nodes = [
888  XmlParam("iterations", "integer", 32),
889  XmlParam("bailout", "real", 2.),
890  XmlParam("broken", "bool", False),
891  XmlParam("distort_inside", "bool", True),
892  XmlParam("shade_inside", "bool", True),
893  XmlParam("solid_inside", "bool", False),
894  XmlParam("invert_inside", "bool", False),
895  XmlParam("distort_outside", "bool", True),
896  XmlParam("shade_outside", "bool", True),
897  XmlParam("solid_outside", "bool", False),
898  XmlParam("invert_outside", "bool", False),
899  XmlParam("smooth_outside", "bool", True),
900 
901  XmlParam("gradient_inside", "gradient", []),
902  XmlParam("gradient_offset_inside", "real", 0.),
903  XmlParam("gradient_loop_inside", "bool", True),
904 
905  XmlParam("gradient_outside", "gradient", []),
906  XmlParam("gradient_offset_outside", "real", 0.),
907  XmlParam("gradient_loop_outside", "bool", True),
908  XmlParam("gradient_scale_outside", "real", 1.),
909  ]
910 
911 
913  _layer_type = "checker_board"
914 
915  _nodes = [
916  XmlParam("color", "color", NVector(0, 0, 0, 1)),
917  XmlParam("origin", "vector", NVector(0, 0)),
918  XmlParam("size", "vector", NVector(0.25, 0.25)),
919  XmlParam("antialias", "bool", True),
920  ]
921 
922 
924  _layer_type = "SolidColor"
925 
926  _nodes = [
927  XmlParam("color", "color", NVector(0, 0, 0, 1)),
928  ]
929 
930 
932  _layer_type = "duplicate"
933 
934  _nodes = [
935  XmlParam("index", "real"),
936  ]
937 
938 
940  _layer_type = "import"
941 
942  _nodes = [
943  XmlParam("tl", "vector", NVector(0, 0)),
944  XmlParam("br", "vector", NVector(0, 0)),
945  XmlParam("c", "integer", Smooth.Linear, Smooth),
946  XmlParam("gamma_adjust", "real", 1.),
947  XmlParam("filename", "string"),
948  XmlParam("time_offset", "time", FrameTime(0, FrameTime.Unit.Frame)),
949  ]
950 
951 
953  _layer_type = "plant"
954 
955  _nodes = [
956  XmlParamSif("bline", Bline),
957  XmlParam("origin", "vector", NVector(0, 0)),
958  XmlParam("gradient", "gradient", []),
959  XmlParam("split_angle", "angle", 10.),
960  XmlParam("gravity", "vector", NVector(0, -.1)),
961  XmlParam("velocity", "real", .3),
962  XmlParam("perp_velocity", "real", 0.),
963  XmlParam("size", "real", 0.015),
964  XmlParam("size_as_alpha", "bool", False),
965  XmlParam("reverse", "bool", True),
966  XmlParam("step", "real", 0.01),
967  XmlParam("seed", "integer", 0),
968  XmlParam("splits", "integer", 5),
969  XmlParam("sprouts", "integer", 5),
970  XmlParam("random_factor", "real", 0.2),
971  XmlParam("drag", "real", 0.1),
972  XmlParam("use_width", "bool", True),
973  ]
974 
975 
977  _layer_type = "sound"
978 
979  _nodes = [
980  XmlParam("z_depth", "real", 0.),
981  XmlParam("filename", "string"),
982  XmlParam("delay", "time", FrameTime(0, FrameTime.Unit.Seconds)),
983  XmlParam("volume", "real", 1.),
984  ]
985 
986 
988  _layer_type = "super_sample"
989 
990  _nodes = [
991  XmlParam("width", "integer", 2),
992  XmlParam("height", "integer", 2),
993  XmlParam("scanline", "bool", False),
994  XmlParam("alpha_aware", "bool", True),
995  ]
996 
997 
999  _layer_type = "xor_pattern"
1000 
1001  _nodes = [
1002  XmlParam("origin", "vecor", NVector(0, 0)),
1003  XmlParam("size", "vecor", NVector(0.25, 0.25)),
1004  ]
1005 
1006 
1008  _layer_type = "bevel"
1009 
1010  _nodes = [
1011  XmlParam("type", "integer", BlurType.FastGaussian, BlurType),
1012  XmlParam("color1", "color", NVector(1, 1, 1, 1)),
1013  XmlParam("color2", "color", NVector(0, 0, 0, 1)),
1014  XmlParam("angle", "angle", 135.),
1015  XmlParam("depth", "real", .2),
1016  XmlParam("softness", "real", .1),
1017  XmlParam("use_luma", "bool", False),
1018  XmlParam("solid", "bool", False),
1019  ]
1020 
1021 
1023  _layer_type = "shade"
1024 
1025  _nodes = [
1026  XmlParam("type", "integer", BlurType.FastGaussian, BlurType),
1027  XmlParam("color", "color", NVector(1, 1, 1, 1)),
1028  XmlParam("origin", "vector", NVector(0, 0)),
1029  XmlParam("size", "vector", NVector(0.1, 0.1)),
1030  XmlParam("invert", "bool", False),
1031  ]
1032 
1033 
1035  _layer_type = "freetime"
1036 
1037  _nodes = [
1038  XmlParam("z_depth", "real", 0.),
1039  XmlParam("time", "time", FrameTime(0, FrameTime.Unit.Seconds)),
1040  ]
1041 
1042 
1044  _layer_type = "stroboscope"
1045 
1046  _nodes = [
1047  XmlParam("z_depth", "real", 0.),
1048  XmlParam("frequency", "real", 2.),
1049  ]
1050 
1051 
1053  _layer_type = "timeloop"
1054 
1055  _nodes = [
1056  XmlParam("z_depth", "real", 0.),
1057  XmlParam("link_time", "time", FrameTime(0, FrameTime.Unit.Seconds), static=True),
1058  XmlParam("local_time", "time", FrameTime(0, FrameTime.Unit.Seconds), static=True),
1059  XmlParam("duration", "time", FrameTime(0, FrameTime.Unit.Seconds), static=True),
1060  XmlParam("only_for_positive_duration", "bool", False, static=True),
1061  XmlParam("symmetrical", "bool", True, static=True),
1062  ]
1063 
1064 
1066  _nodes = [
1067  XmlAttribute("active", bool_str, True),
1068  XmlAttribute("time", FrameTime, FrameTime(0, FrameTime.Unit.Frame)),
1069  ]
1070 
1071 
1072 class Canvas(SifNode, ObjectRegistry):
1073  _nodes = [
1074  XmlAttribute("version"),
1075  XmlAttribute("width", float, 512),
1076  XmlAttribute("height", float, 512),
1077  XmlAttribute("xres", float, 2834.645752),
1078  XmlAttribute("yres", float, 2834.645752),
1079  XmlAttribute("gamma-r", float, 1.),
1080  XmlAttribute("gamma-g", float, 1.),
1081  XmlAttribute("gamma-b", float, 1.),
1082  XmlAttribute("view-box", NVector),
1083  XmlAttribute("antialias", bool, True),
1084  XmlAttribute("fps", float, 60),
1085  XmlAttribute("begin-time", FrameTime, FrameTime(0, FrameTime.Unit.Frame)),
1086  XmlAttribute("end-time", FrameTime, FrameTime(3, FrameTime.Unit.Seconds)),
1087  XmlAttribute("bgcolor", NVector, NVector(0, 0, 0, 0)),
1088  XmlSimpleElement("name"),
1089  XmlMeta("background_first_color", NVector, NVector(0.88, 0.88, 0.88)),
1090  XmlMeta("background_rendering", bool, False),
1091  XmlMeta("background_second_color", NVector, NVector(0.65, 0.65, 0.65)),
1092  XmlMeta("background_size", NVector, NVector(15, 15)),
1093  XmlMeta("grid_color", NVector, NVector(0.62, 0.62, 0.62)),
1094  XmlMeta("grid_show", bool, False),
1095  XmlMeta("grid_size", NVector, NVector(0.25, 0.25)),
1096  XmlMeta("grid_snap", bool, False),
1097  XmlMeta("guide_color", NVector, NVector(0.4, 0.4, 1)),
1098  XmlMeta("guide_show", bool, True),
1099  XmlMeta("guide_snap", bool, False),
1100  XmlMeta("jack_offset", float, 0),
1101  XmlMeta("onion_skin", bool, False),
1102  XmlMeta("onion_skin_future", int, 0),
1103  XmlMeta("onion_skin_past", int, 1),
1104  XmlList(Keyframe),
1105  XmlWrapper("defs", XmlList(Def, "defs", None, Def.tags())),
1106  XmlWrapper("bones", XmlList(BoneRoot, "bones", None, {"bone", "bone_root"})),
1107  XmlList(Layer),
1108  ]
1109 
1110  def __init__(self, **kw):
1111  SifNode.__init__(self, **kw)
1112  ObjectRegistry.__init__(self)
1113 
1114  def to_xml(self):
1115  dom = minidom.Document()
1116  dom.appendChild(self.to_domto_dom(dom))
1117  return dom
1118 
1119  @classmethod
1120  def from_xml_file(cls, xml):
1121  if isinstance(xml, str):
1122  with open(xml, "r") as file:
1123  return cls.from_xmlfrom_xml(minidom.parse(file))
1124  return cls.from_xmlfrom_xml(minidom.parse(xml))
1125 
1126  @classmethod
1127  def from_xml_string(cls, xml):
1128  return cls.from_xmlfrom_xml(minidom.parseString(xml))
1129 
1130  @classmethod
1131  def from_xml(cls, xml: minidom.Document):
1132  obj = cls.from_domfrom_domfrom_dom(xml.documentElement, None)
1133  xml.unlink()
1134  return obj
1135 
1136  @classmethod
1137  def from_dom(cls, xml: minidom.Element, registry: ObjectRegistry = None):
1138  instance = cls()
1139  for node in cls._nodes_nodes:
1140  node.from_xml(instance, xml, instance)
1141  return instance
1142 
1143  def time_to_frames(self, time: FrameTime):
1144  if time.unit == FrameTime.Unit.Frame:
1145  return time.value
1146  elif time.unit == FrameTime.Unit.Seconds:
1147  return time.value * self.fps
1148 
1149  def add_layer(self, layer: Layer):
1150  self.layers.append(layer)
1151  return layer
1152 
1153  def make_color(self, r, g, b, a=1):
1154  """
1155  Applies Gamma to the rgb values
1156  """
1157  return NVector(
1158  r ** self.gamma_r,
1159  g ** self.gamma_g,
1160  b ** self.gamma_b,
1161  a
1162  )
1163 
1164 
1166  _nodes = [
1167  XmlAnimatable("p1", "vector"),
1168  XmlAnimatable("t1", "vector"),
1169  XmlAnimatable("p2", "vector"),
1170  XmlAnimatable("t2", "vector")
1171  ]
1172 
1173 
1175  _tag = "weighted_vector"
1176 
1177  _nodes = [
1178  XmlAnimatable("weight", "real", 1.),
1179  XmlAnimatable("value", "vector"),
1180  ]
def from_dom(cls, minidom.Element xml, ObjectRegistry registry)
Definition: nodes.py:44
def from_dom(cls, minidom.Element xml, ObjectRegistry registry)
Definition: nodes.py:578
def add_layer(self, Layer layer)
Definition: nodes.py:1149
def from_dom(cls, minidom.Element xml, ObjectRegistry registry=None)
Definition: nodes.py:1137
def time_to_frames(self, FrameTime time)
Definition: nodes.py:1143
def from_xml(cls, minidom.Document xml)
Definition: nodes.py:1131
def make_color(self, r, g, b, a=1)
Definition: nodes.py:1153
def from_dom(cls, minidom.Element xml, ObjectRegistry registry)
Definition: nodes.py:135
def to_dom(self, minidom.Document dom)
Definition: nodes.py:188
def __init__(self, id, value, typename)
Definition: nodes.py:183
def add_layer(self, Layer layer)
Definition: nodes.py:266
def from_dom(cls, minidom.Element xml, ObjectRegistry registry)
Definition: nodes.py:223
def to_dom(self, minidom.Document dom)
Definition: nodes.py:216
def static_from_dom(cls, minidom.Element xml, ObjectRegistry registry)
Definition: nodes.py:21
def from_dom(cls, minidom.Element xml, ObjectRegistry registry)
Definition: nodes.py:28
def __setattr__(self, name, value)
Definition: nodes.py:15
def to_dom(self, minidom.Document dom)
Definition: nodes.py:31