From e9ccc4867b9fb12341cbcb6a4142a7126a7d1191 Mon Sep 17 00:00:00 2001 From: Jaydeep Solanki Date: Tue, 22 Oct 2013 21:13:57 +0530 Subject: [PATCH] epub video support --- core/textdocumentgenerator.cpp | 3 - generators/epub/CMakeLists.txt | 2 + generators/epub/converter.cpp | 71 ++++++++++++++++++++- generators/epub/data/CMakeLists.txt | 4 ++ generators/epub/data/okular-epub-movie.png | Bin 0 -> 12616 bytes generators/epub/epubdocument.cpp | 25 +++++++- generators/epub/epubdocument.h | 1 + 7 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 generators/epub/data/CMakeLists.txt create mode 100644 generators/epub/data/okular-epub-movie.png diff --git a/core/textdocumentgenerator.cpp b/core/textdocumentgenerator.cpp index b260b3f85..b4935d640 100644 --- a/core/textdocumentgenerator.cpp +++ b/core/textdocumentgenerator.cpp @@ -318,9 +318,6 @@ bool TextDocumentGenerator::loadDocument( const QString & fileName, QVector > annots( d->mDocument->pageCount() ); for ( int i = 0; i < d->mAnnotationInfos.count(); ++i ) { const TextDocumentGeneratorPrivate::AnnotationInfo &info = d->mAnnotationInfos[ i ]; - - QRect rect( 0, info.page * size.height(), size.width(), size.height() ); - info.annotation->setBoundingRectangle( Okular::NormalizedRect( rect.left(), rect.top(), rect.right(), rect.bottom() ) ); annots[ info.page ].append( info.annotation ); } diff --git a/generators/epub/CMakeLists.txt b/generators/epub/CMakeLists.txt index d68cdcddb..fa989ad88 100644 --- a/generators/epub/CMakeLists.txt +++ b/generators/epub/CMakeLists.txt @@ -1,4 +1,6 @@ +add_subdirectory(data) + include_directories( ${EPUB_INCLUDE_DIR} ) diff --git a/generators/epub/converter.cpp b/generators/epub/converter.cpp index a0ebddba9..eeb479c39 100644 --- a/generators/epub/converter.cpp +++ b/generators/epub/converter.cpp @@ -17,7 +17,11 @@ #include #include +#include + #include +#include +#include using namespace Epub; @@ -135,6 +139,28 @@ void Converter::_insert_local_links(const QString &key, const QPair &v } } +static QPoint calculateXYPosition( QTextDocument *document, int startPosition ) +{ + const QTextBlock startBlock = document->findBlock( startPosition ); + const QRectF startBoundingRect = document->documentLayout()->blockBoundingRect( startBlock ); + + QTextLayout *startLayout = startBlock.layout(); + if (!startLayout) { + kWarning() << "Start layout not found" << startLayout; + return QPoint(); + } + + int startPos = startPosition - startBlock.position(); + const QTextLine startLine = startLayout->lineForTextPosition( startPos ); + + double x = startBoundingRect.x() ; + double y = startBoundingRect.y() + startLine.y(); + + y = (int)y % 800; + + return QPoint(x,y); +} + QTextDocument* Converter::convert( const QString &fileName ) { EpubDocument *newDocument = new EpubDocument(fileName); @@ -170,7 +196,10 @@ QTextDocument* Converter::convert( const QString &fileName ) // if the background color of the document is non-white it will be handled by QTextDocument::setHtml() bool firstPage = true; + QVector movieAnnots; + const QSize videoSize(320, 240); do{ + movieAnnots.clear(); if(epub_it_get_curr(it)) { const QString link = QString::fromUtf8(epub_it_get_curr_url(it)); mTextDocument->setCurrentSubDocument(link); @@ -208,8 +237,32 @@ QTextDocument* Converter::convert( const QString &fileName ) svgs.at(i).parentNode().replaceChild(nd,svgs.at(i)); } } - htmlContent = dom.toString(); } + + // handle embedded videos + QDomNodeList videoTags = dom.elementsByTagName("video"); + if(!videoTags.isEmpty()) { + for (int i = 0; i < videoTags.size(); ++i) { + QDomNodeList sourceTags = videoTags.at(i).toElement().elementsByTagName("source"); + if(!sourceTags.isEmpty()) { + QString lnk = sourceTags.at(0).toElement().attribute("src"); + + Okular::Movie *movie = new Okular::Movie(mTextDocument->loadResource(EpubDocument::MovieResource,QUrl(lnk)).toString()); + movie->setSize(videoSize); + movie->setShowControls(true); + + Okular::MovieAnnotation *annot = new Okular::MovieAnnotation; + annot->setMovie(movie); + + movieAnnots.push_back(annot); + QDomDocument tempDoc; + tempDoc.setContent(QString("
<video></video>
")); + qDebug() << "replacing"; + videoTags.at(i).parentNode().replaceChild(tempDoc.documentElement(),videoTags.at(i)); + } + } + } + htmlContent = dom.toString(); } QTextBlock before; @@ -228,6 +281,22 @@ QTextDocument* Converter::convert( const QString &fileName ) _cursor->insertHtml(htmlContent); } + QTextCursor csr(mTextDocument); // a temporary cursor + csr.movePosition(QTextCursor::Start); + int index = 0; + while( !(csr = mTextDocument->find("",csr)).isNull() ) { + const int posStart = csr.position(); + const QPoint startPoint = calculateXYPosition(mTextDocument, posStart); + QImage img(KStandardDirs::locate("data", "okular/pics/okular-epub-movie.png")); + img = img.scaled(videoSize); + csr.insertImage(img); + const int posEnd = csr.position(); + const QRect videoRect(startPoint,videoSize); + movieAnnots[index]->setBoundingRectangle(Okular::NormalizedRect(videoRect,mTextDocument->pageSize().width(), mTextDocument->pageSize().height())); + emit addAnnotation(movieAnnots[index++],posStart,posEnd); + csr.movePosition(QTextCursor::NextWord); + } + mSectionMap.insert(link, before); _handle_anchors(before, link); diff --git a/generators/epub/data/CMakeLists.txt b/generators/epub/data/CMakeLists.txt new file mode 100644 index 000000000..e57a3be8b --- /dev/null +++ b/generators/epub/data/CMakeLists.txt @@ -0,0 +1,4 @@ + +install(FILES + okular-epub-movie.png + DESTINATION ${DATA_INSTALL_DIR}/okular/pics) diff --git a/generators/epub/data/okular-epub-movie.png b/generators/epub/data/okular-epub-movie.png new file mode 100644 index 0000000000000000000000000000000000000000..d028e44ba75463c5bac907e3b28a7666fe0eaffd GIT binary patch literal 12616 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 literal 0 HcmV?d00001 diff --git a/generators/epub/epubdocument.cpp b/generators/epub/epubdocument.cpp index 3060c7e2d..a1f88113b 100644 --- a/generators/epub/epubdocument.cpp +++ b/generators/epub/epubdocument.cpp @@ -8,6 +8,10 @@ ***************************************************************************/ #include "epubdocument.h" +#include +#include + +#include #include @@ -84,16 +88,31 @@ QVariant EpubDocument::loadResource(int type, const QUrl &name) if (data) { switch(type) { - case QTextDocument::ImageResource: - resource.setValue(QImage::fromData((unsigned char *)data, size)); + case QTextDocument::ImageResource:{ + QImage img = QImage::fromData((unsigned char *)data, size); + const int maxHeight = maxContentHeight(); + const int maxWidth = maxContentWidth(); + if(img.height() > maxHeight) + img = img.scaledToHeight(maxHeight); + if(img.width() > maxWidth) + img = img.scaledToWidth(maxWidth); + resource.setValue(img); break; - + } case QTextDocument::StyleSheetResource: { QString css = QString::fromUtf8(data); checkCSS(css); resource.setValue(css); break; } + case EpubDocument::MovieResource: { + QTemporaryFile *tmp = new QTemporaryFile(QString("%1/okrXXXXXX").arg(QDir::tempPath()),this); + if(!tmp->open()) kWarning() << "EPUB : error creating temporary video file"; + if(tmp->write(data,size) == -1) kWarning() << "EPUB : error writing data" << tmp->errorString(); + tmp->flush(); + resource.setValue(tmp->fileName()); + break; + } default: resource.setValue(QString::fromUtf8(data)); break; diff --git a/generators/epub/epubdocument.h b/generators/epub/epubdocument.h index ef30a32c3..28c8fa015 100644 --- a/generators/epub/epubdocument.h +++ b/generators/epub/epubdocument.h @@ -29,6 +29,7 @@ namespace Epub { void setCurrentSubDocument(const QString &doc); int maxContentHeight() const; int maxContentWidth() const; + enum Multimedia { MovieResource = 4 }; protected: virtual QVariant loadResource(int type, const QUrl &name);