From d0c38add9436c4bfe40ef5f9859139b26d4f438e Mon Sep 17 00:00:00 2001 From: Le Tan Date: Tue, 15 May 2018 20:12:00 +0800 Subject: [PATCH] preview: refine scaling in-place preview of diagrams --- src/vlivepreviewhelper.cpp | 83 +++++++++++++--------------- src/vlivepreviewhelper.h | 17 +++++- src/vmathjaxinplacepreviewhelper.cpp | 4 +- 3 files changed, 55 insertions(+), 49 deletions(-) diff --git a/src/vlivepreviewhelper.cpp b/src/vlivepreviewhelper.cpp index 45fc3ede..499f860b 100644 --- a/src/vlivepreviewhelper.cpp +++ b/src/vlivepreviewhelper.cpp @@ -30,6 +30,8 @@ extern VMainWindow *g_mainWin; #define INDEX_MASK 0x00ffffffUL +#define SCALE_FACTOR_THRESHOLD 1.1 + CodeBlockPreviewInfo::CodeBlockPreviewInfo() { } @@ -55,18 +57,19 @@ void CodeBlockPreviewInfo::updateNonContent(const QTextDocument *p_doc, m_inplacePreview->m_blockNumber = m_codeBlock.m_endBlock; // Padding is not changed since content is not changed. } else { - m_inplacePreview->clear(); + m_inplacePreview.clear(); } } void CodeBlockPreviewInfo::updateInplacePreview(const VEditor *p_editor, - const QTextDocument *p_doc) + const QTextDocument *p_doc, + qreal p_scaleFactor) { QTextBlock block = p_doc->findBlockByNumber(m_codeBlock.m_endBlock); if (block.isValid()) { + Qt::TransformationMode tMode = Qt::SmoothTransformation; VImageToPreview *preview = new VImageToPreview(); - // m_image will be generated when signaling out. preview->m_startPos = block.position(); preview->m_endPos = block.position() + block.length(); preview->m_blockPos = block.position(); @@ -76,9 +79,33 @@ void CodeBlockPreviewInfo::updateInplacePreview(const VEditor *p_editor, preview->m_name = QString::number(getImageIndex()); preview->m_isBlock = true; + if (hasImageData()) { + if (p_scaleFactor < SCALE_FACTOR_THRESHOLD) { + preview->m_image.loadFromData(m_imgData.toUtf8(), + m_imgFormat.toLocal8Bit().data()); + } else { + QPixmap tmpImg; + tmpImg.loadFromData(m_imgData.toUtf8(), + m_imgFormat.toLocal8Bit().data()); + preview->m_image = tmpImg.scaledToWidth(tmpImg.width() * p_scaleFactor, tMode); + } + } else if (hasImageDataBa()) { + if (p_scaleFactor < SCALE_FACTOR_THRESHOLD) { + preview->m_image.loadFromData(m_imgDataBa, + m_imgFormat.toLocal8Bit().data()); + } else { + QPixmap tmpImg; + tmpImg.loadFromData(m_imgDataBa, + m_imgFormat.toLocal8Bit().data()); + preview->m_image = tmpImg.scaledToWidth(tmpImg.width() * p_scaleFactor, tMode); + } + } else { + preview->m_image = QPixmap(); + } + m_inplacePreview.reset(preview); } else { - m_inplacePreview->clear(); + m_inplacePreview.clear(); } } @@ -96,7 +123,8 @@ VLivePreviewHelper::VLivePreviewHelper(VEditor *p_editor, m_graphvizHelper(NULL), m_plantUMLHelper(NULL), m_lastInplacePreviewSize(0), - m_timeStamp(0) + m_timeStamp(0), + m_scaleFactor(VUtils::calculateScaleFactor()) { connect(m_editor->object(), &VEditorObject::cursorPositionChanged, this, &VLivePreviewHelper::handleCursorPositionChanged); @@ -352,7 +380,7 @@ void VLivePreviewHelper::localAsyncResultReady(int p_id, m_document->setPreviewContent(lang, p_result); } else { // Inplace preview. - cb.updateInplacePreview(m_editor, m_doc); + cb.updateInplacePreview(m_editor, m_doc, getScaleFactor(cb)); updateInplacePreview(); } @@ -402,42 +430,14 @@ void VLivePreviewHelper::processForInplacePreview(int p_idx) void VLivePreviewHelper::updateInplacePreview() { - Qt::TransformationMode tMode = Qt::SmoothTransformation; - qreal sf = VUtils::calculateScaleFactor(); QSet blocks; QVector > images; for (int i = 0; i < m_codeBlocks.size(); ++i) { CodeBlockPreviewInfo &cb = m_codeBlocks[i]; if (cb.inplacePreviewReady()) { - // Generate the image. - bool valid = false; - if (cb.hasImageData()) { - QPixmap tmpImg; - tmpImg.loadFromData(cb.imageData().toUtf8(), - cb.imageFormat().toLocal8Bit().data()); - if (sf < 1.1) { - cb.inplacePreview()->m_image.swap(tmpImg); - } else { - cb.inplacePreview()->m_image = tmpImg.scaledToWidth(tmpImg.width() * sf, tMode); - } - + if (!cb.inplacePreview()->m_image.isNull()) { images.append(cb.inplacePreview()); - valid = true; - } else if (cb.hasImageDataBa()) { - QPixmap tmpImg; - tmpImg.loadFromData(cb.imageDataBa(), - cb.imageFormat().toLocal8Bit().data()); - if (sf < 1.1) { - cb.inplacePreview()->m_image.swap(tmpImg); - } else { - cb.inplacePreview()->m_image = tmpImg.scaledToWidth(tmpImg.width() * sf, tMode); - } - - images.append(cb.inplacePreview()); - valid = true; - } - - if (!valid) { + } else { blocks.insert(cb.inplacePreview()->m_blockNumber); } } else { @@ -456,15 +456,6 @@ void VLivePreviewHelper::updateInplacePreview() if (!blocks.isEmpty()) { emit checkBlocksForObsoletePreview(blocks.toList()); } - - // Clear image. - for (int i = 0; i < m_codeBlocks.size(); ++i) { - CodeBlockPreviewInfo &cb = m_codeBlocks[i]; - if (cb.inplacePreviewReady() - && (cb.hasImageData() || cb.hasImageDataBa())) { - cb.inplacePreview()->m_image = QPixmap(); - } - } } void VLivePreviewHelper::mathjaxPreviewResultReady(int p_identitifer, @@ -484,6 +475,6 @@ void VLivePreviewHelper::mathjaxPreviewResultReady(int p_identitifer, CodeBlockPreviewInfo &cb = m_codeBlocks[p_id]; cb.setImageDataBa(p_format, p_data); - cb.updateInplacePreview(m_editor, m_doc); + cb.updateInplacePreview(m_editor, m_doc, getScaleFactor(cb)); updateInplacePreview(); } diff --git a/src/vlivepreviewhelper.h b/src/vlivepreviewhelper.h index 3104b267..0c3fcfc8 100644 --- a/src/vlivepreviewhelper.h +++ b/src/vlivepreviewhelper.h @@ -31,7 +31,9 @@ public: void updateNonContent(const QTextDocument *p_doc, const VCodeBlock &p_cb); - void updateInplacePreview(const VEditor *p_editor, const QTextDocument *p_doc); + void updateInplacePreview(const VEditor *p_editor, + const QTextDocument *p_doc, + qreal p_scaleFactor); VCodeBlock &codeBlock() { @@ -167,6 +169,8 @@ private: // Emit signal to update inplace preview. void updateInplacePreview(); + qreal getScaleFactor(const CodeBlockPreviewInfo &p_cb); + // Sorted by m_startBlock in ascending order. QVector m_codeBlocks; @@ -200,10 +204,21 @@ private: int m_lastInplacePreviewSize; TimeStamp m_timeStamp; + + const qreal m_scaleFactor; }; inline bool VLivePreviewHelper::isPreviewEnabled() const { return m_inplacePreviewEnabled || m_livePreviewEnabled; } + +inline qreal VLivePreviewHelper::getScaleFactor(const CodeBlockPreviewInfo &p_cb) +{ + if (p_cb.codeBlock().m_lang == QStringLiteral("mathjax")) { + return 1.0; + } else { + return m_scaleFactor; + } +} #endif // VLIVEPREVIEWHELPER_H diff --git a/src/vmathjaxinplacepreviewhelper.cpp b/src/vmathjaxinplacepreviewhelper.cpp index 184e6e98..19cede44 100644 --- a/src/vmathjaxinplacepreviewhelper.cpp +++ b/src/vmathjaxinplacepreviewhelper.cpp @@ -39,7 +39,7 @@ void MathjaxBlockPreviewInfo::updateNonContent(const QTextDocument *p_doc, p_editor->tabStopWidthW()); m_inplacePreview->m_isBlock = m_mathjaxBlock.m_previewedAsBlock; } else { - m_inplacePreview->clear(); + m_inplacePreview.clear(); } } @@ -68,7 +68,7 @@ void MathjaxBlockPreviewInfo::updateInplacePreview(const VEditor *p_editor, m_inplacePreview.reset(preview); } else { - m_inplacePreview->clear(); + m_inplacePreview.clear(); } }