diff --git a/src/vmathjaxinplacepreviewhelper.cpp b/src/vmathjaxinplacepreviewhelper.cpp index 19cede44..1626773a 100644 --- a/src/vmathjaxinplacepreviewhelper.cpp +++ b/src/vmathjaxinplacepreviewhelper.cpp @@ -72,6 +72,9 @@ void MathjaxBlockPreviewInfo::updateInplacePreview(const VEditor *p_editor, } } +#define MATHJAX_IMAGE_CACHE_SIZE_DIFF 20 +#define MATHJAX_IMAGE_CACHE_TIME_DIFF 5 + VMathJaxInplacePreviewHelper::VMathJaxInplacePreviewHelper(VEditor *p_editor, VDocument *p_document, QObject *p_parent) @@ -100,6 +103,7 @@ void VMathJaxInplacePreviewHelper::setEnabled(bool p_enabled) if (!m_enabled) { m_mathjaxBlocks.clear(); + m_cache.clear(); } updateInplacePreview(); @@ -114,36 +118,36 @@ void VMathJaxInplacePreviewHelper::updateMathjaxBlocks(const QVector &entry = it.value(); + entry->m_ts = m_timeStamp; + cached = true; + m_mathjaxBlocks[i].setImageDataBa(entry->m_imgFormat, entry->m_imgDataBa); + m_mathjaxBlocks[i].updateInplacePreview(m_editor, m_doc); } - if (m_enabled - && (!cached || !m_mathjaxBlocks[idx].inplacePreviewReady())) { + if (!cached || !m_mathjaxBlocks[i].inplacePreviewReady()) { manualUpdate = false; - processForInplacePreview(idx); + processForInplacePreview(i); } - - ++idx; } - m_mathjaxBlocks.resize(idx); - if (manualUpdate) { updateInplacePreview(); } + + clearObsoleteCache(); } void VMathJaxInplacePreviewHelper::processForInplacePreview(int p_idx) @@ -220,6 +224,13 @@ void VMathJaxInplacePreviewHelper::mathjaxPreviewResultReady(int p_identitifer, MathjaxBlockPreviewInfo &mb = m_mathjaxBlocks[p_id]; mb.setImageDataBa(p_format, p_data); mb.updateInplacePreview(m_editor, m_doc); + + // Update the cache. + QSharedPointer entry(new MathjaxImageCacheEntry(p_timeStamp, + p_data, + p_format)); + m_cache.insert(mb.mathjaxBlock().m_text, entry); + updateInplacePreview(); } @@ -238,3 +249,19 @@ void VMathJaxInplacePreviewHelper::textToHtmlFinished(int p_identitifer, p_timeStamp, p_html); } + +void VMathJaxInplacePreviewHelper::clearObsoleteCache() +{ + if (m_cache.size() - m_mathjaxBlocks.size() <= MATHJAX_IMAGE_CACHE_SIZE_DIFF) { + return; + } + + for (auto it = m_cache.begin(); it != m_cache.end();) { + if (m_timeStamp - it.value()->m_ts > MATHJAX_IMAGE_CACHE_TIME_DIFF) { + it.value().clear(); + it = m_cache.erase(it); + } else { + ++it; + } + } +} diff --git a/src/vmathjaxinplacepreviewhelper.h b/src/vmathjaxinplacepreviewhelper.h index 174ee258..75f49175 100644 --- a/src/vmathjaxinplacepreviewhelper.h +++ b/src/vmathjaxinplacepreviewhelper.h @@ -85,6 +85,7 @@ private: QSharedPointer m_inplacePreview; }; + class VMathJaxInplacePreviewHelper : public QObject { Q_OBJECT @@ -113,6 +114,28 @@ private slots: void textToHtmlFinished(int p_identitifer, int p_id, int p_timeStamp, const QString &p_html); private: + struct MathjaxImageCacheEntry + { + MathjaxImageCacheEntry() + : m_ts(0) + { + } + + MathjaxImageCacheEntry(TimeStamp p_ts, + const QByteArray &p_dataBa, + const QString &p_format) + : m_ts(p_ts), + m_imgDataBa(p_dataBa), + m_imgFormat(p_format) + { + } + + TimeStamp m_ts; + QByteArray m_imgDataBa; + QString m_imgFormat; + }; + + void processForInplacePreview(int p_idx); // Emit signal to update inplace preview. @@ -122,6 +145,8 @@ private: int p_id, int p_timeStamp); + void clearObsoleteCache(); + VEditor *m_editor; VDocument *m_document; @@ -143,6 +168,9 @@ private: QVector m_mathjaxBlocks; int m_documentID; + + // Indexed by content. + QHash> m_cache; }; #endif // VMATHJAXINPLACEPREVIEWHELPER_H