From f0f6c1d0edd8c71530b8e47b61d70aa55a0c6a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Martins?= Date: Wed, 8 Jan 2014 20:19:59 +0000 Subject: Fix evdevtouch build with -qtnamespace Change-Id: Ibac69cfa44eff33d8cc172fc16cf105fff4c12b1 Reviewed-by: Giuseppe D'Angelo Reviewed-by: Robin Burchell --- src/platformsupport/input/evdevtouch/qevdevtouch_p.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/platformsupport/input/evdevtouch/qevdevtouch_p.h b/src/platformsupport/input/evdevtouch/qevdevtouch_p.h index dbd401c297..d0ea839f51 100644 --- a/src/platformsupport/input/evdevtouch/qevdevtouch_p.h +++ b/src/platformsupport/input/evdevtouch/qevdevtouch_p.h @@ -48,13 +48,14 @@ #include #include +#if !defined(QT_NO_MTDEV) +struct mtdev; +#endif + QT_BEGIN_NAMESPACE class QSocketNotifier; class QEvdevTouchScreenData; -#if !defined(QT_NO_MTDEV) -struct mtdev; -#endif class QEvdevTouchScreenHandler : public QObject { -- cgit v1.2.3 From 131a511194935554357972c99c325c7202077560 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 7 Jan 2014 10:55:49 +0200 Subject: Ensure that the Qt5Core library does not contain "QTMETADATA ". In the event the plugin loader encounters it due to some configuration problem, it is otherwise detected as a plugin causing a crash when trying to read the meta data. Task-number: QTBUG-35970 Change-Id: I34182b3a61125e3b192dfd4b1dc03bd1e98c693e Reviewed-by: Lars Knoll --- src/corelib/plugin/qlibrary.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index 77de4d594e..468f759189 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -256,7 +256,8 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib) */ bool hasMetaData = false; long pos = 0; - const char pattern[] = "QTMETADATA "; + char pattern[] = "qTMETADATA "; + pattern[0] = 'Q'; // Ensure the pattern "QTMETADATA" is not found in this library should QPluginLoader ever encounter it. const ulong plen = qstrlen(pattern); #if defined (Q_OF_ELF) && defined(Q_CC_GNU) int r = QElfParser().parse(filedata, fdlen, library, lib, &pos, &fdlen); -- cgit v1.2.3 From b4c28856f16c164a5a774722a379bbe34a45527c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 9 Jan 2014 09:33:17 +0100 Subject: Windows: Silence warning in QWindowsFileDialogHelper::selectFile(). The function is invoked from the QFileDialog constructor in save file mode when passing a non-existing file. Task-number: QTBUG-35703 Change-Id: I5c13efb9b6789404b28739f6ce88ed87b594b6e4 Reviewed-by: Joerg Bornemann --- src/plugins/platforms/windows/qwindowsdialoghelpers.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp index 7ba48fe0cb..497d0975af 100644 --- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp @@ -1633,8 +1633,8 @@ void QWindowsFileDialogHelper::selectFile(const QUrl &fileName) if (QWindowsContext::verboseDialogs) qDebug("%s %s" , __FUNCTION__, qPrintable(fileName.toString())); - if (QWindowsNativeFileDialogBase *nfd = nativeFileDialog()) - nfd->selectFile(fileName.toLocalFile()); // ## should use QUrl::fileName() once it exists + if (hasNativeDialog()) // Might be invoked from the QFileDialog constructor. + nativeFileDialog()->selectFile(fileName.toLocalFile()); // ## should use QUrl::fileName() once it exists } QList QWindowsFileDialogHelper::selectedFiles() const -- cgit v1.2.3 From 08127d93b4ffad36d66e53ff754e3d9a354d00b5 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 7 Jan 2014 15:23:01 +0100 Subject: don't make msvc see digraphs Task-number: QTBUG-35816 Change-Id: I996a86233f771d6a466c5c5eb6116df14cd00dbd Reviewed-by: Olivier Goffart Reviewed-by: Stephen Kelly Reviewed-by: Marc Mutz --- src/corelib/global/qtypeinfo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h index 58736ac2b8..5837c8d94e 100644 --- a/src/corelib/global/qtypeinfo.h +++ b/src/corelib/global/qtypeinfo.h @@ -207,7 +207,7 @@ Q_DECLARE_TYPEINFO_BODY(QFlags, Q_PRIMITIVE_TYPE); #define Q_DECLARE_SHARED_STL(TYPE) \ QT_END_NAMESPACE \ namespace std { \ - template<> inline void swap(QT_PREPEND_NAMESPACE(TYPE) &value1, QT_PREPEND_NAMESPACE(TYPE) &value2) \ + template<> inline void swap< QT_PREPEND_NAMESPACE(TYPE) >(QT_PREPEND_NAMESPACE(TYPE) &value1, QT_PREPEND_NAMESPACE(TYPE) &value2) \ { value1.swap(value2); } \ } \ QT_BEGIN_NAMESPACE -- cgit v1.2.3 From 7c03f00a4ea6da72e0064ecb659c4c4bc3c8083b Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Mon, 6 Jan 2014 17:30:45 +0100 Subject: GTK FileDialog: don't convert QUrl to QString prematurely File dialog APIs are being converted to QUrls as much as possible. Task-number: QTBUG-35947 Task-number: QTBUG-35948 Change-Id: I98d86249ac5018c3b7439065ae6ad7f1c7422a08 Reviewed-by: Frederik Gladhorn --- src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp index e8758da1c7..f85fe0839f 100644 --- a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp +++ b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp @@ -419,12 +419,11 @@ void QGtk2FileDialogHelper::applyOptions() if (!nameFilters.isEmpty()) setNameFilters(nameFilters); - const QString initialDirectory = opts->initialDirectory().toLocalFile(); - if (!initialDirectory.isEmpty()) - setDirectory(initialDirectory); + if (opts->initialDirectory().isLocalFile()) + setDirectory(opts->initialDirectory()); foreach (const QUrl &filename, opts->initiallySelectedFiles()) - selectFile(filename.toLocalFile()); + selectFile(filename); const QString initialNameFilter = opts->initiallySelectedNameFilter(); if (!initialNameFilter.isEmpty()) -- cgit v1.2.3 From 62c4e288a11769bde45c9c74d731ed8628303f19 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Thu, 9 Jan 2014 10:48:41 +0100 Subject: Mitigate performance regression in isExpandedEntityValueTooLarge(). 46a8885ae486e238a39efa5119c2714f328b08e4 fixed a security issue [1], but also caused a large performance regression. This patch improves the performance from ~98 seconds to ~.1 second for 1000 entities, using the benchmark in the bug report: "0": 0 msecs per iteration (total: 0, iterations: 1) "250": 1,547 msecs per iteration (total: 1,547, iterations: 1) "500": 12,254 msecs per iteration (total: 12,254, iterations: 1) "750": 45,506 msecs per iteration (total: 45,506, iterations: 1) "1000": 98,112 msecs per iteration (total: 98,112, iterations: 1) "0": 0 msecs per iteration (total: 0, iterations: 1) "250": 6 msecs per iteration (total: 6, iterations: 1) "500": 25 msecs per iteration (total: 25, iterations: 1) "750": 58 msecs per iteration (total: 58, iterations: 1) "1000": 102 msecs per iteration (total: 102, iterations: 1) [1] http://lists.qt-project.org/pipermail/announce/2013-December/000036.html Task-number: QTBUG-35919 Change-Id: I6a6a1a6b606a8033a8f66e294cb55bbd8bdb8a03 Reviewed-by: Richard J. Moore --- src/xml/sax/qxml.cpp | 85 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 28 deletions(-) diff --git a/src/xml/sax/qxml.cpp b/src/xml/sax/qxml.cpp index f3a1e479f2..1b05e049f1 100644 --- a/src/xml/sax/qxml.cpp +++ b/src/xml/sax/qxml.cpp @@ -44,6 +44,7 @@ #include "qbuffer.h" #include "qregexp.h" #include "qmap.h" +#include "qhash.h" #include "qstack.h" #include @@ -424,6 +425,10 @@ private: int stringValueLen; QString emptyStr; + QHash literalEntitySizes; + // The entity at (QMap) times. + QHash > referencesToOtherEntities; + QHash expandedSizes; // The limit to the amount of times the DTD parsing functions can be called // for the DTD currently being parsed. static const int dtdRecursionLimit = 2; @@ -3444,6 +3449,10 @@ bool QXmlSimpleReader::parse(const QXmlInputSource *input, bool incremental) { Q_D(QXmlSimpleReader); + d->literalEntitySizes.clear(); + d->referencesToOtherEntities.clear(); + d->expandedSizes.clear(); + if (incremental) { d->initIncrementalParsing(); } else { @@ -6659,43 +6668,63 @@ bool QXmlSimpleReaderPrivate::parseChoiceSeq() bool QXmlSimpleReaderPrivate::isExpandedEntityValueTooLarge(QString *errorMessage) { - QMap literalEntitySizes; - // The entity at (QMap) times. - QMap > referencesToOtherEntities; - QMap expandedSizes; + QString entityNameBuffer; // For every entity, check how many times all entity names were referenced in its value. - foreach (QString toSearch, entities.keys()) { - // The amount of characters that weren't entity names, but literals, like 'X'. - QString leftOvers = entities.value(toSearch); - // How many times was entityName referenced by toSearch? - foreach (QString entityName, entities.keys()) { - for (int i = 0; i < leftOvers.size() && i != -1; ) { - i = leftOvers.indexOf(QString::fromLatin1("&%1;").arg(entityName), i); - if (i != -1) { - leftOvers.remove(i, entityName.size() + 2); - // The entityName we're currently trying to find was matched in this string; increase our count. - ++referencesToOtherEntities[toSearch][entityName]; + for (QMap::const_iterator toSearchIt = entities.constBegin(); + toSearchIt != entities.constEnd(); + ++toSearchIt) { + const QString &toSearch = toSearchIt.key(); + + // Don't check the same entities twice. + if (!literalEntitySizes.contains(toSearch)) { + // The amount of characters that weren't entity names, but literals, like 'X'. + QString leftOvers = entities.value(toSearch); + // How many times was entityName referenced by toSearch? + for (QMap::const_iterator referencedIt = entities.constBegin(); + referencedIt != entities.constEnd(); + ++referencedIt) { + const QString &entityName = referencedIt.key(); + + for (int i = 0; i < leftOvers.size() && i != -1; ) { + entityNameBuffer = QLatin1Char('&') + entityName + QLatin1Char(';'); + + i = leftOvers.indexOf(entityNameBuffer, i); + if (i != -1) { + leftOvers.remove(i, entityName.size() + 2); + // The entityName we're currently trying to find was matched in this string; increase our count. + ++referencesToOtherEntities[toSearch][entityName]; + } } } + literalEntitySizes[toSearch] = leftOvers.size(); } - literalEntitySizes[toSearch] = leftOvers.size(); } - foreach (QString entity, referencesToOtherEntities.keys()) { - expandedSizes[entity] = literalEntitySizes[entity]; - foreach (QString referenceTo, referencesToOtherEntities.value(entity).keys()) { - const int references = referencesToOtherEntities.value(entity).value(referenceTo); - // The total size of an entity's value is the expanded size of all of its referenced entities, plus its literal size. - expandedSizes[entity] += expandedSizes[referenceTo] * references + literalEntitySizes[referenceTo] * references; - } + for (QHash >::const_iterator entityIt = referencesToOtherEntities.constBegin(); + entityIt != referencesToOtherEntities.constEnd(); + ++entityIt) { + const QString &entity = entityIt.key(); + + QHash::iterator expandedIt = expandedSizes.find(entity); + if (expandedIt == expandedSizes.end()) { + expandedIt = expandedSizes.insert(entity, literalEntitySizes.value(entity)); + for (QHash::const_iterator referenceIt = entityIt->constBegin(); + referenceIt != entityIt->constEnd(); + ++referenceIt) { + const QString &referenceTo = referenceIt.key(); + const int references = referencesToOtherEntities.value(entity).value(referenceTo); + // The total size of an entity's value is the expanded size of all of its referenced entities, plus its literal size. + *expandedIt += expandedSizes.value(referenceTo) * references + literalEntitySizes.value(referenceTo) * references; + } - if (expandedSizes[entity] > entityCharacterLimit) { - if (errorMessage) { - *errorMessage = QString::fromLatin1("The XML entity \"%1\" expands too a string that is too large to process (%2 characters > %3)."); - *errorMessage = (*errorMessage).arg(entity).arg(expandedSizes[entity]).arg(entityCharacterLimit); + if (*expandedIt > entityCharacterLimit) { + if (errorMessage) { + *errorMessage = QString::fromLatin1("The XML entity \"%1\" expands to a string that is too large to process (%2 characters > %3).") + .arg(entity, *expandedIt, entityCharacterLimit); + } + return true; } - return true; } } return false; -- cgit v1.2.3 From c07c9bcf4a645df3a7ec400ec8fe1298129eff79 Mon Sep 17 00:00:00 2001 From: John Layt Date: Sun, 29 Dec 2013 20:25:30 +0100 Subject: QPdfPaintEngine - Remove postscript flag Remove a now unneeded postscript flag. Change-Id: I307e4a64aa7ba4eed396530ffbf3bca5ae73e9c2 Reviewed-by: Gunnar Sletta --- src/gui/painting/qpdf.cpp | 6 ++---- src/gui/painting/qpdf_p.h | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp index c05f47c59d..147fa3f561 100644 --- a/src/gui/painting/qpdf.cpp +++ b/src/gui/painting/qpdf.cpp @@ -1486,7 +1486,6 @@ QPdfEnginePrivate::QPdfEnginePrivate() leftMargin(10), topMargin(10), rightMargin(10), bottomMargin(10) // ~3.5 mm { resolution = 1200; - postscript = false; currentObject = 1; currentPage = 0; stroker.stream = 0; @@ -1520,7 +1519,6 @@ bool QPdfEngine::begin(QPaintDevice *pdev) d->ownsDevice = true; } - d->postscript = false; d->currentObject = 1; d->currentPage = new QPdfPage; @@ -2506,8 +2504,8 @@ void QPdfEnginePrivate::drawTextItem(const QPointF &p, const QTextItemInt &ti) QFontEngine::FaceId face_id = fe->faceId(); bool noEmbed = false; if (face_id.filename.isEmpty() - || (!postscript && ((fe->fsType & 0x200) /* bitmap embedding only */ - || (fe->fsType == 2) /* no embedding allowed */))) { + || fe->fsType & 0x200 /* bitmap embedding only */ + || fe->fsType == 2 /* no embedding allowed */) { *currentPage << "Q\n"; q->QPaintEngine::drawTextItem(p, ti); *currentPage << "q\n"; diff --git a/src/gui/painting/qpdf_p.h b/src/gui/painting/qpdf_p.h index 54530d0f78..ae2d4b00ac 100644 --- a/src/gui/painting/qpdf_p.h +++ b/src/gui/painting/qpdf_p.h @@ -250,7 +250,6 @@ public: void newPage(); - bool postscript; int currentObject; QPdfPage* currentPage; -- cgit v1.2.3 From d76f05e955205c3764dd184a8583ed785fc51b33 Mon Sep 17 00:00:00 2001 From: John Layt Date: Sat, 28 Dec 2013 12:02:43 +0100 Subject: QPdfWriter - Fix setting of margins The setting of margins wasn't being passed to the base class, so calling margins() wouldn't return the new values. Change-Id: I86c30f28fb0430f4b9d6e180a59cad354b489289 Reviewed-by: Gunnar Sletta --- src/gui/painting/qpdfwriter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/painting/qpdfwriter.cpp b/src/gui/painting/qpdfwriter.cpp index a783aad66a..27fb8b1646 100644 --- a/src/gui/painting/qpdfwriter.cpp +++ b/src/gui/painting/qpdfwriter.cpp @@ -209,6 +209,8 @@ void QPdfWriter::setMargins(const Margins &m) { Q_D(QPdfWriter); + QPagedPaintDevice::setMargins(m); + const qreal multiplier = 72./25.4; d->engine->d_func()->leftMargin = m.left*multiplier; d->engine->d_func()->rightMargin = m.right*multiplier; -- cgit v1.2.3 From c8a8e0fb18c7c7cb6cf445dc9595eaf69f3cd126 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Mon, 6 Jan 2014 14:04:32 +0100 Subject: zlib: rename z_errmsg symbol to avoid name clash when linking statically Task-number: QTBUG-35301 Change-Id: I298fba7270ee49d4e2dfc624b18aa13ce25864be Reviewed-by: Konstantin Ritt Reviewed-by: aavit Reviewed-by: Oswald Buddenhagen --- src/3rdparty/zlib/zconf.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/3rdparty/zlib/zconf.h b/src/3rdparty/zlib/zconf.h index dc52489bc2..d01f20bc07 100644 --- a/src/3rdparty/zlib/zconf.h +++ b/src/3rdparty/zlib/zconf.h @@ -107,6 +107,7 @@ # define zcfree z_zcfree # define zlibCompileFlags z_zlibCompileFlags # define zlibVersion z_zlibVersion +# define z_errmsg z_z_errmsg /* all zlib typedefs in zlib.h and zconf.h */ # define Byte z_Byte -- cgit v1.2.3 From eaedc04d90fdfc28cc9de96a32635bf327769086 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 13 Dec 2013 15:34:29 -0800 Subject: Autotest: Fix QDateTime failure if the test got run West of Greenwich There was a comment about the test failing for max() because of an overflow. That happens if you're at UTC or ahead of it (to the East of the Prime Meridian), which is how this test usually gets run (UTC, Europe/Oslo, Europe/Helsinki, Pacific/Auckland). But if you're behind UTC (to the West of the Prime Meridian), then the overflow happens for min(). Change-Id: Iebba49d1303e9f18f5038f5cf23c77bf83e5fd4b Reviewed-by: Robin Burchell --- .../auto/corelib/tools/qdatetime/tst_qdatetime.cpp | 44 +++++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp index 6c80c5ff47..5d1fe0784f 100644 --- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp @@ -61,6 +61,7 @@ public: static QString str( int y, int month, int d, int h, int min, int s ); static QDateTime dt( const QString& str ); public slots: + void initTestCase(); void init(); private slots: void ctor(); @@ -150,6 +151,7 @@ private slots: void invalid() const; private: + enum { LocalTimeIsUtc = 0, LocalTimeAheadOfUtc = 1, LocalTimeBehindUtc = -1} localTimeType; bool europeanTimeZone; QDate defDate() const { return QDate(1900, 1, 1); } QTime defTime() const { return QTime(0, 0, 0); } @@ -169,6 +171,42 @@ tst_QDateTime::tst_QDateTime() uint x1 = QDateTime(QDate(1990, 1, 1), QTime()).toTime_t(); uint x2 = QDateTime(QDate(1990, 6, 1), QTime()).toTime_t(); europeanTimeZone = (x1 == 631148400 && x2 == 644191200); + + QDateTime dt1 = QDateTime::fromTime_t(0); + QDateTime dt2 = QDateTime::fromTime_t(181 * 86400); // six months later, Jul 1 + if (dt1.date().year() < 1970 || dt2.date().month() < 7) { + localTimeType = LocalTimeBehindUtc; + } else if (dt1.time().hour() > 0 || dt1.date().day() > 1) { + localTimeType = LocalTimeAheadOfUtc; + } else if (dt2.time().hour() > 0 || dt2.date().day() > 1) { + localTimeType = LocalTimeAheadOfUtc; + } else { + localTimeType = LocalTimeIsUtc; + } +} + +void tst_QDateTime::initTestCase() +{ + // Never construct a message like this in an i18n context... + const char *typemsg1, *typemsg2 = "and therefore not"; + switch (localTimeType) { + case LocalTimeIsUtc: + typemsg1 = "exactly"; + break; + case LocalTimeBehindUtc: + typemsg1 = "behind"; + break; + case LocalTimeAheadOfUtc: + typemsg1 = "ahead of"; + typemsg2 = europeanTimeZone ? "and is" : "but isn't"; + break; + } + + qDebug() << "Current local time detected to be" + << typemsg1 + << "UTC" + << typemsg2 + << "the Central European timezone"; } void tst_QDateTime::init() @@ -610,8 +648,10 @@ void tst_QDateTime::fromMSecsSinceEpoch() QDateTime dtUtc = QDateTime::fromMSecsSinceEpoch(msecs, Qt::UTC); QDateTime dtOffset = QDateTime::fromMSecsSinceEpoch(msecs, Qt::OffsetFromUTC, 60*60); - // LocalTime will overflow for max - if (msecs != std::numeric_limits::max()) + // LocalTime will overflow for min or max, depending on whether you're + // East or West of Greenwich. The test passes at GMT. + if (localTimeType == LocalTimeIsUtc + || msecs != std::numeric_limits::max() * localTimeType) QCOMPARE(dtLocal, utc); QCOMPARE(dtUtc, utc); -- cgit v1.2.3 From bbcdfb324b473373d37c005e2e005f0870cc74ce Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 20 Dec 2013 10:44:03 -0800 Subject: Fix file descriptor leak in the perf event counter We opened the counter at every start(), even if we had already started before. Some of the benchlib's options caused it to start() and stop() over and over again, like -minimumvalue and -minimumtotal, which could leak to fd exhaustion (EMFILE). Change-Id: Ifeb7cca65c758877be600dc22928bea74f499934 Reviewed-by: Robin Burchell Reviewed-by: Jason McDonald --- src/testlib/qbenchmarkperfevents.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/testlib/qbenchmarkperfevents.cpp b/src/testlib/qbenchmarkperfevents.cpp index acc11b09ac..30a0d3ea9c 100644 --- a/src/testlib/qbenchmarkperfevents.cpp +++ b/src/testlib/qbenchmarkperfevents.cpp @@ -515,16 +515,18 @@ void QBenchmarkPerfEventsMeasurer::start() { initPerf(); - // pid == 0 -> attach to the current process - // cpu == -1 -> monitor on all CPUs - // group_fd == -1 -> this is the group leader - // flags == 0 -> reserved, must be zero - fd = perf_event_open(&attr, 0, -1, -1, 0); if (fd == -1) { - perror("QBenchmarkPerfEventsMeasurer::start: perf_event_open"); - exit(1); - } else { - ::fcntl(fd, F_SETFD, FD_CLOEXEC); + // pid == 0 -> attach to the current process + // cpu == -1 -> monitor on all CPUs + // group_fd == -1 -> this is the group leader + // flags == 0 -> reserved, must be zero + fd = perf_event_open(&attr, 0, -1, -1, 0); + if (fd == -1) { + perror("QBenchmarkPerfEventsMeasurer::start: perf_event_open"); + exit(1); + } else { + ::fcntl(fd, F_SETFD, FD_CLOEXEC); + } } // enable the counter -- cgit v1.2.3 From f4d3196e4f5d2f89f2d6564157402a78d454cca2 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 3 Jan 2014 13:58:13 -0200 Subject: Fix function-not-used warnings detected by Clang 3.4 These functions have been turned to static (although inline), which means they need to be used or marked as possibly unused. qglobal.h:712:37: error: unused function 'qFuzzyCompare' [-Werror,-Wunused-function] Change-Id: Ie2ee713d26c86e0574b579c1ea42b9404c3d2035 Reviewed-by: Oswald Buddenhagen --- src/corelib/global/qglobal.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 6ec244dbee..9db48354b3 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -706,13 +706,13 @@ typedef void (*QFunctionPointer)(); # define Q_UNIMPLEMENTED() qWarning("%s:%d: %s: Unimplemented code.", __FILE__, __LINE__, Q_FUNC_INFO) #endif -Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) Q_REQUIRED_RESULT; +Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) Q_REQUIRED_RESULT Q_DECL_UNUSED; Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) { return (qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2))); } -Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) Q_REQUIRED_RESULT; +Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) Q_REQUIRED_RESULT Q_DECL_UNUSED; Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) { return (qAbs(p1 - p2) * 100000.f <= qMin(qAbs(p1), qAbs(p2))); @@ -721,7 +721,7 @@ Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) /*! \internal */ -Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d) Q_REQUIRED_RESULT; +Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d) Q_REQUIRED_RESULT Q_DECL_UNUSED; Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d) { return qAbs(d) <= 0.000000000001; @@ -730,7 +730,7 @@ Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(double d) /*! \internal */ -Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f) Q_REQUIRED_RESULT; +Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f) Q_REQUIRED_RESULT Q_DECL_UNUSED; Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f) { return qAbs(f) <= 0.00001f; @@ -741,7 +741,7 @@ Q_DECL_CONSTEXPR static inline bool qFuzzyIsNull(float f) check whether the actual value is 0 or close to 0, but whether it is binary 0, disregarding sign. */ -static inline bool qIsNull(double d) Q_REQUIRED_RESULT; +static inline bool qIsNull(double d) Q_REQUIRED_RESULT Q_DECL_UNUSED; static inline bool qIsNull(double d) { union U { @@ -758,7 +758,7 @@ static inline bool qIsNull(double d) check whether the actual value is 0 or close to 0, but whether it is binary 0, disregarding sign. */ -static inline bool qIsNull(float f) Q_REQUIRED_RESULT; +static inline bool qIsNull(float f) Q_REQUIRED_RESULT Q_DECL_UNUSED; static inline bool qIsNull(float f) { union U { -- cgit v1.2.3 From 17da13baaa9b86d0e77383e3796f80e8ac5700f9 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 3 Jan 2014 14:21:32 -0200 Subject: Fix unused function warnings in qtriangulator.cpp qIntersectionPoint with ints wasn't used, qDot was only used in debug mode. Found by Clang 3.4. Change-Id: I4b5699f75eb88331df54bf5a289133914d80b299 Reviewed-by: Robin Burchell Reviewed-by: Gunnar Sletta --- src/gui/opengl/qtriangulator.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/gui/opengl/qtriangulator.cpp b/src/gui/opengl/qtriangulator.cpp index 77da009bf5..839ec9e96f 100644 --- a/src/gui/opengl/qtriangulator.cpp +++ b/src/gui/opengl/qtriangulator.cpp @@ -201,10 +201,12 @@ static inline qint64 qCross(const QPodPoint &u, const QPodPoint &v) return qint64(u.x) * qint64(v.y) - qint64(u.y) * qint64(v.x); } +#ifdef Q_TRIANGULATOR_DEBUG static inline qint64 qDot(const QPodPoint &u, const QPodPoint &v) { return qint64(u.x) * qint64(v.x) + qint64(u.y) * qint64(v.y); } +#endif // Return positive value if 'p' is to the right of the line 'v1'->'v2', negative if left of the // line and zero if exactly on the line. @@ -249,13 +251,6 @@ static inline QIntersectionPoint qIntersectionPoint(const QPodPoint &point) return p; } -static inline QIntersectionPoint qIntersectionPoint(int x, int y) -{ - // upperLeft = (x, y), xOffset = 0/1, yOffset = 0/1. - QIntersectionPoint p = {{x, y}, {0, 1}, {0, 1}}; - return p; -} - static QIntersectionPoint qIntersectionPoint(const QPodPoint &u1, const QPodPoint &u2, const QPodPoint &v1, const QPodPoint &v2) { QIntersectionPoint result = {{0, 0}, {0, 0}, {0, 0}}; -- cgit v1.2.3 From 52441ecd44d1feb049a152d5e585e89a910a5cd2 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 3 Jan 2014 14:26:55 -0200 Subject: Remove unused member m_eglApi It's not used anywhere. Found by Clang 3.4: qeglplatformcontext_p.h:80:13: error: private field 'm_eglApi' is not used [-Werror,-Wunused-private-field] Change-Id: I37ce240a9d07ef570e0814de366dbb7cd13ad714 Reviewed-by: Robin Burchell --- src/platformsupport/eglconvenience/qeglplatformcontext.cpp | 4 ++-- src/platformsupport/eglconvenience/qeglplatformcontext_p.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/platformsupport/eglconvenience/qeglplatformcontext.cpp b/src/platformsupport/eglconvenience/qeglplatformcontext.cpp index 714ad8a17e..716b01b4d9 100644 --- a/src/platformsupport/eglconvenience/qeglplatformcontext.cpp +++ b/src/platformsupport/eglconvenience/qeglplatformcontext.cpp @@ -71,19 +71,19 @@ static inline void bindApi(const QSurfaceFormat &format) QEGLPlatformContext::QEGLPlatformContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display, EGLenum eglApi) : m_eglDisplay(display) - , m_eglApi(eglApi) , m_eglConfig(q_configFromGLFormat(display, format)) { init(format, share); + Q_UNUSED(eglApi); } QEGLPlatformContext::QEGLPlatformContext(const QSurfaceFormat &format, QPlatformOpenGLContext *share, EGLDisplay display, EGLConfig config, EGLenum eglApi) : m_eglDisplay(display) - , m_eglApi(eglApi) , m_eglConfig(config) { init(format, share); + Q_UNUSED(eglApi); } void QEGLPlatformContext::init(const QSurfaceFormat &format, QPlatformOpenGLContext *share) diff --git a/src/platformsupport/eglconvenience/qeglplatformcontext_p.h b/src/platformsupport/eglconvenience/qeglplatformcontext_p.h index 952f5a856a..7c05894246 100644 --- a/src/platformsupport/eglconvenience/qeglplatformcontext_p.h +++ b/src/platformsupport/eglconvenience/qeglplatformcontext_p.h @@ -77,7 +77,6 @@ private: EGLContext m_eglContext; EGLContext m_shareContext; EGLDisplay m_eglDisplay; - EGLenum m_eglApi; EGLConfig m_eglConfig; QSurfaceFormat m_format; }; -- cgit v1.2.3 From 47a0d64dcf1f3351e39d1dae8fc3a317ffc03c5e Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 3 Jan 2014 14:31:31 -0200 Subject: Fix QtWidget function-unused warnings found by Clang 3.4 qwidgetbackingstore.cpp:72:20: error: unused function 'qRectIntersects' [-Werror,-Wunused-function] Change-Id: Ia3afe8f0547fa86804093281db89efabe68b34a1 Reviewed-by: Robin Burchell --- src/widgets/kernel/qwidgetbackingstore.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/widgets/kernel/qwidgetbackingstore.cpp b/src/widgets/kernel/qwidgetbackingstore.cpp index 02fa80bef6..4a94cd6cb8 100644 --- a/src/widgets/kernel/qwidgetbackingstore.cpp +++ b/src/widgets/kernel/qwidgetbackingstore.cpp @@ -66,15 +66,6 @@ QT_BEGIN_NAMESPACE extern QRegion qt_dirtyRegion(QWidget *); -/* - A version of QRect::intersects() that does not normalize the rects. -*/ -static inline bool qRectIntersects(const QRect &r1, const QRect &r2) -{ - return (qMax(r1.left(), r2.left()) <= qMin(r1.right(), r2.right()) - && qMax(r1.top(), r2.top()) <= qMin(r1.bottom(), r2.bottom())); -} - /** * Flushes the contents of the \a backingStore into the screen area of \a widget. * \a tlwOffset is the position of the top level widget relative to the window surface. -- cgit v1.2.3 From e0a21c71f469f91843aa1250aec23e672778870d Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 9 Jan 2014 17:25:09 -0800 Subject: Don't check if a file exists before opening it If the file doesn't exist, open() will fail. But open() might fail even if the file exists(), which would lead to bad follow-up code. In any case, this saves one unnecessary stat(2). Change-Id: Ic99507c9dc07a4387ee6a4fe9c24830fca54e095 Reviewed-by: Robin Burchell --- .../platforminputcontexts/compose/generator/qtablegenerator.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp b/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp index dad34e121b..11545b16c3 100644 --- a/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp +++ b/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp @@ -227,8 +227,7 @@ QByteArray TableGenerator::readLocaleAliases(const QByteArray &locale) { QFile aliases(systemComposeDir() + QLatin1String("/locale.alias")); QByteArray fullLocaleName; - if (aliases.exists()) { - aliases.open(QIODevice::ReadOnly); + if (aliases.open(QIODevice::ReadOnly)) { while (!aliases.atEnd()) { char l[1024]; int read = aliases.readLine(l, sizeof(l)); @@ -267,8 +266,7 @@ QByteArray TableGenerator::readLocaleAliases(const QByteArray &locale) bool TableGenerator::processFile(QString composeFileName) { QFile composeFile(composeFileName); - if (composeFile.exists()) { - composeFile.open(QIODevice::ReadOnly); + if (composeFile.open(QIODevice::ReadOnly)) { parseComposeFile(&composeFile); return true; } -- cgit v1.2.3 From eb5c0f4b1266702c016b032e281bb92a3a642da6 Mon Sep 17 00:00:00 2001 From: Tasuku Suzuki Date: Tue, 26 Nov 2013 09:39:10 +0900 Subject: Make qtbase compile with QT_NO_XMLSTREAMWRITER Change-Id: I6d2447ba0875117e8a50d1aa3133bd5ea098d51a Reviewed-by: Oswald Buddenhagen --- src/tools/qdoc/qdoc.pro | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/tools/qdoc/qdoc.pro b/src/tools/qdoc/qdoc.pro index 55e32dd4a3..b020bfe9a4 100644 --- a/src/tools/qdoc/qdoc.pro +++ b/src/tools/qdoc/qdoc.pro @@ -1,3 +1,8 @@ +!force_bootstrap { + load(qfeatures) + requires(!contains(QT_DISABLED_FEATURES, xmlstreamwriter)) +} + option(host_build) QT = core xml -- cgit v1.2.3 From b088e4827f427189334e8a1c5b4f2b8b0b713fc2 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Tue, 5 Nov 2013 12:06:28 +0100 Subject: Fix bug on X11 with WA_TranslucentBackground and native child windows. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The native child windows need to inherit the parent's visual in order to have a translucent background as well. Surface with type QSurface::OpenGLSurface should not be forced to use the parent window's visual - the parent visual for instance, might not even be GL capable. Changing WA_TranslucentBackground during runtime is not supported, for two reasons: 1) Other platform plugins seem not to support it 2) It would require recreating X windows. Task-number: QTBUG-29625 Change-Id: Ic1474dd2de99069027481c7db6bf865f9b8d616d Reviewed-by: Jørgen Lind --- src/plugins/platforms/xcb/qxcbwindow.cpp | 6 +++++- src/widgets/kernel/qwidget_qpa.cpp | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index e2c6932992..f46bed77d6 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -280,8 +280,12 @@ void QXcbWindow::create() if (parent()) { xcb_parent_id = static_cast(parent())->xcb_window(); m_embedded = parent()->window()->type() == Qt::ForeignWindow; - } + QSurfaceFormat parentFormat = parent()->window()->requestedFormat(); + if (window()->surfaceType() != QSurface::OpenGLSurface && parentFormat.hasAlpha()) { + window()->setFormat(parentFormat); + } + } m_format = window()->requestedFormat(); #if (defined(XCB_USE_GLX) || defined(XCB_USE_EGL)) && defined(XCB_USE_XLIB) diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp index 3281e0c6f7..0fd794cc02 100644 --- a/src/widgets/kernel/qwidget_qpa.cpp +++ b/src/widgets/kernel/qwidget_qpa.cpp @@ -118,11 +118,12 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO win->resize(q->size()); win->setScreen(QGuiApplication::screens().value(topData()->screenIndex, 0)); - if (q->testAttribute(Qt::WA_TranslucentBackground)) { - QSurfaceFormat format; + QSurfaceFormat format = win->requestedFormat(); + if ((flags & Qt::Window) && win->surfaceType() != QSurface::OpenGLSurface + && q->testAttribute(Qt::WA_TranslucentBackground)) { format.setAlphaBufferSize(8); - win->setFormat(format); } + win->setFormat(format); if (QWidget *nativeParent = q->nativeParentWidget()) { if (nativeParent->windowHandle()) { -- cgit v1.2.3 From e1f89037c3a54f03ac69d231e34c6e3d816e2a93 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Fri, 10 Jan 2014 11:55:28 +0100 Subject: fix memory leaks in MSVC generators Change-Id: I11bfc8259ac4e175c9ecc37d64f1d2e5037f15aa Reviewed-by: Oswald Buddenhagen --- qmake/generators/win32/msbuild_objectmodel.cpp | 7 ++++--- qmake/generators/win32/msvc_objectmodel.cpp | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp index f5a6e15a7b..d1420e95f6 100644 --- a/qmake/generators/win32/msbuild_objectmodel.cpp +++ b/qmake/generators/win32/msbuild_objectmodel.cpp @@ -44,6 +44,7 @@ #include "msvc_objectmodel.h" #include "msvc_vcproj.h" #include "msvc_vcxproj.h" +#include #include #include @@ -1756,11 +1757,11 @@ void VCXProjectWriter::addFilters(VCProject &project, XmlOutput &xmlFilter, cons // outputs a given filter for all existing configurations of a project void VCXProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, XmlOutput &xmlFilter, const QString &filtername) { - XNode *root; + QScopedPointer root; if (project.SingleProjects.at(0).flat_files) - root = new XFlatNode; + root.reset(new XFlatNode); else - root = new XTreeNode; + root.reset(new XTreeNode); for (int i = 0; i < project.SingleProjects.count(); ++i) { VCFilter filter; diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp index 019bb2504d..8159cf58e2 100644 --- a/qmake/generators/win32/msvc_objectmodel.cpp +++ b/qmake/generators/win32/msvc_objectmodel.cpp @@ -42,6 +42,7 @@ #include "msvc_objectmodel.h" #include "msvc_vcproj.h" #include "msvc_vcxproj.h" +#include #include #include @@ -2854,11 +2855,11 @@ void VCProjectWriter::write(XmlOutput &xml, VCFilter &tool) // outputs a given filter for all existing configurations of a project void VCProjectWriter::outputFilter(VCProject &project, XmlOutput &xml, const QString &filtername) { - Node *root; + QScopedPointer root; if (project.SingleProjects.at(0).flat_files) - root = new FlatNode; + root.reset(new FlatNode); else - root = new TreeNode; + root.reset(new TreeNode); QString name, extfilter, guid; triState parse = unset; -- cgit v1.2.3 From 95984487586f0699829c35278efbc73e01bf3c23 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 9 Jan 2014 18:54:46 -0800 Subject: Remove #ifdef from outside test functions It's usually a bad idea to surround slots or signals with #ifdef since moc may not parse it the same way the compiler does. Change-Id: I6a3623ed7cb9fbc1b966df9d60f71b7fdf91acfe Reviewed-by: Olivier Goffart --- tests/auto/corelib/io/largefile/tst_largefile.cpp | 6 ++---- .../auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/tests/auto/corelib/io/largefile/tst_largefile.cpp b/tests/auto/corelib/io/largefile/tst_largefile.cpp index 88b4abe2e3..7564e3fc1f 100644 --- a/tests/auto/corelib/io/largefile/tst_largefile.cpp +++ b/tests/auto/corelib/io/largefile/tst_largefile.cpp @@ -121,9 +121,7 @@ private slots: // Map/unmap large file void mapFile(); -#ifndef Q_OS_MAC void mapOffsetOverflow(); -#endif void closeFile() { largeFile.close(); } @@ -513,9 +511,9 @@ void tst_LargeFile::mapFile() } //Mac: memory-mapping beyond EOF may succeed but it could generate bus error on access -#ifndef Q_OS_MAC void tst_LargeFile::mapOffsetOverflow() { +#ifndef Q_OS_MAC // Out-of-range mappings should fail, and not silently clip the offset for (int i = 50; i < 63; ++i) { uchar *address = 0; @@ -529,8 +527,8 @@ void tst_LargeFile::mapOffsetOverflow() address = largeFile.map(((qint64)1 << i) + blockSize, blockSize); QVERIFY( !address ); } -} #endif +} QTEST_APPLESS_MAIN(tst_LargeFile) #include "tst_largefile.moc" diff --git a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp index bd7bd3a464..493d7e20c5 100644 --- a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp +++ b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp @@ -120,10 +120,8 @@ private slots: void symetricConstructors(); void checkMultipleNames(); void checkMultipleCodes(); -#ifndef Q_OS_MAC void mnemonic_data(); void mnemonic(); -#endif void toString_data(); void toString(); void toStringFromKeycode_data(); @@ -144,10 +142,8 @@ private slots: void standardKeys_data(); void standardKeys(); void keyBindings(); -#if !defined (Q_OS_MAC) && !defined (Q_OS_WINCE) void translated_data(); void translated(); -#endif void i18nKeys_data(); void i18nKeys(); @@ -405,9 +401,11 @@ void tst_QKeySequence::keyBindings() QCOMPARE(bindings, expected); } -#ifndef Q_OS_MAC void tst_QKeySequence::mnemonic_data() { +#ifdef Q_OS_MAC + QSKIP("Test not applicable to Mac OS X"); +#endif QTest::addColumn("string"); QTest::addColumn("key"); QTest::addColumn("warning"); @@ -427,6 +425,7 @@ void tst_QKeySequence::mnemonic_data() void tst_QKeySequence::mnemonic() { +#ifndef Q_OS_MAC QFETCH(QString, string); QFETCH(QString, key); QFETCH(bool, warning); @@ -444,8 +443,8 @@ void tst_QKeySequence::mnemonic() QKeySequence res = QKeySequence(key); QCOMPARE(seq, res); -} #endif +} void tst_QKeySequence::toString_data() { @@ -734,9 +733,12 @@ void tst_QKeySequence::listFromString() QCOMPARE(QKeySequence::listFromString(strSequences), sequences); } -#if !defined (Q_OS_MAC) && !defined (Q_OS_WINCE) void tst_QKeySequence::translated_data() { +#if defined (Q_OS_MAC) || defined (Q_OS_WINCE) + QSKIP("Test not applicable"); +#endif + qApp->installTranslator(ourTranslator); qApp->installTranslator(qtTranslator); @@ -764,6 +766,7 @@ void tst_QKeySequence::translated_data() void tst_QKeySequence::translated() { +#if !defined (Q_OS_MAC) && !defined (Q_OS_WINCE) QFETCH(QString, transKey); QFETCH(QString, compKey); @@ -775,8 +778,8 @@ void tst_QKeySequence::translated() qApp->removeTranslator(ourTranslator); qApp->removeTranslator(qtTranslator); -} #endif +} void tst_QKeySequence::i18nKeys_data() { -- cgit v1.2.3 From c6b91576a6fbb45449261e48a72ad9a24e41bf3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Hunold?= Date: Tue, 7 Jan 2014 08:17:57 +0100 Subject: Use custom -I,-D and -L flags when building arch-test Needed for using alternate stdlib implementation like libc++ with clang. Change-Id: I1782f62f5e2ea95e6cff8a1ed646362c0a31645c Reviewed-by: Thiago Macieira Reviewed-by: Oswald Buddenhagen --- config.tests/unix/arch.test | 20 +++++++++++++++++++- configure | 4 ++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/config.tests/unix/arch.test b/config.tests/unix/arch.test index 529ed5e547..7b1c01ce28 100755 --- a/config.tests/unix/arch.test +++ b/config.tests/unix/arch.test @@ -19,6 +19,24 @@ fi LFLAGS="$SYSROOT_FLAG" CXXFLAGS="$SYSROOT_FLAG" +while [ "$#" -gt 0 ]; do + PARAM=$1 + case $PARAM in + -L*|-l*) + LFLAGS="$LFLAGS $PARAM" + ;; + -I*) + INC=`echo $PARAM | sed -e 's/^-I//'` + INCLUDEPATH="$INCLUDEPATH $INC" + ;; + -D*) + CXXFLAGS="$CXXFLAGS $PARAM" + ;; + *) ;; + esac + shift +done + # debuggery [ "$VERBOSE" = "yes" ] && echo "Determining architecture... ($*)" @@ -26,7 +44,7 @@ CXXFLAGS="$SYSROOT_FLAG" test -d "$OUTDIR/config.tests/arch" || mkdir -p "$OUTDIR/config.tests/arch" cd "$OUTDIR/config.tests/arch" [ -f Makefile ] && $MAKE distclean >/dev/null 2>&1 -OUTDIR=$OUTDIR "$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "QT_BUILD_TREE=$OUTDIR" "LIBS+=$LFLAGS" "QMAKE_CXXFLAGS+=$CXXFLAGS" "CONFIG-=app_bundle" "$SRCDIR/config.tests/arch/arch$PROSUFFIX.pro" >/dev/null 2>&1 || echo "qmake is broken" >&2 +OUTDIR=$OUTDIR "$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "QT_BUILD_TREE=$OUTDIR" "LIBS+=$LFLAGS" "QMAKE_CXXFLAGS+=$CXXFLAGS" "INCLUDEPATH+=$INCLUDEPATH" "CONFIG-=app_bundle" "$SRCDIR/config.tests/arch/arch$PROSUFFIX.pro" >/dev/null 2>&1 || echo "qmake is broken" >&2 ARCH="" diff --git a/configure b/configure index b16b79fa81..aaa59bdf17 100755 --- a/configure +++ b/configure @@ -4153,7 +4153,7 @@ compileTest() # Use config.tests/arch/arch.pro to have the compiler tell us what the target architecture is OUTFILE=$outpath/arch.result -"$unixtests/arch.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "target" +"$unixtests/arch.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "target" $I_FLAGS $D_FLAGS $L_FLAGS if [ $? -eq 0 ]; then eval `cat "$OUTFILE"` else @@ -4166,7 +4166,7 @@ rm -f "$OUTFILE" 2>/dev/null if [ "$QMAKESPEC" != "$XQMAKESPEC" ]; then # Do the same test again, using the host compiler - SYSROOT_FLAG= "$unixtests/arch.test" "$QMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "host" + SYSROOT_FLAG= "$unixtests/arch.test" "$QMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "host" $I_FLAGS $D_FLAGS $L_FLAGS if [ $? -eq 0 ]; then eval `cat "$OUTFILE"` else -- cgit v1.2.3 From 2dc04430baf4c38f3ee8b855236bbb1e3d60e946 Mon Sep 17 00:00:00 2001 From: Tasuku Suzuki Date: Tue, 31 Dec 2013 21:02:50 +0900 Subject: Make qtbase compile with QT_NO_DOM Change-Id: I98bef84ca9bf86bf7dddd3ca2a3d8210a8e46a16 Reviewed-by: Oswald Buddenhagen --- src/tools/qdoc/qdoc.pro | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/qdoc/qdoc.pro b/src/tools/qdoc/qdoc.pro index b020bfe9a4..7ec4b4f726 100644 --- a/src/tools/qdoc/qdoc.pro +++ b/src/tools/qdoc/qdoc.pro @@ -1,6 +1,7 @@ !force_bootstrap { load(qfeatures) requires(!contains(QT_DISABLED_FEATURES, xmlstreamwriter)) + requires(!contains(QT_DISABLED_FEATURES, dom)) } option(host_build) -- cgit v1.2.3 From 6fd205d579ff53eb846ce5e15e558d4ea0e90823 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Wed, 18 Dec 2013 11:22:30 +0100 Subject: network proxy tests: adapt proxy authentication to new server The tests pass with the new test server image. Once we are using the new test server we can remove the test for the host not found error. Change-Id: Iac8ba6d8ce31b0865b33a003086aac0339afe338 Reviewed-by: Richard J. Moore --- tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp index 1837e8d665..291b368e47 100644 --- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp @@ -6596,9 +6596,8 @@ void tst_QNetworkReply::authenticationCacheAfterCancel() QTestEventLoop::instance().enterLoop(10); QVERIFY(!QTestEventLoop::instance().timeout()); - QEXPECT_FAIL("http+socksauth", "QTBUG-23136 - danted accepts bad authentication but blocks the connection", Continue); - QEXPECT_FAIL("https+socksauth", "QTBUG-23136 - danted accepts bad authentication but blocks the connection", Continue); - + if (reply->error() == QNetworkReply::HostNotFoundError) + QSKIP("skip because of quirk in the old test server"); QCOMPARE(reply->error(), QNetworkReply::ProxyAuthenticationRequiredError); QCOMPARE(authSpy.count(), 0); QVERIFY(proxyAuthSpy.count() > 0); -- cgit v1.2.3 From 263fdd15da120c664de9ab6c43932a70cda9997b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Wed, 8 Jan 2014 11:35:30 +0100 Subject: Don't force create the platform window. This causes all sorts of unintended side effects and is generally a bad idea. Task-number: QTBUG-32988 Change-Id: Iebdae34764be4cfd9ced47aa93789871e0455ab3 Reviewed-by: Gabriel de Dietrich Reviewed-by: Shawn Rutledge --- src/plugins/platforms/cocoa/qcocoanativeinterface.mm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm index 795d1a8149..6facab1785 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm @@ -268,11 +268,6 @@ void QCocoaNativeInterface::registerTouchWindow(QWindow *window, bool enable) if (!window) return; - // Make sure the QCocoaWindow is created when enabling. Disabling might - // happen on window destruction, don't (re)create the QCocoaWindow then. - if (enable) - window->create(); - QCocoaWindow *cocoaWindow = static_cast(window->handle()); if (cocoaWindow) cocoaWindow->registerTouch(enable); -- cgit v1.2.3 From f568e43e107ba909eaad300729ee93354b0a1846 Mon Sep 17 00:00:00 2001 From: Tasuku Suzuki Date: Fri, 3 Jan 2014 14:38:12 +0900 Subject: Make qtbase compile with QT_NO_GESTURES Change-Id: I90f173265e177ff37ce80da3983080651856259d Reviewed-by: Oswald Buddenhagen --- src/gui/kernel/qguiapplication.cpp | 2 ++ src/gui/kernel/qguiapplication_p.h | 3 +++ src/gui/kernel/qwindowsysteminterface_p.h | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 1db252ca61..0711a37edd 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1473,10 +1473,12 @@ void QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePriv QGuiApplicationPrivate::processTabletLeaveProximityEvent( static_cast(e)); break; +#ifndef QT_NO_GESTURES case QWindowSystemInterfacePrivate::Gesture: QGuiApplicationPrivate::processGestureEvent( static_cast(e)); break; +#endif case QWindowSystemInterfacePrivate::PlatformPanel: QGuiApplicationPrivate::processPlatformPanelEvent( static_cast(e)); diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index 65c6d814e6..218036033e 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -148,7 +148,10 @@ public: static void processTabletEvent(QWindowSystemInterfacePrivate::TabletEvent *e); static void processTabletEnterProximityEvent(QWindowSystemInterfacePrivate::TabletEnterProximityEvent *e); static void processTabletLeaveProximityEvent(QWindowSystemInterfacePrivate::TabletLeaveProximityEvent *e); + +#ifndef QT_NO_GESTURES static void processGestureEvent(QWindowSystemInterfacePrivate::GestureEvent *e); +#endif static void processPlatformPanelEvent(QWindowSystemInterfacePrivate::PlatformPanelEvent *e); #ifndef QT_NO_CONTEXTMENU diff --git a/src/gui/kernel/qwindowsysteminterface_p.h b/src/gui/kernel/qwindowsysteminterface_p.h index 8cafb8da5c..42dbe7509e 100644 --- a/src/gui/kernel/qwindowsysteminterface_p.h +++ b/src/gui/kernel/qwindowsysteminterface_p.h @@ -91,7 +91,9 @@ public: PlatformPanel = UserInputEvent | 0x17, ContextMenu = UserInputEvent | 0x18, EnterWhatsThisMode = UserInputEvent | 0x19, +#ifndef QT_NO_GESTURES Gesture = UserInputEvent | 0x1a, +#endif ApplicationStateChanged = 0x19, FlushEvents = 0x20, WindowScreenChanged = 0x21 @@ -400,6 +402,7 @@ public: }; #endif +#ifndef QT_NO_GESTURES class GestureEvent : public InputEvent { public: GestureEvent(QWindow *window, ulong time, Qt::NativeGestureType type, QPointF pos, QPointF globalPos) @@ -414,6 +417,7 @@ public: ulong sequenceId; quint64 intValue; }; +#endif class WindowSystemEventList { QList impl; -- cgit v1.2.3 From 67cf8bf9a8e6e583e9da02b153e8fdbe558637cb Mon Sep 17 00:00:00 2001 From: Tasuku Suzuki Date: Fri, 28 Jun 2013 01:57:10 +0900 Subject: Make qtbase compile with QT_NO_TEMPORARYFILE Change-Id: I0211ed44513723392e3f50b76be10b95c0bcddd5 Reviewed-by: Oswald Buddenhagen --- src/corelib/io/qfile.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/corelib/io/qfile.cpp b/src/corelib/io/qfile.cpp index 519ac009aa..82aee331c5 100644 --- a/src/corelib/io/qfile.cpp +++ b/src/corelib/io/qfile.cpp @@ -571,6 +571,8 @@ QFile::rename(const QString &newName) d->setError(QFile::RenameError, tr("Destination file exists")); return false; } +#ifndef QT_NO_TEMPORARYFILE + // This #ifndef disables the workaround it encloses. Therefore, this configuration is not recommended. #ifdef Q_OS_LINUX // rename() on Linux simply does nothing when renaming "foo" to "Foo" on a case-insensitive // FS, such as FAT32. Move the file away and rename in 2 steps to work around. @@ -598,7 +600,8 @@ QFile::rename(const QString &newName) arg(QDir::toNativeSeparators(tempFile.fileName()), tempFile.errorString())); } return false; -#endif +#endif // Q_OS_LINUX +#endif // QT_NO_TEMPORARYFILE } unsetError(); close(); -- cgit v1.2.3 From c28763d83c493a11da90295ec4bde016c53c0d70 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Thu, 10 Oct 2013 11:56:02 +1000 Subject: update the network configuration list when changes in the networks happen. Task-number: QTBUG-34021 Change-Id: I2bd187e7d04d6876294f18d917c9a384afe5db35 Reviewed-by: Robin Burchell --- src/plugins/bearer/connman/qconnmanengine.cpp | 22 ++++++++++++++++++++++ src/plugins/bearer/connman/qconnmanengine.h | 1 + .../bearer/connman/qconnmanservice_linux.cpp | 16 ++++++++++++++++ .../bearer/connman/qconnmanservice_linux_p.h | 5 +++++ 4 files changed, 44 insertions(+) diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp index 6ea34b17f5..be50ba9935 100644 --- a/src/plugins/bearer/connman/qconnmanengine.cpp +++ b/src/plugins/bearer/connman/qconnmanengine.cpp @@ -65,6 +65,9 @@ QConnmanEngine::QConnmanEngine(QObject *parent) : QBearerEngineImpl(parent), connmanManager(new QConnmanManagerInterface(this)) { + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qRegisterMetaType("ConnmanMapList"); } QConnmanEngine::~QConnmanEngine() @@ -82,6 +85,9 @@ void QConnmanEngine::initialize() connect(connmanManager,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)), this,SLOT(propertyChangedContext(QString,QString,QDBusVariant))); + connect(connmanManager,SIGNAL(servicesChanged(ConnmanMapList, QList)), + this, SLOT(updateServices(ConnmanMapList, QList))); + foreach (const QString &techPath, connmanManager->getTechnologies()) { QConnmanTechnologyInterface *tech; tech = new QConnmanTechnologyInterface(techPath, this); @@ -172,6 +178,22 @@ void QConnmanEngine::requestUpdate() QTimer::singleShot(0, this, SLOT(doRequestUpdate())); } +void QConnmanEngine::updateServices(const ConnmanMapList &changed, const QList &removed) +{ + foreach (const QDBusObjectPath &objectPath, removed) { + removeConfiguration(QString::number(qHash(objectPath.path()))); + } + + foreach (const ConnmanMap &connmanMap, changed) { + const QString id = QString::number(qHash(connmanMap.objectPath.path())); + if (accessPointConfigurations.contains(id)) { + configurationChange(id); + } else { + addServiceConfiguration(connmanMap.objectPath.path()); + } + } +} + QString QConnmanEngine::serviceFromId(const QString &id) { QMutexLocker locker(&mutex); diff --git a/src/plugins/bearer/connman/qconnmanengine.h b/src/plugins/bearer/connman/qconnmanengine.h index 9b6a271011..c2a820997e 100644 --- a/src/plugins/bearer/connman/qconnmanengine.h +++ b/src/plugins/bearer/connman/qconnmanengine.h @@ -105,6 +105,7 @@ private Q_SLOTS: void servicePropertyChangedContext(const QString &,const QString &,const QDBusVariant &); void propertyChangedContext(const QString &,const QString &,const QDBusVariant &); void technologyPropertyChangedContext(const QString &,const QString &, const QDBusVariant &); + void updateServices(const ConnmanMapList &changed, const QList &removed); private: QConnmanManagerInterface *connmanManager; diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp index 380cf92a24..6d9ee265c6 100644 --- a/src/plugins/bearer/connman/qconnmanservice_linux.cpp +++ b/src/plugins/bearer/connman/qconnmanservice_linux.cpp @@ -127,8 +127,24 @@ void QConnmanManagerInterface::connectNotify(const QMetaMethod &signal) QObject::connect(helper,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)), this,SIGNAL(propertyChangedContext(QString,QString,QDBusVariant)), Qt::UniqueConnection); } + static const QMetaMethod servicesChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::servicesChanged); + if (signal == servicesChangedSignal) { + if (!connection().connect(QLatin1String(CONNMAN_SERVICE), + QLatin1String(CONNMAN_MANAGER_PATH), + QLatin1String(CONNMAN_MANAGER_INTERFACE), + QLatin1String("ServicesChanged"), + this,SLOT(onServicesChanged(ConnmanMapList, QList)))) { + qWarning() << "servicesChanged not connected"; + } + } } +void QConnmanManagerInterface::onServicesChanged(const ConnmanMapList &changed, const QList &removed) +{ + emit servicesChanged(changed, removed); +} + + void QConnmanManagerInterface::disconnectNotify(const QMetaMethod &signal) { static const QMetaMethod propertyChangedSignal = QMetaMethod::fromSignal(&QConnmanManagerInterface::propertyChanged); diff --git a/src/plugins/bearer/connman/qconnmanservice_linux_p.h b/src/plugins/bearer/connman/qconnmanservice_linux_p.h index a437c6609c..dd3f847cfd 100644 --- a/src/plugins/bearer/connman/qconnmanservice_linux_p.h +++ b/src/plugins/bearer/connman/qconnmanservice_linux_p.h @@ -155,11 +155,16 @@ Q_SIGNALS: void propertyChanged(const QString &, const QDBusVariant &value); void stateChanged(const QString &); void propertyChangedContext(const QString &,const QString &,const QDBusVariant &); + void servicesChanged(const ConnmanMapList&, const QList &); protected: void connectNotify(const QMetaMethod &signal); void disconnectNotify(const QMetaMethod &signal); QVariant getProperty(const QString &); + +private slots: + void onServicesChanged(const ConnmanMapList&, const QList &); + }; class QConnmanProfileInterfacePrivate; -- cgit v1.2.3 From 1db89eb5a4cbe98d8380410de3acc527fc53f911 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Fri, 18 Oct 2013 05:29:25 +1000 Subject: fix connman QNetworkConfiguration Discovered Make Discovered depend on autoconnectable service This stops seemingly automatic use of a non autconnectable service, and allows the connection dialog to popup. Change-Id: Idea9a22eb4bbfb4fefeca7867526a2ddc3954376 Reviewed-by: Robin Burchell --- src/plugins/bearer/connman/qconnmanengine.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp index be50ba9935..7633b4f2b8 100644 --- a/src/plugins/bearer/connman/qconnmanengine.cpp +++ b/src/plugins/bearer/connman/qconnmanengine.cpp @@ -416,21 +416,23 @@ QNetworkConfiguration::StateFlags QConnmanEngine::getStateForService(const QStri QMutexLocker locker(&mutex); QConnmanServiceInterface serv(service); QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined; - if( serv.getType() == "cellular") { - if(serv.isSetupRequired()) { + if (serv.getType() == "cellular") { + if (serv.isSetupRequired() || !serv.isAutoConnect()) { flag = ( flag | QNetworkConfiguration::Defined); } else { flag = ( flag | QNetworkConfiguration::Discovered); } } else { - if(serv.isFavorite()) { - flag = ( flag | QNetworkConfiguration::Discovered); + if (serv.isFavorite()) { + if (serv.isAutoConnect()) { + flag = ( flag | QNetworkConfiguration::Discovered); + } } else { flag = QNetworkConfiguration::Undefined; } } - if(serv.getState() == "ready" || serv.getState() == "online") { + if (serv.getState() == "ready" || serv.getState() == "online") { flag = ( flag | QNetworkConfiguration::Active); } -- cgit v1.2.3 From fa7451043e3e41690c292905866e3ddfe029f705 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Wed, 20 Nov 2013 06:41:55 +1000 Subject: make 'AlwaysAsk' if found help determine whether the configuration is Discovered or not. Since bearer has no idea about user interaction, we just do this, and make the roaming/always ask scenario unavailable. Change-Id: Id509a4d3346cdbb9367ddb465364c3500fc62fdf Reviewed-by: Konstantin Ritt Reviewed-by: Robin Burchell --- src/plugins/bearer/connman/qconnmanengine.cpp | 8 +++++++- src/plugins/bearer/connman/qconnmanengine.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp index 7633b4f2b8..eac0d2b813 100644 --- a/src/plugins/bearer/connman/qconnmanengine.cpp +++ b/src/plugins/bearer/connman/qconnmanengine.cpp @@ -417,7 +417,7 @@ QNetworkConfiguration::StateFlags QConnmanEngine::getStateForService(const QStri QConnmanServiceInterface serv(service); QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined; if (serv.getType() == "cellular") { - if (serv.isSetupRequired() || !serv.isAutoConnect()) { + if (serv.isSetupRequired() || !serv.isAutoConnect() || (serv.isRoaming() && isAlwaysAskRoaming())) { flag = ( flag | QNetworkConfiguration::Defined); } else { flag = ( flag | QNetworkConfiguration::Discovered); @@ -593,6 +593,12 @@ bool QConnmanEngine::requiresPolling() const return false; } +bool QConnmanEngine::isAlwaysAskRoaming() +{ + QSettings confFile(QStringLiteral("nemomobile"), QStringLiteral("connectionagent")); + confFile.beginGroup(QStringLiteral("Connectionagent")); + return confFile.value(QStringLiteral("askForRoaming")).toBool(); +} QT_END_NAMESPACE #endif // QT_NO_DBUS diff --git a/src/plugins/bearer/connman/qconnmanengine.h b/src/plugins/bearer/connman/qconnmanengine.h index c2a820997e..49a1a91d29 100644 --- a/src/plugins/bearer/connman/qconnmanengine.h +++ b/src/plugins/bearer/connman/qconnmanengine.h @@ -129,6 +129,7 @@ private: QNetworkConfiguration::BearerType ofonoTechToBearerType(const QString &type); bool isRoamingAllowed(const QString &context); + bool isAlwaysAskRoaming(); protected: bool requiresPolling() const; }; -- cgit v1.2.3 From 79b07807832d5595823fc6625061d0d194b5ba23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Martins?= Date: Wed, 8 Jan 2014 22:40:04 +0000 Subject: Fix kms build with -qtnamespace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I6aa3f3bc3c098b96ec0eec369b85a938c552f364 Reviewed-by: Jørgen Lind Reviewed-by: Andrew Knight --- src/plugins/platforms/kms/qkmscursor.h | 5 +++-- src/plugins/platforms/kms/qkmsdevice.h | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/plugins/platforms/kms/qkmscursor.h b/src/plugins/platforms/kms/qkmscursor.h index 91ac10aae5..f972604c01 100644 --- a/src/plugins/platforms/kms/qkmscursor.h +++ b/src/plugins/platforms/kms/qkmscursor.h @@ -44,11 +44,12 @@ #include +struct gbm_device; +struct gbm_bo; + QT_BEGIN_NAMESPACE class QKmsScreen; -struct gbm_device; -struct gbm_bo; class QKmsCursor : public QPlatformCursor { diff --git a/src/plugins/platforms/kms/qkmsdevice.h b/src/plugins/platforms/kms/qkmsdevice.h index 906e00aa13..2f8e2da709 100644 --- a/src/plugins/platforms/kms/qkmsdevice.h +++ b/src/plugins/platforms/kms/qkmsdevice.h @@ -51,9 +51,10 @@ extern "C" { #include +struct gbm_device; + QT_BEGIN_NAMESPACE -struct gbm_device; class QKmsIntegration; class QKmsDevice : public QObject -- cgit v1.2.3 From 0caaf9966a8e4ea1e83de866020e61fd5ffaec1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Mon, 16 Dec 2013 22:38:13 +0100 Subject: Cocoa: Add setContentBorderThickness(). Add setContentBorderThickness() to the Cocoa platform plugin. This functions requests that the platform plugin draws a gradient in the unified title and toolbar area and/or the status bar area. The background gradient is drawn before and under the Qt backing store content. It is expected that parts of the backing store will be filled with transparent pixels to allow the gradient to be visible. To facilitate this the backing store image is created with an alpha channel. Task-number: QTBUG-34411 Change-Id: Iadc5e64ee9b9b42e92fb84a615817fdffd7a8802 Reviewed-by: Gabriel de Dietrich --- src/plugins/platforms/cocoa/qcocoabackingstore.mm | 3 +- .../platforms/cocoa/qcocoanativeinterface.h | 3 ++ .../platforms/cocoa/qcocoanativeinterface.mm | 12 +++++++ src/plugins/platforms/cocoa/qcocoawindow.h | 6 ++++ src/plugins/platforms/cocoa/qcocoawindow.mm | 41 ++++++++++++++++++++++ src/plugins/platforms/cocoa/qnsview.mm | 6 +++- 6 files changed, 69 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm index 665b3d4c13..30c15d823a 100644 --- a/src/plugins/platforms/cocoa/qcocoabackingstore.mm +++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm @@ -73,7 +73,8 @@ QPaintDevice *QCocoaBackingStore::paintDevice() } #endif - QImage::Format format = window()->format().hasAlpha() + QCocoaWindow *cocoaWindow = static_cast(window()->handle()); + QImage::Format format = (window()->format().hasAlpha() || cocoaWindow->m_drawContentBorderGradient) ? QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32; m_qImage = QImage(m_requestedSize * scaleFactor, format); m_qImage.setDevicePixelRatio(scaleFactor); diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.h b/src/plugins/platforms/cocoa/qcocoanativeinterface.h index d30b281eb8..5c59c73847 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.h +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.h @@ -132,6 +132,9 @@ private: // touch events, which then will be delivered until the widget // deregisters. static void registerTouchWindow(QWindow *window, bool enable); + + // Request a unified title and toolbar look for the window. + static void setContentBorderThickness(QWindow *window, int topThickness, int bottomThickness); }; #endif // QCOCOANATIVEINTERFACE_H diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm index 6facab1785..eb520b97c9 100644 --- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm +++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm @@ -123,6 +123,8 @@ QPlatformNativeInterface::NativeResourceForIntegrationFunction QCocoaNativeInter return NativeResourceForIntegrationFunction(QCocoaNativeInterface::registerTouchWindow); if (resource.toLower() == "setembeddedinforeignview") return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setEmbeddedInForeignView); + if (resource.toLower() == "setcontentborderthickness") + return NativeResourceForIntegrationFunction(QCocoaNativeInterface::setContentBorderThickness); return 0; } @@ -273,4 +275,14 @@ void QCocoaNativeInterface::registerTouchWindow(QWindow *window, bool enable) cocoaWindow->registerTouch(enable); } +void QCocoaNativeInterface::setContentBorderThickness(QWindow *window, int topThickness, int bottomThickness) +{ + if (!window) + return; + + QCocoaWindow *cocoaWindow = static_cast(window->handle()); + if (cocoaWindow) + cocoaWindow->setContentBorderThickness(topThickness, bottomThickness); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index c7ec315f04..66c3241b3d 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -157,6 +157,8 @@ public: void setWindowCursor(NSCursor *cursor); void registerTouch(bool enable); + void setContentBorderThickness(int topThickness, int bottomThickness); + void applyContentBorderThickness(NSWindow *window); qreal devicePixelRatio() const; bool isWindowExposable(); @@ -214,6 +216,10 @@ public: // for QNSView static const int NoAlertRequest; NSInteger m_alertRequest; id monitor; + + bool m_drawContentBorderGradient; + int m_topContentBorderThickness; + int m_bottomContentBorderThickness; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index ad11a525ad..8e977236fa 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -220,6 +220,9 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw) , m_overrideBecomeKey(false) , m_alertRequest(NoAlertRequest) , monitor(nil) + , m_drawContentBorderGradient(false) + , m_topContentBorderThickness(0) + , m_bottomContentBorderThickness(0) { #ifdef QT_COCOA_ENABLE_WINDOW_DEBUG qDebug() << "QCocoaWindow::QCocoaWindow" << this; @@ -502,6 +505,9 @@ NSUInteger QCocoaWindow::windowStyleMask(Qt::WindowFlags flags) } } + if (m_drawContentBorderGradient) + styleMask |= NSTexturedBackgroundWindowMask; + #ifdef QT_COCOA_ENABLE_WINDOW_DEBUG qDebug("windowStyleMask of '%s': flags %X -> styleMask %lX", qPrintable(window()->title()), (int)flags, styleMask); #endif @@ -927,6 +933,9 @@ NSWindow * QCocoaWindow::createNSWindow() } m_windowModality = window()->modality(); + + applyContentBorderThickness(createdWindow); + return createdWindow; } @@ -1069,6 +1078,38 @@ void QCocoaWindow::registerTouch(bool enable) [m_contentView setAcceptsTouchEvents:NO]; } +void QCocoaWindow::setContentBorderThickness(int topThickness, int bottomThickness) +{ + m_topContentBorderThickness = topThickness; + m_bottomContentBorderThickness = bottomThickness; + bool enable = (topThickness > 0 || bottomThickness > 0); + m_drawContentBorderGradient = enable; + + applyContentBorderThickness(m_nsWindow); +} + +void QCocoaWindow::applyContentBorderThickness(NSWindow *window) +{ + if (!window) + return; + + if (m_drawContentBorderGradient) + [window setStyleMask:[window styleMask] | NSTexturedBackgroundWindowMask]; + else + [window setStyleMask:[window styleMask] & ~NSTexturedBackgroundWindowMask]; + + if (m_topContentBorderThickness > 0) { + [window setContentBorderThickness:m_topContentBorderThickness forEdge:NSMaxYEdge]; + [window setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge]; + } + + if (m_bottomContentBorderThickness > 0) { + [window setContentBorderThickness:m_topContentBorderThickness forEdge:NSMinYEdge]; + [window setAutorecalculatesContentBorderThickness:NO forEdge:NSMinYEdge]; + } +} + + qreal QCocoaWindow::devicePixelRatio() const { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index e183f93c6c..f7b129aea1 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -408,6 +408,9 @@ static QTouchDevice *touchDevice = 0; m_shouldSetGLContextinDrawRect = false; } + if (m_platformWindow->m_drawContentBorderGradient) + NSDrawWindowBackground(dirtyRect); + if (!m_backingStore) return; @@ -451,7 +454,8 @@ static QTouchDevice *touchDevice = 0; // Optimization: Copy frame buffer content instead of blending for // top-level windows where Qt fills the entire window content area. - if (m_platformWindow->m_nsWindow) + // (But don't overpaint the title-bar gradient) + if (m_platformWindow->m_nsWindow && !m_platformWindow->m_drawContentBorderGradient) CGContextSetBlendMode(cgContext, kCGBlendModeCopy); CGContextDrawImage(cgContext, dirtyWindowRect, cleanImg); -- cgit v1.2.3 From f2f2e4e53ee679b50878c042ecd64a0cf30c9569 Mon Sep 17 00:00:00 2001 From: Kurt Pattyn Date: Mon, 23 Dec 2013 21:13:30 +0100 Subject: Fix to comply with Qt coding guidelines Change-Id: Ie6c62d3107d17e64c94fa01380b3b1d80f24d0de Reviewed-by: Giuseppe D'Angelo --- src/tools/qdoc/config.cpp | 51 ++++++++++++++++++----------------------------- 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/src/tools/qdoc/config.cpp b/src/tools/qdoc/config.cpp index 2d8e98d64c..56e7287c40 100644 --- a/src/tools/qdoc/config.cpp +++ b/src/tools/qdoc/config.cpp @@ -196,8 +196,7 @@ void MetaStack::process(QChar ch, const Location& location) if (ch == QLatin1Char('{')) { push(MetaStackEntry()); top().open(); - } - else if (ch == QLatin1Char('}')) { + } else if (ch == QLatin1Char('}')) { if (count() == 1) location.fatal(tr("Unexpected '}'")); @@ -215,12 +214,10 @@ void MetaStack::process(QChar ch, const Location& location) } ++pre; } - } - else if (ch == QLatin1Char(',') && count() > 1) { + } else if (ch == QLatin1Char(',') && count() > 1) { top().close(); top().open(); - } - else { + } else { /* This is where all the processing is done. */ @@ -296,12 +293,10 @@ Config::~Config() void Config::load(const QString& fileName) { load(Location::null, fileName); - if (loc.isEmpty()) { + if (loc.isEmpty()) loc = Location(fileName); - } - else { + else loc.setEtc(true); - } lastLocation_ = Location::null; } @@ -472,9 +467,8 @@ QStringList Config::getCanonicalPathList(const QString& var) const const ConfigVar& cv = configVars[i]; if (!cv.location_.isEmpty()) (Location&) lastLocation_ = cv.location_; - if (!cv.plus_) { + if (!cv.plus_) t.clear(); - } const QString d = cv.currentPath_; const QStringList& sl = cv.values_; if (!sl.isEmpty()) { @@ -786,9 +780,8 @@ QString Config::findFile(const Location& location, QStringList::ConstIterator d = dirs.constBegin(); while (d != dirs.constEnd()) { fileInfo.setFile(QDir(*d), firstComponent); - if (fileInfo.exists()) { + if (fileInfo.exists()) break; - } ++d; } } @@ -808,9 +801,9 @@ QString Config::findFile(const Location& location, QString extracted = extractedDirs[fileInfo.filePath()]; ++c; fileInfo.setFile(QDir(extracted), *c); - } - else + } else { break; + } userFriendlyFilePath += QLatin1Char('?'); } @@ -876,9 +869,8 @@ QString Config::copyFile(const Location& location, char buffer[1024]; int len; - while ((len = inFile.read(buffer, sizeof(buffer))) > 0) { + while ((len = inFile.read(buffer, sizeof(buffer))) > 0) outFile.write(buffer, len); - } return outFileName; } @@ -1002,17 +994,15 @@ void Config::load(Location location, const QString& fileName) QChar c = text.at(0); uint cc = c.unicode(); while (i < (int) text.length()) { - if (cc == 0) + if (cc == 0) { ++i; - else if (c.isSpace()) { + } else if (c.isSpace()) { SKIP_CHAR(); - } - else if (cc == '#') { + } else if (cc == '#') { do { SKIP_CHAR(); } while (cc != '\n'); - } - else if (isMetaKeyChar(c)) { + } else if (isMetaKeyChar(c)) { Location keyLoc = location; bool plus = false; QString stringValue; @@ -1184,15 +1174,13 @@ void Config::load(Location location, const QString& fileName) ++key; } } - } - else { + } else { location.fatal(tr("Unexpected character '%1' at beginning of line").arg(c)); } } popWorkingDir(); - if (!workingDirs_.isEmpty()) { + if (!workingDirs_.isEmpty()) QDir::setCurrent(workingDirs_.top()); - } } QStringList Config::getFilesHere(const QString& uncleanDir, @@ -1219,9 +1207,8 @@ QStringList Config::getFilesHere(const QString& uncleanDir, if (!fn->startsWith(QLatin1Char('~'))) { QString s = dirInfo.filePath(*fn); QString c = QDir::cleanPath(s); - if (!excludedFiles.contains(c)) { + if (!excludedFiles.contains(c)) result.append(c); - } } ++fn; } @@ -1251,9 +1238,9 @@ void Config::pushWorkingDir(const QString& dir) */ QString Config::popWorkingDir() { - if (!workingDirs_.isEmpty()) { + if (!workingDirs_.isEmpty()) return workingDirs_.pop(); - } + qDebug() << "RETURNED EMPTY WORKING DIR"; return QString(); } -- cgit v1.2.3 From 46de0c476589cdc5ba02cb4c439cb4f4b3ba401f Mon Sep 17 00:00:00 2001 From: John Layt Date: Mon, 6 Jan 2014 14:37:06 +0100 Subject: QLocale - Check day number is valid Check day number falls in valid range before using as array index. Change-Id: I8d7c203b97988633fe4c345d5e7002bba9c2c68b Reviewed-by: Thiago Macieira --- src/corelib/tools/qlocale_win.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp index 3a083582c9..c20827a4ae 100644 --- a/src/corelib/tools/qlocale_win.cpp +++ b/src/corelib/tools/qlocale_win.cpp @@ -279,6 +279,9 @@ QVariant QSystemLocalePrivate::dateTimeFormat(QLocale::FormatType type) QVariant QSystemLocalePrivate::dayName(int day, QLocale::FormatType type) { + if (day < 1 || day > 7) + return QString(); + static const LCTYPE short_day_map[] = { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5, -- cgit v1.2.3 From a41a5f6671616128eed650ad4742842b8e81a6ff Mon Sep 17 00:00:00 2001 From: John Layt Date: Mon, 6 Jan 2014 19:20:58 +0100 Subject: QDateTime - Fix isValid() if invalid QTimeZone Explicitly check that the QTimeZone is valid before trying to use it. Change-Id: Iec415a2cb07071502fe71ee5ac92a7657e818f99 Reviewed-by: Thiago Macieira --- src/corelib/tools/qdatetime.cpp | 9 +++++++++ tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 42721c018f..1ab5665893 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -2764,6 +2764,15 @@ void QDateTimePrivate::refreshDateTime() return; } +#ifndef QT_BOOTSTRAPPED + // If not valid time zone then is invalid + if (m_spec == Qt::TimeZone && !m_timeZone.isValid()) { + clearValidDateTime(); + m_offsetFromUtc = 0; + return; + } +#endif // QT_BOOTSTRAPPED + // We have a valid date and time and a Qt::LocalTime or Qt::TimeZone that needs calculating // LocalTime and TimeZone might fall into "missing" DaylightTime transition hour // Calling toEpochMSecs will adjust the returned date/time if it does diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp index 5d1fe0784f..866f68c99c 100644 --- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp +++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp @@ -2784,6 +2784,13 @@ void tst_QDateTime::daylightTransitions() const void tst_QDateTime::timeZones() const { + QTimeZone invalidTz = QTimeZone("Vulcan/ShiKahr"); + QCOMPARE(invalidTz.isValid(), false); + QDateTime invalidDateTime = QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0), invalidTz); + QCOMPARE(invalidDateTime.isValid(), false); + QCOMPARE(invalidDateTime.date(), QDate(2000, 1, 1)); + QCOMPARE(invalidDateTime.time(), QTime(0, 0, 0)); + QTimeZone nzTz = QTimeZone("Pacific/Auckland"); // During Standard Time NZ is +12:00 -- cgit v1.2.3 From 684ebc66481eb095bac1aea4db5ae5a41aabd604 Mon Sep 17 00:00:00 2001 From: John Layt Date: Mon, 6 Jan 2014 20:03:37 +0100 Subject: QDate - Fix parsing Qt::ISODate Fix parsing of ISO Date from being totally lenient to being semi-strict by requiring the separator positions to be non-numeric. [ChangeLog][Important Behavior Changes] Parsing of Qt::ISODate by QDate::fromString() and QDateTime()::fromString() is not as lenient as before, the date component separators are now required to be non-numeric. This means a string like "2000901901" will no longer be recognized as a valid ISO Date, but "2000/01/01" will still be even though it doesn't strictly meet the ISO format of "2000-01-01". Task-number: QTBUG-34141 Change-Id: I0e481144136c60d4cac61364b9b2c1d2cd1e78fc Reviewed-by: Thiago Macieira --- src/corelib/tools/qdatetime.cpp | 5 +++++ tests/auto/corelib/tools/qdate/tst_qdate.cpp | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 1ab5665893..5438f00c67 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -1281,6 +1281,11 @@ QDate QDate::fromString(const QString& string, Qt::DateFormat format) } #endif // QT_NO_TEXTDATE case Qt::ISODate: { + // Semi-strict parsing, must be long enough and have non-numeric separators + if (string.size() < 10 || string.at(4).isDigit() || string.at(7).isDigit() + || (string.size() > 10 && string.at(10).isDigit())) { + return QDate(); + } const int year = string.mid(0, 4).toInt(); if (year <= 0 || year > 9999) return QDate(); diff --git a/tests/auto/corelib/tools/qdate/tst_qdate.cpp b/tests/auto/corelib/tools/qdate/tst_qdate.cpp index b91de092e8..807dcf5cbe 100644 --- a/tests/auto/corelib/tools/qdate/tst_qdate.cpp +++ b/tests/auto/corelib/tools/qdate/tst_qdate.cpp @@ -944,6 +944,13 @@ void tst_QDate::fromStringDateFormat_data() QTest::newRow("iso2") << QDate(1999, 11, 14).toString(Qt::ISODate) << Qt::ISODate << QDate(1999, 11, 14); QTest::newRow("iso3") << QString("0999-01-01") << Qt::ISODate << QDate(999, 1, 1); QTest::newRow("iso3b") << QString("0999-01-01") << Qt::ISODate << QDate(999, 1, 1); + QTest::newRow("iso4") << QString("2000101101") << Qt::ISODate << QDate(); + QTest::newRow("iso5") << QString("2000/01/01") << Qt::ISODate << QDate(2000, 1, 1); + QTest::newRow("iso6") << QString("2000-01-01 blah") << Qt::ISODate << QDate(2000, 1, 1); + QTest::newRow("iso7") << QString("2000-01-011blah") << Qt::ISODate << QDate(); + QTest::newRow("iso8") << QString("2000-01-01blah") << Qt::ISODate << QDate(2000, 1, 1); + QTest::newRow("iso9") << QString("-001-01-01") << Qt::ISODate << QDate(); + QTest::newRow("iso10") << QString("99999-01-01") << Qt::ISODate << QDate(); // Test Qt::RFC2822Date format (RFC 2822). QTest::newRow("RFC 2822") << QString::fromLatin1("13 Feb 1987 13:24:51 +0100") -- cgit v1.2.3 From cd5ae8fb21c2e44083f0b8ba85ef8d620803c934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Mon, 16 Dec 2013 22:43:05 +0100 Subject: Enable window dragging code in QToolBar on Mac Allows moving the window by dragging the unified title and toolbar area. Task-number: QTBUG-34411 Change-Id: Idd85c0031895b5afd7dfdc8616e4452c47935af2 Reviewed-by: Gabriel de Dietrich --- src/widgets/widgets/qtoolbar.cpp | 6 +++--- src/widgets/widgets/qtoolbar_p.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/widgets/widgets/qtoolbar.cpp b/src/widgets/widgets/qtoolbar.cpp index 5f80bbb1ca..096f53de40 100644 --- a/src/widgets/widgets/qtoolbar.cpp +++ b/src/widgets/widgets/qtoolbar.cpp @@ -272,7 +272,7 @@ bool QToolBarPrivate::mousePressEvent(QMouseEvent *event) QStyleOptionToolBar opt; q->initStyleOption(&opt); if (q->style()->subElementRect(QStyle::SE_ToolBarHandle, &opt, q).contains(event->pos()) == false) { -#ifdef Q_WS_MAC +#ifdef Q_OS_OSX // When using the unified toolbar on Mac OS X, the user can click and // drag between toolbar contents to move the window. Make this work by // implementing the standard mouse-dragging code and then call @@ -306,7 +306,7 @@ bool QToolBarPrivate::mouseReleaseEvent(QMouseEvent*) endDrag(); return true; } else { -#ifdef Q_WS_MAC +#ifdef Q_OS_OSX if (!macWindowDragging) return false; macWindowDragging = false; @@ -322,7 +322,7 @@ bool QToolBarPrivate::mouseMoveEvent(QMouseEvent *event) Q_Q(QToolBar); if (!state) { -#ifdef Q_WS_MAC +#ifdef Q_OS_OSX if (!macWindowDragging) return false; QWidget *w = q->window(); diff --git a/src/widgets/widgets/qtoolbar_p.h b/src/widgets/widgets/qtoolbar_p.h index 9ff0b9d61c..c9dd0490cd 100644 --- a/src/widgets/widgets/qtoolbar_p.h +++ b/src/widgets/widgets/qtoolbar_p.h @@ -75,7 +75,7 @@ public: allowedAreas(Qt::AllToolBarAreas), orientation(Qt::Horizontal), toolButtonStyle(Qt::ToolButtonIconOnly), layout(0), state(0) -#ifdef Q_WS_MAC +#ifdef Q_OS_OSX , macWindowDragging(false) #endif { } @@ -107,7 +107,7 @@ public: }; DragState *state; -#ifdef Q_WS_MAC +#ifdef Q_OS_OSX bool macWindowDragging; QPoint macWindowDragPressPosition; #endif -- cgit v1.2.3 From 459ad9e018071cdf613d3deb70ea4d96178ca683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Mon, 16 Dec 2013 22:49:41 +0100 Subject: Mac: Update PE_IndicatorToolBarHandle drawing. Smaller, rounder, darker toolbar handles. Works especially well in unified toolbar mode. Task-number: QTBUG-34411 Change-Id: I41eafdf0bb1dbbb4ed96d7bd799eb6f53bccbf7d Reviewed-by: Gabriel de Dietrich --- src/widgets/styles/qmacstyle_mac.mm | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index 5db4801c37..93a72980c9 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -3008,23 +3008,19 @@ void QMacStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPai if (opt->state & State_Horizontal) { while (y < opt->rect.height() - RectHeight - 5) { path.moveTo(x, y); - path.addRect(x, y, RectHeight, RectHeight); + path.addEllipse(x, y, RectHeight, RectHeight); y += 6; } } else { while (x < opt->rect.width() - RectHeight - 5) { path.moveTo(x, y); - path.addRect(x, y, RectHeight, RectHeight); + path.addEllipse(x, y, RectHeight, RectHeight); x += 6; } } p->setPen(Qt::NoPen); - QColor dark = opt->palette.dark().color(); - dark.setAlphaF(0.75); - QColor light = opt->palette.light().color(); - light.setAlphaF(0.6); - p->fillPath(path, light); - p->translate(1, 1); + QColor dark = opt->palette.dark().color().darker(); + dark.setAlphaF(0.50); p->fillPath(path, dark); p->restore(); -- cgit v1.2.3 From 055591750aaccab9e764eb7348968d9716dd4f47 Mon Sep 17 00:00:00 2001 From: Thorsten Zachmann Date: Wed, 1 Jan 2014 08:13:02 +0100 Subject: Fix Use android theme when defined It is possible to define the theme to use for android in the AndroidManifest.xml. If it is defined in the activity qt itself should not overwrite it. The change uses the defined style in case it is given in the AndroidManifest.xml. This seems to fix also QTBUG-35151. Task-number: QTBUG-35050 Change-Id: I8b55c02ca1ecd7baa5f2f9460d154095aacf015f Reviewed-by: BogDan Vatra --- .../qtproject/qt5/android/bindings/QtActivity.java | 24 ++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java index 6762717d91..b2f92c04e9 100644 --- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java +++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java @@ -34,6 +34,7 @@ import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.DataOutputStream; import java.io.DataInputStream; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; @@ -816,6 +817,21 @@ public class QtActivity extends Activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + try { + m_activityInfo = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA); + for (Field f : Class.forName("android.R$style").getDeclaredFields()) { + if (f.getInt(null) == m_activityInfo.getThemeResource()) { + QT_ANDROID_THEMES = new String[] {f.getName()}; + QT_ANDROID_DEFAULT_THEME = f.getName(); + } + } + } catch (Exception e) { + e.printStackTrace(); + finish(); + return; + } + try { setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null)); } catch (Exception e) { @@ -840,14 +856,6 @@ public class QtActivity extends Activity ENVIRONMENT_VARIABLES += "\tQT_ANDROID_THEME=" + QT_ANDROID_DEFAULT_THEME + "/\tQT_ANDROID_THEME_DISPLAY_DPI=" + getResources().getDisplayMetrics().densityDpi + "\t"; - try { - m_activityInfo = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA); - } catch (NameNotFoundException e) { - e.printStackTrace(); - finish(); - return; - } - if (null == getLastNonConfigurationInstance()) { // if splash screen is defined, then show it if (m_activityInfo.metaData.containsKey("android.app.splash_screen") ) -- cgit v1.2.3 From b3d642e71e1b1083e5f17872614da2cbf38e8fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Mon, 16 Dec 2013 23:03:30 +0100 Subject: Mac: Update unified toolbar drawing code. Fill the toolbar background with transparent pixels to allow the view background to shine through. Draw a separator line using HITheme. Task-number: QTBUG-34411 Change-Id: I57732564a67a5a9d1eb7fd9038382b2b65be50a4 Reviewed-by: Gabriel de Dietrich --- src/widgets/styles/qmacstyle_mac.mm | 40 ++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index 93a72980c9..8c00f06a4f 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -679,6 +679,18 @@ bool qt_macWindowIsTextured(const QWidget *window) return false; } +static bool qt_macWindowMainWindow(const QWidget *window) +{ + if (QWindow *w = window->windowHandle()) { + if (w->handle()) { + if (NSWindow *nswindow = static_cast(QGuiApplication::platformNativeInterface()->nativeResourceForWindow(QByteArrayLiteral("nswindow"), w))) { + return [nswindow isMainWindow]; + } + } + } + return false; +} + /***************************************************************************** QMacCGStyle globals *****************************************************************************/ @@ -4438,12 +4450,34 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter } break; case CE_ToolBar: { - // For unified tool bars, draw nothing. - if (w) { + const QStyleOptionToolBar *toolBar = qstyleoption_cast(opt); + + // Unified title and toolbar drawing. In this mode the cocoa platform plugin will + // fill the top toolbar area part with a background gradient that "unifies" with + // the title bar. The following code fills the toolBar area with transparent pixels + // to make that gradient visible. + if (w) { if (QMainWindow * mainWindow = qobject_cast(w->window())) { - if (mainWindow->unifiedTitleAndToolBarOnMac()) + if (toolBar && toolBar->toolBarArea == Qt::TopToolBarArea && mainWindow->unifiedTitleAndToolBarOnMac()) { + + // fill with transparent pixels. + p->save(); + p->setCompositionMode(QPainter::CompositionMode_Source); + p->fillRect(opt->rect, Qt::transparent); + p->restore(); + + // drow horizontal sepearator line at toolBar bottom. + SInt32 margin; + GetThemeMetric(kThemeMetricSeparatorSize, &margin); + CGRect separatorRect = CGRectMake(opt->rect.left(), opt->rect.bottom(), opt->rect.width(), margin); + HIThemeSeparatorDrawInfo separatorDrawInfo; + separatorDrawInfo.version = 0; + separatorDrawInfo.state = qt_macWindowMainWindow(mainWindow) ? kThemeStateActive : kThemeStateInactive; + QMacCGContext cg(p); + HIThemeDrawSeparator(&separatorRect, &separatorDrawInfo, cg, kHIThemeOrientationNormal); break; } + } } // draw background gradient -- cgit v1.2.3 From 4a7f27ea536c2010edae05f39c1a9cb6c56205f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Mon, 16 Dec 2013 23:06:35 +0100 Subject: Mac: remove unified toolbar workarounds. QMainWindow::unifiedTitleAndToolBarOnMac() will again return true, but the new implementation is much more similar to the cross platform one so these workarounds are not needed. Task-number: QTBUG-34411 Change-Id: Ic95f491af94354776385dc984f1a00c64429a3f0 Reviewed-by: Gabriel de Dietrich --- src/widgets/styles/qmacstyle_mac.mm | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index 8c00f06a4f..d13339b555 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -2437,11 +2437,6 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW break; case PM_ToolBarFrameWidth: ret = 1; - if (widget) { - if (QMainWindow * mainWindow = qobject_cast(widget->parent())) - if (mainWindow->unifiedTitleAndToolBarOnMac()) - ret = 0; - } break; case PM_ScrollView_ScrollBarOverlap: #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 @@ -3445,14 +3440,8 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter if (tb->toolButtonStyle != Qt::ToolButtonIconOnly) { needText = true; if (tb->toolButtonStyle == Qt::ToolButtonTextUnderIcon) { - QMainWindow *mw = w ? qobject_cast(w->window()) : 0; - if (mw && mw->unifiedTitleAndToolBarOnMac()) { - pr.setHeight(pixmap.size().height() / pixmap.devicePixelRatio()); - cr.adjust(0, pr.bottom() + 1, 0, 1); - } else { - pr.setHeight(pixmap.size().height() / pixmap.devicePixelRatio() + 6); - cr.adjust(0, pr.bottom(), 0, -3); - } + pr.setHeight(pixmap.size().height() / pixmap.devicePixelRatio() + 6); + cr.adjust(0, pr.bottom(), 0, -3); alignment |= Qt::AlignCenter; } else { pr.setWidth(pixmap.width() / pixmap.devicePixelRatio() + 8); @@ -6271,18 +6260,6 @@ QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt, } break; case CT_ToolButton: - if (widget && qobject_cast(widget->parentWidget())) { - if (QMainWindow * mainWindow = qobject_cast(widget->parent())) { - if (mainWindow->unifiedTitleAndToolBarOnMac()) { - sz.rwidth() += 4; - if (sz.height() <= 32) { - // Workaround strange HIToolBar bug when getting constraints. - sz.rheight() += 1; - } - return sz; - } - } - } sz.rwidth() += 10; sz.rheight() += 10; return sz; -- cgit v1.2.3 From 50b36f218118d262d552fc45a7efc9c3ab77cb43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Martins?= Date: Sun, 12 Jan 2014 02:21:22 +0000 Subject: QNX: Fix compiler warning about unused variable. Change-Id: I16e4aa32647793bf36fee60ed94db69a6ae2d8ea Reviewed-by: Thiago Macieira --- src/corelib/io/qfilesystemwatcher.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/corelib/io/qfilesystemwatcher.cpp b/src/corelib/io/qfilesystemwatcher.cpp index 44bbe55719..d1deae2d7b 100644 --- a/src/corelib/io/qfilesystemwatcher.cpp +++ b/src/corelib/io/qfilesystemwatcher.cpp @@ -77,6 +77,7 @@ QFileSystemWatcherEngine *QFileSystemWatcherPrivate::createNativeEngine(QObject #elif defined(Q_OS_FREEBSD) || defined(Q_OS_MAC) return QKqueueFileSystemWatcherEngine::create(parent); #else + Q_UNUSED(parent); return 0; #endif } -- cgit v1.2.3 From ba507f66906b4e4b57977fe3661d21912d0aec45 Mon Sep 17 00:00:00 2001 From: Kurt Pattyn Date: Sun, 12 Jan 2014 18:59:44 +0100 Subject: Fix typos in comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Comments contained some typos. Comments have been replaced with the ‘official’ description from http://msdn.microsoft.com/en-us/library/8x5x43k7.aspx. Change-Id: I25dda0911735b4a0d4f306bc95bc984be0080e2f Reviewed-by: Olivier Goffart --- src/corelib/global/qglobal.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 9db48354b3..d8c987d2e0 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -819,18 +819,18 @@ Q_CORE_EXPORT void qFreeAligned(void *ptr); #endif #if defined(QT_NO_WARNINGS) # if defined(Q_CC_MSVC) -# pragma warning(disable: 4251) /* class 'A' needs to have dll interface for to be used by clients of class 'B'. */ -# pragma warning(disable: 4244) /* 'conversion' conversion from 'type1' to 'type2', possible loss of data */ +# pragma warning(disable: 4251) /* class 'type' needs to have dll-interface to be used by clients of class 'type2' */ +# pragma warning(disable: 4244) /* conversion from 'type1' to 'type2', possible loss of data */ # pragma warning(disable: 4275) /* non - DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier' */ -# pragma warning(disable: 4514) /* unreferenced inline/local function has been removed */ +# pragma warning(disable: 4514) /* unreferenced inline function has been removed */ # pragma warning(disable: 4800) /* 'type' : forcing value to bool 'true' or 'false' (performance warning) */ # pragma warning(disable: 4097) /* typedef-name 'identifier1' used as synonym for class-name 'identifier2' */ # pragma warning(disable: 4706) /* assignment within conditional expression */ -# pragma warning(disable: 4786) /* truncating debug info after 255 characters */ +# pragma warning(disable: 4786) /* 'identifier' : identifier was truncated to 'number' characters in the debug information */ # pragma warning(disable: 4355) /* 'this' : used in base member initializer list */ -# pragma warning(disable: 4231) /* nonstandard extension used : 'extern' before template explicit instantiation */ +# pragma warning(disable: 4231) /* nonstandard extension used : 'identifier' before template explicit instantiation */ # pragma warning(disable: 4710) /* function not inlined */ -# pragma warning(disable: 4530) /* C++ exception handler used, but unwind semantics are not enabled. Specify -GX */ +# pragma warning(disable: 4530) /* C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc */ # elif defined(Q_CC_BOR) # pragma option -w-inl # pragma option -w-aus -- cgit v1.2.3 From e1330ecfdccf75c3c3f93734e7950199918e6ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Mon, 16 Dec 2013 23:36:14 +0100 Subject: Mac: Remove old unified toolbar implementation. This has been dead code in Qt 5 since WS_MAC isn't defined any more. The new implementation is far less intrusive and does not require a separate layout. Task-number: QTBUG-34411 Change-Id: I91bf2294086cb7334a0f56eb1bb97464d8d7b2e3 Reviewed-by: Gabriel de Dietrich --- src/widgets/kernel/qwidget.cpp | 95 +------ src/widgets/kernel/qwidget_p.h | 3 +- src/widgets/widgets/qcocoatoolbardelegate_mac.mm | 151 ----------- src/widgets/widgets/qcocoatoolbardelegate_mac_p.h | 69 ----- src/widgets/widgets/qmainwindowlayout_mac.mm | 292 ---------------------- src/widgets/widgets/qtoolbar.cpp | 68 +---- src/widgets/widgets/qtoolbarlayout.cpp | 23 -- src/widgets/widgets/widgets.pri | 9 - 8 files changed, 5 insertions(+), 705 deletions(-) delete mode 100644 src/widgets/widgets/qcocoatoolbardelegate_mac.mm delete mode 100644 src/widgets/widgets/qcocoatoolbardelegate_mac_p.h delete mode 100644 src/widgets/widgets/qmainwindowlayout_mac.mm diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 08e8975f9d..df523e7e21 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -5026,16 +5026,6 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP if (rgn.isEmpty()) return; -#ifdef Q_WS_MAC - if (qt_mac_clearDirtyOnWidgetInsideDrawWidget) - dirtyOnWidget = QRegion(); - - // We disable the rendering of QToolBar in the backingStore if - // it's supposed to be in the unified toolbar on Mac OS X. - if (backingStore && isInUnifiedToolbar) - return; -#endif // Q_WS_MAC - const bool asRoot = flags & DrawAsRoot; bool onScreen = paintOnScreen(); @@ -9403,26 +9393,13 @@ QWidget *QWidgetPrivate::childAt_helper(const QPoint &p, bool ignoreChildrenInDe if (children.isEmpty()) return 0; -#ifdef Q_WS_MAC - Q_Q(const QWidget); - // Unified tool bars on the Mac require special handling since they live outside - // QMainWindow's geometry(). See commit: 35667fd45ada49269a5987c235fdedfc43e92bb8 - bool includeFrame = q->isWindow() && qobject_cast(q) - && static_cast(q)->unifiedTitleAndToolBarOnMac(); - if (includeFrame) - return childAtRecursiveHelper(p, ignoreChildrenInDestructor, includeFrame); -#endif - if (!pointInsideRectAndMask(p)) return 0; return childAtRecursiveHelper(p, ignoreChildrenInDestructor); } -QWidget *QWidgetPrivate::childAtRecursiveHelper(const QPoint &p, bool ignoreChildrenInDestructor, bool includeFrame) const +QWidget *QWidgetPrivate::childAtRecursiveHelper(const QPoint &p, bool ignoreChildrenInDestructor) const { -#ifndef Q_WS_MAC - Q_UNUSED(includeFrame); -#endif for (int i = children.size() - 1; i >= 0; --i) { QWidget *child = qobject_cast(children.at(i)); if (!child || child->isWindow() || child->isHidden() || child->testAttribute(Qt::WA_TransparentForMouseEvents) @@ -9432,14 +9409,6 @@ QWidget *QWidgetPrivate::childAtRecursiveHelper(const QPoint &p, bool ignoreChil // Map the point 'p' from parent coordinates to child coordinates. QPoint childPoint = p; -#ifdef Q_WS_MAC - // 'includeFrame' is true if the child's parent is a top-level QMainWindow with an unified tool bar. - // An unified tool bar on the Mac lives outside QMainWindow's geometry(), so a normal - // QWidget::mapFromParent won't do the trick. - if (includeFrame && qobject_cast(child)) - childPoint = qt_mac_nativeMapFromParent(child, p); - else -#endif childPoint -= child->data->crect.topLeft(); // Check if the point hits the child. @@ -9614,13 +9583,7 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f) bool newParent = (parent != parentWidget()) || !wasCreated || desktopWidget; if (newParent && parent && !desktopWidget) { - if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) -#ifdef Q_WS_MAC - // On Mac, toolbars inside the unified title bar will never overlap with - // siblings in the content view. So we skip enforce native siblings in that case - && !d->isInUnifiedToolbar && parentWidget() && parentWidget()->isWindow() -#endif // Q_WS_MAC - ) + if (testAttribute(Qt::WA_NativeWindow) && !qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings)) parent->d_func()->enforceNativeChildren(); else if (parent->d_func()->nativeChildrenForced() || parent->testAttribute(Qt::WA_PaintOnScreen)) setAttribute(Qt::WA_NativeWindow); @@ -9879,12 +9842,6 @@ void QWidget::repaint(const QRect &rect) return; if (hasBackingStoreSupport()) { -#ifdef Q_WS_MAC - if (qt_widget_private(this)->isInUnifiedToolbar) { - qt_widget_private(this)->unifiedSurface->renderToolbar(this, true); - return; - } -#endif // Q_WS_MAC QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) { tlwExtra->inRepaint = true; @@ -9914,12 +9871,6 @@ void QWidget::repaint(const QRegion &rgn) return; if (hasBackingStoreSupport()) { -#ifdef Q_WS_MAC - if (qt_widget_private(this)->isInUnifiedToolbar) { - qt_widget_private(this)->unifiedSurface->renderToolbar(this, true); - return; - } -#endif // Q_WS_MAC QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) { tlwExtra->inRepaint = true; @@ -9982,12 +9933,6 @@ void QWidget::update(const QRect &rect) } if (hasBackingStoreSupport()) { -#ifdef Q_WS_MAC - if (qt_widget_private(this)->isInUnifiedToolbar) { - qt_widget_private(this)->unifiedSurface->renderToolbar(this, true); - return; - } -#endif // Q_WS_MAC QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) tlwExtra->backingStoreTracker->markDirty(r, this); @@ -10017,12 +9962,6 @@ void QWidget::update(const QRegion &rgn) } if (hasBackingStoreSupport()) { -#ifdef Q_WS_MAC - if (qt_widget_private(this)->isInUnifiedToolbar) { - qt_widget_private(this)->unifiedSurface->renderToolbar(this, true); - return; - } -#endif // Q_WS_MAC QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) tlwExtra->backingStoreTracker->markDirty(r, this); @@ -10218,13 +10157,7 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) qApp->inputMethod()->commit(); qApp->inputMethod()->update(Qt::ImEnabled); } - if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget() -#ifdef Q_WS_MAC - // On Mac, toolbars inside the unified title bar will never overlap with - // siblings in the content view. So we skip enforce native siblings in that case - && !d->isInUnifiedToolbar && parentWidget()->isWindow() -#endif // Q_WS_MAC - ) + if (!qApp->testAttribute(Qt::AA_DontCreateNativeWidgetSiblings) && parentWidget()) parentWidget()->d_func()->enforceNativeChildren(); if (on && !internalWinId() && testAttribute(Qt::WA_WState_Created)) d->createWinId(); @@ -11544,28 +11477,6 @@ void QWidget::clearMask() setMask(QRegion()); } -#ifdef Q_WS_MAC -void QWidgetPrivate::syncUnifiedMode() { - // The whole purpose of this method is to keep the unifiedToolbar in sync. - // That means making sure we either exchange the drawing methods or we let - // the toolbar know that it does not require to draw the baseline. - Q_Q(QWidget); - // This function makes sense only if this is a top level - if(!q->isWindow()) - return; - OSWindowRef window = qt_mac_window_for(q); - if(changeMethods) { - // Ok, we are in documentMode. - if(originalDrawMethod) - qt_mac_replaceDrawRect(window, this); - } else { - if(!originalDrawMethod) - qt_mac_replaceDrawRectOriginal(window, this); - } -} - -#endif // Q_WS_MAC - QT_END_NAMESPACE #include "moc_qwidget.cpp" diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index df40908c00..943b7057b5 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -495,7 +495,7 @@ public: void setConstraints_sys(); bool pointInsideRectAndMask(const QPoint &) const; QWidget *childAt_helper(const QPoint &, bool) const; - QWidget *childAtRecursiveHelper(const QPoint &p, bool, bool includeFrame = false) const; + QWidget *childAtRecursiveHelper(const QPoint &p, bool) const; void updateGeometry_helper(bool forceUpdate); void getLayoutItemMargins(int *left, int *top, int *right, int *bottom) const; @@ -780,7 +780,6 @@ public: void finishCreateWindow_sys_Cocoa(void * /*NSWindow * */ windowRef); void syncCocoaMask(); void finishCocoaMaskSetup(); - void syncUnifiedMode(); // Did we add the drawRectOriginal method? bool drawRectOriginalAdded; // Is the original drawRect method available? diff --git a/src/widgets/widgets/qcocoatoolbardelegate_mac.mm b/src/widgets/widgets/qcocoatoolbardelegate_mac.mm deleted file mode 100644 index 2ea66b0d40..0000000000 --- a/src/widgets/widgets/qcocoatoolbardelegate_mac.mm +++ /dev/null @@ -1,151 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#import -#include -#include -#include -#include -#include -#include -#include -#include - -QT_BEGIN_NAMESPACE -extern QWidgetPrivate *qt_widget_private(QWidget *widget); -QT_END_NAMESPACE - -QT_FORWARD_DECLARE_CLASS(QMainWindowLayout); -QT_FORWARD_DECLARE_CLASS(QToolBar); -QT_FORWARD_DECLARE_CLASS(QCFString); - -@implementation QT_MANGLE_NAMESPACE(QCocoaToolBarDelegate) - -- (id)initWithMainWindowLayout:(QMainWindowLayout *)layout -{ - self = [super init]; - if (self) { - mainWindowLayout = layout; - } - return self; -} - -- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar -{ - Q_UNUSED(toolbar); - return [NSArray arrayWithObject:@"org.qt-project.qt.nstoolbar-qtoolbar"]; -} - -- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar -{ - return [self toolbarAllowedItemIdentifiers:toolbar]; -} - -- (void)toolbarDidRemoveItem:(NSNotification *)notification -{ - NSToolbarItem *item = [[notification userInfo] valueForKey:@"item"]; - mainWindowLayout->unifiedToolbarHash.remove(item); - for (int i = 0; i < mainWindowLayout->toolbarItemsCopy.size(); ++i) { - if (mainWindowLayout->toolbarItemsCopy.at(i) == item) { - // I know about it, so release it. - mainWindowLayout->toolbarItemsCopy.removeAt(i); - mainWindowLayout->qtoolbarsInUnifiedToolbarList.removeAt(i); - [item release]; - break; - } - } -} - -- (NSToolbarItem *)toolbar:(NSToolbar *)nstoolbar itemForItemIdentifier:(NSString *)itemIdentifier - willBeInsertedIntoToolbar:(BOOL)flag -{ - Q_UNUSED(flag); - Q_UNUSED(nstoolbar); - QToolBar *tb = mainWindowLayout->cocoaItemIDToToolbarHash.value( - QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)(itemIdentifier)); - NSToolbarItem *item = nil; - if (tb) { - item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; - mainWindowLayout->unifiedToolbarHash.insert(item, tb); - } - return item; -} - -- (void)toolbarWillAddItem:(NSNotification *)notification -{ - NSToolbarItem *item = [[notification userInfo] valueForKey:@"item"]; - QToolBar *tb = mainWindowLayout->cocoaItemIDToToolbarHash.value( - QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)([item itemIdentifier])); - if (!tb) - return; // I can't really do anything about this. - [item retain]; - [item setView:QT_PREPEND_NAMESPACE(qt_mac_nativeview_for)(tb)]; - - NSArray *items = [[qt_mac_window_for(mainWindowLayout->layoutState.mainWindow->window()) toolbar] items]; - int someIndex = 0; - for (NSToolbarItem *i in items) { - if (i == item) - break; - ++someIndex; - } - mainWindowLayout->toolbarItemsCopy.insert(someIndex, item); - - // This is synchronization code that was needed in Carbon, but may not be needed anymore here. - QToolBar *toolbar = mainWindowLayout->unifiedToolbarHash.value(item); - if (toolbar) { - int toolbarIndex = mainWindowLayout->qtoolbarsInUnifiedToolbarList.indexOf(toolbar); - if (someIndex != toolbarIndex) { - // Dang, we must be out of sync, rebuild it from the "toolbarItemsCopy" - mainWindowLayout->qtoolbarsInUnifiedToolbarList.clear(); - for (int i = 0; i < mainWindowLayout->toolbarItemsCopy.size(); ++i) { - // This will either append the correct toolbar or an - // null toolbar. This is fine because this list - // is really only kept to make sure that things are but in the right order. - mainWindowLayout->qtoolbarsInUnifiedToolbarList.append( - mainWindowLayout->unifiedToolbarHash.value(mainWindowLayout-> - toolbarItemsCopy.at(i))); - } - } - toolbar->update(); - } -} - -@end diff --git a/src/widgets/widgets/qcocoatoolbardelegate_mac_p.h b/src/widgets/widgets/qcocoatoolbardelegate_mac_p.h deleted file mode 100644 index f74f608660..0000000000 --- a/src/widgets/widgets/qcocoatoolbardelegate_mac_p.h +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "qmacdefines_mac.h" -#import - -QT_BEGIN_NAMESPACE -class QMainWindowLayout; -class QToolBar; -QT_END_NAMESPACE - -@class NSToolbarItem; - -@interface QT_MANGLE_NAMESPACE(QCocoaToolBarDelegate) : NSObject { - QT_PREPEND_NAMESPACE(QMainWindowLayout) *mainWindowLayout; - NSToolbarItem *toolbarItem; -} - -- (id)initWithMainWindowLayout:(QT_PREPEND_NAMESPACE(QMainWindowLayout) *)layout; -@end diff --git a/src/widgets/widgets/qmainwindowlayout_mac.mm b/src/widgets/widgets/qmainwindowlayout_mac.mm deleted file mode 100644 index 38605c2e09..0000000000 --- a/src/widgets/widgets/qmainwindowlayout_mac.mm +++ /dev/null @@ -1,292 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include -#include -#include - -#include -#import - -QT_BEGIN_NAMESPACE -#ifdef QT_NAMESPACE - -// namespace up the stuff -#define SS(x) #x -#define S0(x) SS(x) -#define S "org.qt-project.qt-" S0(QT_NAMESPACE) ".qmainwindow.qtoolbarInHIToolbar" -#define SToolbar "org.qt-project.qt-" S0(QT_NAMESPACE) ".hitoolbar-qtoolbar" -#define SNSToolbar "org.qt-project.qt-" S0(QT_NAMESPACE) ".qtoolbarInNSToolbar" -#define MacToolbar "org.qt-project.qt-" S0(QT_NAMESPACE) ".qmainwindow.mactoolbar" - -static NSString *kQToolBarNSToolbarIdentifier = @SNSToolbar; -static CFStringRef kQMainWindowMacToolbarID = CFSTR(MacToolbar); -#undef SS -#undef S0 -#undef S -#undef SToolbar -#undef SNSToolbar -#undef MacToolbar - -#else -static NSString *kQToolBarNSToolbarIdentifier = @"org.qt-project.qt.qmainwindow.qtoolbarInNSToolbar"; -static CFStringRef kQMainWindowMacToolbarID = CFSTR("org.qt-project.qt.qmainwindow.mactoolbar"); -#endif // QT_NAMESPACE - - -#ifndef kWindowUnifiedTitleAndToolbarAttribute -#define kWindowUnifiedTitleAndToolbarAttribute (1 << 7) -#endif - -void QMainWindowLayout::updateHIToolBarStatus() -{ - bool useMacToolbar = layoutState.mainWindow->unifiedTitleAndToolBarOnMac(); - - layoutState.mainWindow->setUpdatesEnabled(false); // reduces a little bit of flicker, not all though - QMacCocoaAutoReleasePool pool; - NSView *cView = [qt_mac_window_for(layoutState.mainWindow) contentView]; - if (useMacToolbar) { - [cView setPostsFrameChangedNotifications:YES]; - [[NSNotificationCenter defaultCenter] addObserver: [QT_MANGLE_NAMESPACE(QCocoaWindowDelegate) sharedDelegate] - selector: @selector(syncContentViewFrame:) - name: NSViewFrameDidChangeNotification - object: cView]; - } - if (!useMacToolbar) { - macWindowToolbarShow(layoutState.mainWindow, false); - // Move everything out of the HIToolbar into the main toolbar. - while (!qtoolbarsInUnifiedToolbarList.isEmpty()) { - // Should shrink the list by one every time. - QToolBar *toolbar = qtoolbarsInUnifiedToolbarList.first(); - unifiedSurface->removeToolbar(toolbar); - layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, toolbar); - } - macWindowToolbarSet(qt_mac_window_for(layoutState.mainWindow), 0); - } else { - QList toolbars = layoutState.mainWindow->findChildren(); - for (int i = 0; i < toolbars.size(); ++i) { - QToolBar *toolbar = toolbars.at(i); - if (toolBarArea(toolbar) == Qt::TopToolBarArea) { - // Do this here, because we are in an in-between state. - removeWidget(toolbar); - layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, toolbar); - } - } - syncUnifiedToolbarVisibility(); - } - if (!useMacToolbar) { - [cView setPostsFrameChangedNotifications:NO]; - [[NSNotificationCenter defaultCenter] removeObserver: [QT_MANGLE_NAMESPACE(QCocoaWindowDelegate) sharedDelegate] - name: NSViewFrameDidChangeNotification - object: cView]; - } - layoutState.mainWindow->setUpdatesEnabled(true); -} - -void QMainWindowLayout::insertIntoMacToolbar(QToolBar *before, QToolBar *toolbar) -{ - // This layering could go on to one more level, but I decided to stop here. - // The HIToolbar and NSToolbar APIs are fairly similar as you will see. - if (toolbar == 0) - return; - - // toolbar will now become native (if not already) since we need - // an nsview for it inside the corresponding NSToolbarItem. - // Setting isInUnifiedToolbar will (among other things) stop alien - // siblings from becoming native when this happends since the toolbar - // will not overlap with other children of the QMainWindow. NB: Switching - // unified toolbar off after this stage is not supported, as this means - // that either the menubar must be alien again, or the sibling must - // be backed by an nsview to protect from overlapping issues: - toolbar->d_func()->isInUnifiedToolbar = true; - - QToolBarLayout *toolbarLayout = static_cast(toolbar->layout()); - toolbarSaveState.insert(toolbar, ToolBarSaveState(toolbar->isMovable(), toolbar->maximumSize())); - - if (toolbarLayout->hasExpandFlag() == false) - toolbar->setMaximumSize(toolbar->sizeHint()); - - toolbar->setMovable(false); - toolbarLayout->setUsePopupMenu(true); - // Make the toolbar a child of the mainwindow to avoid creating a window. - toolbar->setParent(layoutState.mainWindow); - - toolbar->winId(); // Now create the OSViewRef. - layoutState.mainWindow->createWinId(); - - OSWindowRef window = qt_mac_window_for(layoutState.mainWindow); - int beforeIndex = qtoolbarsInUnifiedToolbarList.indexOf(before); - if (beforeIndex == -1) - beforeIndex = qtoolbarsInUnifiedToolbarList.size(); - - int toolbarIndex = qtoolbarsInUnifiedToolbarList.indexOf(toolbar); - - QMacCocoaAutoReleasePool pool; - NSToolbar *macToolbar = [window toolbar]; - if (macToolbar == nil) { - macToolbar = [[NSToolbar alloc] initWithIdentifier:(NSString *)kQMainWindowMacToolbarID]; - [macToolbar setDisplayMode:NSToolbarDisplayModeIconOnly]; - [macToolbar setSizeMode:NSToolbarSizeModeRegular]; - [macToolbar setDelegate:[[QT_MANGLE_NAMESPACE(QCocoaToolBarDelegate) alloc] initWithMainWindowLayout:this]]; - [window setToolbar:macToolbar]; - [macToolbar release]; - } - if (toolbarIndex != -1) { - qtoolbarsInUnifiedToolbarList.removeAt(toolbarIndex); - [macToolbar removeItemAtIndex:toolbarIndex]; - } - qtoolbarsInUnifiedToolbarList.insert(beforeIndex, toolbar); - - // Adding to the unified toolbar surface for the raster engine. - if (layoutState.mainWindow->windowSurface()) { - QPoint offset(0, 0); - for (int i = 0; i < beforeIndex; ++i) { - offset.setX(offset.x() + qtoolbarsInUnifiedToolbarList.at(i)->size().width()); - } - unifiedSurface->insertToolbar(toolbar, offset); - } - - NSString *toolbarID = kQToolBarNSToolbarIdentifier; - toolbarID = [toolbarID stringByAppendingFormat:@"%p", toolbar]; - cocoaItemIDToToolbarHash.insert(qt_mac_NSStringToQString(toolbarID), toolbar); - [macToolbar insertItemWithItemIdentifier:toolbarID atIndex:beforeIndex]; -} - -void QMainWindowLayout::updateUnifiedToolbarOffset() -{ - QPoint offset(0, 0); - - for (int i = 1; i < qtoolbarsInUnifiedToolbarList.length(); ++i) { - offset.setX(offset.x() + qtoolbarsInUnifiedToolbarList.at(i - 1)->size().width()); - qtoolbarsInUnifiedToolbarList.at(i)->d_func()->toolbar_offset = offset; - } -} - - -void QMainWindowLayout::removeFromMacToolbar(QToolBar *toolbar) -{ - QHash::iterator it = unifiedToolbarHash.begin(); - while (it != unifiedToolbarHash.end()) { - if (it.value() == toolbar) { - // Rescue our HIView and set it on the mainWindow again. - bool saveVisible = !toolbar->isHidden(); - toolbar->setParent(0); - toolbar->setParent(parentWidget()); - toolbar->setVisible(saveVisible); - ToolBarSaveState saveState = toolbarSaveState.value(toolbar); - static_cast(toolbar->layout())->setUsePopupMenu(false); - toolbar->setMovable(saveState.movable); - toolbar->setMaximumSize(saveState.maximumSize); - toolbarSaveState.remove(toolbar); - NSToolbarItem *item = static_cast(it.key()); - [[qt_mac_window_for(layoutState.mainWindow->window()) toolbar] - removeItemAtIndex:toolbarItemsCopy.indexOf(item)]; - unifiedToolbarHash.remove(item); - qtoolbarsInUnifiedToolbarList.removeAll(toolbar); - break; - } - ++it; - } -} - -void QMainWindowLayout::cleanUpMacToolbarItems() -{ - QMacCocoaAutoReleasePool pool; - for (int i = 0; i < toolbarItemsCopy.size(); ++i) { - NSToolbarItem *item = static_cast(toolbarItemsCopy.at(i)); - [item setView:0]; - CFRelease(toolbarItemsCopy.at(i)); - } - toolbarItemsCopy.clear(); - unifiedToolbarHash.clear(); - - OSWindowRef window = qt_mac_window_for(layoutState.mainWindow); - NSToolbar *macToolbar = [window toolbar]; - if (macToolbar) { - [[macToolbar delegate] release]; - [macToolbar setDelegate:nil]; - } -} - -void QMainWindowLayout::fixSizeInUnifiedToolbar(QToolBar *tb) const -{ - QHash::const_iterator it = unifiedToolbarHash.constBegin(); - NSToolbarItem *item = nil; - while (it != unifiedToolbarHash.constEnd()) { - if (tb == it.value()) { - item = static_cast(it.key()); - break; - } - ++it; - } - if (item) { - QMacCocoaAutoReleasePool pool; - QWidgetItem layoutItem(tb); - QSize size = layoutItem.maximumSize(); - NSSize nssize = NSMakeSize(size.width(), size.height()); - [item setMaxSize:nssize]; - size = layoutItem.minimumSize(); - nssize.width = size.width(); - nssize.height = size.height(); - [item setMinSize:nssize]; - } -} - -void QMainWindowLayout::syncUnifiedToolbarVisibility() -{ - if (blockVisiblityCheck) - return; - - Q_ASSERT(layoutState.mainWindow->unifiedTitleAndToolBarOnMac()); - bool show = false; - const int ToolBarCount = qtoolbarsInUnifiedToolbarList.count(); - for (int i = 0; i < ToolBarCount; ++i) { - if (qtoolbarsInUnifiedToolbarList.at(i)->isVisible()) { - show = true; - break; - } - } - macWindowToolbarShow(layoutState.mainWindow, show); -} - -QT_END_NAMESPACE diff --git a/src/widgets/widgets/qtoolbar.cpp b/src/widgets/widgets/qtoolbar.cpp index 096f53de40..5e7eb943ab 100644 --- a/src/widgets/widgets/qtoolbar.cpp +++ b/src/widgets/widgets/qtoolbar.cpp @@ -57,11 +57,6 @@ #include #include #include -#ifdef Q_WS_MAC -#include -#include -#endif - #include #include "qtoolbar_p.h" @@ -74,14 +69,6 @@ QT_BEGIN_NAMESPACE -#ifdef Q_WS_MAC -static void qt_mac_updateToolBarButtonHint(QWidget *parentWidget) -{ - if (!(parentWidget->windowFlags() & Qt::CustomizeWindowHint)) - parentWidget->setWindowFlags(parentWidget->windowFlags() | Qt::MacWindowToolBarButtonHint); -} -#endif - // qmainwindow.cpp extern QMainWindowLayout *qt_mainwindow_layout(const QMainWindow *window); @@ -104,17 +91,6 @@ void QToolBarPrivate::init() layout = new QToolBarLayout(q); layout->updateMarginAndSpacing(); -#ifdef Q_WS_MAC - if (q->parentWidget() && q->parentWidget()->isWindow()) { - // Make sure that the window has the "toolbar" button. - QWidget *parentWidget = q->parentWidget(); - qt_mac_updateToolBarButtonHint(parentWidget); - reinterpret_cast(parentWidget)->d_func()->createWinId(); // Please let me create your winId... - extern OSWindowRef qt_mac_window_for(const QWidget *); // qwidget_mac.cpp - macWindowToolbarShow(q->parentWidget(), true); - } -#endif - toggleViewAction = new QAction(q); toggleViewAction->setCheckable(true); q->setMovable(q->style()->styleHint(QStyle::SH_ToolBar_Movable, 0, q )); @@ -158,12 +134,8 @@ void QToolBarPrivate::updateWindowFlags(bool floating, bool unplug) flags |= Qt::FramelessWindowHint; - if (unplug) { + if (unplug) flags |= Qt::X11BypassWindowManagerHint; -#ifdef Q_WS_MAC - flags |= Qt::WindowStaysOnTopHint; -#endif - } q->setWindowFlags(flags); } @@ -569,16 +541,6 @@ QToolBar::QToolBar(const QString &title, QWidget *parent) */ QToolBar::~QToolBar() { - // Remove the toolbar button if there is nothing left. - QMainWindow *mainwindow = qobject_cast(parentWidget()); - if (mainwindow) { -#ifdef Q_WS_MAC - QMainWindowLayout *mainwin_layout = qt_mainwindow_layout(mainwindow); - if (mainwin_layout && mainwin_layout->layoutState.toolBarAreaLayout.isEmpty() - && mainwindow->testAttribute(Qt::WA_WState_Created)) - macWindowToolbarShow(mainwindow, false); -#endif - } } /*! \property QToolBar::movable @@ -665,12 +627,6 @@ void QToolBar::setAllowedAreas(Qt::ToolBarAreas areas) Qt::ToolBarAreas QToolBar::allowedAreas() const { Q_D(const QToolBar); -#ifdef Q_WS_MAC - if (QMainWindow *window = qobject_cast(parentWidget())) { - if (window->unifiedTitleAndToolBarOnMac()) // Don't allow drags to the top (for now). - return (d->allowedAreas & ~Qt::TopToolBarArea); - } -#endif return d->allowedAreas; } @@ -1083,15 +1039,6 @@ static bool waitForPopup(QToolBar *tb, QWidget *popup) return false; } -#if defined(Q_WS_MAC) -static bool toolbarInUnifiedToolBar(QToolBar *toolbar) -{ - const QMainWindow *mainWindow = qobject_cast(toolbar->parentWidget()); - return mainWindow && mainWindow->unifiedTitleAndToolBarOnMac() - && mainWindow->toolBarArea(toolbar) == Qt::TopToolBarArea; -} -#endif - /*! \reimp */ bool QToolBar::event(QEvent *event) { @@ -1115,22 +1062,9 @@ bool QToolBar::event(QEvent *event) case QEvent::Show: d->toggleViewAction->setChecked(event->type() == QEvent::Show); emit visibilityChanged(event->type() == QEvent::Show); -#if defined(Q_WS_MAC) - if (toolbarInUnifiedToolBar(this)) { - // I can static_cast because I did the qobject_cast in the if above, therefore - // we must have a QMainWindowLayout here. - QMainWindowLayout *mwLayout = qt_mainwindow_layout(qobject_cast(parentWidget())); - mwLayout->fixSizeInUnifiedToolbar(this); - mwLayout->syncUnifiedToolbarVisibility(); - } -#endif // Q_WS_MAC break; case QEvent::ParentChange: d->layout->checkUsePopupMenu(); -#if defined(Q_WS_MAC) - if (parentWidget() && parentWidget()->isWindow()) - qt_mac_updateToolBarButtonHint(parentWidget()); -#endif break; case QEvent::MouseButtonPress: { diff --git a/src/widgets/widgets/qtoolbarlayout.cpp b/src/widgets/widgets/qtoolbarlayout.cpp index 3c0c84ee2f..fe919feba9 100644 --- a/src/widgets/widgets/qtoolbarlayout.cpp +++ b/src/widgets/widgets/qtoolbarlayout.cpp @@ -332,20 +332,6 @@ void QToolBarLayout::updateGeomArray() const rpick(o, that->hint) += handleExtent; that->hint += QSize(2*margin, 2*margin); - that->dirty = false; -#ifdef Q_WS_MAC - if (QMainWindow *mw = qobject_cast(parentWidget()->parentWidget())) { - if (mw->unifiedTitleAndToolBarOnMac() - && mw->toolBarArea(static_cast(parentWidget())) == Qt::TopToolBarArea) { - if (expandFlag) { - tb->setMaximumSize(0xFFFFFF, 0xFFFFFF); - } else { - tb->setMaximumSize(hint); - } - } - } -#endif - that->dirty = false; } @@ -401,15 +387,6 @@ void QToolBarLayout::setGeometry(const QRect &rect) if (!extension->isHidden()) extension->hide(); } -#ifdef Q_WS_MAC - if (QMainWindow *win = qobject_cast(tb->parentWidget())) { - Qt::ToolBarArea area = win->toolBarArea(tb); - if (win->unifiedTitleAndToolBarOnMac() && area == Qt::TopToolBarArea) { - qt_mainwindow_layout(win)->fixSizeInUnifiedToolbar(tb); - } - } -#endif - } bool QToolBarLayout::layoutActions(const QSize &size) diff --git a/src/widgets/widgets/widgets.pri b/src/widgets/widgets/widgets.pri index efe1dd3616..1bae87ebcc 100644 --- a/src/widgets/widgets/widgets.pri +++ b/src/widgets/widgets/widgets.pri @@ -155,15 +155,6 @@ macx { widgets/qmaccocoaviewcontainer_mac.mm } -# TODO -false:mac { - OBJECTIVE_HEADERS += widgets/qcocoatoolbardelegate_mac_p.h \ - widgets/qcocoamenu_mac_p.h - OBJECTIVE_SOURCES += widgets/qcocoatoolbardelegate_mac.mm \ - widgets/qmainwindowlayout_mac.mm - -} - wince*: { SOURCES += widgets/qmenu_wince.cpp HEADERS += widgets/qmenu_wince_resource_p.h -- cgit v1.2.3 From 7fab8eb56b9309734d1b34d3d935d6a4cf14ce6e Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 7 Jan 2014 14:43:22 +0100 Subject: Windows: Do not print test output to both stdout and system debug log Avoid piping the test output to both the Windows system debugger, and stdout. This fixes duplicate output in Qt Creator, which displays messages from both sources. [ChangeLog][QtTestLib] The (default) plain text logger on Windows now logs to either the system debug log (in case no console is open), or stdout, not both. Task-number: QTBUG-34630 Change-Id: I35fe9f4a50cc660d79fad7dffa6d19659b2102ae Reviewed-by: Thiago Macieira Reviewed-by: Friedemann Kleint --- src/corelib/global/qlogging.cpp | 2 +- src/testlib/qplaintestlogger.cpp | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index cc20891c76..5b7a674ddb 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -102,7 +102,7 @@ static inline bool hasStdErr() } # endif // !Q_OS_WINCE && !Q_OS_WINRT -bool qWinLogToStderr() +Q_CORE_EXPORT bool qWinLogToStderr() { # if !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT) static const bool result = hasStdErr(); diff --git a/src/testlib/qplaintestlogger.cpp b/src/testlib/qplaintestlogger.cpp index 77be0e423e..3f65dc0a6e 100644 --- a/src/testlib/qplaintestlogger.cpp +++ b/src/testlib/qplaintestlogger.cpp @@ -197,6 +197,10 @@ namespace QTest { } } +#if defined(Q_OS_WIN) +Q_CORE_EXPORT bool qWinLogToStderr(); // defined in qlogging.cpp +#endif + void QPlainTestLogger::outputMessage(const char *str) { #if defined(Q_OS_WINCE) @@ -209,7 +213,11 @@ void QPlainTestLogger::outputMessage(const char *str) } while (!strUtf16.isEmpty()); if (stream != stdout) #elif defined(Q_OS_WIN) - OutputDebugStringA(str); + // log to system log only if output is not redirected, and no console is attached + if (!qWinLogToStderr() && stream == stdout) { + OutputDebugStringA(str); + return; + } #elif defined(Q_OS_ANDROID) __android_log_write(ANDROID_LOG_INFO, "QTestLib", str); #endif -- cgit v1.2.3 From a761be2fb2191215426f904cb03df0e966214531 Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Sat, 23 Nov 2013 00:15:30 +0100 Subject: Correct wordwrapped text handling in QListView icon mode Currently a QListView with wordwrapping activated will wrap the text only to the width of the icon even if the grid size is bigger. With this patch the option rect is now updated to match the grid size if valid and the style uses it to determine the correct size when wrapping [ChangeLog][QtWidgets][QTBUG-4714] Use the grid size for wordwrapping when available in icon mode Task-number: QTBUG-4714 Change-Id: I2cb63809d3ee8bd262f38bc11de91df9ff5cf237 Reviewed-by: Stephen Kelly --- src/widgets/itemviews/qlistview.cpp | 5 +++++ src/widgets/styles/qcommonstyle.cpp | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp index 0cca52daa2..8238e5f6d4 100644 --- a/src/widgets/itemviews/qlistview.cpp +++ b/src/widgets/itemviews/qlistview.cpp @@ -915,6 +915,11 @@ QStyleOptionViewItem QListView::viewOptions() const } else { option.decorationPosition = QStyleOptionViewItem::Left; } + + if (d->gridSize().isValid()) { + option.rect.setSize(d->gridSize()); + } + return option; } diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp index a9f1c3bbbc..2d7107598f 100644 --- a/src/widgets/styles/qcommonstyle.cpp +++ b/src/widgets/styles/qcommonstyle.cpp @@ -838,7 +838,10 @@ QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int break; case QStyleOptionViewItem::Top: case QStyleOptionViewItem::Bottom: - bounds.setWidth(wrapText ? option->decorationSize.width() : QFIXED_MAX); + if (wrapText) + bounds.setWidth(bounds.isValid() ? bounds.width() - 2 * textMargin : option->decorationSize.width()); + else + bounds.setWidth(QFIXED_MAX); break; default: break; -- cgit v1.2.3 From 48caaee17016629b1459041e6d8b2fa7a888b62a Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 9 Jan 2014 15:16:49 -0800 Subject: Ask qdoc not to parse Q_DECL_UNUSED We have it on function declarations and it gets a bit lost... Change-Id: I19ba2e760f3714c26e78c3d8fd2570af3dcd136e Reviewed-by: Martin Smith Reviewed-by: Frederik Gladhorn --- doc/global/qt-cpp-defines.qdocconf | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/global/qt-cpp-defines.qdocconf b/doc/global/qt-cpp-defines.qdocconf index 528b0cd561..37fa5dbdcf 100644 --- a/doc/global/qt-cpp-defines.qdocconf +++ b/doc/global/qt-cpp-defines.qdocconf @@ -30,6 +30,7 @@ Cpp.ignoretokens += \ Q_DECL_DEPRECATED \ Q_DECL_NOEXCEPT \ Q_DECL_NOTHROW \ + Q_DECL_UNUSED \ Q_DECLARATIVE_EXPORT \ Q_EXPLICIT \ Q_EXPORT \ -- cgit v1.2.3 From f10356ead13e39c9501b84ee5e92efe722a2d2c7 Mon Sep 17 00:00:00 2001 From: lpapuga Date: Wed, 20 Nov 2013 17:09:57 +0100 Subject: MIPS DSP build system fix and additional optimizations. Changed MIPS DSP portion of the mkspecs/features/simd.prf file in order to fix the corrupted build system for MIPS platforms. List of the additionally optimized functions from file src/gui/painting/qdrawhelper.cpp: - qt_blend_rgb16_on_rgb16 - qt_fetchUntransformed_888 - qt_fetchUntransformed_444 - qt_fetchUntransformed_argb8565 from file src/gui/image/qimage.cpp: - convert_ARGB_to_ARGB_PM_inplace from file src/corelib/qstring.cpp: - ucstrncmp - toLatin1_helper - fromLatin1_helper Change-Id: I5c47a69784917eee29a8dbd2718828a390b27c93 Reviewed-by: Thiago Macieira --- mkspecs/features/simd.prf | 12 +- src/corelib/corelib.pro | 14 + src/corelib/tools/qstring.cpp | 35 ++ src/corelib/tools/qstring_mips_dsp_asm.S | 449 +++++++++++++++++++++ src/corelib/tools/tools.pri | 4 + src/gui/image/image.pri | 2 + src/gui/image/qimage.cpp | 6 + src/gui/image/qimage_mips_dspr2.cpp | 69 ++++ src/gui/image/qimage_mips_dspr2_asm.S | 207 ++++++++++ src/gui/painting/qdrawhelper.cpp | 17 +- src/gui/painting/qdrawhelper_mips_dsp.cpp | 97 ++++- src/gui/painting/qdrawhelper_mips_dsp_asm.S | 478 +++++++++++++++++++++- src/gui/painting/qdrawhelper_mips_dsp_p.h | 45 ++- src/gui/painting/qdrawhelper_mips_dspr2_asm.S | 550 +++++++++++++++++++++++++- src/gui/painting/qt_mips_asm_dsp_p.h | 166 +++++++- 15 files changed, 2141 insertions(+), 10 deletions(-) create mode 100644 src/corelib/tools/qstring_mips_dsp_asm.S create mode 100644 src/gui/image/qimage_mips_dspr2.cpp create mode 100644 src/gui/image/qimage_mips_dspr2_asm.S diff --git a/mkspecs/features/simd.prf b/mkspecs/features/simd.prf index a98683d929..ad8c545819 100644 --- a/mkspecs/features/simd.prf +++ b/mkspecs/features/simd.prf @@ -174,10 +174,19 @@ QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH) mips_dsp_assembler.name = assembling[mips_dsp] ${QMAKE_FILE_IN} silent:mips_dsp_assembler.commands = @echo assembling[mips_dsp] ${QMAKE_FILE_IN} && $$mips_dsp_assembler.commands QMAKE_EXTRA_COMPILERS += mips_dsp_compiler + QMAKE_EXTRA_COMPILERS += mips_dsp_assembler } mips_dspr2 { HEADERS += $$MIPS_DSP_HEADERS + mips_dspr2_compiler.commands = $$QMAKE_CXX -c + mips_dspr2_compiler.commands += $(CXXFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} + mips_dspr2_compiler.dependency_type = TYPE_C + mips_dspr2_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)} + mips_dspr2_compiler.input = MIPS_DSPR2_SOURCES + mips_dspr2_compiler.variable_out = OBJECTS + mips_dspr2_compiler.name = compiling[mips_dspr2] ${QMAKE_FILE_IN} + silent:mips_dspr2_compiler.commands = @echo compiling[mips_dspr2] ${QMAKE_FILE_IN} && $$mips_dspr2_compiler.commands mips_dspr2_assembler.commands = $$QMAKE_CC -c mips_dspr2_assembler.commands += $(CFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} mips_dspr2_assembler.dependency_type = TYPE_C @@ -186,6 +195,7 @@ QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH) mips_dspr2_assembler.variable_out = OBJECTS mips_dspr2_assembler.name = assembling[mips_dspr2] ${QMAKE_FILE_IN} silent:mips_dspr2_assembler.commands = @echo assembling[mips_dspr2] ${QMAKE_FILE_IN} && $$mips_dspr2_assembler.commands + QMAKE_EXTRA_COMPILERS += mips_dspr2_compiler QMAKE_EXTRA_COMPILERS += mips_dspr2_assembler } } else:win32-msvc*|winrt { @@ -297,7 +307,7 @@ QT_CPU_FEATURES = $$eval(QT_CPU_FEATURES.$$QT_ARCH) $$AVX_SOURCES $$AVX2_SOURCES \ $$NEON_SOURCES $$NEON_ASM \ $$IWMMXT_SOURCES \ - $$MIPS_DSP_SOURCES $$MIPS_DSP_ASM $$MIPS_DSPR2_ASM + $$MIPS_DSP_SOURCES $$MIPS_DSPR2_SOURCES $$MIPS_DSP_ASM $$MIPS_DSPR2_ASM # Headers are already done in the above sections. } diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro index b513149e7c..df28183fdc 100644 --- a/src/corelib/corelib.pro +++ b/src/corelib/corelib.pro @@ -111,3 +111,17 @@ ctest_qt5_module_files.files += $$ctest_macros_file.output $$cmake_extras_mkspec ctest_qt5_module_files.path = $$[QT_INSTALL_LIBS]/cmake/Qt5Core INSTALLS += ctest_qt5_module_files cmake_qt5_umbrella_module_files + +mips_dsp:*-g++* { + HEADERS += $$MIPS_DSP_HEADERS + + mips_dsp_corelib_assembler.commands = $$QMAKE_CXX -c + mips_dsp_corelib_assembler.commands += $(CXXFLAGS) $(INCPATH) -mips32r2 -mdsp ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} + mips_dsp_corelib_assembler.dependency_type = TYPE_C + mips_dsp_corelib_assembler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)} + mips_dsp_corelib_assembler.input = MIPS_DSP_ASM + mips_dsp_corelib_assembler.variable_out = OBJECTS + mips_dsp_corelib_assembler.name = assembling[mips_dsp] ${QMAKE_FILE_IN} + silent:mips_dsp_corelib_assembler.commands = @echo assembling[mips_dsp] ${QMAKE_FILE_IN} && $$mips_dsp_corelib_assembler.commands + QMAKE_EXTRA_COMPILERS += mips_dsp_corelib_assembler +} diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 3976f2cb6f..d682207314 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -188,9 +188,23 @@ static int ucstricmp(const ushort *a, const ushort *ae, const uchar *b, const uc return 1; } +#if defined(__mips_dsp) +// From qstring_mips_dsp_asm.S +extern "C" int qt_ucstrncmp_mips_dsp_asm(const ushort *a, + const ushort *b, + unsigned len); +#endif + // Unicode case-sensitive compare two same-sized strings static int ucstrncmp(const QChar *a, const QChar *b, int l) { +#if defined(__mips_dsp) + if (l >= 8) { + return qt_ucstrncmp_mips_dsp_asm(reinterpret_cast(a), + reinterpret_cast(b), + l); + } +#endif // __mips_dsp while (l-- && *a == *b) a++,b++; if (l==-1) @@ -3937,6 +3951,10 @@ static inline __m128i mergeQuestionMarks(__m128i chunk) } #endif +#if defined(__mips_dsp) +extern "C" void qt_toLatin1_mips_dsp_asm(uchar *dst, const ushort *src, int length); +#endif + static QByteArray toLatin1_helper(const QChar *data, int length) { QByteArray ba; @@ -3989,10 +4007,14 @@ static QByteArray toLatin1_helper(const QChar *data, int length) length = length % 8; } #endif +#if defined(__mips_dsp) + qt_toLatin1_mips_dsp_asm(dst, src, length); +#else while (length--) { *dst++ = (*src>0xff) ? '?' : (uchar) *src; ++src; } +#endif } return ba; } @@ -4104,6 +4126,12 @@ QVector QString::toUcs4() const return v; } +#if defined(__mips_dsp) +// From qstring_mips_dsp_asm.S +extern "C" void qt_fromlatin1_mips_asm_unroll4 (ushort*, const char*, uint); +extern "C" void qt_fromlatin1_mips_asm_unroll8 (ushort*, const char*, uint); +#endif + QString::Data *QString::fromLatin1_helper(const char *str, int size) { Data *d; @@ -4144,8 +4172,15 @@ QString::Data *QString::fromLatin1_helper(const char *str, int size) size = size % 16; } #endif +#if defined(__mips_dsp) + if (size > 20) + qt_fromlatin1_mips_asm_unroll8(dst, str, size); + else + qt_fromlatin1_mips_asm_unroll4(dst, str, size); +#else while (size--) *dst++ = (uchar)*str++; +#endif } return d; } diff --git a/src/corelib/tools/qstring_mips_dsp_asm.S b/src/corelib/tools/qstring_mips_dsp_asm.S new file mode 100644 index 0000000000..aee162c290 --- /dev/null +++ b/src/corelib/tools/qstring_mips_dsp_asm.S @@ -0,0 +1,449 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../../gui/painting/qt_mips_asm_dsp_p.h" + +.macro EXTRACT_HALVES_x2 src1, src2, hi_1, hi_2 +#if defined(__MIPSEL) && __MIPSEL + srl \hi_1, \src1, 16 + ext \src1, \src1, 0, 16 + srl \hi_2, \src2, 16 + ext \src2, \src2, 0, 16 +#else + ext \hi_1, \src1, 0, 16 + srl \src1, \src1, 16 + ext \hi_2, \src2, 0, 16 + srl \src2, \src2, 16 +#endif +.endm + + +LEAF_MIPS_DSP(qt_ucstrncmp_mips_dsp_asm) +/* + * Arguments: + * a0 - string_a (uint16_t*) + * a1 - string_b (uint16_t*) + * a2 - length (uint32_t) + * + * Register usage: + * t0 - batches + */ + + move v0, zero /* result = 0 */ + andi t0, a0, 0x3 /* t1 = string_a % 4 */ + andi t1, a1, 0x3 /* t0 = string_b % 4 */ + or t2, t0, t1 /* t2 = t0 | t1 */ + + beqz t2, 5f /* both aligned */ + and t2, t0 ,t1 + beqz t2, 6f /* one aligned */ + nop + + /* + * Both strings are unaligned: read 1 halfword from each, + * then fall-off to continue with the both-aligned case. + */ + lhu t0, 0 (a0) + lhu t1, 0 (a1) + addiu a2, a2, -1 /* len-- */ + sub v0, t0, t1 /* v0 = t0-t1 */ + addiu a0, a0, 2 /* string_a++ */ + bnez v0, 0f /* if (t0-t1): return */ + addiu a1, a1, 2 /* string_b++ */ + beqz a2, 0f /* if !len: return */ + /* next instruction (srl) fills delay branch slot */ + +5: /* Both string pointers are aligned */ + srl t0, a2, 3 /* batches = length / 8 */ + beqz t0, 9f /* if !batches: tail */ + andi a2, a2, 0x7 /* length = length % 8 */ + + SAVE_REGS_ON_STACK 0, s0, s1, s2, s3 + +1: lw t1, 0 (a0) /* [a0 a1] */ + lw t3, 4 (a0) /* [a2 a3] */ + lw t5, 8 (a0) /* [a4 a5] */ + lw t7, 12 (a0) /* [a6 a7] */ + + lw t2, 0 (a1) /* [b0 b1] */ + lw t4, 4 (a1) /* [b2 b3] */ + lw t6, 8 (a1) /* [b4 b5] */ + lw t8, 12 (a1) /* [b6 b7] */ + + /* + * Subtract elements one by one, if the result is zero + * both halves of the registers (shorts) are equal. + */ + subq.ph s0, t1, t2 /* [a0-b0 a1-b1] */ + subq.ph s1, t3, t4 /* [a2-b2 a3-b3] */ + + bnez s0, 1f + subq.ph s2, t5, t6 /* [a4-b4 a5-b5] */ + bnez s1, 2f + subq.ph s3, t7, t8 /* [a6-b6 a7-b7] */ + bnez s2, 3f + addiu t0, t0, -1 /* batches-- */ + bnez s3, 4f + addiu a0, a0, 8*2 /* string_a += 8 */ + + bnez t0, 1b /* if batches: loop */ + addiu a1, a1, 8*2 /* string_b += 8 */ + + RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3 + + bnez a2, 9f /* if length: tail */ + nop + jr ra + nop + + + 1: /* Check t1 [a0 a1] vs. t2 [b0 b1] */ + EXTRACT_HALVES_x2 t1, t2, t3, t4 /* a0, b0, a1, b1 */ + sub v0, t1, t2 + RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3 + bnez v0, 0f /* if (a0-b0): return */ + nop + jr ra + sub v0, t3, t4 /* return a1-b1 */ + + 2: /* Check t3 [a2 a3] vs. t4 [b2 b3] */ + EXTRACT_HALVES_x2 t3, t4, t1, t2 /* a2, b2, a3, b3 */ + sub v0, t3, t4 + RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3 + bnez v0, 0f /* if (a2-b2): return */ + nop + jr ra + sub v0, t1, t2 /* return a3-b3 */ + + 3: /* Check t5 [a4 a5] vs. t6 [b4 b5] */ + EXTRACT_HALVES_x2 t5, t6, t1, t2 /* a4, b4, a5, b5 */ + sub v0, t5, t6 + RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3 + bnez v0, 0f /* if (a4-b4): return */ + nop + jr ra + sub v0, t1, t2 /* return a5-b5 */ + + 4: /* Check t7 [a6 a7] vs. t8 [b6 b7] */ + EXTRACT_HALVES_x2 t7, t8, t1, t2 /* a6, b6, a7, b7 */ + sub v0, t7, t8 + RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3 + bnez v0, 0f /* if (a6-b6): return */ + nop + jr ra + sub v0, t1, t2 + + + /* Process remaining tail items. */ +9: lhu t1, 0 (a0) /* a */ + lhu t2, 0 (a1) /* b */ + addiu a2, a2, -1 /* length-- */ + sub v0, t1, t2 /* result = (a - b) */ + + bnez v0, 0f /* if (a - b): return */ + addiu a0, a0, 2 /* string_a++ */ + + bnez a2, 9b /* if length: loop */ + addiu a1, a1, 2 /* string_b++ */ + +0: jr ra + nop + + + /* One of the inputs is unaligned, do unrolled half-word loads */ +6: srl t0, a2, 3 /* batches = length / 8 */ + andi a2, a2, 0x7 /* length = length % 8 */ + +1: lhu t1, 0 (a0) + lhu t2, 0 (a1) + lhu t3, 2 (a0) + lhu t4, 2 (a1) + lhu t5, 4 (a0) + lhu t6, 4 (a1) + lhu t7, 6 (a0) + lhu t8, 6 (a1) + + sub v0, t1, t2 + sub t1, t3, t4 + + bnez v0, 0f + sub t2, t5, t6 + bnez t1, 2f + sub t3, t7, t8 + bnez t2, 3f + lhu t1, 8 (a0) + bnez t3, 4f + lhu t2, 8 (a1) + + lhu t3, 10 (a0) + lhu t4, 10 (a1) + lhu t5, 12 (a0) + lhu t6, 12 (a1) + lhu t7, 14 (a0) + lhu t8, 14 (a1) + + sub v0, t1, t2 + sub t1, t3, t4 + + bnez v0, 0f + sub t2, t5, t6 + bnez t1, 2f + sub t3, t7, t8 + bnez t2, 3f + addiu t0, t0, -1 /* batches-- */ + bnez t3, 4f + addiu a0, a0, 8*2 /* string_a += 8 */ + + bnez t0, 1b + addiu a1, a1, 8*2 /* string_b += 8 */ + + bnez a2, 9b /* if length: tail */ + nop + +0: jr ra + nop +2: jr ra + move v0, t1 +3: jr ra + move v0, t2 +4: jr ra + move v0, t3 + +END(qt_ucstrncmp_mips_dsp_asm) + + +#if defined(__mips_dspr2) +LEAF_MIPS_DSPR2(qt_fromlatin1_mips_asm_unroll8) +#else +LEAF_MIPS_DSP(qt_fromlatin1_mips_asm_unroll8) +#endif + + andi t0, a1, 0x3 + beqz t0, 9f /* check that src is aligned */ + nop + +1: lbu t1, 0 (a1) + addiu a1, a1, 1 + addiu a2, a2, -1 + sh t1, 0 (a0) + beqz a2, 0f + andi t0, a1, 0x3 + bnez t0, 1b + addiu a0, a0, 2 + +9: /* source pointer is aligned: do batches of 8 elements */ + andi t0, a0, 3 /* check if dst is aligned */ + bnez t0, 6f + srl t0, a2, 3 /* batches = len / 8 */ + andi a2, a2, 0x7 /* tail = len % 8 */ + + beqz t0, 8f /* if !batches: tail */ + nop + +1: lw t1, 0 (a1) + lw t2, 4 (a1) + + addiu a1, a1, 8*1 + addiu t0, t0, -1 + + preceu.ph.qbl t3, t1 + preceu.ph.qbr t1, t1 + preceu.ph.qbl t4, t2 + preceu.ph.qbr t2, t2 + +#if defined(__MIPSEL) && __MIPSEL + sw t1, 0 (a0) + sw t3, 4 (a0) + sw t2, 8 (a0) + sw t4, 12 (a0) +#else + sw t3, 0 (a0) + sw t1, 4 (a0) + sw t4, 8 (a0) + sw t2, 12 (a0) +#endif + + bnez t0, 1b + addiu a0, a0, 8*2 + +8: /* process tail items */ + beqz a2, 0f + nop + +1: lbu t1, 0 (a1) + addiu a2, a2, -1 + sh t1, 0 (a0) + addiu a1, a1, 1 + bnez a2, 1b + addiu a0, a0, 2 + +0: jr ra + nop + +6: beqz t0, 8b + andi a2, a2, 7 +7: lw t1, 0(a1) + lw t2, 4(a1) + addiu t0, t0, -1 + addiu a1, a1, 8 + andi t3, t1, 0xff +#if defined(__mips_dspr2) + prepend t1, t2, 8 +#else + sll t4, t4, 24 + srl t1, t1, 8 + or t1, t1, t4 +#endif + srl t2, t2, 8 + preceu.ph.qbr t4, t1 + preceu.ph.qbl t1, t1 + preceu.ph.qbr t5, t2 + srl t2, t2, 16 + sh t3, 0(a0) + sw t4, 2(a0) + sw t1, 6(a0) + sw t5, 10(a0) + sh t2, 14(a0) + bnez t0, 7b + addiu a0, a0, 16 + bnez a2, 1b + nop + + jr ra + nop + +END(qt_fromlatin1_mips_asm_unroll8) + + +LEAF_MIPS_DSP(qt_fromlatin1_mips_asm_unroll4) +/* + * Arguments: + * a0 - dst (uint16_t*) + * a1 - src (const char*) + * a2 - len (unsigned int) + */ + + /* + * QString::fromLatin1_helper() already handles the len==0 + * case: assume that len is never zero. + */ + srl t0, a2, 2 + beqz t0, 9f + andi a2, a2, 0x3 + +1: lbu t1, 0(a1) + lbu t2, 1(a1) + lbu t3, 2(a1) + lbu t4, 3(a1) + sh t1, 0(a0) + sh t2, 2(a0) + sh t3, 4(a0) + sh t4, 6(a0) + addiu t0, t0, -1 + addiu a1, a1, 4 + bnez t0, 1b + addiu a0, a0, 8 + +8: beqz a2, 0f + nop + +9: lbu t1, 0(a1) + addiu a2, a2, -1 + addiu a1, a1, 1 + sh t1, 0(a0) + bnez a2, 9b + addiu a0, a0, 2 + +0: jr ra + nop + +END(qt_fromlatin1_mips_asm_unroll4) + + +LEAF_MIPS_DSP(qt_toLatin1_mips_dsp_asm) + /* + * a0 - dst + * a1 - src + * a2 - length + */ + + addiu t9, zero, 0x3f + srl t8, a2, 2 + beqz t8, 2f + andi a2, a2, 3 +1: + lhu t0, 0(a1) + lhu t1, 2(a1) + lhu t2, 4(a1) + lhu t3, 6(a1) + srl t4, t0, 8 + srl t5, t1, 8 + srl t6, t2, 8 + srl t7, t3, 8 + movn t0, t9, t4 + movn t1, t9, t5 + movn t2, t9, t6 + movn t3, t9, t7 + addiu a1, a1, 8 + addiu t8, t8, -1 + sb t0, 0(a0) + sb t1, 1(a0) + sb t2, 2(a0) + sb t3, 3(a0) + bgtz t8, 1b + addiu a0, a0, 4 +2: beqz a2, 4f + nop +3: + lhu t0, 0(a1) + addiu a1, a1, 2 + addiu a2, a2, -1 + srl t1, t0, 8 + movn t0, t9, t1 + sb t0, 0(a0) + bgtz a2, 3b + addiu a0, a0, 1 +4: + jr ra + nop + +END(qt_toLatin1_mips_dsp_asm) + diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri index e4a7b02aee..cac596f0bc 100644 --- a/src/corelib/tools/tools.pri +++ b/src/corelib/tools/tools.pri @@ -192,3 +192,7 @@ INCLUDEPATH += ../3rdparty/md5 \ !macx-icc:!vxworks:unix:LIBS_PRIVATE += -lm TR_EXCLUDE += ../3rdparty/* + +# MIPS DSP +MIPS_DSP_ASM += tools/qstring_mips_dsp_asm.S +MIPS_DSP_HEADERS += ../gui/painting/qt_mips_asm_dsp_p.h diff --git a/src/gui/image/image.pri b/src/gui/image/image.pri index a80ab4a2fe..bf4b5ddf01 100644 --- a/src/gui/image/image.pri +++ b/src/gui/image/image.pri @@ -78,3 +78,5 @@ NEON_SOURCES += image/qimage_neon.cpp SSE2_SOURCES += image/qimage_sse2.cpp SSSE3_SOURCES += image/qimage_ssse3.cpp AVX_SOURCES += image/qimage_avx.cpp +MIPS_DSPR2_SOURCES += image/qimage_mips_dspr2.cpp +MIPS_DSPR2_ASM += image/qimage_mips_dspr2_asm.S diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 12ab5eaffa..70fe7b783f 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -3960,6 +3960,12 @@ void qInitImageConversions() return; } #endif + +#ifdef QT_COMPILER_SUPPORTS_MIPS_DSPR2 + extern bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags); + inplace_converter_map[QImage::Format_ARGB32][QImage::Format_ARGB32_Premultiplied] = convert_ARGB_to_ARGB_PM_inplace_mips_dspr2; + return; +#endif } extern const uchar *qt_pow_rgb_gamma(); diff --git a/src/gui/image/qimage_mips_dspr2.cpp b/src/gui/image/qimage_mips_dspr2.cpp new file mode 100644 index 0000000000..a1c40a16df --- /dev/null +++ b/src/gui/image/qimage_mips_dspr2.cpp @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qimage.h" +#include + +QT_BEGIN_NAMESPACE + +// Defined in qimage_mips_dspr2_asm.S +// +extern "C" void premultiply_argb_inplace_mips_asm(void*, unsigned, unsigned, int); + +bool convert_ARGB_to_ARGB_PM_inplace_mips_dspr2(QImageData *data, Qt::ImageConversionFlags) +{ + Q_ASSERT(data->format == QImage::Format_ARGB32); + + if (!data->width || !data->height) + return true; + + Q_ASSERT((data->bytes_per_line - (data->width << 2)) >= 0); + + premultiply_argb_inplace_mips_asm(data->data, + data->height, + data->width, + data->bytes_per_line - (data->width << 2)); + + data->format = QImage::Format_ARGB32_Premultiplied; + return true; +} + +QT_END_NAMESPACE diff --git a/src/gui/image/qimage_mips_dspr2_asm.S b/src/gui/image/qimage_mips_dspr2_asm.S new file mode 100644 index 0000000000..1f03b72dd4 --- /dev/null +++ b/src/gui/image/qimage_mips_dspr2_asm.S @@ -0,0 +1,207 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "../painting/qt_mips_asm_dsp_p.h" + +LEAF_MIPS_DSPR2(premultiply_argb_inplace_mips_asm) + + SAVE_REGS_ON_STACK 0, s0, s1, s2, s3 + +3: srl v1, a2, 3 /* t1 = linelen / 8 */ + addiu a1, a1, -1 /* numlines-- */ + beqz v1, 1f /* if (!(linelen / 8)): tail */ + andi v0, a2, 0x7 /* v0 = linelen % 8 */ + pref 5, 0 (a0) /* cache-hint: store-streamed */ + + /* unrolled loop, handles (v1 = len / 8) batches of 8 pixels */ +2: addiu v1, v1, -1 + pref 5, 0(a0) + pref 5, 32(a0) + + lw t0, 0(a0) + lw t1, 4(a0) + lw t2, 8(a0) + lw t3, 12(a0) + srl t4, t0, 24 /* 00|00|00|A1 */ + replv.ph t5, t4 /* 00|A1|00|A1 */ + srl t6, t1, 24 /* 00|00|00|A2 */ + replv.ph t7, t6 /* 00|A2|00|A2 */ + muleu_s.ph.qbl t8, t0, t5 /* A1*A1|A1*R1 */ + muleu_s.ph.qbr t0, t0, t5 /* A1*G1|A1*B1 */ + muleu_s.ph.qbl t9, t1, t7 /* A2*A2|A2*R2 */ + muleu_s.ph.qbr t1, t1, t7 /* A2*G2|A2*B2 */ + srl t5, t2, 24 /* 00|00|00|A3 */ + replv.ph s0, t5 /* 00|A3|00|A3 */ + srl t7, t3, 24 /* 00|00|00|A4 */ + replv.ph s1, t7 /* 00|A4|00|A4 */ + muleu_s.ph.qbl s2, t2, s0 /* A3*A3|A3*R3 */ + muleu_s.ph.qbr t2, t2, s0 /* A3*G3|A3*B3 */ + muleu_s.ph.qbl s0, t3, s1 /* A4*A4|A4*R4 */ + muleu_s.ph.qbr t3, t3, s1 /* A4*G4|A4*B4 */ + preceu.ph.qbla s1, t8 + preceu.ph.qbla s3, t0 + addu.ph t8, t8, s1 + addu.ph t0, t0, s3 + preceu.ph.qbla s1, t9 + preceu.ph.qbla s3, t1 + addu.ph t9, t9, s1 + addu.ph t1, t1, s3 + preceu.ph.qbla s1, s2 + preceu.ph.qbla s3, t2 + addu.ph s2, s2, s1 + addu.ph t2, t2, s3 + preceu.ph.qbla s1, s0 + preceu.ph.qbla s3, t3 + addu.ph s0, s0, s1 + addu.ph t3, t3, s3 + shra_r.ph t8, t8, 8 /* xxAA1|xxRR1 */ + shra_r.ph t0, t0, 8 /* xxBB1|xxGG1 */ + shra_r.ph t9, t9, 8 + shra_r.ph t1, t1, 8 + shra_r.ph s2, s2, 8 + shra_r.ph t2, t2, 8 + shra_r.ph s0, s0, 8 + shra_r.ph t3, t3, 8 + precr.qb.ph t0, t8, t0 + precr.qb.ph t1, t9, t1 + precr.qb.ph t2, s2, t2 + precr.qb.ph t3, s0, t3 + append t4, t0, 24 + append t6, t1, 24 + append t5, t2, 24 + append t7, t3, 24 + sw t4, 0(a0) + sw t6, 4(a0) + sw t5, 8(a0) + sw t7, 12(a0) + + lw t0, 16(a0) + lw t1, 20(a0) + lw t2, 24(a0) + lw t3, 28(a0) + srl t4, t0, 24 /* 00|00|00|A1 */ + replv.ph t5, t4 /* 00|A1|00|A1 */ + srl t6, t1, 24 /* 00|00|00|A2 */ + replv.ph t7, t6 /* 00|A2|00|A2 */ + muleu_s.ph.qbl t8, t0, t5 /* A1*A1|A1*R1 */ + muleu_s.ph.qbr t0, t0, t5 /* A1*G1|A1*B1 */ + muleu_s.ph.qbl t9, t1, t7 /* A2*A2|A2*R2 */ + muleu_s.ph.qbr t1, t1, t7 /* A2*G2|A2*B2 */ + srl t5, t2, 24 /* 00|00|00|A3 */ + replv.ph s0, t5 /* 00|A3|00|A3 */ + srl t7, t3, 24 /* 00|00|00|A4 */ + replv.ph s1, t7 /* 00|A4|00|A4 */ + muleu_s.ph.qbl s2, t2, s0 /* A3*A3|A3*R3 */ + muleu_s.ph.qbr t2, t2, s0 /* A3*G3|A3*B3 */ + muleu_s.ph.qbl s0, t3, s1 /* A4*A4|A4*R4 */ + muleu_s.ph.qbr t3, t3, s1 /* A4*G4|A4*B4 */ + preceu.ph.qbla s1, t8 + preceu.ph.qbla s3, t0 + addu.ph t8, t8, s1 + addu.ph t0, t0, s3 + preceu.ph.qbla s1, t9 + preceu.ph.qbla s3, t1 + addu.ph t9, t9, s1 + addu.ph t1, t1, s3 + preceu.ph.qbla s1, s2 + preceu.ph.qbla s3, t2 + addu.ph s2, s2, s1 + addu.ph t2, t2, s3 + preceu.ph.qbla s1, s0 + preceu.ph.qbla s3, t3 + addu.ph s0, s0, s1 + addu.ph t3, t3, s3 + shra_r.ph t8, t8, 8 /* xxAA1|xxRR1 */ + shra_r.ph t0, t0, 8 /* xxBB1|xxGG1 */ + shra_r.ph t9, t9, 8 + shra_r.ph t1, t1, 8 + shra_r.ph s2, s2, 8 + shra_r.ph t2, t2, 8 + shra_r.ph s0, s0, 8 + shra_r.ph t3, t3, 8 + precr.qb.ph t0, t8, t0 + precr.qb.ph t1, t9, t1 + precr.qb.ph t2, s2, t2 + precr.qb.ph t3, s0, t3 + append t4, t0, 24 + append t6, t1, 24 + append t5, t2, 24 + append t7, t3, 24 + sw t4, 16(a0) + sw t6, 20(a0) + sw t5, 24(a0) + sw t7, 28(a0) + bgtz v1, 2b /* if (t1): unrolled loop */ + addiu a0, a0, 32 /* data += 8 */ + + beqz v0, 4f /* if (!v0): skip tail loop */ + nop + + /* tail loop, handles (len < 8), one pixel at a time */ +1: lw t1, 0 (a0) + addiu v0, v0, -1 /* len-- */ + srl t2, t1, 24 /* t2 = alpha */ + replv.ph t3, t2 + muleu_s.ph.qbl t4, t1, t3 + muleu_s.ph.qbr t1, t1, t3 + preceu.ph.qbla t3, t4 + preceu.ph.qbla t5, t1 + addu.ph t4, t4, t3 + addu.ph t1, t1, t5 + shra_r.ph t4, t4, 8 + shra_r.ph t1, t1, 8 + precr.qb.ph t1, t4, t1 + append t2, t1, 24 + sw t2, 0(a0) + bgtz v0, 1b + addiu a0, a0, 4 /* src++ */ + +4: bnez a1, 3b /* if (numlines): loop */ + addu a0, a0, a3 /* src += srclineskip */ + +0: /* return */ + RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3 + + jr ra + nop + +END(premultiply_argb_inplace_mips_asm) + diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index a037545dc2..cc28076b7c 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -1790,7 +1790,7 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper return buffer; } -static const SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = { +static SourceFetchProc sourceFetch[NBlendTypes][QImage::NImageFormats] = { // Untransformed { 0, // Invalid @@ -6402,6 +6402,21 @@ void qInitDrawhelperAsm() destStoreProc[QImage::Format_ARGB32] = qt_destStoreARGB32_mips_dsp; + sourceFetch[BlendUntransformed][QImage::Format_RGB888] = qt_fetchUntransformed_888_mips_dsp; + sourceFetch[BlendTiled][QImage::Format_RGB888] = qt_fetchUntransformed_888_mips_dsp; + + sourceFetch[BlendUntransformed][QImage::Format_RGB444] = qt_fetchUntransformed_444_mips_dsp; + sourceFetch[BlendTiled][QImage::Format_RGB444] = qt_fetchUntransformed_444_mips_dsp; + + sourceFetch[BlendUntransformed][QImage::Format_ARGB8565_Premultiplied] = qt_fetchUntransformed_argb8565_premultiplied_mips_dsp; + sourceFetch[BlendTiled][QImage::Format_ARGB8565_Premultiplied] = qt_fetchUntransformed_argb8565_premultiplied_mips_dsp; + +#if defined(QT_COMPILER_SUPPORTS_MIPS_DSPR2) + qBlendFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_blend_rgb16_on_rgb16_mips_dspr2; +#else + qBlendFunctions[QImage::Format_RGB16][QImage::Format_RGB16] = qt_blend_rgb16_on_rgb16_mips_dsp; +#endif // QT_COMPILER_SUPPORTS_MIPS_DSPR2 + #endif // QT_COMPILER_SUPPORTS_MIPS_DSP if (functionForModeSolidAsm) { const int destinationMode = QPainter::CompositionMode_Destination; diff --git a/src/gui/painting/qdrawhelper_mips_dsp.cpp b/src/gui/painting/qdrawhelper_mips_dsp.cpp index a9b551c226..2202b78ce8 100644 --- a/src/gui/painting/qdrawhelper_mips_dsp.cpp +++ b/src/gui/painting/qdrawhelper_mips_dsp.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic +** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtGui module of the Qt Toolkit. @@ -110,6 +110,78 @@ void qt_blend_rgb32_on_rgb32_mips_dsp(uchar *destPixels, int dbpl, } } +#if defined QT_COMPILER_SUPPORTS_MIPS_DSPR2 +void qt_blend_rgb16_on_rgb16_mips_dspr2(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha) +{ + if (const_alpha == 256) { + if (w < 256) { + const quint16 *src = (const quint16*) srcPixels; + quint16 *dst = (quint16*) destPixels; + for (int y = 0; y < h; ++y) { + qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm(dst, src, w); + dst = (quint16*) (((uchar*) dst) + dbpl); + src = (quint16*) (((uchar*) src) + sbpl); + } + } + else { + int length = w << 1; + while (h--) { + memcpy(destPixels, srcPixels, length); + destPixels += dbpl; + srcPixels += sbpl; + } + } + } + else if (const_alpha != 0) { + const quint16 *src = (const quint16*) srcPixels; + quint16 *dst = (quint16*) destPixels; + for (int y = 0; y < h; ++y) { + qt_blend_rgb16_on_rgb16_mips_dspr2_asm(dst, src, w, const_alpha); + dst = (quint16*) (((uchar*) dst) + dbpl); + src = (quint16*) (((uchar*) src) + sbpl); + } + } +} +#else +void qt_blend_rgb16_on_rgb16_mips_dsp(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha) +{ + if (const_alpha == 256) { + if (w < 256) { + const quint16 *src = (const quint16*) srcPixels; + quint16 *dst = (quint16*) destPixels; + for (int y = 0; y < h; ++y) { + qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm(dst, src, w); + dst = (quint16*) (((uchar*) dst) + dbpl); + src = (quint16*) (((uchar*) src) + sbpl); + } + } + else { + int length = w << 1; + while (h--) { + memcpy(destPixels, srcPixels, length); + destPixels += dbpl; + srcPixels += sbpl; + } + } + } + else if (const_alpha != 0) { + const quint16 *src = (const quint16*) srcPixels; + quint16 *dst = (quint16*) destPixels; + for (int y = 0; y < h; ++y) { + qt_blend_rgb16_on_rgb16_mips_dsp_asm(dst, src, w, const_alpha); + dst = (quint16*) (((uchar*) dst) + dbpl); + src = (quint16*) (((uchar*) src) + sbpl); + } + } +} +#endif + void comp_func_Source_mips_dsp(uint *dest, const uint *src, int length, uint const_alpha) { if (const_alpha == 255) { @@ -422,5 +494,28 @@ void QT_FASTCALL comp_func_SourceOut_mips_dsp(uint *dest, const uint *src, int l comp_func_SourceOut_dsp_asm_x2(dest, src, length, const_alpha); } +const uint * QT_FASTCALL qt_fetchUntransformed_888_mips_dsp (uint *buffer, const Operator *, const QSpanData *data, + int y, int x, int length) +{ + uchar *line = (uchar *)data->texture.scanLine(y) + x; + fetchUntransformed_888_asm_mips_dsp(buffer, line, length); + return buffer; +} + +const uint * QT_FASTCALL qt_fetchUntransformed_444_mips_dsp (uint *buffer, const Operator *, const QSpanData *data, + int y, int x, int length) +{ + uchar *line = (uchar *)data->texture.scanLine(y) + x; + fetchUntransformed_444_asm_mips_dsp(buffer, line, length); + return buffer; +} + +const uint * QT_FASTCALL qt_fetchUntransformed_argb8565_premultiplied_mips_dsp (uint *buffer, const Operator *, const QSpanData *data, + int y, int x, int length) +{ + uchar *line = (uchar *)data->texture.scanLine(y) + x; + fetchUntransformed_argb8565_premultiplied_asm_mips_dsp(buffer, line, length); + return buffer; +} QT_END_NAMESPACE diff --git a/src/gui/painting/qdrawhelper_mips_dsp_asm.S b/src/gui/painting/qdrawhelper_mips_dsp_asm.S index 64fc635970..26b48f9d62 100644 --- a/src/gui/painting/qdrawhelper_mips_dsp_asm.S +++ b/src/gui/painting/qdrawhelper_mips_dsp_asm.S @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic +** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtGui module of the Qt Toolkit. @@ -1601,3 +1601,479 @@ LEAF_MIPS_DSP(qt_blend_argb32_on_argb32_const_alpha_256_mips_dsp_asm) nop END(qt_blend_argb32_on_argb32_const_alpha_256_mips_dsp_asm) + + +#if defined(__MIPSEL) && __MIPSEL +# define PACK(r, s, t) packrl.ph r, s, t +# define SWHI(r, o, b) swl r, o + 1 (b) +# define SWLO(r, o, b) swr r, o + 0 (b) +# define LDHI(r, o, b) lwl r, o + 1 (b) +# define LDLO(r, o, b) lwr r, o + 2 (b) +#else +# define PACK(r, s, t) packrl.ph r, t, s +# define SWHI(r, o, b) swr r, o + 1 (b) +# define SWLO(r, o, b) swl r, o + 0 (b) +# define LDHI(r, o, b) lwr r, o + 1 (b) +# define LDLO(r, o, b) lwl r, o + 2 (b) +#endif + +LEAF_MIPS_DSP(qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm) +/* + * a0 - dst (*r5g6b5) + * a1 - src (const *r5g6b5) + * a2 - len (unsigned int) + * + * Register usage: + * t0-3 - Scratch registers + * t4 - Number of iterations to do in unrolled loops + * t5-7 - Auxiliary scratch registers. + * + * Check if base addresses of src/dst are aligned, cases: + * a) Both aligned. + * b) Both unaligned: + * 1. Copy a halfword + * 2. Use aligned case. + * c) dst aligned, src unaligned: + * 1. Read a word from dst, halfword from src. + * 2. Continue reading words from both. + * d) dst unaligned, src aligned: + * 1. Read a word from src, halfword from dst. + * 2. Continue reading words from both. + */ + + beqz a2, 0f /* if (a2:len == 0): return */ + andi t0, a0, 0x3 /* t0 = a0:dst % 4 */ + andi t1, a1, 0x3 /* t1 = a1:dst % 4 */ + or t2, t0, t1 /* t1 = t0 | t1 */ + + beqz t2, 4f /* both aligned */ + nop + beqz t0, 3f /* dst aligned, src unaligned */ + nop + beqz t1, 2f /* src aligned, dst unaligned */ + nop + + /* + * Both src/dst are unaligned: read 1 halfword from each, + * the fall-off to continue with word-aligned copy. + */ + lhu t0, 0 (a1) /* t0 <- ((uint16_t*) src)[0] */ + addiu a1, a1, 2 /* src++ */ + addiu a2, a2,-1 /* len-- */ + sh t0, 0 (a0) /* t1 -> ((uint16_t*) dst)[0] */ + addiu a0, a0, 2 /* dst++ */ + + /* + * Both src/dst pointers are word-aligned, process eight + * items at a time in an unrolled loop. + */ +4: beqz a2, 0f /* if (len == 0): return */ + srl t4, a2, 3 /* t4 = len / 8 */ + + beqz t4, 5f /* if (t4 == 0): tail */ + andi a2, a2, 0x07 /* len = len % 8 */ + +1: lw t0, 0 (a1) + lw t1, 4 (a1) + lw t2, 8 (a1) + lw t3, 12 (a1) + + addiu t4, t4, -1 /* t4-- */ + addiu a1, a1, 16 /* src += 8 */ + + sw t0, 0 (a0) + sw t1, 4 (a0) + sw t2, 8 (a0) + sw t3, 12 (a0) + + bnez t4, 1b + addiu a0, a0, 16 /* dst += 8 */ + + b 5f + nop + + + /* + * dst pointer is unaligned + */ +2: beqz a2, 0f /* if (len == 0): return */ + srl t4, a2, 3 /* t4 = len / 8 */ + beqz t4, 5f /* if (t4 == 0): tail */ + andi a2, a2, 0x07 /* len = len % 8 */ + +1: lw t0, 0 (a1) + lw t1, 4 (a1) + lw t2, 8 (a1) + lw t3, 12 (a1) + + addiu t4, t4, -1 /* t4-- */ + addiu a1, a1, 16 /* src += 8 */ + + SWLO (t0, 0, a0) + PACK (t5, t1, t0) + PACK (t6, t2, t1) + PACK (t7, t3, t2) + SWHI (t3, 14, a0) + sw t5, 2 (a0) + sw t6, 6 (a0) + sw t7, 10 (a0) + + bnez t4, 1b + addiu a0, a0, 16 /* dst += 8 */ + + b 5f + nop + + /* + * src pointer is unaligned + */ +3: beqz a2, 0f /* if (len == 0): return */ + srl t4, a2, 3 /* t4 = len / 8 */ + beqz t4, 5f /* if (t4 == 0): tail */ + andi a2, a2, 0x07 /* len = len % 8 */ + +1: LDHI (t0, 0, a1) + lw t1, 2 (a1) + lw t2, 6 (a1) + lw t3, 10 (a1) + LDLO (t5, 12, a1) + + addiu t4, t4, -1 /* t4-- */ + addiu a1, a1, 16 /* src += 8 */ + + PACK (t0, t1, t0) + PACK (t6, t2, t1) + PACK (t7, t3, t2) + sw t0, 0 (a0) + PACK (t0, t5, t3) + sw t6, 4 (a0) + sw t7, 8 (a0) + sw t0, 12 (a0) + + bnez t4, 1b + addiu a0, a0, 16 /* dst += 8 */ + + +5: /* Process remaining items (a2:len < 4), one at a time */ + beqz a2, 0f + nop + +1: lhu t0, 0 (a1) /* t0 <- ((uint16_t*) src)[0] */ + addiu a2, a2,-1 /* len-- */ + addiu a1, a1, 2 /* src++ */ + sh t0, 0 (a0) /* to -> ((uint16_t*) dst)[0] */ + bnez a2, 1b /* if (len != 0): loop */ + addiu a0, a0, 2 /* dst++ */ + +0: jr ra + nop + +END(qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm) + + +#undef LDHI +#undef LDLO +#undef PACK +#undef SWHI +#undef SWLO + + +LEAF_MIPS_DSP(qt_blend_rgb16_on_rgb16_mips_dsp_asm) +/* + * a0 - dst (*r5g6b5) + * a1 - src (const *r5g6b5) + * a2 - len (unsigned int) - batch length + * a3 - alpha (int) + */ + + beqz a2, 2f + li t9, 255 + sll t8, a3, 8 + subu a3, t8, a3 + srl a3, a3, 8 + subu t9, t9, a3 + addiu a3, a3, 1 + srl t4, a3, 2 + addiu t9, t9, 1 + srl t5, t9, 2 +1: + lhu t0, 0(a1) + lhu t1, 0(a0) + addiu a2, a2, -1 + andi t2, t0, 0x07e0 + andi t0, t0, 0xf81f + mul t2, t2, a3 + mul t0, t0, t4 + andi t3, t1, 0x07e0 + andi t1, t1, 0xf81f + mul t3, t3, t9 + mul t1, t1, t5 + addiu a1, a1, 2 + srl t2, t2, 8 + srl t0, t0, 6 + andi t2, t2, 0x07e0 + andi t0, t0, 0xf81f + or t0, t0, t2 + srl t3, t3, 8 + srl t1, t1, 6 + andi t3, t3, 0x07e0 + andi t1, t1, 0xf81f + or t1, t1, t3 + addu t0, t0, t1 + sh t0, 0(a0) + bgtz a2, 1b + addiu a0, a0, 2 +2: + jr ra + nop + +END(qt_blend_rgb16_on_rgb16_mips_dsp_asm) + + +LEAF_MIPS_DSP(fetchUntransformed_888_asm_mips_dsp) +/* + * a0 - dst address (address of 32-bit aRGB value) + * a1 - src address + * a2 - length + */ + + beqz a2, 4f + lui t8, 0xff00 + andi t0, a2, 0x1 + beqz t0, 1f + nop +/* case for one pixel */ + lbu t1, 0(a1) + lbu v1, 2(a1) + lbu t0, 1(a1) + addiu a1, a1, 3 + addiu a2, a2, -1 + sll t1, t1, 0x10 + or v1, v1, t8 + sll t0, t0, 0x8 + or v1, v1, t1 + or v1, v1, t0 + sw v1, 0(a0) + addiu a0, a0, 4 + + beqz a2, 4f /* only one pixel is present (length = 1) */ + nop +1: + andi t0, a1, 0x1 + beqz t0, 3f + nop +2: + lbu t0, 0(a1) /* t0 = | 0 | 0 | 0 | R1 | */ + lhu t1, 1(a1) /* t1 = | 0 | 0 | B1 | G1 | */ + addiu a1, a1, 3 + lhu t2, 0(a1) /* t2 = | 0 | 0 | G2 | R2 | */ + lbu t3, 2(a1) /* t3 = | 0 | 0 | 0 | B2 | */ + + sll t0, t0, 16 + or t0, t0, t8 /* t0 = | ff | R1 | 0 | 0 | */ + shll.ph t4, t1, 8 /* t4 = | 0 | 0 | G1 | 0 | */ + srl t5, t1, 8 + or t4, t4, t5 /* t4 = | 0 | 0 | G1 | B1 | */ + or t0, t0, t4 /* t0 = | ff | R1 | G1 | B1 | */ + + shll.ph t4, t2, 8 /* t4 = | 0 | 0 | R2 | 0 | */ + srl t5, t2, 8 /* t5 = | 0 | 0 | 0 | G2 | */ + or t4, t4, t5 + sll t4, t4, 8 /* t4 = | 0 | R2 | G2 | 0 | */ + or t5, t3, t8 + or t2, t4, t5 /* t2 = | ff | R2 | G2 | B2 | */ + + sw t0, 0(a0) + addiu a1, a1, 3 + sw t2, 4(a0) + addiu a2, a2, -2 + bnez a2, 2b + addiu a0, a0, 8 + b 4f + nop +3: + lhu t0, 0(a1) /* t0 = | 0 | 0 | G1 | R1 | */ + lbu t1, 2(a1) /* t1 = | 0 | 0 | 0 | B1 | */ + addiu a1, a1, 3 + lbu t2, 0(a1) /* t2 = | 0 | 0 | 0 | R2 | */ + lhu t3, 1(a1) /* t3 = | 0 | 0 | B2 | G2 | */ + + srl t4, t0, 8 /* t4 = | 0 | 0 | 0 | G1 | */ + shll.ph t5, t0, 8 /* t5 = | 0 | 0 | R1 | 0 | */ + or t0, t4, t5 + sll t6, t0, 8 /* t6 = | 0 | R1 | G1 | 0 | */ + or t4, t1, t8 /* t4 = | ff | 0 | 0 | B1 | */ + or t0, t6, t4 + + sll t2, t2, 16 + srl t4, t3, 8 + shll.ph t5, t3, 8 + or t3, t4, t5 + or t2, t2, t3 + or t2, t2, t8 + + sw t0, 0(a0) + addiu a1, a1, 3 + sw t2, 4(a0) + addiu a2, a2, -2 + bnez a2, 3b + addiu a0, a0, 8 +4: + jr ra + nop + +END(fetchUntransformed_888_asm_mips_dsp) + + +LEAF_MIPS_DSP(fetchUntransformed_444_asm_mips_dsp) +/* + * a0 - dst address (address of 32-bit aRGB value) + * a1 - src address + * a2 - length + */ + + lui t8, 0xff00 + li t4, 0x1 + + beqz a2, 5f + move v0, a0 /* just return the address of buffer + * for storing returning values */ + andi t0, a2, 0x1 + beqz t0, 2f /* there is more then one pixel + * (check src memory alignment (word)) */ + nop +1: + lhu v0, 0(a1) + addiu a1, a1, 2 + addiu a2, a2, -1 + andi t0, v0, 0xf00 + andi v1, v0, 0xf + andi v0, v0, 0xf0 + sra t3, t0, 0x4 + sra t1, v0, 0x4 + sra t0, t0, 0x8 + sll t2, v1, 0x4 + or t0, t0, t3 + or v0, t1, v0 + lui t1, 0xff00 + or v1, t2, v1 + sll t0, t0, 0x10 + or v1, v1, t1 + sll v0, v0, 0x8 + or v1, v1, t0 + or v0, v1, v0 + sw v0, 0(a0) + addiu a0, a0, 4 + beqz a2, 5f /* no more pixels for processing */ + nop + beq a2, t4, 4f /* only one more pixel remained */ + nop +/* check if src memory address is word aligned */ +2: + andi t0, a1, 0x3 + beqz t0, 3f /* memory is word aligned */ + andi a3, a2, 0x1 /* set the a3 register as the comparation + * for ending the unrolled loop + * (1 if odd, 0 if even) */ + b 1b /* not word aligned, + * go another turn with + * just one pixel processing */ + nop +3: + lw t0, 0(a1) + addiu a2, a2, -2 + preceu.ph.qbr t1, t0 /* t1 = | 0 | aR1 | 0 | G1B1 | */ + preceu.ph.qbl t2, t0 /* t1 = | 0 | aR2 | 0 | G2B2 | */ + shll.qb t3, t1, 4 /* t3 = | 0 | R1 0 | 0 | B1 0 | */ + srl t4, t3, 4 + or t0, t3, t4 /* t0 = | 0 | R1R1 | 0 | B1B1 | */ + andi t3, t1, 0xf0 + sll t3, t3, 8 + srl t4, t3, 4 + or t1, t3, t4 + or t0, t0, t1 /* t0 = | 0 | R1R1 | G1G1 | B1B1 | */ + or t0, t0, t8 /* t0 = | ff | R1R1 | G1G1 | B1B1 | */ + + shll.qb t3, t2, 4 /* t3 = | 0 | R1 0 | 0 | B1 0 | */ + srl t4, t3, 4 + or t7, t3, t4 /* t0 = | 0 | R1R1 | 0 | B1B1 | */ + andi t3, t2, 0xf0 + sll t3, t3, 8 + srl t4, t3, 4 + or t1, t3, t4 + or t2, t7, t1 /* t0 = | 0 | R1R1 | G1G1 | B1B1 | */ + or t2, t2, t8 /* t0 = | ff | R1R1 | G1G1 | B1B1 | */ + + sw t0, 0(a0) + addiu a1, a1, 4 + sw t2, 4(a0) + bne a2, a3, 3b + addiu a0, a0, 8 + beqz a2, 5f /* no more pixels for processing */ + nop +4: +/* one more pixel remained (after loop unrolling process finished) */ + lhu v0, 0(a1) + addiu a1, a1, 2 + addiu a2, a2, -1 + andi t0, v0, 0xf00 + andi v1, v0, 0xf + andi v0, v0, 0xf0 + sra t3, t0, 0x4 + sra t1, v0, 0x4 + sra t0, t0, 0x8 + sll t2, v1, 0x4 + or t0, t0, t3 + or v0, t1, v0 + lui t1, 0xff00 + or v1, t2, v1 + sll t0, t0, 0x10 + or v1, v1, t1 + sll v0, v0, 0x8 + or v1, v1, t0 + or v0, v1, v0 + sw v0, 0(a0) + addiu a0, a0, 4 +5: + jr ra + nop + +END(fetchUntransformed_444_asm_mips_dsp) + + +LEAF_MIPS_DSP(fetchUntransformed_argb8565_premultiplied_asm_mips_dsp) +/* + * a0 - dst address + * a1 - src address + * a2 - length + */ + + beqz a2, 2f + nop + +1: + ulh t1, 0(a1) + lbu t2, 2(a1) + addiu a2, a2, -1 + wsbh t1, t1 + sll t0, t1, 8 /* t0 = 00000000rrrrrggggggbbbbb00000000 */ + ins t0, t1, 3, 16 /* t0 = 00000000rrrrrrrrrrggggggbbbbb000 */ + ins t0, t1, 5, 11 /* t0 = 00000000rrrrrrrrggggggbbbbbbb000 */ + srl t4, t1, 9 /* t4 = 0000000000000000000000000rrrrrgg */ + replv.qb t3, t2 + ins t0, t4, 8, 2 /* t0 = 00000000rrrrrrrrggggggggbbbbb000 */ + ins t0, t1, 3, 5 /* t0 = 00000000rrrrrrrrggggggggbbbbb000 */ + srl t4, t1, 2 /* t4 = 000000000000000000rrrrrggggggbbb */ + ins t0, t4, 0, 3 /* t0 = 00000000rrrrrrrrggggggggbbbbbbbb */ + ins t0, t2, 24, 8 /* t0 =aaaaaaaarrrrrrrrggggggggbbbbbbbb */ + cmpu.lt.qb t3, t0 + pick.qb t0, t3, t0 + addiu a1, a1, 3 + sw t0, 0(a0) + bgtz a2, 1b + addiu a0, a0, 4 +2: + jr ra + nop + +END(fetchUntransformed_argb8565_premultiplied_asm_mips_dsp) diff --git a/src/gui/painting/qdrawhelper_mips_dsp_p.h b/src/gui/painting/qdrawhelper_mips_dsp_p.h index 2df7d4920a..3dceb7793d 100644 --- a/src/gui/painting/qdrawhelper_mips_dsp_p.h +++ b/src/gui/painting/qdrawhelper_mips_dsp_p.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic +** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtGui module of the Qt Toolkit. @@ -101,19 +101,34 @@ extern "C" void qt_blend_argb32_on_argb32_mips_dsp_asm_x2(uint *dest, const uint extern "C" void qt_blend_argb32_on_argb32_const_alpha_256_mips_dsp_asm(uint *dest, const uint *src, int length); +extern "C" void qt_blend_rgb16_on_rgb16_const_alpha_256_mips_dsp_asm(quint16 *dest, const quint16 *src, int length); + +extern "C" void qt_blend_rgb16_on_rgb16_mips_dsp_asm(quint16 *dest, const quint16 *src, int length, uint const_alpha); + extern "C" uint * destfetchARGB32_asm_mips_dsp(uint *buffer, const uint *data, int length); extern "C" uint * qt_destStoreARGB32_asm_mips_dsp(uint *buffer, const uint *data, int length); +extern "C" uint * fetchUntransformed_888_asm_mips_dsp(uint *buffer, const uchar *line, int length); + +extern "C" uint * fetchUntransformed_444_asm_mips_dsp(uint *buffer, const uchar *line, int length); + +extern "C" uint * fetchUntransformed_argb8565_premultiplied_asm_mips_dsp(uint *buffer, const uchar *line, int length); + void qt_blend_argb32_on_argb32_mips_dsp(uchar *destPixels, int dbpl, const uchar *srcPixels, int sbpl, int w, int h, int const_alpha); void qt_blend_rgb32_on_rgb32_mips_dsp(uchar *destPixels, int dbpl, - const uchar *srcPixels, int sbpl, - int w, int h, - int const_alpha); + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha); + +void qt_blend_rgb16_on_rgb16_mips_dsp(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha); void comp_func_Source_mips_dsp(uint *dest, const uint *src, int length, uint const_alpha); @@ -164,6 +179,21 @@ void QT_FASTCALL comp_func_SourceOut_mips_dsp(uint *dest, const uint *src, int l void QT_FASTCALL comp_func_XOR_mips_dsp(uint *dest, const uint *src, int length, uint const_alpha); +const uint * QT_FASTCALL qt_fetchUntransformed_888_mips_dsp (uint *buffer, + const Operator *, + const QSpanData *data, + int y, int x, int length); + +const uint * QT_FASTCALL qt_fetchUntransformed_444_mips_dsp (uint *buffer, + const Operator *, + const QSpanData *data, + int y, int x, int length); + +const uint * QT_FASTCALL qt_fetchUntransformed_argb8565_premultiplied_mips_dsp (uint *buffer, + const Operator *, + const QSpanData *data, + int y, int x, int length); + #endif // QT_COMPILER_SUPPORTS_MIPS_DSP @@ -171,6 +201,13 @@ void QT_FASTCALL comp_func_XOR_mips_dsp(uint *dest, const uint *src, int length, extern "C" void qConvertRgb16To32_asm_mips_dspr2(quint32 *dest, const quint16 *src, int length); +extern "C" void qt_blend_rgb16_on_rgb16_mips_dspr2_asm(quint16 *dest, const quint16 *src, int length, uint const_alpha); + +void qt_blend_rgb16_on_rgb16_mips_dspr2(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha); + #endif // QT_COMPILER_SUPPORTS_MIPS_DSPR2 QT_END_NAMESPACE diff --git a/src/gui/painting/qdrawhelper_mips_dspr2_asm.S b/src/gui/painting/qdrawhelper_mips_dspr2_asm.S index ec220732be..c7a603eebe 100644 --- a/src/gui/painting/qdrawhelper_mips_dspr2_asm.S +++ b/src/gui/painting/qdrawhelper_mips_dspr2_asm.S @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic +** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtGui module of the Qt Toolkit. @@ -122,3 +122,551 @@ LEAF_MIPS_DSPR2(qConvertRgb16To32_asm_mips_dspr2) nop END(qConvertRgb16To32_asm_mips_dspr2) + + +#if defined(__MIPSEL) && __MIPSEL +# define PACK(r, s, t) packrl.ph r, s, t +# define LDHI(r, o, b) lwl r, o + 1 (b) +# define LDLO(r, o, b) lwr r, o + 2 (b) +#else +# define PACK(r, s, t) packrl.ph r, t, s +# define LDHI(r, o, b) lwr r, o + 1 (b) +# define LDLO(r, o, b) lwl r, o + 2 (b) +#endif + + +LEAF_MIPS_DSPR2(qt_blend_rgb16_on_rgb16_mips_dspr2_asm) +/* ++ * a0 - dst (*r5g6b5) + * a1 - src (const *r5g6b5) + * a2 - len (unsigned int) - batch length + * a3 - alpha (int) + * + * Register usage: + * t0-3 - Scratch registers + * t4 - Number of iterations to do in unrolled loops + * t5 - Inverse alpha + * t6 - Alpha >> 2 + * t7 - Inverse alpha >> 2 + * t8 - magic1 (0x07e007e0) + * t9 - magic2 (0xf81ff81f) + * + * NOTE: + * Cannot use DSP instructions for the multiplication of two + * 16-bit values: overflow would be always rounded or saturated. + */ + + beqz a2, 0f + andi t0, a0, 0x3 + andi t1, a1, 0x3 + /* Adjust alpha value, and calculate inverse alpha value */ + li t5, 255 + or t2, t0, t1 /* t0 = (dst & 0x3) | (src & 0x3) */ + sll t8, a3, 8 + subu a3, t8, a3 + li t8, 0x07e007e0 /* magic1 */ + srl a3, a3, 8 /* alpha >>= 8 */ + li t9, 0xf81ff81f /* magic2 */ + subu t5, t5, a3 /* ialpha = 255 - alpha */ + addiu a3, a3, 1 /* alpha++ */ + addiu t5, t5, 1 /* ialpha++ */ + srl t6, a3, 2 /* ashift = alpha >> 2 */ + + beqz t2, 4f /* both aligned */ + srl t7, t5, 2 /* iashift = ialpha >> 2 */ + + beqz t1, 2f /* src aligned, dst unaligned */ + nop + + beqz t0, 3f /* dst aligned, src unaligned */ + nop + + /* + * Both src/dst are unaligned: read 1 halfword from each, then + * fall-off to continue with word-aligned operation. + */ + lhu t1, 0 (a1) + lhu t0, 0 (a0) + addiu a2, a2, -1 /* len-- */ + andi t2, t1, 0x07e0 + andi t1, t1, 0xf81f + mul t2, t2, a3 + mul t1, t1, t6 + andi t3, t0, 0x07e0 + andi t0, t0, 0xf81f + mul t3, t3, t5 + mul t0, t0, t7 + addiu a1, a1, 2 /* src++ */ + srl t2, t2, 8 + srl t1, t1, 6 + andi t2, t2, 0x07e0 + andi t1, t1, 0xf81f + or t1, t1, t2 + srl t3, t3, 8 + srl t0, t0, 6 + andi t3, t3, 0x07e0 + andi t0, t0, 0xf81f + or t0, t0, t3 + addu t0, t0, t1 /* src * alpha + dst * ialpha */ + sh t0, 0 (a0) + addiu a0, a0, 2 /* dst++ */ + + /* + * Both src/dst pointers are word-aligned, process eight + * items at a time in an unrolled loop. + */ +4: beqz a2, 0f + srl t4, a2, 3 /* t4 = len / 8 */ + beqz t4, 5f + andi a2, a2, 0x7 /* len = len % 8 */ + SAVE_REGS_ON_STACK 12, s0, s1, s2, s3, s4, v0, v1 + +1: lw t1, 0 (a1) /* [s0, s1] */ + lw v1, 4 (a1) /* [s2, s3] */ + lw s1, 8 (a1) /* [s4, s5] */ + lw s3, 12 (a1) /* [s6, s7] */ + + lw t0, 0 (a0) /* [d0, d1] */ + lw v0, 4 (a0) /* [d2, d3] */ + lw s0, 8 (a0) /* [d4, d5] */ + lw s2, 12 (a0) /* [d6, d7] */ + + pref 4, 16 (a1) + pref 5, 16 (a0) + + and t2, t1, t8 + ext t3, t2, 0, 16 + srl t2, t2, 16 + mul t3, t3, a3 + mul t2, t2, a3 + and t1, t1, t9 + ext s4, t1, 0, 16 + mul s4, s4, t6 + srl t1, t1, 16 + mul t1, t1, t6 + srl t3, t3, 8 + srl t2, t2, 8 + append t2, t3, 16 + and t2, t2, t8 + srl s4, s4, 6 + and t3, v1, t8 + srl t1, t1, 6 + append t1, s4, 16 + and t1, t1, t9 + or t1, t1, t2 + ext t2, t3, 0, 16 + srl t3, t3, 16 + mul t2, t2, a3 + mul t3, t3, a3 + and v1, v1, t9 + ext s4, v1, 0, 16 + mul s4, s4, t6 + srl v1, v1, 16 + mul v1, v1, t6 + srl t2, t2, 8 + srl t3, t3, 8 + append t3, t2, 16 + and t3, t3, t8 + srl s4, s4, 6 + and t2, s1, t8 + srl v1, v1, 6 + append v1, s4, 16 + and v1, v1, t9 + or v1, v1, t3 + ext t3, t2, 0, 16 + srl t2, t2, 16 + mul t3, t3, a3 + mul t2, t2, a3 + and s1, s1, t9 + ext s4, s1, 0, 16 + mul s4, s4, t6 + srl s1, s1, 16 + mul s1, s1, t6 + srl t3, t3, 8 + srl t2, t2, 8 + append t2, t3, 16 + and t2, t2, t8 + srl s4, s4, 6 + and t3, s3, t8 + srl s1, s1, 6 + append s1, s4, 16 + and s1, s1, t9 + or s1, s1, t2 + ext t2, t3, 0, 16 + srl t3, t3, 16 + mul t2, t2, a3 + mul t3, t3, a3 + and s3, s3, t9 + ext s4, s3, 0, 16 + mul s4, s4, t6 + srl s3, s3, 16 + mul s3, s3, t6 + srl t2, t2, 8 + srl t3, t3, 8 + append t3, t2, 16 + and t3, t3, t8 + srl s4, s4, 6 + and t2, t0, t8 + srl s3, s3, 6 + append s3, s4, 16 + and s3, s3, t9 + or s3, s3, t3 + ext t3, t2, 0, 16 + srl t2, t2, 16 + mul t3, t3, t5 + mul t2, t2, t5 + and t0, t0, t9 + ext s4, t0, 0, 16 + mul s4, s4, t7 + srl t0, t0, 16 + mul t0, t0, t7 + srl t3, t3, 8 + srl t2, t2, 8 + append t2, t3, 16 + and t2, t2, t8 + srl s4, s4, 6 + and t3, v0, t8 + srl t0, t0, 6 + append t0, s4, 16 + and t0, t0, t9 + or t0, t0, t2 + ext t2, t3, 0, 16 + srl t3, t3, 16 + mul t2, t2, t5 + mul t3, t3, t5 + and v0, v0, t9 + ext s4, v0, 0, 16 + mul s4, s4, t7 + srl v0, v0, 16 + mul v0, v0, t7 + srl t2, t2, 8 + srl t3, t3, 8 + append t3, t2, 16 + and t3, t3, t8 + srl s4, s4, 6 + and t2, s0, t8 + srl v0, v0, 6 + append v0, s4, 16 + and v0, v0, t9 + or v0, v0, t3 + ext t3, t2, 0, 16 + srl t2, t2, 16 + mul t3, t3, t5 + mul t2, t2, t5 + and s0, s0, t9 + ext s4, s0, 0, 16 + mul s4, s4, t7 + srl s0, s0, 16 + mul s0, s0, t7 + srl t3, t3, 8 + srl t2, t2, 8 + append t2, t3, 16 + and t2, t2, t8 + srl s4, s4, 6 + and t3, s2, t8 + srl s0, s0, 6 + append s0, s4, 16 + and s0, s0, t9 + or s0, s0, t2 + ext t2, t3, 0, 16 + srl t3, t3, 16 + mul t2, t2, t5 + mul t3, t3, t5 + and s2, s2, t9 + ext s4, s2, 0, 16 + mul s4, s4, t7 + srl s2, s2, 16 + mul s2, s2, t7 + srl t2, t2, 8 + srl t3, t3, 8 + append t3, t2, 16 + and t3, t3, t8 + srl s4, s4, 6 + addu.ph t0, t0, t1 + srl s2, s2, 6 + append s2, s4, 16 + and s2, s2, t9 + or s2, s2, t3 + addu.ph v0, v0, v1 /* v0 = [S2 + D2, S3 + D3] */ + addu.ph s0, s0, s1 /* s0 = [S4 + D4, S5 + D5] */ + addu.ph s2, s2, s3 /* s2 = [S6 + D6, S7 + D7] */ + + sw t0, 0 (a0) /* [SS0, SS1] */ + sw v0, 4 (a0) /* [SS2, SS3] */ + sw s0, 8 (a0) /* [SS4, SS5] */ + sw s2, 12 (a0) /* [SS6, SS7] */ + + addiu t4, t4, -1 /* t4-- */ + addiu a1, a1, 16 /* src += 8 */ + + bnez t4, 1b + addiu a0, a0, 16 /* dst += 8 */ + + RESTORE_REGS_FROM_STACK 12, s0, s1, s2, s3, s4, v0, v1 + b 5f + nop + + + /* dst unaligned: do one item and fall down to the src unaligned case */ +2: lhu t1, 0 (a1) + lhu t0, 0 (a0) + addiu a2, a2, -1 /* len-- */ + andi t2, t1, 0x07e0 + andi t1, t1, 0xf81f + mul t2, t2, a3 + mul t1, t1, t6 + andi t3, t0, 0x07e0 + andi t0, t0, 0xf81f + mul t3, t3, t5 + mul t0, t0, t7 + addiu a1, a1, 2 /* src++ */ + srl t2, t2, 8 + srl t1, t1, 6 + andi t2, t2, 0x07e0 + andi t1, t1, 0xf81f + or t1, t1, t2 + srl t3, t3, 8 + srl t0, t0, 6 + andi t3, t3, 0x07e0 + andi t0, t0, 0xf81f + or t0, t0, t3 + addu t0, t0, t1 /* src * alpha + dst * ialpha */ + sh t0, 0 (a0) + addiu a0, a0, 2 /* dst++ */ + + /* src unaligned */ +3: beqz a2, 0f + srl t4, a2, 3 /* t4 = len / 8 */ + beqz t4, 5f + andi a2, a2, 0x7 /* len = len % 8 */ + SAVE_REGS_ON_STACK 12, s0, s1, s2, s3, s4, v0, v1 + +1: lw t0, 0 (a0) /* [d0, d1] */ + lw v0, 4 (a0) /* [d2, d3] */ + lw s0, 8 (a0) /* [d4, d5] */ + lw s2, 12 (a0) /* [d6, d7] */ + + LDHI (t1, 0, a1) /* [s0, __] */ + lw v1, 2 (a1) /* [s1, s2] */ + lw s1, 6 (a1) /* [s3, s4] */ + lw s3, 10 (a1) /* [s5, s6] */ + LDLO (s4, 12, a1) /* [__, s7] */ + + pref 4, 14 (a1) + pref 5, 16 (a0) + + PACK (t1, v1, t1) /* [s0, s1] */ + PACK (v1, s1, v1) /* [s2, s3] */ + PACK (s1, s3, s1) /* [s4, s5] */ + PACK (s3, s4, s3) /* [s6, s7] */ + + and t2, t1, t8 + ext t3, t2, 0, 16 + srl t2, t2, 16 + mul t3, t3, a3 + mul t2, t2, a3 + and t1, t1, t9 + ext s4, t1, 0, 16 + mul s4, s4, t6 + srl t1, t1, 16 + mul t1, t1, t6 + srl t3, t3, 8 + srl t2, t2, 8 + append t2, t3, 16 + and t2, t2, t8 + srl s4, s4, 6 + and t3, v1, t8 + srl t1, t1, 6 + append t1, s4, 16 + and t1, t1, t9 + or t1, t1, t2 + ext t2, t3, 0, 16 + srl t3, t3, 16 + mul t2, t2, a3 + mul t3, t3, a3 + and v1, v1, t9 + ext s4, v1, 0, 16 + mul s4, s4, t6 + srl v1, v1, 16 + mul v1, v1, t6 + srl t2, t2, 8 + srl t3, t3, 8 + append t3, t2, 16 + and t3, t3, t8 + srl s4, s4, 6 + and t2, s1, t8 + srl v1, v1, 6 + append v1, s4, 16 + and v1, v1, t9 + or v1, v1, t3 + ext t3, t2, 0, 16 + srl t2, t2, 16 + mul t3, t3, a3 + mul t2, t2, a3 + and s1, s1, t9 + ext s4, s1, 0, 16 + mul s4, s4, t6 + srl s1, s1, 16 + mul s1, s1, t6 + srl t3, t3, 8 + srl t2, t2, 8 + append t2, t3, 16 + and t2, t2, t8 + srl s4, s4, 6 + and t3, s3, t8 + srl s1, s1, 6 + append s1, s4, 16 + and s1, s1, t9 + or s1, s1, t2 + ext t2, t3, 0, 16 + srl t3, t3, 16 + mul t2, t2, a3 + mul t3, t3, a3 + and s3, s3, t9 + ext s4, s3, 0, 16 + mul s4, s4, t6 + srl s3, s3, 16 + mul s3, s3, t6 + srl t2, t2, 8 + srl t3, t3, 8 + append t3, t2, 16 + and t3, t3, t8 + srl s4, s4, 6 + and t2, t0, t8 + srl s3, s3, 6 + append s3, s4, 16 + and s3, s3, t9 + or s3, s3, t3 + ext t3, t2, 0, 16 + srl t2, t2, 16 + mul t3, t3, t5 + mul t2, t2, t5 + and t0, t0, t9 + ext s4, t0, 0, 16 + mul s4, s4, t7 + srl t0, t0, 16 + mul t0, t0, t7 + srl t3, t3, 8 + srl t2, t2, 8 + append t2, t3, 16 + and t2, t2, t8 + srl s4, s4, 6 + and t3, v0, t8 + srl t0, t0, 6 + append t0, s4, 16 + and t0, t0, t9 + or t0, t0, t2 + ext t2, t3, 0, 16 + srl t3, t3, 16 + mul t2, t2, t5 + mul t3, t3, t5 + and v0, v0, t9 + ext s4, v0, 0, 16 + mul s4, s4, t7 + srl v0, v0, 16 + mul v0, v0, t7 + srl t2, t2, 8 + srl t3, t3, 8 + append t3, t2, 16 + and t3, t3, t8 + srl s4, s4, 6 + and t2, s0, t8 + srl v0, v0, 6 + append v0, s4, 16 + and v0, v0, t9 + or v0, v0, t3 + ext t3, t2, 0, 16 + srl t2, t2, 16 + mul t3, t3, t5 + mul t2, t2, t5 + and s0, s0, t9 + ext s4, s0, 0, 16 + mul s4, s4, t7 + srl s0, s0, 16 + mul s0, s0, t7 + srl t3, t3, 8 + srl t2, t2, 8 + append t2, t3, 16 + and t2, t2, t8 + srl s4, s4, 6 + and t3, s2, t8 + srl s0, s0, 6 + append s0, s4, 16 + and s0, s0, t9 + or s0, s0, t2 + ext t2, t3, 0, 16 + srl t3, t3, 16 + mul t2, t2, t5 + mul t3, t3, t5 + and s2, s2, t9 + ext s4, s2, 0, 16 + mul s4, s4, t7 + srl s2, s2, 16 + mul s2, s2, t7 + srl t2, t2, 8 + srl t3, t3, 8 + append t3, t2, 16 + and t3, t3, t8 + srl s4, s4, 6 + addu.ph t0, t0, t1 + srl s2, s2, 6 + append s2, s4, 16 + and s2, s2, t9 + or s2, s2, t3 + addu.ph v0, v0, v1 /* v0 = [S2 + D2, S3 + D3] */ + addu.ph s0, s0, s1 /* s0 = [S4 + D4, S5 + D5] */ + addu.ph s2, s2, s3 /* s2 = [S6 + D6, S7 + D7] */ + + sw t0, 0 (a0) /* [SS0, SS1] */ + sw v0, 4 (a0) /* [SS2, SS3] */ + sw s0, 8 (a0) /* [SS4, SS5] */ + sw s2, 12 (a0) /* [SS6, SS7] */ + + addiu t4, t4, -1 /* t4-- */ + addiu a1, a1, 16 /* src += 8 */ + + bnez t4, 1b + addiu a0, a0, 16 /* dst += 8 */ + + RESTORE_REGS_FROM_STACK 12, s0, s1, s2, s3, s4, v0, v1 + +5: /* Process remaining items (len < 8), one at a time */ + beqz a2, 0f + nop + +1: lhu t1, 0 (a1) + lhu t0, 0 (a0) + addiu a1, a1, 2 /* src++ */ + andi t2, t1, 0x07e0 + andi t1, t1, 0xf81f + mul t2, t2, a3 + mul t1, t1, t6 + andi t3, t0, 0x07e0 + andi t0, t0, 0xf81f + mul t3, t3, t5 + mul t0, t0, t7 + addiu a2, a2, -1 /* len-- */ + srl t2, t2, 8 + srl t1, t1, 6 + andi t2, t2, 0x07e0 + andi t1, t1, 0xf81f + or t1, t1, t2 + srl t3, t3, 8 + srl t0, t0, 6 + andi t3, t3, 0x07e0 + andi t0, t0, 0xf81f + or t0, t0, t3 + + addu t0, t0, t1 /* src*alpha + dst*ialpha */ + sh t0, 0 (a0) + bnez a2, 1b + addiu a0, a0, 2 /* dst++ */ + +0: jr ra + nop + +END(qt_blend_rgb16_on_rgb16_mips_dspr2_asm) + +#undef PACK +#undef LDHI +#undef LDLO diff --git a/src/gui/painting/qt_mips_asm_dsp_p.h b/src/gui/painting/qt_mips_asm_dsp_p.h index 1b78eaf52c..54fcfab206 100644 --- a/src/gui/painting/qt_mips_asm_dsp_p.h +++ b/src/gui/painting/qt_mips_asm_dsp_p.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2012 MIPS Technologies, www.mips.com, author Damir Tatalovic +** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtGui module of the Qt Toolkit. @@ -261,4 +261,168 @@ LEAF_MIPS32R2(symbol) \ or \out_1, \scratch1, \scratch3 .endm +/* + * Checks if stack offset is big enough for storing/restoring regs_num + * number of register to/from stack. Stack offset must be greater than + * or equal to the number of bytes needed for storing registers (regs_num*4). + * Since MIPS ABI allows usage of first 16 bytes of stack frame (this is + * preserved for input arguments of the functions, already stored in a0-a3), + * stack size can be further optimized by utilizing this space. + */ +.macro CHECK_STACK_OFFSET regs_num, stack_offset +.if \stack_offset < \regs_num * 4 - 16 +.error "Stack offset too small." +.endif +.endm + +/* + * Saves set of registers on stack. Maximum number of registers that + * can be saved on stack is limitted to 14 (a0-a3, v0-v1 and s0-s7). + * Stack offset is number of bytes that are added to stack pointer (sp) + * before registers are pushed in order to provide enough space on stack + * (offset must be multiple of 4, and must be big enough, as described by + * CHECK_STACK_OFFSET macro). This macro is intended to be used in + * combination with RESTORE_REGS_FROM_STACK macro. Example: + * SAVE_REGS_ON_STACK 4, v0, v1, s0, s1 + * RESTORE_REGS_FROM_STACK 4, v0, v1, s0, s1 + */ +.macro SAVE_REGS_ON_STACK stack_offset = 0, r1, \ + r2 = 0, r3 = 0, r4 = 0, \ + r5 = 0, r6 = 0, r7 = 0, \ + r8 = 0, r9 = 0, r10 = 0, \ + r11 = 0, r12 = 0, r13 = 0, \ + r14 = 0 + .if (\stack_offset < 0) || (\stack_offset - (\stack_offset / 4) * 4) + .error "Stack offset must be positive and multiple of 4." + .endif + .if \stack_offset != 0 + addiu sp, sp, -\stack_offset + .endif + sw \r1, 0(sp) + .if \r2 != 0 + sw \r2, 4(sp) + .endif + .if \r3 != 0 + sw \r3, 8(sp) + .endif + .if \r4 != 0 + sw \r4, 12(sp) + .endif + .if \r5 != 0 + CHECK_STACK_OFFSET 5, \stack_offset + sw \r5, 16(sp) + .endif + .if \r6 != 0 + CHECK_STACK_OFFSET 6, \stack_offset + sw \r6, 20(sp) + .endif + .if \r7 != 0 + CHECK_STACK_OFFSET 7, \stack_offset + sw \r7, 24(sp) + .endif + .if \r8 != 0 + CHECK_STACK_OFFSET 8, \stack_offset + sw \r8, 28(sp) + .endif + .if \r9 != 0 + CHECK_STACK_OFFSET 9, \stack_offset + sw \r9, 32(sp) + .endif + .if \r10 != 0 + CHECK_STACK_OFFSET 10, \stack_offset + sw \r10, 36(sp) + .endif + .if \r11 != 0 + CHECK_STACK_OFFSET 11, \stack_offset + sw \r11, 40(sp) + .endif + .if \r12 != 0 + CHECK_STACK_OFFSET 12, \stack_offset + sw \r12, 44(sp) + .endif + .if \r13 != 0 + CHECK_STACK_OFFSET 13, \stack_offset + sw \r13, 48(sp) + .endif + .if \r14 != 0 + CHECK_STACK_OFFSET 14, \stack_offset + sw \r14, 52(sp) + .endif +.endm + +/* + * Restores set of registers from stack. Maximum number of registers that + * can be restored from stack is limitted to 14 (a0-a3, v0-v1 and s0-s7). + * Stack offset is number of bytes that are added to stack pointer (sp) + * after registers are restored (offset must be multiple of 4, and must + * be big enough, as described by CHECK_STACK_OFFSET macro). This macro is + * intended to be used in combination with RESTORE_REGS_FROM_STACK macro. + * Example: + * SAVE_REGS_ON_STACK 4, v0, v1, s0, s1 + * RESTORE_REGS_FROM_STACK 4, v0, v1, s0, s1 + */ +.macro RESTORE_REGS_FROM_STACK stack_offset = 0, r1, \ + r2 = 0, r3 = 0, r4 = 0, \ + r5 = 0, r6 = 0, r7 = 0, \ + r8 = 0, r9 = 0, r10 = 0, \ + r11 = 0, r12 = 0, r13 = 0, \ + r14 = 0 + .if (\stack_offset < 0) || (\stack_offset - (\stack_offset/4)*4) + .error "Stack offset must be pozitive and multiple of 4." + .endif + lw \r1, 0(sp) + .if \r2 != 0 + lw \r2, 4(sp) + .endif + .if \r3 != 0 + lw \r3, 8(sp) + .endif + .if \r4 != 0 + lw \r4, 12(sp) + .endif + .if \r5 != 0 + CHECK_STACK_OFFSET 5, \stack_offset + lw \r5, 16(sp) + .endif + .if \r6 != 0 + CHECK_STACK_OFFSET 6, \stack_offset + lw \r6, 20(sp) + .endif + .if \r7 != 0 + CHECK_STACK_OFFSET 7, \stack_offset + lw \r7, 24(sp) + .endif + .if \r8 != 0 + CHECK_STACK_OFFSET 8, \stack_offset + lw \r8, 28(sp) + .endif + .if \r9 != 0 + CHECK_STACK_OFFSET 9, \stack_offset + lw \r9, 32(sp) + .endif + .if \r10 != 0 + CHECK_STACK_OFFSET 10, \stack_offset + lw \r10, 36(sp) + .endif + .if \r11 != 0 + CHECK_STACK_OFFSET 11, \stack_offset + lw \r11, 40(sp) + .endif + .if \r12 != 0 + CHECK_STACK_OFFSET 12, \stack_offset + lw \r12, 44(sp) + .endif + .if \r13 != 0 + CHECK_STACK_OFFSET 13, \stack_offset + lw \r13, 48(sp) + .endif + .if \r14 != 0 + CHECK_STACK_OFFSET 14, \stack_offset + lw \r14, 52(sp) + .endif + .if \stack_offset != 0 + addiu sp, sp, \stack_offset + .endif +.endm + #endif // QT_MIPS_ASM_DSP_H -- cgit v1.2.3 From 122ae7142b2dfd7ec0e03820c1d7f4317d1ce267 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 13 Jan 2014 16:55:22 +0100 Subject: Stabilize tst_scrollbar. - Use a separate widget for each test. - Replace hard-coded timeouts by qWaitForWindowExposed. - Center windows on screen. Change-Id: I45ae306fd23348ee5dec3849e64ec98843e8bf32 Reviewed-by: Frederik Gladhorn --- .../widgets/widgets/qscrollbar/tst_qscrollbar.cpp | 93 ++++++++++++---------- 1 file changed, 52 insertions(+), 41 deletions(-) diff --git a/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp b/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp index baa3022919..51dd0852ee 100644 --- a/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp +++ b/tests/auto/widgets/widgets/qscrollbar/tst_qscrollbar.cpp @@ -44,68 +44,72 @@ #include #include #include +#include + +static inline void centerOnScreen(QWidget *w, const QSize &size) +{ + const QPoint offset = QPoint(size.width() / 2, size.height() / 2); + w->move(QGuiApplication::primaryScreen()->availableGeometry().center() - offset); +} + +static inline void centerOnScreen(QWidget *w) +{ + centerOnScreen(w, w->geometry().size()); +} class tst_QScrollBar : public QObject { Q_OBJECT -public slots: - void initTestCase(); - void cleanupTestCase(); - void hideAndShow(int action); - private slots: void scrollSingleStep(); void task_209492(); #ifndef QT_NO_WHEELEVENT void QTBUG_27308(); #endif - -private: - QScrollBar *testWidget; }; -void tst_QScrollBar::initTestCase() -{ - testWidget = new QScrollBar(Qt::Horizontal); - testWidget->resize(100, testWidget->height()); - testWidget->show(); -} - -void tst_QScrollBar::cleanupTestCase() -{ - delete testWidget; - testWidget = 0; -} +class SingleStepTestScrollBar : public QScrollBar { + Q_OBJECT +public: + explicit SingleStepTestScrollBar(Qt::Orientation o, QWidget *parent = 0) : QScrollBar(o, parent) {} -void tst_QScrollBar::hideAndShow(int) -{ - testWidget->hide(); - testWidget->show(); -} +public slots: + void hideAndShow() + { + hide(); + show(); + } +}; // Check that the scrollbar doesn't scroll after calling hide and show // from a slot connected to the scrollbar's actionTriggered signal. void tst_QScrollBar::scrollSingleStep() { - testWidget->setValue(testWidget->minimum()); - QCOMPARE(testWidget->value(), testWidget->minimum()); - connect(testWidget, SIGNAL(actionTriggered(int)), this, SLOT(hideAndShow(int))); + SingleStepTestScrollBar testWidget(Qt::Horizontal); + connect(&testWidget, &QAbstractSlider::actionTriggered, &testWidget, &SingleStepTestScrollBar::hideAndShow); + testWidget.resize(100, testWidget.height()); + centerOnScreen(&testWidget); + testWidget.show(); + QTest::qWaitForWindowExposed(&testWidget); + + testWidget.setValue(testWidget.minimum()); + QCOMPARE(testWidget.value(), testWidget.minimum()); // Get rect for the area to click on - const QStyleOptionSlider opt = qt_qscrollbarStyleOption(testWidget); - QRect sr = testWidget->style()->subControlRect(QStyle::CC_ScrollBar, &opt, - QStyle::SC_ScrollBarAddLine, testWidget); + const QStyleOptionSlider opt = qt_qscrollbarStyleOption(&testWidget); + QRect sr = testWidget.style()->subControlRect(QStyle::CC_ScrollBar, &opt, + QStyle::SC_ScrollBarAddLine, &testWidget); if (!sr.isValid()) QSKIP("SC_ScrollBarAddLine not valid"); - QTest::mouseClick(testWidget, Qt::LeftButton, Qt::NoModifier, QPoint(sr.x(), sr.y())); + QTest::mouseClick(&testWidget, Qt::LeftButton, Qt::NoModifier, QPoint(sr.x(), sr.y())); QTest::qWait(510); // initial delay is 500 for setRepeatAction - disconnect(testWidget, SIGNAL(actionTriggered(int)), 0, 0); + disconnect(&testWidget, &QAbstractSlider::actionTriggered, &testWidget, &SingleStepTestScrollBar::hideAndShow); #ifdef Q_OS_MAC QEXPECT_FAIL("", "This test fails on Mac OS X, see QTBUG-25272", Abort); #endif - QCOMPARE(testWidget->value(), testWidget->singleStep()); + QCOMPARE(testWidget.value(), testWidget.singleStep()); } void tst_QScrollBar::task_209492() @@ -123,8 +127,9 @@ void tst_QScrollBar::task_209492() MyScrollArea scrollArea; QScrollBar *verticalScrollBar = scrollArea.verticalScrollBar(); verticalScrollBar->setRange(0, 1000); + centerOnScreen(&scrollArea); scrollArea.show(); - QTest::qWait(300); + QTest::qWaitForWindowExposed(&scrollArea); QSignalSpy spy(verticalScrollBar, SIGNAL(actionTriggered(int))); QCOMPARE(scrollArea.scrollCount, 0); @@ -153,12 +158,18 @@ void tst_QScrollBar::QTBUG_27308() // https://bugreports.qt-project.org/browse/QTBUG-27308 // Check that a disabled scrollbar doesn't react on wheel events anymore - testWidget->setValue(testWidget->minimum()); - testWidget->setEnabled(false); - QWheelEvent event(testWidget->rect().center(), - -WHEEL_DELTA, Qt::NoButton, Qt::NoModifier, testWidget->orientation()); - qApp->sendEvent(testWidget, &event); - QCOMPARE(testWidget->value(), testWidget->minimum()); + QScrollBar testWidget(Qt::Horizontal); + testWidget.resize(100, testWidget.height()); + centerOnScreen(&testWidget); + testWidget.show(); + QTest::qWaitForWindowExposed(&testWidget); + + testWidget.setValue(testWidget.minimum()); + testWidget.setEnabled(false); + QWheelEvent event(testWidget.rect().center(), + -WHEEL_DELTA, Qt::NoButton, Qt::NoModifier, testWidget.orientation()); + qApp->sendEvent(&testWidget, &event); + QCOMPARE(testWidget.value(), testWidget.minimum()); } #endif -- cgit v1.2.3 From 73a98ccc4677056416f5de8797c91097e1000a0c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 14 Jan 2014 16:05:15 +0100 Subject: Windows: Use focusWindow() as native dialog parent when 0 is passed. A parent is required, otherwise the application gets deactivated when the dialog closes. The same is done in Qt 4. Task-number: QTBUG-36039 Change-Id: I56688b3259f1d207edd1bec499afd1365ae511dc Reviewed-by: Joerg Bornemann --- src/plugins/platforms/windows/qwindowsdialoghelpers.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp index 497d0975af..8ebfd018d0 100644 --- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp @@ -572,6 +572,8 @@ bool QWindowsDialogHelperBase::show(Qt::WindowFlags, QWindow *parent) { const bool modal = (windowModality != Qt::NonModal); + if (!parent) + parent = QGuiApplication::focusWindow(); // Need a parent window, else the application loses activation when closed. if (parent) { m_ownerWindow = QWindowsWindow::handleOf(parent); } else { -- cgit v1.2.3 From 6233f006df24495587fbb784c33478f034ac2df0 Mon Sep 17 00:00:00 2001 From: Cyril Oblikov Date: Mon, 13 Jan 2014 01:18:25 +0300 Subject: Saving physical size changes of screen on Windows On windows (tested on win7) physicalSizeMM is changed after changing screen resolution. We need to save new size. Change-Id: I1b38d9ba2af9679812a973737a724c9a9c5395da Reviewed-by: Friedemann Kleint --- src/plugins/platforms/windows/qwindowsscreen.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp index 530ebc38b7..1fc1be53c7 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.cpp +++ b/src/plugins/platforms/windows/qwindowsscreen.cpp @@ -306,6 +306,8 @@ QList QWindowsScreen::virtualSiblings() const void QWindowsScreen::handleChanges(const QWindowsScreenData &newData) { + m_data.physicalSizeMM = newData.physicalSizeMM; + if (m_data.geometry != newData.geometry) { m_data.geometry = newData.geometry; QWindowSystemInterface::handleScreenGeometryChange(screen(), -- cgit v1.2.3