Blob Blame Raw
"""
Stores the functions required for adjusting time factor in the neighbouring
waypoints in Synfig
"""

import sys
sys.path.append("../")


def time_adjust(lottie, animated):
    """
    Adjusts the tangents between neighbouring waypoints depending upon the time
    factor between previous waypoints or next waypoints

    Args:
        lottie   (dict)                : Holds bezier curve in Lottie format
        animated (lxml.etree._Element) : Synfig format animation

    Returns:
        (None)
    """
    timeadjust = 0.5
    for i in range(len(animated) - 1):
        if i == 0:
            continue
        time_span_cur = lottie["k"][i+1]["t"] - lottie["k"][i]["t"]
        time_span_prev = lottie["k"][i]["t"] - lottie["k"][i-1]["t"]
        cur_get_after = animated[i].attrib["after"]
        next_get_before = animated[i+1].attrib["before"]

        # prev              iter
        # ANY/CONSTANT ---- ANY/ANY
        # ANY/ANY      ---- CONSTANT/ANY
        if cur_get_after == "constant" or next_get_before == "constant":
            continue

        if animated.attrib["type"] == "real":
            if cur_get_after != "linear":
                lottie["k"][i]["o"]["x"][0] *= (time_span_cur * (timeadjust + 1)) /\
                        (time_span_cur * timeadjust + time_span_prev)
                lottie["k"][i]["o"]["y"][0] *= (time_span_cur * (timeadjust + 1)) /\
                        (time_span_cur * timeadjust + time_span_prev)
            if next_get_before != "linear":
                if i + 2 <= len(animated) - 1:
                    time_span_next = lottie["k"][i+2]["t"] - lottie["k"][i+1]["t"]
                    lottie["k"][i]["i"]["x"][0] *= (time_span_cur * (timeadjust + 1)) /\
                            (time_span_cur * timeadjust + time_span_next)

        elif animated.attrib["type"] == "vector":

            # prev    --- iter        --- next
            # ANY/ANY --- ANY/!LINEAR --- ANY/ANY
            if cur_get_after != "linear":
                for dim in range(len(lottie["k"][i]["to"])):
                    lottie["k"][i]["to"][dim] = lottie["k"][i]["to"][dim] *\
                    (time_span_cur * (timeadjust + 1)) /\
                    (time_span_cur * timeadjust + time_span_prev)

            # iter    --- next        --- after_next
            # ANY/ANY --- !LINEAR/ANY --- ANY/ANY
            if next_get_before != "linear":
                for dim in range(len(lottie["k"][i]["to"])):
                    if i + 2 <= len(animated) - 1:
                        time_span_next = lottie["k"][i+2]["t"] - lottie["k"][i+1]["t"]
                        lottie["k"][i]["ti"][dim] = lottie["k"][i]["ti"][dim] *\
                        (time_span_cur * (timeadjust + 1)) /\
                        (time_span_cur * timeadjust + time_span_next)