From: Till Theato Date: Sat, 23 Apr 2011 20:41:06 +0000 (+0000) Subject: rotoscoping: fix keyframe sorting issues after duration change X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=690108f55c63edcc0ac4b2ef5753e109d5713ec8;p=kdenlive rotoscoping: fix keyframe sorting issues after duration change svn path=/trunk/kdenlive/; revision=5548 --- diff --git a/src/rotoscoping/rotowidget.cpp b/src/rotoscoping/rotowidget.cpp index 15ca31e6..9be8dcc7 100644 --- a/src/rotoscoping/rotowidget.cpp +++ b/src/rotoscoping/rotowidget.cpp @@ -357,6 +357,7 @@ bool adjustRotoDuration(QString* data, int in, int out) if (!splines.canConvert(QVariant::Map)) return false; + QMap newMap; QMap map = splines.toMap(); QMap::iterator i = map.end(); int lastPos = -1; @@ -367,14 +368,12 @@ bool adjustRotoDuration(QString* data, int in, int out) */ bool startFound = false; while (i-- != map.begin()) { - if (i.key().toInt() < in) { - if (!startFound) { - startFound = true; - if (lastPos < 0) - map[QString::number(in).rightJustified(log10((double)out) + 1, '0')] = i.value(); - else - map[QString::number(in).rightJustified(log10((double)out) + 1, '0')] = interpolate(in, i.key().toInt(), lastPos, &i.value(), &last); - } + if (!startFound && i.key().toInt() < in) { + startFound = true; + if (lastPos < 0) + newMap[QString::number(in).rightJustified(log10((double)out) + 1, '0')] = i.value(); + else + newMap[QString::number(in).rightJustified(log10((double)out) + 1, '0')] = interpolate(in, i.key().toInt(), lastPos, &i.value(), &last); } lastPos = i.key().toInt(); last = i.value(); @@ -389,14 +388,12 @@ bool adjustRotoDuration(QString* data, int in, int out) lastPos = -1; bool endFound = false; while (i != map.end()) { - if (i.key().toInt() > out) { - if (!endFound) { - endFound = true; - if (lastPos < 0) - map[QString::number(out)] = i.value(); - else - map[QString::number(out)] = interpolate(out, lastPos, i.key().toInt(), &last, &i.value()); - } + if (!endFound && i.key().toInt() > out) { + endFound = true; + if (lastPos < 0) + newMap[QString::number(out)] = i.value(); + else + newMap[QString::number(out)] = interpolate(out, lastPos, i.key().toInt(), &last, &i.value()); } lastPos = i.key().toInt(); last = i.value(); @@ -406,8 +403,17 @@ bool adjustRotoDuration(QString* data, int in, int out) ++i; } + /* + * Update key lengths to prevent sorting issues + */ + i = map.begin(); + while (i != map.end()) { + newMap[i.key().rightJustified(log10((double)out) + 1, '0', true)] = i.value(); + ++i; + } + QJson::Serializer serializer; - *data = QString(serializer.serialize(QVariant(map))); + *data = QString(serializer.serialize(QVariant(newMap))); if (startFound || endFound) return true;