mirror of
https://github.com/JakubMelka/PDF4QT.git
synced 2025-06-05 21:59:17 +02:00
Renderer engine selection
This commit is contained in:
@ -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.
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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:
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user