From d202681aa857cce2468c95676a56c9133a8f226c Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Tue, 16 Mar 2010 15:56:15 +0100 Subject: Avoid using uncompatible vertex shader for non-solid brushes The simplified vertex shader for complex geometry is written specifically for solid brushes and needs to be disabled when the brush is anything else. This work-around can be removed later when QTBUG-9069 is handled, since that removes the extra requirements on the setPosition() shader. Reviewed-by: tom --- src/opengl/gl2paintengineex/qglengineshadermanager.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp index aa704b1..ac25597 100644 --- a/src/opengl/gl2paintengineex/qglengineshadermanager.cpp +++ b/src/opengl/gl2paintengineex/qglengineshadermanager.cpp @@ -328,7 +328,7 @@ QGLEngineShaderProg *QGLEngineSharedShaders::findProgramInCache(const QGLEngineS newProg->program->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR); if (newProg->useOpacityAttribute) newProg->program->bindAttributeLocation("opacityArray", QT_OPACITY_ATTR); - if (newProg->usePmvMatrix) { + if (newProg->usePmvMatrixAttribute) { newProg->program->bindAttributeLocation("pmvMatrix1", QT_PMV_MATRIX_1_ATTR); newProg->program->bindAttributeLocation("pmvMatrix2", QT_PMV_MATRIX_2_ATTR); newProg->program->bindAttributeLocation("pmvMatrix3", QT_PMV_MATRIX_3_ATTR); @@ -753,9 +753,16 @@ bool QGLEngineShaderManager::useCorrectShaderProg() } requiredProgram.useTextureCoords = texCoords; requiredProgram.useOpacityAttribute = (opacityMode == AttributeOpacity); - requiredProgram.usePmvMatrix = true; - if (complexGeometry) + if (complexGeometry && srcPixelType == Qt::SolidPattern) { requiredProgram.positionVertexShader = QGLEngineSharedShaders::ComplexGeometryPositionOnlyVertexShader; + requiredProgram.usePmvMatrixAttribute = false; + } else { + requiredProgram.usePmvMatrixAttribute = true; + + // Force complexGeometry off, since we currently don't support that mode for + // non-solid brushes + complexGeometry = false; + } // At this point, requiredProgram is fully populated so try to find the program in the cache currentShaderProg = sharedShaders->findProgramInCache(requiredProgram); -- cgit v0.12 From 6c6972cd99ea8a350b2ec495f4051c12c20153af Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Tue, 16 Mar 2010 16:03:24 +0100 Subject: Speed up various QFontMetrics functions Use QStackTextEngine to avoid heap allocations. Reviewed-by: Lars --- src/gui/text/qfontmetrics.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp index 41d0af1..13a5704 100644 --- a/src/gui/text/qfontmetrics.cpp +++ b/src/gui/text/qfontmetrics.cpp @@ -533,7 +533,7 @@ int QFontMetrics::width(const QString &text, int len) const if (len == 0) return 0; - QTextEngine layout(text, d.data()); + QStackTextEngine layout(text, d.data()); layout.ignoreBidi = true; return qRound(layout.width(0, len)); } @@ -609,7 +609,7 @@ int QFontMetrics::charWidth(const QString &text, int pos) const int from = qMax(0, pos - 8); int to = qMin(text.length(), pos + 8); QString cstr = QString::fromRawData(text.unicode() + from, to - from); - QTextEngine layout(cstr, d.data()); + QStackTextEngine layout(cstr, d.data()); layout.ignoreBidi = true; layout.itemize(); width = qRound(layout.width(pos-from, 1)); @@ -658,7 +658,7 @@ QRect QFontMetrics::boundingRect(const QString &text) const if (text.length() == 0) return QRect(); - QTextEngine layout(text, d.data()); + QStackTextEngine layout(text, d.data()); layout.ignoreBidi = true; layout.itemize(); glyph_metrics_t gm = layout.boundingBox(0, text.length()); @@ -828,7 +828,7 @@ QRect QFontMetrics::tightBoundingRect(const QString &text) const if (text.length() == 0) return QRect(); - QTextEngine layout(text, d.data()); + QStackTextEngine layout(text, d.data()); layout.ignoreBidi = true; layout.itemize(); glyph_metrics_t gm = layout.tightBoundingBox(0, text.length()); @@ -1370,7 +1370,7 @@ qreal QFontMetricsF::width(const QString &text) const int pos = text.indexOf(QLatin1Char('\x9c')); int len = (pos != -1) ? pos : text.length(); - QTextEngine layout(text, d.data()); + QStackTextEngine layout(text, d.data()); layout.ignoreBidi = true; layout.itemize(); return layout.width(0, len).toReal(); @@ -1447,7 +1447,7 @@ QRectF QFontMetricsF::boundingRect(const QString &text) const if (len == 0) return QRectF(); - QTextEngine layout(text, d.data()); + QStackTextEngine layout(text, d.data()); layout.ignoreBidi = true; layout.itemize(); glyph_metrics_t gm = layout.boundingBox(0, len); @@ -1620,7 +1620,7 @@ QRectF QFontMetricsF::tightBoundingRect(const QString &text) const if (text.length() == 0) return QRect(); - QTextEngine layout(text, d.data()); + QStackTextEngine layout(text, d.data()); layout.ignoreBidi = true; layout.itemize(); glyph_metrics_t gm = layout.tightBoundingBox(0, text.length()); -- cgit v0.12 From d99a6792fb4b4ce14f588e7f2c63841dcb28e56f Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Wed, 17 Mar 2010 08:15:52 +1000 Subject: Fix OpenGL2 paint engine compilation issue Reviewed-by: Daniel Pope --- src/opengl/gl2paintengineex/qglengineshadermanager_p.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h index d8be4c9..06b96ae 100644 --- a/src/opengl/gl2paintengineex/qglengineshadermanager_p.h +++ b/src/opengl/gl2paintengineex/qglengineshadermanager_p.h @@ -401,7 +401,7 @@ public: bool useTextureCoords; bool useOpacityAttribute; - bool usePmvMatrix; + bool usePmvMatrixAttribute; bool operator==(const QGLEngineShaderProg& other) { // We don't care about the program -- cgit v0.12 From 111708e655d66fb0dcbc4f2cbdc2abf14c700cf4 Mon Sep 17 00:00:00 2001 From: Alexis Menard Date: Wed, 17 Mar 2010 00:11:55 +0100 Subject: Fix the QPrintDialog showing a popup with nothing. QPrintDialog uses QFileSystemModel with QCompleter. In that case with the 4.7 version of QCompleter it was trying to complete stuff even if the prefix was empty. I also fixed QPrintDialog, it was using QFSCompleter which didn't work in QPrintDialog (QFSCompleter is designed for QFileDialog). Now it uses a regular QCompleter. Task-number:QTBUG-8556 Reviewed-by:trond --- src/gui/dialogs/qprintdialog_unix.cpp | 4 +--- src/gui/util/qcompleter.cpp | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/gui/dialogs/qprintdialog_unix.cpp b/src/gui/dialogs/qprintdialog_unix.cpp index 17283f5..9b4d6e8 100644 --- a/src/gui/dialogs/qprintdialog_unix.cpp +++ b/src/gui/dialogs/qprintdialog_unix.cpp @@ -706,9 +706,7 @@ QUnixPrintWidgetPrivate::QUnixPrintWidgetPrivate(QUnixPrintWidget *p) #ifndef QT_NO_FILESYSTEMMODEL QFileSystemModel *fsm = new QFileSystemModel(widget.filename); fsm->setRootPath(QDir::homePath()); -#if !defined(QT_NO_FSCOMPLETER) && !defined(QT_NO_FILEDIALOG) - widget.filename->setCompleter(new QFSCompleter(fsm, widget.filename)); -#endif + widget.filename->setCompleter(new QCompleter(fsm, widget.filename)); #endif _q_printerChanged(currentPrinterIndex); diff --git a/src/gui/util/qcompleter.cpp b/src/gui/util/qcompleter.cpp index b7be967..387bf87 100644 --- a/src/gui/util/qcompleter.cpp +++ b/src/gui/util/qcompleter.cpp @@ -907,7 +907,7 @@ void QCompleterPrivate::_q_fileSystemModelDirectoryLoaded(const QString &path) { Q_Q(QCompleter); //the path given by QFileSystemModel does not end with / - if (q->completionPrefix() != path + QLatin1Char('/')) + if (!q->completionPrefix().isEmpty() && q->completionPrefix() != path + QLatin1Char('/')) q->complete(); } -- cgit v0.12