from .base import LottieObject, LottieProp, PseudoBool from .properties import Value, MultiDimensional, ColorValue from .nvector import NVector from .color import Color #5: EffectsManager, #11: MaskEffect, class EffectValue(LottieObject): """! Value for an effect """ ## %Effect value type. type = None _classses = {} _props = [ LottieProp("effect_index", "ix", int, False), #LottieProp("match_name", "mn", str, False), LottieProp("name", "nm", str, False), LottieProp("type", "ty", int, False), ] def __init__(self): ## Effect Index. Used for expressions. self.effect_index = None ## After Effect's Name. Used for expressions. self.name = None """ ## After Effect's Match Name. Used for expressions. self.match_name = "" """ @classmethod def _load_get_class(cls, lottiedict): if not EffectValue._classses: EffectValue._classses = { sc.type: sc for sc in EffectValue.__subclasses__() } return EffectValue._classses[lottiedict["ty"]] def __str__(self): return self.name or super().__str__() ## @ingroup Lottie class Effect(LottieObject): """! Layer effect """ ## %Effect type. type = None _classses = {} _props = [ LottieProp("effect_index", "ix", int, False), #LottieProp("match_name", "mn", str, False), LottieProp("name", "nm", str, False), LottieProp("type", "ty", int, False), LottieProp("effects", "ef", EffectValue, True), ] _effects = [] def __init__(self, *args, **kwargs): ## Effect Index. Used for expressions. self.effect_index = None ## After Effect's Name. Used for expressions. self.name = None ## Effect parameters self.effects = self._load_values(*args, **kwargs) """ ## After Effect's Match Name. Used for expressions. self.match_name = "" """ @classmethod def _load_get_class(cls, lottiedict): if not Effect._classses: Effect._classses = { sc.type: sc for sc in Effect.__subclasses__() } type = lottiedict["ty"] if type in Effect._classses: return Effect._classses[type] else: return Effect def _load_values(self, *args, **kwargs): values = [] for i, (name, type) in enumerate(self._effects): val = [] if len(args) > i: val = [args[i]] if name in kwargs: val = [kwargs[name]] values.append(type(*val)) return values def __getattr__(self, key): for i, (name, type) in enumerate(self._effects): if name == key: return self.effects[i].value return super().__getattr__(key) def __str__(self): return self.name or super().__str__() ## @ingroup Lottie ## @ingroup LottieCheck class EffectNoValue(EffectValue): _props = [] ## @ingroup Lottie class EffectValueSlider(EffectValue): _props = [ LottieProp("value", "v", Value, False), ] ## %Effect type. type = 0 def __init__(self, value=0): EffectValue.__init__(self) ## Effect value. self.value = Value(value) ## @ingroup Lottie class EffectValueAngle(EffectValue): _props = [ LottieProp("value", "v", Value, False), ] ## %Effect type. type = 1 def __init__(self, angle=0): EffectValue.__init__(self) ## Effect value. self.value = Value(angle) ## @ingroup Lottie class EffectValueColor(EffectValue): _props = [ LottieProp("value", "v", ColorValue, False), ] ## %Effect type. type = 2 def __init__(self, value=Color(0, 0, 0)): EffectValue.__init__(self) ## Effect value. self.value = ColorValue(value) ## @ingroup Lottie class EffectValuePoint(EffectValue): _props = [ LottieProp("value", "v", MultiDimensional, False), ] ## %Effect type. type = 3 def __init__(self, value=NVector(0, 0)): EffectValue.__init__(self) ## Effect value. self.value = MultiDimensional(value) ## @ingroup Lottie class EffectValueCheckbox(EffectValue): _props = [ LottieProp("value", "v", Value, False), ] ## %Effect type. type = 4 def __init__(self, value=0): EffectValue.__init__(self) ## Effect value. self.value = Value(value) ## @ingroup Lottie ## @ingroup LottieCheck ## Lottie-web ignores these class IgnoredValue(EffectValue): _props = [ LottieProp("value", "v", float, False), ] ## %Effect type. type = 6 def __init__(self, value=0): EffectValue.__init__(self) ## Effect value. self.value = value ## @ingroup Lottie ## @ingroup LottieCheck class EffectValueDropDown(EffectValue): _props = [ LottieProp("value", "v", Value, False), ] ## %Effect type. type = 7 def __init__(self, value=0): EffectValue.__init__(self) ## Effect value. self.value = Value(value) ## @ingroup Lottie ## @ingroup LottieCheck class EffectValueLayer(EffectValue): _props = [ LottieProp("value", "v", Value, False), ] ## %Effect type. type = 10 def __init__(self): EffectValue.__init__(self) ## Effect value. self.value = Value() ## @ingroup Lottie class FillEffect(Effect): """! Replaces the whole layer with the given color @note Opacity is in [0, 1] """ _effects = [ ("00", EffectValuePoint), ("01", EffectValueDropDown), ("color", EffectValueColor), ("03", EffectValueDropDown), ("04", EffectValueSlider), ("05", EffectValueSlider), ("opacity", EffectValueSlider), ] ## %Effect type. type = 21 ## @ingroup Lottie class StrokeEffect(Effect): _effects = [ ("00", EffectValueColor), ("01", EffectValueCheckbox), ("02", EffectValueCheckbox), ("color", EffectValueColor), ("04", EffectValueSlider), ("05", EffectValueSlider), ("06", EffectValueSlider), ("07", EffectValueSlider), ("08", EffectValueSlider), ("09", EffectValueDropDown), ("type", EffectValueDropDown), ] ## %Effect type. type = 22 ## @ingroup Lottie class TritoneEffect(Effect): """! Maps layers colors based on bright/mid/dark colors """ _effects = [ ("bright", EffectValueColor), ("mid", EffectValueColor), ("dark", EffectValueColor), ] ## %Effect type. type = 23 """ ## @ingroup Lottie ## @ingroup LottieCheck class GroupEffect(Effect): _props = [ LottieProp("enabled", "en", PseudoBool, False), ] def __init__(self): Effect.__init__(self) ## Enabled AE property value self.enabled = True """ ## @ingroup Lottie ## @ingroup LottieCheck class ProLevelsEffect(Effect): _effects = [ ("00", EffectValueDropDown), ("01", EffectNoValue), ("02", EffectNoValue), ("comp_inblack", EffectValueSlider), ("comp_inwhite", EffectValueSlider), ("comp_gamma", EffectValueSlider), ("comp_outblack", EffectValueSlider), ("comp_outwhite", EffectNoValue), ("08", EffectNoValue), ("09", EffectValueSlider), ("r_inblack", EffectValueSlider), ("r_inwhite", EffectValueSlider), ("r_gamma", EffectValueSlider), ("r_outblack", EffectValueSlider), ("r_outwhite", EffectNoValue), ("15", EffectValueSlider), ("16", EffectValueSlider), ("g_inblack", EffectValueSlider), ("g_inwhite", EffectValueSlider), ("g_gamma", EffectValueSlider), ("g_outblack", EffectValueSlider), ("g_outwhite", EffectNoValue), ("22", EffectValueSlider), ("b3", EffectValueSlider), ("b_inblack", EffectValueSlider), ("b_inwhite", EffectValueSlider), ("b_gamma", EffectValueSlider), ("b_outblack", EffectValueSlider), ("b_outwhite", EffectNoValue), ("29", EffectValueSlider), ("a_inblack", EffectValueSlider), ("a_inwhite", EffectValueSlider), ("a_gamma", EffectValueSlider), ("a_outblack", EffectValueSlider), ("a_outwhite", EffectNoValue), ] ## %Effect type. type = 24 ## @ingroup Lottie class TintEffect(Effect): """! Colorizes the layer @note Opacity is in [0, 100] """ _effects = [ ("color_black", EffectValueColor), ("color_white", EffectValueColor), ("opacity", EffectValueSlider), ] ## %Effect type. type = 20 ## @ingroup Lottie class DropShadowEffect(Effect): """! Adds a shadow to the layer @note Opacity is in [0, 255] """ _effects = [ ("color", EffectValueColor), ("opacity", EffectValueSlider), ("angle", EffectValueAngle), ("distance", EffectValueSlider), ("blur", EffectValueSlider), ] ## %Effect type. type = 25 ## @ingroup Lottie ## @ingroup LottieCheck class Matte3Effect(Effect): _effects = [ ("index", EffectValueSlider), ] ## %Effect type. type = 28 ## @ingroup Lottie class GaussianBlurEffect(Effect): """! Gaussian blur """ _effects = [ ("sigma", EffectValueSlider), ("dimensions", EffectValueSlider), ("wrap", EffectValueCheckbox), ] ## %Effect type. type = 29 #class ChangeColorEffect(Effect): #"""! #Gaussian blur #""" #_effects = [ #("view", EffectValueDropDown), #("hue", EffectValueSlider), #("lightness", EffectValueSlider), #("saturation", EffectValueSlider), #("color_to_change", EffectValueColor), #("tolerance", EffectValueSlider), #("softness", EffectValueSlider), #("match", EffectValueDropDown), #("invert_mask", EffectValueDropDown), #] ### %Effect type. #type = 29 ## @ingroup Lottie class ChangeToColorEffect(Effect): """! Change to color """ _effects = [ ("from_color", EffectValueColor), ("to_color", EffectValueColor), ("change", EffectValueDropDown), ("change_by", EffectValueDropDown), ("tolerance", IgnoredValue), ("hue", EffectValueSlider), ("lightness", EffectValueSlider), ("saturation", EffectValueSlider), ("saturation_", IgnoredValue), ("softness", EffectValueSlider), ("view_correction", EffectValueDropDown), ] ## %Effect type. type = 5