X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Ftitledocument.cpp;h=dc198f2e6d0132820fb4e1a593a5caf4fc5ec906;hb=be563b527d022b673971f83ed35975fc81d5acbd;hp=7d6d269dc97ee5e114cf8cccd95eef81a011179c;hpb=5cd7cd6cf9b549aba64b296e210a3ffc415ea1b8;p=kdenlive diff --git a/src/titledocument.cpp b/src/titledocument.cpp index 7d6d269d..dc198f2e 100644 --- a/src/titledocument.cpp +++ b/src/titledocument.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -30,16 +31,32 @@ #include #include #include +#include +#include #include #include #include +#include + #if QT_VERSION >= 0x040600 #include #include #include #endif +QByteArray fileToByteArray(const QString& filename) +{ + QByteArray ret; + QFile file(filename); + if (file.open(QIODevice::ReadOnly)) { + while (!file.atEnd()) { + ret.append(file.readLine()); + } + } + return ret; +} + TitleDocument::TitleDocument() { m_scene = NULL; @@ -52,16 +69,66 @@ void TitleDocument::setScene(QGraphicsScene* _scene, int width, int height) m_height = height; } -QDomDocument TitleDocument::xml(QGraphicsRectItem* startv, QGraphicsRectItem* endv) +int TitleDocument::base64ToUrl(QGraphicsItem* item, QDomElement& content, bool embed) +{ + if (embed) { + if (!item->data(Qt::UserRole + 1).toString().isEmpty()) { + content.setAttribute("base64", item->data(Qt::UserRole + 1).toString()); + } else if (!item->data(Qt::UserRole).toString().isEmpty()) { + content.setAttribute("base64", fileToByteArray(item->data(Qt::UserRole).toString()).toBase64().data()); + } + content.removeAttribute("url"); + } else { + // save for project files to disk + QString base64 = item->data(Qt::UserRole + 1).toString(); + if (!base64.isEmpty()) { + QString titlePath; + if (!m_projectPath.isEmpty()) { + titlePath = m_projectPath; + } else { + titlePath = "/tmp/titles"; + } + QString filename = extractBase64Image(titlePath, base64); + if (!filename.isEmpty()) { + content.setAttribute("url", filename); + content.removeAttribute("base64"); + } + + } else { + return 1; + } + } + return 0; +} + + +//static +const QString TitleDocument::extractBase64Image(const QString &titlePath, const QString &data) +{ + QString filename = titlePath + QString(QCryptographicHash::hash(data.toAscii(), QCryptographicHash::Md5).toHex().append(".titlepart")); + KStandardDirs::makeDir(titlePath); + QFile f(filename); + if (f.open(QIODevice::WriteOnly)) { + f.write(QByteArray::fromBase64(data.toAscii())) ; + f.close(); + return filename; + } + return QString(); +} + +QDomDocument TitleDocument::xml(QGraphicsRectItem* startv, QGraphicsRectItem* endv, bool embed) { QDomDocument doc; QDomElement main = doc.createElement("kdenlivetitle"); main.setAttribute("width", m_width); main.setAttribute("height", m_height); + // Save locale + const char *locale = setlocale(LC_NUMERIC, NULL); + main.setAttribute("LC_NUMERIC", locale); doc.appendChild(main); - foreach(QGraphicsItem* item, m_scene->items()) { + foreach(QGraphicsItem * item, m_scene->items()) { QDomElement e = doc.createElement("item"); QDomElement content = doc.createElement("content"); QFont font; @@ -71,10 +138,12 @@ QDomDocument TitleDocument::xml(QGraphicsRectItem* startv, QGraphicsRectItem* en case 7: e.setAttribute("type", "QGraphicsPixmapItem"); content.setAttribute("url", item->data(Qt::UserRole).toString()); + base64ToUrl(item, content, embed); break; case 13: e.setAttribute("type", "QGraphicsSvgItem"); content.setAttribute("url", item->data(Qt::UserRole).toString()); + base64ToUrl(item, content, embed); break; case 3: e.setAttribute("type", "QGraphicsRectItem"); @@ -102,7 +171,11 @@ QDomDocument TitleDocument::xml(QGraphicsRectItem* startv, QGraphicsRectItem* en QColor fontcolor = cursor.charFormat().foreground().color(); content.setAttribute("font-color", colorToString(fontcolor)); if (!t->data(101).isNull()) content.setAttribute("font-outline", t->data(101).toDouble()); - if (!t->data(102).isNull()) content.setAttribute("font-outline-color", colorToString(QColor(t->data(102).toString()))); + if (!t->data(102).isNull()) { + QVariant variant = t->data(102); + QColor outlineColor = variant.value(); + content.setAttribute("font-outline-color", colorToString(outlineColor)); + } } if (!t->data(100).isNull()) { QStringList effectParams = t->data(100).toStringList(); @@ -209,12 +282,12 @@ QColor TitleDocument::getBackgroundColor() } -bool TitleDocument::saveDocument(const KUrl& url, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int out) +bool TitleDocument::saveDocument(const KUrl& url, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int out, bool embed) { if (!m_scene) return false; - QDomDocument doc = xml(startv, endv); + QDomDocument doc = xml(startv, endv, embed); doc.documentElement().setAttribute("out", out); KTemporaryFile tmpfile; if (!tmpfile.open()) { @@ -232,8 +305,9 @@ bool TitleDocument::saveDocument(const KUrl& url, QGraphicsRectItem* startv, QGr return KIO::NetAccess::upload(tmpfile.fileName(), url, 0); } -int TitleDocument::loadFromXml(QDomDocument doc, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int *out) +int TitleDocument::loadFromXml(QDomDocument doc, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int *out, const QString& projectpath) { + m_projectPath = projectpath; QDomNodeList titles = doc.elementsByTagName("kdenlivetitle"); //TODO: Check if the opened title size is equal to project size, otherwise warn user and rescale if (doc.documentElement().hasAttribute("width") && doc.documentElement().hasAttribute("height")) { @@ -347,16 +421,41 @@ int TitleDocument::loadFromXml(QDomDocument doc, QGraphicsRectItem* startv, QGra gitem = rec; } else if (items.item(i).attributes().namedItem("type").nodeValue() == "QGraphicsPixmapItem") { QString url = items.item(i).namedItem("content").attributes().namedItem("url").nodeValue(); - QPixmap pix(url); + QString base64 = items.item(i).namedItem("content").attributes().namedItem("base64").nodeValue(); + QPixmap pix; + if (base64.isEmpty()) { + pix.load(url); + } else { + pix.loadFromData(QByteArray::fromBase64(base64.toAscii())); + } QGraphicsPixmapItem *rec = m_scene->addPixmap(pix); + rec->setShapeMode(QGraphicsPixmapItem::BoundingRectShape); rec->setData(Qt::UserRole, url); + if (!base64.isEmpty()) { + rec->setData(Qt::UserRole + 1, base64); + } gitem = rec; } else if (items.item(i).attributes().namedItem("type").nodeValue() == "QGraphicsSvgItem") { QString url = items.item(i).namedItem("content").attributes().namedItem("url").nodeValue(); - QGraphicsSvgItem *rec = new QGraphicsSvgItem(url); - m_scene->addItem(rec); - rec->setData(Qt::UserRole, url); - gitem = rec; + QString base64 = items.item(i).namedItem("content").attributes().namedItem("base64").nodeValue(); + QGraphicsSvgItem *rec = NULL; + if (base64.isEmpty()) { + rec = new QGraphicsSvgItem(url); + } else { + rec = new QGraphicsSvgItem(); + QSvgRenderer *renderer = new QSvgRenderer(QByteArray::fromBase64(base64.toAscii()), rec); + rec->setSharedRenderer(renderer); + //QString elem=rec->elementId(); + //QRectF bounds = renderer->boundsOnElement(elem); + } + if (rec) { + m_scene->addItem(rec); + rec->setData(Qt::UserRole, url); + if (!base64.isEmpty()) { + rec->setData(Qt::UserRole + 1, base64); + } + gitem = rec; + } } } //pos and transform