X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fclipitem.cpp;h=561ab7d04166f4bd1f0788adcc779a52b660de1f;hb=00bcfb5fec4b182f2edf81fbb24b23cffc81a513;hp=5f1c6686b87d2894131a81b2f87bc4c3c9dfb659;hpb=f5781e94b3cd01c0169d32f87fb46f2754072de4;p=kdenlive diff --git a/src/clipitem.cpp b/src/clipitem.cpp index 5f1c6686..561ab7d0 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -196,8 +196,10 @@ void ClipItem::setEffectList(const EffectsList effectList) } } } - if (fade > 0) m_startFade = fade; - else if (fade < 0) m_endFade = -fade; + if (fade > 0) + m_startFade = fade; + else if (fade < 0) + m_endFade = -fade; } setSelectedEffect(0); } @@ -316,7 +318,7 @@ bool ClipItem::checkKeyFrames() bool effModified = false; // go through all params which have keyframes - foreach (const QString &kfr, keyframeParams) { + foreach(const QString &kfr, keyframeParams) { const QStringList keyframes = kfr.split(';', QString::SkipEmptyParts); QStringList newKeyFrames; bool cutKeyFrame = false; @@ -1208,7 +1210,7 @@ void ClipItem::resizeEnd(int posx) } -bool ClipItem::checkEffectsKeyframesPos(const int previous, const int current, bool fromStart) +bool ClipItem::checkEffectsKeyframesPos(const int previous, const int current, bool fromStart, int renderWidth, int renderHeight) { bool effModified = false; for (int i = 0; i < m_effectList.count(); i++) { @@ -1217,7 +1219,9 @@ bool ClipItem::checkEffectsKeyframesPos(const int previous, const int current, b for (int j = 0; j < params.count(); j++) { bool modified = false; QDomElement e = params.item(j).toElement(); - if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { + if (e.isNull()) + continue; + if (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe") { // parse keyframes and adjust values const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts); QMap kfr; @@ -1248,6 +1252,16 @@ bool ClipItem::checkEffectsKeyframesPos(const int previous, const int current, b } e.setAttribute("keyframes", newkfr); } + } else if (e.attribute("type") == "geometry" && !e.hasAttribute("fixed")) { + Mlt::Geometry geometry(e.attribute("value").toUtf8().data(), cropDuration().frames(fps()), renderWidth, renderHeight); + + Mlt::GeometryItem item; + while (!geometry.next_key(&item, cropDuration().frames(fps()))) { + geometry.remove(item.frame()); + modified = true; + } + + e.setAttribute("value", geometry.serialise()); } } } @@ -1414,10 +1428,16 @@ EffectsParameterList ClipItem::addEffect(const QDomElement effect, bool /*animat if (effectId.isEmpty()) effectId = effect.attribute("tag"); parameters.addParam("id", effectId); - // special case: the affine effect need in / out points + // special case: the affine effect needs in / out points if (effectId == "pan_zoom") { - parameters.addParam("in", QString::number(cropStart().frames(m_fps))); - parameters.addParam("out", QString::number((cropStart() + cropDuration()).frames(m_fps))); + int start = cropStart().frames(m_fps); + int end = (cropStart() + cropDuration()).frames(m_fps); + if (start < 0) { + end -= start; + start = 0; + } + parameters.addParam("in", QString::number(start)); + parameters.addParam("out", QString::number(end)); } QDomNodeList params = effect.elementsByTagName("parameter"); @@ -1519,73 +1539,6 @@ EffectsParameterList ClipItem::addEffect(const QDomElement effect, bool /*animat return parameters; } -EffectsParameterList ClipItem::getEffectArgs(const QDomElement effect) -{ - EffectsParameterList parameters; - parameters.addParam("tag", effect.attribute("tag")); - if (effect.hasAttribute("region")) parameters.addParam("region", effect.attribute("region")); - parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix")); - parameters.addParam("id", effect.attribute("id")); - if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src")); - if (effect.hasAttribute("disable")) parameters.addParam("disable", effect.attribute("disable")); - if (effect.hasAttribute("in")) parameters.addParam("in", effect.attribute("in")); - if (effect.hasAttribute("out")) parameters.addParam("out", effect.attribute("out")); - - QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - //kDebug() << "/ / / /SENDING EFFECT PARAM: " << e.attribute("type") << ", NAME_ " << e.attribute("tag"); - if (e.attribute("type") == "simplekeyframe") { - - QStringList values = e.attribute("keyframes").split(";", QString::SkipEmptyParts); - double factor = e.attribute("factor", "1").toDouble(); - for (int j = 0; j < values.count(); j++) { - QString pos = values.at(j).section(":", 0, 0); - double val = values.at(j).section(":", 1, 1).toDouble() / factor; - values[j] = pos + "=" + QString::number(val); - } - // kDebug() << "/ / / /SENDING KEYFR:" << values; - parameters.addParam(e.attribute("name"), values.join(";")); - /*parameters.addParam(e.attribute("name"), e.attribute("keyframes").replace(":", "=")); - parameters.addParam("max", e.attribute("max")); - parameters.addParam("min", e.attribute("min")); - parameters.addParam("factor", e.attribute("factor", "1"));*/ - } else if (e.attribute("type") == "keyframe") { - kDebug() << "/ / / /SENDING KEYFR EFFECT TYPE"; - parameters.addParam("keyframes", e.attribute("keyframes")); - parameters.addParam("max", e.attribute("max")); - parameters.addParam("min", e.attribute("min")); - parameters.addParam("factor", e.attribute("factor", "1")); - parameters.addParam("starttag", e.attribute("starttag", "start")); - parameters.addParam("endtag", e.attribute("endtag", "end")); - } else if (e.attribute("namedesc").contains(';')) { - QString format = e.attribute("format"); - QStringList separators = format.split("%d", QString::SkipEmptyParts); - QStringList values = e.attribute("value").split(QRegExp("[,:;x]")); - QString neu; - QTextStream txtNeu(&neu); - if (values.size() > 0) - txtNeu << (int)values[0].toDouble(); - for (int i = 0; i < separators.size() && i + 1 < values.size(); i++) { - txtNeu << separators[i]; - txtNeu << (int)(values[i+1].toDouble()); - } - parameters.addParam("start", neu); - } else { - if (e.attribute("factor", "1") != "1") { - double fact; - if (e.attribute("factor").startsWith('%')) { - fact = ProfilesDialog::getStringEval(projectScene()->profile(), e.attribute("factor")); - } else fact = e.attribute("factor", "1").toDouble(); - parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / fact)); - } else { - parameters.addParam(e.attribute("name"), e.attribute("value")); - } - } - } - return parameters; -} - void ClipItem::deleteEffect(QString index) { bool needRepaint = false;