Renderer engine selection

This commit is contained in:
Jakub Melka
2019-09-08 11:13:59 +02:00
parent 8d53bc81eb
commit 320633d003
8 changed files with 86 additions and 14 deletions

View File

@ -367,13 +367,13 @@ void PDFDrawWidgetProxy::setDocument(const PDFDocument* document, const PDFOptio
void PDFDrawWidgetProxy::init(PDFWidget* widget) void PDFDrawWidgetProxy::init(PDFWidget* widget)
{ {
m_widget = widget->getDrawWidget(); m_widget = widget;
m_horizontalScrollbar = widget->getHorizontalScrollbar(); m_horizontalScrollbar = widget->getHorizontalScrollbar();
m_verticalScrollbar = widget->getVerticalScrollbar(); m_verticalScrollbar = widget->getVerticalScrollbar();
connect(m_horizontalScrollbar, &QScrollBar::valueChanged, this, &PDFDrawWidgetProxy::onHorizontalScrollbarValueChanged); connect(m_horizontalScrollbar, &QScrollBar::valueChanged, this, &PDFDrawWidgetProxy::onHorizontalScrollbarValueChanged);
connect(m_verticalScrollbar, &QScrollBar::valueChanged, this, &PDFDrawWidgetProxy::onVerticalScrollbarValueChanged); connect(m_verticalScrollbar, &QScrollBar::valueChanged, this, &PDFDrawWidgetProxy::onVerticalScrollbarValueChanged);
connect(this, &PDFDrawWidgetProxy::drawSpaceChanged, m_widget->getWidget(), QOverload<void>::of(&PDFDrawWidget::update)); connect(this, &PDFDrawWidgetProxy::drawSpaceChanged, this, &PDFDrawWidgetProxy::repaintNeeded);
// We must update the draw space - widget has been set // We must update the draw space - widget has been set
update(); update();
@ -391,7 +391,7 @@ void PDFDrawWidgetProxy::update()
Q_ASSERT(m_horizontalScrollbar); Q_ASSERT(m_horizontalScrollbar);
Q_ASSERT(m_verticalScrollbar); 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), // First, we must calculate pixel per mm ratio to obtain DPMM (device pixel per mm),
// we also assume, that zoom is correctly set. // we also assume, that zoom is correctly set.

View File

@ -319,7 +319,7 @@ private:
PDFDrawSpaceController* m_controller; PDFDrawSpaceController* m_controller;
/// Controlled draw widget (proxy is for this widget) /// Controlled draw widget (proxy is for this widget)
IDrawWidget* m_widget; PDFWidget* m_widget;
/// Vertical scrollbar /// Vertical scrollbar
QScrollBar* m_verticalScrollbar; QScrollBar* m_verticalScrollbar;

View File

@ -26,14 +26,14 @@
namespace pdf namespace pdf
{ {
PDFWidget::PDFWidget(QWidget* parent) : PDFWidget::PDFWidget(RendererEngine engine, int samplesCount, QWidget* parent) :
QWidget(parent), QWidget(parent),
m_drawWidget(nullptr), m_drawWidget(nullptr),
m_horizontalScrollBar(nullptr), m_horizontalScrollBar(nullptr),
m_verticalScrollBar(nullptr), m_verticalScrollBar(nullptr),
m_proxy(nullptr) m_proxy(nullptr)
{ {
m_drawWidget = new PDFOpenGLDrawWidget(this, this); m_drawWidget = createDrawWidget(engine, samplesCount);
m_horizontalScrollBar = new QScrollBar(Qt::Horizontal, this); m_horizontalScrollBar = new QScrollBar(Qt::Horizontal, this);
m_verticalScrollBar = new QScrollBar(Qt::Vertical, this); m_verticalScrollBar = new QScrollBar(Qt::Vertical, this);
@ -64,6 +64,35 @@ void PDFWidget::setDocument(const PDFDocument* document, const PDFOptionalConten
m_pageRenderingErrors.clear(); m_pageRenderingErrors.clear();
} }
void PDFWidget::updateRenderer(RendererEngine engine, int samplesCount)
{
PDFOpenGLDrawWidget* openglDrawWidget = qobject_cast<PDFOpenGLDrawWidget*>(m_drawWidget->getWidget());
PDFDrawWidget* softwareDrawWidget = qobject_cast<PDFDrawWidget*>(m_drawWidget->getWidget());
// Do we need to change renderer?
if ((openglDrawWidget && engine != RendererEngine::OpenGL) || (softwareDrawWidget && engine != RendererEngine::Software))
{
QGridLayout* layout = qobject_cast<QGridLayout*>(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 PDFWidget::getPageRenderingErrorCount() const
{ {
int count = 0; int count = 0;
@ -82,6 +111,24 @@ void PDFWidget::onRenderingError(PDFInteger pageIndex, const QList<PDFRenderErro
emit pageRenderingErrorsChanged(pageIndex, errors.size()); emit pageRenderingErrorsChanged(pageIndex, errors.size());
} }
IDrawWidget* PDFWidget::createDrawWidget(RendererEngine rendererEngine, int samplesCount)
{
switch (rendererEngine)
{
case RendererEngine::Software:
return new PDFDrawWidget(this, this);
case RendererEngine::OpenGL:
return new PDFOpenGLDrawWidget(this, samplesCount, this);
default:
Q_ASSERT(false);
break;
}
return nullptr;
}
template<typename BaseWidget> template<typename BaseWidget>
PDFDrawWidgetBase<BaseWidget>::PDFDrawWidgetBase(PDFWidget* widget, QWidget* parent) : PDFDrawWidgetBase<BaseWidget>::PDFDrawWidgetBase(PDFWidget* widget, QWidget* parent) :
BaseWidget(parent), BaseWidget(parent),
@ -266,12 +313,12 @@ void PDFDrawWidgetBase<BaseWidget>::wheelEvent(QWheelEvent* event)
event->accept(); event->accept();
} }
PDFOpenGLDrawWidget::PDFOpenGLDrawWidget(PDFWidget* widget, QWidget* parent) : PDFOpenGLDrawWidget::PDFOpenGLDrawWidget(PDFWidget* widget, int samplesCount, QWidget* parent) :
BaseClass(widget, parent) BaseClass(widget, parent)
{ {
QSurfaceFormat format = this->format(); QSurfaceFormat format = this->format();
format.setProfile(QSurfaceFormat::CoreProfile); format.setProfile(QSurfaceFormat::CoreProfile);
format.setSamples(16); format.setSamples(samplesCount);
format.setColorSpace(QSurfaceFormat::sRGBColorSpace); format.setColorSpace(QSurfaceFormat::sRGBColorSpace);
format.setSwapBehavior(QSurfaceFormat::DoubleBuffer); format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
setFormat(format); setFormat(format);

View File

@ -48,7 +48,10 @@ class PDFFORQTLIBSHARED_EXPORT PDFWidget : public QWidget
Q_OBJECT Q_OBJECT
public: 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; virtual ~PDFWidget() override;
using PageRenderingErrors = std::map<PDFInteger, QList<PDFRenderError>>; using PageRenderingErrors = std::map<PDFInteger, QList<PDFRenderError>>;
@ -60,6 +63,11 @@ public:
/// \param optionalContentActivity Optional content activity /// \param optionalContentActivity Optional content activity
void setDocument(const PDFDocument* document, const PDFOptionalContentActivity* optionalContentActivity); 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; } IDrawWidget* getDrawWidget() const { return m_drawWidget; }
QScrollBar* getHorizontalScrollbar() const { return m_horizontalScrollBar; } QScrollBar* getHorizontalScrollbar() const { return m_horizontalScrollBar; }
QScrollBar* getVerticalScrollbar() const { return m_verticalScrollBar; } QScrollBar* getVerticalScrollbar() const { return m_verticalScrollBar; }
@ -73,6 +81,8 @@ signals:
private: private:
void onRenderingError(PDFInteger pageIndex, const QList<PDFRenderError>& errors); void onRenderingError(PDFInteger pageIndex, const QList<PDFRenderError>& errors);
IDrawWidget* createDrawWidget(RendererEngine rendererEngine, int samplesCount);
IDrawWidget* m_drawWidget; IDrawWidget* m_drawWidget;
QScrollBar* m_horizontalScrollBar; QScrollBar* m_horizontalScrollBar;
QScrollBar* m_verticalScrollBar; QScrollBar* m_verticalScrollBar;
@ -126,7 +136,7 @@ private:
using BaseClass = PDFDrawWidgetBase<QOpenGLWidget>; using BaseClass = PDFDrawWidgetBase<QOpenGLWidget>;
public: public:
explicit PDFOpenGLDrawWidget(PDFWidget* widget, QWidget* parent); explicit PDFOpenGLDrawWidget(PDFWidget* widget, int samplesCount, QWidget* parent);
virtual ~PDFOpenGLDrawWidget() override; virtual ~PDFOpenGLDrawWidget() override;
protected: protected:

View File

@ -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 next line"), QKeySequence::MoveToNextLine, pdf::PDFDrawWidgetProxy::NavigateNextStep);
createGoToAction(ui->menuGoTo, tr("Go to previous line"), QKeySequence::MoveToPreviousLine, pdf::PDFDrawWidgetProxy::NavigatePreviousStep); 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); setCentralWidget(m_pdfWidget);
setFocusProxy(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_pdfWidget, &pdf::PDFWidget::pageRenderingErrorsChanged, this, &PDFViewerMainWindow::onPageRenderingErrorsChanged, Qt::QueuedConnection);
connect(m_settings, &PDFViewerSettings::settingsChanged, this, &PDFViewerMainWindow::onViewerSettingsChanged); connect(m_settings, &PDFViewerSettings::settingsChanged, this, &PDFViewerMainWindow::onViewerSettingsChanged);
readSettings();
updatePageLayoutActions(); updatePageLayoutActions();
} }
@ -252,6 +253,7 @@ void PDFViewerMainWindow::updateRenderingOptionActions()
void PDFViewerMainWindow::onViewerSettingsChanged() void PDFViewerMainWindow::onViewerSettingsChanged()
{ {
m_pdfWidget->updateRenderer(m_settings->getRendererEngine(), m_settings->isMultisampleAntialiasingEnabled() ? m_settings->getRendererSamples() : -1);
m_pdfWidget->getDrawWidgetProxy()->setFeatures(m_settings->getFeatures()); m_pdfWidget->getDrawWidgetProxy()->setFeatures(m_settings->getFeatures());
updateRenderingOptionActions(); updateRenderingOptionActions();
} }

View File

@ -15,6 +15,7 @@ void PDFViewerSettings::readSettings(QSettings& settings)
m_settings.m_directory = settings.value("defaultDirectory", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)).toString(); m_settings.m_directory = settings.value("defaultDirectory", QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)).toString();
m_settings.m_features = static_cast<pdf::PDFRenderer::Features>(settings.value("rendererFeatures", static_cast<int>(pdf::PDFRenderer::getDefaultFeatures())).toInt()); m_settings.m_features = static_cast<pdf::PDFRenderer::Features>(settings.value("rendererFeatures", static_cast<int>(pdf::PDFRenderer::getDefaultFeatures())).toInt());
m_settings.m_rendererEngine = static_cast<pdf::RendererEngine>(settings.value("renderingEngine", static_cast<int>(pdf::RendererEngine::OpenGL)).toInt()); m_settings.m_rendererEngine = static_cast<pdf::RendererEngine>(settings.value("renderingEngine", static_cast<int>(pdf::RendererEngine::OpenGL)).toInt());
m_settings.m_multisampleAntialiasing = settings.value("msaa", true).toBool();
m_settings.m_rendererSamples = settings.value("rendererSamples", 16).toInt(); m_settings.m_rendererSamples = settings.value("rendererSamples", 16).toInt();
settings.endGroup(); settings.endGroup();
@ -27,6 +28,7 @@ void PDFViewerSettings::writeSettings(QSettings& settings)
settings.setValue("defaultDirectory", m_settings.m_directory); settings.setValue("defaultDirectory", m_settings.m_directory);
settings.setValue("rendererFeatures", static_cast<int>(m_settings.m_features)); settings.setValue("rendererFeatures", static_cast<int>(m_settings.m_features));
settings.setValue("renderingEngine", static_cast<int>(m_settings.m_rendererEngine)); settings.setValue("renderingEngine", static_cast<int>(m_settings.m_rendererEngine));
settings.setValue("msaa", m_settings.m_multisampleAntialiasing);
settings.setValue("rendererSamples", m_settings.m_rendererSamples); settings.setValue("rendererSamples", m_settings.m_rendererSamples);
settings.endGroup(); settings.endGroup();
} }

View File

@ -55,6 +55,8 @@ public:
int getRendererSamples() const; int getRendererSamples() const;
void setRendererSamples(int rendererSamples); void setRendererSamples(int rendererSamples);
bool isMultisampleAntialiasingEnabled() const { return m_settings.m_multisampleAntialiasing; }
signals: signals:
void settingsChanged(); void settingsChanged();

View File

@ -86,8 +86,17 @@ void PDFViewerSettingsDialog::loadData()
{ {
ui->multisampleAntialiasingCheckBox->setEnabled(true); ui->multisampleAntialiasingCheckBox->setEnabled(true);
ui->multisampleAntialiasingCheckBox->setChecked(m_settings.m_multisampleAntialiasing); 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 else
{ {