From 368c3a871a5677e5d4f1bb1f26ca98434588625f Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sat, 10 Mar 2018 16:39:37 +0200 Subject: [PATCH] Resolved issue #819. Use OpenGL as render for view. --HG-- branch : develop --- ChangeLog.txt | 1 + common.pri | 7 +++- dist/OBS_debian/debian.control | 5 ++- dist/debian/control | 5 ++- ...tina-0.0.0_alpha(template_unstable).ebuild | 1 + dist/rpm/valentina.spec | 1 + src/app/tape/tape.pro | 2 +- .../configpages/preferencespatternpage.cpp | 5 ++- .../configpages/preferencespatternpage.ui | 20 ++++++++-- src/app/valentina/mainwindow.cpp | 4 +- src/app/valentina/valentina.pro | 3 +- src/libs/vmisc/vsettings.cpp | 13 +++++++ src/libs/vmisc/vsettings.h | 3 ++ src/libs/vwidgets/vmaingraphicsview.cpp | 38 ++++++++++++++++++- src/libs/vwidgets/vmaingraphicsview.h | 3 +- src/libs/vwidgets/vwidgets.pro | 2 +- src/test/CollectionTest/CollectionTest.pro | 2 +- src/test/ValentinaTest/ValentinaTest.pro | 2 +- 18 files changed, 95 insertions(+), 22 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index 6f7921148..5fc43c073 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -47,6 +47,7 @@ - [#808] New feature. Global line width option. - [#814] Make "\" valid character. - [#818] Improve Piece path validation. Check uniqueness. +- [#819] Use OpenGL as render for view. # Version 0.5.1 - [#683] Tool Seam allowance's dialog is off screen on small resolutions. diff --git a/common.pri b/common.pri index cfb085c23..b05b355d2 100644 --- a/common.pri +++ b/common.pri @@ -228,7 +228,8 @@ ISYSTEM += \ -isystem "$$[QT_INSTALL_HEADERS]/QtSvg" \ -isystem "$$[QT_INSTALL_HEADERS]/QtNetwork" \ -isystem "$$[QT_INSTALL_HEADERS]/QtTest" \ - -isystem "$$[QT_INSTALL_HEADERS]/QtConcurrent" + -isystem "$$[QT_INSTALL_HEADERS]/QtConcurrent" \ + -isystem "$$[QT_INSTALL_HEADERS]/QtOpenGL" } else { ISYSTEM += \ -isystem "$$[QT_INSTALL_LIBS]/QtWidgets.framework/Headers/" \ @@ -250,7 +251,9 @@ ISYSTEM += \ -isystem "$$[QT_INSTALL_LIBS]/QtTest.framework/Headers/" \ -isystem "$$[QT_INSTALL_LIBS]/QtTest.framework/Versions/5/Headers/" \ -isystem "$$[QT_INSTALL_LIBS]/QtConcurrent.framework/Headers/" \ - -isystem "$$[QT_INSTALL_LIBS]/QtConcurrent.framework/Versions/5/Headers/" + -isystem "$$[QT_INSTALL_LIBS]/QtConcurrent.framework/Versions/5/Headers/" \ + -isystem "$$[QT_INSTALL_LIBS]/QtOpenGL.framework/Headers/" \ + -isystem "$$[QT_INSTALL_LIBS]/QtOpenGL.framework/Versions/5/Headers/" } # Usefull GCC warnings keys. diff --git a/dist/OBS_debian/debian.control b/dist/OBS_debian/debian.control index c766e1ba6..df193b693 100644 --- a/dist/OBS_debian/debian.control +++ b/dist/OBS_debian/debian.control @@ -8,14 +8,15 @@ Build-Depends: debhelper (>= 8.0.0), g++ (>= 4.7.0), qt5-default (>= 5.2.0), qttools5-dev-tools (>= 5.2.0), - libqt5xmlpatterns5-dev (>= 5.2.0) + libqt5xmlpatterns5-dev (>= 5.2.0), + libqt5opengl5-dev (>= 5.2.0) Standards-Version: 3.9.5 Homepage: https://valentinaproject.bitbucket.io/ Vcs-Browser: https://bitbucket.org/dismine/valentina Package: valentina Architecture: i386 amd64 -Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libqt5core5a (>= 5.2.0) | libqt5core5 (>= 5.2.0), libqt5gui5 (>= 5.2.0) | libqt5gui5-gles (>= 5.2.0), libqt5printsupport5 (>= 5.2.0), libqt5svg5 (>= 5.2.0), libqt5widgets5 (>= 5.2.0), libqt5xml5 (>= 5.2.0), libqt5xmlpatterns5 (>= 5.2.0), libqt5concurrent5(>= 5.2.0), libstdc++6 (>= 4.6), xpdf +Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libqt5core5a (>= 5.2.0) | libqt5core5 (>= 5.2.0), libqt5gui5 (>= 5.2.0) | libqt5gui5-gles (>= 5.2.0), libqt5printsupport5 (>= 5.2.0), libqt5svg5 (>= 5.2.0), libqt5widgets5 (>= 5.2.0), libqt5xml5 (>= 5.2.0), libqt5xmlpatterns5 (>= 5.2.0), libqt5concurrent5(>= 5.2.0), libqt5opengl5 (>= 5.2.0), libstdc++6 (>= 4.6), xpdf Conflicts: seamly2d Description: Pattern making program. Valentina is a cross-platform patternmaking program which allows designers diff --git a/dist/debian/control b/dist/debian/control index c766e1ba6..df193b693 100644 --- a/dist/debian/control +++ b/dist/debian/control @@ -8,14 +8,15 @@ Build-Depends: debhelper (>= 8.0.0), g++ (>= 4.7.0), qt5-default (>= 5.2.0), qttools5-dev-tools (>= 5.2.0), - libqt5xmlpatterns5-dev (>= 5.2.0) + libqt5xmlpatterns5-dev (>= 5.2.0), + libqt5opengl5-dev (>= 5.2.0) Standards-Version: 3.9.5 Homepage: https://valentinaproject.bitbucket.io/ Vcs-Browser: https://bitbucket.org/dismine/valentina Package: valentina Architecture: i386 amd64 -Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libqt5core5a (>= 5.2.0) | libqt5core5 (>= 5.2.0), libqt5gui5 (>= 5.2.0) | libqt5gui5-gles (>= 5.2.0), libqt5printsupport5 (>= 5.2.0), libqt5svg5 (>= 5.2.0), libqt5widgets5 (>= 5.2.0), libqt5xml5 (>= 5.2.0), libqt5xmlpatterns5 (>= 5.2.0), libqt5concurrent5(>= 5.2.0), libstdc++6 (>= 4.6), xpdf +Depends: libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libqt5core5a (>= 5.2.0) | libqt5core5 (>= 5.2.0), libqt5gui5 (>= 5.2.0) | libqt5gui5-gles (>= 5.2.0), libqt5printsupport5 (>= 5.2.0), libqt5svg5 (>= 5.2.0), libqt5widgets5 (>= 5.2.0), libqt5xml5 (>= 5.2.0), libqt5xmlpatterns5 (>= 5.2.0), libqt5concurrent5(>= 5.2.0), libqt5opengl5 (>= 5.2.0), libstdc++6 (>= 4.6), xpdf Conflicts: seamly2d Description: Pattern making program. Valentina is a cross-platform patternmaking program which allows designers diff --git a/dist/ebuild/valentina-0.0.0_alpha(template_unstable).ebuild b/dist/ebuild/valentina-0.0.0_alpha(template_unstable).ebuild index b9c741981..e1721b09e 100644 --- a/dist/ebuild/valentina-0.0.0_alpha(template_unstable).ebuild +++ b/dist/ebuild/valentina-0.0.0_alpha(template_unstable).ebuild @@ -35,6 +35,7 @@ CDEPEND=" dev-qt/qtprintsupport:5 dev-qt/qtnetwork:5 dev-qt/qtconcurrent:5 + dev-qt/qtopengl:5 app-text/poppler" RDEPEND="${CDEPEND}" DEPEND="${CDEPEND} diff --git a/dist/rpm/valentina.spec b/dist/rpm/valentina.spec index 82d6ef383..d8bb8f129 100644 --- a/dist/rpm/valentina.spec +++ b/dist/rpm/valentina.spec @@ -18,6 +18,7 @@ BuildRequires: pkgconfig(Qt5PrintSupport) BuildRequires: pkgconfig(Qt5Widgets) BuildRequires: pkgconfig(Qt5Xml) BuildRequires: pkgconfig(Qt5Concurrent) +BuildRequires: pkgconfig(Qt5OpenGL) BuildRequires: qt5-qtxmlpatterns-devel >= 5.2.0 BuildRequires: qt5-qtsvg-devel >= 5.2.0 BuildRequires: qt5-qttools-devel >= 5.2.0 diff --git a/src/app/tape/tape.pro b/src/app/tape/tape.pro index 2e70bfa37..2eb3a9479 100644 --- a/src/app/tape/tape.pro +++ b/src/app/tape/tape.pro @@ -7,7 +7,7 @@ # File with common stuff for whole project include(../../../common.pri) -QT += core gui widgets network xml xmlpatterns printsupport svg concurrent +QT += core gui widgets network xml xmlpatterns printsupport svg concurrent opengl # Name of binary file TARGET = tape diff --git a/src/app/valentina/dialogs/configpages/preferencespatternpage.cpp b/src/app/valentina/dialogs/configpages/preferencespatternpage.cpp index e78e683c7..0b113c7cf 100644 --- a/src/app/valentina/dialogs/configpages/preferencespatternpage.cpp +++ b/src/app/valentina/dialogs/configpages/preferencespatternpage.cpp @@ -65,6 +65,7 @@ PreferencesPatternPage::PreferencesPatternPage(QWidget *parent) VSettings *settings = qApp->ValentinaSettings(); ui->graphOutputCheck->setChecked(settings->GetGraphicalOutput()); + ui->checkBoxOpenGLRender->setChecked(settings->IsOpenGLRender()); ui->doubleSpinBoxCurveApproximation->setValue(settings->GetCurveApproximationScale()); ui->doubleSpinBoxCurveApproximation->setMinimum(minCurveApproximationScale); ui->doubleSpinBoxCurveApproximation->setMaximum(maxCurveApproximationScale); @@ -118,10 +119,10 @@ void PreferencesPatternPage::Apply() // Scene antialiasing settings->SetGraphicalOutput(ui->graphOutputCheck->isChecked()); + settings->SetOpenGLRender(ui->checkBoxOpenGLRender->isChecked()); settings->SetCurveApproximationScale(ui->doubleSpinBoxCurveApproximation->value()); settings->SetLineWidth(UnitConvertor(ui->doubleSpinBoxLineWidth->value(), m_oldLineUnit, Unit::Mm)); - qApp->getSceneView()->setRenderHint(QPainter::Antialiasing, ui->graphOutputCheck->isChecked()); - qApp->getSceneView()->setRenderHint(QPainter::SmoothPixmapTransform, ui->graphOutputCheck->isChecked()); + qApp->getSceneView()->SetAntialiasing(ui->graphOutputCheck->isChecked()); /* Maximum number of commands in undo stack may only be set when the undo stack is empty, since setting it on a * non-empty stack might delete the command at the current index. Calling setUndoLimit() on a non-empty stack diff --git a/src/app/valentina/dialogs/configpages/preferencespatternpage.ui b/src/app/valentina/dialogs/configpages/preferencespatternpage.ui index d12311f7d..2baaaf6b9 100644 --- a/src/app/valentina/dialogs/configpages/preferencespatternpage.ui +++ b/src/app/valentina/dialogs/configpages/preferencespatternpage.ui @@ -7,19 +7,19 @@ 0 0 381 - 705 + 727 Pattern - + Graphical output - + @@ -27,6 +27,20 @@ + + + + Use OpenGL to render a scene. +This option will take an affect after restart. + + + Use OpenGL render + + + false + + + diff --git a/src/app/valentina/mainwindow.cpp b/src/app/valentina/mainwindow.cpp index 194d35588..35d4308b6 100644 --- a/src/app/valentina/mainwindow.cpp +++ b/src/app/valentina/mainwindow.cpp @@ -3741,9 +3741,7 @@ void MainWindow::ReadSettings() restoreState(settings->GetToolbarsState(), APP_VERSION); // Scene antialiasing - const bool graphOutputValue = settings->GetGraphicalOutput(); - ui->view->setRenderHint(QPainter::Antialiasing, graphOutputValue); - ui->view->setRenderHint(QPainter::SmoothPixmapTransform, graphOutputValue); + ui->view->SetAntialiasing(settings->GetGraphicalOutput()); // Stack limit qApp->getUndoStack()->setUndoLimit(settings->GetUndoCount()); diff --git a/src/app/valentina/valentina.pro b/src/app/valentina/valentina.pro index 2836aa881..f3fb38f4f 100644 --- a/src/app/valentina/valentina.pro +++ b/src/app/valentina/valentina.pro @@ -11,7 +11,7 @@ include(../../../common.pri) # Here we don't see "network" library, but, i think, "printsupport" depend on this library, so we still need this # library in installer. -QT += core gui widgets xml svg printsupport xmlpatterns concurrent +QT += core gui widgets xml svg printsupport xmlpatterns concurrent opengl # Use winextras only for Windows 7+ win32:greaterThan(QT_MAJOR_VERSION, 4):greaterThan(QT_MINOR_VERSION, 6) { @@ -300,6 +300,7 @@ win32:*g++* { $$[QT_INSTALL_BINS]/icuuc*.dll \ # Different name for different Qt releases $$[QT_INSTALL_BINS]/Qt5Core.dll \ $$[QT_INSTALL_BINS]/Qt5Concurrent.dll \ + $$[QT_INSTALL_BINS]/Qt5OpenGL.dll \ $$[QT_INSTALL_BINS]/Qt5Gui.dll \ $$[QT_INSTALL_BINS]/Qt5Network.dll \ $$[QT_INSTALL_BINS]/Qt5PrintSupport.dll \ diff --git a/src/libs/vmisc/vsettings.cpp b/src/libs/vmisc/vsettings.cpp index a03bb840d..4130d9321 100644 --- a/src/libs/vmisc/vsettings.cpp +++ b/src/libs/vmisc/vsettings.cpp @@ -53,6 +53,7 @@ const QString settingPathsPattern = QStringLiteral("paths/pattern"); const QString settingPathsLayout = QStringLiteral("paths/layout"); const QString settingPatternGraphicalOutput = QStringLiteral("pattern/graphicalOutput"); +const QString settingPatternUseOpenGLRender = QStringLiteral("pattern/useOpenGLRender"); const QString settingPatternKnownMaterials = QStringLiteral("pattern/knownMaterials"); const QString settingPatternRememberMaterials = QStringLiteral("pattern/rememberMaterials"); @@ -152,6 +153,18 @@ void VSettings::SetGraphicalOutput(const bool &value) setValue(settingPatternGraphicalOutput, value); } +//--------------------------------------------------------------------------------------------------------------------- +bool VSettings::IsOpenGLRender() const +{ + return value(settingPatternUseOpenGLRender, 0).toBool(); +} + +//--------------------------------------------------------------------------------------------------------------------- +void VSettings::SetOpenGLRender(bool value) +{ + setValue(settingPatternUseOpenGLRender, value); +} + //--------------------------------------------------------------------------------------------------------------------- qreal VSettings::GetLayoutPaperHeight() const { diff --git a/src/libs/vmisc/vsettings.h b/src/libs/vmisc/vsettings.h index 0f752a9bd..f77a0e56f 100644 --- a/src/libs/vmisc/vsettings.h +++ b/src/libs/vmisc/vsettings.h @@ -68,6 +68,9 @@ public: bool GetGraphicalOutput() const; void SetGraphicalOutput(const bool &value); + bool IsOpenGLRender() const; + void SetOpenGLRender(bool value); + // Layout settings qreal GetLayoutPaperHeight() const; void SetLayoutPaperHeight(qreal value); diff --git a/src/libs/vwidgets/vmaingraphicsview.cpp b/src/libs/vwidgets/vmaingraphicsview.cpp index 991c6f910..9b3f2af4a 100644 --- a/src/libs/vwidgets/vmaingraphicsview.cpp +++ b/src/libs/vwidgets/vmaingraphicsview.cpp @@ -48,10 +48,18 @@ #include #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) +# include +#else +# include +#endif + #include "../vmisc/def.h" #include "../vmisc/vmath.h" #include "vmaingraphicsscene.h" #include "vsimplecurve.h" +#include "../vmisc/vabstractapplication.h" +#include "../vmisc/vsettings.h" const int GraphicsViewZoom::duration = 300; const int GraphicsViewZoom::updateInterval = 40; @@ -349,17 +357,34 @@ const unsigned long VMainGraphicsView::scrollDelay = 80; */ VMainGraphicsView::VMainGraphicsView(QWidget *parent) : QGraphicsView(parent), - zoom(new GraphicsViewZoom(this)), + zoom(nullptr), showToolOptions(true), isAllowRubberBand(true), m_ptStartPos(), m_oldCursor(), m_currentCursor(Qt::ArrowCursor) { + VSettings *settings = qobject_cast(qApp->Settings()); + if (settings && settings->IsOpenGLRender()) + { + #if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) + QOpenGLWidget *viewport = new QOpenGLWidget(); + QSurfaceFormat fmt; + fmt.setSamples(settings->GetGraphicalOutput() ? 10 : 0); + viewport->setFormat(fmt); + + setViewport(viewport); + #else + setViewport(new QGLWidget(QGLFormat(QGL::DoubleBuffer|QGL::SampleBuffers))); + #endif + } + + zoom = new GraphicsViewZoom(this); + this->setResizeAnchor(QGraphicsView::AnchorUnderMouse); this->setTransformationAnchor(QGraphicsView::AnchorUnderMouse); - this->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); this->setInteractive(true); + SetAntialiasing(true); connect(zoom, &GraphicsViewZoom::zoomed, this, [this](){emit ScaleChanged(transform().m11());}); } @@ -603,6 +628,15 @@ void VMainGraphicsView::setCurrentCursorShape() m_currentCursor = viewport()->cursor().shape(); } +//--------------------------------------------------------------------------------------------------------------------- +void VMainGraphicsView::SetAntialiasing(bool value) +{ + setRenderHint(QPainter::Antialiasing, value); + setRenderHint(QPainter::SmoothPixmapTransform, value); + + +} + //--------------------------------------------------------------------------------------------------------------------- void VMainGraphicsView::setShowToolOptions(bool value) { diff --git a/src/libs/vwidgets/vmaingraphicsview.h b/src/libs/vwidgets/vmaingraphicsview.h index 81bd1f8e4..4fe39d60e 100644 --- a/src/libs/vwidgets/vmaingraphicsview.h +++ b/src/libs/vwidgets/vmaingraphicsview.h @@ -113,7 +113,6 @@ class VMainGraphicsView : public QGraphicsView { Q_OBJECT public: - explicit VMainGraphicsView(QWidget *parent = nullptr); void setShowToolOptions(bool value); void AllowRubberBand(bool value); @@ -131,6 +130,8 @@ public: void setCurrentCursorShape(); + void SetAntialiasing(bool value); + signals: /** * @brief MouseRelease help catch mouse release event. diff --git a/src/libs/vwidgets/vwidgets.pro b/src/libs/vwidgets/vwidgets.pro index 1a9171b2f..9f9b80679 100644 --- a/src/libs/vwidgets/vwidgets.pro +++ b/src/libs/vwidgets/vwidgets.pro @@ -7,7 +7,7 @@ # File with common stuff for whole project include(../../../common.pri) -QT += widgets printsupport +QT += widgets printsupport opengl # Name of the library TARGET = vwidgets diff --git a/src/test/CollectionTest/CollectionTest.pro b/src/test/CollectionTest/CollectionTest.pro index b87a42220..a0ec710e8 100644 --- a/src/test/CollectionTest/CollectionTest.pro +++ b/src/test/CollectionTest/CollectionTest.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT += testlib widgets printsupport concurrent +QT += testlib widgets printsupport concurrent opengl QT -= gui diff --git a/src/test/ValentinaTest/ValentinaTest.pro b/src/test/ValentinaTest/ValentinaTest.pro index 7ed39e52c..21a019488 100644 --- a/src/test/ValentinaTest/ValentinaTest.pro +++ b/src/test/ValentinaTest/ValentinaTest.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT += core testlib gui printsupport xml xmlpatterns concurrent +QT += core testlib gui printsupport xml xmlpatterns concurrent opengl TARGET = ValentinaTests