diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -10,9 +10,6 @@ include_directories( lib/test ) endif(BUILD_TESTING) -if(LIBSPECTRE_FOUND) - include_directories(${LIBSPECTRE_INCLUDE_DIR}) -endif(LIBSPECTRE_FOUND) add_subdirectory(backends) add_subdirectory(assistants) add_subdirectory(xslt) @@ -79,7 +76,6 @@ animationresultitem.cpp loadedexpression.cpp animation.cpp - epsrenderer.cpp ) ki18n_wrap_ui(cantor_PART_SRCS imagesettings.ui) @@ -101,9 +97,6 @@ KF5::TextEditor ${Qt5XmlPatterns_LIBRARIES} KF5::KIOCore KF5::KIOFileWidgets KF5::KIOWidgets Qt5::PrintSupport cantorlibs cantor_config ) -if(LIBSPECTRE_FOUND) - target_link_libraries(cantorpart ${LIBSPECTRE_LIBRARY}) -endif(LIBSPECTRE_FOUND) if(Discount_FOUND) target_link_libraries(cantorpart Discount::Lib) endif(Discount_FOUND) diff --git a/src/config-cantor.h.cmake b/src/config-cantor.h.cmake --- a/src/config-cantor.h.cmake +++ b/src/config-cantor.h.cmake @@ -2,8 +2,6 @@ #define CANTOR_VERSION "${KDE_APPLICATIONS_VERSION}" -#cmakedefine LIBSPECTRE_FOUND 1 - #cmakedefine Discount_FOUND 1 #define PATH_TO_CANTOR_PLUGINS "${PATH_TO_CANTOR_BACKENDS}" diff --git a/src/imageresultitem.h b/src/imageresultitem.h --- a/src/imageresultitem.h +++ b/src/imageresultitem.h @@ -45,7 +45,6 @@ double height() const override; void deleteLater() override; - EpsRenderer* epsRenderer(); protected Q_SLOTS: void saveResult(); diff --git a/src/imageresultitem.cpp b/src/imageresultitem.cpp --- a/src/imageresultitem.cpp +++ b/src/imageresultitem.cpp @@ -23,6 +23,8 @@ #include "lib/imageresult.h" #include "lib/epsresult.h" +#include + #include #include #include @@ -57,7 +59,17 @@ setImage(m_result->data().value()); break; case Cantor::EpsResult::Type: - setEps(m_result->data().toUrl()); + { + Cantor::EpsResult* epsResult = static_cast(m_result); +#ifdef WITH_EPS + if (!epsResult->image().isNull() && worksheet()->epsRenderer()->scale() == 1.0) + setImage(epsResult->image()); + else + setEps(m_result->data().toUrl()); +#else + setImage(epsResult->image()); +#endif + } break; default: break; @@ -91,8 +103,3 @@ { WorksheetImageItem::deleteLater(); } - -EpsRenderer* ImageResultItem::epsRenderer() -{ - return qobject_cast(scene())->epsRenderer(); -} diff --git a/src/latexentry.cpp b/src/latexentry.cpp --- a/src/latexentry.cpp +++ b/src/latexentry.cpp @@ -23,7 +23,7 @@ #include "worksheetentry.h" #include "worksheet.h" -#include "epsrenderer.h" +#include "lib/epsrenderer.h" #include "lib/defaulthighlighter.h" #include "lib/latexrenderer.h" #include "config-cantor.h" @@ -58,7 +58,7 @@ for (int i = 2; i; --i) { int p = cursor.position(); if (m_textItem->document()->characterAt(p-1) == repl && - cursor.charFormat().hasProperty(EpsRenderer::CantorFormula)) { + cursor.charFormat().hasProperty(Cantor::EpsRenderer::CantorFormula)) { m_textItem->setTextCursor(cursor); imageSelected = true; break; @@ -128,9 +128,9 @@ m_renderedFormat = worksheet()->epsRenderer()->render(m_textItem->document(), QUrl::fromLocalFile(imagePath)); qDebug()<<"rendering successful? " << !m_renderedFormat.name().isEmpty(); - m_renderedFormat.setProperty(EpsRenderer::CantorFormula, EpsRenderer::LatexFormula); - m_renderedFormat.setProperty(EpsRenderer::ImagePath, imagePath); - m_renderedFormat.setProperty(EpsRenderer::Code, m_latex); + m_renderedFormat.setProperty(Cantor::EpsRenderer::CantorFormula, Cantor::EpsRenderer::LatexFormula); + m_renderedFormat.setProperty(Cantor::EpsRenderer::ImagePath, imagePath); + m_renderedFormat.setProperty(Cantor::EpsRenderer::Code, m_latex); cursor.insertText(QString(QChar::ObjectReplacementCharacter), m_renderedFormat); useLatexCode = false; @@ -156,10 +156,10 @@ m_renderedFormat.setWidth(image.width()); m_renderedFormat.setHeight(image.height()); - m_renderedFormat.setProperty(EpsRenderer::CantorFormula, EpsRenderer::LatexFormula); + m_renderedFormat.setProperty(Cantor::EpsRenderer::CantorFormula, Cantor::EpsRenderer::LatexFormula); if (!imagePath.isEmpty()) - m_renderedFormat.setProperty(EpsRenderer::ImagePath, imagePath); - m_renderedFormat.setProperty(EpsRenderer::Code, m_latex); + m_renderedFormat.setProperty(Cantor::EpsRenderer::ImagePath, imagePath); + m_renderedFormat.setProperty(Cantor::EpsRenderer::Code, m_latex); cursor.insertText(QString(QChar::ObjectReplacementCharacter), m_renderedFormat); useLatexCode = false; @@ -180,16 +180,16 @@ if (!cursor.isNull()) { QTextImageFormat format=cursor.charFormat().toImageFormat(); - QString fileName = format.property(EpsRenderer::ImagePath).toString(); + QString fileName = format.property(Cantor::EpsRenderer::ImagePath).toString(); // Check, if eps file exists, and if not true, rerender latex code bool isEpsFileExists = QFile::exists(fileName); #ifdef LIBSPECTRE_FOUND if (!isEpsFileExists && renderLatexCode()) { cursor = m_textItem->document()->find(QString(QChar::ObjectReplacementCharacter)); format=cursor.charFormat().toImageFormat(); - fileName = format.property(EpsRenderer::ImagePath).toString(); + fileName = format.property(Cantor::EpsRenderer::ImagePath).toString(); isEpsFileExists = QFile::exists(fileName); } #endif @@ -275,7 +275,7 @@ { qDebug()<<"found a formula... rendering the eps..."; QTextImageFormat format=cursor.charFormat().toImageFormat(); - const QUrl& url=QUrl::fromLocalFile(format.property(EpsRenderer::ImagePath).toString()); + const QUrl& url=QUrl::fromLocalFile(format.property(Cantor::EpsRenderer::ImagePath).toString()); QSizeF s = worksheet()->epsRenderer()->renderToResource(m_textItem->document(), url, QUrl(format.name())); qDebug()<<"rendering successful? "<< s.isValid(); @@ -414,7 +414,7 @@ if (renderer->renderingSuccessful()) { - EpsRenderer* epsRend = worksheet()->epsRenderer(); + Cantor::EpsRenderer* epsRend = worksheet()->epsRenderer(); m_renderedFormat = epsRend->render(m_textItem->document(), renderer); success = !m_renderedFormat.name().isEmpty(); } diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -1,3 +1,7 @@ +if(LIBSPECTRE_FOUND) + include_directories(${LIBSPECTRE_INCLUDE_DIR}) +endif(LIBSPECTRE_FOUND) + set( cantor_LIB_SRCS session.cpp expression.cpp @@ -8,6 +12,7 @@ epsresult.cpp latexresult.cpp latexrenderer.cpp + epsrenderer.cpp helpresult.cpp animationresult.cpp extension.cpp @@ -37,6 +42,7 @@ helpresult.h imageresult.h latexresult.h + epsrenderer.h result.h textresult.h #helper classes @@ -74,6 +80,13 @@ Qt5::Xml ) +<<<<<<< HEAD +======= +if(LIBSPECTRE_FOUND) + target_link_libraries(cantorlibs ${LIBSPECTRE_LIBRARY}) +endif(LIBSPECTRE_FOUND) + +>>>>>>> 66757510... Move EpsRenderer from CantorPart to CantorLibs and add support EpsRender result on Cantor without Libspectre (via prerendered QImage) set (CANTORLIBS_SOVERSION 24) set_target_properties( cantorlibs PROPERTIES VERSION ${KDE_APPLICATIONS_VERSION} SOVERSION ${CANTORLIBS_SOVERSION}) diff --git a/src/lib/config-cantorlib.h.cmake b/src/lib/config-cantorlib.h.cmake --- a/src/lib/config-cantorlib.h.cmake +++ b/src/lib/config-cantorlib.h.cmake @@ -1 +1,3 @@ #cmakedefine WITH_EPS 1 + +#cmakedefine LIBSPECTRE_FOUND 1 diff --git a/src/epsrenderer.h b/src/lib/epsrenderer.h rename from src/epsrenderer.h rename to src/lib/epsrenderer.h --- a/src/epsrenderer.h +++ b/src/lib/epsrenderer.h @@ -26,9 +26,13 @@ #include #include #include -#include "lib/latexrenderer.h" +#include "latexrenderer.h" -class EpsRenderer +namespace Cantor +{ +class EpsRendererPrivate; + +class CANTOR_EXPORT EpsRenderer { public: EpsRenderer(); @@ -49,11 +53,14 @@ void useHighResolution(bool b); QSizeF renderToResource(QTextDocument *document, const QUrl& url, const QUrl& internal); + QImage renderToImage(const QUrl& url, QSizeF* size = nullptr); + static QImage renderToImage(const QUrl& url, double scale, bool useHighRes, QSizeF* size = nullptr); private: - double m_scale; - bool m_useHighRes; + EpsRendererPrivate* d; }; +} + #endif //EPSRENDERER_H diff --git a/src/epsrenderer.cpp b/src/lib/epsrenderer.cpp rename from src/epsrenderer.cpp rename to src/lib/epsrenderer.cpp --- a/src/epsrenderer.cpp +++ b/src/lib/epsrenderer.cpp @@ -20,32 +20,40 @@ #include "epsrenderer.h" -#include +#include #ifdef LIBSPECTRE_FOUND #include "libspectre/spectre.h" #endif #include #include -EpsRenderer::EpsRenderer() : m_scale(1), m_useHighRes(false) +using namespace Cantor; + +class Cantor::EpsRendererPrivate{ + public: + double scale{1}; + bool useHighRes{false}; +}; + +EpsRenderer::EpsRenderer() : d(new EpsRendererPrivate()) { } void EpsRenderer::setScale(qreal scale) { - m_scale = scale; + d->scale = scale; } qreal EpsRenderer::scale() { - return m_scale; + return d->scale; } void EpsRenderer::useHighResolution(bool b) { - m_useHighRes = b; + d->useHighRes = b; } QTextImageFormat EpsRenderer::render(QTextDocument *document, const QUrl &url) @@ -96,7 +104,7 @@ return size; } -QImage EpsRenderer::renderToImage(const QUrl& url, QSizeF* size) +QImage EpsRenderer::renderToImage(const QUrl& url, double scale, bool useHighRes, QSizeF* size) { #ifdef LIBSPECTRE_FOUND SpectreDocument* doc = spectre_document_new(); @@ -112,28 +120,28 @@ int wdoc, hdoc; qreal w, h; - double scale; + double realScale; spectre_document_get_page_size(doc, &wdoc, &hdoc); - if(m_useHighRes) { - scale=1.2*4.0; //1.2 scaling factor, to make it look nice, 4x for high resolution + if(useHighRes) { + realScale = 1.2*4.0; //1.2 scaling factor, to make it look nice, 4x for high resolution w = 1.2 * wdoc; h = 1.2 * hdoc; } else { - scale=1.8*m_scale; + realScale=1.8*scale; w = 1.8 * wdoc; h = 1.8 * hdoc; } - qDebug()<<"scale: "<scale, d->useHighRes, size); +} diff --git a/src/lib/epsresult.h b/src/lib/epsresult.h --- a/src/lib/epsresult.h +++ b/src/lib/epsresult.h @@ -24,6 +24,7 @@ #include "result.h" #include "cantor_export.h" #include +#include namespace Cantor { @@ -33,13 +34,14 @@ { public: enum {Type=5}; - explicit EpsResult( const QUrl& url); + explicit EpsResult( const QUrl& url, const QImage& image = QImage()); ~EpsResult() override; QString toHtml() override; QString toLatex() override; QVariant data() override; QUrl url() override; + QImage image(); int type() override; QString mimeType() override; diff --git a/src/lib/epsresult.cpp b/src/lib/epsresult.cpp --- a/src/lib/epsresult.cpp +++ b/src/lib/epsresult.cpp @@ -26,19 +26,21 @@ #include #include #include +#include + +#include "epsrenderer.h" class Cantor::EpsResultPrivate{ public: QUrl url; + QImage image; }; -EpsResult::EpsResult(const QUrl& url) : d(new EpsResultPrivate) +EpsResult::EpsResult(const QUrl& url, const QImage& image) : d(new EpsResultPrivate) { d->url=url; -#ifndef WITH_EPS - qDebug()<<"Creating an EpsResult in an environment compiled without EPS support!"; -#endif + d->image = image; } EpsResult::~EpsResult() @@ -66,6 +68,11 @@ return d->url; } +QImage Cantor::EpsResult::image() +{ + return d->image; +} + int EpsResult::type() { return EpsResult::Type; @@ -82,8 +89,30 @@ QDomElement e=doc.createElement(QStringLiteral("Result")); e.setAttribute(QStringLiteral("type"), QStringLiteral("image")); e.setAttribute(QStringLiteral("filename"), d->url.fileName()); - qDebug()<<"done"; +#ifdef WITH_EPS + const QImage& image = EpsRenderer::renderToImage(d->url, 1.0, false); + qDebug() << image.size() << image.isNull(); + if (!image.isNull()) + { + QByteArray ba; + QBuffer buffer(&ba); + buffer.open(QIODevice::WriteOnly); + image.save(&buffer, "PNG"); + e.setAttribute(QLatin1String("image"), QString::fromLatin1(ba.toBase64())); + } +#else + if (!d->image.isNull()) + { + QByteArray ba; + QBuffer buffer(&ba); + buffer.open(QIODevice::WriteOnly); + d->image.save(&buffer, "PNG"); + e.setAttribute(QLatin1String("image"), QString::fromLatin1(ba.toBase64())); + } +#endif + + qDebug()<<"done"; return e; } diff --git a/src/loadedexpression.cpp b/src/loadedexpression.cpp --- a/src/loadedexpression.cpp +++ b/src/loadedexpression.cpp @@ -74,7 +74,10 @@ addResult(new Cantor::AnimationResult(imageUrl)); }else if(imageFile->name().endsWith(QLatin1String(".eps"))) { - addResult(new Cantor::EpsResult(imageUrl)); + const QByteArray& ba = QByteArray::fromBase64(resultElement.attribute(QLatin1String("image")).toLatin1()); + QImage image; + image.loadFromData(ba); + addResult(new Cantor::EpsResult(imageUrl, image)); }else { addResult(new Cantor::ImageResult(imageUrl, resultElement.text())); diff --git a/src/markdownentry.cpp b/src/markdownentry.cpp --- a/src/markdownentry.cpp +++ b/src/markdownentry.cpp @@ -55,7 +55,7 @@ for (int i = 2; i; --i) { int p = cursor.position(); if (m_textItem->document()->characterAt(p-1) == repl && - cursor.charFormat().hasProperty(EpsRenderer::CantorFormula)) { + cursor.charFormat().hasProperty(Cantor::EpsRenderer::CantorFormula)) { m_textItem->setTextCursor(cursor); imageSelected = true; break; diff --git a/src/textentry.cpp b/src/textentry.cpp --- a/src/textentry.cpp +++ b/src/textentry.cpp @@ -21,7 +21,7 @@ #include "textentry.h" #include "worksheettextitem.h" -#include "epsrenderer.h" +#include "lib/epsrenderer.h" #include "latexrenderer.h" #include @@ -54,7 +54,7 @@ for (int i = 2; i; --i) { int p = cursor.position(); if (m_textItem->document()->characterAt(p-1) == repl && - cursor.charFormat().hasProperty(EpsRenderer::CantorFormula)) { + cursor.charFormat().hasProperty(Cantor::EpsRenderer::CantorFormula)) { m_textItem->setTextCursor(cursor); imageSelected = true; break; @@ -123,7 +123,7 @@ while(!cursor.isNull()) { QTextCharFormat format = cursor.charFormat(); - if (format.hasProperty(EpsRenderer::CantorFormula)) + if (format.hasProperty(Cantor::EpsRenderer::CantorFormula)) showLatexCode(cursor); cursor = document->find(QString(QChar::ObjectReplacementCharacter), cursor); @@ -191,7 +191,7 @@ bool success; QTextImageFormat formulaFormat; if (renderer->renderingSuccessful()) { - EpsRenderer* epsRend = worksheet()->epsRenderer(); + Cantor::EpsRenderer* epsRend = worksheet()->epsRenderer(); formulaFormat = epsRend->render(m_textItem->document(), renderer); success = !formulaFormat.name().isEmpty(); } else { @@ -204,7 +204,7 @@ continue; } - formulaFormat.setProperty(EpsRenderer::Delimiter, QLatin1String("$$")); + formulaFormat.setProperty(Cantor::EpsRenderer::Delimiter, QLatin1String("$$")); cursor.insertText(QString(QChar::ObjectReplacementCharacter), formulaFormat); delete renderer; @@ -224,10 +224,10 @@ while(!cursor.isNull()) { QTextImageFormat format=cursor.charFormat().toImageFormat(); - if (format.hasProperty(EpsRenderer::CantorFormula)) + if (format.hasProperty(Cantor::EpsRenderer::CantorFormula)) { qDebug() << "found a formula... rendering the eps..."; - const QUrl& url=QUrl::fromLocalFile(format.property(EpsRenderer::ImagePath).toString()); + const QUrl& url=QUrl::fromLocalFile(format.property(Cantor::EpsRenderer::ImagePath).toString()); QSizeF s = worksheet()->epsRenderer()->renderToResource(m_textItem->document(), url, QUrl(format.name())); qDebug() << "rendering successful? " << s.isValid(); @@ -267,7 +267,7 @@ QString TextEntry::showLatexCode(QTextCursor& cursor) { - QString latexCode = cursor.charFormat().property(EpsRenderer::Code).toString(); + QString latexCode = cursor.charFormat().property(Cantor::EpsRenderer::Code).toString(); cursor.deletePreviousChar(); latexCode = QLatin1String("$$") + latexCode + QLatin1String("$$"); cursor.insertText(latexCode); diff --git a/src/textresultitem.h b/src/textresultitem.h --- a/src/textresultitem.h +++ b/src/textresultitem.h @@ -24,7 +24,6 @@ #include "resultitem.h" #include "worksheettextitem.h" #include "worksheetentry.h" -#include "epsrenderer.h" #include "lib/latexresult.h" @@ -47,7 +46,6 @@ double height() const override; void deleteLater() override; - EpsRenderer* epsRenderer() const; protected Q_SLOTS: void toggleLatexCode(); diff --git a/src/textresultitem.cpp b/src/textresultitem.cpp --- a/src/textresultitem.cpp +++ b/src/textresultitem.cpp @@ -23,6 +23,7 @@ #include "lib/result.h" #include "lib/textresult.h" #include "lib/latexresult.h" +#include "lib/epsrenderer.h" #include #include @@ -110,12 +111,13 @@ cursor.insertText(latex); } else { QTextImageFormat format; - format = epsRenderer()->render(cursor.document(), + Cantor::EpsRenderer* renderer = qobject_cast(scene())->epsRenderer();; + format = renderer->render(cursor.document(), result->data().toUrl()); - format.setProperty(EpsRenderer::CantorFormula, - EpsRenderer::LatexFormula); - format.setProperty(EpsRenderer::Code, latex); - format.setProperty(EpsRenderer::Delimiter, QLatin1String("$$")); + format.setProperty(Cantor::EpsRenderer::CantorFormula, + Cantor::EpsRenderer::LatexFormula); + format.setProperty(Cantor::EpsRenderer::Code, latex); + format.setProperty(Cantor::EpsRenderer::Delimiter, QLatin1String("$$")); if(format.isValid()) cursor.insertText(QString(QChar::ObjectReplacementCharacter), format); else @@ -156,8 +158,3 @@ { WorksheetTextItem::deleteLater(); } - -EpsRenderer* TextResultItem::epsRenderer() const -{ - return qobject_cast(scene())->epsRenderer(); -} diff --git a/src/worksheet.h b/src/worksheet.h --- a/src/worksheet.h +++ b/src/worksheet.h @@ -32,7 +32,7 @@ #include #include "worksheetview.h" -#include "epsrenderer.h" +#include "lib/epsrenderer.h" #include "worksheetcursor.h" namespace Cantor { @@ -85,7 +85,7 @@ void createActions(KActionCollection*); QMenu* createContextMenu(); void populateMenu(QMenu* menu, QPointF pos); - EpsRenderer* epsRenderer(); + Cantor::EpsRenderer* epsRenderer(); bool isEmpty(); bool isLoadingFromFile(); @@ -260,7 +260,7 @@ static const double EntryCursorWidth; Cantor::Session *m_session; QSyntaxHighlighter* m_highlighter; - EpsRenderer m_epsRenderer; + Cantor::EpsRenderer m_epsRenderer; WorksheetEntry* m_firstEntry; WorksheetEntry* m_lastEntry; WorksheetEntry* m_dragEntry; diff --git a/src/worksheet.cpp b/src/worksheet.cpp --- a/src/worksheet.cpp +++ b/src/worksheet.cpp @@ -1207,7 +1207,7 @@ entry->startRemoving(); } -EpsRenderer* Worksheet::epsRenderer() +Cantor::EpsRenderer* Worksheet::epsRenderer() { return &m_epsRenderer; } diff --git a/src/worksheettextitem.cpp b/src/worksheettextitem.cpp --- a/src/worksheettextitem.cpp +++ b/src/worksheettextitem.cpp @@ -21,7 +21,7 @@ #include "worksheettextitem.h" #include "worksheet.h" #include "worksheetentry.h" -#include "epsrenderer.h" +#include "lib/epsrenderer.h" #include "worksheetcursor.h" #include @@ -270,13 +270,13 @@ cursor2 = document()->find(repl, cursor1)) { cursor1.setPosition(cursor2.selectionStart(), QTextCursor::KeepAnchor); result += cursor1.selectedText(); - QVariant var = cursor2.charFormat().property(EpsRenderer::Delimiter); + QVariant var = cursor2.charFormat().property(Cantor::EpsRenderer::Delimiter); QString delim; if (var.isValid()) delim = var.value(); else delim = QLatin1String(""); - result += delim + cursor2.charFormat().property(EpsRenderer::Code).value() + delim; + result += delim + cursor2.charFormat().property(Cantor::EpsRenderer::Code).value() + delim; cursor1.setPosition(cursor2.selectionEnd()); }