diff --git a/PdfForQtLib/sources/pdfdrawspacecontroller.cpp b/PdfForQtLib/sources/pdfdrawspacecontroller.cpp index 0a2c9eb..63eb9d1 100644 --- a/PdfForQtLib/sources/pdfdrawspacecontroller.cpp +++ b/PdfForQtLib/sources/pdfdrawspacecontroller.cpp @@ -367,13 +367,13 @@ void PDFDrawWidgetProxy::setDocument(const PDFDocument* document, const PDFOptio void PDFDrawWidgetProxy::init(PDFWidget* widget) { - m_widget = widget->getDrawWidget(); + m_widget = widget; m_horizontalScrollbar = widget->getHorizontalScrollbar(); m_verticalScrollbar = widget->getVerticalScrollbar(); connect(m_horizontalScrollbar, &QScrollBar::valueChanged, this, &PDFDrawWidgetProxy::onHorizontalScrollbarValueChanged); connect(m_verticalScrollbar, &QScrollBar::valueChanged, this, &PDFDrawWidgetProxy::onVerticalScrollbarValueChanged); - connect(this, &PDFDrawWidgetProxy::drawSpaceChanged, m_widget->getWidget(), QOverload::of(&PDFDrawWidget::update)); + connect(this, &PDFDrawWidgetProxy::drawSpaceChanged, this, &PDFDrawWidgetProxy::repaintNeeded); // We must update the draw space - widget has been set update(); @@ -391,7 +391,7 @@ void PDFDrawWidgetProxy::update() Q_ASSERT(m_horizontalScrollbar); Q_ASSERT(m_verticalScrollbar); - QWidget* widget = m_widget->getWidget(); + QWidget* widget = m_widget->getDrawWidget()->getWidget(); // First, we must calculate pixel per mm ratio to obtain DPMM (device pixel per mm), // we also assume, that zoom is correctly set. diff --git a/PdfForQtLib/sources/pdfdrawspacecontroller.h b/PdfForQtLib/sources/pdfdrawspacecontroller.h index d55735b..32b1d71 100644 --- a/PdfForQtLib/sources/pdfdrawspacecontroller.h +++ b/PdfForQtLib/sources/pdfdrawspacecontroller.h @@ -319,7 +319,7 @@ private: PDFDrawSpaceController* m_controller; /// Controlled draw widget (proxy is for this widget) - IDrawWidget* m_widget; + PDFWidget* m_widget; /// Vertical scrollbar QScrollBar* m_verticalScrollbar; diff --git a/PdfForQtLib/sources/pdfdrawwidget.cpp b/PdfForQtLib/sources/pdfdrawwidget.cpp index 369ac78..44e804e 100644 --- a/PdfForQtLib/sources/pdfdrawwidget.cpp +++ b/PdfForQtLib/sources/pdfdrawwidget.cpp @@ -26,14 +26,14 @@ namespace pdf { -PDFWidget::PDFWidget(QWidget* parent) : +PDFWidget::PDFWidget(RendererEngine engine, int samplesCount, QWidget* parent) : QWidget(parent), m_drawWidget(nullptr), m_horizontalScrollBar(nullptr), m_verticalScrollBar(nullptr), m_proxy(nullptr) { - m_drawWidget = new PDFOpenGLDrawWidget(this, this); + m_drawWidget = createDrawWidget(engine, samplesCount); m_horizontalScrollBar = new QScrollBar(Qt::Horizontal, this); m_verticalScrollBar = new QScrollBar(Qt::Vertical, this); @@ -64,6 +64,35 @@ void PDFWidget::setDocument(const PDFDocument* document, const PDFOptionalConten m_pageRenderingErrors.clear(); } +void PDFWidget::updateRenderer(RendererEngine engine, int samplesCount) +{ + PDFOpenGLDrawWidget* openglDrawWidget = qobject_cast(m_drawWidget->getWidget()); + PDFDrawWidget* softwareDrawWidget = qobject_cast(m_drawWidget->getWidget()); + + // Do we need to change renderer? + if ((openglDrawWidget && engine != RendererEngine::OpenGL) || (softwareDrawWidget && engine != RendererEngine::Software)) + { + QGridLayout* layout = qobject_cast(this->layout()); + layout->removeWidget(m_drawWidget->getWidget()); + delete m_drawWidget->getWidget(); + + m_drawWidget = createDrawWidget(engine, samplesCount); + layout->addWidget(m_drawWidget->getWidget(), 0, 0); + setFocusProxy(m_drawWidget->getWidget()); + connect(m_proxy, &PDFDrawWidgetProxy::repaintNeeded, m_drawWidget->getWidget(), QOverload<>::of(&QWidget::update)); + } + else if (openglDrawWidget) + { + // Just check the samples count + QSurfaceFormat format = openglDrawWidget->format(); + if (format.samples() != samplesCount) + { + format.setSamples(samplesCount); + openglDrawWidget->setFormat(format); + } + } +} + int PDFWidget::getPageRenderingErrorCount() const { int count = 0; @@ -82,6 +111,24 @@ void PDFWidget::onRenderingError(PDFInteger pageIndex, const QList PDFDrawWidgetBase::PDFDrawWidgetBase(PDFWidget* widget, QWidget* parent) : BaseWidget(parent), @@ -266,12 +313,12 @@ void PDFDrawWidgetBase::wheelEvent(QWheelEvent* event) event->accept(); } -PDFOpenGLDrawWidget::PDFOpenGLDrawWidget(PDFWidget* widget, QWidget* parent) : +PDFOpenGLDrawWidget::PDFOpenGLDrawWidget(PDFWidget* widget, int samplesCount, QWidget* parent) : BaseClass(widget, parent) { QSurfaceFormat format = this->format(); format.setProfile(QSurfaceFormat::CoreProfile); - format.setSamples(16); + format.setSamples(samplesCount); format.setColorSpace(QSurfaceFormat::sRGBColorSpace); format.setSwapBehavior(QSurfaceFormat::DoubleBuffer); setFormat(format); diff --git a/PdfForQtLib/sources/pdfdrawwidget.h b/PdfForQtLib/sources/pdfdrawwidget.h index 1ee1171..d3169ac 100644 --- a/PdfForQtLib/sources/pdfdrawwidget.h +++ b/PdfForQtLib/sources/pdfdrawwidget.h @@ -48,7 +48,10 @@ class PDFFORQTLIBSHARED_EXPORT PDFWidget : public QWidget Q_OBJECT public: - explicit PDFWidget(QWidget* parent); + /// Constructs new PDFWidget. + /// \param engine Rendering engine type + /// \param samplesCount Samples count for rendering engine MSAA antialiasing + explicit PDFWidget(RendererEngine engine, int samplesCount, QWidget* parent); virtual ~PDFWidget() override; using PageRenderingErrors = std::map>; @@ -60,6 +63,11 @@ public: /// \param optionalContentActivity Optional content activity void setDocument(const PDFDocument* document, const PDFOptionalContentActivity* optionalContentActivity); + /// Update rendering engine according the settings + /// \param engine Engine type + /// \param samplesCount Samples count for rendering engine MSAA antialiasing + void updateRenderer(RendererEngine engine, int samplesCount); + IDrawWidget* getDrawWidget() const { return m_drawWidget; } QScrollBar* getHorizontalScrollbar() const { return m_horizontalScrollBar; } QScrollBar* getVerticalScrollbar() const { return m_verticalScrollBar; } @@ -73,6 +81,8 @@ signals: private: void onRenderingError(PDFInteger pageIndex, const QList& errors); + IDrawWidget* createDrawWidget(RendererEngine rendererEngine, int samplesCount); + IDrawWidget* m_drawWidget; QScrollBar* m_horizontalScrollBar; QScrollBar* m_verticalScrollBar; @@ -126,7 +136,7 @@ private: using BaseClass = PDFDrawWidgetBase; public: - explicit PDFOpenGLDrawWidget(PDFWidget* widget, QWidget* parent); + explicit PDFOpenGLDrawWidget(PDFWidget* widget, int samplesCount, QWidget* parent); virtual ~PDFOpenGLDrawWidget() override; protected: diff --git a/PdfForQtViewer/pdfviewermainwindow.cpp b/PdfForQtViewer/pdfviewermainwindow.cpp index ed91360..58388f1 100644 --- a/PdfForQtViewer/pdfviewermainwindow.cpp +++ b/PdfForQtViewer/pdfviewermainwindow.cpp @@ -86,7 +86,9 @@ PDFViewerMainWindow::PDFViewerMainWindow(QWidget *parent) : createGoToAction(ui->menuGoTo, tr("Go to next line"), QKeySequence::MoveToNextLine, pdf::PDFDrawWidgetProxy::NavigateNextStep); createGoToAction(ui->menuGoTo, tr("Go to previous line"), QKeySequence::MoveToPreviousLine, pdf::PDFDrawWidgetProxy::NavigatePreviousStep); - m_pdfWidget = new pdf::PDFWidget(this); + readSettings(); + + m_pdfWidget = new pdf::PDFWidget(m_settings->getRendererEngine(), m_settings->isMultisampleAntialiasingEnabled() ? m_settings->getRendererSamples() : -1, this); setCentralWidget(m_pdfWidget); setFocusProxy(m_pdfWidget); @@ -118,7 +120,6 @@ PDFViewerMainWindow::PDFViewerMainWindow(QWidget *parent) : connect(m_pdfWidget, &pdf::PDFWidget::pageRenderingErrorsChanged, this, &PDFViewerMainWindow::onPageRenderingErrorsChanged, Qt::QueuedConnection); connect(m_settings, &PDFViewerSettings::settingsChanged, this, &PDFViewerMainWindow::onViewerSettingsChanged); - readSettings(); updatePageLayoutActions(); } @@ -252,6 +253,7 @@ void PDFViewerMainWindow::updateRenderingOptionActions() void PDFViewerMainWindow::onViewerSettingsChanged() { + m_pdfWidget->updateRenderer(m_settings->getRendererEngine(), m_settings->isMultisampleAntialiasingEnabled() ? m_settings->getRendererSamples() : -1); m_pdfWidget->getDrawWidgetProxy()->setFeatures(m_settings->getFeatures()); updateRenderingOptionActions(); } diff --git a/PdfForQtViewer/pdfviewersettings.cpp b/PdfForQtViewer/pdfviewersettings.cpp index c8377f6..3ffd771 100644 --- a/PdfForQtViewer/pdfviewersettings.cpp +++ b/PdfForQtViewer/pdfviewersettings.cpp @@ -15,6 +15,7 @@ void PDFViewerSettings::readSettings(QSettings& settings) m_settings.m_directory = settings.value("defaultDirectory", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)).toString(); m_settings.m_features = static_cast(settings.value("rendererFeatures", static_cast(pdf::PDFRenderer::getDefaultFeatures())).toInt()); m_settings.m_rendererEngine = static_cast(settings.value("renderingEngine", static_cast(pdf::RendererEngine::OpenGL)).toInt()); + m_settings.m_multisampleAntialiasing = settings.value("msaa", true).toBool(); m_settings.m_rendererSamples = settings.value("rendererSamples", 16).toInt(); settings.endGroup(); @@ -27,6 +28,7 @@ void PDFViewerSettings::writeSettings(QSettings& settings) settings.setValue("defaultDirectory", m_settings.m_directory); settings.setValue("rendererFeatures", static_cast(m_settings.m_features)); settings.setValue("renderingEngine", static_cast(m_settings.m_rendererEngine)); + settings.setValue("msaa", m_settings.m_multisampleAntialiasing); settings.setValue("rendererSamples", m_settings.m_rendererSamples); settings.endGroup(); } diff --git a/PdfForQtViewer/pdfviewersettings.h b/PdfForQtViewer/pdfviewersettings.h index 3a3457d..98a85f2 100644 --- a/PdfForQtViewer/pdfviewersettings.h +++ b/PdfForQtViewer/pdfviewersettings.h @@ -55,6 +55,8 @@ public: int getRendererSamples() const; void setRendererSamples(int rendererSamples); + bool isMultisampleAntialiasingEnabled() const { return m_settings.m_multisampleAntialiasing; } + signals: void settingsChanged(); diff --git a/PdfForQtViewer/pdfviewersettingsdialog.cpp b/PdfForQtViewer/pdfviewersettingsdialog.cpp index b4b4dc4..64c2595 100644 --- a/PdfForQtViewer/pdfviewersettingsdialog.cpp +++ b/PdfForQtViewer/pdfviewersettingsdialog.cpp @@ -86,8 +86,17 @@ void PDFViewerSettingsDialog::loadData() { ui->multisampleAntialiasingCheckBox->setEnabled(true); ui->multisampleAntialiasingCheckBox->setChecked(m_settings.m_multisampleAntialiasing); - ui->multisampleAntialiasingSamplesCountComboBox->setEnabled(true); - ui->multisampleAntialiasingSamplesCountComboBox->setCurrentIndex(ui->multisampleAntialiasingSamplesCountComboBox->findData(m_settings.m_rendererSamples)); + + if (m_settings.m_multisampleAntialiasing) + { + ui->multisampleAntialiasingSamplesCountComboBox->setEnabled(true); + ui->multisampleAntialiasingSamplesCountComboBox->setCurrentIndex(ui->multisampleAntialiasingSamplesCountComboBox->findData(m_settings.m_rendererSamples)); + } + else + { + ui->multisampleAntialiasingSamplesCountComboBox->setEnabled(false); + ui->multisampleAntialiasingSamplesCountComboBox->setCurrentIndex(-1); + } } else {