]> git.sesse.net Git - kdenlive/commitdiff
Update mechanism for effects.
authorTill Theato <root@ttill.de>
Tue, 6 Sep 2011 21:15:48 +0000 (21:15 +0000)
committerTill Theato <root@ttill.de>
Tue, 6 Sep 2011 21:15:48 +0000 (21:15 +0000)
A js file can contain an update function modifing a filter to work with the installed version of frei0r.
Additionally updated frei0r_levels.xml to also work with version 0.2 of the filter and added an update file.
TODO: test, document add update files for more filters.

svn path=/trunk/kdenlive/; revision=5858

effects/CMakeLists.txt
effects/frei0r_balanc0r.xml
effects/frei0r_levels.xml
effects/update/CMakeLists.txt [new file with mode: 0644]
effects/update/frei0r_levels.js [new file with mode: 0644]
src/documentvalidator.cpp
src/documentvalidator.h

index 0a95eb793640eed6b9a2f15616a3b62649ca7aa4..0c7cd3ef3f07d94087d3483f0c11a3870efef87e 100644 (file)
@@ -106,3 +106,5 @@ audiopan.xml
 rotoscoping.xml
 
 DESTINATION ${DATA_INSTALL_DIR}/kdenlive/effects)
+
+add_subdirectory(update)
index 54f8b42f7f9271337aae1632ad5af5d16efb5799..37b45976c27fc4f99c1c9672807bcd25267101bd 100644 (file)
@@ -11,7 +11,7 @@
                <name>Green Tint</name>
        </parameter>
     </effect>
-    <effect tag="frei0r.balanc0r" id="frei0r.balanc0r" version="0.3">
+    <effect LC_NUMERIC="C" tag="frei0r.balanc0r" id="frei0r.balanc0r" version="0.3">
        <name>White Balance</name>
        <description>Adjust the white balance / color temperature</description>
        <author>Dan Dennedy</author>
index 2c80efc844940bb37af09306d623220400691dca..bb4c14bd911850bffb455e1075aea6b70b1255f6 100644 (file)
@@ -1,8 +1,10 @@
 <!DOCTYPE kpartgui>
-<effect tag="frei0r.levels" id="frei0r.levels">
+<group>
+    <effect tag="frei0r.levels" id="frei0r.levels">
        <name>Levels</name>
        <description>Adjust levels</description>
        <author>Maksim Golovkin</author>
+
         <parameter type="list" name="Channel" default="3" paramlist="0;1;2;3">
                 <paramlistdisplay>Red,Green,Blue,Luma</paramlistdisplay>
                <name>Channel</name>
                 <paramlistdisplay>Top Left,Top Right,Bottom Left,Bottom Right</paramlistdisplay>
                <name>Histogram position</name>
        </parameter>
-</effect>
+    </effect>
+    <effect LC_NUMERIC="C" tag="frei0r.levels" id="frei0r.levels" version="0.2">
+        <name>Levels</name>
+        <description>Adjust levels</description>
+        <author>Maksim Golovkin</author>
+
+        <parameter type="list" name="Channel" default="0.3" paramlist="0;0.1;0.2;0.3">
+                <paramlistdisplay>Red,Green,Blue,Luma</paramlistdisplay>
+                <name>Channel</name>
+        </parameter>
+        <parameter type="simplekeyframe" name="Input black level" default="0" min="0" max="1000" factor="1000">
+                <name>Input black level</name>
+        </parameter>
+        <parameter type="simplekeyframe" name="Input white level" default="1000" min="0" max="1000" factor="1000">
+                <name>Input white level</name>
+        </parameter>
+        <parameter type="simplekeyframe" name="Gamma" default="1000" min="10" max="4000" factor="4000">
+                <name>Gamma</name>
+        </parameter>
+        <parameter type="simplekeyframe" name="Black output" default="0" min="0" max="1000" factor="1000">
+                <name>Black output</name>
+        </parameter>
+        <parameter type="simplekeyframe" name="White output" default="1000" min="0" max="1000" factor="1000">
+                <name>White output</name>
+        </parameter>
+        <parameter type="bool" name="Show histogram" default="0">
+                <name>Show histogram</name>
+        </parameter>
+        <parameter type="list" name="Histogram position" default="0.3" paramlist="0;0.1;0.2;0.3">
+                <paramlistdisplay>Top Left,Top Right,Bottom Left,Bottom Right</paramlistdisplay>
+                <name>Histogram position</name>
+        </parameter>
+    </effect>
+</group>
diff --git a/effects/update/CMakeLists.txt b/effects/update/CMakeLists.txt
new file mode 100644 (file)
index 0000000..67af811
--- /dev/null
@@ -0,0 +1,4 @@
+INSTALL(FILES
+
+frei0r_levels.js
+DESTINATION ${DATA_INSTALL_DIR}/kdenlive/effects/update)
diff --git a/effects/update/frei0r_levels.js b/effects/update/frei0r_levels.js
new file mode 100644 (file)
index 0000000..279ae2f
--- /dev/null
@@ -0,0 +1,23 @@
+
+function update(serviceVersion, effectVersion, effectString) {
+    var locale = new QLocale();
+    var doc = new QDomDocument();
+    doc.setContent(effectString);
+    for (var node = doc.documentElement().firstChild(); !node.isNull(); node = node.nextSibling()) {
+        var effectparam = node.toElement();
+        if (effectparam.attribute("name") == "Channel" || effectparam.attribute("name") == "Histogram position") {
+            if (serviceVersion < effectVersion) {
+                // downgrade
+                if (effectVersion > 0.1) {
+                    effectparam.firstChild().toText().setData(locale.toString(effectparam.text() * 10));
+                }
+            } else {
+                // upgrade
+                if (effectVersion < 0.2) { 
+                    effectparam.firstChild().toText().setData(locale.toString(effectparam.text() / 10.));
+                }
+            }
+        }
+    }
+    return doc.toString();
+}
index d13fd99eec742d9db2416b5dc6e5129b93baad34..ce1c83ab03e8e72c990c7e54488a890b8dc4f99e 100644 (file)
 #include "documentvalidator.h"
 #include "definitions.h"
 #include "initeffects.h"
+#include "mainwindow.h"
 
 #include <KDebug>
 #include <KMessageBox>
 #include <KApplication>
 #include <KLocale>
+#include <KUrl>
+#include <KStandardDirs>
 
 #include <QFile>
 #include <QColor>
 #include <QString>
+#include <QDir>
+#include <QScriptEngine>
 
 #include <mlt++/Mlt.h>
 
@@ -178,6 +183,8 @@ bool DocumentValidator::validate(const double currentVersion)
         
     }
 
+    updateEffects();
+
     return true;
 }
 
@@ -1021,3 +1028,75 @@ bool DocumentValidator::isModified() const
 {
     return m_modified;
 }
+
+void DocumentValidator::updateEffects()
+{
+    // WARNING: order by findDirs will determine which js file to use (in case multiple for the same filter exist)
+    QMap <QString, KUrl> paths;
+    QMap <QString, QScriptProgram> scripts;
+    QStringList directories = KGlobal::dirs()->findDirs("appdata", "effects/update");
+    foreach (const QString &directoryName, directories) {
+        QDir directory(directoryName);
+        QStringList fileList = directory.entryList(QStringList() << "*.js", QDir::Files);
+        foreach (const QString &fileName, fileList) {
+            QString identifier = fileName;
+            identifier.chop(3);
+            identifier.replace('_', '.');
+            paths.insert(identifier, KUrl(directoryName + fileName));
+        }
+    }
+
+    QDomNodeList effects = m_doc.elementsByTagName("filter");
+
+    for(int i = 0; i < effects.count(); ++i) {
+        QDomElement effect = effects.at(i).toElement();
+        QString effectId = EffectsList::property(effect, "kdenlive_id");
+        QString effectTag = EffectsList::property(effect, "tag");
+        QString effectVersionStr = EffectsList::property(effect, "version");
+        double effectVersion = effectVersionStr.isNull() ? -1 : effectVersionStr.toDouble();
+
+        QDomElement effectDescr = MainWindow::customEffects.getEffectByTag(QString(), effectId);
+        if (effectDescr.isNull()) {
+            effectDescr = MainWindow::videoEffects.getEffectByTag(effectTag, effectId);
+        }
+        if (effectDescr.isNull()) {
+            effectDescr = MainWindow::audioEffects.getEffectByTag(effectTag, effectId);
+        }
+        if (!effectDescr.isNull()) {
+            double serviceVersion = -1;
+            QDomElement serviceVersionElem = effectDescr.firstChildElement("version");
+            if (!serviceVersionElem.isNull()) {
+                serviceVersion = serviceVersionElem.text().toDouble();
+            }
+            if (serviceVersion != effectVersion && paths.contains(effectId)) {
+                if (!scripts.contains(effectId)) {
+                    QFile scriptFile(paths.value(effectId).path());
+                    if (!scriptFile.open(QIODevice::ReadOnly)) {
+                        continue;
+                    }
+                    QScriptProgram scriptProgram(scriptFile.readAll());
+                    scriptFile.close();
+                    scripts.insert(effectId, scriptProgram);
+                }
+
+                QDomDocument scriptDoc;
+                scriptDoc.appendChild(scriptDoc.importNode(effect, true));
+
+                QScriptEngine scriptEngine;
+                scriptEngine.importExtension("qt.core");
+                scriptEngine.importExtension("qt.xml");
+                scriptEngine.evaluate(scripts.value(effectId));
+                QString effectString = scriptEngine.globalObject().property("update").call(QScriptValue(), QScriptValueList()  << serviceVersion << effectVersion << scriptDoc.toString()).toString();
+
+                if (!effectString.isEmpty()) {
+                    scriptDoc.setContent(effectString);
+                    QDomNode updatedEffect = effect.ownerDocument().importNode(scriptDoc.documentElement(), true);
+                    effect.parentNode().replaceChild(updatedEffect, effect);
+                    // TODO: set version to avoid dependency on latest MLT
+                    m_modified = true;
+                }
+            }
+        }
+    }
+}
+
index a4427b7f9040d418a91ba5b15e39bb2048976a68..dd15c1e35a547b5679e54e4bffddf5d75bf03d4e 100644 (file)
@@ -39,6 +39,7 @@ private:
     bool upgrade(double version, const double currentVersion);
     QStringList getInfoFromEffectName(const QString oldName);
     QString colorToString(const QColor& c);
+    void updateEffects();
 };
 
 #endif