From 4b7e40ac69cbec8fcf9a12d71c3911579247fc4b Mon Sep 17 00:00:00 2001 From: Bill King Date: Tue, 18 Aug 2009 10:04:58 +1000 Subject: Fixes qmake -tp vc qmake -tp vc (rightfully) borks when it tries to include .pros that it shouldn't be, based upon platform. Reviewed-by: Rohan McGovern --- tests/auto/auto.pro | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 585f461..1ae6913 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -11,8 +11,6 @@ SUBDIRS += \ compilerwarnings \ exceptionsafety \ linguist \ - macgui \ - macplist \ mediaobject \ # mediaobject_wince_ds9 \ This is Windows CE only (we test the second phonon backend ds9 here) moc \ @@ -74,7 +72,6 @@ SUBDIRS += \ qabstractspinbox \ qabstracttextdocumentlayout \ qaccessibility \ - qaccessibility_mac \ qaction \ qactiongroup \ qalgorithms \ @@ -97,7 +94,6 @@ SUBDIRS += \ qcombobox \ qcompleter \ qcomplextext \ - qcopchannel \ qcoreapplication \ qcryptographichash \ qcssparser \ @@ -113,7 +109,6 @@ SUBDIRS += \ qdialog \ qdialogbuttonbox \ qdir \ - qdirectpainter \ qdirmodel \ qdockwidget \ qdom \ @@ -209,7 +204,6 @@ SUBDIRS += \ qmouseevent \ qmouseevent_modal \ qmovie \ - qmultiscreen \ qmutex \ qmutexlocker \ qnativesocketengine \ @@ -349,7 +343,6 @@ SUBDIRS += \ qtextlayout \ qtextlist \ qtextobject \ - qtextpiecetable \ qtextscriptengine \ qtextstream \ qtexttable \ @@ -404,6 +397,19 @@ SUBDIRS += \ utf8 contains(QT_CONFIG, OdfWriter):SUBDIRS += qzip qtextodfwriter +mac: { + SUBDIRS += macgui \ + macplist \ + qaccessibility_mac +} +embedded: { + SUBDIRS += qcopchannel \ + qdirectpainter \ + qmultiscreen +} +!win32: { + SUBDIRS += qtextpiecetable +} # Enable the tests specific to QtXmlPatterns. If you add a test, remember to # update runQtXmlPatternsTests.sh too. Remember that this file, auto.pro, is -- cgit v0.12 From 9cf688e79f67e531ca9fa548911dfb32ee8c0c71 Mon Sep 17 00:00:00 2001 From: Jason McDonald Date: Tue, 18 Aug 2009 12:23:08 +1000 Subject: Fix typo introduced in previous submit. Reviewed-by: Trust Me --- translations/qt_ar.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/translations/qt_ar.ts b/translations/qt_ar.ts index 3e7a635..9631883 100644 --- a/translations/qt_ar.ts +++ b/translations/qt_ar.ts @@ -3024,7 +3024,8 @@ Do you want to delete it anyway? Hide Details... - .nokiassage> + + <h3>About Qt</h3><p>This program uses Qt version %1.</p><p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across MS&nbsp;Windows, Mac&nbsp;OS&nbsp;X, Linux, and all major commercial Unix variants. Qt is also available for embedded devices as Qt for Embedded Linux and Qt for Windows CE.</p><p>Qt is available under three different licensing options designed to accommodate the needs of our various users.</p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of the GNU LGPL version 2.1 or GNU GPL version 3.0.</p><p>Qt licensed under the GNU LGPL version 2.1 is appropriate for the development of Qt applications (proprietary or open source) provided you can comply with the terms and conditions of the GNU LGPL version 2.1.</p><p>Qt licensed under the GNU General Public License version 3.0 is appropriate for the development of Qt applications where you wish to use such applications in combination with software subject to the terms of the GNU GPL version 3.0 or where you are otherwise willing to comply with the terms of the GNU GPL version 3.0.</p><p>Please see <a href="http://qt.nokia.com/products/licensing">qt.nokia.com/products/licensing</a> for an overview of Qt licensing.</p><p>Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).</p><p>Qt is a Nokia product. See <a href="http://qt.nokia.com/">qt.nokia.com</a> for more information.</p> -- cgit v0.12 From d35265496a02db5f213a18e610ad736fe357c26d Mon Sep 17 00:00:00 2001 From: Jason McDonald Date: Tue, 18 Aug 2009 12:43:58 +1000 Subject: Remove mentions of qtsoftware added by merge of doc branch. Reviewed-by: Trust Me --- doc/src/frameworks-technologies/gestures.qdoc | 2 +- doc/src/xml-processing/xml-processing.qdoc | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/src/frameworks-technologies/gestures.qdoc b/doc/src/frameworks-technologies/gestures.qdoc index 49a9ae3..316d74d 100644 --- a/doc/src/frameworks-technologies/gestures.qdoc +++ b/doc/src/frameworks-technologies/gestures.qdoc @@ -34,7 +34,7 @@ ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://www.qtsoftware.com/contact. +** contact the sales department at http://www.example.com/contact. ** $QT_END_LICENSE$ ** ****************************************************************************/ diff --git a/doc/src/xml-processing/xml-processing.qdoc b/doc/src/xml-processing/xml-processing.qdoc index 44c5450..6e48515 100644 --- a/doc/src/xml-processing/xml-processing.qdoc +++ b/doc/src/xml-processing/xml-processing.qdoc @@ -121,18 +121,18 @@ Before we can apply a namespace to element or attribute names we must declare it. - Namespaces are URIs like \e http://www.qtsoftware.com/fnord/book/. This + Namespaces are URIs like \e http://www.example.com/fnord/book/. This does not mean that data must be available at this address; the URI is simply used to provide a unique name. We declare namespaces in the same way as attributes; strictly speaking they \e are attributes. To make for example \e - http://www.qtsoftware.com/fnord/ the document's default XML namespace \e + http://www.example.com/fnord/ the document's default XML namespace \e xmlns we write \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 8 - To distinguish the \e http://www.qtsoftware.com/fnord/book/ namespace from + To distinguish the \e http://www.example.com/fnord/book/ namespace from the default, we must supply it with a prefix: \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 9 @@ -159,12 +159,12 @@ \snippet doc/src/snippets/code/doc_src_qtxml.qdoc 10 Within the \e document element we have two namespaces declared. The - default namespace \e http://www.qtsoftware.com/fnord/ applies to the \e + default namespace \e http://www.example.com/fnord/ applies to the \e book element, the \e chapter element, the appropriate \e title element and of course to \e document itself. The \e book:author and \e book:title elements belong to the namespace - with the URI \e http://www.qtsoftware.com/fnord/book/. + with the URI \e http://www.example.com/fnord/book/. The two \e book:author attributes \e title and \e name have no XML namespace assigned. They are only members of the "traditional" @@ -172,7 +172,7 @@ \e title attributes in \e book:author are forbidden. In the above example we circumvent the last rule by adding a \e title - attribute from the \e http://www.qtsoftware.com/fnord/ namespace to \e + attribute from the \e http://www.example.com/fnord/ namespace to \e book:author: the \e fnord:title comes from the namespace with the prefix \e fnord that is declared in the \e book:author element. @@ -212,7 +212,7 @@ local part of \e book:title.) \o The \e {namespace URI} ("Uniform Resource Identifier") is a unique identifier for a namespace. It looks like a URL - (e.g. \e http://www.qtsoftware.com/fnord/ ) but does not require + (e.g. \e http://www.example.com/fnord/ ) but does not require data to be accessible by the given protocol at the named address. \endlist -- cgit v0.12 From 8b4539770da00ec98820352fcce89bd6d843f51d Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Tue, 18 Aug 2009 13:25:53 +1000 Subject: Optimize QMatrix4x4::rotate() for 0, 90, 180, 270 degrees. Reviewed-by: Sarah Smith --- src/gui/math3d/qmatrix4x4.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/gui/math3d/qmatrix4x4.cpp b/src/gui/math3d/qmatrix4x4.cpp index dc17eda..8fc439b 100644 --- a/src/gui/math3d/qmatrix4x4.cpp +++ b/src/gui/math3d/qmatrix4x4.cpp @@ -1010,11 +1010,24 @@ QMatrix4x4& QMatrix4x4::rotate(qreal angle, const QVector3D& vector) */ QMatrix4x4& QMatrix4x4::rotate(qreal angle, qreal x, qreal y, qreal z) { + if (angle == 0.0f) + return *this; QMatrix4x4 m(1); // The "1" says to not load the identity. - qreal a = angle * M_PI / 180.0f; - qreal c = qCos(a); - qreal s = qSin(a); - qreal ic; + qreal c, s, ic; + if (angle == 90.0f || angle == -270.0f) { + s = 1.0f; + c = 0.0f; + } else if (angle == -90.0f || angle == 270.0f) { + s = -1.0f; + c = 0.0f; + } else if (angle == 180.0f || angle == -180.0f) { + s = 0.0f; + c = -1.0f; + } else { + qreal a = angle * M_PI / 180.0f; + c = qCos(a); + s = qSin(a); + } bool quick = false; if (x == 0.0f) { if (y == 0.0f) { -- cgit v0.12 From 1ddf4ae979e3b573f45a99ac92838e098dfc8e45 Mon Sep 17 00:00:00 2001 From: Stian Sandvik Thomassen Date: Tue, 18 Aug 2009 14:59:57 +1000 Subject: Doc: sorted list correctly for qLess() documentation --- doc/src/snippets/code/doc_src_qalgorithms.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/snippets/code/doc_src_qalgorithms.qdoc b/doc/src/snippets/code/doc_src_qalgorithms.qdoc index 69d943c..e2126dd 100644 --- a/doc/src/snippets/code/doc_src_qalgorithms.qdoc +++ b/doc/src/snippets/code/doc_src_qalgorithms.qdoc @@ -302,7 +302,7 @@ list.clear(); QList list; list << 33 << 12 << 68 << 6 << 12; qSort(list.begin(), list.end(), qLess()); -// list: [ 68, 33, 12, 12, 6 ] +// list: [ 6, 12, 12, 33, 68 ] //! [24] -- cgit v0.12 From 6d9563070a87bc6c0b014b2a40af2e4b6eb1a6f6 Mon Sep 17 00:00:00 2001 From: Jason McDonald Date: Tue, 18 Aug 2009 15:52:10 +1000 Subject: Fold the FAQ.txt file into the known-issues documentation. Reviewed-by: Gareth Pethig --- FAQ.txt | 18 ------------------ doc/src/getting-started/known-issues.qdoc | 31 +++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 18 deletions(-) delete mode 100644 FAQ.txt diff --git a/FAQ.txt b/FAQ.txt deleted file mode 100644 index 1d2266d..0000000 --- a/FAQ.txt +++ /dev/null @@ -1,18 +0,0 @@ -This is a list of Frequently Asked Questions regarding this Qt release. - -Q: I'm using a Unix system and I downloaded the Zip package. However, when I try -to run the configure script, I get the following error message: -"bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory" -A: The problem here is converting files from Windows style line endings (CRLF) -to Unix style line endings (LF). To avoid this problem, uncompress the file -again and give the option "-a" to unzip, which will then add the correct line -endings. - -Q: I'm running Windows XP and I downloaded the qt-win-eval-%VERSION%-vs2008.exe -version of Qt. However, when I try to run the examples I get an error saying: -"The application failed to start because the application configuration is -incorrect. Reinstalling the application may fix this problem.". I reinstalled -the package but the error persists. What am I doing wrong? -A: The problem is an incorrect version of the CRT. Visual studio requires CRT90 -while Windows XP comes with CRT80. To solve this problem, please install the -2008 CRT redistributable package from Microsoft. diff --git a/doc/src/getting-started/known-issues.qdoc b/doc/src/getting-started/known-issues.qdoc index 0a94d86..41bdcdf 100644 --- a/doc/src/getting-started/known-issues.qdoc +++ b/doc/src/getting-started/known-issues.qdoc @@ -133,6 +133,7 @@ \endlist + \section2 Mac OS X Software Support \list @@ -140,4 +141,34 @@ window will cause it to flash. This behavior has been reported to Apple (bug number 5827676). \endlist + + + \section2 Installing source packages on Unix systems + + \list + \o If you download a Zip source package, you will need to convert + Windows-style line endings (CR/LF) to Unix-style line-endings (LF) when + you uncompress the package. To do this, give the "-a" option when you + run the "unzip' command. + + If you fail to supply the "-a" option when unzipping the package, you + will see the following error message when you attempt to execute the + configure command: + "bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory" + \endlist + + + \section2 Running evaluation packages on Windows XP + + \list + \o If running the qt-win-eval-%VERSION%-vs2008.exe package on a Windows XP + system, you may encounter the following error message: + "The application failed to start because the application configuration + is incorrect. Reinstalling the application may fix this problem.". + + This error occurs because the version of the CRT component on the + system is incorrect. Visual Studio 2008 requires CRT90 while Windows + XP comes with CRT80. To solve this problem, please install the 2008 CRT + redistributable package from Microsoft. + \endlist */ -- cgit v0.12 From fb4a884eb76a67919112f2a389283b1bd6d4848e Mon Sep 17 00:00:00 2001 From: "Bradley T. Hughes" Date: Tue, 18 Aug 2009 09:11:12 +0200 Subject: Avoid divide by zero on buggy Xlib/Xserver implementations Some X servers seem to report zero physical size, so our DPI calculations would crash with divide-by-zero. Avoid this and just use 72 DPI instead. Task-number: 258319 --- src/gui/kernel/qapplication_x11.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/gui/kernel/qapplication_x11.cpp b/src/gui/kernel/qapplication_x11.cpp index db349f0..d942519 100644 --- a/src/gui/kernel/qapplication_x11.cpp +++ b/src/gui/kernel/qapplication_x11.cpp @@ -1851,10 +1851,20 @@ void qt_init(QApplicationPrivate *priv, int, QX11InfoData *screen = X11->screens + s; screen->ref = 1; // ensures it doesn't get deleted screen->screen = s; - screen->dpiX = (DisplayWidth(X11->display, s) * 254 + DisplayWidthMM(X11->display, s)*5) - / (DisplayWidthMM(X11->display, s)*10); - screen->dpiY = (DisplayHeight(X11->display, s) * 254 + DisplayHeightMM(X11->display, s)*5) - / (DisplayHeightMM(X11->display, s)*10); + + int widthMM = DisplayWidthMM(X11->display, s); + if (widthMM != 0) { + screen->dpiX = (DisplayWidth(X11->display, s) * 254 + widthMM * 5) / (widthMM * 10); + } else { + screen->dpiX = 72; + } + + int heightMM = DisplayHeightMM(X11->display, s); + if (heightMM != 0) { + screen->dpiY = (DisplayHeight(X11->display, s) * 254 + heightMM * 5) / (heightMM * 10); + } else { + screen->dpiY = 72; + } X11->argbVisuals[s] = 0; X11->argbColormaps[s] = 0; -- cgit v0.12 From 0e29b6085233bbd14471c7df466575750841f4d7 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Tue, 18 Aug 2009 10:01:01 +0200 Subject: Fixed a possible crash in QTextCursor --- src/gui/text/qtextcursor.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui/text/qtextcursor.cpp b/src/gui/text/qtextcursor.cpp index 88ab9d0..5a938e3 100644 --- a/src/gui/text/qtextcursor.cpp +++ b/src/gui/text/qtextcursor.cpp @@ -84,7 +84,8 @@ QTextCursorPrivate::QTextCursorPrivate(const QTextCursorPrivate &rhs) QTextCursorPrivate::~QTextCursorPrivate() { - priv->removeCursor(this); + if (priv) + priv->removeCursor(this); } QTextCursorPrivate::AdjustResult QTextCursorPrivate::adjustPosition(int positionOfChange, int charsAddedOrRemoved, QTextUndoCommand::Operation op) -- cgit v0.12 From 9b7a6b231014135d7df0f3675d121c2d76d89e76 Mon Sep 17 00:00:00 2001 From: Morten Sorvig Date: Tue, 18 Aug 2009 10:07:11 +0200 Subject: As of Qt 4.6, the minimum OS X version is 10.4. --- src/corelib/global/qglobal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 92fe649..40b65fd 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -297,7 +297,7 @@ namespace QT_NAMESPACE {} # ifdef MAC_OS_X_VERSION_MIN_REQUIRED # undef MAC_OS_X_VERSION_MIN_REQUIRED # endif -# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_3 +# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_4 # include # if !defined(MAC_OS_X_VERSION_10_3) # define MAC_OS_X_VERSION_10_3 MAC_OS_X_VERSION_10_2 + 1 -- cgit v0.12 From b120ff4f1a479c35b3e5bbcbc3c72cc18ee4879c Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Tue, 18 Aug 2009 10:31:31 +0200 Subject: tst_QTableView::task259308_scrollVerticalHeaderSwappedSections fails. The QTableView scrolled down after the sections swap. Setting the current index to the topmost visual element fixes the issue. Reviewed-by: Thierry --- tests/auto/qtableview/tst_qtableview.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/auto/qtableview/tst_qtableview.cpp b/tests/auto/qtableview/tst_qtableview.cpp index 2f41d77..e650dc8 100644 --- a/tests/auto/qtableview/tst_qtableview.cpp +++ b/tests/auto/qtableview/tst_qtableview.cpp @@ -3270,6 +3270,7 @@ void tst_QTableView::task259308_scrollVerticalHeaderSwappedSections() tv.setModel(&model); tv.show(); tv.verticalHeader()->swapSections(0, model.rowCount() - 1); + tv.setCurrentIndex(model.index(model.rowCount() - 1, 0)); QTest::qWait(60); QTest::keyClick(&tv, Qt::Key_PageUp); // PageUp won't scroll when at top -- cgit v0.12 From 7b58efd28ec66725acf0e42d871859f1a046439a Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Tue, 18 Aug 2009 08:44:16 +0200 Subject: Speed up midpoint lines starting far outside the device bounds. Reviewed-By: Samuel --- src/gui/painting/qpaintengine_raster.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 8b83f02..547818c 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -5198,6 +5198,13 @@ static void drawLine_midpoint_i(int x1, int y1, int x2, int y2, ProcessSpans spa dy = -dy; } + int x_lower_limit = - 128; + if (x1 < x_lower_limit) { + int cy = dy * (x_lower_limit - x1) / dx + y1; + drawLine_midpoint_i(x_lower_limit, cy, x2, y2, span_func, data, style, devRect); + return; + } + if (style == LineDrawNormal) --x2; @@ -5335,6 +5342,13 @@ static void drawLine_midpoint_i(int x1, int y1, int x2, int y2, ProcessSpans spa dx = -dx; } + int y_lower_limit = - 128; + if (y1 < y_lower_limit) { + int cx = dx * (y_lower_limit - y1) / dy + x1; + drawLine_midpoint_i(cx, y_lower_limit, x2, y2, span_func, data, style, devRect); + return; + } + if (style == LineDrawNormal) --y2; -- cgit v0.12 From a160bbbed21cea0487410013eea95937be65b3d4 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Mon, 17 Aug 2009 09:56:21 +0200 Subject: Added support for gestures on Mac OS X Carbon --- src/gui/kernel/qcocoaview_mac.mm | 10 ++--- src/gui/kernel/qeventdispatcher_mac.mm | 2 +- src/gui/kernel/qwidget_mac.mm | 71 +++++++++++++++++++++++++++++++++- 3 files changed, 76 insertions(+), 7 deletions(-) diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index 45b0ada..7ac0d89 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -872,7 +872,7 @@ extern "C" { NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; qNGEvent.position = flipPoint(p).toPoint(); qNGEvent.percentage = [event magnification]; - qApp->sendEvent(qwidget, &qNGEvent); + qt_sendSpontaneousEvent(qwidget, &qNGEvent); } - (void)rotateWithEvent:(NSEvent *)event; @@ -885,7 +885,7 @@ extern "C" { NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; qNGEvent.position = flipPoint(p).toPoint(); qNGEvent.percentage = [event rotation]; - qApp->sendEvent(qwidget, &qNGEvent); + qt_sendSpontaneousEvent(qwidget, &qNGEvent); } - (void)swipeWithEvent:(NSEvent *)event; @@ -898,7 +898,7 @@ extern "C" { NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; qNGEvent.position = flipPoint(p).toPoint(); qNGEvent.direction = QSize(-[event deltaX], -[event deltaY]); - qApp->sendEvent(qwidget, &qNGEvent); + qt_sendSpontaneousEvent(qwidget, &qNGEvent); } - (void)beginGestureWithEvent:(NSEvent *)event; @@ -910,7 +910,7 @@ extern "C" { qNGEvent.gestureType = QNativeGestureEvent::GestureBegin; NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; qNGEvent.position = flipPoint(p).toPoint(); - qApp->sendEvent(qwidget, &qNGEvent); + qt_sendSpontaneousEvent(qwidget, &qNGEvent); } - (void)endGestureWithEvent:(NSEvent *)event; @@ -922,7 +922,7 @@ extern "C" { qNGEvent.gestureType = QNativeGestureEvent::GestureEnd; NSPoint p = [[event window] convertBaseToScreen:[event locationInWindow]]; qNGEvent.position = flipPoint(p).toPoint(); - qApp->sendEvent(qwidget, &qNGEvent); + qt_sendSpontaneousEvent(qwidget, &qNGEvent); } #endif // MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 diff --git a/src/gui/kernel/qeventdispatcher_mac.mm b/src/gui/kernel/qeventdispatcher_mac.mm index efe6375..113362a 100644 --- a/src/gui/kernel/qeventdispatcher_mac.mm +++ b/src/gui/kernel/qeventdispatcher_mac.mm @@ -500,7 +500,7 @@ static bool IsMouseOrKeyEvent( NSEvent* event ) static inline void qt_mac_waitForMoreEvents() { #ifndef QT_MAC_USE_COCOA - while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e20, true) == kCFRunLoopRunTimedOut); + while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e20, true) == kCFRunLoopRunTimedOut) ; #else // If no event exist in the cocoa event que, wait // (and free up cpu time) until at least one event occur. diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index 5bf140c..b13c9eb 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -107,6 +107,7 @@ #include #include "qwidget_p.h" +#include "qevent_p.h" #include "qdnd_p.h" #include @@ -729,7 +730,12 @@ static EventTypeSpec window_events[] = { { kEventClassWindow, kEventWindowGetRegion }, { kEventClassWindow, kEventWindowGetClickModality }, { kEventClassWindow, kEventWindowTransitionCompleted }, - { kEventClassMouse, kEventMouseDown } + { kEventClassMouse, kEventMouseDown }, + { kEventClassGesture, kEventGestureStarted }, + { kEventClassGesture, kEventGestureEnded }, + { kEventClassGesture, kEventGestureMagnify }, + { kEventClassGesture, kEventGestureSwipe }, + { kEventClassGesture, kEventGestureRotate } }; static EventHandlerUPP mac_win_eventUPP = 0; static void cleanup_win_eventUPP() @@ -1013,6 +1019,69 @@ OSStatus QWidgetPrivate::qt_window_event(EventHandlerCallRef er, EventRef event, return SendEventToApplication(event); handled_event = false; break; } + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 + case kEventClassGesture: { + // First, find the widget that was under + // the mouse when the gesture happened: + HIPoint screenLocation; + if (GetEventParameter(event, kEventParamMouseLocation, typeHIPoint, 0, + sizeof(screenLocation), 0, &screenLocation) != noErr) { + handled_event = false; + break; + } + QWidget *widget = QApplication::widgetAt(screenLocation.x, screenLocation.y); + if (!widget) { + handled_event = false; + break; + } + + QNativeGestureEvent qNGEvent; + qNGEvent.position = QPoint(screenLocation.x, screenLocation.y); + + switch (ekind) { + case kEventGestureStarted: + qNGEvent.gestureType = QNativeGestureEvent::GestureBegin; + break; + case kEventGestureEnded: + qNGEvent.gestureType = QNativeGestureEvent::GestureEnd; + break; + case kEventGestureRotate: { + CGFloat amount; + if (GetEventParameter(event, kEventParamRotationAmount, typeCGFloat, 0, + sizeof(amount), 0, &amount) != noErr) { + handled_event = false; + break; + } + qNGEvent.gestureType = QNativeGestureEvent::Zoom; + qNGEvent.percentage = float(amount); + break; } + case kEventGestureSwipe: { + HIPoint swipeDirection; + if (GetEventParameter(event, kEventParamSwipeDirection, typeHIPoint, 0, + sizeof(swipeDirection), 0, &swipeDirection) != noErr) { + handled_event = false; + break; + } + qNGEvent.gestureType = QNativeGestureEvent::Swipe; + qNGEvent.direction = QSize(-swipeDirection.x, -swipeDirection.y); + break; } + case kEventGestureMagnify: { + CGFloat amount; + if (GetEventParameter(event, kEventParamMagnificationAmount, typeCGFloat, 0, + sizeof(amount), 0, &amount) != noErr) { + handled_event = false; + break; + } + qNGEvent.gestureType = QNativeGestureEvent::Zoom; + qNGEvent.percentage = float(amount); + break; } + } + + QApplication::sendSpontaneousEvent(widget, &qNGEvent); + break; } +#endif // gestures + default: handled_event = false; } -- cgit v0.12 From 0f8a326341bd3aab1675acb6b15e011247f7c6f8 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Tue, 18 Aug 2009 11:19:15 +0200 Subject: Fix build failure on Mac OS 10.5 Gestures only awailable on 10.6 --- src/gui/kernel/qwidget_mac.mm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm index b13c9eb..999faeb 100644 --- a/src/gui/kernel/qwidget_mac.mm +++ b/src/gui/kernel/qwidget_mac.mm @@ -730,12 +730,14 @@ static EventTypeSpec window_events[] = { { kEventClassWindow, kEventWindowGetRegion }, { kEventClassWindow, kEventWindowGetClickModality }, { kEventClassWindow, kEventWindowTransitionCompleted }, - { kEventClassMouse, kEventMouseDown }, +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 { kEventClassGesture, kEventGestureStarted }, { kEventClassGesture, kEventGestureEnded }, { kEventClassGesture, kEventGestureMagnify }, { kEventClassGesture, kEventGestureSwipe }, - { kEventClassGesture, kEventGestureRotate } + { kEventClassGesture, kEventGestureRotate }, +#endif + { kEventClassMouse, kEventMouseDown } }; static EventHandlerUPP mac_win_eventUPP = 0; static void cleanup_win_eventUPP() -- cgit v0.12 From 610af2bf4d6d57f86ca71c9764b5b03b01aafad8 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Tue, 18 Aug 2009 11:55:07 +0200 Subject: QHeaderView: assertion when modifying the root iem of a treewidget dataChanged is emitted with invalid model index. We needed to handle that. Reviewed-by: ogoffart --- src/gui/itemviews/qheaderview.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gui/itemviews/qheaderview.cpp b/src/gui/itemviews/qheaderview.cpp index f7b5b6f..4ab81f5 100644 --- a/src/gui/itemviews/qheaderview.cpp +++ b/src/gui/itemviews/qheaderview.cpp @@ -1195,7 +1195,8 @@ QHeaderView::ResizeMode QHeaderView::resizeMode(int logicalIndex) const { Q_D(const QHeaderView); int visual = visualIndex(logicalIndex); - Q_ASSERT(visual != -1); + if (visual == -1) + return Fixed; //the default value return d->headerSectionResizeMode(visual); } -- cgit v0.12 From 7a64a3f67d53a99e6e2200f6481c98013004b4e4 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Tue, 18 Aug 2009 11:56:46 +0200 Subject: QItemSelectionModel: hasSelection can return true when no selection we needed to finalize the selection when rows are removed Reviewed-by: ogoffart --- src/gui/itemviews/qitemselectionmodel.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/gui/itemviews/qitemselectionmodel.cpp b/src/gui/itemviews/qitemselectionmodel.cpp index 98810a0..8414460 100644 --- a/src/gui/itemviews/qitemselectionmodel.cpp +++ b/src/gui/itemviews/qitemselectionmodel.cpp @@ -573,6 +573,7 @@ void QItemSelectionModelPrivate::_q_rowsAboutToBeRemoved(const QModelIndex &pare int start, int end) { Q_Q(QItemSelectionModel); + finalize(); // update current index if (currentIndex.isValid() && parent == currentIndex.parent() @@ -591,8 +592,8 @@ void QItemSelectionModelPrivate::_q_rowsAboutToBeRemoved(const QModelIndex &pare } QItemSelection deselected; - QItemSelection::iterator it = currentSelection.begin(); - while (it != currentSelection.end()) { + QItemSelection::iterator it = ranges.begin(); + while (it != ranges.end()) { if (it->topLeft().parent() != parent) { // Check parents until reaching root or contained in range QModelIndex itParent = it->topLeft().parent(); while (itParent.isValid() && itParent.parent() != parent) @@ -600,24 +601,22 @@ void QItemSelectionModelPrivate::_q_rowsAboutToBeRemoved(const QModelIndex &pare if (parent.isValid() && start <= itParent.row() && itParent.row() <= end) { deselected.append(*it); - it = currentSelection.erase(it); + it = ranges.erase(it); } else { ++it; } } else if (start <= it->bottom() && it->bottom() <= end // Full inclusion && start <= it->top() && it->top() <= end) { deselected.append(*it); - it = currentSelection.erase(it); + it = ranges.erase(it); } else if (start <= it->top() && it->top() <= end) { // Top intersection deselected.append(QItemSelectionRange(it->topLeft(), model->index(end, it->left(), it->parent()))); - it = currentSelection.insert(it, QItemSelectionRange(model->index(end + 1, it->left(), it->parent()), - it->bottomRight())); - it = currentSelection.erase(++it); + *it = QItemSelectionRange(model->index(end + 1, it->left(), it->parent()), it->bottomRight()); + ++it; } else if (start <= it->bottom() && it->bottom() <= end) { // Bottom intersection deselected.append(QItemSelectionRange(model->index(start, it->right(), it->parent()), it->bottomRight())); - it = currentSelection.insert(it, QItemSelectionRange(it->topLeft(), - model->index(start - 1, it->right(), it->parent()))); - it = currentSelection.erase(++it); + *it = QItemSelectionRange(it->topLeft(), model->index(start - 1, it->right(), it->parent())); + ++it; } else { if (it->top() < start && end < it->bottom()) // Middle intersection (do nothing) deselected.append(QItemSelectionRange(model->index(start, it->right(), it->parent()), @@ -626,7 +625,8 @@ void QItemSelectionModelPrivate::_q_rowsAboutToBeRemoved(const QModelIndex &pare } } - emit q->selectionChanged(QItemSelection(), deselected); + if (!deselected.isEmpty()) + emit q->selectionChanged(QItemSelection(), deselected); } /*! -- cgit v0.12 From 089689914fd7b223c10f5408a6db255ce540e718 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Tue, 18 Aug 2009 12:36:40 +0200 Subject: Fix autotest: removed useless debug traces --- tests/auto/qmenu/tst_qmenu.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/auto/qmenu/tst_qmenu.cpp b/tests/auto/qmenu/tst_qmenu.cpp index b06b247..90b9a2a 100644 --- a/tests/auto/qmenu/tst_qmenu.cpp +++ b/tests/auto/qmenu/tst_qmenu.cpp @@ -710,7 +710,6 @@ void tst_QMenu::task250673_activeMultiColumnSubMenuPosition() uint i = 2; while (main.columnCount() < 2) { main.addAction(QString("Item %1").arg(i)); - qDebug() << "adding action" << i; ++i; Q_ASSERT(i<1000); } -- cgit v0.12 From 7d2fb4f6dfbfe843ec2d101c06b891230a49d20a Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 12:42:23 +0200 Subject: Autotest: Be very pedant about the tests. There's at least one compiler where it breaks, so let's find out where. --- tests/auto/qsharedpointer/tst_qsharedpointer.cpp | 37 +++++++++++++++++++++--- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/tests/auto/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/qsharedpointer/tst_qsharedpointer.cpp index ab75c91..c9b2325 100644 --- a/tests/auto/qsharedpointer/tst_qsharedpointer.cpp +++ b/tests/auto/qsharedpointer/tst_qsharedpointer.cpp @@ -761,17 +761,46 @@ void tst_QSharedPointer::differentPointers() { DiffPtrDerivedData *aData = new DiffPtrDerivedData; Data *aBase = aData; - Q_ASSERT(aData == aBase); - Q_ASSERT(*reinterpret_cast(&aData) != *reinterpret_cast(&aBase)); + + // ensure that this compiler isn't broken + if (*reinterpret_cast(&aData) == *reinterpret_cast(&aBase)) + qFatal("Something went very wrong -- we couldn't create two different pointers to the same object"); + if (aData != aBase) + QSKIP("Broken compiler", SkipAll); + if (aBase != aData) + QSKIP("Broken compiler", SkipAll); QSharedPointer ptr = QSharedPointer(aData); QSharedPointer baseptr = qSharedPointerCast(ptr); - QVERIFY(ptr == baseptr); + qDebug("naked: orig: %p; base: %p (%s) -- QSharedPointer: orig: %p; base %p (%s) -- result: %s", + aData, aBase, aData == aBase ? "equal" : "not equal", + ptr.data(), baseptr.data(), ptr.data() == baseptr.data() ? "equal" : "not equal", + baseptr.data() == aData ? "equal" : "not equal"); + QVERIFY(ptr.data() == baseptr.data()); + QVERIFY(baseptr.data() == ptr.data()); + QVERIFY(ptr == baseptr); + QVERIFY(baseptr == ptr); + + QVERIFY(ptr.data() == aBase); + QVERIFY(aBase == ptr.data()); + QVERIFY(ptr.data() == aData); + QVERIFY(aData == ptr.data()); + QVERIFY(ptr == aBase); + QVERIFY(aBase == ptr); QVERIFY(ptr == aData); - QVERIFY(baseptr == aData); + QVERIFY(aData == ptr); + + QVERIFY(baseptr.data() == aBase); + QVERIFY(aBase == baseptr.data()); QVERIFY(baseptr == aBase); + QVERIFY(aBase == baseptr); + + QVERIFY(baseptr.data() == aData); + QVERIFY(aData == baseptr.data()); + QVERIFY(baseptr == aData); + QVERIFY(aData == baseptr); } check(); -- cgit v0.12 From e1c9136214532cc41074449e3a894fdea020a41e Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Tue, 18 Aug 2009 13:20:35 +0200 Subject: Fix autotest: on windows, timers are not accurate enough --- tests/auto/qtoolbutton/tst_qtoolbutton.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/auto/qtoolbutton/tst_qtoolbutton.cpp b/tests/auto/qtoolbutton/tst_qtoolbutton.cpp index 6376c5d..aca9a20 100644 --- a/tests/auto/qtoolbutton/tst_qtoolbutton.cpp +++ b/tests/auto/qtoolbutton/tst_qtoolbutton.cpp @@ -222,8 +222,10 @@ void tst_QToolButton::task176137_autoRepeatOfAction() tb.setAutoRepeat (true); QSignalSpy repeatSpy(&action,SIGNAL(triggered())); // new spy QTest::mousePress ( &tb, Qt::LeftButton); - QTest::mouseRelease ( &tb, Qt::LeftButton, 0, QPoint (), 2000); - QCOMPARE (repeatSpy.count(), (2000 - tb.autoRepeatDelay()) / tb.autoRepeatInterval() + 1); + QTest::mouseRelease ( &tb, Qt::LeftButton, 0, QPoint (), 3000); + qreal expected = (3000 - tb.autoRepeatDelay()) / tb.autoRepeatInterval() + 1; + //we check that the difference is less than 10% (on some systems timers are not super accurate) + QVERIFY ( qAbs( (expected - repeatSpy.count()) / expected) < 0.1); } -- cgit v0.12 From 5f2f444a9d8d80d778053c2af66534d582145055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Tue, 18 Aug 2009 13:35:30 +0200 Subject: Fixed bug when rendering long lines of text without XRender. XRectangle coordinates need to be clipped to the short integer range. Task-number: 250137 Reviewed-by: Trond --- src/gui/painting/qpaintengine_x11.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/gui/painting/qpaintengine_x11.cpp b/src/gui/painting/qpaintengine_x11.cpp index 6816aac..a4d34b5 100644 --- a/src/gui/painting/qpaintengine_x11.cpp +++ b/src/gui/painting/qpaintengine_x11.cpp @@ -2459,15 +2459,23 @@ void QX11PaintEngine::drawFreetype(const QPointF &p, const QTextItemInt &ti) XRectangle rects[rectcount]; int num_rects = 0; + QPoint delta(qRound(d->matrix.dx()), qRound(d->matrix.dy())); + QRect clip(d->polygonClipper.boundingRect()); for (int i=0; i < path.elementCount(); i+=5) { int x = qRound(path.elementAt(i).x); int y = qRound(path.elementAt(i).y); int w = qRound(path.elementAt(i+1).x) - x; int h = qRound(path.elementAt(i+2).y) - y; - rects[num_rects].x = x + qRound(d->matrix.dx()); - rects[num_rects].y = y + qRound(d->matrix.dy()); - rects[num_rects].width = w; - rects[num_rects].height = h; + + QRect rect = QRect(x + delta.x(), y + delta.y(), w, h); + rect = rect.intersected(clip); + if (rect.isEmpty()) + continue; + + rects[num_rects].x = short(rect.x()); + rects[num_rects].y = short(rect.y()); + rects[num_rects].width = ushort(rect.width()); + rects[num_rects].height = ushort(rect.height()); ++num_rects; if (num_rects == rectcount) { XFillRectangles(d->dpy, d->hd, d->gc, rects, num_rects); -- cgit v0.12 From a250ca3a3c0b777f274388b9e57a985d7438f8ff Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Tue, 18 Aug 2009 14:54:15 +0200 Subject: Make TestLib compatible with mingw when gui is not used The problem is that headers in QTestLib define functions for mouse and key events. Those are causing link errors on all autotests that do "QT -= gui" with mingw (only debug seems to be affected). Reviewed-by: jasplin --- src/testlib/qtestevent.h | 5 +++++ src/testlib/qtestkeyboard.h | 2 +- src/testlib/qtestmouse.h | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/testlib/qtestevent.h b/src/testlib/qtestevent.h index a8376ee..dfbba33 100644 --- a/src/testlib/qtestevent.h +++ b/src/testlib/qtestevent.h @@ -71,6 +71,7 @@ public: virtual ~QTestEvent() {} }; +#ifdef QT_GUI_LIB class QTestKeyEvent: public QTestEvent { public: @@ -135,6 +136,8 @@ private: QPoint _pos; int _delay; }; +#endif //QT_GUI_LIB + class QTestDelayEvent: public QTestEvent { @@ -159,6 +162,7 @@ public: inline void clear() { qDeleteAll(*this); QList::clear(); } +#ifdef QT_GUI_LIB inline void addKeyClick(Qt::Key qtKey, Qt::KeyboardModifiers modifiers = Qt::NoModifier, int msecs = -1) { addKeyEvent(QTest::Click, qtKey, modifiers, msecs); } inline void addKeyPress(Qt::Key qtKey, Qt::KeyboardModifiers modifiers = Qt::NoModifier, int msecs = -1) @@ -194,6 +198,7 @@ public: { append(new QTestMouseEvent(QTest::MouseDClick, button, stateKey, pos, delay)); } inline void addMouseMove(QPoint pos = QPoint(), int delay=-1) { append(new QTestMouseEvent(QTest::MouseMove, Qt::NoButton, 0, pos, delay)); } +#endif //QT_GUI_LIB inline void addDelay(int msecs) { append(new QTestDelayEvent(msecs)); } diff --git a/src/testlib/qtestkeyboard.h b/src/testlib/qtestkeyboard.h index 2e475b2..af81075 100644 --- a/src/testlib/qtestkeyboard.h +++ b/src/testlib/qtestkeyboard.h @@ -39,7 +39,7 @@ ** ****************************************************************************/ -#ifndef QTESTKEYBOARD_H +#if !defined(QTESTKEYBOARD_H) && defined(QT_GUI_LIB) #define QTESTKEYBOARD_H #if 0 diff --git a/src/testlib/qtestmouse.h b/src/testlib/qtestmouse.h index 2825c58..7ea927c 100644 --- a/src/testlib/qtestmouse.h +++ b/src/testlib/qtestmouse.h @@ -39,7 +39,7 @@ ** ****************************************************************************/ -#ifndef QTESTMOUSE_H +#if !defined(QTESTMOUSE_H) && defined(QT_GUI_LIB) #define QTESTMOUSE_H #if 0 -- cgit v0.12 From aaf10f42467aba28717b587adb85f31b4ada08ab Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Tue, 18 Aug 2009 14:43:14 +0200 Subject: Animations: update the documentation Removed the reference to the QAnimationState that doesn't exist anymore --- src/corelib/animation/qanimationgroup.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/corelib/animation/qanimationgroup.cpp b/src/corelib/animation/qanimationgroup.cpp index ab47b5a..78777f1 100644 --- a/src/corelib/animation/qanimationgroup.cpp +++ b/src/corelib/animation/qanimationgroup.cpp @@ -79,13 +79,6 @@ QAnimationGroup takes ownership of the animations it manages, and ensures that they are deleted when the animation group is deleted. - You can also use a \l{The State Machine Framework}{state machine} - to create complex animations. The framework provides a special - state, QAnimationState, that plays an animation upon entry and - transitions to a new state when the animation has finished - playing. This technique can also be combined with using animation - groups. - \sa QAbstractAnimation, QVariantAnimation, {The Animation Framework} */ -- cgit v0.12 From 413efbbc942262a636c521b898e0086258daa61a Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 18 Aug 2009 15:39:24 +0200 Subject: Compile fix with namespaces --- src/gui/painting/qpaintdevice.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/painting/qpaintdevice.cpp b/src/gui/painting/qpaintdevice.cpp index 6477952..6a2a4c4 100644 --- a/src/gui/painting/qpaintdevice.cpp +++ b/src/gui/painting/qpaintdevice.cpp @@ -64,3 +64,5 @@ int QPaintDevice::metric(PaintDeviceMetric) const qWarning("QPaintDevice::metrics: Device has no metric information"); return 0; } + +QT_END_NAMESPACE -- cgit v0.12 From d59b92565e3632e2b36ea7de881bd08418760bbc Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Tue, 18 Aug 2009 15:41:34 +0200 Subject: add QGraphicsObject Q_INTERFACES macro --- src/gui/graphicsview/qgraphicsitem.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/graphicsview/qgraphicsitem.h b/src/gui/graphicsview/qgraphicsitem.h index b5e6ed5..52b862e 100644 --- a/src/gui/graphicsview/qgraphicsitem.h +++ b/src/gui/graphicsview/qgraphicsitem.h @@ -516,6 +516,7 @@ class Q_GUI_EXPORT QGraphicsObject : public QObject, public QGraphicsItem Q_PROPERTY(qreal rotation READ rotation WRITE setRotation NOTIFY rotationChanged) Q_PROPERTY(qreal scale READ scale WRITE setScale NOTIFY scaleChanged) Q_PROPERTY(QPointF transformOriginPoint READ transformOriginPoint WRITE setTransformOriginPoint) + Q_INTERFACES(QGraphicsItem) public: QGraphicsObject(QGraphicsItem *parent = 0); -- cgit v0.12 From 37b375092b6db1c3302f93676b6329742f5c9fef Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Tue, 18 Aug 2009 15:53:21 +0200 Subject: mingw: make it possible to build without rtti support --- mkspecs/features/win32/rtti_off.prf | 1 + 1 file changed, 1 insertion(+) diff --git a/mkspecs/features/win32/rtti_off.prf b/mkspecs/features/win32/rtti_off.prf index 8f175de..b520bfa 100644 --- a/mkspecs/features/win32/rtti_off.prf +++ b/mkspecs/features/win32/rtti_off.prf @@ -1,3 +1,4 @@ CONFIG -= rtti QMAKE_CFLAGS += $$QMAKE_CFLAGS_RTTI_OFF QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_RTTI_OFF +DEFINES += QT_NO_DYNAMIC_CAST \ No newline at end of file -- cgit v0.12 From 68b7514840fe29f84af8d418538084ed337bd171 Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Tue, 18 Aug 2009 07:05:08 -0700 Subject: Make sure to update pos QDFBCursor::move We don't need to chain to the base class since the QDirectFBScreenCursor always is rendered by hardware but we should update the pos variable in case people ask where the cursor is. Reviewed-by: TrustMe --- src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp index 774162c..2541677 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp @@ -578,6 +578,7 @@ QDirectFBScreenCursor::QDirectFBScreenCursor() void QDirectFBScreenCursor::move(int x, int y) { + pos = QPoint(x, y); layer->WarpCursor(layer, x, y); } -- cgit v0.12 From e1869593a4c2a074cc916c770e258d6f2349db01 Mon Sep 17 00:00:00 2001 From: David Boddie Date: Tue, 18 Aug 2009 16:25:31 +0200 Subject: Doc: Added missing images. Reviewed-by: Trust Me --- doc/src/diagrams/dbus-examples.png | Bin 0 -> 19642 bytes doc/src/images/dbus-examples.png | Bin 0 -> 6181 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/src/diagrams/dbus-examples.png create mode 100644 doc/src/images/dbus-examples.png diff --git a/doc/src/diagrams/dbus-examples.png b/doc/src/diagrams/dbus-examples.png new file mode 100644 index 0000000..816a9ab Binary files /dev/null and b/doc/src/diagrams/dbus-examples.png differ diff --git a/doc/src/images/dbus-examples.png b/doc/src/images/dbus-examples.png new file mode 100644 index 0000000..6768935 Binary files /dev/null and b/doc/src/images/dbus-examples.png differ -- cgit v0.12 From 89cc6c1b49e3e33fc7787f1dd9cfaadb43ad4bac Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Tue, 18 Aug 2009 15:46:00 +0200 Subject: Fixed QRasterPaintEngine::drawImage() for 1x1 source rectangles. QRasterPaintEngine::drawImage() used an optimized code path when the source rectangle was 1x1. It would sample the source image at the source rectangle's top-left corner and use the sampled color to fill the entire target rectangle. There were two bugs, however: 1) The sampled color was assumed to be non-premultiplied, so you could end up with premultiplying the color twice. This was fixed by avoiding premultiplying a second time if the source image has a premultiplied format. 2) Since the source rectangle is a QRectF, it could easily cross pixel boundaries even if it's 1x1. In this case, it is not correct to fill the target rectangle with a single color. This was fixed by checking if the entire source rectangle is contained in a single pixel before taking the optimized code path. Task-number: 256950 Reviewed-by: Trond --- src/gui/painting/qpaintengine_raster.cpp | 36 ++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 547818c..63c4e32 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -2544,12 +2544,44 @@ void QRasterPaintEngine::drawImage(const QRectF &r, const QImage &img, const QRe Q_D(QRasterPaintEngine); QRasterPaintEngineState *s = state(); const bool aa = s->flags.antialiased || s->flags.bilinear; - if (!aa && sr.size() == QSize(1, 1)) { + int sr_l = qFloor(sr.left()); + int sr_r = qCeil(sr.right()) - 1; + int sr_t = qFloor(sr.top()); + int sr_b = qCeil(sr.bottom()) - 1; + + if (!aa && sr_l == sr_r && sr_t == sr_b) { // as fillRect will apply the aliased coordinate delta we need to // subtract it here as we don't use it for image drawing QTransform old = s->matrix; s->matrix = s->matrix * QTransform::fromTranslate(-aliasedCoordinateDelta, -aliasedCoordinateDelta); - fillRect(r, QColor::fromRgba(img.pixel(sr.x(), sr.y()))); + + // Do whatever fillRect() does, but without premultiplying the color if it's already premultiplied. + QRgb color = img.pixel(sr_l, sr_t); + switch (img.format()) { + case QImage::Format_ARGB32_Premultiplied: + case QImage::Format_ARGB8565_Premultiplied: + case QImage::Format_ARGB6666_Premultiplied: + case QImage::Format_ARGB8555_Premultiplied: + case QImage::Format_ARGB4444_Premultiplied: + // Combine premultiplied color with the opacity set on the painter. + d->solid_color_filler.solid.color = + ((((color & 0x00ff00ff) * s->intOpacity) >> 8) & 0x00ff00ff) + | ((((color & 0xff00ff00) >> 8) * s->intOpacity) & 0xff00ff00); + break; + default: + d->solid_color_filler.solid.color = PREMUL(ARGB_COMBINE_ALPHA(color, s->intOpacity)); + break; + } + + if ((d->solid_color_filler.solid.color & 0xff000000) == 0 + && s->composition_mode == QPainter::CompositionMode_SourceOver) { + return; + } + + d->solid_color_filler.clip = d->clip(); + d->solid_color_filler.adjustSpanMethods(); + fillRect(r, &d->solid_color_filler); + s->matrix = old; return; } -- cgit v0.12 From c38e1a53cee2178f9270b515826bf907654b1964 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 14:28:26 +0200 Subject: Add support for LIBS_PRIVATE to the VCProject generator too. Reviewed-by: Marius Storm-Olsen --- qmake/generators/win32/msvc_vcproj.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index 2b0ce28..7c4c70f 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -623,7 +623,7 @@ void VcprojGenerator::writeSubDirs(QTextStream &t) } // Add all unknown libs to the deps - QStringList where("QMAKE_LIBS"); + QStringList where = QStringList() << "QMAKE_LIBS" << "QMAKE_LIBS_PRIVATE"; if(!tmp_proj.isEmpty("QMAKE_INTERNAL_PRL_LIBS")) where = tmp_proj.variables()["QMAKE_INTERNAL_PRL_LIBS"]; for(QStringList::iterator wit = where.begin(); @@ -1556,6 +1556,7 @@ void VcprojGenerator::initOld() } project->values("QMAKE_LIBS") += escapeFilePaths(project->values("LIBS")); + project->values("QMAKE_LIBS_PRIVATE") += escapeFilePaths(project->values("LIBS_PRIVATE")); // Get filename w/o extension ----------------------------------- QString msvcproj_project = ""; @@ -1599,6 +1600,7 @@ void VcprojGenerator::initOld() // $$QMAKE.. -> $$MSVCPROJ.. ------------------------------------- project->values("MSVCPROJ_LIBS") += project->values("QMAKE_LIBS"); + project->values("MSVCPROJ_LIBS") += project->values("QMAKE_LIBS_PRIVATE"); project->values("MSVCPROJ_LFLAGS") += project->values("QMAKE_LFLAGS"); if(!project->values("QMAKE_LIBDIR").isEmpty()) { QStringList strl = project->values("QMAKE_LIBDIR"); -- cgit v0.12 From 3f83ef0a8abc5d1365c67337357564a8d478b1c1 Mon Sep 17 00:00:00 2001 From: Thierry Bastian Date: Tue, 18 Aug 2009 17:27:02 +0200 Subject: Fixed a crash when setting twice the same viewmode on a QListView autotest will detect the problem --- src/gui/itemviews/qlistview.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui/itemviews/qlistview.cpp b/src/gui/itemviews/qlistview.cpp index ea38f5f..e9e365f 100644 --- a/src/gui/itemviews/qlistview.cpp +++ b/src/gui/itemviews/qlistview.cpp @@ -458,6 +458,8 @@ QSize QListView::gridSize() const void QListView::setViewMode(ViewMode mode) { Q_D(QListView); + if (d->viewMode == mode) + return; d->viewMode = mode; if (mode == ListMode) { @@ -1963,7 +1965,7 @@ QListViewPrivate::QListViewPrivate() movement(QListView::Static), resizeMode(QListView::Fixed), layoutMode(QListView::SinglePass), - viewMode(QListView::ListMode), + viewMode(QListView::IconMode), //this will ensure the first initialization to ListView modeProperties(0), column(0), uniformItemSizes(false), -- cgit v0.12 From e08ca6bcaf5fc746fdf8f3e379c17bf0a9daa771 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Tue, 18 Aug 2009 17:27:17 +0200 Subject: QGraphicsView test fix Reviewed-by: Olivier --- tests/auto/qgraphicsview/tst_qgraphicsview.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp index c12fb11..2506e70 100644 --- a/tests/auto/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/auto/qgraphicsview/tst_qgraphicsview.cpp @@ -3637,18 +3637,18 @@ void tst_QGraphicsView::task255529_transformationAnchorMouseAndViewportMargins() VpGraphicsView view(&scene); view.show(); +#ifdef Q_WS_X11 + qt_x11_wait_for_window_manager(&view); +#endif QPoint mouseViewPos(20, 20); sendMouseMove(view.viewport(), mouseViewPos); - QTest::qWait(125); QPointF mouseScenePos = view.mapToScene(mouseViewPos); - view.setTransform(QTransform().scale(5, 5)); - QTest::qWait(125); - view.setTransform(QTransform().rotate(5, Qt::ZAxis), true); - QTest::qWait(125); + view.setTransform(QTransform().scale(5, 5).rotate(5, Qt::ZAxis), true); QPointF newMouseScenePos = view.mapToScene(mouseViewPos); - qreal slack = 3; + + qreal slack = 1; QVERIFY(qAbs(newMouseScenePos.x() - mouseScenePos.x()) < slack); QVERIFY(qAbs(newMouseScenePos.y() - mouseScenePos.y()) < slack); } -- cgit v0.12 From 393f5d5b2705c0ed7e6e1a3a69cc9cdf16cf334d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Mon, 17 Aug 2009 16:55:58 +0200 Subject: Added two convenience functions to QXmlStreamReader QXmlStreamReader::readNextStartElement reads until the next start element within the current element, or returns false when no such element is encountered before the end element is reached. It simplifies the common case of iterating over the elements in an XML document. QXmlStreamReader::skipCurrentElement reads until the end element of the current element, skipping any child elements. This functionality was requested in two tasks, and a similar function 'readUnknownElement' was present in Qt's stream reader example. Autotest is included, example and documentation have been updated. Task-number: 238793 Reviewed-by: mae --- doc/src/examples/qxmlstreambookmarks.qdoc | 13 ++- examples/network/googlesuggest/googlesuggest.cpp | 7 +- examples/xml/streambookmarks/xbelreader.cpp | 107 +++++++---------------- examples/xml/streambookmarks/xbelreader.h | 1 - src/corelib/xml/qxmlstream.cpp | 49 +++++++++++ src/corelib/xml/qxmlstream.h | 3 + tests/auto/qxmlstream/tst_qxmlstream.cpp | 19 ++++ 7 files changed, 114 insertions(+), 85 deletions(-) diff --git a/doc/src/examples/qxmlstreambookmarks.qdoc b/doc/src/examples/qxmlstreambookmarks.qdoc index def4c47..26964c4 100644 --- a/doc/src/examples/qxmlstreambookmarks.qdoc +++ b/doc/src/examples/qxmlstreambookmarks.qdoc @@ -106,19 +106,18 @@ of reading only takes place if the file is a valid XBEL 1.0 file. Note that the XML input needs to be well-formed to be accepted by QXmlStreamReader. Otherwise, the \l{QXmlStreamReader::raiseError()} - {raiseError()} function is used to display an error message. + {raiseError()} function is used to display an error message. Since the + XBEL reader is only concerned with reading XML elements, it makes + extensive use of the \l{QXmlStreamReader::readNextStartElement()} + convenience function. \snippet examples/xml/streambookmarks/xbelreader.cpp 1 - The \c readUnknownElement() function reads an unknown element. The - Q_ASSERT() macro is used to provide a pre-condition for the function. - - \snippet examples/xml/streambookmarks/xbelreader.cpp 2 - The \c readXBEL() function reads the name of a startElement and calls the appropriate function to read it, depending on whether if its a "folder", "bookmark" or "separator". Otherwise, it calls - \c readUnknownElement(). + \l{QXmlStreamReader::skipCurrentElement()}. The Q_ASSERT() macro is used + to provide a pre-condition for the function. \snippet examples/xml/streambookmarks/xbelreader.cpp 3 diff --git a/examples/network/googlesuggest/googlesuggest.cpp b/examples/network/googlesuggest/googlesuggest.cpp index ada0edf..4142511 100644 --- a/examples/network/googlesuggest/googlesuggest.cpp +++ b/examples/network/googlesuggest/googlesuggest.cpp @@ -134,7 +134,6 @@ bool GSuggestCompletion::eventFilter(QObject *obj, QEvent *ev) void GSuggestCompletion::showCompletion(const QStringList &choices, const QStringList &hits) { - if (choices.isEmpty() || choices.count() != hits.count()) return; @@ -204,16 +203,16 @@ void GSuggestCompletion::handleNetworkData(QNetworkReply *networkReply) QXmlStreamReader xml(response); while (!xml.atEnd()) { xml.readNext(); - if (xml.tokenType() == QXmlStreamReader::StartElement) + if (xml.isStartElement()) { if (xml.name() == "suggestion") { QStringRef str = xml.attributes().value("data"); choices << str.toString(); } - if (xml.tokenType() == QXmlStreamReader::StartElement) - if (xml.name() == "num_queries") { + else if (xml.name() == "num_queries") { QStringRef str = xml.attributes().value("int"); hits << str.toString(); } + } } showCompletion(choices, hits); diff --git a/examples/xml/streambookmarks/xbelreader.cpp b/examples/xml/streambookmarks/xbelreader.cpp index 47c8c3d..729fcf8 100644 --- a/examples/xml/streambookmarks/xbelreader.cpp +++ b/examples/xml/streambookmarks/xbelreader.cpp @@ -62,59 +62,31 @@ bool XbelReader::read(QIODevice *device) { setDevice(device); - while (!atEnd()) { - readNext(); - - if (isStartElement()) { - if (name() == "xbel" && attributes().value("version") == "1.0") - readXBEL(); - else - raiseError(QObject::tr("The file is not an XBEL version 1.0 file.")); - } + if (readNextStartElement()) { + if (name() == "xbel" && attributes().value("version") == "1.0") + readXBEL(); + else + raiseError(QObject::tr("The file is not an XBEL version 1.0 file.")); } return !error(); } //! [1] -//! [2] -void XbelReader::readUnknownElement() -{ - Q_ASSERT(isStartElement()); - - while (!atEnd()) { - readNext(); - - if (isEndElement()) - break; - - if (isStartElement()) - readUnknownElement(); - } -} -//! [2] - //! [3] void XbelReader::readXBEL() { Q_ASSERT(isStartElement() && name() == "xbel"); - while (!atEnd()) { - readNext(); - - if (isEndElement()) - break; - - if (isStartElement()) { - if (name() == "folder") - readFolder(0); - else if (name() == "bookmark") - readBookmark(0); - else if (name() == "separator") - readSeparator(0); - else - readUnknownElement(); - } + while (readNextStartElement()) { + if (name() == "folder") + readFolder(0); + else if (name() == "bookmark") + readBookmark(0); + else if (name() == "separator") + readSeparator(0); + else + readUnknownElement(); } } //! [3] @@ -132,10 +104,12 @@ void XbelReader::readTitle(QTreeWidgetItem *item) //! [5] void XbelReader::readSeparator(QTreeWidgetItem *item) { + Q_ASSERT(isStartElement() && name() == "separator"); + QTreeWidgetItem *separator = createChildItem(item); separator->setFlags(item->flags() & ~Qt::ItemIsSelectable); separator->setText(0, QString(30, 0xB7)); - readElementText(); + skipCurrentElement(); } //! [5] @@ -147,24 +121,17 @@ void XbelReader::readFolder(QTreeWidgetItem *item) bool folded = (attributes().value("folded") != "no"); treeWidget->setItemExpanded(folder, !folded); - while (!atEnd()) { - readNext(); - - if (isEndElement()) - break; - - if (isStartElement()) { - if (name() == "title") - readTitle(folder); - else if (name() == "folder") - readFolder(folder); - else if (name() == "bookmark") - readBookmark(folder); - else if (name() == "separator") - readSeparator(folder); - else - readUnknownElement(); - } + while (readNextStartElement()) { + if (name() == "title") + readTitle(folder); + else if (name() == "folder") + readFolder(folder); + else if (name() == "bookmark") + readBookmark(folder); + else if (name() == "separator") + readSeparator(folder); + else + skipCurrentElement(); } } @@ -177,18 +144,12 @@ void XbelReader::readBookmark(QTreeWidgetItem *item) bookmark->setIcon(0, bookmarkIcon); bookmark->setText(0, QObject::tr("Unknown title")); bookmark->setText(1, attributes().value("href").toString()); - while (!atEnd()) { - readNext(); - - if (isEndElement()) - break; - - if (isStartElement()) { - if (name() == "title") - readTitle(bookmark); - else - readUnknownElement(); - } + + while (readNextStartElement()) { + if (name() == "title") + readTitle(bookmark); + else + skipCurrentElement(); } } diff --git a/examples/xml/streambookmarks/xbelreader.h b/examples/xml/streambookmarks/xbelreader.h index 80f0a28..2debadc 100644 --- a/examples/xml/streambookmarks/xbelreader.h +++ b/examples/xml/streambookmarks/xbelreader.h @@ -62,7 +62,6 @@ public: private: //! [2] - void readUnknownElement(); void readXBEL(); void readTitle(QTreeWidgetItem *item); void readSeparator(QTreeWidgetItem *item); diff --git a/src/corelib/xml/qxmlstream.cpp b/src/corelib/xml/qxmlstream.cpp index a08b167..8b2462e 100644 --- a/src/corelib/xml/qxmlstream.cpp +++ b/src/corelib/xml/qxmlstream.cpp @@ -622,6 +622,55 @@ QXmlStreamReader::TokenType QXmlStreamReader::tokenType() const return d->type; } +/*! + Reads until the next start element within the current element. Returns true + when a start element was reached. When the end element was reached, or when + an error occurred, false is returned. + + The current element is the element matching the most recently parsed start + element of which a matching end element has not yet been reached. When the + parser has reached the end element, the current element becomes the parent + element. + + This is a convenience function for when you're only concerned with parsing + XML elements. The \l{QXmlStream Bookmarks Example} makes extensive use of + this function. + + \since 4.6 + */ +bool QXmlStreamReader::readNextStartElement() +{ + while (readNext() != Invalid) { + if (isEndElement()) + return false; + else if (isStartElement()) + return true; + } + return false; +} + +/*! + Reads until the end of the current element, skipping any child nodes. + This function is useful for skipping unknown elements. + + The current element is the element matching the most recently parsed start + element of which a matching end element has not yet been reached. When the + parser has reached the end element, the current element becomes the parent + element. + + \since 4.6 + */ +void QXmlStreamReader::skipCurrentElement() +{ + int depth = 1; + while (depth && readNext() != Invalid) { + if (isEndElement()) + --depth; + else if (isStartElement()) + ++depth; + } +} + /* * Use the following Perl script to generate the error string index list: ===== PERL SCRIPT ==== diff --git a/src/corelib/xml/qxmlstream.h b/src/corelib/xml/qxmlstream.h index 420a66a..21dcb40 100644 --- a/src/corelib/xml/qxmlstream.h +++ b/src/corelib/xml/qxmlstream.h @@ -321,6 +321,9 @@ public: bool atEnd() const; TokenType readNext(); + bool readNextStartElement(); + void skipCurrentElement(); + TokenType tokenType() const; QString tokenString() const; diff --git a/tests/auto/qxmlstream/tst_qxmlstream.cpp b/tests/auto/qxmlstream/tst_qxmlstream.cpp index 375528c..f496dcf 100644 --- a/tests/auto/qxmlstream/tst_qxmlstream.cpp +++ b/tests/auto/qxmlstream/tst_qxmlstream.cpp @@ -550,6 +550,7 @@ private slots: void setEntityResolver(); void readFromQBuffer() const; void readFromQBufferInvalid() const; + void readNextStartElement() const; void crashInUTF16Codec() const; void hasAttributeSignature() const; void hasAttribute() const; @@ -1107,6 +1108,24 @@ void tst_QXmlStream::readFromQBufferInvalid() const QVERIFY(reader.hasError()); } +void tst_QXmlStream::readNextStartElement() const +{ + QLatin1String in("text"); + QXmlStreamReader reader(in); + + QVERIFY(reader.readNextStartElement()); + QVERIFY(reader.isStartElement() && reader.name() == "A"); + + int amountOfB = 0; + while (reader.readNextStartElement()) { + QVERIFY(reader.isStartElement() && reader.name() == "B"); + ++amountOfB; + reader.skipCurrentElement(); + } + + QCOMPARE(amountOfB, 2); +} + void tst_QXmlStream::crashInUTF16Codec() const { QEventLoop eventLoop; -- cgit v0.12 From fdf8956419fc784b458ef1d42c98fde526f9f5d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Tue, 18 Aug 2009 17:01:19 +0200 Subject: Added a behaviour parameter to QXmlStreamReader::readElementText This makes the function a bit more useful, since previously it was only safe to use if you were sure that it would not encounter an unexpected child element, or if you would be alright with canceling the parser on such an occurrence. Now it is also possible to have it ignore any unexpected child elements, or to have it include the text found in any child elements. Task-number: 231938 Reviewed-by: mae --- src/corelib/xml/qxmlstream.cpp | 58 +++++++++++++++++++++++++++----- src/corelib/xml/qxmlstream.h | 7 ++++ tests/auto/qxmlstream/tst_qxmlstream.cpp | 51 ++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 8 deletions(-) diff --git a/src/corelib/xml/qxmlstream.cpp b/src/corelib/xml/qxmlstream.cpp index 8b2462e..a311b99 100644 --- a/src/corelib/xml/qxmlstream.cpp +++ b/src/corelib/xml/qxmlstream.cpp @@ -129,6 +129,21 @@ QT_BEGIN_NAMESPACE */ /*! + \enum QXmlStreamReader::ReadElementTextBehaviour + + This enum specifies the different behaviours of readElementText(). + + \value ErrorOnUnexpectedElement Raise an UnexpectedElementError and return + what was read so far when a child element is encountered. + + \value IncludeChildElements Recursively include the text from child elements. + + \value SkipChildElements Skip child elements. + + \since 4.6 +*/ + +/*! \enum QXmlStreamReader::Error This enum specifies different error cases @@ -637,6 +652,7 @@ QXmlStreamReader::TokenType QXmlStreamReader::tokenType() const this function. \since 4.6 + \sa readNext() */ bool QXmlStreamReader::readNextStartElement() { @@ -2070,12 +2086,17 @@ void QXmlStreamReader::addExtraNamespaceDeclarations(const QXmlStreamNamespaceDe The function concatenates text() when it reads either \l Characters or EntityReference tokens, but skips ProcessingInstruction and \l - Comment. In case anything else is read before reaching EndElement, - the function returns what it read so far and raises an - UnexpectedElementError. If the current token is not StartElement, an - empty string is returned. + Comment. If the current token is not StartElement, an empty string is + returned. + + The \a behaviour defines what happens in case anything else is + read before reaching EndElement. The function can include the text from + child elements (useful for example for HTML), ignore child elements, or + raise an UnexpectedElementError and return what was read so far. + + \since 4.6 */ -QString QXmlStreamReader::readElementText() +QString QXmlStreamReader::readElementText(ReadElementTextBehaviour behaviour) { Q_D(QXmlStreamReader); if (isStartElement()) { @@ -2091,16 +2112,37 @@ QString QXmlStreamReader::readElementText() case ProcessingInstruction: case Comment: break; + case StartElement: + if (behaviour == SkipChildElements) { + skipCurrentElement(); + break; + } else if (behaviour == IncludeChildElements) { + result += readElementText(behaviour); + break; + } + // Fall through (for ErrorOnUnexpectedElement) default: - if (!d->error) - d->raiseError(UnexpectedElementError, QXmlStream::tr("Expected character data.")); - return result; + if (d->error || behaviour == ErrorOnUnexpectedElement) { + if (!d->error) + d->raiseError(UnexpectedElementError, QXmlStream::tr("Expected character data.")); + return result; + } } } } return QString(); } +/*! + \overload readElementText() + + Calling this function is equivalent to calling readElementText(ErrorOnUnexpectedElement). + */ +QString QXmlStreamReader::readElementText() +{ + return readElementText(ErrorOnUnexpectedElement); +} + /*! Raises a custom error with an optional error \a message. \sa error(), errorString() diff --git a/src/corelib/xml/qxmlstream.h b/src/corelib/xml/qxmlstream.h index 21dcb40..71deb66 100644 --- a/src/corelib/xml/qxmlstream.h +++ b/src/corelib/xml/qxmlstream.h @@ -351,6 +351,13 @@ public: qint64 characterOffset() const; QXmlStreamAttributes attributes() const; + + enum ReadElementTextBehaviour { + ErrorOnUnexpectedElement, + IncludeChildElements, + SkipChildElements + }; + QString readElementText(ReadElementTextBehaviour behaviour); QString readElementText(); QStringRef name() const; diff --git a/tests/auto/qxmlstream/tst_qxmlstream.cpp b/tests/auto/qxmlstream/tst_qxmlstream.cpp index f496dcf..04f990f 100644 --- a/tests/auto/qxmlstream/tst_qxmlstream.cpp +++ b/tests/auto/qxmlstream/tst_qxmlstream.cpp @@ -55,6 +55,8 @@ //TESTED_CLASS=QXmlStreamReader QXmlStreamWriter //TESTED_FILES=corelib/xml/stream/qxmlutils.cpp corelib/xml/stream/qxmlstream.cpp corelib/xml/stream/qxmlstream_p.h +Q_DECLARE_METATYPE(QXmlStreamReader::ReadElementTextBehaviour) + static const char *const catalogFile = "XML-Test-Suite/xmlconf/finalCatalog.xml"; static const int expectedRunCount = 1646; static const int expectedSkipCount = 532; @@ -551,6 +553,8 @@ private slots: void readFromQBuffer() const; void readFromQBufferInvalid() const; void readNextStartElement() const; + void readElementText() const; + void readElementText_data() const; void crashInUTF16Codec() const; void hasAttributeSignature() const; void hasAttribute() const; @@ -1126,6 +1130,53 @@ void tst_QXmlStream::readNextStartElement() const QCOMPARE(amountOfB, 2); } +void tst_QXmlStream::readElementText() const +{ + QFETCH(QXmlStreamReader::ReadElementTextBehaviour, behaviour); + QFETCH(QString, input); + QFETCH(QString, expected); + + QXmlStreamReader reader(input); + + QVERIFY(reader.readNextStartElement()); + QCOMPARE(reader.readElementText(behaviour), expected); +} + +void tst_QXmlStream::readElementText_data() const +{ + QTest::addColumn("behaviour"); + QTest::addColumn("input"); + QTest::addColumn("expected"); + + QString validInput("

He was never going to admit his mistake.

"); + QString invalidInput("

invalid...

"); + QString invalidOutput("invalid..."); + + QTest::newRow("ErrorOnUnexpectedElement") + << QXmlStreamReader::ErrorOnUnexpectedElement + << validInput << QString("He was "); + + QTest::newRow("IncludeChildElements") + << QXmlStreamReader::IncludeChildElements + << validInput << QString("He was never going to admit his mistake."); + + QTest::newRow("SkipChildElements") + << QXmlStreamReader::SkipChildElements + << validInput << QString("He was going to admit his mistake."); + + QTest::newRow("ErrorOnUnexpectedElement Invalid") + << QXmlStreamReader::ErrorOnUnexpectedElement + << invalidInput << invalidOutput; + + QTest::newRow("IncludeChildElements Invalid") + << QXmlStreamReader::IncludeChildElements + << invalidInput << invalidOutput; + + QTest::newRow("SkipChildElements Invalid") + << QXmlStreamReader::SkipChildElements + << invalidInput << invalidOutput; +} + void tst_QXmlStream::crashInUTF16Codec() const { QEventLoop eventLoop; -- cgit v0.12 From 6e7675c8b7af9bd51796552fc4ce75612cbc41c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= Date: Tue, 18 Aug 2009 18:50:12 +0200 Subject: Made the browser demo use the new QXmlStreamReader functions Same as in the bookmarks example. --- demos/browser/xbel.cpp | 109 ++++++++++++++++--------------------------------- demos/browser/xbel.h | 1 - 2 files changed, 36 insertions(+), 74 deletions(-) diff --git a/demos/browser/xbel.cpp b/demos/browser/xbel.cpp index ed62868..66b49a4 100644 --- a/demos/browser/xbel.cpp +++ b/demos/browser/xbel.cpp @@ -133,16 +133,13 @@ BookmarkNode *XbelReader::read(QIODevice *device) { BookmarkNode *root = new BookmarkNode(BookmarkNode::Root); setDevice(device); - while (!atEnd()) { - readNext(); - if (isStartElement()) { - QString version = attributes().value(QLatin1String("version")).toString(); - if (name() == QLatin1String("xbel") - && (version.isEmpty() || version == QLatin1String("1.0"))) { - readXBEL(root); - } else { - raiseError(QObject::tr("The file is not an XBEL version 1.0 file.")); - } + if (readNextStartElement()) { + QString version = attributes().value(QLatin1String("version")).toString(); + if (name() == QLatin1String("xbel") + && (version.isEmpty() || version == QLatin1String("1.0"))) { + readXBEL(root); + } else { + raiseError(QObject::tr("The file is not an XBEL version 1.0 file.")); } } return root; @@ -152,21 +149,15 @@ void XbelReader::readXBEL(BookmarkNode *parent) { Q_ASSERT(isStartElement() && name() == QLatin1String("xbel")); - while (!atEnd()) { - readNext(); - if (isEndElement()) - break; - - if (isStartElement()) { - if (name() == QLatin1String("folder")) - readFolder(parent); - else if (name() == QLatin1String("bookmark")) - readBookmarkNode(parent); - else if (name() == QLatin1String("separator")) - readSeparator(parent); - else - skipUnknownElement(); - } + while (readNextStartElement()) { + if (name() == QLatin1String("folder")) + readFolder(parent); + else if (name() == QLatin1String("bookmark")) + readBookmarkNode(parent); + else if (name() == QLatin1String("separator")) + readSeparator(parent); + else + skipCurrentElement(); } } @@ -177,26 +168,19 @@ void XbelReader::readFolder(BookmarkNode *parent) BookmarkNode *folder = new BookmarkNode(BookmarkNode::Folder, parent); folder->expanded = (attributes().value(QLatin1String("folded")) == QLatin1String("no")); - while (!atEnd()) { - readNext(); - - if (isEndElement()) - break; - - if (isStartElement()) { - if (name() == QLatin1String("title")) - readTitle(folder); - else if (name() == QLatin1String("desc")) - readDescription(folder); - else if (name() == QLatin1String("folder")) - readFolder(folder); - else if (name() == QLatin1String("bookmark")) - readBookmarkNode(folder); - else if (name() == QLatin1String("separator")) - readSeparator(folder); - else - skipUnknownElement(); - } + while (readNextStartElement()) { + if (name() == QLatin1String("title")) + readTitle(folder); + else if (name() == QLatin1String("desc")) + readDescription(folder); + else if (name() == QLatin1String("folder")) + readFolder(folder); + else if (name() == QLatin1String("bookmark")) + readBookmarkNode(folder); + else if (name() == QLatin1String("separator")) + readSeparator(folder); + else + skipCurrentElement(); } } @@ -224,39 +208,18 @@ void XbelReader::readBookmarkNode(BookmarkNode *parent) Q_ASSERT(isStartElement() && name() == QLatin1String("bookmark")); BookmarkNode *bookmark = new BookmarkNode(BookmarkNode::Bookmark, parent); bookmark->url = attributes().value(QLatin1String("href")).toString(); - while (!atEnd()) { - readNext(); - if (isEndElement()) - break; - - if (isStartElement()) { - if (name() == QLatin1String("title")) - readTitle(bookmark); - else if (name() == QLatin1String("desc")) - readDescription(bookmark); - else - skipUnknownElement(); - } + while (readNextStartElement()) { + if (name() == QLatin1String("title")) + readTitle(bookmark); + else if (name() == QLatin1String("desc")) + readDescription(bookmark); + else + skipCurrentElement(); } if (bookmark->title.isEmpty()) bookmark->title = QObject::tr("Unknown title"); } -void XbelReader::skipUnknownElement() -{ - Q_ASSERT(isStartElement()); - - while (!atEnd()) { - readNext(); - - if (isEndElement()) - break; - - if (isStartElement()) - skipUnknownElement(); - } -} - XbelWriter::XbelWriter() { diff --git a/demos/browser/xbel.h b/demos/browser/xbel.h index 2bdffe1..ec9008e 100644 --- a/demos/browser/xbel.h +++ b/demos/browser/xbel.h @@ -87,7 +87,6 @@ public: BookmarkNode *read(QIODevice *device); private: - void skipUnknownElement(); void readXBEL(BookmarkNode *parent); void readTitle(BookmarkNode *parent); void readDescription(BookmarkNode *parent); -- cgit v0.12 From 4a71fa599b0dfb71cc04fd45afeb95e780a7d2fb Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Tue, 18 Aug 2009 10:07:08 -0700 Subject: Fix bugs in DFBPE fillRect and drawTiledPixmap Make sure to call CLIPPED_PAINT so painting with a region clip works. Reviewed-by: Donald --- src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp index 131ff4b..741c4e4 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp @@ -586,7 +586,7 @@ void QDirectFBPaintEngine::drawTiledPixmap(const QRectF &r, QRasterPaintEngine::drawTiledPixmap(r, pix, offset); } else { d->unlock(); - d->drawTiledPixmap(r, pixmap, offset); + CLIPPED_PAINT(d->drawTiledPixmap(r, pixmap, offset)); } } @@ -729,8 +729,7 @@ void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QColor &color) d->unlock(); d->setDFBColor(color); const QRect r = state()->matrix.mapRect(rect).toRect(); - d->surface->FillRectangle(d->surface, r.x(), r.y(), - r.width(), r.height()); + CLIPPED_PAINT(d->surface->FillRectangle(d->surface, r.x(), r.y(), r.width(), r.height())); } } -- cgit v0.12 From 83cbb77ac9ef7f95e11dbd29b36d5d9660e778ea Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Wed, 5 Aug 2009 05:02:00 -0700 Subject: Simplify DirectFB clipping Instead of storing whether or not our clip is dirty and updating it in every paint operation we'll just update it whenever it changes. This is more intuitive and should be faster for the common case as well. Also make sure to implement clip(region). Prevent multiple updateClip() calls for a single clip operation by introducing a flag to check whether we recursed into the different clip() calls. Reviewed-by: Donald --- .../gfxdrivers/directfb/qdirectfbpaintengine.cpp | 60 +++++++++++++--------- .../gfxdrivers/directfb/qdirectfbpaintengine.h | 1 + 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp index 741c4e4..ba715c3 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.cpp @@ -119,13 +119,14 @@ private: IDirectFB *fb; quint8 opacity; - bool dirtyClip; ClipType clipType; QDirectFBPaintDevice *dfbDevice; uint compositionModeStatus; - QDirectFBPaintEngine *q; + bool inClip; QRect currentClip; + + QDirectFBPaintEngine *q; friend class QDirectFBPaintEngine; }; @@ -236,7 +237,7 @@ static inline void drawRects(const T *rects, int n, const QTransform &transform, d->surface->SetClip(d->surface, &clipRegion); \ operation; \ } \ - d->dirtyClip = true; \ + d->updateClip(); \ break; } \ case QDirectFBPaintEnginePrivate::ComplexClip: \ case QDirectFBPaintEnginePrivate::ClipUnset: \ @@ -297,8 +298,8 @@ bool QDirectFBPaintEngine::end() void QDirectFBPaintEngine::clipEnabledChanged() { Q_D(QDirectFBPaintEngine); - d->dirtyClip = true; QRasterPaintEngine::clipEnabledChanged(); + d->updateClip(); } void QDirectFBPaintEngine::penChanged() @@ -341,26 +342,49 @@ void QDirectFBPaintEngine::setState(QPainterState *state) { Q_D(QDirectFBPaintEngine); QRasterPaintEngine::setState(state); - d->dirtyClip = true; d->setPen(state->pen); d->opacity = quint8(state->opacity * 255); d->setCompositionMode(state->compositionMode()); d->setTransform(state->transform()); d->setRenderHints(state->renderHints); + if (d->surface) + d->updateClip(); } void QDirectFBPaintEngine::clip(const QVectorPath &path, Qt::ClipOperation op) { Q_D(QDirectFBPaintEngine); - d->dirtyClip = true; + const bool wasInClip = d->inClip; + d->inClip = true; QRasterPaintEngine::clip(path, op); + if (!wasInClip) { + d->inClip = false; + d->updateClip(); + } +} + +void QDirectFBPaintEngine::clip(const QRegion ®ion, Qt::ClipOperation op) +{ + Q_D(QDirectFBPaintEngine); + const bool wasInClip = d->inClip; + d->inClip = true; + QRasterPaintEngine::clip(region, op); + if (!wasInClip) { + d->inClip = false; + d->updateClip(); + } } void QDirectFBPaintEngine::clip(const QRect &rect, Qt::ClipOperation op) { Q_D(QDirectFBPaintEngine); - d->dirtyClip = true; + const bool wasInClip = d->inClip; + d->inClip = true; QRasterPaintEngine::clip(rect, op); + if (!wasInClip) { + d->inClip = false; + d->updateClip(); + } } void QDirectFBPaintEngine::drawRects(const QRect *rects, int rectCount) @@ -371,7 +395,6 @@ void QDirectFBPaintEngine::drawRects(const QRect *rects, int rectCount) if (brush == Qt::NoBrush && pen == Qt::NoPen) return; - d->updateClip(); if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedPrimitives) || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported) || !d->simplePen @@ -401,7 +424,6 @@ void QDirectFBPaintEngine::drawRects(const QRectF *rects, int rectCount) if (brush == Qt::NoBrush && pen == Qt::NoPen) return; - d->updateClip(); if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedPrimitives) || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported) || !d->simplePen @@ -426,7 +448,6 @@ void QDirectFBPaintEngine::drawRects(const QRectF *rects, int rectCount) void QDirectFBPaintEngine::drawLines(const QLine *lines, int lineCount) { Q_D(QDirectFBPaintEngine); - d->updateClip(); if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedPrimitives) || !d->simplePen @@ -448,7 +469,6 @@ void QDirectFBPaintEngine::drawLines(const QLine *lines, int lineCount) void QDirectFBPaintEngine::drawLines(const QLineF *lines, int lineCount) { Q_D(QDirectFBPaintEngine); - d->updateClip(); if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedPrimitives) || !d->simplePen @@ -491,7 +511,6 @@ void QDirectFBPaintEngine::drawImage(const QRectF &r, const QImage &image, than the max image cache size we fall back to raster engine. */ - d->updateClip(); #if !defined QT_NO_DIRECTFB_PREALLOCATED || defined QT_DIRECTFB_IMAGECACHE if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedBlits) || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_BlitsUnsupported) @@ -534,7 +553,6 @@ void QDirectFBPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pixmap, { Q_D(QDirectFBPaintEngine); - d->updateClip(); if (pixmap.pixmapData()->classId() != QPixmapData::DirectFBClass) { RASTERFALLBACK(DRAW_PIXMAP, r, pixmap.size(), sr); d->lock(); @@ -569,7 +587,6 @@ void QDirectFBPaintEngine::drawTiledPixmap(const QRectF &r, const QPointF &offset) { Q_D(QDirectFBPaintEngine); - d->updateClip(); if (pixmap.pixmapData()->classId() != QPixmapData::DirectFBClass) { RASTERFALLBACK(DRAW_TILED_PIXMAP, r, pixmap.size(), offset); d->lock(); @@ -674,7 +691,6 @@ void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QBrush &brush) Q_D(QDirectFBPaintEngine); if (brush.style() == Qt::NoBrush) return; - d->updateClip(); if (d->clipType != QDirectFBPaintEnginePrivate::ComplexClip) { switch (brush.style()) { case Qt::SolidPattern: { @@ -718,7 +734,6 @@ void QDirectFBPaintEngine::fillRect(const QRectF &rect, const QColor &color) if (!color.isValid()) return; Q_D(QDirectFBPaintEngine); - d->updateClip(); if (!(d->compositionModeStatus & QDirectFBPaintEnginePrivate::PorterDuff_SupportedPrimitives) || (d->transformationType & QDirectFBPaintEnginePrivate::Matrix_RectsUnsupported) || d->clipType == QDirectFBPaintEnginePrivate::ComplexClip) { @@ -764,9 +779,9 @@ void QDirectFBPaintEngine::initImageCache(int size) QDirectFBPaintEnginePrivate::QDirectFBPaintEnginePrivate(QDirectFBPaintEngine *p) : surface(0), antialiased(false), simplePen(false), - transformationType(0), opacity(255), dirtyClip(true), + transformationType(0), opacity(255), clipType(ClipUnset), dfbDevice(0), - compositionModeStatus(0), q(p) + compositionModeStatus(0), inClip(false), q(p) { fb = QDirectFBScreen::instance()->dfb(); surfaceCache = new SurfaceCache; @@ -977,7 +992,6 @@ static inline qreal fixCoord(qreal rect_pos, qreal pixmapSize, qreal offset) void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPixmap &pixmap, const QPointF &off) { - Q_ASSERT(!dirtyClip); Q_ASSERT(!(transformationType & Matrix_BlitsUnsupported)); const QTransform &transform = q->state()->matrix; const QRect destinationRect = transform.mapRect(dest).toRect().normalized(); @@ -1070,9 +1084,7 @@ void QDirectFBPaintEnginePrivate::drawTiledPixmap(const QRectF &dest, const QPix void QDirectFBPaintEnginePrivate::updateClip() { - if (!dirtyClip) - return; - + Q_ASSERT(surface); currentClip = QRect(); const QClipData *clipData = clip(); if (!clipData || !clipData->enabled) { @@ -1094,14 +1106,12 @@ void QDirectFBPaintEnginePrivate::updateClip() } else { clipType = ComplexClip; } - - dirtyClip = false; } void QDirectFBPaintEnginePrivate::systemStateChanged() { - dirtyClip = true; QRasterPaintEnginePrivate::systemStateChanged(); + updateClip(); } IDirectFBSurface *SurfaceCache::getSurface(const uint *buf, int size) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h index b939b68..80108b2 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintengine.h @@ -101,6 +101,7 @@ public: virtual void setState(QPainterState *state); virtual void clip(const QVectorPath &path, Qt::ClipOperation op); + virtual void clip(const QRegion ®ion, Qt::ClipOperation op); virtual void clip(const QRect &rect, Qt::ClipOperation op); static void initImageCache(int size); -- cgit v0.12 From 8d314cd4eb39015a196bc4a4edfe44592d74f3c0 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 18:05:26 +0200 Subject: Autotest: unbreak test after overeager trolltech.com -> qt.nokia.com replacement --- tests/auto/qurl/tst_qurl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/qurl/tst_qurl.cpp b/tests/auto/qurl/tst_qurl.cpp index 5d909d8..fea48ea 100644 --- a/tests/auto/qurl/tst_qurl.cpp +++ b/tests/auto/qurl/tst_qurl.cpp @@ -2047,7 +2047,7 @@ void tst_QUrl::compat_decode_data() QTest::newRow("NormalStringEncoded") << QByteArray("file%20name") << QString("file name"); QTest::newRow("JustEncoded") << QByteArray("%20") << QString(" "); QTest::newRow("HTTPUrl") << QByteArray("http://qt.nokia.com") << QString("http://qt.nokia.com"); - QTest::newRow("HTTPUrlEncoded") << QByteArray("http://www%20trolltech%20com") << QString("http://qt.nokia.com"); + QTest::newRow("HTTPUrlEncoded") << QByteArray("http://qt%20nokia%20com") << QString("http://qt nokia com"); QTest::newRow("EmptyString") << QByteArray("") << QString(""); QTest::newRow("Task27166") << QByteArray("Fran%C3%A7aise") << QString("Française"); } @@ -2069,7 +2069,7 @@ void tst_QUrl::compat_encode_data() QTest::newRow("NormalStringEncoded") << QString("file name") << QByteArray("file%20name"); QTest::newRow("JustEncoded") << QString(" ") << QByteArray("%20"); QTest::newRow("HTTPUrl") << QString("http://qt.nokia.com") << QByteArray("http%3A//qt.nokia.com"); - QTest::newRow("HTTPUrlEncoded") << QString("http://qt.nokia.com") << QByteArray("http%3A//www%20trolltech%20com"); + QTest::newRow("HTTPUrlEncoded") << QString("http://qt nokia com") << QByteArray("http%3A//qt%20nokia%20com"); QTest::newRow("EmptyString") << QString("") << QByteArray(""); QTest::newRow("Task27166") << QString::fromLatin1("Française") << QByteArray("Fran%C3%A7aise"); } -- cgit v0.12 From b4fc4e93391438cffa05631f6d9065bfab519e0a Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 18:56:32 +0200 Subject: Doc: explain that QUrl::toAce may fail if its input is not correct. --- src/corelib/io/qurl.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index acbac36..4aae53d 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -5699,6 +5699,10 @@ QString QUrl::fromAce(const QByteArray &domain) Applications (IDNA) specification, which allows for domain names (like \c "example.com") to be written using international characters. + + This function return an empty QByteArra if \a domain is not a valid + hostname. Note, in particular, that IPv6 literals are not valid domain + names. */ QByteArray QUrl::toAce(const QString &domain) { -- cgit v0.12 From d313b5c43f83d69d9a9009dfa0bb29afa9276768 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 19:05:10 +0200 Subject: Autotest: update uic baselines after license header update. The license header update in e12a03d5 changed the .ui templates, but not the baselines in all cases. --- .../uic/baseline/Dialog_with_Buttons_Bottom.ui.h | 4 +- .../uic/baseline/Dialog_with_Buttons_Right.ui.h | 4 +- .../auto/uic/baseline/Dialog_without_Buttons.ui.h | 4 +- tests/auto/uic/baseline/Main_Window.ui.h | 4 +- tests/auto/uic/baseline/Widget.ui.h | 4 +- tests/auto/uic/baseline/addlinkdialog.ui.h | 4 +- tests/auto/uic/baseline/addtorrentform.ui.h | 4 +- tests/auto/uic/baseline/authenticationdialog.ui.h | 4 +- tests/auto/uic/baseline/backside.ui.h | 4 +- tests/auto/uic/baseline/batchtranslation.ui.h | 10 ++-- tests/auto/uic/baseline/bookmarkdialog.ui.h | 4 +- tests/auto/uic/baseline/bookwindow.ui.h | 4 +- tests/auto/uic/baseline/browserwidget.ui.h | 4 +- tests/auto/uic/baseline/calculator.ui.h | 4 +- tests/auto/uic/baseline/calculatorform.ui.h | 4 +- tests/auto/uic/baseline/certificateinfo.ui.h | 4 +- tests/auto/uic/baseline/chatdialog.ui.h | 4 +- tests/auto/uic/baseline/chatmainwindow.ui.h | 4 +- tests/auto/uic/baseline/chatsetnickname.ui.h | 4 +- tests/auto/uic/baseline/config.ui.h | 10 ++-- tests/auto/uic/baseline/connectdialog.ui.h | 4 +- tests/auto/uic/baseline/controller.ui.h | 4 +- tests/auto/uic/baseline/cookies.ui.h | 4 +- tests/auto/uic/baseline/cookiesexceptions.ui.h | 4 +- tests/auto/uic/baseline/default.ui.h | 4 +- tests/auto/uic/baseline/dialog.ui.h | 4 +- tests/auto/uic/baseline/downloaditem.ui.h | 4 +- tests/auto/uic/baseline/downloads.ui.h | 4 +- tests/auto/uic/baseline/embeddeddialog.ui.h | 4 +- tests/auto/uic/baseline/filespage.ui.h | 4 +- tests/auto/uic/baseline/filternamedialog.ui.h | 4 +- tests/auto/uic/baseline/filterpage.ui.h | 4 +- tests/auto/uic/baseline/finddialog.ui.h | 10 ++-- tests/auto/uic/baseline/form.ui.h | 4 +- tests/auto/uic/baseline/formwindowsettings.ui.h | 10 ++-- tests/auto/uic/baseline/generalpage.ui.h | 4 +- tests/auto/uic/baseline/gridpanel.ui.h | 4 +- tests/auto/uic/baseline/helpdialog.ui.h | 10 ++-- tests/auto/uic/baseline/history.ui.h | 4 +- tests/auto/uic/baseline/identifierpage.ui.h | 4 +- tests/auto/uic/baseline/imagedialog.ui.h | 4 +- tests/auto/uic/baseline/inputpage.ui.h | 4 +- tests/auto/uic/baseline/installdialog.ui.h | 4 +- tests/auto/uic/baseline/languagesdialog.ui.h | 4 +- tests/auto/uic/baseline/listwidgeteditor.ui.h | 10 ++-- tests/auto/uic/baseline/mainwindow.ui.h | 4 +- tests/auto/uic/baseline/mainwindowbase.ui.h | 10 ++-- tests/auto/uic/baseline/mydialog.ui.h | 4 +- tests/auto/uic/baseline/myform.ui.h | 4 +- tests/auto/uic/baseline/newactiondialog.ui.h | 10 ++-- .../uic/baseline/newdynamicpropertydialog.ui.h | 4 +- tests/auto/uic/baseline/newform.ui.h | 10 ++-- tests/auto/uic/baseline/orderdialog.ui.h | 10 ++-- tests/auto/uic/baseline/outputpage.ui.h | 4 +- tests/auto/uic/baseline/pagefold.ui.h | 4 +- tests/auto/uic/baseline/paletteeditor.ui.h | 10 ++-- .../uic/baseline/paletteeditoradvancedbase.ui.h | 10 ++-- tests/auto/uic/baseline/passworddialog.ui.h | 4 +- tests/auto/uic/baseline/pathpage.ui.h | 4 +- tests/auto/uic/baseline/phrasebookbox.ui.h | 10 ++-- tests/auto/uic/baseline/plugindialog.ui.h | 10 ++-- tests/auto/uic/baseline/preferencesdialog.ui.h | 4 +- .../uic/baseline/previewconfigurationwidget.ui.h | 4 +- tests/auto/uic/baseline/previewdialogbase.ui.h | 4 +- tests/auto/uic/baseline/previewwidget.ui.h | 10 ++-- tests/auto/uic/baseline/previewwidgetbase.ui.h | 10 ++-- tests/auto/uic/baseline/proxy.ui.h | 4 +- tests/auto/uic/baseline/qfiledialog.ui.h | 12 ++-- tests/auto/uic/baseline/qpagesetupwidget.ui.h | 4 +- .../auto/uic/baseline/qprintpropertieswidget.ui.h | 4 +- tests/auto/uic/baseline/qprintsettingsoutput.ui.h | 4 +- tests/auto/uic/baseline/qprintwidget.ui.h | 4 +- tests/auto/uic/baseline/qsqlconnectiondialog.ui.h | 4 +- tests/auto/uic/baseline/qtgradientdialog.ui.h | 10 ++-- tests/auto/uic/baseline/qtgradienteditor.ui.h | 69 +++++++++++----------- tests/auto/uic/baseline/qtgradientview.ui.h | 4 +- tests/auto/uic/baseline/qtgradientviewdialog.ui.h | 10 ++-- .../auto/uic/baseline/qtresourceeditordialog.ui.h | 4 +- tests/auto/uic/baseline/qttoolbardialog.ui.h | 4 +- tests/auto/uic/baseline/querywidget.ui.h | 4 +- tests/auto/uic/baseline/remotecontrol.ui.h | 4 +- tests/auto/uic/baseline/saveformastemplate.ui.h | 10 ++-- tests/auto/uic/baseline/settings.ui.h | 4 +- tests/auto/uic/baseline/signalslotdialog.ui.h | 4 +- tests/auto/uic/baseline/sslclient.ui.h | 4 +- tests/auto/uic/baseline/sslerrors.ui.h | 4 +- tests/auto/uic/baseline/statistics.ui.h | 10 ++-- tests/auto/uic/baseline/stringlisteditor.ui.h | 10 ++-- tests/auto/uic/baseline/stylesheeteditor.ui.h | 4 +- tests/auto/uic/baseline/tabbedbrowser.ui.h | 10 ++-- tests/auto/uic/baseline/tablewidgeteditor.ui.h | 10 ++-- tests/auto/uic/baseline/tetrixwindow.ui.h | 4 +- tests/auto/uic/baseline/textfinder.ui.h | 4 +- tests/auto/uic/baseline/topicchooser.ui.h | 4 +- tests/auto/uic/baseline/translatedialog.ui.h | 10 ++-- tests/auto/uic/baseline/translationsettings.ui.h | 4 +- tests/auto/uic/baseline/treewidgeteditor.ui.h | 10 ++-- tests/auto/uic/baseline/trpreviewtool.ui.h | 10 ++-- tests/auto/uic/baseline/validators.ui.h | 4 +- tests/auto/uic/baseline/wateringconfigdialog.ui.h | 4 +- 100 files changed, 342 insertions(+), 287 deletions(-) diff --git a/tests/auto/uic/baseline/Dialog_with_Buttons_Bottom.ui.h b/tests/auto/uic/baseline/Dialog_with_Buttons_Bottom.ui.h index 166dc60..efbeb97 100644 --- a/tests/auto/uic/baseline/Dialog_with_Buttons_Bottom.ui.h +++ b/tests/auto/uic/baseline/Dialog_with_Buttons_Bottom.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'Dialog_with_Buttons_Bottom.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/Dialog_with_Buttons_Right.ui.h b/tests/auto/uic/baseline/Dialog_with_Buttons_Right.ui.h index cbb3cc4..0f23ee3 100644 --- a/tests/auto/uic/baseline/Dialog_with_Buttons_Right.ui.h +++ b/tests/auto/uic/baseline/Dialog_with_Buttons_Right.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'Dialog_with_Buttons_Right.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/Dialog_without_Buttons.ui.h b/tests/auto/uic/baseline/Dialog_without_Buttons.ui.h index bb06a54..ff88063 100644 --- a/tests/auto/uic/baseline/Dialog_without_Buttons.ui.h +++ b/tests/auto/uic/baseline/Dialog_without_Buttons.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'Dialog_without_Buttons.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/Main_Window.ui.h b/tests/auto/uic/baseline/Main_Window.ui.h index 07a8389..4fbc750 100644 --- a/tests/auto/uic/baseline/Main_Window.ui.h +++ b/tests/auto/uic/baseline/Main_Window.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'Main_Window.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/Widget.ui.h b/tests/auto/uic/baseline/Widget.ui.h index bba9fd9..e49646e 100644 --- a/tests/auto/uic/baseline/Widget.ui.h +++ b/tests/auto/uic/baseline/Widget.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'Widget.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/addlinkdialog.ui.h b/tests/auto/uic/baseline/addlinkdialog.ui.h index 920a8f7..1b174ad 100644 --- a/tests/auto/uic/baseline/addlinkdialog.ui.h +++ b/tests/auto/uic/baseline/addlinkdialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'addlinkdialog.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/addtorrentform.ui.h b/tests/auto/uic/baseline/addtorrentform.ui.h index 185ce2e..a454da9 100644 --- a/tests/auto/uic/baseline/addtorrentform.ui.h +++ b/tests/auto/uic/baseline/addtorrentform.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'addtorrentform.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/authenticationdialog.ui.h b/tests/auto/uic/baseline/authenticationdialog.ui.h index b46c05d..dd27f5c 100644 --- a/tests/auto/uic/baseline/authenticationdialog.ui.h +++ b/tests/auto/uic/baseline/authenticationdialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'authenticationdialog.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/backside.ui.h b/tests/auto/uic/baseline/backside.ui.h index 6fdab4b..1660846 100644 --- a/tests/auto/uic/baseline/backside.ui.h +++ b/tests/auto/uic/baseline/backside.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'backside.ui' ** -** Created: Tue Jun 17 09:18:47 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/batchtranslation.ui.h b/tests/auto/uic/baseline/batchtranslation.ui.h index d781c34..2285e1b 100644 --- a/tests/auto/uic/baseline/batchtranslation.ui.h +++ b/tests/auto/uic/baseline/batchtranslation.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'batchtranslation.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/bookmarkdialog.ui.h b/tests/auto/uic/baseline/bookmarkdialog.ui.h index 1db7dca..0c7764f 100644 --- a/tests/auto/uic/baseline/bookmarkdialog.ui.h +++ b/tests/auto/uic/baseline/bookmarkdialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'bookmarkdialog.ui' ** -** Created: Mon Jun 16 18:01:55 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/bookwindow.ui.h b/tests/auto/uic/baseline/bookwindow.ui.h index 776f9e9..92639ec 100644 --- a/tests/auto/uic/baseline/bookwindow.ui.h +++ b/tests/auto/uic/baseline/bookwindow.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'bookwindow.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/browserwidget.ui.h b/tests/auto/uic/baseline/browserwidget.ui.h index c1ca60f..1a3a282 100644 --- a/tests/auto/uic/baseline/browserwidget.ui.h +++ b/tests/auto/uic/baseline/browserwidget.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'browserwidget.ui' ** -** Created: Mon Jun 16 18:01:09 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/calculator.ui.h b/tests/auto/uic/baseline/calculator.ui.h index f476d9b..ace5f44 100644 --- a/tests/auto/uic/baseline/calculator.ui.h +++ b/tests/auto/uic/baseline/calculator.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'calculator.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/calculatorform.ui.h b/tests/auto/uic/baseline/calculatorform.ui.h index 1c575e8..2a369c7 100644 --- a/tests/auto/uic/baseline/calculatorform.ui.h +++ b/tests/auto/uic/baseline/calculatorform.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'calculatorform.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/certificateinfo.ui.h b/tests/auto/uic/baseline/certificateinfo.ui.h index 548bec5..6d13787 100644 --- a/tests/auto/uic/baseline/certificateinfo.ui.h +++ b/tests/auto/uic/baseline/certificateinfo.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'certificateinfo.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/chatdialog.ui.h b/tests/auto/uic/baseline/chatdialog.ui.h index c9f2693..ba1b99f 100644 --- a/tests/auto/uic/baseline/chatdialog.ui.h +++ b/tests/auto/uic/baseline/chatdialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'chatdialog.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/chatmainwindow.ui.h b/tests/auto/uic/baseline/chatmainwindow.ui.h index 87ac882..d4d4996 100644 --- a/tests/auto/uic/baseline/chatmainwindow.ui.h +++ b/tests/auto/uic/baseline/chatmainwindow.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'chatmainwindow.ui' ** -** Created: Mon Sep 1 09:31:02 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/chatsetnickname.ui.h b/tests/auto/uic/baseline/chatsetnickname.ui.h index 54f48e7..4b081b6 100644 --- a/tests/auto/uic/baseline/chatsetnickname.ui.h +++ b/tests/auto/uic/baseline/chatsetnickname.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'chatsetnickname.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/config.ui.h b/tests/auto/uic/baseline/config.ui.h index a14d7c8..f708f6b 100644 --- a/tests/auto/uic/baseline/config.ui.h +++ b/tests/auto/uic/baseline/config.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'config.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/connectdialog.ui.h b/tests/auto/uic/baseline/connectdialog.ui.h index d7e0eaf..880653e 100644 --- a/tests/auto/uic/baseline/connectdialog.ui.h +++ b/tests/auto/uic/baseline/connectdialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'connectdialog.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/controller.ui.h b/tests/auto/uic/baseline/controller.ui.h index c5cd1fe..609c32c 100644 --- a/tests/auto/uic/baseline/controller.ui.h +++ b/tests/auto/uic/baseline/controller.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'controller.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/cookies.ui.h b/tests/auto/uic/baseline/cookies.ui.h index 0b4d88a..5e0bf88 100644 --- a/tests/auto/uic/baseline/cookies.ui.h +++ b/tests/auto/uic/baseline/cookies.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'cookies.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/cookiesexceptions.ui.h b/tests/auto/uic/baseline/cookiesexceptions.ui.h index 12e80d8..9eaf01c 100644 --- a/tests/auto/uic/baseline/cookiesexceptions.ui.h +++ b/tests/auto/uic/baseline/cookiesexceptions.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'cookiesexceptions.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/default.ui.h b/tests/auto/uic/baseline/default.ui.h index f68a93e..093e7b4 100644 --- a/tests/auto/uic/baseline/default.ui.h +++ b/tests/auto/uic/baseline/default.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'default.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/dialog.ui.h b/tests/auto/uic/baseline/dialog.ui.h index d65c10a..95fa40b 100644 --- a/tests/auto/uic/baseline/dialog.ui.h +++ b/tests/auto/uic/baseline/dialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'dialog.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/downloaditem.ui.h b/tests/auto/uic/baseline/downloaditem.ui.h index 341fdd2..c211fa0 100644 --- a/tests/auto/uic/baseline/downloaditem.ui.h +++ b/tests/auto/uic/baseline/downloaditem.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'downloaditem.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/downloads.ui.h b/tests/auto/uic/baseline/downloads.ui.h index 70a038a..f5028c8 100644 --- a/tests/auto/uic/baseline/downloads.ui.h +++ b/tests/auto/uic/baseline/downloads.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'downloads.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/embeddeddialog.ui.h b/tests/auto/uic/baseline/embeddeddialog.ui.h index 3dd36a6..050f0ab 100644 --- a/tests/auto/uic/baseline/embeddeddialog.ui.h +++ b/tests/auto/uic/baseline/embeddeddialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'embeddeddialog.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/filespage.ui.h b/tests/auto/uic/baseline/filespage.ui.h index 15a0f5b..3b4c156 100644 --- a/tests/auto/uic/baseline/filespage.ui.h +++ b/tests/auto/uic/baseline/filespage.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'filespage.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/filternamedialog.ui.h b/tests/auto/uic/baseline/filternamedialog.ui.h index ad435c1..64713b4d 100644 --- a/tests/auto/uic/baseline/filternamedialog.ui.h +++ b/tests/auto/uic/baseline/filternamedialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'filternamedialog.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/filterpage.ui.h b/tests/auto/uic/baseline/filterpage.ui.h index e7fb7fb..57beb6b 100644 --- a/tests/auto/uic/baseline/filterpage.ui.h +++ b/tests/auto/uic/baseline/filterpage.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'filterpage.ui' ** -** Created: Mon Jun 16 17:58:59 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/finddialog.ui.h b/tests/auto/uic/baseline/finddialog.ui.h index 7cd2b69..809657a 100644 --- a/tests/auto/uic/baseline/finddialog.ui.h +++ b/tests/auto/uic/baseline/finddialog.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'finddialog.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/form.ui.h b/tests/auto/uic/baseline/form.ui.h index 60f5a14..4edbc42 100644 --- a/tests/auto/uic/baseline/form.ui.h +++ b/tests/auto/uic/baseline/form.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'form.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/formwindowsettings.ui.h b/tests/auto/uic/baseline/formwindowsettings.ui.h index 99bb61c..71e6c6d 100644 --- a/tests/auto/uic/baseline/formwindowsettings.ui.h +++ b/tests/auto/uic/baseline/formwindowsettings.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'formwindowsettings.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/generalpage.ui.h b/tests/auto/uic/baseline/generalpage.ui.h index 0dcc6ec..ed72265 100644 --- a/tests/auto/uic/baseline/generalpage.ui.h +++ b/tests/auto/uic/baseline/generalpage.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'generalpage.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/gridpanel.ui.h b/tests/auto/uic/baseline/gridpanel.ui.h index 1bc2f04..b722753 100644 --- a/tests/auto/uic/baseline/gridpanel.ui.h +++ b/tests/auto/uic/baseline/gridpanel.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'gridpanel.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/helpdialog.ui.h b/tests/auto/uic/baseline/helpdialog.ui.h index 269f5b8..b64e251 100644 --- a/tests/auto/uic/baseline/helpdialog.ui.h +++ b/tests/auto/uic/baseline/helpdialog.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'helpdialog.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/history.ui.h b/tests/auto/uic/baseline/history.ui.h index 16553df..f151e53 100644 --- a/tests/auto/uic/baseline/history.ui.h +++ b/tests/auto/uic/baseline/history.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'history.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/identifierpage.ui.h b/tests/auto/uic/baseline/identifierpage.ui.h index 24aecf8..e60c277 100644 --- a/tests/auto/uic/baseline/identifierpage.ui.h +++ b/tests/auto/uic/baseline/identifierpage.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'identifierpage.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/imagedialog.ui.h b/tests/auto/uic/baseline/imagedialog.ui.h index 2f51b65..a22a85e 100644 --- a/tests/auto/uic/baseline/imagedialog.ui.h +++ b/tests/auto/uic/baseline/imagedialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'imagedialog.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/inputpage.ui.h b/tests/auto/uic/baseline/inputpage.ui.h index 23f2a0b..938eacb 100644 --- a/tests/auto/uic/baseline/inputpage.ui.h +++ b/tests/auto/uic/baseline/inputpage.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'inputpage.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/installdialog.ui.h b/tests/auto/uic/baseline/installdialog.ui.h index e6180f7..1a7166d 100644 --- a/tests/auto/uic/baseline/installdialog.ui.h +++ b/tests/auto/uic/baseline/installdialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'installdialog.ui' ** -** Created: Thu Jul 10 09:47:34 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/languagesdialog.ui.h b/tests/auto/uic/baseline/languagesdialog.ui.h index ff837c1..ffdc9c0 100644 --- a/tests/auto/uic/baseline/languagesdialog.ui.h +++ b/tests/auto/uic/baseline/languagesdialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'languagesdialog.ui' ** -** Created: Fri May 15 16:58:03 2009 -** by: Qt User Interface Compiler version 4.5.2 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/listwidgeteditor.ui.h b/tests/auto/uic/baseline/listwidgeteditor.ui.h index ac9f801..e848252 100644 --- a/tests/auto/uic/baseline/listwidgeteditor.ui.h +++ b/tests/auto/uic/baseline/listwidgeteditor.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'listwidgeteditor.ui' ** -** Created: Mon Jun 16 17:54:30 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/mainwindow.ui.h b/tests/auto/uic/baseline/mainwindow.ui.h index 11b0196..6a84b18 100644 --- a/tests/auto/uic/baseline/mainwindow.ui.h +++ b/tests/auto/uic/baseline/mainwindow.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'mainwindow.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/mainwindowbase.ui.h b/tests/auto/uic/baseline/mainwindowbase.ui.h index 10b028f..ce03ae9 100644 --- a/tests/auto/uic/baseline/mainwindowbase.ui.h +++ b/tests/auto/uic/baseline/mainwindowbase.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'mainwindowbase.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/mydialog.ui.h b/tests/auto/uic/baseline/mydialog.ui.h index ac7b458..d3da712 100644 --- a/tests/auto/uic/baseline/mydialog.ui.h +++ b/tests/auto/uic/baseline/mydialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'mydialog.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/myform.ui.h b/tests/auto/uic/baseline/myform.ui.h index 74c83f5..45ed883 100644 --- a/tests/auto/uic/baseline/myform.ui.h +++ b/tests/auto/uic/baseline/myform.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'myform.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/newactiondialog.ui.h b/tests/auto/uic/baseline/newactiondialog.ui.h index 3fecddb..fc13fbc 100644 --- a/tests/auto/uic/baseline/newactiondialog.ui.h +++ b/tests/auto/uic/baseline/newactiondialog.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'newactiondialog.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/newdynamicpropertydialog.ui.h b/tests/auto/uic/baseline/newdynamicpropertydialog.ui.h index f8e5b51..4ee3d98 100644 --- a/tests/auto/uic/baseline/newdynamicpropertydialog.ui.h +++ b/tests/auto/uic/baseline/newdynamicpropertydialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'newdynamicpropertydialog.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/newform.ui.h b/tests/auto/uic/baseline/newform.ui.h index 13b5572..2af4836 100644 --- a/tests/auto/uic/baseline/newform.ui.h +++ b/tests/auto/uic/baseline/newform.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'newform.ui' ** -** Created: Mon Jun 16 17:56:52 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/orderdialog.ui.h b/tests/auto/uic/baseline/orderdialog.ui.h index 12d551f..6d6efa7 100644 --- a/tests/auto/uic/baseline/orderdialog.ui.h +++ b/tests/auto/uic/baseline/orderdialog.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'orderdialog.ui' ** -** Created: Mon Jun 16 17:55:54 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/outputpage.ui.h b/tests/auto/uic/baseline/outputpage.ui.h index 0b68cb9..9f071f0 100644 --- a/tests/auto/uic/baseline/outputpage.ui.h +++ b/tests/auto/uic/baseline/outputpage.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'outputpage.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/pagefold.ui.h b/tests/auto/uic/baseline/pagefold.ui.h index 5cc5836..d713985 100644 --- a/tests/auto/uic/baseline/pagefold.ui.h +++ b/tests/auto/uic/baseline/pagefold.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'pagefold.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/paletteeditor.ui.h b/tests/auto/uic/baseline/paletteeditor.ui.h index ad34964..3b62872 100644 --- a/tests/auto/uic/baseline/paletteeditor.ui.h +++ b/tests/auto/uic/baseline/paletteeditor.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'paletteeditor.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/paletteeditoradvancedbase.ui.h b/tests/auto/uic/baseline/paletteeditoradvancedbase.ui.h index 7072b6b..44d03be 100644 --- a/tests/auto/uic/baseline/paletteeditoradvancedbase.ui.h +++ b/tests/auto/uic/baseline/paletteeditoradvancedbase.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'paletteeditoradvancedbase.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/passworddialog.ui.h b/tests/auto/uic/baseline/passworddialog.ui.h index be80298..83beeac 100644 --- a/tests/auto/uic/baseline/passworddialog.ui.h +++ b/tests/auto/uic/baseline/passworddialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'passworddialog.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/pathpage.ui.h b/tests/auto/uic/baseline/pathpage.ui.h index 257c191..7c39073 100644 --- a/tests/auto/uic/baseline/pathpage.ui.h +++ b/tests/auto/uic/baseline/pathpage.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'pathpage.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/phrasebookbox.ui.h b/tests/auto/uic/baseline/phrasebookbox.ui.h index aa132b3..4826676 100644 --- a/tests/auto/uic/baseline/phrasebookbox.ui.h +++ b/tests/auto/uic/baseline/phrasebookbox.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'phrasebookbox.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/plugindialog.ui.h b/tests/auto/uic/baseline/plugindialog.ui.h index e4f58c1..4b99b6e 100644 --- a/tests/auto/uic/baseline/plugindialog.ui.h +++ b/tests/auto/uic/baseline/plugindialog.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'plugindialog.ui' ** -** Created: Mon Jun 16 17:52:32 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:31 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/preferencesdialog.ui.h b/tests/auto/uic/baseline/preferencesdialog.ui.h index a1f5ac2..56c5926 100644 --- a/tests/auto/uic/baseline/preferencesdialog.ui.h +++ b/tests/auto/uic/baseline/preferencesdialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'preferencesdialog.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/previewconfigurationwidget.ui.h b/tests/auto/uic/baseline/previewconfigurationwidget.ui.h index 4a7b694..cc56b4c 100644 --- a/tests/auto/uic/baseline/previewconfigurationwidget.ui.h +++ b/tests/auto/uic/baseline/previewconfigurationwidget.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'previewconfigurationwidget.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/previewdialogbase.ui.h b/tests/auto/uic/baseline/previewdialogbase.ui.h index 822990c..4bb2980 100644 --- a/tests/auto/uic/baseline/previewdialogbase.ui.h +++ b/tests/auto/uic/baseline/previewdialogbase.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'previewdialogbase.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/previewwidget.ui.h b/tests/auto/uic/baseline/previewwidget.ui.h index 4832430..8076958 100644 --- a/tests/auto/uic/baseline/previewwidget.ui.h +++ b/tests/auto/uic/baseline/previewwidget.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'previewwidget.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/previewwidgetbase.ui.h b/tests/auto/uic/baseline/previewwidgetbase.ui.h index 6a5551e..b8d55c8 100644 --- a/tests/auto/uic/baseline/previewwidgetbase.ui.h +++ b/tests/auto/uic/baseline/previewwidgetbase.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'previewwidgetbase.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/proxy.ui.h b/tests/auto/uic/baseline/proxy.ui.h index d22edef..3542966 100644 --- a/tests/auto/uic/baseline/proxy.ui.h +++ b/tests/auto/uic/baseline/proxy.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'proxy.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qfiledialog.ui.h b/tests/auto/uic/baseline/qfiledialog.ui.h index 396e0d0..356183e 100644 --- a/tests/auto/uic/baseline/qfiledialog.ui.h +++ b/tests/auto/uic/baseline/qfiledialog.ui.h @@ -1,9 +1,10 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the QtGui module of the Qt Toolkit. +** This file is part of the autotests of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'qfiledialog.ui' ** -** Created: Mon Jun 16 17:51:48 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qpagesetupwidget.ui.h b/tests/auto/uic/baseline/qpagesetupwidget.ui.h index 4694409..93f5eb4 100644 --- a/tests/auto/uic/baseline/qpagesetupwidget.ui.h +++ b/tests/auto/uic/baseline/qpagesetupwidget.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'qpagesetupwidget.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qprintpropertieswidget.ui.h b/tests/auto/uic/baseline/qprintpropertieswidget.ui.h index 626fee7..a2c2e1f 100644 --- a/tests/auto/uic/baseline/qprintpropertieswidget.ui.h +++ b/tests/auto/uic/baseline/qprintpropertieswidget.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'qprintpropertieswidget.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qprintsettingsoutput.ui.h b/tests/auto/uic/baseline/qprintsettingsoutput.ui.h index a6360ee..bb00a36 100644 --- a/tests/auto/uic/baseline/qprintsettingsoutput.ui.h +++ b/tests/auto/uic/baseline/qprintsettingsoutput.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'qprintsettingsoutput.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qprintwidget.ui.h b/tests/auto/uic/baseline/qprintwidget.ui.h index 99d6486..2600268 100644 --- a/tests/auto/uic/baseline/qprintwidget.ui.h +++ b/tests/auto/uic/baseline/qprintwidget.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'qprintwidget.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qsqlconnectiondialog.ui.h b/tests/auto/uic/baseline/qsqlconnectiondialog.ui.h index 165c7d7..37297bf 100644 --- a/tests/auto/uic/baseline/qsqlconnectiondialog.ui.h +++ b/tests/auto/uic/baseline/qsqlconnectiondialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'qsqlconnectiondialog.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qtgradientdialog.ui.h b/tests/auto/uic/baseline/qtgradientdialog.ui.h index 26ed776..43521e9 100644 --- a/tests/auto/uic/baseline/qtgradientdialog.ui.h +++ b/tests/auto/uic/baseline/qtgradientdialog.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'qtgradientdialog.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qtgradienteditor.ui.h b/tests/auto/uic/baseline/qtgradienteditor.ui.h index 00a72bd..e1365e4 100644 --- a/tests/auto/uic/baseline/qtgradienteditor.ui.h +++ b/tests/auto/uic/baseline/qtgradienteditor.ui.h @@ -1,49 +1,50 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the autotests of the Qt Toolkit. +** This file is part of the tools applications of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. +** This file may be used under the terms of the GNU General Public +** License versions 2.0 or 3.0 as published by the Free Software +** Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Alternatively you may (at +** your option) use any later version of the GNU General Public +** License if such license has been publicly approved by Nokia Corporation and/or its subsidiary(-ies) +** (or its successors, if any) and the KDE Free Qt Foundation. In +** addition, as a special exception, Trolltech gives you certain +** additional rights. These rights are described in the Trolltech GPL +** Exception version 1.2, which can be found at +** http://qt.nokia.com/products/qt/gplexception/ and in the file +** GPL_EXCEPTION.txt in this package. ** -** 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. +** Please review the following information to ensure GNU General +** Public Licensing requirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. If +** you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. ** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. +** In addition, as a special exception, Trolltech, as the sole +** copyright holder for Qt Designer, grants users of the Qt/Eclipse +** Integration plug-in the right for the Qt/Eclipse Integration to +** link to functionality provided by Qt Designer and its related +** libraries. ** -** 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. +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not expressly +** granted herein. ** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** $QT_END_LICENSE$ -** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'qtgradienteditor.ui' ** -** Created: Mon Jun 16 17:50:21 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qtgradientview.ui.h b/tests/auto/uic/baseline/qtgradientview.ui.h index 809cf5b..d929d6f 100644 --- a/tests/auto/uic/baseline/qtgradientview.ui.h +++ b/tests/auto/uic/baseline/qtgradientview.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'qtgradientview.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qtgradientviewdialog.ui.h b/tests/auto/uic/baseline/qtgradientviewdialog.ui.h index 1f34727..8ace8b7 100644 --- a/tests/auto/uic/baseline/qtgradientviewdialog.ui.h +++ b/tests/auto/uic/baseline/qtgradientviewdialog.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'qtgradientviewdialog.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qtresourceeditordialog.ui.h b/tests/auto/uic/baseline/qtresourceeditordialog.ui.h index a08a16c..de52a62 100644 --- a/tests/auto/uic/baseline/qtresourceeditordialog.ui.h +++ b/tests/auto/uic/baseline/qtresourceeditordialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'qtresourceeditordialog.ui' ** -** Created: Mon Jun 16 17:45:38 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/qttoolbardialog.ui.h b/tests/auto/uic/baseline/qttoolbardialog.ui.h index 9099553..5651abc 100644 --- a/tests/auto/uic/baseline/qttoolbardialog.ui.h +++ b/tests/auto/uic/baseline/qttoolbardialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'qttoolbardialog.ui' ** -** Created: Mon Jun 16 17:42:37 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/querywidget.ui.h b/tests/auto/uic/baseline/querywidget.ui.h index 8afcf54..e078ed4 100644 --- a/tests/auto/uic/baseline/querywidget.ui.h +++ b/tests/auto/uic/baseline/querywidget.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'querywidget.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/remotecontrol.ui.h b/tests/auto/uic/baseline/remotecontrol.ui.h index 3d183f7..eb7adc9 100644 --- a/tests/auto/uic/baseline/remotecontrol.ui.h +++ b/tests/auto/uic/baseline/remotecontrol.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'remotecontrol.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/saveformastemplate.ui.h b/tests/auto/uic/baseline/saveformastemplate.ui.h index c46b5e6..ef709df 100644 --- a/tests/auto/uic/baseline/saveformastemplate.ui.h +++ b/tests/auto/uic/baseline/saveformastemplate.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'saveformastemplate.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/settings.ui.h b/tests/auto/uic/baseline/settings.ui.h index 98cb6ee..7df5c77 100644 --- a/tests/auto/uic/baseline/settings.ui.h +++ b/tests/auto/uic/baseline/settings.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'settings.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/signalslotdialog.ui.h b/tests/auto/uic/baseline/signalslotdialog.ui.h index f3ce8bc..f7e9820 100644 --- a/tests/auto/uic/baseline/signalslotdialog.ui.h +++ b/tests/auto/uic/baseline/signalslotdialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'signalslotdialog.ui' ** -** Created: Mon Jun 16 16:18:52 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/sslclient.ui.h b/tests/auto/uic/baseline/sslclient.ui.h index aee0224..bf4014d 100644 --- a/tests/auto/uic/baseline/sslclient.ui.h +++ b/tests/auto/uic/baseline/sslclient.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'sslclient.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/sslerrors.ui.h b/tests/auto/uic/baseline/sslerrors.ui.h index f999be0..3131a21 100644 --- a/tests/auto/uic/baseline/sslerrors.ui.h +++ b/tests/auto/uic/baseline/sslerrors.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'sslerrors.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/statistics.ui.h b/tests/auto/uic/baseline/statistics.ui.h index 41c31fd..ea9ab00 100644 --- a/tests/auto/uic/baseline/statistics.ui.h +++ b/tests/auto/uic/baseline/statistics.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'statistics.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/stringlisteditor.ui.h b/tests/auto/uic/baseline/stringlisteditor.ui.h index 29f2e28..8f0ba8e 100644 --- a/tests/auto/uic/baseline/stringlisteditor.ui.h +++ b/tests/auto/uic/baseline/stringlisteditor.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'stringlisteditor.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/stylesheeteditor.ui.h b/tests/auto/uic/baseline/stylesheeteditor.ui.h index a99f274..697fbe0 100644 --- a/tests/auto/uic/baseline/stylesheeteditor.ui.h +++ b/tests/auto/uic/baseline/stylesheeteditor.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'stylesheeteditor.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/tabbedbrowser.ui.h b/tests/auto/uic/baseline/tabbedbrowser.ui.h index bebbc59..f347740 100644 --- a/tests/auto/uic/baseline/tabbedbrowser.ui.h +++ b/tests/auto/uic/baseline/tabbedbrowser.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'tabbedbrowser.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/tablewidgeteditor.ui.h b/tests/auto/uic/baseline/tablewidgeteditor.ui.h index 5cb0341..7e1a39f 100644 --- a/tests/auto/uic/baseline/tablewidgeteditor.ui.h +++ b/tests/auto/uic/baseline/tablewidgeteditor.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'tablewidgeteditor.ui' ** -** Created: Mon Jun 16 17:48:45 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/tetrixwindow.ui.h b/tests/auto/uic/baseline/tetrixwindow.ui.h index 50ed416..b6b048b 100644 --- a/tests/auto/uic/baseline/tetrixwindow.ui.h +++ b/tests/auto/uic/baseline/tetrixwindow.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'tetrixwindow.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/textfinder.ui.h b/tests/auto/uic/baseline/textfinder.ui.h index 546ff17..62c2447 100644 --- a/tests/auto/uic/baseline/textfinder.ui.h +++ b/tests/auto/uic/baseline/textfinder.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'textfinder.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/topicchooser.ui.h b/tests/auto/uic/baseline/topicchooser.ui.h index 65cf205..9c4cdf0 100644 --- a/tests/auto/uic/baseline/topicchooser.ui.h +++ b/tests/auto/uic/baseline/topicchooser.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'topicchooser.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/translatedialog.ui.h b/tests/auto/uic/baseline/translatedialog.ui.h index ab9604c..14b7c1b 100644 --- a/tests/auto/uic/baseline/translatedialog.ui.h +++ b/tests/auto/uic/baseline/translatedialog.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'translatedialog.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/translationsettings.ui.h b/tests/auto/uic/baseline/translationsettings.ui.h index e36545e..d0f5257 100644 --- a/tests/auto/uic/baseline/translationsettings.ui.h +++ b/tests/auto/uic/baseline/translationsettings.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'translationsettings.ui' ** -** Created: Mon Sep 1 09:31:03 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/treewidgeteditor.ui.h b/tests/auto/uic/baseline/treewidgeteditor.ui.h index 43b1fcd..e018974 100644 --- a/tests/auto/uic/baseline/treewidgeteditor.ui.h +++ b/tests/auto/uic/baseline/treewidgeteditor.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'treewidgeteditor.ui' ** -** Created: Mon Jun 16 17:47:26 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/trpreviewtool.ui.h b/tests/auto/uic/baseline/trpreviewtool.ui.h index 1d8bf5e..cd37fb6 100644 --- a/tests/auto/uic/baseline/trpreviewtool.ui.h +++ b/tests/auto/uic/baseline/trpreviewtool.ui.h @@ -1,4 +1,5 @@ -/**************************************************************************** +/* +********************************************************************* ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) @@ -37,13 +38,14 @@ ** contact the sales department at http://qt.nokia.com/contact. ** $QT_END_LICENSE$ ** -****************************************************************************/ +********************************************************************* +*/ /******************************************************************************** ** Form generated from reading UI file 'trpreviewtool.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/validators.ui.h b/tests/auto/uic/baseline/validators.ui.h index 07e114a..c82cac5 100644 --- a/tests/auto/uic/baseline/validators.ui.h +++ b/tests/auto/uic/baseline/validators.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'validators.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/uic/baseline/wateringconfigdialog.ui.h b/tests/auto/uic/baseline/wateringconfigdialog.ui.h index 43120a5..0bac30d 100644 --- a/tests/auto/uic/baseline/wateringconfigdialog.ui.h +++ b/tests/auto/uic/baseline/wateringconfigdialog.ui.h @@ -1,8 +1,8 @@ /******************************************************************************** ** Form generated from reading UI file 'wateringconfigdialog.ui' ** -** Created: Thu Jul 10 09:47:35 2008 -** by: Qt User Interface Compiler version 4.5.0 +** Created: Tue Aug 18 19:03:32 2009 +** by: Qt User Interface Compiler version 4.6.0 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ -- cgit v0.12 From 8bea43ccb0f53234f87e4aa4d27371b741005222 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 19:15:33 +0200 Subject: Autotest: accept that the platform's UTF-8 codec can be buggy. We shouldn't fail in our autotests because the platform is buggy. But note the problem. We should report the bugs upstream... --- tests/auto/utf8/tst_utf8.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/auto/utf8/tst_utf8.cpp b/tests/auto/utf8/tst_utf8.cpp index 0d754b0..f255e6e 100644 --- a/tests/auto/utf8/tst_utf8.cpp +++ b/tests/auto/utf8/tst_utf8.cpp @@ -299,10 +299,19 @@ void tst_Utf8::invalidUtf8_data() void tst_Utf8::invalidUtf8() { QFETCH(QByteArray, utf8); + QFETCH_GLOBAL(bool, useLocale); QSharedPointer decoder = QSharedPointer(codec->makeDecoder()); QString decoded = decoder->toUnicode(utf8); - QVERIFY(decoder->hasFailure()); + + // Only enforce correctness on our UTF-8 decoder + // The system's UTF-8 codec is sometimes buggy + // GNU libc's iconv is known to accept U+FFFF and U+FFFE encoded as UTF-8 + // OS X's iconv is known to accept those, plus surrogates and codepoints above U+10FFFF + if (!useLocale) + QVERIFY(decoder->hasFailure()); + else if (!decoder->hasFailure()) + qWarning("System codec does not report failure when it should. Should report bug upstream."); } QTEST_MAIN(tst_Utf8) -- cgit v0.12 From 3ed5b5ebf5b360dedbba14c03f6ca5701b3b9290 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 19:22:52 +0200 Subject: Remove a global destructor from QtDBus. Instead, only run the unload code if we successfully loaded. --- src/dbus/qdbus_symbols.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/dbus/qdbus_symbols.cpp b/src/dbus/qdbus_symbols.cpp index ca0147a..356b14c 100644 --- a/src/dbus/qdbus_symbols.cpp +++ b/src/dbus/qdbus_symbols.cpp @@ -39,6 +39,7 @@ ** ****************************************************************************/ +#include "qdbus_symbols_p.h" #include #include #include @@ -52,7 +53,7 @@ void *qdbus_resolve_me(const char *name); static QLibrary *qdbus_libdbus = 0; -void qdbus_unloadLibDBus() +static void qdbus_unloadLibDBus() { delete qdbus_libdbus; qdbus_libdbus = 0; @@ -76,8 +77,11 @@ bool qdbus_loadLibDBus() lib->setFileName(QLatin1String("dbus-1")); for (uint i = 0; i < sizeof(majorversions) / sizeof(majorversions[0]); ++i) { lib->setFileNameAndVersion(lib->fileName(), majorversions[i]); - if (lib->load() && lib->resolve("dbus_connection_open_private")) + if (lib->load() && lib->resolve("dbus_connection_open_private")) { + struct Unloader { ~Unloader() { qdbus_unloadLibDBus(); } }; + static Unloader unloader; return true; + } lib->unload(); } @@ -107,8 +111,6 @@ void *qdbus_resolve_me(const char *name) return ptr; } -Q_DESTRUCTOR_FUNCTION(qdbus_unloadLibDBus) - QT_END_NAMESPACE #endif -- cgit v0.12 From 981e6442b98a2377a60dd56c23491de922080ef7 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 19:40:55 +0200 Subject: Remove a global static in QtTest: we can do the same with dynamic allocation. --- src/testlib/qtestcase.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index a144923..15c49e1 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -808,12 +808,12 @@ namespace QTest { static QObject *currentTestObject = 0; - struct TestFunction { + static struct TestFunction { TestFunction():function(0), data(0) {} ~TestFunction() { delete [] data; } int function; char *data; - } testFuncs[512]; + } *testFuncs; /** * Contains the count of test functions that was supplied @@ -1120,6 +1120,11 @@ static void qParseArgs(int argc, char *argv[]) exit(1); } ++QTest::lastTestFuncIdx; + if (!QTest::testFuncs) { + struct Cleanup { ~Cleanup() { delete[] QTest::testFuncs; } }; + static Cleanup cleanup; + QTest::testFuncs = new TestFunction[512]; + } QTest::testFuncs[QTest::lastTestFuncIdx].function = idx; QTest::testFuncs[QTest::lastTestFuncIdx].data = data; QTEST_ASSERT(QTest::lastTestFuncIdx < 512); -- cgit v0.12 From de1005fab824b134f36ea2b957f1ae219c2de6a5 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 19:42:39 +0200 Subject: Autotest: don't check Qt3Support and QtCLucene for global statics. We won't fix any issues in those libraries anyway, so don't waste time checking. --- tests/auto/symbols/tst_symbols.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/auto/symbols/tst_symbols.cpp b/tests/auto/symbols/tst_symbols.cpp index 784c979..fea3380 100644 --- a/tests/auto/symbols/tst_symbols.cpp +++ b/tests/auto/symbols/tst_symbols.cpp @@ -111,11 +111,19 @@ void tst_Symbols::globalObjects() bool isFailed = false; - QDir dir(qgetenv("QTDIR") + "/lib", "*.so"); + QDir dir(QLibraryInfo::location(QLibraryInfo::LibrariesPath), "*.so"); QStringList files = dir.entryList(); QVERIFY(!files.isEmpty()); foreach (QString lib, files) { + if (lib == "libQtCLucene.so") { + // skip this library, it's 3rd-party C++ + continue; + } + if (lib == "libQt3Support.so") { + // we're not going to fix these issues anyway, so skip this library + continue; + } QProcess proc; proc.start("nm", -- cgit v0.12 From 9e075992bae92366c80764cc26702b7abc1a5977 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 19:46:53 +0200 Subject: Autotest: Revert 96b6a3c9cd8 in tst_qnetworkcookiejar The change of URLs in Qt broke the tests that operated on URLs. This wasn't properly done, so revert to the last working values. --- .../qnetworkcookiejar/tst_qnetworkcookiejar.cpp | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp b/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp index 92b7ae5..9bf43ea 100644 --- a/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp +++ b/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp @@ -227,17 +227,17 @@ void tst_QNetworkCookieJar::cookiesForUrl_data() QTest::newRow("no-match-2") << allCookies << "http://foo.bar/web" << result; QTest::newRow("no-match-3") << allCookies << "http://foo.bar/web/wiki" << result; QTest::newRow("no-match-4") << allCookies << "http://trolltech.com" << result; - QTest::newRow("no-match-5") << allCookies << "http://qt.nokia.com" << result; + QTest::newRow("no-match-5") << allCookies << "http://www.trolltech.com" << result; QTest::newRow("no-match-6") << allCookies << "http://trolltech.com/webinar" << result; - QTest::newRow("no-match-7") << allCookies << "http://qt.nokia.com/webinar" << result; + QTest::newRow("no-match-7") << allCookies << "http://www.trolltech.com/webinar" << result; result = allCookies; QTest::newRow("match-1") << allCookies << "http://trolltech.com/web" << result; QTest::newRow("match-2") << allCookies << "http://trolltech.com/web/" << result; QTest::newRow("match-3") << allCookies << "http://trolltech.com/web/content" << result; - QTest::newRow("match-4") << allCookies << "http://qt.nokia.com/web" << result; - QTest::newRow("match-4") << allCookies << "http://qt.nokia.com/web/" << result; - QTest::newRow("match-6") << allCookies << "http://qt.nokia.com/web/content" << result; + QTest::newRow("match-4") << allCookies << "http://www.trolltech.com/web" << result; + QTest::newRow("match-4") << allCookies << "http://www.trolltech.com/web/" << result; + QTest::newRow("match-6") << allCookies << "http://www.trolltech.com/web/content" << result; cookie.setPath("/web/wiki"); allCookies += cookie; @@ -246,19 +246,19 @@ void tst_QNetworkCookieJar::cookiesForUrl_data() QTest::newRow("one-match-1") << allCookies << "http://trolltech.com/web" << result; QTest::newRow("one-match-2") << allCookies << "http://trolltech.com/web/" << result; QTest::newRow("one-match-3") << allCookies << "http://trolltech.com/web/content" << result; - QTest::newRow("one-match-4") << allCookies << "http://qt.nokia.com/web" << result; - QTest::newRow("one-match-4") << allCookies << "http://qt.nokia.com/web/" << result; - QTest::newRow("one-match-6") << allCookies << "http://qt.nokia.com/web/content" << result; + QTest::newRow("one-match-4") << allCookies << "http://www.trolltech.com/web" << result; + QTest::newRow("one-match-4") << allCookies << "http://www.trolltech.com/web/" << result; + QTest::newRow("one-match-6") << allCookies << "http://www.trolltech.com/web/content" << result; result.prepend(cookie); // longer path, it must match first QTest::newRow("two-matches-1") << allCookies << "http://trolltech.com/web/wiki" << result; - QTest::newRow("two-matches-2") << allCookies << "http://qt.nokia.com/web/wiki" << result; + QTest::newRow("two-matches-2") << allCookies << "http://www.trolltech.com/web/wiki" << result; // invert the order; allCookies.clear(); allCookies << result.at(1) << result.at(0); QTest::newRow("two-matches-3") << allCookies << "http://trolltech.com/web/wiki" << result; - QTest::newRow("two-matches-4") << allCookies << "http://qt.nokia.com/web/wiki" << result; + QTest::newRow("two-matches-4") << allCookies << "http://www.trolltech.com/web/wiki" << result; // expired cookie allCookies.clear(); @@ -268,9 +268,9 @@ void tst_QNetworkCookieJar::cookiesForUrl_data() QTest::newRow("exp-match-1") << allCookies << "http://trolltech.com/web" << result; QTest::newRow("exp-match-2") << allCookies << "http://trolltech.com/web/" << result; QTest::newRow("exp-match-3") << allCookies << "http://trolltech.com/web/content" << result; - QTest::newRow("exp-match-4") << allCookies << "http://qt.nokia.com/web" << result; - QTest::newRow("exp-match-4") << allCookies << "http://qt.nokia.com/web/" << result; - QTest::newRow("exp-match-6") << allCookies << "http://qt.nokia.com/web/content" << result; + QTest::newRow("exp-match-4") << allCookies << "http://www.trolltech.com/web" << result; + QTest::newRow("exp-match-4") << allCookies << "http://www.trolltech.com/web/" << result; + QTest::newRow("exp-match-6") << allCookies << "http://www.trolltech.com/web/content" << result; } void tst_QNetworkCookieJar::cookiesForUrl() -- cgit v0.12 From a1f2275772ba4ad8db0670ec6b41f99d9c2384f3 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 19:49:28 +0200 Subject: Autotest: update the trolltech.com URLs to nokia.com properly. --- .../qnetworkcookiejar/tst_qnetworkcookiejar.cpp | 54 +++++++++++----------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp b/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp index 9bf43ea..67b6d08 100644 --- a/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp +++ b/tests/auto/qnetworkcookiejar/tst_qnetworkcookiejar.cpp @@ -220,57 +220,57 @@ void tst_QNetworkCookieJar::cookiesForUrl_data() QNetworkCookie cookie; cookie.setName("a"); cookie.setPath("/web"); - cookie.setDomain(".trolltech.com"); + cookie.setDomain(".nokia.com"); allCookies += cookie; QTest::newRow("no-match-1") << allCookies << "http://foo.bar/" << result; QTest::newRow("no-match-2") << allCookies << "http://foo.bar/web" << result; QTest::newRow("no-match-3") << allCookies << "http://foo.bar/web/wiki" << result; - QTest::newRow("no-match-4") << allCookies << "http://trolltech.com" << result; - QTest::newRow("no-match-5") << allCookies << "http://www.trolltech.com" << result; - QTest::newRow("no-match-6") << allCookies << "http://trolltech.com/webinar" << result; - QTest::newRow("no-match-7") << allCookies << "http://www.trolltech.com/webinar" << result; + QTest::newRow("no-match-4") << allCookies << "http://nokia.com" << result; + QTest::newRow("no-match-5") << allCookies << "http://qt.nokia.com" << result; + QTest::newRow("no-match-6") << allCookies << "http://nokia.com/webinar" << result; + QTest::newRow("no-match-7") << allCookies << "http://qt.nokia.com/webinar" << result; result = allCookies; - QTest::newRow("match-1") << allCookies << "http://trolltech.com/web" << result; - QTest::newRow("match-2") << allCookies << "http://trolltech.com/web/" << result; - QTest::newRow("match-3") << allCookies << "http://trolltech.com/web/content" << result; - QTest::newRow("match-4") << allCookies << "http://www.trolltech.com/web" << result; - QTest::newRow("match-4") << allCookies << "http://www.trolltech.com/web/" << result; - QTest::newRow("match-6") << allCookies << "http://www.trolltech.com/web/content" << result; + QTest::newRow("match-1") << allCookies << "http://nokia.com/web" << result; + QTest::newRow("match-2") << allCookies << "http://nokia.com/web/" << result; + QTest::newRow("match-3") << allCookies << "http://nokia.com/web/content" << result; + QTest::newRow("match-4") << allCookies << "http://qt.nokia.com/web" << result; + QTest::newRow("match-4") << allCookies << "http://qt.nokia.com/web/" << result; + QTest::newRow("match-6") << allCookies << "http://qt.nokia.com/web/content" << result; cookie.setPath("/web/wiki"); allCookies += cookie; // exact same results as before: - QTest::newRow("one-match-1") << allCookies << "http://trolltech.com/web" << result; - QTest::newRow("one-match-2") << allCookies << "http://trolltech.com/web/" << result; - QTest::newRow("one-match-3") << allCookies << "http://trolltech.com/web/content" << result; - QTest::newRow("one-match-4") << allCookies << "http://www.trolltech.com/web" << result; - QTest::newRow("one-match-4") << allCookies << "http://www.trolltech.com/web/" << result; - QTest::newRow("one-match-6") << allCookies << "http://www.trolltech.com/web/content" << result; + QTest::newRow("one-match-1") << allCookies << "http://nokia.com/web" << result; + QTest::newRow("one-match-2") << allCookies << "http://nokia.com/web/" << result; + QTest::newRow("one-match-3") << allCookies << "http://nokia.com/web/content" << result; + QTest::newRow("one-match-4") << allCookies << "http://qt.nokia.com/web" << result; + QTest::newRow("one-match-4") << allCookies << "http://qt.nokia.com/web/" << result; + QTest::newRow("one-match-6") << allCookies << "http://qt.nokia.com/web/content" << result; result.prepend(cookie); // longer path, it must match first - QTest::newRow("two-matches-1") << allCookies << "http://trolltech.com/web/wiki" << result; - QTest::newRow("two-matches-2") << allCookies << "http://www.trolltech.com/web/wiki" << result; + QTest::newRow("two-matches-1") << allCookies << "http://nokia.com/web/wiki" << result; + QTest::newRow("two-matches-2") << allCookies << "http://qt.nokia.com/web/wiki" << result; // invert the order; allCookies.clear(); allCookies << result.at(1) << result.at(0); - QTest::newRow("two-matches-3") << allCookies << "http://trolltech.com/web/wiki" << result; - QTest::newRow("two-matches-4") << allCookies << "http://www.trolltech.com/web/wiki" << result; + QTest::newRow("two-matches-3") << allCookies << "http://nokia.com/web/wiki" << result; + QTest::newRow("two-matches-4") << allCookies << "http://qt.nokia.com/web/wiki" << result; // expired cookie allCookies.clear(); cookie.setExpirationDate(QDateTime::fromString("09-Nov-1999", "dd-MMM-yyyy")); allCookies += cookie; result.clear(); - QTest::newRow("exp-match-1") << allCookies << "http://trolltech.com/web" << result; - QTest::newRow("exp-match-2") << allCookies << "http://trolltech.com/web/" << result; - QTest::newRow("exp-match-3") << allCookies << "http://trolltech.com/web/content" << result; - QTest::newRow("exp-match-4") << allCookies << "http://www.trolltech.com/web" << result; - QTest::newRow("exp-match-4") << allCookies << "http://www.trolltech.com/web/" << result; - QTest::newRow("exp-match-6") << allCookies << "http://www.trolltech.com/web/content" << result; + QTest::newRow("exp-match-1") << allCookies << "http://nokia.com/web" << result; + QTest::newRow("exp-match-2") << allCookies << "http://nokia.com/web/" << result; + QTest::newRow("exp-match-3") << allCookies << "http://nokia.com/web/content" << result; + QTest::newRow("exp-match-4") << allCookies << "http://qt.nokia.com/web" << result; + QTest::newRow("exp-match-4") << allCookies << "http://qt.nokia.com/web/" << result; + QTest::newRow("exp-match-6") << allCookies << "http://qt.nokia.com/web/content" << result; } void tst_QNetworkCookieJar::cookiesForUrl() -- cgit v0.12 From 1f4810fde9f4e2f3f0921ea1e57f44f5f823b383 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 20:15:54 +0200 Subject: Fixed toRawForm because the domains usually start with a dot. Like 9fea895d6, the series of commits ending in ff1280178 made QUrl::toAce more strict. Now it doesn't accept empty domain labels, which is exactly what a leading dot means. Interestingly, KDE 3's KURL had a long-standing hack to support the leading dot and which I broke on more than one occasion. And it had that feature exactly because of cookies. --- src/network/access/qnetworkcookie.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/network/access/qnetworkcookie.cpp b/src/network/access/qnetworkcookie.cpp index 0c13286..6884bee 100644 --- a/src/network/access/qnetworkcookie.cpp +++ b/src/network/access/qnetworkcookie.cpp @@ -504,7 +504,12 @@ QByteArray QNetworkCookie::toRawForm(RawForm form) const } if (!d->domain.isEmpty()) { result += "; domain="; - result += QUrl::toAce(d->domain); + QString domainNoDot = d->domain; + if (domainNoDot.startsWith(QLatin1Char('.'))) { + result += '.'; + domainNoDot = domainNoDot.mid(1); + } + result += QUrl::toAce(domainNoDot); } if (!d->path.isEmpty()) { result += "; path="; -- cgit v0.12 From d4421a5fb86b4fdac0e2148d1ad2ea47b38af3a9 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 18 Aug 2009 20:20:41 +0200 Subject: Autotest: cosmetic: change trolltech.com to qt.nokia.com --- tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp | 54 ++++++++++++------------ 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp b/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp index 5519dee..abd1660 100644 --- a/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp +++ b/tests/auto/qnetworkcookie/tst_qnetworkcookie.cpp @@ -234,17 +234,17 @@ void tst_QNetworkCookie::parseSingleCookie_data() QTest::newRow("path-with-utf8-2") << "a=b;path=/R%C3%A9sum%C3%A9" << cookie; cookie.setPath(QString()); - cookie.setDomain(".trolltech.com"); - QTest::newRow("plain-domain1") << "a=b;domain=trolltech.com" << cookie; - QTest::newRow("plain-domain2") << "a=b; domain=trolltech.com " << cookie; - QTest::newRow("plain-domain3") << "a=b;domain=TROLLTECH.COM" << cookie; - QTest::newRow("plain-domain4") << "a=b;DOMAIN = TROLLTECH.COM" << cookie; - - cookie.setDomain(".trolltech.com"); - QTest::newRow("dot-domain1") << "a=b;domain=.trolltech.com" << cookie; - QTest::newRow("dot-domain2") << "a=b; domain=.trolltech.com" << cookie; - QTest::newRow("dot-domain3") << "a=b; domain=.TROLLTECH.COM" << cookie; - QTest::newRow("dot-domain4") << "a=b; Domain = .TROLLTECH.COM" << cookie; + cookie.setDomain(".qt.nokia.com"); + QTest::newRow("plain-domain1") << "a=b;domain=qt.nokia.com" << cookie; + QTest::newRow("plain-domain2") << "a=b; domain=qt.nokia.com " << cookie; + QTest::newRow("plain-domain3") << "a=b;domain=QT.NOKIA.COM" << cookie; + QTest::newRow("plain-domain4") << "a=b;DOMAIN = QT.NOKIA.COM" << cookie; + + cookie.setDomain(".qt.nokia.com"); + QTest::newRow("dot-domain1") << "a=b;domain=.qt.nokia.com" << cookie; + QTest::newRow("dot-domain2") << "a=b; domain=.qt.nokia.com" << cookie; + QTest::newRow("dot-domain3") << "a=b; domain=.QT.NOKIA.COM" << cookie; + QTest::newRow("dot-domain4") << "a=b; Domain = .QT.NOKIA.COM" << cookie; cookie.setDomain(QString::fromUtf8(".d\303\270gn\303\245pent.troll.no")); QTest::newRow("idn-domain1") << "a=b;domain=xn--dgnpent-gxa2o.troll.no" << cookie; @@ -259,20 +259,20 @@ void tst_QNetworkCookie::parseSingleCookie_data() QTest::newRow("dot-idn-domain3") << "a=b;domain=.XN--DGNPENT-GXA2O.TROLL.NO" << cookie; QTest::newRow("dot-idn-domain4") << "a=b;domain=.D\303\230GN\303\205PENT.troll.NO" << cookie; - cookie.setDomain(".trolltech.com"); + cookie.setDomain(".qt.nokia.com"); cookie.setPath("/"); - QTest::newRow("two-fields") << "a=b;domain=trolltech.com;path=/" << cookie; - QTest::newRow("two-fields2") << "a=b; domain=trolltech.com; path=/" << cookie; - QTest::newRow("two-fields3") << "a=b; domain=trolltech.com ; path=/ " << cookie; - QTest::newRow("two-fields4") << "a=b;path=/; domain=trolltech.com" << cookie; - QTest::newRow("two-fields5") << "a=b; path=/ ; domain=trolltech.com" << cookie; - QTest::newRow("two-fields6") << "a=b; path= / ; domain =trolltech.com" << cookie; + QTest::newRow("two-fields") << "a=b;domain=qt.nokia.com;path=/" << cookie; + QTest::newRow("two-fields2") << "a=b; domain=qt.nokia.com; path=/" << cookie; + QTest::newRow("two-fields3") << "a=b; domain=qt.nokia.com ; path=/ " << cookie; + QTest::newRow("two-fields4") << "a=b;path=/; domain=qt.nokia.com" << cookie; + QTest::newRow("two-fields5") << "a=b; path=/ ; domain=qt.nokia.com" << cookie; + QTest::newRow("two-fields6") << "a=b; path= / ; domain =qt.nokia.com" << cookie; cookie.setSecure(true); - QTest::newRow("three-fields") << "a=b;domain=trolltech.com;path=/;secure" << cookie; - QTest::newRow("three-fields2") << "a=b;secure;path=/;domain=trolltech.com" << cookie; - QTest::newRow("three-fields3") << "a=b;secure;domain=trolltech.com; path=/" << cookie; - QTest::newRow("three-fields4") << "a = b;secure;domain=trolltech.com; path=/" << cookie; + QTest::newRow("three-fields") << "a=b;domain=qt.nokia.com;path=/;secure" << cookie; + QTest::newRow("three-fields2") << "a=b;secure;path=/;domain=qt.nokia.com" << cookie; + QTest::newRow("three-fields3") << "a=b;secure;domain=qt.nokia.com; path=/" << cookie; + QTest::newRow("three-fields4") << "a = b;secure;domain=qt.nokia.com; path=/" << cookie; cookie = QNetworkCookie(); cookie.setName("a"); @@ -560,9 +560,9 @@ void tst_QNetworkCookie::parseSingleCookie_data() QTest::newRow("expires+path") << "a=b; expires=Wed, 09-Nov-1999 23:12:40 GMT; path=/" << cookie; QTest::newRow("path+expires") << "a=b; path=/;expires=Wed, 09-Nov-1999 23:12:40 GMT " << cookie; - cookie.setDomain(".trolltech.com"); - QTest::newRow("full") << "a=b; domain=.trolltech.com;expires=Wed, 09-Nov-1999 23:12:40 GMT;path=/" << cookie; - QTest::newRow("full2") << "a=b;path=/; expires=Wed, 09-Nov-1999 23:12:40 GMT ;domain=.trolltech.com" << cookie; + cookie.setDomain(".qt.nokia.com"); + QTest::newRow("full") << "a=b; domain=.qt.nokia.com;expires=Wed, 09-Nov-1999 23:12:40 GMT;path=/" << cookie; + QTest::newRow("full2") << "a=b;path=/; expires=Wed, 09-Nov-1999 23:12:40 GMT ;domain=.qt.nokia.com" << cookie; // cookies obtained from the network: cookie = QNetworkCookie("__siteid", "1"); @@ -662,9 +662,9 @@ void tst_QNetworkCookie::parseMultipleCookies_data() QTest::newRow("complex-1") << "c=d, a=, foo=bar; path=/" << list; cookie.setName("baz"); - cookie.setDomain(".trolltech.com"); + cookie.setDomain(".qt.nokia.com"); list.prepend(cookie); - QTest::newRow("complex-2") << "baz=bar; path=/; domain=trolltech.com, c=d,a=,foo=bar; path=/" << list; + QTest::newRow("complex-2") << "baz=bar; path=/; domain=qt.nokia.com, c=d,a=,foo=bar; path=/" << list; // cookies obtained from the network: cookie = QNetworkCookie("id", "51706646077999719"); -- cgit v0.12 From 080862c8b2b5bb1f8202affc5b415f2a86b5abb6 Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Tue, 18 Aug 2009 12:18:22 -0700 Subject: Disambiguate variable names s/lock/lockFlgs/ lock is also a function in QWSWindowSurface. Reviewed-by: Donald --- src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp | 10 +++++----- src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.h | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp index d2fadcb..a962bf9 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp @@ -47,7 +47,7 @@ QDirectFBPaintDevice::QDirectFBPaintDevice(QDirectFBScreen *scr) : QCustomRasterPaintDevice(0), dfbSurface(0), lockedImage(0), screen(scr), - lock(DFBSurfaceLockFlags(0)), mem(0), engine(0) + lockFlgs(DFBSurfaceLockFlags(0)), mem(0), engine(0) {} QDirectFBPaintDevice::~QDirectFBPaintDevice() @@ -65,15 +65,15 @@ IDirectFBSurface *QDirectFBPaintDevice::directFBSurface() const void QDirectFBPaintDevice::lockDirectFB(DFBSurfaceLockFlags flags) { - if (!(lock & flags)) { - if (lock) + if (!(lockFlgs & flags)) { + if (lockFlgs) unlockDirectFB(); mem = QDirectFBScreen::lockSurface(dfbSurface, flags, &bpl); Q_ASSERT(mem); const QSize s = size(); lockedImage = new QImage(mem, s.width(), s.height(), bpl, QDirectFBScreen::getImageFormat(dfbSurface)); - lock = flags; + lockFlgs = flags; } } @@ -87,7 +87,7 @@ void QDirectFBPaintDevice::unlockDirectFB() delete lockedImage; lockedImage = 0; mem = 0; - lock = DFBSurfaceLockFlags(0); + lockFlgs = DFBSurfaceLockFlags(0); } diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.h b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.h index 3932403..688fd7b 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.h +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.h @@ -68,7 +68,7 @@ public: int bytesPerLine() const; QSize size() const; int metric(QPaintDevice::PaintDeviceMetric metric) const; - DFBSurfaceLockFlags lockFlags() const { return lock; } + DFBSurfaceLockFlags lockFlags() const { return lockFlgs; } QPaintEngine *paintEngine() const; protected: @@ -86,7 +86,7 @@ protected: QImage *lockedImage; QDirectFBScreen *screen; int bpl; - DFBSurfaceLockFlags lock; + DFBSurfaceLockFlags lockFlgs; uchar *mem; QDirectFBPaintEngine *engine; private: -- cgit v0.12 From 5019a4128ed22f2e4d5dd76c4a2fe1ca4d6c4bf4 Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Tue, 18 Aug 2009 12:23:07 -0700 Subject: Initialize bpl in QDirectFBPaintDevice(...) Reviewed-by: Donald --- src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp index a962bf9..3979a8c 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbpaintdevice.cpp @@ -47,7 +47,7 @@ QDirectFBPaintDevice::QDirectFBPaintDevice(QDirectFBScreen *scr) : QCustomRasterPaintDevice(0), dfbSurface(0), lockedImage(0), screen(scr), - lockFlgs(DFBSurfaceLockFlags(0)), mem(0), engine(0) + bpl(-1), lockFlgs(DFBSurfaceLockFlags(0)), mem(0), engine(0) {} QDirectFBPaintDevice::~QDirectFBPaintDevice() -- cgit v0.12 From 4377c9f6a593359b436f7c8186abac8dad772329 Mon Sep 17 00:00:00 2001 From: Anders Bakken Date: Tue, 18 Aug 2009 12:42:19 -0700 Subject: Make sure windows raise properly when focused We never used to properly raise windows with DirectFB's window management. Somehow the event happens on a window surface that doesn't really have a IDirectFBWindow associated with it but using permanentState I can establish a sibling relationship to ensure raise gets called on the right window surface. Reviewed-By: Donald --- .../gfxdrivers/directfb/qdirectfbscreen.cpp | 25 ++++++++++- .../gfxdrivers/directfb/qdirectfbwindowsurface.cpp | 51 ++++++++++++---------- .../gfxdrivers/directfb/qdirectfbwindowsurface.h | 6 ++- 3 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp index 2541677..dc53847 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp @@ -56,13 +56,18 @@ class QDirectFBScreenPrivate : public QObject, public QWSGraphicsSystem { + Q_OBJECT public: QDirectFBScreenPrivate(QDirectFBScreen *qptr); ~QDirectFBScreenPrivate(); void setFlipFlags(const QStringList &args); QPixmapData *createPixmapData(QPixmapData::PixelType type) const; - +public slots: +#ifdef QT_DIRECTFB_WM + void onWindowEvent(QWSWindow *window, QWSServer::WindowEvent event); +#endif +public: IDirectFB *dfb; DFBSurfaceFlipFlags flipFlags; QDirectFBScreen::DirectFBFlags directFBFlags; @@ -86,6 +91,8 @@ public: QDirectFBScreen *q; }; +#include "qdirectfbscreen.moc" + QDirectFBScreenPrivate::QDirectFBScreenPrivate(QDirectFBScreen *qptr) : QWSGraphicsSystem(qptr), dfb(0), flipFlags(DSFLIP_NONE), directFBFlags(QDirectFBScreen::NoFlags), alphaPixmapFormat(QImage::Format_Invalid), @@ -107,6 +114,10 @@ QDirectFBScreenPrivate::QDirectFBScreenPrivate(QDirectFBScreen *qptr) #ifndef QT_NO_QWS_SIGNALHANDLER QWSSignalHandler::instance()->addObject(this); #endif +#ifdef QT_DIRECTFB_WM + connect(QWSServer::instance(), SIGNAL(windowEvent(QWSWindow*, QWSServer::WindowEvent)), + this, SLOT(onWindowEvent(QWSWindow*, QWSServer::WindowEvent))); +#endif } QDirectFBScreenPrivate::~QDirectFBScreenPrivate() @@ -747,6 +758,18 @@ void QDirectFBScreenPrivate::setFlipFlags(const QStringList &args) } } +#ifdef QT_DIRECTFB_WM +void QDirectFBScreenPrivate::onWindowEvent(QWSWindow *window, QWSServer::WindowEvent event) +{ + if (event == QWSServer::Raise) { + QWSWindowSurface *windowSurface = window->windowSurface(); + if (windowSurface && windowSurface->key() == QLatin1String("directfb")) { + static_cast(windowSurface)->raise(); + } + } +} +#endif + QPixmapData *QDirectFBScreenPrivate::createPixmapData(QPixmapData::PixelType type) const { if (type == QPixmapData::BitmapType) diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp index 584f334..441bac9 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp +++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.cpp @@ -54,6 +54,7 @@ QDirectFBWindowSurface::QDirectFBWindowSurface(DFBSurfaceFlipFlags flip, QDirect : QDirectFBPaintDevice(scr) #ifndef QT_NO_DIRECTFB_WM , dfbWindow(0) + , sibling(0) #endif , flipFlags(flip) , boundingRectFlip(scr->directFBFlags() & QDirectFBScreen::BoundingRectFlip) @@ -72,6 +73,7 @@ QDirectFBWindowSurface::QDirectFBWindowSurface(DFBSurfaceFlipFlags flip, QDirect : QWSWindowSurface(widget), QDirectFBPaintDevice(scr) #ifndef QT_NO_DIRECTFB_WM , dfbWindow(0) + , sibling(0) #endif , flipFlags(flip) , boundingRectFlip(scr->directFBFlags() & QDirectFBScreen::BoundingRectFlip) @@ -98,6 +100,17 @@ QDirectFBWindowSurface::~QDirectFBWindowSurface() { } +#ifdef QT_DIRECTFB_WM +void QDirectFBWindowSurface::raise() +{ + if (dfbWindow) { + dfbWindow->RaiseToTop(dfbWindow); + } else if (sibling && (!sibling->sibling || sibling->dfbWindow)) { + sibling->raise(); + } +} +#endif + bool QDirectFBWindowSurface::isValid() const { return true; @@ -126,6 +139,7 @@ void QDirectFBWindowSurface::createWindow() description.surface_caps = DSCAPS_PREMULTIPLIED; DFBResult result = layer->CreateWindow(layer, &description, &dfbWindow); + if (result != DFB_OK) DirectFBErrorFatal("QDirectFBWindowSurface::createWindow", result); @@ -231,34 +245,25 @@ void QDirectFBWindowSurface::setGeometry(const QRect &rect) QByteArray QDirectFBWindowSurface::permanentState() const { - QByteArray array; -#ifdef QT_NO_DIRECTFB_WM - array.resize(sizeof(SurfaceFlags) + sizeof(IDirectFBSurface*)); -#else - array.resize(sizeof(SurfaceFlags)); -#endif - char *ptr = array.data(); - - *reinterpret_cast(ptr) = surfaceFlags(); - ptr += sizeof(SurfaceFlags); - -#ifdef QT_NO_DIRECTFB_WM - *reinterpret_cast(ptr) = dfbSurface; + QByteArray state; +#ifdef QT_DIRECTFB_WM + QDataStream ds(&state, QIODevice::WriteOnly); + ds << reinterpret_cast(this); #endif - return array; + return state; } void QDirectFBWindowSurface::setPermanentState(const QByteArray &state) { - SurfaceFlags flags; - const char *ptr = state.constData(); - - flags = *reinterpret_cast(ptr); - setSurfaceFlags(flags); - -#ifdef QT_NO_DIRECTFB_WM - ptr += sizeof(SurfaceFlags); - dfbSurface = *reinterpret_cast(ptr); +#ifdef QT_DIRECTFB_WM + if (state.size() == sizeof(quintptr)) { + QDataStream ds(state); + quintptr ptr; + ds >> ptr; + sibling = reinterpret_cast(ptr); + } +#else + Q_UNUSED(state); #endif } diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h index 64b1920..2c4bcdf 100644 --- a/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h +++ b/src/plugins/gfxdrivers/directfb/qdirectfbwindowsurface.h @@ -65,6 +65,9 @@ public: QDirectFBWindowSurface(DFBSurfaceFlipFlags flipFlags, QDirectFBScreen *scr, QWidget *widget); ~QDirectFBWindowSurface(); +#ifdef QT_DIRECTFB_WM + void raise(); +#endif bool isValid() const; void setGeometry(const QRect &rect); @@ -87,9 +90,10 @@ public: QImage *buffer(const QWidget *widget); private: -#ifndef QT_NO_DIRECTFB_WM +#ifdef QT_DIRECTFB_WM void createWindow(); IDirectFBWindow *dfbWindow; + QDirectFBWindowSurface *sibling; #endif #ifdef QT_NO_DIRECTFB_WM -- cgit v0.12 From f7af55e67711270286a1addf6a28399982647a62 Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Wed, 19 Aug 2009 09:47:27 +1000 Subject: Move math3d unit tests up one level to tests/auto Some of the platform test infrastructure assumes that all unit tests are sub-directories under tests/auto, and the tests/auto/math3d sub-directory was confusing that infrastructure. Reviewed-by: trustme --- tests/auto/auto.pro | 5 +- tests/auto/math3d/math3d.pro | 2 - tests/auto/math3d/qmatrixnxn/qmatrixnxn.pro | 5 - tests/auto/math3d/qmatrixnxn/tst_qmatrixnxn.cpp | 3383 --------------------- tests/auto/math3d/qquaternion/qquaternion.pro | 5 - tests/auto/math3d/qquaternion/tst_qquaternion.cpp | 882 ------ tests/auto/math3d/qvectornd/qvectornd.pro | 5 - tests/auto/math3d/qvectornd/tst_qvectornd.cpp | 2141 ------------- tests/auto/math3d/shared/math3dincludes.h | 52 - tests/auto/qmatrixnxn/qmatrixnxn.pro | 2 + tests/auto/qmatrixnxn/tst_qmatrixnxn.cpp | 3383 +++++++++++++++++++++ tests/auto/qquaternion/qquaternion.pro | 2 + tests/auto/qquaternion/tst_qquaternion.cpp | 882 ++++++ tests/auto/qvectornd/qvectornd.pro | 2 + tests/auto/qvectornd/tst_qvectornd.cpp | 2143 +++++++++++++ 15 files changed, 6417 insertions(+), 6477 deletions(-) delete mode 100644 tests/auto/math3d/math3d.pro delete mode 100644 tests/auto/math3d/qmatrixnxn/qmatrixnxn.pro delete mode 100644 tests/auto/math3d/qmatrixnxn/tst_qmatrixnxn.cpp delete mode 100644 tests/auto/math3d/qquaternion/qquaternion.pro delete mode 100644 tests/auto/math3d/qquaternion/tst_qquaternion.cpp delete mode 100644 tests/auto/math3d/qvectornd/qvectornd.pro delete mode 100644 tests/auto/math3d/qvectornd/tst_qvectornd.cpp delete mode 100644 tests/auto/math3d/shared/math3dincludes.h create mode 100644 tests/auto/qmatrixnxn/qmatrixnxn.pro create mode 100644 tests/auto/qmatrixnxn/tst_qmatrixnxn.cpp create mode 100644 tests/auto/qquaternion/qquaternion.pro create mode 100644 tests/auto/qquaternion/tst_qquaternion.cpp create mode 100644 tests/auto/qvectornd/qvectornd.pro create mode 100644 tests/auto/qvectornd/tst_qvectornd.cpp diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 1ae6913..b3382bb 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -194,6 +194,7 @@ SUBDIRS += \ qmainwindow \ qmake \ qmap \ + qmatrixnxn \ qmdiarea \ qmdisubwindow \ qmenu \ @@ -240,6 +241,7 @@ SUBDIRS += \ qprogressdialog \ qpropertyanimation \ qpushbutton \ + qquaternion \ qqueue \ qradiobutton \ qreadlocker \ @@ -372,6 +374,7 @@ SUBDIRS += \ qvariant \ qvarlengtharray \ qvector \ + qvectornd \ qwaitcondition \ qwidget \ qwidgetaction \ @@ -476,5 +479,3 @@ contains(QT_CONFIG, webkit): SUBDIRS += \ qwebhistoryinterface \ qwebelement \ qwebhistory - -SUBDIRS += math3d diff --git a/tests/auto/math3d/math3d.pro b/tests/auto/math3d/math3d.pro deleted file mode 100644 index d6189ef..0000000 --- a/tests/auto/math3d/math3d.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = qmatrixnxn qquaternion qvectornd diff --git a/tests/auto/math3d/qmatrixnxn/qmatrixnxn.pro b/tests/auto/math3d/qmatrixnxn/qmatrixnxn.pro deleted file mode 100644 index 40c6cc0..0000000 --- a/tests/auto/math3d/qmatrixnxn/qmatrixnxn.pro +++ /dev/null @@ -1,5 +0,0 @@ -load(qttest_p4) -VPATH += ../shared -INCLUDEPATH += ../shared -HEADERS += math3dincludes.h -SOURCES += tst_qmatrixnxn.cpp diff --git a/tests/auto/math3d/qmatrixnxn/tst_qmatrixnxn.cpp b/tests/auto/math3d/qmatrixnxn/tst_qmatrixnxn.cpp deleted file mode 100644 index 5541162..0000000 --- a/tests/auto/math3d/qmatrixnxn/tst_qmatrixnxn.cpp +++ /dev/null @@ -1,3383 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include "math3dincludes.h" - -class tst_QMatrixNxN : public QObject -{ - Q_OBJECT -public: - tst_QMatrixNxN() {} - ~tst_QMatrixNxN() {} - -private slots: - void create2x2(); - void create3x3(); - void create4x4(); - void create4x3(); - - void isIdentity2x2(); - void isIdentity3x3(); - void isIdentity4x4(); - void isIdentity4x3(); - - void compare2x2(); - void compare3x3(); - void compare4x4(); - void compare4x3(); - - void transposed2x2(); - void transposed3x3(); - void transposed4x4(); - void transposed4x3(); - - void add2x2_data(); - void add2x2(); - void add3x3_data(); - void add3x3(); - void add4x4_data(); - void add4x4(); - void add4x3_data(); - void add4x3(); - - void subtract2x2_data(); - void subtract2x2(); - void subtract3x3_data(); - void subtract3x3(); - void subtract4x4_data(); - void subtract4x4(); - void subtract4x3_data(); - void subtract4x3(); - - void multiply2x2_data(); - void multiply2x2(); - void multiply3x3_data(); - void multiply3x3(); - void multiply4x4_data(); - void multiply4x4(); - void multiply4x3_data(); - void multiply4x3(); - - void multiplyFactor2x2_data(); - void multiplyFactor2x2(); - void multiplyFactor3x3_data(); - void multiplyFactor3x3(); - void multiplyFactor4x4_data(); - void multiplyFactor4x4(); - void multiplyFactor4x3_data(); - void multiplyFactor4x3(); - - void divideFactor2x2_data(); - void divideFactor2x2(); - void divideFactor3x3_data(); - void divideFactor3x3(); - void divideFactor4x4_data(); - void divideFactor4x4(); - void divideFactor4x3_data(); - void divideFactor4x3(); - - void negate2x2_data(); - void negate2x2(); - void negate3x3_data(); - void negate3x3(); - void negate4x4_data(); - void negate4x4(); - void negate4x3_data(); - void negate4x3(); - - void inverted4x4_data(); - void inverted4x4(); - - void orthonormalInverse4x4(); - - void scale4x4_data(); - void scale4x4(); - - void translate4x4_data(); - void translate4x4(); - - void rotate4x4_data(); - void rotate4x4(); - - void normalMatrix_data(); - void normalMatrix(); - - void optimizedTransforms(); - - void ortho(); - void frustum(); - void perspective(); - void flipCoordinates(); - - void convertGeneric(); - - void extractAxisRotation_data(); - void extractAxisRotation(); - - void extractTranslation_data(); - void extractTranslation(); - - void inferSpecialType_data(); - void inferSpecialType(); - - void columnsAndRows(); - - void convertQMatrix(); - void convertQTransform(); - - void fill(); - - void mapRect_data(); - void mapRect(); - - void properties(); - void metaTypes(); - -private: - static void setMatrix(QMatrix2x2& m, const qreal *values); - static void setMatrixDirect(QMatrix2x2& m, const qreal *values); - static bool isSame(const QMatrix2x2& m, const qreal *values); - static bool isIdentity(const QMatrix2x2& m); - - static void setMatrix(QMatrix3x3& m, const qreal *values); - static void setMatrixDirect(QMatrix3x3& m, const qreal *values); - static bool isSame(const QMatrix3x3& m, const qreal *values); - static bool isIdentity(const QMatrix3x3& m); - - static void setMatrix(QMatrix4x4& m, const qreal *values); - static void setMatrixDirect(QMatrix4x4& m, const qreal *values); - static bool isSame(const QMatrix4x4& m, const qreal *values); - static bool isIdentity(const QMatrix4x4& m); - - static void setMatrix(QMatrix4x3& m, const qreal *values); - static void setMatrixDirect(QMatrix4x3& m, const qreal *values); - static bool isSame(const QMatrix4x3& m, const qreal *values); - static bool isIdentity(const QMatrix4x3& m); -}; - -static const qreal nullValues2[] = - {0.0f, 0.0f, - 0.0f, 0.0f}; - -static qreal const identityValues2[16] = - {1.0f, 0.0f, - 0.0f, 1.0f}; - -static const qreal doubleIdentity2[] = - {2.0f, 0.0f, - 0.0f, 2.0f}; - -static qreal const uniqueValues2[16] = - {1.0f, 2.0f, - 5.0f, 6.0f}; - -static qreal const transposedValues2[16] = - {1.0f, 5.0f, - 2.0f, 6.0f}; - -static const qreal nullValues3[] = - {0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f}; - -static qreal const identityValues3[16] = - {1.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 1.0f}; - -static const qreal doubleIdentity3[] = - {2.0f, 0.0f, 0.0f, - 0.0f, 2.0f, 0.0f, - 0.0f, 0.0f, 2.0f}; - -static qreal const uniqueValues3[16] = - {1.0f, 2.0f, 3.0f, - 5.0f, 6.0f, 7.0f, - 9.0f, 10.0f, 11.0f}; - -static qreal const transposedValues3[16] = - {1.0f, 5.0f, 9.0f, - 2.0f, 6.0f, 10.0f, - 3.0f, 7.0f, 11.0f}; - -static const qreal nullValues4[] = - {0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f}; - -static qreal const identityValues4[16] = - {1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - -static const qreal doubleIdentity4[] = - {2.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 2.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 2.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 2.0f}; - -static qreal const uniqueValues4[16] = - {1.0f, 2.0f, 3.0f, 4.0f, - 5.0f, 6.0f, 7.0f, 8.0f, - 9.0f, 10.0f, 11.0f, 12.0f, - 13.0f, 14.0f, 15.0f, 16.0f}; - -static qreal const transposedValues4[16] = - {1.0f, 5.0f, 9.0f, 13.0f, - 2.0f, 6.0f, 10.0f, 14.0f, - 3.0f, 7.0f, 11.0f, 15.0f, - 4.0f, 8.0f, 12.0f, 16.0f}; - -static const qreal nullValues4x3[] = - {0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f}; - -static qreal const identityValues4x3[12] = - {1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f}; - -static qreal const doubleIdentity4x3[12] = - {2.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 2.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 2.0f, 0.0f}; - -static qreal const uniqueValues4x3[12] = - {1.0f, 2.0f, 3.0f, 4.0f, - 5.0f, 6.0f, 7.0f, 8.0f, - 9.0f, 10.0f, 11.0f, 12.0f}; - -static qreal const transposedValues3x4[12] = - {1.0f, 5.0f, 9.0f, - 2.0f, 6.0f, 10.0f, - 3.0f, 7.0f, 11.0f, - 4.0f, 8.0f, 12.0f}; - -// Set a matrix to a specified array of values, which are assumed -// to be in row-major order. This sets the values using floating-point. -void tst_QMatrixNxN::setMatrix(QMatrix2x2& m, const qreal *values) -{ - for (int row = 0; row < 2; ++row) - for (int col = 0; col < 2; ++col) - m(row, col) = values[row * 2 + col]; -} -void tst_QMatrixNxN::setMatrix(QMatrix3x3& m, const qreal *values) -{ - for (int row = 0; row < 3; ++row) - for (int col = 0; col < 3; ++col) - m(row, col) = values[row * 3 + col]; -} -void tst_QMatrixNxN::setMatrix(QMatrix4x4& m, const qreal *values) -{ - for (int row = 0; row < 4; ++row) - for (int col = 0; col < 4; ++col) - m(row, col) = values[row * 4 + col]; -} -void tst_QMatrixNxN::setMatrix(QMatrix4x3& m, const qreal *values) -{ - for (int row = 0; row < 3; ++row) - for (int col = 0; col < 4; ++col) - m(row, col) = values[row * 4 + col]; -} - -// Set a matrix to a specified array of values, which are assumed -// to be in row-major order. This sets the values directly into -// the internal data() array. -void tst_QMatrixNxN::setMatrixDirect(QMatrix2x2& m, const qreal *values) -{ - float *data = m.data(); - for (int row = 0; row < 2; ++row) { - for (int col = 0; col < 2; ++col) { - data[row + col * 2] = values[row * 2 + col]; - } - } -} -void tst_QMatrixNxN::setMatrixDirect(QMatrix3x3& m, const qreal *values) -{ - float *data = m.data(); - for (int row = 0; row < 3; ++row) { - for (int col = 0; col < 3; ++col) { - data[row + col * 3] = values[row * 3 + col]; - } - } -} -void tst_QMatrixNxN::setMatrixDirect(QMatrix4x4& m, const qreal *values) -{ - float *data = m.data(); - for (int row = 0; row < 4; ++row) { - for (int col = 0; col < 4; ++col) { - data[row + col * 4] = values[row * 4 + col]; - } - } -} -void tst_QMatrixNxN::setMatrixDirect(QMatrix4x3& m, const qreal *values) -{ - float *data = m.data(); - for (int row = 0; row < 3; ++row) { - for (int col = 0; col < 4; ++col) { - data[row + col * 3] = values[row * 4 + col]; - } - } -} - -// qFuzzyCompare isn't always "fuzzy" enough to handle conversion -// between float, double, and qreal. So create "fuzzier" compares. -static bool fuzzyCompare(float x, float y, qreal epsilon = 0.001) -{ - float diff = x - y; - if (diff < 0.0f) - diff = -diff; - return (diff < epsilon); -} - -static bool fuzzyCompare(const QVector3D &v1, const QVector3D &v2, qreal epsilon = 0.001) -{ - if (!fuzzyCompare(v1.x(), v2.x(), epsilon)) - return false; - if (!fuzzyCompare(v1.y(), v2.y(), epsilon)) - return false; - if (!fuzzyCompare(v1.z(), v2.z(), epsilon)) - return false; - return true; -} - -static bool matrixFuzzyCompare(const QMatrix4x4 &m1, const QMatrix4x4 &m2) -{ - bool ret = true; - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - ret = ret && fuzzyCompare(m1(i, j), m2(i, j)); - } - } - - return ret; -} - -// Determine if a matrix is the same as a specified array of values. -// The values are assumed to be specified in row-major order. -bool tst_QMatrixNxN::isSame(const QMatrix2x2& m, const qreal *values) -{ - const float *mv = m.constData(); - for (int row = 0; row < 2; ++row) { - for (int col = 0; col < 2; ++col) { - // Check the values using the operator() function. - if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 2 + col]))) { - qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 2 + col]; - return false; - } - - // Check the values using direct access, which verifies that the values - // are stored internally in column-major order. - if (!fuzzyCompare((float)(mv[col * 2 + row]), (float)(values[row * 2 + col]))) { - qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 2 + row] << "expected =" << values[row * 2 + col]; - return false; - } - } - } - return true; -} -bool tst_QMatrixNxN::isSame(const QMatrix3x3& m, const qreal *values) -{ - const float *mv = m.constData(); - for (int row = 0; row < 3; ++row) { - for (int col = 0; col < 3; ++col) { - // Check the values using the operator() access function. - if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 3 + col]))) { - qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 3 + col]; - return false; - } - - // Check the values using direct access, which verifies that the values - // are stored internally in column-major order. - if (!fuzzyCompare((float)(mv[col * 3 + row]), (float)(values[row * 3 + col]))) { - qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 3 + row] << "expected =" << values[row * 3 + col]; - return false; - } - } - } - return true; -} -bool tst_QMatrixNxN::isSame(const QMatrix4x4& m, const qreal *values) -{ - const float *mv = m.constData(); - for (int row = 0; row < 4; ++row) { - for (int col = 0; col < 4; ++col) { - // Check the values using the operator() access function. - if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 4 + col]))) { - qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 4 + col]; - return false; - } - - // Check the values using direct access, which verifies that the values - // are stored internally in column-major order. - if (!fuzzyCompare((float)(mv[col * 4 + row]), (float)(values[row * 4 + col]))) { - qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 4 + row] << "expected =" << values[row * 4 + col]; - return false; - } - } - } - return true; -} -bool tst_QMatrixNxN::isSame(const QMatrix4x3& m, const qreal *values) -{ - const float *mv = m.constData(); - for (int row = 0; row < 3; ++row) { - for (int col = 0; col < 4; ++col) { - // Check the values using the operator() access function. - if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 4 + col]))) { - qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 4 + col]; - return false; - } - - // Check the values using direct access, which verifies that the values - // are stored internally in column-major order. - if (!fuzzyCompare((float)(mv[col * 3 + row]), (float)(values[row * 4 + col]))) { - qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 3 + row] << "expected =" << values[row * 4 + col]; - return false; - } - } - } - return true; -} - -// Determine if a matrix is the identity. -bool tst_QMatrixNxN::isIdentity(const QMatrix2x2& m) -{ - return isSame(m, identityValues2); -} -bool tst_QMatrixNxN::isIdentity(const QMatrix3x3& m) -{ - return isSame(m, identityValues3); -} -bool tst_QMatrixNxN::isIdentity(const QMatrix4x4& m) -{ - return isSame(m, identityValues4); -} -bool tst_QMatrixNxN::isIdentity(const QMatrix4x3& m) -{ - return isSame(m, identityValues4x3); -} - -// Test the creation of QMatrix2x2 objects in various ways: -// construct, copy, and modify. -void tst_QMatrixNxN::create2x2() -{ - QMatrix2x2 m1; - QVERIFY(isIdentity(m1)); - QVERIFY(m1.isIdentity()); - - QMatrix2x2 m2; - setMatrix(m2, uniqueValues2); - QVERIFY(isSame(m2, uniqueValues2)); - QVERIFY(!m2.isIdentity()); - - QMatrix2x2 m3; - setMatrixDirect(m3, uniqueValues2); - QVERIFY(isSame(m3, uniqueValues2)); - - QMatrix2x2 m4(m3); - QVERIFY(isSame(m4, uniqueValues2)); - - QMatrix2x2 m5; - m5 = m3; - QVERIFY(isSame(m5, uniqueValues2)); - - m5.setIdentity(); - QVERIFY(isIdentity(m5)); - - QMatrix2x2 m6(uniqueValues2); - QVERIFY(isSame(m6, uniqueValues2)); - qreal vals[4]; - m6.toValueArray(vals); - for (int index = 0; index < 4; ++index) - QCOMPARE((float)(vals[index]), (float)(uniqueValues2[index])); -} - -// Test the creation of QMatrix3x3 objects in various ways: -// construct, copy, and modify. -void tst_QMatrixNxN::create3x3() -{ - QMatrix3x3 m1; - QVERIFY(isIdentity(m1)); - QVERIFY(m1.isIdentity()); - - QMatrix3x3 m2; - setMatrix(m2, uniqueValues3); - QVERIFY(isSame(m2, uniqueValues3)); - QVERIFY(!m2.isIdentity()); - - QMatrix3x3 m3; - setMatrixDirect(m3, uniqueValues3); - QVERIFY(isSame(m3, uniqueValues3)); - - QMatrix3x3 m4(m3); - QVERIFY(isSame(m4, uniqueValues3)); - - QMatrix3x3 m5; - m5 = m3; - QVERIFY(isSame(m5, uniqueValues3)); - - m5.setIdentity(); - QVERIFY(isIdentity(m5)); - - QMatrix3x3 m6(uniqueValues3); - QVERIFY(isSame(m6, uniqueValues3)); - qreal vals[9]; - m6.toValueArray(vals); - for (int index = 0; index < 9; ++index) - QCOMPARE((float)(vals[index]), (float)(uniqueValues3[index])); -} - -// Test the creation of QMatrix4x4 objects in various ways: -// construct, copy, and modify. -void tst_QMatrixNxN::create4x4() -{ - QMatrix4x4 m1; - QVERIFY(isIdentity(m1)); - QVERIFY(m1.isIdentity()); - - QMatrix4x4 m2; - setMatrix(m2, uniqueValues4); - QVERIFY(isSame(m2, uniqueValues4)); - QVERIFY(!m2.isIdentity()); - - QMatrix4x4 m3; - setMatrixDirect(m3, uniqueValues4); - QVERIFY(isSame(m3, uniqueValues4)); - - QMatrix4x4 m4(m3); - QVERIFY(isSame(m4, uniqueValues4)); - - QMatrix4x4 m5; - m5 = m3; - QVERIFY(isSame(m5, uniqueValues4)); - - m5.setIdentity(); - QVERIFY(isIdentity(m5)); - - QMatrix4x4 m6(uniqueValues4); - QVERIFY(isSame(m6, uniqueValues4)); - qreal vals[16]; - m6.toValueArray(vals); - for (int index = 0; index < 16; ++index) - QCOMPARE((float)(vals[index]), (float)(uniqueValues4[index])); - - QMatrix4x4 m8 - (uniqueValues4[0], uniqueValues4[1], uniqueValues4[2], uniqueValues4[3], - uniqueValues4[4], uniqueValues4[5], uniqueValues4[6], uniqueValues4[7], - uniqueValues4[8], uniqueValues4[9], uniqueValues4[10], uniqueValues4[11], - uniqueValues4[12], uniqueValues4[13], uniqueValues4[14], uniqueValues4[15]); - QVERIFY(isSame(m8, uniqueValues4)); -} - -// Test the creation of QMatrix4x3 objects in various ways: -// construct, copy, and modify. -void tst_QMatrixNxN::create4x3() -{ - QMatrix4x3 m1; - QVERIFY(isIdentity(m1)); - QVERIFY(m1.isIdentity()); - - QMatrix4x3 m2; - setMatrix(m2, uniqueValues4x3); - QVERIFY(isSame(m2, uniqueValues4x3)); - QVERIFY(!m2.isIdentity()); - - QMatrix4x3 m3; - setMatrixDirect(m3, uniqueValues4x3); - QVERIFY(isSame(m3, uniqueValues4x3)); - - QMatrix4x3 m4(m3); - QVERIFY(isSame(m4, uniqueValues4x3)); - - QMatrix4x3 m5; - m5 = m3; - QVERIFY(isSame(m5, uniqueValues4x3)); - - m5.setIdentity(); - QVERIFY(isIdentity(m5)); - - QMatrix4x3 m6(uniqueValues4x3); - QVERIFY(isSame(m6, uniqueValues4x3)); - qreal vals[12]; - m6.toValueArray(vals); - for (int index = 0; index < 12; ++index) - QCOMPARE((float)(vals[index]), (float)(uniqueValues4x3[index])); -} - -// Test isIdentity() for 2x2 matrices. -void tst_QMatrixNxN::isIdentity2x2() -{ - for (int i = 0; i < 2 * 2; ++i) { - QMatrix2x2 m; - QVERIFY(m.isIdentity()); - m.data()[i] = 42.0f; - QVERIFY(!m.isIdentity()); - } -} - -// Test isIdentity() for 3x3 matrices. -void tst_QMatrixNxN::isIdentity3x3() -{ - for (int i = 0; i < 3 * 3; ++i) { - QMatrix3x3 m; - QVERIFY(m.isIdentity()); - m.data()[i] = 42.0f; - QVERIFY(!m.isIdentity()); - } -} - -// Test isIdentity() for 4x4 matrices. -void tst_QMatrixNxN::isIdentity4x4() -{ - for (int i = 0; i < 4 * 4; ++i) { - QMatrix4x4 m; - QVERIFY(m.isIdentity()); - m.data()[i] = 42.0f; - QVERIFY(!m.isIdentity()); - } - - // Force the "Identity" flag bit to be lost and check again. - QMatrix4x4 m2; - m2.data()[0] = 1.0f; - QVERIFY(m2.isIdentity()); -} - -// Test isIdentity() for 4x3 matrices. -void tst_QMatrixNxN::isIdentity4x3() -{ - for (int i = 0; i < 4 * 3; ++i) { - QMatrix4x3 m; - QVERIFY(m.isIdentity()); - m.data()[i] = 42.0f; - QVERIFY(!m.isIdentity()); - } -} - -// Test 2x2 matrix comparisons. -void tst_QMatrixNxN::compare2x2() -{ - QMatrix2x2 m1(uniqueValues2); - QMatrix2x2 m2(uniqueValues2); - QMatrix2x2 m3(transposedValues2); - - QVERIFY(m1 == m2); - QVERIFY(!(m1 != m2)); - QVERIFY(m1 != m3); - QVERIFY(!(m1 == m3)); -} - -// Test 3x3 matrix comparisons. -void tst_QMatrixNxN::compare3x3() -{ - QMatrix3x3 m1(uniqueValues3); - QMatrix3x3 m2(uniqueValues3); - QMatrix3x3 m3(transposedValues3); - - QVERIFY(m1 == m2); - QVERIFY(!(m1 != m2)); - QVERIFY(m1 != m3); - QVERIFY(!(m1 == m3)); -} - -// Test 4x4 matrix comparisons. -void tst_QMatrixNxN::compare4x4() -{ - QMatrix4x4 m1(uniqueValues4); - QMatrix4x4 m2(uniqueValues4); - QMatrix4x4 m3(transposedValues4); - - QVERIFY(m1 == m2); - QVERIFY(!(m1 != m2)); - QVERIFY(m1 != m3); - QVERIFY(!(m1 == m3)); -} - -// Test 4x3 matrix comparisons. -void tst_QMatrixNxN::compare4x3() -{ - QMatrix4x3 m1(uniqueValues4x3); - QMatrix4x3 m2(uniqueValues4x3); - QMatrix4x3 m3(transposedValues3x4); - - QVERIFY(m1 == m2); - QVERIFY(!(m1 != m2)); - QVERIFY(m1 != m3); - QVERIFY(!(m1 == m3)); -} - -// Test matrix 2x2 transpose operations. -void tst_QMatrixNxN::transposed2x2() -{ - // Transposing the identity should result in the identity. - QMatrix2x2 m1; - QMatrix2x2 m2 = m1.transposed(); - QVERIFY(isIdentity(m2)); - - // Transpose a more interesting matrix that allows us to track - // exactly where each source element ends up. - QMatrix2x2 m3(uniqueValues2); - QMatrix2x2 m4 = m3.transposed(); - QVERIFY(isSame(m4, transposedValues2)); - - // Transpose in-place, just to check that the compiler is sane. - m3 = m3.transposed(); - QVERIFY(isSame(m3, transposedValues2)); -} - -// Test matrix 3x3 transpose operations. -void tst_QMatrixNxN::transposed3x3() -{ - // Transposing the identity should result in the identity. - QMatrix3x3 m1; - QMatrix3x3 m2 = m1.transposed(); - QVERIFY(isIdentity(m2)); - - // Transpose a more interesting matrix that allows us to track - // exactly where each source element ends up. - QMatrix3x3 m3(uniqueValues3); - QMatrix3x3 m4 = m3.transposed(); - QVERIFY(isSame(m4, transposedValues3)); - - // Transpose in-place, just to check that the compiler is sane. - m3 = m3.transposed(); - QVERIFY(isSame(m3, transposedValues3)); -} - -// Test matrix 4x4 transpose operations. -void tst_QMatrixNxN::transposed4x4() -{ - // Transposing the identity should result in the identity. - QMatrix4x4 m1; - QMatrix4x4 m2 = m1.transposed(); - QVERIFY(isIdentity(m2)); - - // Transpose a more interesting matrix that allows us to track - // exactly where each source element ends up. - QMatrix4x4 m3(uniqueValues4); - QMatrix4x4 m4 = m3.transposed(); - QVERIFY(isSame(m4, transposedValues4)); - - // Transpose in-place, just to check that the compiler is sane. - m3 = m3.transposed(); - QVERIFY(isSame(m3, transposedValues4)); -} - -// Test matrix 4x3 transpose operations. -void tst_QMatrixNxN::transposed4x3() -{ - QMatrix4x3 m3(uniqueValues4x3); - QMatrix3x4 m4 = m3.transposed(); - qreal values[12]; - m4.toValueArray(values); - for (int index = 0; index < 12; ++index) - QCOMPARE(values[index], transposedValues3x4[index]); -} - -// Test matrix addition for 2x2 matrices. -void tst_QMatrixNxN::add2x2_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("m2Values"); - QTest::addColumn("m3Values"); - - QTest::newRow("null") - << (void *)nullValues2 << (void *)nullValues2 << (void *)nullValues2; - - QTest::newRow("identity/null") - << (void *)identityValues2 << (void *)nullValues2 << (void *)identityValues2; - - QTest::newRow("identity/identity") - << (void *)identityValues2 << (void *)identityValues2 << (void *)doubleIdentity2; - - static qreal const sumValues[16] = - {2.0f, 7.0f, - 7.0f, 12.0f}; - QTest::newRow("unique") - << (void *)uniqueValues2 << (void *)transposedValues2 << (void *)sumValues; -} -void tst_QMatrixNxN::add2x2() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix2x2 m1((const qreal *)m1Values); - QMatrix2x2 m2((const qreal *)m2Values); - - QMatrix2x2 m4(m1); - m4 += m2; - QVERIFY(isSame(m4, (const qreal *)m3Values)); - - QMatrix2x2 m5; - m5 = m1 + m2; - QVERIFY(isSame(m5, (const qreal *)m3Values)); -} - -// Test matrix addition for 3x3 matrices. -void tst_QMatrixNxN::add3x3_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("m2Values"); - QTest::addColumn("m3Values"); - - QTest::newRow("null") - << (void *)nullValues3 << (void *)nullValues3 << (void *)nullValues3; - - QTest::newRow("identity/null") - << (void *)identityValues3 << (void *)nullValues3 << (void *)identityValues3; - - QTest::newRow("identity/identity") - << (void *)identityValues3 << (void *)identityValues3 << (void *)doubleIdentity3; - - static qreal const sumValues[16] = - {2.0f, 7.0f, 12.0f, - 7.0f, 12.0f, 17.0f, - 12.0f, 17.0f, 22.0f}; - QTest::newRow("unique") - << (void *)uniqueValues3 << (void *)transposedValues3 << (void *)sumValues; -} -void tst_QMatrixNxN::add3x3() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix3x3 m1((const qreal *)m1Values); - QMatrix3x3 m2((const qreal *)m2Values); - - QMatrix3x3 m4(m1); - m4 += m2; - QVERIFY(isSame(m4, (const qreal *)m3Values)); - - QMatrix3x3 m5; - m5 = m1 + m2; - QVERIFY(isSame(m5, (const qreal *)m3Values)); -} - -// Test matrix addition for 4x4 matrices. -void tst_QMatrixNxN::add4x4_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("m2Values"); - QTest::addColumn("m3Values"); - - QTest::newRow("null") - << (void *)nullValues4 << (void *)nullValues4 << (void *)nullValues4; - - QTest::newRow("identity/null") - << (void *)identityValues4 << (void *)nullValues4 << (void *)identityValues4; - - QTest::newRow("identity/identity") - << (void *)identityValues4 << (void *)identityValues4 << (void *)doubleIdentity4; - - static qreal const sumValues[16] = - {2.0f, 7.0f, 12.0f, 17.0f, - 7.0f, 12.0f, 17.0f, 22.0f, - 12.0f, 17.0f, 22.0f, 27.0f, - 17.0f, 22.0f, 27.0f, 32.0f}; - QTest::newRow("unique") - << (void *)uniqueValues4 << (void *)transposedValues4 << (void *)sumValues; -} -void tst_QMatrixNxN::add4x4() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix4x4 m1((const qreal *)m1Values); - QMatrix4x4 m2((const qreal *)m2Values); - - QMatrix4x4 m4(m1); - m4 += m2; - QVERIFY(isSame(m4, (const qreal *)m3Values)); - - QMatrix4x4 m5; - m5 = m1 + m2; - QVERIFY(isSame(m5, (const qreal *)m3Values)); -} - -// Test matrix addition for 4x3 matrices. -void tst_QMatrixNxN::add4x3_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("m2Values"); - QTest::addColumn("m3Values"); - - QTest::newRow("null") - << (void *)nullValues4x3 << (void *)nullValues4x3 << (void *)nullValues4x3; - - QTest::newRow("identity/null") - << (void *)identityValues4x3 << (void *)nullValues4x3 << (void *)identityValues4x3; - - QTest::newRow("identity/identity") - << (void *)identityValues4x3 << (void *)identityValues4x3 << (void *)doubleIdentity4x3; - - static qreal const sumValues[16] = - {2.0f, 7.0f, 12.0f, 6.0f, - 11.0f, 16.0f, 10.0f, 15.0f, - 20.0f, 14.0f, 19.0f, 24.0f}; - QTest::newRow("unique") - << (void *)uniqueValues4x3 << (void *)transposedValues3x4 << (void *)sumValues; -} -void tst_QMatrixNxN::add4x3() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix4x3 m1((const qreal *)m1Values); - QMatrix4x3 m2((const qreal *)m2Values); - - QMatrix4x3 m4(m1); - m4 += m2; - QVERIFY(isSame(m4, (const qreal *)m3Values)); - - QMatrix4x3 m5; - m5 = m1 + m2; - QVERIFY(isSame(m5, (const qreal *)m3Values)); -} - -// Test matrix subtraction for 2x2 matrices. -void tst_QMatrixNxN::subtract2x2_data() -{ - // Use the same test cases as the add test. - add2x2_data(); -} -void tst_QMatrixNxN::subtract2x2() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix2x2 m1((const qreal *)m1Values); - QMatrix2x2 m2((const qreal *)m2Values); - QMatrix2x2 m3((const qreal *)m3Values); - - QMatrix2x2 m4(m3); - m4 -= m1; - QVERIFY(isSame(m4, (const qreal *)m2Values)); - - QMatrix2x2 m5; - m5 = m3 - m1; - QVERIFY(isSame(m5, (const qreal *)m2Values)); - - QMatrix2x2 m6(m3); - m6 -= m2; - QVERIFY(isSame(m6, (const qreal *)m1Values)); - - QMatrix2x2 m7; - m7 = m3 - m2; - QVERIFY(isSame(m7, (const qreal *)m1Values)); -} - -// Test matrix subtraction for 3x3 matrices. -void tst_QMatrixNxN::subtract3x3_data() -{ - // Use the same test cases as the add test. - add3x3_data(); -} -void tst_QMatrixNxN::subtract3x3() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix3x3 m1((const qreal *)m1Values); - QMatrix3x3 m2((const qreal *)m2Values); - QMatrix3x3 m3((const qreal *)m3Values); - - QMatrix3x3 m4(m3); - m4 -= m1; - QVERIFY(isSame(m4, (const qreal *)m2Values)); - - QMatrix3x3 m5; - m5 = m3 - m1; - QVERIFY(isSame(m5, (const qreal *)m2Values)); - - QMatrix3x3 m6(m3); - m6 -= m2; - QVERIFY(isSame(m6, (const qreal *)m1Values)); - - QMatrix3x3 m7; - m7 = m3 - m2; - QVERIFY(isSame(m7, (const qreal *)m1Values)); -} - -// Test matrix subtraction for 4x4 matrices. -void tst_QMatrixNxN::subtract4x4_data() -{ - // Use the same test cases as the add test. - add4x4_data(); -} -void tst_QMatrixNxN::subtract4x4() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix4x4 m1((const qreal *)m1Values); - QMatrix4x4 m2((const qreal *)m2Values); - QMatrix4x4 m3((const qreal *)m3Values); - - QMatrix4x4 m4(m3); - m4 -= m1; - QVERIFY(isSame(m4, (const qreal *)m2Values)); - - QMatrix4x4 m5; - m5 = m3 - m1; - QVERIFY(isSame(m5, (const qreal *)m2Values)); - - QMatrix4x4 m6(m3); - m6 -= m2; - QVERIFY(isSame(m6, (const qreal *)m1Values)); - - QMatrix4x4 m7; - m7 = m3 - m2; - QVERIFY(isSame(m7, (const qreal *)m1Values)); -} - -// Test matrix subtraction for 4x3 matrices. -void tst_QMatrixNxN::subtract4x3_data() -{ - // Use the same test cases as the add test. - add4x3_data(); -} -void tst_QMatrixNxN::subtract4x3() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix4x3 m1((const qreal *)m1Values); - QMatrix4x3 m2((const qreal *)m2Values); - QMatrix4x3 m3((const qreal *)m3Values); - - QMatrix4x3 m4(m3); - m4 -= m1; - QVERIFY(isSame(m4, (const qreal *)m2Values)); - - QMatrix4x3 m5; - m5 = m3 - m1; - QVERIFY(isSame(m5, (const qreal *)m2Values)); - - QMatrix4x3 m6(m3); - m6 -= m2; - QVERIFY(isSame(m6, (const qreal *)m1Values)); - - QMatrix4x3 m7; - m7 = m3 - m2; - QVERIFY(isSame(m7, (const qreal *)m1Values)); -} - -// Test matrix multiplication for 2x2 matrices. -void tst_QMatrixNxN::multiply2x2_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("m2Values"); - QTest::addColumn("m3Values"); - - QTest::newRow("null") - << (void *)nullValues2 << (void *)nullValues2 << (void *)nullValues2; - - QTest::newRow("null/unique") - << (void *)nullValues2 << (void *)uniqueValues2 << (void *)nullValues2; - - QTest::newRow("unique/null") - << (void *)uniqueValues2 << (void *)nullValues2 << (void *)nullValues2; - - QTest::newRow("unique/identity") - << (void *)uniqueValues2 << (void *)identityValues2 << (void *)uniqueValues2; - - QTest::newRow("identity/unique") - << (void *)identityValues2 << (void *)uniqueValues2 << (void *)uniqueValues2; - - static qreal uniqueResult[4]; - for (int row = 0; row < 2; ++row) { - for (int col = 0; col < 2; ++col) { - qreal sum = 0.0f; - for (int j = 0; j < 2; ++j) - sum += uniqueValues2[row * 2 + j] * transposedValues2[j * 2 + col]; - uniqueResult[row * 2 + col] = sum; - } - } - - QTest::newRow("unique/transposed") - << (void *)uniqueValues2 << (void *)transposedValues2 << (void *)uniqueResult; -} -void tst_QMatrixNxN::multiply2x2() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix2x2 m1((const qreal *)m1Values); - QMatrix2x2 m2((const qreal *)m2Values); - - QMatrix2x2 m5; - m5 = m1 * m2; - QVERIFY(isSame(m5, (const qreal *)m3Values)); -} - -// Test matrix multiplication for 3x3 matrices. -void tst_QMatrixNxN::multiply3x3_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("m2Values"); - QTest::addColumn("m3Values"); - - QTest::newRow("null") - << (void *)nullValues3 << (void *)nullValues3 << (void *)nullValues3; - - QTest::newRow("null/unique") - << (void *)nullValues3 << (void *)uniqueValues3 << (void *)nullValues3; - - QTest::newRow("unique/null") - << (void *)uniqueValues3 << (void *)nullValues3 << (void *)nullValues3; - - QTest::newRow("unique/identity") - << (void *)uniqueValues3 << (void *)identityValues3 << (void *)uniqueValues3; - - QTest::newRow("identity/unique") - << (void *)identityValues3 << (void *)uniqueValues3 << (void *)uniqueValues3; - - static qreal uniqueResult[9]; - for (int row = 0; row < 3; ++row) { - for (int col = 0; col < 3; ++col) { - qreal sum = 0.0f; - for (int j = 0; j < 3; ++j) - sum += uniqueValues3[row * 3 + j] * transposedValues3[j * 3 + col]; - uniqueResult[row * 3 + col] = sum; - } - } - - QTest::newRow("unique/transposed") - << (void *)uniqueValues3 << (void *)transposedValues3 << (void *)uniqueResult; -} -void tst_QMatrixNxN::multiply3x3() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix3x3 m1((const qreal *)m1Values); - QMatrix3x3 m2((const qreal *)m2Values); - - QMatrix3x3 m5; - m5 = m1 * m2; - QVERIFY(isSame(m5, (const qreal *)m3Values)); -} - -// Test matrix multiplication for 4x4 matrices. -void tst_QMatrixNxN::multiply4x4_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("m2Values"); - QTest::addColumn("m3Values"); - - QTest::newRow("null") - << (void *)nullValues4 << (void *)nullValues4 << (void *)nullValues4; - - QTest::newRow("null/unique") - << (void *)nullValues4 << (void *)uniqueValues4 << (void *)nullValues4; - - QTest::newRow("unique/null") - << (void *)uniqueValues4 << (void *)nullValues4 << (void *)nullValues4; - - QTest::newRow("unique/identity") - << (void *)uniqueValues4 << (void *)identityValues4 << (void *)uniqueValues4; - - QTest::newRow("identity/unique") - << (void *)identityValues4 << (void *)uniqueValues4 << (void *)uniqueValues4; - - static qreal uniqueResult[16]; - for (int row = 0; row < 4; ++row) { - for (int col = 0; col < 4; ++col) { - qreal sum = 0.0f; - for (int j = 0; j < 4; ++j) - sum += uniqueValues4[row * 4 + j] * transposedValues4[j * 4 + col]; - uniqueResult[row * 4 + col] = sum; - } - } - - QTest::newRow("unique/transposed") - << (void *)uniqueValues4 << (void *)transposedValues4 << (void *)uniqueResult; -} -void tst_QMatrixNxN::multiply4x4() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix4x4 m1((const qreal *)m1Values); - QMatrix4x4 m2((const qreal *)m2Values); - - QMatrix4x4 m4; - m4 = m1; - m4 *= m2; - QVERIFY(isSame(m4, (const qreal *)m3Values)); - - QMatrix4x4 m5; - m5 = m1 * m2; - QVERIFY(isSame(m5, (const qreal *)m3Values)); -} - -// Test matrix multiplication for 4x3 matrices. -void tst_QMatrixNxN::multiply4x3_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("m2Values"); - QTest::addColumn("m3Values"); - - QTest::newRow("null") - << (void *)nullValues4x3 << (void *)nullValues4x3 << (void *)nullValues3; - - QTest::newRow("null/unique") - << (void *)nullValues4x3 << (void *)uniqueValues4x3 << (void *)nullValues3; - - QTest::newRow("unique/null") - << (void *)uniqueValues4x3 << (void *)nullValues4x3 << (void *)nullValues3; - - static qreal uniqueResult[9]; - for (int row = 0; row < 3; ++row) { - for (int col = 0; col < 3; ++col) { - qreal sum = 0.0f; - for (int j = 0; j < 4; ++j) - sum += uniqueValues4x3[row * 4 + j] * transposedValues3x4[j * 3 + col]; - uniqueResult[row * 3 + col] = sum; - } - } - - QTest::newRow("unique/transposed") - << (void *)uniqueValues4x3 << (void *)transposedValues3x4 << (void *)uniqueResult; -} -void tst_QMatrixNxN::multiply4x3() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(void *, m3Values); - - QMatrix4x3 m1((const qreal *)m1Values); - QMatrix3x4 m2((const qreal *)m2Values); - - QGenericMatrix<3, 3, qreal, float> m4; - m4 = m1 * m2; - qreal values[9]; - m4.toValueArray(values); - for (int index = 0; index < 9; ++index) - QCOMPARE(values[index], ((const qreal *)m3Values)[index]); -} - -// Test matrix multiplication by a factor for 2x2 matrices. -void tst_QMatrixNxN::multiplyFactor2x2_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("factor"); - QTest::addColumn("m2Values"); - - QTest::newRow("null") - << (void *)nullValues2 << (qreal)1.0f << (void *)nullValues2; - - QTest::newRow("double identity") - << (void *)identityValues2 << (qreal)2.0f << (void *)doubleIdentity2; - - static qreal const values[16] = - {1.0f, 2.0f, - 5.0f, 6.0f}; - static qreal const doubleValues[16] = - {2.0f, 4.0f, - 10.0f, 12.0f}; - static qreal const negDoubleValues[16] = - {-2.0f, -4.0f, - -10.0f, -12.0f}; - - QTest::newRow("unique") - << (void *)values << (qreal)2.0f << (void *)doubleValues; - - QTest::newRow("neg") - << (void *)values << (qreal)-2.0f << (void *)negDoubleValues; - - QTest::newRow("zero") - << (void *)values << (qreal)0.0f << (void *)nullValues4; -} -void tst_QMatrixNxN::multiplyFactor2x2() -{ - QFETCH(void *, m1Values); - QFETCH(qreal, factor); - QFETCH(void *, m2Values); - - QMatrix2x2 m1((const qreal *)m1Values); - - QMatrix2x2 m3; - m3 = m1; - m3 *= factor; - QVERIFY(isSame(m3, (const qreal *)m2Values)); - - QMatrix2x2 m4; - m4 = m1 * factor; - QVERIFY(isSame(m4, (const qreal *)m2Values)); - - QMatrix2x2 m5; - m5 = factor * m1; - QVERIFY(isSame(m5, (const qreal *)m2Values)); -} - -// Test matrix multiplication by a factor for 3x3 matrices. -void tst_QMatrixNxN::multiplyFactor3x3_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("factor"); - QTest::addColumn("m2Values"); - - QTest::newRow("null") - << (void *)nullValues3 << (qreal)1.0f << (void *)nullValues3; - - QTest::newRow("double identity") - << (void *)identityValues3 << (qreal)2.0f << (void *)doubleIdentity3; - - static qreal const values[16] = - {1.0f, 2.0f, 3.0f, - 5.0f, 6.0f, 7.0f, - 9.0f, 10.0f, 11.0f}; - static qreal const doubleValues[16] = - {2.0f, 4.0f, 6.0f, - 10.0f, 12.0f, 14.0f, - 18.0f, 20.0f, 22.0f}; - static qreal const negDoubleValues[16] = - {-2.0f, -4.0f, -6.0f, - -10.0f, -12.0f, -14.0f, - -18.0f, -20.0f, -22.0f}; - - QTest::newRow("unique") - << (void *)values << (qreal)2.0f << (void *)doubleValues; - - QTest::newRow("neg") - << (void *)values << (qreal)-2.0f << (void *)negDoubleValues; - - QTest::newRow("zero") - << (void *)values << (qreal)0.0f << (void *)nullValues4; -} -void tst_QMatrixNxN::multiplyFactor3x3() -{ - QFETCH(void *, m1Values); - QFETCH(qreal, factor); - QFETCH(void *, m2Values); - - QMatrix3x3 m1((const qreal *)m1Values); - - QMatrix3x3 m3; - m3 = m1; - m3 *= factor; - QVERIFY(isSame(m3, (const qreal *)m2Values)); - - QMatrix3x3 m4; - m4 = m1 * factor; - QVERIFY(isSame(m4, (const qreal *)m2Values)); - - QMatrix3x3 m5; - m5 = factor * m1; - QVERIFY(isSame(m5, (const qreal *)m2Values)); -} - -// Test matrix multiplication by a factor for 4x4 matrices. -void tst_QMatrixNxN::multiplyFactor4x4_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("factor"); - QTest::addColumn("m2Values"); - - QTest::newRow("null") - << (void *)nullValues4 << (qreal)1.0f << (void *)nullValues4; - - QTest::newRow("double identity") - << (void *)identityValues4 << (qreal)2.0f << (void *)doubleIdentity4; - - static qreal const values[16] = - {1.0f, 2.0f, 3.0f, 4.0f, - 5.0f, 6.0f, 7.0f, 8.0f, - 9.0f, 10.0f, 11.0f, 12.0f, - 13.0f, 14.0f, 15.0f, 16.0f}; - static qreal const doubleValues[16] = - {2.0f, 4.0f, 6.0f, 8.0f, - 10.0f, 12.0f, 14.0f, 16.0f, - 18.0f, 20.0f, 22.0f, 24.0f, - 26.0f, 28.0f, 30.0f, 32.0f}; - static qreal const negDoubleValues[16] = - {-2.0f, -4.0f, -6.0f, -8.0f, - -10.0f, -12.0f, -14.0f, -16.0f, - -18.0f, -20.0f, -22.0f, -24.0f, - -26.0f, -28.0f, -30.0f, -32.0f}; - - QTest::newRow("unique") - << (void *)values << (qreal)2.0f << (void *)doubleValues; - - QTest::newRow("neg") - << (void *)values << (qreal)-2.0f << (void *)negDoubleValues; - - QTest::newRow("zero") - << (void *)values << (qreal)0.0f << (void *)nullValues4; -} -void tst_QMatrixNxN::multiplyFactor4x4() -{ - QFETCH(void *, m1Values); - QFETCH(qreal, factor); - QFETCH(void *, m2Values); - - QMatrix4x4 m1((const qreal *)m1Values); - - QMatrix4x4 m3; - m3 = m1; - m3 *= factor; - QVERIFY(isSame(m3, (const qreal *)m2Values)); - - QMatrix4x4 m4; - m4 = m1 * factor; - QVERIFY(isSame(m4, (const qreal *)m2Values)); - - QMatrix4x4 m5; - m5 = factor * m1; - QVERIFY(isSame(m5, (const qreal *)m2Values)); -} - -// Test matrix multiplication by a factor for 4x3 matrices. -void tst_QMatrixNxN::multiplyFactor4x3_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("factor"); - QTest::addColumn("m2Values"); - - QTest::newRow("null") - << (void *)nullValues4x3 << (qreal)1.0f << (void *)nullValues4x3; - - QTest::newRow("double identity") - << (void *)identityValues4x3 << (qreal)2.0f << (void *)doubleIdentity4x3; - - static qreal const values[12] = - {1.0f, 2.0f, 3.0f, 4.0f, - 5.0f, 6.0f, 7.0f, 8.0f, - 9.0f, 10.0f, 11.0f, 12.0f}; - static qreal const doubleValues[12] = - {2.0f, 4.0f, 6.0f, 8.0f, - 10.0f, 12.0f, 14.0f, 16.0f, - 18.0f, 20.0f, 22.0f, 24.0f}; - static qreal const negDoubleValues[12] = - {-2.0f, -4.0f, -6.0f, -8.0f, - -10.0f, -12.0f, -14.0f, -16.0f, - -18.0f, -20.0f, -22.0f, -24.0f}; - - QTest::newRow("unique") - << (void *)values << (qreal)2.0f << (void *)doubleValues; - - QTest::newRow("neg") - << (void *)values << (qreal)-2.0f << (void *)negDoubleValues; - - QTest::newRow("zero") - << (void *)values << (qreal)0.0f << (void *)nullValues4x3; -} -void tst_QMatrixNxN::multiplyFactor4x3() -{ - QFETCH(void *, m1Values); - QFETCH(qreal, factor); - QFETCH(void *, m2Values); - - QMatrix4x3 m1((const qreal *)m1Values); - - QMatrix4x3 m3; - m3 = m1; - m3 *= factor; - QVERIFY(isSame(m3, (const qreal *)m2Values)); - - QMatrix4x3 m4; - m4 = m1 * factor; - QVERIFY(isSame(m4, (const qreal *)m2Values)); - - QMatrix4x3 m5; - m5 = factor * m1; - QVERIFY(isSame(m5, (const qreal *)m2Values)); -} - -// Test matrix division by a factor for 2x2 matrices. -void tst_QMatrixNxN::divideFactor2x2_data() -{ - // Use the same test cases as the multiplyFactor test. - multiplyFactor2x2_data(); -} -void tst_QMatrixNxN::divideFactor2x2() -{ - QFETCH(void *, m1Values); - QFETCH(qreal, factor); - QFETCH(void *, m2Values); - - if (factor == 0.0f) - return; - - QMatrix2x2 m2((const qreal *)m2Values); - - QMatrix2x2 m3; - m3 = m2; - m3 /= factor; - QVERIFY(isSame(m3, (const qreal *)m1Values)); - - QMatrix2x2 m4; - m4 = m2 / factor; - QVERIFY(isSame(m4, (const qreal *)m1Values)); -} - -// Test matrix division by a factor for 3x3 matrices. -void tst_QMatrixNxN::divideFactor3x3_data() -{ - // Use the same test cases as the multiplyFactor test. - multiplyFactor3x3_data(); -} -void tst_QMatrixNxN::divideFactor3x3() -{ - QFETCH(void *, m1Values); - QFETCH(qreal, factor); - QFETCH(void *, m2Values); - - if (factor == 0.0f) - return; - - QMatrix3x3 m2((const qreal *)m2Values); - - QMatrix3x3 m3; - m3 = m2; - m3 /= factor; - QVERIFY(isSame(m3, (const qreal *)m1Values)); - - QMatrix3x3 m4; - m4 = m2 / factor; - QVERIFY(isSame(m4, (const qreal *)m1Values)); -} - -// Test matrix division by a factor for 4x4 matrices. -void tst_QMatrixNxN::divideFactor4x4_data() -{ - // Use the same test cases as the multiplyFactor test. - multiplyFactor4x4_data(); -} -void tst_QMatrixNxN::divideFactor4x4() -{ - QFETCH(void *, m1Values); - QFETCH(qreal, factor); - QFETCH(void *, m2Values); - - if (factor == 0.0f) - return; - - QMatrix4x4 m2((const qreal *)m2Values); - - QMatrix4x4 m3; - m3 = m2; - m3 /= factor; - QVERIFY(isSame(m3, (const qreal *)m1Values)); - - QMatrix4x4 m4; - m4 = m2 / factor; - QVERIFY(isSame(m4, (const qreal *)m1Values)); -} - -// Test matrix division by a factor for 4x3 matrices. -void tst_QMatrixNxN::divideFactor4x3_data() -{ - // Use the same test cases as the multiplyFactor test. - multiplyFactor4x3_data(); -} -void tst_QMatrixNxN::divideFactor4x3() -{ - QFETCH(void *, m1Values); - QFETCH(qreal, factor); - QFETCH(void *, m2Values); - - if (factor == 0.0f) - return; - - QMatrix4x3 m2((const qreal *)m2Values); - - QMatrix4x3 m3; - m3 = m2; - m3 /= factor; - QVERIFY(isSame(m3, (const qreal *)m1Values)); - - QMatrix4x3 m4; - m4 = m2 / factor; - QVERIFY(isSame(m4, (const qreal *)m1Values)); -} - -// Test matrix negation for 2x2 matrices. -void tst_QMatrixNxN::negate2x2_data() -{ - // Use the same test cases as the multiplyFactor test. - multiplyFactor2x2_data(); -} -void tst_QMatrixNxN::negate2x2() -{ - QFETCH(void *, m1Values); - - const qreal *values = (const qreal *)m1Values; - - QMatrix2x2 m1(values); - - qreal negated[4]; - for (int index = 0; index < 4; ++index) - negated[index] = -values[index]; - - QMatrix2x2 m2; - m2 = -m1; - QVERIFY(isSame(m2, negated)); -} - -// Test matrix negation for 3x3 matrices. -void tst_QMatrixNxN::negate3x3_data() -{ - // Use the same test cases as the multiplyFactor test. - multiplyFactor3x3_data(); -} -void tst_QMatrixNxN::negate3x3() -{ - QFETCH(void *, m1Values); - - const qreal *values = (const qreal *)m1Values; - - QMatrix3x3 m1(values); - - qreal negated[9]; - for (int index = 0; index < 9; ++index) - negated[index] = -values[index]; - - QMatrix3x3 m2; - m2 = -m1; - QVERIFY(isSame(m2, negated)); -} - -// Test matrix negation for 4x4 matrices. -void tst_QMatrixNxN::negate4x4_data() -{ - // Use the same test cases as the multiplyFactor test. - multiplyFactor4x4_data(); -} -void tst_QMatrixNxN::negate4x4() -{ - QFETCH(void *, m1Values); - - const qreal *values = (const qreal *)m1Values; - - QMatrix4x4 m1(values); - - qreal negated[16]; - for (int index = 0; index < 16; ++index) - negated[index] = -values[index]; - - QMatrix4x4 m2; - m2 = -m1; - QVERIFY(isSame(m2, negated)); -} - -// Test matrix negation for 4x3 matrices. -void tst_QMatrixNxN::negate4x3_data() -{ - // Use the same test cases as the multiplyFactor test. - multiplyFactor4x3_data(); -} -void tst_QMatrixNxN::negate4x3() -{ - QFETCH(void *, m1Values); - - const qreal *values = (const qreal *)m1Values; - - QMatrix4x3 m1(values); - - qreal negated[12]; - for (int index = 0; index < 12; ++index) - negated[index] = -values[index]; - - QMatrix4x3 m2; - m2 = -m1; - QVERIFY(isSame(m2, negated)); -} - -// Matrix inverted. This is a more straight-forward implementation -// of the algorithm at http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q24 -// than the optimized version in the QMatrix4x4 code. Hopefully it is -// easier to verify that this version is the same as the reference. - -struct Matrix3 -{ - qreal v[9]; -}; -struct Matrix4 -{ - qreal v[16]; -}; - -static qreal m3Determinant(const Matrix3& m) -{ - return m.v[0] * (m.v[4] * m.v[8] - m.v[7] * m.v[5]) - - m.v[1] * (m.v[3] * m.v[8] - m.v[6] * m.v[5]) + - m.v[2] * (m.v[3] * m.v[7] - m.v[6] * m.v[4]); -} - -static bool m3Inverse(const Matrix3& min, Matrix3& mout) -{ - qreal det = m3Determinant(min); - if (det == 0.0f) - return false; - mout.v[0] = (min.v[4] * min.v[8] - min.v[5] * min.v[7]) / det; - mout.v[1] = -(min.v[1] * min.v[8] - min.v[2] * min.v[7]) / det; - mout.v[2] = (min.v[1] * min.v[5] - min.v[4] * min.v[2]) / det; - mout.v[3] = -(min.v[3] * min.v[8] - min.v[5] * min.v[6]) / det; - mout.v[4] = (min.v[0] * min.v[8] - min.v[6] * min.v[2]) / det; - mout.v[5] = -(min.v[0] * min.v[5] - min.v[3] * min.v[2]) / det; - mout.v[6] = (min.v[3] * min.v[7] - min.v[6] * min.v[4]) / det; - mout.v[7] = -(min.v[0] * min.v[7] - min.v[6] * min.v[1]) / det; - mout.v[8] = (min.v[0] * min.v[4] - min.v[1] * min.v[3]) / det; - return true; -} - -static void m3Transpose(Matrix3& m) -{ - qSwap(m.v[1], m.v[3]); - qSwap(m.v[2], m.v[6]); - qSwap(m.v[5], m.v[7]); -} - -static void m4Submatrix(const Matrix4& min, Matrix3& mout, int i, int j) -{ - for (int di = 0; di < 3; ++di) { - for (int dj = 0; dj < 3; ++dj) { - int si = di + ((di >= i) ? 1 : 0); - int sj = dj + ((dj >= j) ? 1 : 0); - mout.v[di * 3 + dj] = min.v[si * 4 + sj]; - } - } -} - -static qreal m4Determinant(const Matrix4& m) -{ - qreal det; - qreal result = 0.0f; - qreal i = 1.0f; - Matrix3 msub; - for (int n = 0; n < 4; ++n, i *= -1.0f) { - m4Submatrix(m, msub, 0, n); - det = m3Determinant(msub); - result += m.v[n] * det * i; - } - return result; -} - -static void m4Inverse(const Matrix4& min, Matrix4& mout) -{ - qreal det = m4Determinant(min); - Matrix3 msub; - for (int i = 0; i < 4; ++i) { - for (int j = 0; j < 4; ++j) { - qreal sign = 1.0f - ((i + j) % 2) * 2.0f; - m4Submatrix(min, msub, i, j); - mout.v[i + j * 4] = (m3Determinant(msub) * sign) / det; - } - } -} - -// Test matrix inverted for 4x4 matrices. -void tst_QMatrixNxN::inverted4x4_data() -{ - QTest::addColumn("m1Values"); - QTest::addColumn("m2Values"); - QTest::addColumn("invertible"); - - QTest::newRow("null") - << (void *)nullValues4 << (void *)identityValues4 << false; - - QTest::newRow("identity") - << (void *)identityValues4 << (void *)identityValues4 << true; - - QTest::newRow("unique") - << (void *)uniqueValues4 << (void *)identityValues4 << false; - - static Matrix4 const invertible = { - {5.0f, 0.0f, 0.0f, 2.0f, - 0.0f, 6.0f, 0.0f, 3.0f, - 0.0f, 0.0f, 7.0f, 4.0f, - 0.0f, 0.0f, 0.0f, 1.0f} - }; - static Matrix4 inverted; - m4Inverse(invertible, inverted); - - QTest::newRow("invertible") - << (void *)invertible.v << (void *)inverted.v << true; - - static Matrix4 const translate = { - {1.0f, 0.0f, 0.0f, 2.0f, - 0.0f, 1.0f, 0.0f, 3.0f, - 0.0f, 0.0f, 1.0f, 4.0f, - 0.0f, 0.0f, 0.0f, 1.0f} - }; - static Matrix4 const inverseTranslate = { - {1.0f, 0.0f, 0.0f, -2.0f, - 0.0f, 1.0f, 0.0f, -3.0f, - 0.0f, 0.0f, 1.0f, -4.0f, - 0.0f, 0.0f, 0.0f, 1.0f} - }; - - QTest::newRow("translate") - << (void *)translate.v << (void *)inverseTranslate.v << true; -} -void tst_QMatrixNxN::inverted4x4() -{ - QFETCH(void *, m1Values); - QFETCH(void *, m2Values); - QFETCH(bool, invertible); - - QMatrix4x4 m1((const qreal *)m1Values); - - if (invertible) - QVERIFY(m1.determinant() != 0.0f); - else - QVERIFY(m1.determinant() == 0.0f); - - Matrix4 m1alt; - memcpy(m1alt.v, (const qreal *)m1Values, sizeof(m1alt.v)); - - QCOMPARE((float)(m1.determinant()), (float)(m4Determinant(m1alt))); - - QMatrix4x4 m2; - bool inv; - m2 = m1.inverted(&inv); - QVERIFY(isSame(m2, (const qreal *)m2Values)); - - if (invertible) { - QVERIFY(inv); - - Matrix4 m2alt; - m4Inverse(m1alt, m2alt); - QVERIFY(isSame(m2, m2alt.v)); - - QMatrix4x4 m3; - m3 = m1 * m2; - QVERIFY(isIdentity(m3)); - - QMatrix4x4 m4; - m4 = m2 * m1; - QVERIFY(isIdentity(m4)); - } else { - QVERIFY(!inv); - } - - // Test again, after inferring the special matrix type. - m1.inferSpecialType(); - m2 = m1.inverted(&inv); - QVERIFY(isSame(m2, (const qreal *)m2Values)); - QCOMPARE(inv, invertible); -} - -void tst_QMatrixNxN::orthonormalInverse4x4() -{ - QMatrix4x4 m1; - QVERIFY(matrixFuzzyCompare(m1.inverted(), m1)); - - QMatrix4x4 m2; - m2.rotate(45.0, 1.0, 0.0, 0.0); - m2.translate(10.0, 0.0, 0.0); - - // Use inferSpecialType() to drop the internal flags that - // mark the matrix as orthonormal. This will force inverted() - // to compute m3.inverted() the long way. We can then compare - // the result to what the faster algorithm produces on m2. - QMatrix4x4 m3 = m2; - m3.inferSpecialType(); - bool invertible; - QVERIFY(matrixFuzzyCompare(m2.inverted(&invertible), m3.inverted())); - QVERIFY(invertible); - - QMatrix4x4 m4; - m4.rotate(45.0, 0.0, 1.0, 0.0); - QMatrix4x4 m5 = m4; - m5.inferSpecialType(); - QVERIFY(matrixFuzzyCompare(m4.inverted(), m5.inverted())); - - QMatrix4x4 m6; - m1.rotate(88, 0.0, 0.0, 1.0); - m1.translate(-20.0, 20.0, 15.0); - m1.rotate(25, 1.0, 0.0, 0.0); - QMatrix4x4 m7 = m6; - m7.inferSpecialType(); - QVERIFY(matrixFuzzyCompare(m6.inverted(), m7.inverted())); -} - -// Test the generation and use of 4x4 scale matrices. -void tst_QMatrixNxN::scale4x4_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::addColumn("z"); - QTest::addColumn("resultValues"); - - static const qreal nullScale[] = - {0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (void *)nullScale; - - QTest::newRow("identity") - << (qreal)1.0f << (qreal)1.0f << (qreal)1.0f << (void *)identityValues4; - - static const qreal doubleScale[] = - {2.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 2.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 2.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("double") - << (qreal)2.0f << (qreal)2.0f << (qreal)2.0f << (void *)doubleScale; - - static const qreal complexScale[] = - {2.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 11.0f, 0.0f, 0.0f, - 0.0f, 0.0f, -6.5f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("complex") - << (qreal)2.0f << (qreal)11.0f << (qreal)-6.5f << (void *)complexScale; - - static const qreal complexScale2D[] = - {2.0f, 0.0f, 0.0f, 0.0f, - 0.0f, -11.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("complex2D") - << (qreal)2.0f << (qreal)-11.0f << (qreal)1.0f << (void *)complexScale2D; -} -void tst_QMatrixNxN::scale4x4() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - QFETCH(void *, resultValues); - - QMatrix4x4 result((const qreal *)resultValues); - - QMatrix4x4 m1; - m1.scale(QVector3D(x, y, z)); - QVERIFY(isSame(m1, (const qreal *)resultValues)); - - QMatrix4x4 m2; - m2.scale(x, y, z); - QVERIFY(isSame(m2, (const qreal *)resultValues)); - - if (z == 1.0f) { - QMatrix4x4 m2b; - m2b.scale(x, y); - QVERIFY(m2b == m2); - } - - QVector3D v1(2.0f, 3.0f, -4.0f); - QVector3D v2 = m1 * v1; - QCOMPARE(v2.x(), (qreal)(2.0f * x)); - QCOMPARE(v2.y(), (qreal)(3.0f * y)); - QCOMPARE(v2.z(), (qreal)(-4.0f * z)); - - v2 = v1 * m1; - QCOMPARE(v2.x(), (qreal)(2.0f * x)); - QCOMPARE(v2.y(), (qreal)(3.0f * y)); - QCOMPARE(v2.z(), (qreal)(-4.0f * z)); - - QVector4D v3(2.0f, 3.0f, -4.0f, 34.0f); - QVector4D v4 = m1 * v3; - QCOMPARE(v4.x(), (qreal)(2.0f * x)); - QCOMPARE(v4.y(), (qreal)(3.0f * y)); - QCOMPARE(v4.z(), (qreal)(-4.0f * z)); - QCOMPARE(v4.w(), (qreal)34.0f); - - v4 = v3 * m1; - QCOMPARE(v4.x(), (qreal)(2.0f * x)); - QCOMPARE(v4.y(), (qreal)(3.0f * y)); - QCOMPARE(v4.z(), (qreal)(-4.0f * z)); - QCOMPARE(v4.w(), (qreal)34.0f); - - QPoint p1(2, 3); - QPoint p2 = m1 * p1; - QCOMPARE(p2.x(), (int)(2.0f * x)); - QCOMPARE(p2.y(), (int)(3.0f * y)); - - p2 = p1 * m1; - QCOMPARE(p2.x(), (int)(2.0f * x)); - QCOMPARE(p2.y(), (int)(3.0f * y)); - - QPointF p3(2.0f, 3.0f); - QPointF p4 = m1 * p3; - QCOMPARE(p4.x(), (qreal)(2.0f * x)); - QCOMPARE(p4.y(), (qreal)(3.0f * y)); - - p4 = p3 * m1; - QCOMPARE(p4.x(), (qreal)(2.0f * x)); - QCOMPARE(p4.y(), (qreal)(3.0f * y)); - - QMatrix4x4 m3(uniqueValues4); - QMatrix4x4 m4(m3); - m4.scale(x, y, z); - QVERIFY(m4 == m3 * m1); - - if (x == y && y == z) { - QMatrix4x4 m5; - m5.scale(x); - QVERIFY(isSame(m5, (const qreal *)resultValues)); - } - - if (z == 1.0f) { - QMatrix4x4 m4b(m3); - m4b.scale(x, y); - QVERIFY(m4b == m4); - } - - // Test coverage when the special matrix type is unknown. - - QMatrix4x4 m6; - m6(0, 0) = 1.0f; - m6.scale(QVector3D(x, y, z)); - QVERIFY(isSame(m6, (const qreal *)resultValues)); - - QMatrix4x4 m7; - m7(0, 0) = 1.0f; - m7.scale(x, y, z); - QVERIFY(isSame(m7, (const qreal *)resultValues)); - - if (x == y && y == z) { - QMatrix4x4 m8; - m8(0, 0) = 1.0f; - m8.scale(x); - QVERIFY(isSame(m8, (const qreal *)resultValues)); - - m8.inferSpecialType(); - m8.scale(1.0f); - QVERIFY(isSame(m8, (const qreal *)resultValues)); - - QMatrix4x4 m9; - m9.translate(0.0f, 0.0f, 0.0f); - m9.scale(x); - QVERIFY(isSame(m9, (const qreal *)resultValues)); - } -} - -// Test the generation and use of 4x4 translation matrices. -void tst_QMatrixNxN::translate4x4_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::addColumn("z"); - QTest::addColumn("resultValues"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (void *)identityValues4; - - static const qreal identityTranslate[] = - {1.0f, 0.0f, 0.0f, 1.0f, - 0.0f, 1.0f, 0.0f, 1.0f, - 0.0f, 0.0f, 1.0f, 1.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("identity") - << (qreal)1.0f << (qreal)1.0f << (qreal)1.0f << (void *)identityTranslate; - - static const qreal complexTranslate[] = - {1.0f, 0.0f, 0.0f, 2.0f, - 0.0f, 1.0f, 0.0f, 11.0f, - 0.0f, 0.0f, 1.0f, -6.5f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("complex") - << (qreal)2.0f << (qreal)11.0f << (qreal)-6.5f << (void *)complexTranslate; - - static const qreal complexTranslate2D[] = - {1.0f, 0.0f, 0.0f, 2.0f, - 0.0f, 1.0f, 0.0f, -11.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("complex2D") - << (qreal)2.0f << (qreal)-11.0f << (qreal)0.0f << (void *)complexTranslate2D; -} -void tst_QMatrixNxN::translate4x4() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - QFETCH(void *, resultValues); - - QMatrix4x4 result((const qreal *)resultValues); - - QMatrix4x4 m1; - m1.translate(QVector3D(x, y, z)); - QVERIFY(isSame(m1, (const qreal *)resultValues)); - - QMatrix4x4 m2; - m2.translate(x, y, z); - QVERIFY(isSame(m2, (const qreal *)resultValues)); - - if (z == 0.0f) { - QMatrix4x4 m2b; - m2b.translate(x, y); - QVERIFY(m2b == m2); - } - - QVector3D v1(2.0f, 3.0f, -4.0f); - QVector3D v2 = m1 * v1; - QCOMPARE(v2.x(), (qreal)(2.0f + x)); - QCOMPARE(v2.y(), (qreal)(3.0f + y)); - QCOMPARE(v2.z(), (qreal)(-4.0f + z)); - - QVector4D v3(2.0f, 3.0f, -4.0f, 1.0f); - QVector4D v4 = m1 * v3; - QCOMPARE(v4.x(), (qreal)(2.0f + x)); - QCOMPARE(v4.y(), (qreal)(3.0f + y)); - QCOMPARE(v4.z(), (qreal)(-4.0f + z)); - QCOMPARE(v4.w(), (qreal)1.0f); - - QVector4D v5(2.0f, 3.0f, -4.0f, 34.0f); - QVector4D v6 = m1 * v5; - QCOMPARE(v6.x(), (qreal)(2.0f + x * 34.0f)); - QCOMPARE(v6.y(), (qreal)(3.0f + y * 34.0f)); - QCOMPARE(v6.z(), (qreal)(-4.0f + z * 34.0f)); - QCOMPARE(v6.w(), (qreal)34.0f); - - QPoint p1(2, 3); - QPoint p2 = m1 * p1; - QCOMPARE(p2.x(), (int)(2.0f + x)); - QCOMPARE(p2.y(), (int)(3.0f + y)); - - QPointF p3(2.0f, 3.0f); - QPointF p4 = m1 * p3; - QCOMPARE(p4.x(), (qreal)(2.0f + x)); - QCOMPARE(p4.y(), (qreal)(3.0f + y)); - - QMatrix4x4 m3(uniqueValues4); - QMatrix4x4 m4(m3); - m4.translate(x, y, z); - QVERIFY(m4 == m3 * m1); - - if (z == 0.0f) { - QMatrix4x4 m4b(m3); - m4b.translate(x, y); - QVERIFY(m4b == m4); - } -} - -// Test the generation and use of 4x4 rotation matrices. -void tst_QMatrixNxN::rotate4x4_data() -{ - QTest::addColumn("angle"); - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::addColumn("z"); - QTest::addColumn("resultValues"); - - static const qreal nullRotate[] = - {0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("null") - << (qreal)90.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (void *)nullRotate; - - static const qreal noRotate[] = - {1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("zerodegrees") - << (qreal)0.0f - << (qreal)2.0f << (qreal)3.0f << (qreal)-4.0f - << (void *)noRotate; - - static const qreal xRotate[] = - {1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, -1.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("xrotate") - << (qreal)90.0f - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (void *)xRotate; - - static const qreal xRotateNeg[] = - {1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, -1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("-xrotate") - << (qreal)90.0f - << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f - << (void *)xRotateNeg; - - static const qreal yRotate[] = - {0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - -1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("yrotate") - << (qreal)90.0f - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f - << (void *)yRotate; - - static const qreal yRotateNeg[] = - {0.0f, 0.0f, -1.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("-yrotate") - << (qreal)90.0f - << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f - << (void *)yRotateNeg; - - static const qreal zRotate[] = - {0.0f, -1.0f, 0.0f, 0.0f, - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("zrotate") - << (qreal)90.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (void *)zRotate; - - static const qreal zRotateNeg[] = - {0.0f, 1.0f, 0.0f, 0.0f, - -1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - QTest::newRow("-zrotate") - << (qreal)90.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f - << (void *)zRotateNeg; - - // Algorithm from http://en.wikipedia.org/wiki/Rotation_matrix. - // Deliberately different from the one in the code for cross-checking. - static qreal complexRotate[16]; - qreal x = 1.0f; - qreal y = 2.0f; - qreal z = -6.0f; - qreal angle = -45.0f; - qreal c = qCos(angle * M_PI / 180.0f); - qreal s = qSin(angle * M_PI / 180.0f); - qreal len = qSqrt(x * x + y * y + z * z); - qreal xu = x / len; - qreal yu = y / len; - qreal zu = z / len; - complexRotate[0] = (qreal)((1 - xu * xu) * c + xu * xu); - complexRotate[1] = (qreal)(-zu * s - xu * yu * c + xu * yu); - complexRotate[2] = (qreal)(yu * s - xu * zu * c + xu * zu); - complexRotate[3] = 0; - complexRotate[4] = (qreal)(zu * s - xu * yu * c + xu * yu); - complexRotate[5] = (qreal)((1 - yu * yu) * c + yu * yu); - complexRotate[6] = (qreal)(-xu * s - yu * zu * c + yu * zu); - complexRotate[7] = 0; - complexRotate[8] = (qreal)(-yu * s - xu * zu * c + xu * zu); - complexRotate[9] = (qreal)(xu * s - yu * zu * c + yu * zu); - complexRotate[10] = (qreal)((1 - zu * zu) * c + zu * zu); - complexRotate[11] = 0; - complexRotate[12] = 0; - complexRotate[13] = 0; - complexRotate[14] = 0; - complexRotate[15] = 1; - - QTest::newRow("complex") - << (qreal)angle - << (qreal)x << (qreal)y << (qreal)z - << (void *)complexRotate; -} -void tst_QMatrixNxN::rotate4x4() -{ - QFETCH(qreal, angle); - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - QFETCH(void *, resultValues); - - QMatrix4x4 m1; - m1.rotate(angle, QVector3D(x, y, z)); - QVERIFY(isSame(m1, (const qreal *)resultValues)); - - QMatrix4x4 m2; - m2.rotate(angle, x, y, z); - QVERIFY(isSame(m2, (const qreal *)resultValues)); - - QMatrix4x4 m3(uniqueValues4); - QMatrix4x4 m4(m3); - m4.rotate(angle, x, y, z); - QVERIFY(matrixFuzzyCompare(m4, m3 * m1)); - - // Null vectors don't make sense for quaternion rotations. - if (x != 0 || y != 0 || z != 0) { - QMatrix4x4 m5; - m5.rotate(QQuaternion::fromAxisAndAngle(QVector3D(x, y, z), angle)); - QVERIFY(isSame(m5, (const qreal *)resultValues)); - } - -#define ROTATE4(xin,yin,zin,win,xout,yout,zout,wout) \ - do { \ - xout = ((const qreal *)resultValues)[0] * xin + \ - ((const qreal *)resultValues)[1] * yin + \ - ((const qreal *)resultValues)[2] * zin + \ - ((const qreal *)resultValues)[3] * win; \ - yout = ((const qreal *)resultValues)[4] * xin + \ - ((const qreal *)resultValues)[5] * yin + \ - ((const qreal *)resultValues)[6] * zin + \ - ((const qreal *)resultValues)[7] * win; \ - zout = ((const qreal *)resultValues)[8] * xin + \ - ((const qreal *)resultValues)[9] * yin + \ - ((const qreal *)resultValues)[10] * zin + \ - ((const qreal *)resultValues)[11] * win; \ - wout = ((const qreal *)resultValues)[12] * xin + \ - ((const qreal *)resultValues)[13] * yin + \ - ((const qreal *)resultValues)[14] * zin + \ - ((const qreal *)resultValues)[15] * win; \ - } while (0) - - // Rotate various test vectors using the straight-forward approach. - qreal v1x, v1y, v1z, v1w; - ROTATE4(2.0f, 3.0f, -4.0f, 1.0f, v1x, v1y, v1z, v1w); - v1x /= v1w; - v1y /= v1w; - v1z /= v1w; - qreal v3x, v3y, v3z, v3w; - ROTATE4(2.0f, 3.0f, -4.0f, 1.0f, v3x, v3y, v3z, v3w); - qreal v5x, v5y, v5z, v5w; - ROTATE4(2.0f, 3.0f, -4.0f, 34.0f, v5x, v5y, v5z, v5w); - qreal p1x, p1y, p1z, p1w; - ROTATE4(2.0f, 3.0f, 0.0f, 1.0f, p1x, p1y, p1z, p1w); - p1x /= p1w; - p1y /= p1w; - p1z /= p1w; - - QVector3D v1(2.0f, 3.0f, -4.0f); - QVector3D v2 = m1 * v1; - QVERIFY(fuzzyCompare(v2.x(), v1x)); - QVERIFY(fuzzyCompare(v2.y(), v1y)); - QVERIFY(fuzzyCompare(v2.z(), v1z)); - - QVector4D v3(2.0f, 3.0f, -4.0f, 1.0f); - QVector4D v4 = m1 * v3; - QVERIFY(fuzzyCompare(v4.x(), v3x)); - QVERIFY(fuzzyCompare(v4.y(), v3y)); - QVERIFY(fuzzyCompare(v4.z(), v3z)); - QVERIFY(fuzzyCompare(v4.w(), v3w)); - - QVector4D v5(2.0f, 3.0f, -4.0f, 34.0f); - QVector4D v6 = m1 * v5; - QVERIFY(fuzzyCompare(v6.x(), v5x)); - QVERIFY(fuzzyCompare(v6.y(), v5y)); - QVERIFY(fuzzyCompare(v6.z(), v5z)); - QVERIFY(fuzzyCompare(v6.w(), v5w)); - - QPoint p1(2, 3); - QPoint p2 = m1 * p1; - QCOMPARE(p2.x(), qRound(p1x)); - QCOMPARE(p2.y(), qRound(p1y)); - - QPointF p3(2.0f, 3.0f); - QPointF p4 = m1 * p3; - QVERIFY(fuzzyCompare((float)(p4.x()), p1x)); - QVERIFY(fuzzyCompare((float)(p4.y()), p1y)); - - if (x != 0 || y != 0 || z != 0) { - QQuaternion q = QQuaternion::fromAxisAndAngle(QVector3D(x, y, z), angle); - QVector3D vq = q.rotateVector(v1); - QVERIFY(fuzzyCompare(vq.x(), v1x)); - QVERIFY(fuzzyCompare(vq.y(), v1y)); - QVERIFY(fuzzyCompare(vq.z(), v1z)); - } -} - -static bool isSame(const QMatrix3x3& m1, const Matrix3& m2) -{ - for (int row = 0; row < 3; ++row) { - for (int col = 0; col < 3; ++col) { - if (!fuzzyCompare(m1(row, col), m2.v[row * 3 + col])) - return false; - } - } - return true; -} - -// Test the computation of normal matrices from 4x4 transformation matrices. -void tst_QMatrixNxN::normalMatrix_data() -{ - QTest::addColumn("mValues"); - - QTest::newRow("identity") - << (void *)identityValues4; - QTest::newRow("unique") - << (void *)uniqueValues4; // Not invertible because determinant == 0. - - static qreal const translateValues[16] = - {1.0f, 0.0f, 0.0f, 4.0f, - 0.0f, 1.0f, 0.0f, 5.0f, - 0.0f, 0.0f, 1.0f, -3.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const scaleValues[16] = - {2.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 7.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 9.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const bothValues[16] = - {2.0f, 0.0f, 0.0f, 4.0f, - 0.0f, 7.0f, 0.0f, 5.0f, - 0.0f, 0.0f, 9.0f, -3.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const nullScaleValues1[16] = - {0.0f, 0.0f, 0.0f, 4.0f, - 0.0f, 7.0f, 0.0f, 5.0f, - 0.0f, 0.0f, 9.0f, -3.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const nullScaleValues2[16] = - {2.0f, 0.0f, 0.0f, 4.0f, - 0.0f, 0.0f, 0.0f, 5.0f, - 0.0f, 0.0f, 9.0f, -3.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const nullScaleValues3[16] = - {2.0f, 0.0f, 0.0f, 4.0f, - 0.0f, 7.0f, 0.0f, 5.0f, - 0.0f, 0.0f, 0.0f, -3.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - - QTest::newRow("translate") << (void *)translateValues; - QTest::newRow("scale") << (void *)scaleValues; - QTest::newRow("both") << (void *)bothValues; - QTest::newRow("null scale 1") << (void *)nullScaleValues1; - QTest::newRow("null scale 2") << (void *)nullScaleValues2; - QTest::newRow("null scale 3") << (void *)nullScaleValues3; -} -void tst_QMatrixNxN::normalMatrix() -{ - QFETCH(void *, mValues); - const qreal *values = (const qreal *)mValues; - - // Compute the expected answer the long way. - Matrix3 min; - Matrix3 answer; - min.v[0] = values[0]; - min.v[1] = values[1]; - min.v[2] = values[2]; - min.v[3] = values[4]; - min.v[4] = values[5]; - min.v[5] = values[6]; - min.v[6] = values[8]; - min.v[7] = values[9]; - min.v[8] = values[10]; - bool invertible = m3Inverse(min, answer); - m3Transpose(answer); - - // Perform the test. - QMatrix4x4 m1(values); - QMatrix3x3 n1 = m1.normalMatrix(); - - if (invertible) - QVERIFY(::isSame(n1, answer)); - else - QVERIFY(isIdentity(n1)); - - // Perform the test again, after inferring special matrix types. - // This tests the optimized paths in the normalMatrix() function. - m1.inferSpecialType(); - n1 = m1.normalMatrix(); - - if (invertible) - QVERIFY(::isSame(n1, answer)); - else - QVERIFY(isIdentity(n1)); -} - -// Test optimized transformations on 4x4 matrices. -void tst_QMatrixNxN::optimizedTransforms() -{ - static qreal const translateValues[16] = - {1.0f, 0.0f, 0.0f, 4.0f, - 0.0f, 1.0f, 0.0f, 5.0f, - 0.0f, 0.0f, 1.0f, -3.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const translateDoubleValues[16] = - {1.0f, 0.0f, 0.0f, 8.0f, - 0.0f, 1.0f, 0.0f, 10.0f, - 0.0f, 0.0f, 1.0f, -6.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const scaleValues[16] = - {2.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 7.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 9.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const scaleDoubleValues[16] = - {4.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 49.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 81.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const bothValues[16] = - {2.0f, 0.0f, 0.0f, 4.0f, - 0.0f, 7.0f, 0.0f, 5.0f, - 0.0f, 0.0f, 9.0f, -3.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const bothReverseValues[16] = - {2.0f, 0.0f, 0.0f, 4.0f * 2.0f, - 0.0f, 7.0f, 0.0f, 5.0f * 7.0f, - 0.0f, 0.0f, 9.0f, -3.0f * 9.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const bothThenTranslateValues[16] = - {2.0f, 0.0f, 0.0f, 4.0f + 2.0f * 4.0f, - 0.0f, 7.0f, 0.0f, 5.0f + 7.0f * 5.0f, - 0.0f, 0.0f, 9.0f, -3.0f + 9.0f * -3.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - static qreal const bothThenScaleValues[16] = - {4.0f, 0.0f, 0.0f, 4.0f, - 0.0f, 49.0f, 0.0f, 5.0f, - 0.0f, 0.0f, 81.0f, -3.0f, - 0.0f, 0.0f, 0.0f, 1.0f}; - - QMatrix4x4 translate(translateValues); - QMatrix4x4 scale(scaleValues); - QMatrix4x4 both(bothValues); - - QMatrix4x4 m1; - m1.translate(4.0f, 5.0f, -3.0f); - QVERIFY(isSame(m1, translateValues)); - m1.translate(4.0f, 5.0f, -3.0f); - QVERIFY(isSame(m1, translateDoubleValues)); - - QMatrix4x4 m2; - m2.translate(QVector3D(4.0f, 5.0f, -3.0f)); - QVERIFY(isSame(m2, translateValues)); - m2.translate(QVector3D(4.0f, 5.0f, -3.0f)); - QVERIFY(isSame(m2, translateDoubleValues)); - - QMatrix4x4 m3; - m3.scale(2.0f, 7.0f, 9.0f); - QVERIFY(isSame(m3, scaleValues)); - m3.scale(2.0f, 7.0f, 9.0f); - QVERIFY(isSame(m3, scaleDoubleValues)); - - QMatrix4x4 m4; - m4.scale(QVector3D(2.0f, 7.0f, 9.0f)); - QVERIFY(isSame(m4, scaleValues)); - m4.scale(QVector3D(2.0f, 7.0f, 9.0f)); - QVERIFY(isSame(m4, scaleDoubleValues)); - - QMatrix4x4 m5; - m5.translate(4.0f, 5.0f, -3.0f); - m5.scale(2.0f, 7.0f, 9.0f); - QVERIFY(isSame(m5, bothValues)); - m5.translate(4.0f, 5.0f, -3.0f); - QVERIFY(isSame(m5, bothThenTranslateValues)); - - QMatrix4x4 m6; - m6.translate(QVector3D(4.0f, 5.0f, -3.0f)); - m6.scale(QVector3D(2.0f, 7.0f, 9.0f)); - QVERIFY(isSame(m6, bothValues)); - m6.translate(QVector3D(4.0f, 5.0f, -3.0f)); - QVERIFY(isSame(m6, bothThenTranslateValues)); - - QMatrix4x4 m7; - m7.scale(2.0f, 7.0f, 9.0f); - m7.translate(4.0f, 5.0f, -3.0f); - QVERIFY(isSame(m7, bothReverseValues)); - - QMatrix4x4 m8; - m8.scale(QVector3D(2.0f, 7.0f, 9.0f)); - m8.translate(QVector3D(4.0f, 5.0f, -3.0f)); - QVERIFY(isSame(m8, bothReverseValues)); - - QMatrix4x4 m9; - m9.translate(4.0f, 5.0f, -3.0f); - m9.scale(2.0f, 7.0f, 9.0f); - QVERIFY(isSame(m9, bothValues)); - m9.scale(2.0f, 7.0f, 9.0f); - QVERIFY(isSame(m9, bothThenScaleValues)); - - QMatrix4x4 m10; - m10.translate(QVector3D(4.0f, 5.0f, -3.0f)); - m10.scale(QVector3D(2.0f, 7.0f, 9.0f)); - QVERIFY(isSame(m10, bothValues)); - m10.scale(QVector3D(2.0f, 7.0f, 9.0f)); - QVERIFY(isSame(m10, bothThenScaleValues)); -} - -// Test orthographic projections. -void tst_QMatrixNxN::ortho() -{ - QMatrix4x4 m1; - m1.ortho(QRect(0, 0, 300, 150)); - QPointF p1 = m1 * QPointF(0, 0); - QPointF p2 = m1 * QPointF(300, 0); - QPointF p3 = m1 * QPointF(0, 150); - QPointF p4 = m1 * QPointF(300, 150); - QVector3D p5 = m1 * QVector3D(300, 150, 1); - QVERIFY(fuzzyCompare(p1.x(), -1.0)); - QVERIFY(fuzzyCompare(p1.y(), 1.0)); - QVERIFY(fuzzyCompare(p2.x(), 1.0)); - QVERIFY(fuzzyCompare(p2.y(), 1.0)); - QVERIFY(fuzzyCompare(p3.x(), -1.0)); - QVERIFY(fuzzyCompare(p3.y(), -1.0)); - QVERIFY(fuzzyCompare(p4.x(), 1.0)); - QVERIFY(fuzzyCompare(p4.y(), -1.0)); - QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0)); - QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0)); - QVERIFY(fuzzyCompare(p5.z(), (qreal)-1.0)); - - QMatrix4x4 m2; - m2.ortho(QRectF(0, 0, 300, 150)); - p1 = m2 * QPointF(0, 0); - p2 = m2 * QPointF(300, 0); - p3 = m2 * QPointF(0, 150); - p4 = m2 * QPointF(300, 150); - p5 = m2 * QVector3D(300, 150, 1); - QVERIFY(fuzzyCompare(p1.x(), -1.0)); - QVERIFY(fuzzyCompare(p1.y(), 1.0)); - QVERIFY(fuzzyCompare(p2.x(), 1.0)); - QVERIFY(fuzzyCompare(p2.y(), 1.0)); - QVERIFY(fuzzyCompare(p3.x(), -1.0)); - QVERIFY(fuzzyCompare(p3.y(), -1.0)); - QVERIFY(fuzzyCompare(p4.x(), 1.0)); - QVERIFY(fuzzyCompare(p4.y(), -1.0)); - QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0)); - QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0)); - QVERIFY(fuzzyCompare(p5.z(), (qreal)-1.0)); - - QMatrix4x4 m3; - m3.ortho(0, 300, 150, 0, -1, 1); - p1 = m3 * QPointF(0, 0); - p2 = m3 * QPointF(300, 0); - p3 = m3 * QPointF(0, 150); - p4 = m3 * QPointF(300, 150); - p5 = m3 * QVector3D(300, 150, 1); - QVERIFY(fuzzyCompare(p1.x(), -1.0)); - QVERIFY(fuzzyCompare(p1.y(), 1.0)); - QVERIFY(fuzzyCompare(p2.x(), 1.0)); - QVERIFY(fuzzyCompare(p2.y(), 1.0)); - QVERIFY(fuzzyCompare(p3.x(), -1.0)); - QVERIFY(fuzzyCompare(p3.y(), -1.0)); - QVERIFY(fuzzyCompare(p4.x(), 1.0)); - QVERIFY(fuzzyCompare(p4.y(), -1.0)); - QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0)); - QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0)); - QVERIFY(fuzzyCompare(p5.z(), (qreal)-1.0)); - - QMatrix4x4 m4; - m4.ortho(0, 300, 150, 0, -2, 3); - p1 = m4 * QPointF(0, 0); - p2 = m4 * QPointF(300, 0); - p3 = m4 * QPointF(0, 150); - p4 = m4 * QPointF(300, 150); - p5 = m4 * QVector3D(300, 150, 1); - QVERIFY(fuzzyCompare(p1.x(), -1.0)); - QVERIFY(fuzzyCompare(p1.y(), 1.0)); - QVERIFY(fuzzyCompare(p2.x(), 1.0)); - QVERIFY(fuzzyCompare(p2.y(), 1.0)); - QVERIFY(fuzzyCompare(p3.x(), -1.0)); - QVERIFY(fuzzyCompare(p3.y(), -1.0)); - QVERIFY(fuzzyCompare(p4.x(), 1.0)); - QVERIFY(fuzzyCompare(p4.y(), -1.0)); - QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0)); - QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0)); - QVERIFY(fuzzyCompare(p5.z(), (qreal)-0.6)); - - // An empty view volume should leave the matrix alone. - QMatrix4x4 m5; - m5.ortho(0, 0, 150, 0, -2, 3); - QVERIFY(m5.isIdentity()); - m5.ortho(0, 300, 150, 150, -2, 3); - QVERIFY(m5.isIdentity()); - m5.ortho(0, 300, 150, 0, 2, 2); - QVERIFY(m5.isIdentity()); -} - -// Test perspective frustum projections. -void tst_QMatrixNxN::frustum() -{ - QMatrix4x4 m1; - m1.frustum(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f); - QVector3D p1 = m1 * QVector3D(-1.0f, -1.0f, 1.0f); - QVector3D p2 = m1 * QVector3D(1.0f, -1.0f, 1.0f); - QVector3D p3 = m1 * QVector3D(-1.0f, 1.0f, 1.0f); - QVector3D p4 = m1 * QVector3D(1.0f, 1.0f, 1.0f); - QVector3D p5 = m1 * QVector3D(0.0f, 0.0f, 2.0f); - QVERIFY(fuzzyCompare(p1.x(), -1.0f)); - QVERIFY(fuzzyCompare(p1.y(), -1.0f)); - QVERIFY(fuzzyCompare(p1.z(), -1.0f)); - QVERIFY(fuzzyCompare(p2.x(), 1.0f)); - QVERIFY(fuzzyCompare(p2.y(), -1.0f)); - QVERIFY(fuzzyCompare(p2.z(), -1.0f)); - QVERIFY(fuzzyCompare(p3.x(), -1.0f)); - QVERIFY(fuzzyCompare(p3.y(), 1.0f)); - QVERIFY(fuzzyCompare(p3.z(), -1.0f)); - QVERIFY(fuzzyCompare(p4.x(), 1.0f)); - QVERIFY(fuzzyCompare(p4.y(), 1.0f)); - QVERIFY(fuzzyCompare(p4.z(), -1.0f)); - QVERIFY(fuzzyCompare(p5.x(), 0.0f)); - QVERIFY(fuzzyCompare(p5.y(), 0.0f)); - QVERIFY(fuzzyCompare(p5.z(), -0.5f)); - - // An empty view volume should leave the matrix alone. - QMatrix4x4 m5; - m5.frustum(0, 0, 150, 0, -2, 3); - QVERIFY(m5.isIdentity()); - m5.frustum(0, 300, 150, 150, -2, 3); - QVERIFY(m5.isIdentity()); - m5.frustum(0, 300, 150, 0, 2, 2); - QVERIFY(m5.isIdentity()); -} - -// Test perspective field-of-view projections. -void tst_QMatrixNxN::perspective() -{ - QMatrix4x4 m1; - m1.perspective(45.0f, 1.0f, -1.0f, 1.0f); - QVector3D p1 = m1 * QVector3D(-1.0f, -1.0f, 1.0f); - QVector3D p2 = m1 * QVector3D(1.0f, -1.0f, 1.0f); - QVector3D p3 = m1 * QVector3D(-1.0f, 1.0f, 1.0f); - QVector3D p4 = m1 * QVector3D(1.0f, 1.0f, 1.0f); - QVector3D p5 = m1 * QVector3D(0.0f, 0.0f, 2.0f); - QVERIFY(fuzzyCompare(p1.x(), 2.41421)); - QVERIFY(fuzzyCompare(p1.y(), 2.41421)); - QVERIFY(fuzzyCompare(p1.z(), -1)); - QVERIFY(fuzzyCompare(p2.x(), -2.41421)); - QVERIFY(fuzzyCompare(p2.y(), 2.41421)); - QVERIFY(fuzzyCompare(p2.z(), -1.0f)); - QVERIFY(fuzzyCompare(p3.x(), 2.41421)); - QVERIFY(fuzzyCompare(p3.y(), -2.41421)); - QVERIFY(fuzzyCompare(p3.z(), -1.0f)); - QVERIFY(fuzzyCompare(p4.x(), -2.41421)); - QVERIFY(fuzzyCompare(p4.y(), -2.41421)); - QVERIFY(fuzzyCompare(p4.z(), -1.0f)); - QVERIFY(fuzzyCompare(p5.x(), 0.0f)); - QVERIFY(fuzzyCompare(p5.y(), 0.0f)); - QVERIFY(fuzzyCompare(p5.z(), -0.5f)); - - // An empty view volume should leave the matrix alone. - QMatrix4x4 m5; - m5.perspective(45.0f, 1.0f, 0.0f, 0.0f); - QVERIFY(m5.isIdentity()); - m5.perspective(45.0f, 0.0f, -1.0f, 1.0f); - QVERIFY(m5.isIdentity()); - m5.perspective(0.0f, 1.0f, -1.0f, 1.0f); - QVERIFY(m5.isIdentity()); -} - -// Test left-handed vs right-handed coordinate flipping. -void tst_QMatrixNxN::flipCoordinates() -{ - QMatrix4x4 m1; - m1.flipCoordinates(); - QVector3D p1 = m1 * QVector3D(2, 3, 4); - QVERIFY(p1 == QVector3D(2, -3, -4)); - - QMatrix4x4 m2; - m2.scale(2.0f, 3.0f, 1.0f); - m2.flipCoordinates(); - QVector3D p2 = m2 * QVector3D(2, 3, 4); - QVERIFY(p2 == QVector3D(4, -9, -4)); - - QMatrix4x4 m3; - m3.translate(2.0f, 3.0f, 1.0f); - m3.flipCoordinates(); - QVector3D p3 = m3 * QVector3D(2, 3, 4); - QVERIFY(p3 == QVector3D(4, 0, -3)); - - QMatrix4x4 m4; - m4.rotate(90.0f, 0.0f, 0.0f, 1.0f); - m4.flipCoordinates(); - QVector3D p4 = m4 * QVector3D(2, 3, 4); - QVERIFY(p4 == QVector3D(3, 2, -4)); -} - -// Test conversion of generic matrices to and from the non-generic types. -void tst_QMatrixNxN::convertGeneric() -{ - QMatrix4x3 m1(uniqueValues4x3); - - static qreal const unique4x4[16] = { - 1.0f, 2.0f, 3.0f, 4.0f, - 5.0f, 6.0f, 7.0f, 8.0f, - 9.0f, 10.0f, 11.0f, 12.0f, - 0.0f, 0.0f, 0.0f, 1.0f - }; -#if !defined(QT_NO_MEMBER_TEMPLATES) - QMatrix4x4 m4(m1); - QVERIFY(isSame(m4, unique4x4)); -#endif - QMatrix4x4 m5 = qGenericMatrixToMatrix4x4(m1); - QVERIFY(isSame(m5, unique4x4)); - - static qreal const conv4x4[12] = { - 1.0f, 2.0f, 3.0f, 4.0f, - 5.0f, 6.0f, 7.0f, 8.0f, - 9.0f, 10.0f, 11.0f, 12.0f - }; - QMatrix4x4 m9(uniqueValues4); -#if !defined(QT_NO_MEMBER_TEMPLATES) - QMatrix4x3 m10 = m9.toGenericMatrix<4, 3>(); - QVERIFY(isSame(m10, conv4x4)); -#endif - - QMatrix4x3 m11 = qGenericMatrixFromMatrix4x4<4, 3>(m9); - QVERIFY(isSame(m11, conv4x4)); -} - -void tst_QMatrixNxN::extractAxisRotation_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::addColumn("z"); - QTest::addColumn("angle"); - - QTest::newRow("1, 0, 0, 0 deg") << 1.0f << 0.0f << 0.0f << 0.0f; - QTest::newRow("1, 0, 0, 90 deg") << 1.0f << 0.0f << 0.0f << 90.0f; - QTest::newRow("1, 0, 0, 270 deg") << 1.0f << 0.0f << 0.0f << 270.0f; - QTest::newRow("1, 0, 0, 45 deg") << 1.0f << 0.0f << 0.0f << 45.0f; - QTest::newRow("1, 0, 0, 120 deg") << 1.0f << 0.0f << 0.0f << 120.0f; - QTest::newRow("1, 0, 0, 300 deg") << 1.0f << 0.0f << 0.0f << 300.0f; - - QTest::newRow("0, 1, 0, 90 deg") << 0.0f << 1.0f << 0.0f << 90.0f; - QTest::newRow("0, 1, 0, 270 deg") << 0.0f << 1.0f << 0.0f << 270.0f; - QTest::newRow("0, 1, 0, 45 deg") << 0.0f << 1.0f << 0.0f << 45.0f; - QTest::newRow("0, 1, 0, 120 deg") << 0.0f << 1.0f << 0.0f << 120.0f; - QTest::newRow("0, 1, 0, 300 deg") << 0.0f << 1.0f << 0.0f << 300.0f; - - QTest::newRow("0, 0, 1, 90 deg") << 0.0f << 0.0f << 1.0f << 90.0f; - QTest::newRow("0, 0, 1, 270 deg") << 0.0f << 0.0f << 1.0f << 270.0f; - QTest::newRow("0, 0, 1, 45 deg") << 0.0f << 0.0f << 1.0f << 45.0f; - QTest::newRow("0, 0, 1, 120 deg") << 0.0f << 0.0f << 1.0f << 120.0f; - QTest::newRow("0, 0, 1, 300 deg") << 0.0f << 0.0f << 1.0f << 300.0f; - - QTest::newRow("1, 1, 1, 90 deg") << 1.0f << 1.0f << 1.0f << 90.0f; - QTest::newRow("1, 1, 1, 270 deg") << 1.0f << 1.0f << 1.0f << 270.0f; - QTest::newRow("1, 1, 1, 45 deg") << 1.0f << 1.0f << 1.0f << 45.0f; - QTest::newRow("1, 1, 1, 120 deg") << 1.0f << 1.0f << 1.0f << 120.0f; - QTest::newRow("1, 1, 1, 300 deg") << 1.0f << 1.0f << 1.0f << 300.0f; -} - -void tst_QMatrixNxN::extractAxisRotation() -{ - QFETCH(float, x); - QFETCH(float, y); - QFETCH(float, z); - QFETCH(float, angle); - - QMatrix4x4 m; - QVector3D origAxis(x, y, z); - - m.rotate(angle, x, y, z); - - origAxis.normalize(); - QVector3D extractedAxis; - qreal extractedAngle; - - m.extractAxisRotation(extractedAngle, extractedAxis); - - qreal epsilon = 0.001; - - if (angle > 180) { - QVERIFY(fuzzyCompare(360.0f - angle, extractedAngle, epsilon)); - QVERIFY(fuzzyCompare(extractedAxis, -origAxis, epsilon)); - } else { - QVERIFY(fuzzyCompare(angle, extractedAngle, epsilon)); - QVERIFY(fuzzyCompare(extractedAxis, origAxis, epsilon)); - } -} - -void tst_QMatrixNxN::extractTranslation_data() -{ - QTest::addColumn("rotation"); - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::addColumn("z"); - - static QMatrix4x4 m1; - - QTest::newRow("identity, 100, 50, 25") - << m1 << 100.0f << 50.0f << 250.0f; - - m1.rotate(45.0, 1.0, 0.0, 0.0); - QTest::newRow("rotX 45 + 100, 50, 25") << m1 << 100.0f << 50.0f << 25.0f; - - m1.setIdentity(); - m1.rotate(45.0, 0.0, 1.0, 0.0); - QTest::newRow("rotY 45 + 100, 50, 25") << m1 << 100.0f << 50.0f << 25.0f; - - m1.setIdentity(); - m1.rotate(75, 0.0, 0.0, 1.0); - m1.rotate(25, 1.0, 0.0, 0.0); - m1.rotate(45, 0.0, 1.0, 0.0); - QTest::newRow("rotZ 75, rotX 25, rotY 45, 100, 50, 25") << m1 << 100.0f << 50.0f << 25.0f; -} - -void tst_QMatrixNxN::extractTranslation() -{ - QFETCH(QMatrix4x4, rotation); - QFETCH(float, x); - QFETCH(float, y); - QFETCH(float, z); - - rotation.translate(x, y, z); - - QVector3D vec = rotation.extractTranslation(); - - qreal epsilon = 0.001; - - QVERIFY(fuzzyCompare(vec.x(), x, epsilon)); - QVERIFY(fuzzyCompare(vec.y(), y, epsilon)); - QVERIFY(fuzzyCompare(vec.z(), z, epsilon)); - - QMatrix4x4 lookAt; - QVector3D eye(1.5f, -2.5f, 2.5f); - lookAt.lookAt(eye, - QVector3D(10.0f, 10.0f, 10.0f), - QVector3D(0.0f, 1.0f, 0.0f)); - - QVector3D extEye = lookAt.extractTranslation(); - - QVERIFY(fuzzyCompare(eye.x(), -extEye.x(), epsilon)); - QVERIFY(fuzzyCompare(eye.y(), -extEye.y(), epsilon)); - QVERIFY(fuzzyCompare(eye.z(), -extEye.z(), epsilon)); -} - -// Copy of "flagBits" in qmatrix4x4.h. -enum { - Identity = 0x0001, // Identity matrix - General = 0x0002, // General matrix, unknown contents - Translation = 0x0004, // Contains a simple translation - Scale = 0x0008, // Contains a simple scale - Rotation = 0x0010 // Contains a simple rotation -}; - -// Structure that allows direct access to "flagBits" for testing. -struct Matrix4x4 -{ - float m[4][4]; - int flagBits; -}; - -// Test the inferring of special matrix types. -void tst_QMatrixNxN::inferSpecialType_data() -{ - QTest::addColumn("mValues"); - QTest::addColumn("flagBits"); - - QTest::newRow("null") - << (void *)nullValues4 << (int)General; - QTest::newRow("identity") - << (void *)identityValues4 << (int)Identity; - QTest::newRow("unique") - << (void *)uniqueValues4 << (int)General; - - static qreal scaleValues[16] = { - 2.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 3.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 4.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f - }; - QTest::newRow("scale") - << (void *)scaleValues << (int)Scale; - - static qreal translateValues[16] = { - 1.0f, 0.0f, 0.0f, 2.0f, - 0.0f, 1.0f, 0.0f, 3.0f, - 0.0f, 0.0f, 1.0f, 4.0f, - 0.0f, 0.0f, 0.0f, 1.0f - }; - QTest::newRow("scale") - << (void *)translateValues << (int)Translation; - - static qreal bothValues[16] = { - 1.0f, 0.0f, 0.0f, 2.0f, - 0.0f, 2.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 4.0f, - 0.0f, 0.0f, 0.0f, 1.0f - }; - QTest::newRow("both") - << (void *)bothValues << (int)(Scale | Translation); - - static qreal belowValues[16] = { - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 4.0f, 0.0f, 0.0f, 1.0f - }; - QTest::newRow("below") - << (void *)belowValues << (int)General; -} -void tst_QMatrixNxN::inferSpecialType() -{ - QFETCH(void *, mValues); - QFETCH(int, flagBits); - - QMatrix4x4 m((const qreal *)mValues); - m.inferSpecialType(); - - QCOMPARE(reinterpret_cast(&m)->flagBits, flagBits); -} - -void tst_QMatrixNxN::columnsAndRows() -{ - QMatrix4x4 m1(uniqueValues4); - - QVERIFY(m1.column(0) == QVector4D(1, 5, 9, 13)); - QVERIFY(m1.column(1) == QVector4D(2, 6, 10, 14)); - QVERIFY(m1.column(2) == QVector4D(3, 7, 11, 15)); - QVERIFY(m1.column(3) == QVector4D(4, 8, 12, 16)); - - QVERIFY(m1.row(0) == QVector4D(1, 2, 3, 4)); - QVERIFY(m1.row(1) == QVector4D(5, 6, 7, 8)); - QVERIFY(m1.row(2) == QVector4D(9, 10, 11, 12)); - QVERIFY(m1.row(3) == QVector4D(13, 14, 15, 16)); - - m1.setColumn(0, QVector4D(-1, -5, -9, -13)); - m1.setColumn(1, QVector4D(-2, -6, -10, -14)); - m1.setColumn(2, QVector4D(-3, -7, -11, -15)); - m1.setColumn(3, QVector4D(-4, -8, -12, -16)); - - QVERIFY(m1.column(0) == QVector4D(-1, -5, -9, -13)); - QVERIFY(m1.column(1) == QVector4D(-2, -6, -10, -14)); - QVERIFY(m1.column(2) == QVector4D(-3, -7, -11, -15)); - QVERIFY(m1.column(3) == QVector4D(-4, -8, -12, -16)); - - QVERIFY(m1.row(0) == QVector4D(-1, -2, -3, -4)); - QVERIFY(m1.row(1) == QVector4D(-5, -6, -7, -8)); - QVERIFY(m1.row(2) == QVector4D(-9, -10, -11, -12)); - QVERIFY(m1.row(3) == QVector4D(-13, -14, -15, -16)); - - m1.setRow(0, QVector4D(1, 5, 9, 13)); - m1.setRow(1, QVector4D(2, 6, 10, 14)); - m1.setRow(2, QVector4D(3, 7, 11, 15)); - m1.setRow(3, QVector4D(4, 8, 12, 16)); - - QVERIFY(m1.column(0) == QVector4D(1, 2, 3, 4)); - QVERIFY(m1.column(1) == QVector4D(5, 6, 7, 8)); - QVERIFY(m1.column(2) == QVector4D(9, 10, 11, 12)); - QVERIFY(m1.column(3) == QVector4D(13, 14, 15, 16)); - - QVERIFY(m1.row(0) == QVector4D(1, 5, 9, 13)); - QVERIFY(m1.row(1) == QVector4D(2, 6, 10, 14)); - QVERIFY(m1.row(2) == QVector4D(3, 7, 11, 15)); - QVERIFY(m1.row(3) == QVector4D(4, 8, 12, 16)); -} - -// Test converting QMatrix objects into QMatrix4x4 and then -// checking that transformations in the original perform the -// equivalent transformations in the new matrix. -void tst_QMatrixNxN::convertQMatrix() -{ - QMatrix m1; - m1.translate(-3.5, 2.0); - QPointF p1 = m1.map(QPointF(100.0, 150.0)); - QCOMPARE(p1.x(), 100.0 - 3.5); - QCOMPARE(p1.y(), 150.0 + 2.0); - - QMatrix4x4 m2(m1); - QPointF p2 = m2 * QPointF(100.0, 150.0); - QCOMPARE((double)p2.x(), 100.0 - 3.5); - QCOMPARE((double)p2.y(), 150.0 + 2.0); - QVERIFY(m1 == m2.toAffine()); - - QMatrix m3; - m3.scale(1.5, -2.0); - QPointF p3 = m3.map(QPointF(100.0, 150.0)); - QCOMPARE(p3.x(), 1.5 * 100.0); - QCOMPARE(p3.y(), -2.0 * 150.0); - - QMatrix4x4 m4(m3); - QPointF p4 = m4 * QPointF(100.0, 150.0); - QCOMPARE((double)p4.x(), 1.5 * 100.0); - QCOMPARE((double)p4.y(), -2.0 * 150.0); - QVERIFY(m3 == m4.toAffine()); - - QMatrix m5; - m5.rotate(45.0); - QPointF p5 = m5.map(QPointF(100.0, 150.0)); - - QMatrix4x4 m6(m5); - QPointF p6 = m6 * QPointF(100.0, 150.0); - QVERIFY(fuzzyCompare(p5.x(), p6.x(), 0.005)); - QVERIFY(fuzzyCompare(p5.y(), p6.y(), 0.005)); - - QMatrix m7 = m6.toAffine(); - QVERIFY(fuzzyCompare(m5.m11(), m7.m11())); - QVERIFY(fuzzyCompare(m5.m12(), m7.m12())); - QVERIFY(fuzzyCompare(m5.m21(), m7.m21())); - QVERIFY(fuzzyCompare(m5.m22(), m7.m22())); - QVERIFY(fuzzyCompare(m5.dx(), m7.dx())); - QVERIFY(fuzzyCompare(m5.dy(), m7.dy())); -} - -// Test converting QTransform objects into QMatrix4x4 and then -// checking that transformations in the original perform the -// equivalent transformations in the new matrix. -void tst_QMatrixNxN::convertQTransform() -{ - QTransform m1; - m1.translate(-3.5, 2.0); - QPointF p1 = m1.map(QPointF(100.0, 150.0)); - QCOMPARE(p1.x(), 100.0 - 3.5); - QCOMPARE(p1.y(), 150.0 + 2.0); - - QMatrix4x4 m2(m1); - QPointF p2 = m2 * QPointF(100.0, 150.0); - QCOMPARE((double)p2.x(), 100.0 - 3.5); - QCOMPARE((double)p2.y(), 150.0 + 2.0); - QVERIFY(m1 == m2.toTransform()); - - QTransform m3; - m3.scale(1.5, -2.0); - QPointF p3 = m3.map(QPointF(100.0, 150.0)); - QCOMPARE(p3.x(), 1.5 * 100.0); - QCOMPARE(p3.y(), -2.0 * 150.0); - - QMatrix4x4 m4(m3); - QPointF p4 = m4 * QPointF(100.0, 150.0); - QCOMPARE((double)p4.x(), 1.5 * 100.0); - QCOMPARE((double)p4.y(), -2.0 * 150.0); - QVERIFY(m3 == m4.toTransform()); - - QTransform m5; - m5.rotate(45.0); - QPointF p5 = m5.map(QPointF(100.0, 150.0)); - - QMatrix4x4 m6(m5); - QPointF p6 = m6 * QPointF(100.0, 150.0); - QVERIFY(fuzzyCompare(p5.x(), p6.x(), 0.005)); - QVERIFY(fuzzyCompare(p5.y(), p6.y(), 0.005)); - - QTransform m7 = m6.toTransform(); - QVERIFY(fuzzyCompare(m5.m11(), m7.m11())); - QVERIFY(fuzzyCompare(m5.m12(), m7.m12())); - QVERIFY(fuzzyCompare(m5.m21(), m7.m21())); - QVERIFY(fuzzyCompare(m5.m22(), m7.m22())); - QVERIFY(fuzzyCompare(m5.dx(), m7.dx())); - QVERIFY(fuzzyCompare(m5.dy(), m7.dy())); - QVERIFY(fuzzyCompare(m5.m13(), m7.m13())); - QVERIFY(fuzzyCompare(m5.m23(), m7.m23())); - QVERIFY(fuzzyCompare(m5.m33(), m7.m33())); -} - -// Test filling matrices with specific values. -void tst_QMatrixNxN::fill() -{ - QMatrix4x4 m1; - m1.fill(0.0f); - QVERIFY(isSame(m1, nullValues4)); - - static const qreal fillValues4[] = - {2.5f, 2.5f, 2.5f, 2.5f, - 2.5f, 2.5f, 2.5f, 2.5f, - 2.5f, 2.5f, 2.5f, 2.5f, - 2.5f, 2.5f, 2.5f, 2.5f}; - m1.fill(2.5f); - QVERIFY(isSame(m1, fillValues4)); - - QMatrix4x3 m2; - m2.fill(0.0f); - QVERIFY(isSame(m2, nullValues4x3)); - - static const qreal fillValues4x3[] = - {2.5f, 2.5f, 2.5f, 2.5f, - 2.5f, 2.5f, 2.5f, 2.5f, - 2.5f, 2.5f, 2.5f, 2.5f}; - m2.fill(2.5f); - QVERIFY(isSame(m2, fillValues4x3)); -} - -// Test the mapRect() function for QRect and QRectF. -void tst_QMatrixNxN::mapRect_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::addColumn("width"); - QTest::addColumn("height"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - QTest::newRow("rect") - << (qreal)1.0f << (qreal)-20.5f << (qreal)100.0f << (qreal)63.75f; -} -void tst_QMatrixNxN::mapRect() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, width); - QFETCH(qreal, height); - - QRectF rect(x, y, width, height); - QRect recti(qRound(x), qRound(y), qRound(width), qRound(height)); - - QMatrix4x4 m1; - QVERIFY(m1.mapRect(rect) == rect); - QVERIFY(m1.mapRect(recti) == recti); - - QMatrix4x4 m2; - m2.translate(-100.5f, 64.0f); - QRectF translated = rect.translated(-100.5f, 64.0f); - QRect translatedi = QRect(qRound(recti.x() - 100.5f), recti.y() + 64, - recti.width(), recti.height()); - QVERIFY(m2.mapRect(rect) == translated); - QVERIFY(m2.mapRect(recti) == translatedi); - - QMatrix4x4 m3; - m3.scale(-100.5f, 64.0f); - qreal scalex = x * -100.5f; - qreal scaley = y * 64.0f; - qreal scalewid = width * -100.5f; - qreal scaleht = height * 64.0f; - if (scalewid < 0.0f) { - scalewid = -scalewid; - scalex -= scalewid; - } - if (scaleht < 0.0f) { - scaleht = -scaleht; - scaley -= scaleht; - } - QRectF scaled(scalex, scaley, scalewid, scaleht); - QVERIFY(m3.mapRect(rect) == scaled); - scalex = recti.x() * -100.5f; - scaley = recti.y() * 64.0f; - scalewid = recti.width() * -100.5f; - scaleht = recti.height() * 64.0f; - if (scalewid < 0.0f) { - scalewid = -scalewid; - scalex -= scalewid; - } - if (scaleht < 0.0f) { - scaleht = -scaleht; - scaley -= scaleht; - } - QRect scaledi(qRound(scalex), qRound(scaley), - qRound(scalewid), qRound(scaleht)); - QVERIFY(m3.mapRect(recti) == scaledi); - - QMatrix4x4 m4; - m4.translate(-100.5f, 64.0f); - m4.scale(-2.5f, 4.0f); - qreal transx1 = x * -2.5f - 100.5f; - qreal transy1 = y * 4.0f + 64.0f; - qreal transx2 = (x + width) * -2.5f - 100.5f; - qreal transy2 = (y + height) * 4.0f + 64.0f; - if (transx1 > transx2) - qSwap(transx1, transx2); - if (transy1 > transy2) - qSwap(transy1, transy2); - QRectF trans(transx1, transy1, transx2 - transx1, transy2 - transy1); - QVERIFY(m4.mapRect(rect) == trans); - transx1 = recti.x() * -2.5f - 100.5f; - transy1 = recti.y() * 4.0f + 64.0f; - transx2 = (recti.x() + recti.width()) * -2.5f - 100.5f; - transy2 = (recti.y() + recti.height()) * 4.0f + 64.0f; - if (transx1 > transx2) - qSwap(transx1, transx2); - if (transy1 > transy2) - qSwap(transy1, transy2); - QRect transi(qRound(transx1), qRound(transy1), - qRound(transx2) - qRound(transx1), - qRound(transy2) - qRound(transy1)); - QVERIFY(m4.mapRect(recti) == transi); - - m4.rotate(45.0f, 0.0f, 0.0f, 1.0f); - - QTransform t4; - t4.translate(-100.5f, 64.0f); - t4.scale(-2.5f, 4.0f); - t4.rotate(45.0f); - QRectF mr = m4.mapRect(rect); - QRectF tr = t4.mapRect(rect); - QVERIFY(fuzzyCompare(mr.x(), tr.x())); - QVERIFY(fuzzyCompare(mr.y(), tr.y())); - QVERIFY(fuzzyCompare(mr.width(), tr.width())); - QVERIFY(fuzzyCompare(mr.height(), tr.height())); - - QRect mri = m4.mapRect(recti); - QRect tri = t4.mapRect(recti); - QVERIFY(mri == tri); -} - -class tst_QMatrixNxN4x4Properties : public QObject -{ - Q_OBJECT - Q_PROPERTY(QMatrix4x4 matrix READ matrix WRITE setMatrix) -public: - tst_QMatrixNxN4x4Properties(QObject *parent = 0) : QObject(parent) {} - - QMatrix4x4 matrix() const { return m; } - void setMatrix(const QMatrix4x4& value) { m = value; } - -private: - QMatrix4x4 m; -}; - -// Test getting and setting matrix properties via the metaobject system. -void tst_QMatrixNxN::properties() -{ - tst_QMatrixNxN4x4Properties obj; - - QMatrix4x4 m1(uniqueValues4); - obj.setMatrix(m1); - - QMatrix4x4 m2 = qVariantValue(obj.property("matrix")); - QVERIFY(isSame(m2, uniqueValues4)); - - QMatrix4x4 m3(transposedValues4); - obj.setProperty("matrix", qVariantFromValue(m3)); - - m2 = qVariantValue(obj.property("matrix")); - QVERIFY(isSame(m2, transposedValues4)); -} - -void tst_QMatrixNxN::metaTypes() -{ - QVERIFY(QMetaType::type("QMatrix4x4") == QMetaType::QMatrix4x4); - - QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QMatrix4x4)), - QByteArray("QMatrix4x4")); - - QVERIFY(QMetaType::isRegistered(QMetaType::QMatrix4x4)); - - QVERIFY(qMetaTypeId() == QMetaType::QMatrix4x4); -} - -QTEST_APPLESS_MAIN(tst_QMatrixNxN) - -#include "tst_qmatrixnxn.moc" diff --git a/tests/auto/math3d/qquaternion/qquaternion.pro b/tests/auto/math3d/qquaternion/qquaternion.pro deleted file mode 100644 index eea84f0..0000000 --- a/tests/auto/math3d/qquaternion/qquaternion.pro +++ /dev/null @@ -1,5 +0,0 @@ -load(qttest_p4) -VPATH += ../shared -INCLUDEPATH += ../shared -HEADERS += math3dincludes.h -SOURCES += tst_qquaternion.cpp diff --git a/tests/auto/math3d/qquaternion/tst_qquaternion.cpp b/tests/auto/math3d/qquaternion/tst_qquaternion.cpp deleted file mode 100644 index 899c5c2..0000000 --- a/tests/auto/math3d/qquaternion/tst_qquaternion.cpp +++ /dev/null @@ -1,882 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include "math3dincludes.h" - -class tst_QQuaternion : public QObject -{ - Q_OBJECT -public: - tst_QQuaternion() {} - ~tst_QQuaternion() {} - -private slots: - void create(); - - void length_data(); - void length(); - - void normalized_data(); - void normalized(); - - void normalize_data(); - void normalize(); - - void compare(); - - void add_data(); - void add(); - - void subtract_data(); - void subtract(); - - void multiply_data(); - void multiply(); - - void multiplyFactor_data(); - void multiplyFactor(); - - void divide_data(); - void divide(); - - void negate_data(); - void negate(); - - void conjugate_data(); - void conjugate(); - - void fromAxisAndAngle_data(); - void fromAxisAndAngle(); - - void slerp_data(); - void slerp(); - - void nlerp_data(); - void nlerp(); - - void properties(); - void metaTypes(); -}; - -// qFuzzyCompare isn't always "fuzzy" enough to handle conversion -// between float, double, and qreal. So create "fuzzier" compares. -static bool fuzzyCompare(float x, float y) -{ - float diff = x - y; - if (diff < 0.0f) - diff = -diff; - return (diff < 0.001); -} - -// Test the creation of QQuaternion objects in various ways: -// construct, copy, and modify. -void tst_QQuaternion::create() -{ - QQuaternion identity; - QCOMPARE(identity.x(), (qreal)0.0f); - QCOMPARE(identity.y(), (qreal)0.0f); - QCOMPARE(identity.z(), (qreal)0.0f); - QCOMPARE(identity.scalar(), (qreal)1.0f); - QVERIFY(identity.isIdentity()); - - QQuaternion v1(34.0f, 1.0f, 2.5f, -89.25f); - QCOMPARE(v1.x(), (qreal)1.0f); - QCOMPARE(v1.y(), (qreal)2.5f); - QCOMPARE(v1.z(), (qreal)-89.25f); - QCOMPARE(v1.scalar(), (qreal)34.0f); - QVERIFY(!v1.isNull()); - - QQuaternion v1i(34, 1, 2, -89); - QCOMPARE(v1i.x(), (qreal)1.0f); - QCOMPARE(v1i.y(), (qreal)2.0f); - QCOMPARE(v1i.z(), (qreal)-89.0f); - QCOMPARE(v1i.scalar(), (qreal)34.0f); - QVERIFY(!v1i.isNull()); - - QQuaternion v2(v1); - QCOMPARE(v2.x(), (qreal)1.0f); - QCOMPARE(v2.y(), (qreal)2.5f); - QCOMPARE(v2.z(), (qreal)-89.25f); - QCOMPARE(v2.scalar(), (qreal)34.0f); - QVERIFY(!v2.isNull()); - - QQuaternion v4; - QCOMPARE(v4.x(), (qreal)0.0f); - QCOMPARE(v4.y(), (qreal)0.0f); - QCOMPARE(v4.z(), (qreal)0.0f); - QCOMPARE(v4.scalar(), (qreal)1.0f); - QVERIFY(v4.isIdentity()); - v4 = v1; - QCOMPARE(v4.x(), (qreal)1.0f); - QCOMPARE(v4.y(), (qreal)2.5f); - QCOMPARE(v4.z(), (qreal)-89.25f); - QCOMPARE(v4.scalar(), (qreal)34.0f); - QVERIFY(!v4.isNull()); - - QQuaternion v9(34, QVector3D(1.0f, 2.5f, -89.25f)); - QCOMPARE(v9.x(), (qreal)1.0f); - QCOMPARE(v9.y(), (qreal)2.5f); - QCOMPARE(v9.z(), (qreal)-89.25f); - QCOMPARE(v9.scalar(), (qreal)34.0f); - QVERIFY(!v9.isNull()); - - v1.setX(3.0f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)2.5f); - QCOMPARE(v1.z(), (qreal)-89.25f); - QCOMPARE(v1.scalar(), (qreal)34.0f); - QVERIFY(!v1.isNull()); - - v1.setY(10.5f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)10.5f); - QCOMPARE(v1.z(), (qreal)-89.25f); - QCOMPARE(v1.scalar(), (qreal)34.0f); - QVERIFY(!v1.isNull()); - - v1.setZ(15.5f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)10.5f); - QCOMPARE(v1.z(), (qreal)15.5f); - QCOMPARE(v1.scalar(), (qreal)34.0f); - QVERIFY(!v1.isNull()); - - v1.setScalar(6.0f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)10.5f); - QCOMPARE(v1.z(), (qreal)15.5f); - QCOMPARE(v1.scalar(), (qreal)6.0f); - QVERIFY(!v1.isNull()); - - v1.setVector(2.0f, 6.5f, -1.25f); - QCOMPARE(v1.x(), (qreal)2.0f); - QCOMPARE(v1.y(), (qreal)6.5f); - QCOMPARE(v1.z(), (qreal)-1.25f); - QCOMPARE(v1.scalar(), (qreal)6.0f); - QVERIFY(!v1.isNull()); - QVERIFY(v1.vector() == QVector3D(2.0f, 6.5f, -1.25f)); - - v1.setVector(QVector3D(-2.0f, -6.5f, 1.25f)); - QCOMPARE(v1.x(), (qreal)-2.0f); - QCOMPARE(v1.y(), (qreal)-6.5f); - QCOMPARE(v1.z(), (qreal)1.25f); - QCOMPARE(v1.scalar(), (qreal)6.0f); - QVERIFY(!v1.isNull()); - QVERIFY(v1.vector() == QVector3D(-2.0f, -6.5f, 1.25f)); - - v1.setX(0.0f); - v1.setY(0.0f); - v1.setZ(0.0f); - v1.setScalar(0.0f); - QCOMPARE(v1.x(), (qreal)0.0f); - QCOMPARE(v1.y(), (qreal)0.0f); - QCOMPARE(v1.z(), (qreal)0.0f); - QCOMPARE(v1.scalar(), (qreal)0.0f); - QVERIFY(v1.isNull()); - - QVector4D v10 = v9.toVector4D(); - QCOMPARE(v10.x(), (qreal)1.0f); - QCOMPARE(v10.y(), (qreal)2.5f); - QCOMPARE(v10.z(), (qreal)-89.25f); - QCOMPARE(v10.w(), (qreal)34.0f); -} - -// Test length computation for quaternions. -void tst_QQuaternion::length_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::addColumn("z"); - QTest::addColumn("w"); - QTest::addColumn("len"); - - QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("1z") << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f; - QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("-1z") << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("-1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f; - QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)2.0f << (qreal)2.0f << (qreal)qSqrt(16.0f); -} -void tst_QQuaternion::length() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - QFETCH(qreal, w); - QFETCH(qreal, len); - - QQuaternion v(w, x, y, z); - QCOMPARE((float)(v.length()), (float)len); - QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y + z * z + w * w)); -} - -// Test the unit vector conversion for quaternions. -void tst_QQuaternion::normalized_data() -{ - // Use the same test data as the length test. - length_data(); -} -void tst_QQuaternion::normalized() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - QFETCH(qreal, w); - QFETCH(qreal, len); - - QQuaternion v(w, x, y, z); - QQuaternion u = v.normalized(); - if (v.isNull()) - QVERIFY(u.isNull()); - else - QCOMPARE((float)(u.length()), (float)1.0f); - QCOMPARE((float)(u.x() * len), (float)(v.x())); - QCOMPARE((float)(u.y() * len), (float)(v.y())); - QCOMPARE((float)(u.z() * len), (float)(v.z())); - QCOMPARE((float)(u.scalar() * len), (float)(v.scalar())); -} - -// Test the unit vector conversion for quaternions. -void tst_QQuaternion::normalize_data() -{ - // Use the same test data as the length test. - length_data(); -} -void tst_QQuaternion::normalize() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - QFETCH(qreal, w); - - QQuaternion v(w, x, y, z); - bool isNull = v.isNull(); - v.normalize(); - if (isNull) - QVERIFY(v.isNull()); - else - QCOMPARE((float)(v.length()), (float)1.0f); -} - -// Test the comparison operators for quaternions. -void tst_QQuaternion::compare() -{ - QQuaternion v1(8, 1, 2, 4); - QQuaternion v2(8, 1, 2, 4); - QQuaternion v3(8, 3, 2, 4); - QQuaternion v4(8, 1, 3, 4); - QQuaternion v5(8, 1, 2, 3); - QQuaternion v6(3, 1, 2, 4); - - QVERIFY(v1 == v2); - QVERIFY(v1 != v3); - QVERIFY(v1 != v4); - QVERIFY(v1 != v5); - QVERIFY(v1 != v6); -} - -// Test addition for quaternions. -void tst_QQuaternion::add_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("w1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("w2"); - QTest::addColumn("x3"); - QTest::addColumn("y3"); - QTest::addColumn("z3"); - QTest::addColumn("w3"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("zonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f; - - QTest::newRow("wonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f; - - QTest::newRow("all") - << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)8.0f - << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)9.0f - << (qreal)5.0f << (qreal)7.0f << (qreal)-3.0f << (qreal)17.0f; -} -void tst_QQuaternion::add() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, w2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - QFETCH(qreal, w3); - - QQuaternion v1(w1, x1, y1, z1); - QQuaternion v2(w2, x2, y2, z2); - QQuaternion v3(w3, x3, y3, z3); - - QVERIFY((v1 + v2) == v3); - - QQuaternion v4(v1); - v4 += v2; - QVERIFY(v4 == v3); - - QCOMPARE(v4.x(), v1.x() + v2.x()); - QCOMPARE(v4.y(), v1.y() + v2.y()); - QCOMPARE(v4.z(), v1.z() + v2.z()); - QCOMPARE(v4.scalar(), v1.scalar() + v2.scalar()); -} - -// Test subtraction for quaternions. -void tst_QQuaternion::subtract_data() -{ - // Use the same test data as the add test. - add_data(); -} -void tst_QQuaternion::subtract() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, w2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - QFETCH(qreal, w3); - - QQuaternion v1(w1, x1, y1, z1); - QQuaternion v2(w2, x2, y2, z2); - QQuaternion v3(w3, x3, y3, z3); - - QVERIFY((v3 - v1) == v2); - QVERIFY((v3 - v2) == v1); - - QQuaternion v4(v3); - v4 -= v1; - QVERIFY(v4 == v2); - - QCOMPARE(v4.x(), v3.x() - v1.x()); - QCOMPARE(v4.y(), v3.y() - v1.y()); - QCOMPARE(v4.z(), v3.z() - v1.z()); - QCOMPARE(v4.scalar(), v3.scalar() - v1.scalar()); - - QQuaternion v5(v3); - v5 -= v2; - QVERIFY(v5 == v1); - - QCOMPARE(v5.x(), v3.x() - v2.x()); - QCOMPARE(v5.y(), v3.y() - v2.y()); - QCOMPARE(v5.z(), v3.z() - v2.z()); - QCOMPARE(v5.scalar(), v3.scalar() - v2.scalar()); -} - -// Test quaternion multiplication. -void tst_QQuaternion::multiply_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("w1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("w2"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("unitvec") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f; - - QTest::newRow("complex") - << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)7.0f - << (qreal)4.0f << (qreal)5.0f << (qreal)6.0f << (qreal)8.0f; -} -void tst_QQuaternion::multiply() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, w2); - - QQuaternion q1(w1, x1, y1, z1); - QQuaternion q2(w2, x2, y2, z2); - - // Use the simple algorithm at: - // http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q53 - // to calculate the answer we expect to get. - QVector3D v1(x1, y1, z1); - QVector3D v2(x2, y2, z2); - qreal scalar = w1 * w2 - QVector3D::dotProduct(v1, v2); - QVector3D vector = w1 * v2 + w2 * v1 + QVector3D::crossProduct(v1, v2); - QQuaternion result(scalar, vector); - - QVERIFY((q1 * q2) == result); -} - -// Test multiplication by a factor for quaternions. -void tst_QQuaternion::multiplyFactor_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("w1"); - QTest::addColumn("factor"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("w2"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)100.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f - << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("zonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f - << (qreal)2.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f; - - QTest::newRow("wonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)2.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f; - - QTest::newRow("all") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f - << (qreal)2.0f - << (qreal)2.0f << (qreal)4.0f << (qreal)-6.0f << (qreal)8.0f; - - QTest::newRow("allzero") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f - << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; -} -void tst_QQuaternion::multiplyFactor() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - QFETCH(qreal, factor); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, w2); - - QQuaternion v1(w1, x1, y1, z1); - QQuaternion v2(w2, x2, y2, z2); - - QVERIFY((v1 * factor) == v2); - QVERIFY((factor * v1) == v2); - - QQuaternion v3(v1); - v3 *= factor; - QVERIFY(v3 == v2); - - QCOMPARE(v3.x(), v1.x() * factor); - QCOMPARE(v3.y(), v1.y() * factor); - QCOMPARE(v3.z(), v1.z() * factor); - QCOMPARE(v3.scalar(), v1.scalar() * factor); -} - -// Test division by a factor for quaternions. -void tst_QQuaternion::divide_data() -{ - // Use the same test data as the multiply test. - multiplyFactor_data(); -} -void tst_QQuaternion::divide() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - QFETCH(qreal, factor); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, w2); - - QQuaternion v1(w1, x1, y1, z1); - QQuaternion v2(w2, x2, y2, z2); - - if (factor == (qreal)0.0f) - return; - - QVERIFY((v2 / factor) == v1); - - QQuaternion v3(v2); - v3 /= factor; - QVERIFY(v3 == v1); - - QCOMPARE(v3.x(), v2.x() / factor); - QCOMPARE(v3.y(), v2.y() / factor); - QCOMPARE(v3.z(), v2.z() / factor); - QCOMPARE(v3.scalar(), v2.scalar() / factor); -} - -// Test negation for quaternions. -void tst_QQuaternion::negate_data() -{ - // Use the same test data as the add test. - add_data(); -} -void tst_QQuaternion::negate() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - - QQuaternion v1(w1, x1, y1, z1); - QQuaternion v2(-w1, -x1, -y1, -z1); - - QVERIFY(-v1 == v2); -} - -// Test quaternion conjugate calculations. -void tst_QQuaternion::conjugate_data() -{ - // Use the same test data as the add test. - add_data(); -} -void tst_QQuaternion::conjugate() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - - QQuaternion v1(w1, x1, y1, z1); - QQuaternion v2(w1, -x1, -y1, -z1); - - QVERIFY(v1.conjugate() == v2); -} - -// Test quaternion creation from an axis and an angle. -void tst_QQuaternion::fromAxisAndAngle_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("angle"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)90.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)180.0f; - - QTest::newRow("zonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)270.0f; - - QTest::newRow("complex") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)45.0f; -} -void tst_QQuaternion::fromAxisAndAngle() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, angle); - - // Use a straight-forward implementation of the algorithm at: - // http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q56 - // to calculate the answer we expect to get. - QVector3D vector = QVector3D(x1, y1, z1).normalized(); - qreal sin_a = qSin((angle * M_PI / 180.0) / 2.0); - qreal cos_a = qCos((angle * M_PI / 180.0) / 2.0); - QQuaternion result((qreal)cos_a, - (qreal)(vector.x() * sin_a), - (qreal)(vector.y() * sin_a), - (qreal)(vector.z() * sin_a)); - result = result.normalized(); - - QQuaternion answer = QQuaternion::fromAxisAndAngle(QVector3D(x1, y1, z1), angle); - QVERIFY(fuzzyCompare(answer.x(), result.x())); - QVERIFY(fuzzyCompare(answer.y(), result.y())); - QVERIFY(fuzzyCompare(answer.z(), result.z())); - QVERIFY(fuzzyCompare(answer.scalar(), result.scalar())); - - answer = QQuaternion::fromAxisAndAngle(x1, y1, z1, angle); - QVERIFY(fuzzyCompare(answer.x(), result.x())); - QVERIFY(fuzzyCompare(answer.y(), result.y())); - QVERIFY(fuzzyCompare(answer.z(), result.z())); - QVERIFY(fuzzyCompare(answer.scalar(), result.scalar())); -} - -// Test spherical interpolation of quaternions. -void tst_QQuaternion::slerp_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("angle1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("angle2"); - QTest::addColumn("t"); - QTest::addColumn("x3"); - QTest::addColumn("y3"); - QTest::addColumn("z3"); - QTest::addColumn("angle3"); - - QTest::newRow("first") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f - << (qreal)0.0f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f; - QTest::newRow("first2") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f - << (qreal)-0.5f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f; - QTest::newRow("second") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f - << (qreal)1.0f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f; - QTest::newRow("second2") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f - << (qreal)1.5f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f; - QTest::newRow("middle") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f - << (qreal)0.5f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)135.0f; - QTest::newRow("wide angle") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)0.0f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)270.0f - << (qreal)0.5f - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)-45.0f; -} -void tst_QQuaternion::slerp() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, angle1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, angle2); - QFETCH(qreal, t); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - QFETCH(qreal, angle3); - - QQuaternion q1 = QQuaternion::fromAxisAndAngle(x1, y1, z1, angle1); - QQuaternion q2 = QQuaternion::fromAxisAndAngle(x2, y2, z2, angle2); - QQuaternion q3 = QQuaternion::fromAxisAndAngle(x3, y3, z3, angle3); - - QQuaternion result = QQuaternion::slerp(q1, q2, t); - - QVERIFY(fuzzyCompare(result.x(), q3.x())); - QVERIFY(fuzzyCompare(result.y(), q3.y())); - QVERIFY(fuzzyCompare(result.z(), q3.z())); - QVERIFY(fuzzyCompare(result.scalar(), q3.scalar())); -} - -// Test normalized linear interpolation of quaternions. -void tst_QQuaternion::nlerp_data() -{ - slerp_data(); -} -void tst_QQuaternion::nlerp() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, angle1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, angle2); - QFETCH(qreal, t); - - QQuaternion q1 = QQuaternion::fromAxisAndAngle(x1, y1, z1, angle1); - QQuaternion q2 = QQuaternion::fromAxisAndAngle(x2, y2, z2, angle2); - - QQuaternion result = QQuaternion::nlerp(q1, q2, t); - - qreal resultx, resulty, resultz, resultscalar; - if (t <= 0.0f) { - resultx = q1.x(); - resulty = q1.y(); - resultz = q1.z(); - resultscalar = q1.scalar(); - } else if (t >= 1.0f) { - resultx = q2.x(); - resulty = q2.y(); - resultz = q2.z(); - resultscalar = q2.scalar(); - } else if (qAbs(angle1 - angle2) <= 180.f) { - resultx = q1.x() * (1 - t) + q2.x() * t; - resulty = q1.y() * (1 - t) + q2.y() * t; - resultz = q1.z() * (1 - t) + q2.z() * t; - resultscalar = q1.scalar() * (1 - t) + q2.scalar() * t; - } else { - // Angle greater than 180 degrees: negate q2. - resultx = q1.x() * (1 - t) - q2.x() * t; - resulty = q1.y() * (1 - t) - q2.y() * t; - resultz = q1.z() * (1 - t) - q2.z() * t; - resultscalar = q1.scalar() * (1 - t) - q2.scalar() * t; - } - - QQuaternion q3 = QQuaternion(resultscalar, resultx, resulty, resultz).normalized(); - - QVERIFY(fuzzyCompare(result.x(), q3.x())); - QVERIFY(fuzzyCompare(result.y(), q3.y())); - QVERIFY(fuzzyCompare(result.z(), q3.z())); - QVERIFY(fuzzyCompare(result.scalar(), q3.scalar())); -} - -class tst_QQuaternionProperties : public QObject -{ - Q_OBJECT - Q_PROPERTY(QQuaternion quaternion READ quaternion WRITE setQuaternion) -public: - tst_QQuaternionProperties(QObject *parent = 0) : QObject(parent) {} - - QQuaternion quaternion() const { return q; } - void setQuaternion(const QQuaternion& value) { q = value; } - -private: - QQuaternion q; -}; - -// Test getting and setting quaternion properties via the metaobject system. -void tst_QQuaternion::properties() -{ - tst_QQuaternionProperties obj; - - obj.setQuaternion(QQuaternion(6.0f, 7.0f, 8.0f, 9.0f)); - - QQuaternion q = qVariantValue(obj.property("quaternion")); - QCOMPARE(q.scalar(), (qreal)6.0f); - QCOMPARE(q.x(), (qreal)7.0f); - QCOMPARE(q.y(), (qreal)8.0f); - QCOMPARE(q.z(), (qreal)9.0f); - - obj.setProperty("quaternion", - qVariantFromValue(QQuaternion(-6.0f, -7.0f, -8.0f, -9.0f))); - - q = qVariantValue(obj.property("quaternion")); - QCOMPARE(q.scalar(), (qreal)-6.0f); - QCOMPARE(q.x(), (qreal)-7.0f); - QCOMPARE(q.y(), (qreal)-8.0f); - QCOMPARE(q.z(), (qreal)-9.0f); -} - -void tst_QQuaternion::metaTypes() -{ - QVERIFY(QMetaType::type("QQuaternion") == QMetaType::QQuaternion); - - QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QQuaternion)), - QByteArray("QQuaternion")); - - QVERIFY(QMetaType::isRegistered(QMetaType::QQuaternion)); - - QVERIFY(qMetaTypeId() == QMetaType::QQuaternion); -} - -QTEST_APPLESS_MAIN(tst_QQuaternion) - -#include "tst_qquaternion.moc" diff --git a/tests/auto/math3d/qvectornd/qvectornd.pro b/tests/auto/math3d/qvectornd/qvectornd.pro deleted file mode 100644 index 0981637..0000000 --- a/tests/auto/math3d/qvectornd/qvectornd.pro +++ /dev/null @@ -1,5 +0,0 @@ -load(qttest_p4) -VPATH += ../shared -INCLUDEPATH += ../shared -HEADERS += math3dincludes.h -SOURCES += tst_qvectornd.cpp diff --git a/tests/auto/math3d/qvectornd/tst_qvectornd.cpp b/tests/auto/math3d/qvectornd/tst_qvectornd.cpp deleted file mode 100644 index cfcce8e..0000000 --- a/tests/auto/math3d/qvectornd/tst_qvectornd.cpp +++ /dev/null @@ -1,2141 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include -#include -#include "math3dincludes.h" - -class tst_QVector : public QObject -{ - Q_OBJECT -public: - tst_QVector() {} - ~tst_QVector() {} - -private slots: - void create2(); - void create3(); - void create4(); - - void length2_data(); - void length2(); - void length3_data(); - void length3(); - void length4_data(); - void length4(); - - void normalized2_data(); - void normalized2(); - void normalized3_data(); - void normalized3(); - void normalized4_data(); - void normalized4(); - - void normalize2_data(); - void normalize2(); - void normalize3_data(); - void normalize3(); - void normalize4_data(); - void normalize4(); - - void compare2(); - void compare3(); - void compare4(); - - void add2_data(); - void add2(); - void add3_data(); - void add3(); - void add4_data(); - void add4(); - - void subtract2_data(); - void subtract2(); - void subtract3_data(); - void subtract3(); - void subtract4_data(); - void subtract4(); - - void multiply2_data(); - void multiply2(); - void multiply3_data(); - void multiply3(); - void multiply4_data(); - void multiply4(); - - void multiplyFactor2_data(); - void multiplyFactor2(); - void multiplyFactor3_data(); - void multiplyFactor3(); - void multiplyFactor4_data(); - void multiplyFactor4(); - - void divide2_data(); - void divide2(); - void divide3_data(); - void divide3(); - void divide4_data(); - void divide4(); - - void negate2_data(); - void negate2(); - void negate3_data(); - void negate3(); - void negate4_data(); - void negate4(); - - void crossProduct_data(); - void crossProduct(); - void normal_data(); - void normal(); - void distanceToPlane_data(); - void distanceToPlane(); - void distanceToLine_data(); - void distanceToLine(); - - void dotProduct2_data(); - void dotProduct2(); - void dotProduct3_data(); - void dotProduct3(); - void dotProduct4_data(); - void dotProduct4(); - - void properties(); - void metaTypes(); -}; - -// qFuzzyCompare isn't always "fuzzy" enough to handle conversion -// between float, double, and qreal. So create "fuzzier" compares. -static bool fuzzyCompare(float x, float y) -{ - float diff = x - y; - if (diff < 0.0f) - diff = -diff; - return (diff < 0.001); -} - -// Test the creation of QVector2D objects in various ways: -// construct, copy, and modify. -void tst_QVector::create2() -{ - QVector2D null; - QCOMPARE(null.x(), (qreal)0.0f); - QCOMPARE(null.y(), (qreal)0.0f); - QVERIFY(null.isNull()); - - QVector2D v1(1.0f, 2.5f); - QCOMPARE(v1.x(), (qreal)1.0f); - QCOMPARE(v1.y(), (qreal)2.5f); - QVERIFY(!v1.isNull()); - - QVector2D v1i(1, 2); - QCOMPARE(v1i.x(), (qreal)1.0f); - QCOMPARE(v1i.y(), (qreal)2.0f); - QVERIFY(!v1i.isNull()); - - QVector2D v2(v1); - QCOMPARE(v2.x(), (qreal)1.0f); - QCOMPARE(v2.y(), (qreal)2.5f); - QVERIFY(!v2.isNull()); - - QVector2D v4; - QCOMPARE(v4.x(), (qreal)0.0f); - QCOMPARE(v4.y(), (qreal)0.0f); - QVERIFY(v4.isNull()); - v4 = v1; - QCOMPARE(v4.x(), (qreal)1.0f); - QCOMPARE(v4.y(), (qreal)2.5f); - QVERIFY(!v4.isNull()); - - QVector2D v5(QPoint(1, 2)); - QCOMPARE(v5.x(), (qreal)1.0f); - QCOMPARE(v5.y(), (qreal)2.0f); - QVERIFY(!v5.isNull()); - - QVector2D v6(QPointF(1, 2.5)); - QCOMPARE(v6.x(), (qreal)1.0f); - QCOMPARE(v6.y(), (qreal)2.5f); - QVERIFY(!v6.isNull()); - - QVector2D v7(QVector3D(1.0f, 2.5f, 54.25f)); - QCOMPARE(v7.x(), (qreal)1.0f); - QCOMPARE(v7.y(), (qreal)2.5f); - QVERIFY(!v6.isNull()); - - QVector2D v8(QVector4D(1.0f, 2.5f, 54.25f, 34.0f)); - QCOMPARE(v8.x(), (qreal)1.0f); - QCOMPARE(v8.y(), (qreal)2.5f); - QVERIFY(!v6.isNull()); - - v1.setX(3.0f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)2.5f); - QVERIFY(!v1.isNull()); - - v1.setY(10.5f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)10.5f); - QVERIFY(!v1.isNull()); - - v1.setX(0.0f); - v1.setY(0.0f); - QCOMPARE(v1.x(), (qreal)0.0f); - QCOMPARE(v1.y(), (qreal)0.0f); - QVERIFY(v1.isNull()); - - QPoint p1 = v8.toPoint(); - QCOMPARE(p1.x(), 1); - QCOMPARE(p1.y(), 3); - - QPointF p2 = v8.toPointF(); - QCOMPARE((qreal)p2.x(), (qreal)1.0f); - QCOMPARE((qreal)p2.y(), (qreal)2.5f); - - QVector3D v9 = v8.toVector3D(); - QCOMPARE(v9.x(), (qreal)1.0f); - QCOMPARE(v9.y(), (qreal)2.5f); - QCOMPARE(v9.z(), (qreal)0.0f); - - QVector4D v10 = v8.toVector4D(); - QCOMPARE(v10.x(), (qreal)1.0f); - QCOMPARE(v10.y(), (qreal)2.5f); - QCOMPARE(v10.z(), (qreal)0.0f); - QCOMPARE(v10.w(), (qreal)0.0f); -} - -// Test the creation of QVector3D objects in various ways: -// construct, copy, and modify. -void tst_QVector::create3() -{ - QVector3D null; - QCOMPARE(null.x(), (qreal)0.0f); - QCOMPARE(null.y(), (qreal)0.0f); - QCOMPARE(null.z(), (qreal)0.0f); - QVERIFY(null.isNull()); - - QVector3D v1(1.0f, 2.5f, -89.25f); - QCOMPARE(v1.x(), (qreal)1.0f); - QCOMPARE(v1.y(), (qreal)2.5f); - QCOMPARE(v1.z(), (qreal)-89.25f); - QVERIFY(!v1.isNull()); - - QVector3D v1i(1, 2, -89); - QCOMPARE(v1i.x(), (qreal)1.0f); - QCOMPARE(v1i.y(), (qreal)2.0f); - QCOMPARE(v1i.z(), (qreal)-89.0f); - QVERIFY(!v1i.isNull()); - - QVector3D v2(v1); - QCOMPARE(v2.x(), (qreal)1.0f); - QCOMPARE(v2.y(), (qreal)2.5f); - QCOMPARE(v2.z(), (qreal)-89.25f); - QVERIFY(!v2.isNull()); - - QVector3D v3(1.0f, 2.5f, 0.0f); - QCOMPARE(v3.x(), (qreal)1.0f); - QCOMPARE(v3.y(), (qreal)2.5f); - QCOMPARE(v3.z(), (qreal)0.0f); - QVERIFY(!v3.isNull()); - - QVector3D v3i(1, 2, 0); - QCOMPARE(v3i.x(), (qreal)1.0f); - QCOMPARE(v3i.y(), (qreal)2.0f); - QCOMPARE(v3i.z(), (qreal)0.0f); - QVERIFY(!v3i.isNull()); - - QVector3D v4; - QCOMPARE(v4.x(), (qreal)0.0f); - QCOMPARE(v4.y(), (qreal)0.0f); - QCOMPARE(v4.z(), (qreal)0.0f); - QVERIFY(v4.isNull()); - v4 = v1; - QCOMPARE(v4.x(), (qreal)1.0f); - QCOMPARE(v4.y(), (qreal)2.5f); - QCOMPARE(v4.z(), (qreal)-89.25f); - QVERIFY(!v4.isNull()); - - QVector3D v5(QPoint(1, 2)); - QCOMPARE(v5.x(), (qreal)1.0f); - QCOMPARE(v5.y(), (qreal)2.0f); - QCOMPARE(v5.z(), (qreal)0.0f); - QVERIFY(!v5.isNull()); - - QVector3D v6(QPointF(1, 2.5)); - QCOMPARE(v6.x(), (qreal)1.0f); - QCOMPARE(v6.y(), (qreal)2.5f); - QCOMPARE(v6.z(), (qreal)0.0f); - QVERIFY(!v6.isNull()); - - QVector3D v7(QVector2D(1.0f, 2.5f)); - QCOMPARE(v7.x(), (qreal)1.0f); - QCOMPARE(v7.y(), (qreal)2.5f); - QCOMPARE(v7.z(), (qreal)0.0f); - QVERIFY(!v7.isNull()); - - QVector3D v8(QVector2D(1.0f, 2.5f), 54.25f); - QCOMPARE(v8.x(), (qreal)1.0f); - QCOMPARE(v8.y(), (qreal)2.5f); - QCOMPARE(v8.z(), (qreal)54.25f); - QVERIFY(!v8.isNull()); - - QVector3D v9(QVector4D(1.0f, 2.5f, 54.25f, 34.0f)); - QCOMPARE(v9.x(), (qreal)1.0f); - QCOMPARE(v9.y(), (qreal)2.5f); - QCOMPARE(v9.z(), (qreal)54.25f); - QVERIFY(!v9.isNull()); - - v1.setX(3.0f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)2.5f); - QCOMPARE(v1.z(), (qreal)-89.25f); - QVERIFY(!v1.isNull()); - - v1.setY(10.5f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)10.5f); - QCOMPARE(v1.z(), (qreal)-89.25f); - QVERIFY(!v1.isNull()); - - v1.setZ(15.5f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)10.5f); - QCOMPARE(v1.z(), (qreal)15.5f); - QVERIFY(!v1.isNull()); - - v1.setX(0.0f); - v1.setY(0.0f); - v1.setZ(0.0f); - QCOMPARE(v1.x(), (qreal)0.0f); - QCOMPARE(v1.y(), (qreal)0.0f); - QCOMPARE(v1.z(), (qreal)0.0f); - QVERIFY(v1.isNull()); - - QPoint p1 = v8.toPoint(); - QCOMPARE(p1.x(), 1); - QCOMPARE(p1.y(), 3); - - QPointF p2 = v8.toPointF(); - QCOMPARE((qreal)p2.x(), (qreal)1.0f); - QCOMPARE((qreal)p2.y(), (qreal)2.5f); - - QVector2D v10 = v8.toVector2D(); - QCOMPARE(v10.x(), (qreal)1.0f); - QCOMPARE(v10.y(), (qreal)2.5f); - - QVector4D v11 = v8.toVector4D(); - QCOMPARE(v11.x(), (qreal)1.0f); - QCOMPARE(v11.y(), (qreal)2.5f); - QCOMPARE(v11.z(), (qreal)54.25f); - QCOMPARE(v11.w(), (qreal)0.0f); -} - -// Test the creation of QVector4D objects in various ways: -// construct, copy, and modify. -void tst_QVector::create4() -{ - QVector4D null; - QCOMPARE(null.x(), (qreal)0.0f); - QCOMPARE(null.y(), (qreal)0.0f); - QCOMPARE(null.z(), (qreal)0.0f); - QCOMPARE(null.w(), (qreal)0.0f); - QVERIFY(null.isNull()); - - QVector4D v1(1.0f, 2.5f, -89.25f, 34.0f); - QCOMPARE(v1.x(), (qreal)1.0f); - QCOMPARE(v1.y(), (qreal)2.5f); - QCOMPARE(v1.z(), (qreal)-89.25f); - QCOMPARE(v1.w(), (qreal)34.0f); - QVERIFY(!v1.isNull()); - - QVector4D v1i(1, 2, -89, 34); - QCOMPARE(v1i.x(), (qreal)1.0f); - QCOMPARE(v1i.y(), (qreal)2.0f); - QCOMPARE(v1i.z(), (qreal)-89.0f); - QCOMPARE(v1i.w(), (qreal)34.0f); - QVERIFY(!v1i.isNull()); - - QVector4D v2(v1); - QCOMPARE(v2.x(), (qreal)1.0f); - QCOMPARE(v2.y(), (qreal)2.5f); - QCOMPARE(v2.z(), (qreal)-89.25f); - QCOMPARE(v2.w(), (qreal)34.0f); - QVERIFY(!v2.isNull()); - - QVector4D v3(1.0f, 2.5f, 0.0f, 0.0f); - QCOMPARE(v3.x(), (qreal)1.0f); - QCOMPARE(v3.y(), (qreal)2.5f); - QCOMPARE(v3.z(), (qreal)0.0f); - QCOMPARE(v3.w(), (qreal)0.0f); - QVERIFY(!v3.isNull()); - - QVector4D v3i(1, 2, 0, 0); - QCOMPARE(v3i.x(), (qreal)1.0f); - QCOMPARE(v3i.y(), (qreal)2.0f); - QCOMPARE(v3i.z(), (qreal)0.0f); - QCOMPARE(v3i.w(), (qreal)0.0f); - QVERIFY(!v3i.isNull()); - - QVector4D v3b(1.0f, 2.5f, -89.25f, 0.0f); - QCOMPARE(v3b.x(), (qreal)1.0f); - QCOMPARE(v3b.y(), (qreal)2.5f); - QCOMPARE(v3b.z(), (qreal)-89.25f); - QCOMPARE(v3b.w(), (qreal)0.0f); - QVERIFY(!v3b.isNull()); - - QVector4D v3bi(1, 2, -89, 0); - QCOMPARE(v3bi.x(), (qreal)1.0f); - QCOMPARE(v3bi.y(), (qreal)2.0f); - QCOMPARE(v3bi.z(), (qreal)-89.0f); - QCOMPARE(v3bi.w(), (qreal)0.0f); - QVERIFY(!v3bi.isNull()); - - QVector4D v4; - QCOMPARE(v4.x(), (qreal)0.0f); - QCOMPARE(v4.y(), (qreal)0.0f); - QCOMPARE(v4.z(), (qreal)0.0f); - QCOMPARE(v4.w(), (qreal)0.0f); - QVERIFY(v4.isNull()); - v4 = v1; - QCOMPARE(v4.x(), (qreal)1.0f); - QCOMPARE(v4.y(), (qreal)2.5f); - QCOMPARE(v4.z(), (qreal)-89.25f); - QCOMPARE(v4.w(), (qreal)34.0f); - QVERIFY(!v4.isNull()); - - QVector4D v5(QPoint(1, 2)); - QCOMPARE(v5.x(), (qreal)1.0f); - QCOMPARE(v5.y(), (qreal)2.0f); - QCOMPARE(v5.z(), (qreal)0.0f); - QCOMPARE(v5.w(), (qreal)0.0f); - QVERIFY(!v5.isNull()); - - QVector4D v6(QPointF(1, 2.5)); - QCOMPARE(v6.x(), (qreal)1.0f); - QCOMPARE(v6.y(), (qreal)2.5f); - QCOMPARE(v6.z(), (qreal)0.0f); - QCOMPARE(v6.w(), (qreal)0.0f); - QVERIFY(!v6.isNull()); - - QVector4D v7(QVector2D(1.0f, 2.5f)); - QCOMPARE(v7.x(), (qreal)1.0f); - QCOMPARE(v7.y(), (qreal)2.5f); - QCOMPARE(v7.z(), (qreal)0.0f); - QCOMPARE(v7.w(), (qreal)0.0f); - QVERIFY(!v7.isNull()); - - QVector4D v8(QVector3D(1.0f, 2.5f, -89.25f)); - QCOMPARE(v8.x(), (qreal)1.0f); - QCOMPARE(v8.y(), (qreal)2.5f); - QCOMPARE(v8.z(), (qreal)-89.25f); - QCOMPARE(v8.w(), (qreal)0.0f); - QVERIFY(!v8.isNull()); - - QVector4D v9(QVector3D(1.0f, 2.5f, -89.25f), 34); - QCOMPARE(v9.x(), (qreal)1.0f); - QCOMPARE(v9.y(), (qreal)2.5f); - QCOMPARE(v9.z(), (qreal)-89.25f); - QCOMPARE(v9.w(), (qreal)34.0f); - QVERIFY(!v9.isNull()); - - QVector4D v10(QVector2D(1.0f, 2.5f), 23.5f, -8); - QCOMPARE(v10.x(), (qreal)1.0f); - QCOMPARE(v10.y(), (qreal)2.5f); - QCOMPARE(v10.z(), (qreal)23.5f); - QCOMPARE(v10.w(), (qreal)-8.0f); - QVERIFY(!v10.isNull()); - - v1.setX(3.0f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)2.5f); - QCOMPARE(v1.z(), (qreal)-89.25f); - QCOMPARE(v1.w(), (qreal)34.0f); - QVERIFY(!v1.isNull()); - - v1.setY(10.5f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)10.5f); - QCOMPARE(v1.z(), (qreal)-89.25f); - QCOMPARE(v1.w(), (qreal)34.0f); - QVERIFY(!v1.isNull()); - - v1.setZ(15.5f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)10.5f); - QCOMPARE(v1.z(), (qreal)15.5f); - QCOMPARE(v1.w(), (qreal)34.0f); - QVERIFY(!v1.isNull()); - - v1.setW(6.0f); - QCOMPARE(v1.x(), (qreal)3.0f); - QCOMPARE(v1.y(), (qreal)10.5f); - QCOMPARE(v1.z(), (qreal)15.5f); - QCOMPARE(v1.w(), (qreal)6.0f); - QVERIFY(!v1.isNull()); - - v1.setX(0.0f); - v1.setY(0.0f); - v1.setZ(0.0f); - v1.setW(0.0f); - QCOMPARE(v1.x(), (qreal)0.0f); - QCOMPARE(v1.y(), (qreal)0.0f); - QCOMPARE(v1.z(), (qreal)0.0f); - QCOMPARE(v1.w(), (qreal)0.0f); - QVERIFY(v1.isNull()); - - QPoint p1 = v8.toPoint(); - QCOMPARE(p1.x(), 1); - QCOMPARE(p1.y(), 3); - - QPointF p2 = v8.toPointF(); - QCOMPARE((qreal)p2.x(), (qreal)1.0f); - QCOMPARE((qreal)p2.y(), (qreal)2.5f); - - QVector2D v11 = v8.toVector2D(); - QCOMPARE(v11.x(), (qreal)1.0f); - QCOMPARE(v11.y(), (qreal)2.5f); - - QVector3D v12 = v8.toVector3D(); - QCOMPARE(v12.x(), (qreal)1.0f); - QCOMPARE(v12.y(), (qreal)2.5f); - QCOMPARE(v12.z(), (qreal)-89.25f); - - QVector2D v13 = v9.toVector2DAffine(); - QVERIFY(fuzzyCompare(v13.x(), (qreal)(1.0f / 34.0f))); - QVERIFY(fuzzyCompare(v13.y(), (qreal)(2.5f / 34.0f))); - - QVector4D zerow(1.0f, 2.0f, 3.0f, 0.0f); - v13 = zerow.toVector2DAffine(); - QVERIFY(v13.isNull()); - - QVector3D v14 = v9.toVector3DAffine(); - QVERIFY(fuzzyCompare(v14.x(), (qreal)(1.0f / 34.0f))); - QVERIFY(fuzzyCompare(v14.y(), (qreal)(2.5f / 34.0f))); - QVERIFY(fuzzyCompare(v14.z(), (qreal)(-89.25f / 34.0f))); - - v14 = zerow.toVector3DAffine(); - QVERIFY(v14.isNull()); -} - -// Test vector length computation for 2D vectors. -void tst_QVector::length2_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::addColumn("len"); - - QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f; - QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f; - QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)qSqrt(8.0f); -} -void tst_QVector::length2() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, len); - - QVector2D v(x, y); - QCOMPARE((float)(v.length()), (float)len); - QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y)); -} - -// Test vector length computation for 3D vectors. -void tst_QVector::length3_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::addColumn("z"); - QTest::addColumn("len"); - - QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("1z") << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f; - QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("-1z") << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f; - QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)2.0f << (qreal)qSqrt(12.0f); -} -void tst_QVector::length3() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - QFETCH(qreal, len); - - QVector3D v(x, y, z); - QCOMPARE((float)(v.length()), (float)len); - QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y + z * z)); -} - -// Test vector length computation for 4D vectors. -void tst_QVector::length4_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::addColumn("z"); - QTest::addColumn("w"); - QTest::addColumn("len"); - - QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("1z") << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f; - QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("-1z") << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f; - QTest::newRow("-1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f; - QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)2.0f << (qreal)2.0f << (qreal)qSqrt(16.0f); -} -void tst_QVector::length4() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - QFETCH(qreal, w); - QFETCH(qreal, len); - - QVector4D v(x, y, z, w); - QCOMPARE((float)(v.length()), (float)len); - QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y + z * z + w * w)); -} - -// Test the unit vector conversion for 2D vectors. -void tst_QVector::normalized2_data() -{ - // Use the same test data as the length test. - length2_data(); -} -void tst_QVector::normalized2() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, len); - - QVector2D v(x, y); - QVector2D u = v.normalized(); - if (v.isNull()) - QVERIFY(u.isNull()); - else - QCOMPARE((float)(u.length()), (float)1.0f); - QCOMPARE((float)(u.x() * len), (float)(v.x())); - QCOMPARE((float)(u.y() * len), (float)(v.y())); -} - -// Test the unit vector conversion for 3D vectors. -void tst_QVector::normalized3_data() -{ - // Use the same test data as the length test. - length3_data(); -} -void tst_QVector::normalized3() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - QFETCH(qreal, len); - - QVector3D v(x, y, z); - QVector3D u = v.normalized(); - if (v.isNull()) - QVERIFY(u.isNull()); - else - QCOMPARE((float)(u.length()), (float)1.0f); - QCOMPARE((float)(u.x() * len), (float)(v.x())); - QCOMPARE((float)(u.y() * len), (float)(v.y())); - QCOMPARE((float)(u.z() * len), (float)(v.z())); -} - -// Test the unit vector conversion for 4D vectors. -void tst_QVector::normalized4_data() -{ - // Use the same test data as the length test. - length4_data(); -} -void tst_QVector::normalized4() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - QFETCH(qreal, w); - QFETCH(qreal, len); - - QVector4D v(x, y, z, w); - QVector4D u = v.normalized(); - if (v.isNull()) - QVERIFY(u.isNull()); - else - QCOMPARE((float)(u.length()), (float)1.0f); - QCOMPARE((float)(u.x() * len), (float)(v.x())); - QCOMPARE((float)(u.y() * len), (float)(v.y())); - QCOMPARE((float)(u.z() * len), (float)(v.z())); - QCOMPARE((float)(u.w() * len), (float)(v.w())); -} - -// Test the unit vector conversion for 2D vectors. -void tst_QVector::normalize2_data() -{ - // Use the same test data as the length test. - length2_data(); -} -void tst_QVector::normalize2() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - - QVector2D v(x, y); - bool isNull = v.isNull(); - v.normalize(); - if (isNull) - QVERIFY(v.isNull()); - else - QCOMPARE((float)(v.length()), (float)1.0f); -} - -// Test the unit vector conversion for 3D vectors. -void tst_QVector::normalize3_data() -{ - // Use the same test data as the length test. - length3_data(); -} -void tst_QVector::normalize3() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - - QVector3D v(x, y, z); - bool isNull = v.isNull(); - v.normalize(); - if (isNull) - QVERIFY(v.isNull()); - else - QCOMPARE((float)(v.length()), (float)1.0f); -} - -// Test the unit vector conversion for 4D vectors. -void tst_QVector::normalize4_data() -{ - // Use the same test data as the length test. - length4_data(); -} -void tst_QVector::normalize4() -{ - QFETCH(qreal, x); - QFETCH(qreal, y); - QFETCH(qreal, z); - QFETCH(qreal, w); - - QVector4D v(x, y, z, w); - bool isNull = v.isNull(); - v.normalize(); - if (isNull) - QVERIFY(v.isNull()); - else - QCOMPARE((float)(v.length()), (float)1.0f); -} - -// Test the comparison operators for 2D vectors. -void tst_QVector::compare2() -{ - QVector2D v1(1, 2); - QVector2D v2(1, 2); - QVector2D v3(3, 2); - QVector2D v4(1, 3); - - QVERIFY(v1 == v2); - QVERIFY(v1 != v3); - QVERIFY(v1 != v4); -} - -// Test the comparison operators for 3D vectors. -void tst_QVector::compare3() -{ - QVector3D v1(1, 2, 4); - QVector3D v2(1, 2, 4); - QVector3D v3(3, 2, 4); - QVector3D v4(1, 3, 4); - QVector3D v5(1, 2, 3); - - QVERIFY(v1 == v2); - QVERIFY(v1 != v3); - QVERIFY(v1 != v4); - QVERIFY(v1 != v5); -} - -// Test the comparison operators for 4D vectors. -void tst_QVector::compare4() -{ - QVector4D v1(1, 2, 4, 8); - QVector4D v2(1, 2, 4, 8); - QVector4D v3(3, 2, 4, 8); - QVector4D v4(1, 3, 4, 8); - QVector4D v5(1, 2, 3, 8); - QVector4D v6(1, 2, 4, 3); - - QVERIFY(v1 == v2); - QVERIFY(v1 != v3); - QVERIFY(v1 != v4); - QVERIFY(v1 != v5); - QVERIFY(v1 != v6); -} - -// Test vector addition for 2D vectors. -void tst_QVector::add2_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("x3"); - QTest::addColumn("y3"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f - << (qreal)2.0f << (qreal)0.0f - << (qreal)3.0f << (qreal)0.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)2.0f - << (qreal)0.0f << (qreal)3.0f; - - QTest::newRow("all") - << (qreal)1.0f << (qreal)2.0f - << (qreal)4.0f << (qreal)5.0f - << (qreal)5.0f << (qreal)7.0f; -} -void tst_QVector::add2() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - - QVector2D v1(x1, y1); - QVector2D v2(x2, y2); - QVector2D v3(x3, y3); - - QVERIFY((v1 + v2) == v3); - - QVector2D v4(v1); - v4 += v2; - QVERIFY(v4 == v3); - - QCOMPARE(v4.x(), v1.x() + v2.x()); - QCOMPARE(v4.y(), v1.y() + v2.y()); -} - -// Test vector addition for 3D vectors. -void tst_QVector::add3_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("x3"); - QTest::addColumn("y3"); - QTest::addColumn("z3"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f; - - QTest::newRow("zonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f; - - QTest::newRow("all") - << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f - << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f - << (qreal)5.0f << (qreal)7.0f << (qreal)-3.0f; -} -void tst_QVector::add3() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - - QVector3D v1(x1, y1, z1); - QVector3D v2(x2, y2, z2); - QVector3D v3(x3, y3, z3); - - QVERIFY((v1 + v2) == v3); - - QVector3D v4(v1); - v4 += v2; - QVERIFY(v4 == v3); - - QCOMPARE(v4.x(), v1.x() + v2.x()); - QCOMPARE(v4.y(), v1.y() + v2.y()); - QCOMPARE(v4.z(), v1.z() + v2.z()); -} - -// Test vector addition for 4D vectors. -void tst_QVector::add4_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("w1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("w2"); - QTest::addColumn("x3"); - QTest::addColumn("y3"); - QTest::addColumn("z3"); - QTest::addColumn("w3"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("zonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f; - - QTest::newRow("wonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f; - - QTest::newRow("all") - << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)8.0f - << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)9.0f - << (qreal)5.0f << (qreal)7.0f << (qreal)-3.0f << (qreal)17.0f; -} -void tst_QVector::add4() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, w2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - QFETCH(qreal, w3); - - QVector4D v1(x1, y1, z1, w1); - QVector4D v2(x2, y2, z2, w2); - QVector4D v3(x3, y3, z3, w3); - - QVERIFY((v1 + v2) == v3); - - QVector4D v4(v1); - v4 += v2; - QVERIFY(v4 == v3); - - QCOMPARE(v4.x(), v1.x() + v2.x()); - QCOMPARE(v4.y(), v1.y() + v2.y()); - QCOMPARE(v4.z(), v1.z() + v2.z()); - QCOMPARE(v4.w(), v1.w() + v2.w()); -} - -// Test vector subtraction for 2D vectors. -void tst_QVector::subtract2_data() -{ - // Use the same test data as the add test. - add2_data(); -} -void tst_QVector::subtract2() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - - QVector2D v1(x1, y1); - QVector2D v2(x2, y2); - QVector2D v3(x3, y3); - - QVERIFY((v3 - v1) == v2); - QVERIFY((v3 - v2) == v1); - - QVector2D v4(v3); - v4 -= v1; - QVERIFY(v4 == v2); - - QCOMPARE(v4.x(), v3.x() - v1.x()); - QCOMPARE(v4.y(), v3.y() - v1.y()); - - QVector2D v5(v3); - v5 -= v2; - QVERIFY(v5 == v1); - - QCOMPARE(v5.x(), v3.x() - v2.x()); - QCOMPARE(v5.y(), v3.y() - v2.y()); -} - -// Test vector subtraction for 3D vectors. -void tst_QVector::subtract3_data() -{ - // Use the same test data as the add test. - add3_data(); -} -void tst_QVector::subtract3() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - - QVector3D v1(x1, y1, z1); - QVector3D v2(x2, y2, z2); - QVector3D v3(x3, y3, z3); - - QVERIFY((v3 - v1) == v2); - QVERIFY((v3 - v2) == v1); - - QVector3D v4(v3); - v4 -= v1; - QVERIFY(v4 == v2); - - QCOMPARE(v4.x(), v3.x() - v1.x()); - QCOMPARE(v4.y(), v3.y() - v1.y()); - QCOMPARE(v4.z(), v3.z() - v1.z()); - - QVector3D v5(v3); - v5 -= v2; - QVERIFY(v5 == v1); - - QCOMPARE(v5.x(), v3.x() - v2.x()); - QCOMPARE(v5.y(), v3.y() - v2.y()); - QCOMPARE(v5.z(), v3.z() - v2.z()); -} - -// Test vector subtraction for 4D vectors. -void tst_QVector::subtract4_data() -{ - // Use the same test data as the add test. - add4_data(); -} -void tst_QVector::subtract4() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, w2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - QFETCH(qreal, w3); - - QVector4D v1(x1, y1, z1, w1); - QVector4D v2(x2, y2, z2, w2); - QVector4D v3(x3, y3, z3, w3); - - QVERIFY((v3 - v1) == v2); - QVERIFY((v3 - v2) == v1); - - QVector4D v4(v3); - v4 -= v1; - QVERIFY(v4 == v2); - - QCOMPARE(v4.x(), v3.x() - v1.x()); - QCOMPARE(v4.y(), v3.y() - v1.y()); - QCOMPARE(v4.z(), v3.z() - v1.z()); - QCOMPARE(v4.w(), v3.w() - v1.w()); - - QVector4D v5(v3); - v5 -= v2; - QVERIFY(v5 == v1); - - QCOMPARE(v5.x(), v3.x() - v2.x()); - QCOMPARE(v5.y(), v3.y() - v2.y()); - QCOMPARE(v5.z(), v3.z() - v2.z()); - QCOMPARE(v5.w(), v3.w() - v2.w()); -} - -// Test component-wise vector multiplication for 2D vectors. -void tst_QVector::multiply2_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("x3"); - QTest::addColumn("y3"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f - << (qreal)2.0f << (qreal)0.0f - << (qreal)2.0f << (qreal)0.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)2.0f - << (qreal)0.0f << (qreal)2.0f; - - QTest::newRow("all") - << (qreal)1.0f << (qreal)2.0f - << (qreal)4.0f << (qreal)5.0f - << (qreal)4.0f << (qreal)10.0f; -} -void tst_QVector::multiply2() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - - QVector2D v1(x1, y1); - QVector2D v2(x2, y2); - QVector2D v3(x3, y3); - - QVERIFY((v1 * v2) == v3); - - QVector2D v4(v1); - v4 *= v2; - QVERIFY(v4 == v3); - - QCOMPARE(v4.x(), v1.x() * v2.x()); - QCOMPARE(v4.y(), v1.y() * v2.y()); -} - -// Test component-wise vector multiplication for 3D vectors. -void tst_QVector::multiply3_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("x3"); - QTest::addColumn("y3"); - QTest::addColumn("z3"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f; - - QTest::newRow("zonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f; - - QTest::newRow("all") - << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f - << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f - << (qreal)4.0f << (qreal)10.0f << (qreal)-18.0f; -} -void tst_QVector::multiply3() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - - QVector3D v1(x1, y1, z1); - QVector3D v2(x2, y2, z2); - QVector3D v3(x3, y3, z3); - - QVERIFY((v1 * v2) == v3); - - QVector3D v4(v1); - v4 *= v2; - QVERIFY(v4 == v3); - - QCOMPARE(v4.x(), v1.x() * v2.x()); - QCOMPARE(v4.y(), v1.y() * v2.y()); - QCOMPARE(v4.z(), v1.z() * v2.z()); -} - -// Test component-wise vector multiplication for 4D vectors. -void tst_QVector::multiply4_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("w1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("w2"); - QTest::addColumn("x3"); - QTest::addColumn("y3"); - QTest::addColumn("z3"); - QTest::addColumn("w3"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("zonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f; - - QTest::newRow("wonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f; - - QTest::newRow("all") - << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)8.0f - << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)9.0f - << (qreal)4.0f << (qreal)10.0f << (qreal)-18.0f << (qreal)72.0f; -} -void tst_QVector::multiply4() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, w2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - QFETCH(qreal, w3); - - QVector4D v1(x1, y1, z1, w1); - QVector4D v2(x2, y2, z2, w2); - QVector4D v3(x3, y3, z3, w3); - - QVERIFY((v1 * v2) == v3); - - QVector4D v4(v1); - v4 *= v2; - QVERIFY(v4 == v3); - - QCOMPARE(v4.x(), v1.x() * v2.x()); - QCOMPARE(v4.y(), v1.y() * v2.y()); - QCOMPARE(v4.z(), v1.z() * v2.z()); - QCOMPARE(v4.w(), v1.w() * v2.w()); -} - -// Test vector multiplication by a factor for 2D vectors. -void tst_QVector::multiplyFactor2_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("factor"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f - << (qreal)100.0f - << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f - << (qreal)2.0f - << (qreal)2.0f << (qreal)0.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f - << (qreal)2.0f - << (qreal)0.0f << (qreal)2.0f; - - QTest::newRow("all") - << (qreal)1.0f << (qreal)2.0f - << (qreal)2.0f - << (qreal)2.0f << (qreal)4.0f; - - QTest::newRow("allzero") - << (qreal)1.0f << (qreal)2.0f - << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f; -} -void tst_QVector::multiplyFactor2() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, factor); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - - QVector2D v1(x1, y1); - QVector2D v2(x2, y2); - - QVERIFY((v1 * factor) == v2); - QVERIFY((factor * v1) == v2); - - QVector2D v3(v1); - v3 *= factor; - QVERIFY(v3 == v2); - - QCOMPARE(v3.x(), v1.x() * factor); - QCOMPARE(v3.y(), v1.y() * factor); -} - -// Test vector multiplication by a factor for 3D vectors. -void tst_QVector::multiplyFactor3_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("factor"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)100.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f - << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f - << (qreal)2.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f; - - QTest::newRow("zonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)2.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f; - - QTest::newRow("all") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f - << (qreal)2.0f - << (qreal)2.0f << (qreal)4.0f << (qreal)-6.0f; - - QTest::newRow("allzero") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f - << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; -} -void tst_QVector::multiplyFactor3() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, factor); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - - QVector3D v1(x1, y1, z1); - QVector3D v2(x2, y2, z2); - - QVERIFY((v1 * factor) == v2); - QVERIFY((factor * v1) == v2); - - QVector3D v3(v1); - v3 *= factor; - QVERIFY(v3 == v2); - - QCOMPARE(v3.x(), v1.x() * factor); - QCOMPARE(v3.y(), v1.y() * factor); - QCOMPARE(v3.z(), v1.z() * factor); -} - -// Test vector multiplication by a factor for 4D vectors. -void tst_QVector::multiplyFactor4_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("w1"); - QTest::addColumn("factor"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("w2"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)100.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("xonly") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f - << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("yonly") - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)2.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f; - - QTest::newRow("zonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f - << (qreal)2.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f; - - QTest::newRow("wonly") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)2.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f; - - QTest::newRow("all") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f - << (qreal)2.0f - << (qreal)2.0f << (qreal)4.0f << (qreal)-6.0f << (qreal)8.0f; - - QTest::newRow("allzero") - << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f - << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; -} -void tst_QVector::multiplyFactor4() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - QFETCH(qreal, factor); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, w2); - - QVector4D v1(x1, y1, z1, w1); - QVector4D v2(x2, y2, z2, w2); - - QVERIFY((v1 * factor) == v2); - QVERIFY((factor * v1) == v2); - - QVector4D v3(v1); - v3 *= factor; - QVERIFY(v3 == v2); - - QCOMPARE(v3.x(), v1.x() * factor); - QCOMPARE(v3.y(), v1.y() * factor); - QCOMPARE(v3.z(), v1.z() * factor); - QCOMPARE(v3.w(), v1.w() * factor); -} - -// Test vector division by a factor for 2D vectors. -void tst_QVector::divide2_data() -{ - // Use the same test data as the multiply test. - multiplyFactor2_data(); -} -void tst_QVector::divide2() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, factor); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - - QVector2D v1(x1, y1); - QVector2D v2(x2, y2); - - if (factor == (qreal)0.0f) - return; - - QVERIFY((v2 / factor) == v1); - - QVector2D v3(v2); - v3 /= factor; - QVERIFY(v3 == v1); - - QCOMPARE(v3.x(), v2.x() / factor); - QCOMPARE(v3.y(), v2.y() / factor); -} - -// Test vector division by a factor for 3D vectors. -void tst_QVector::divide3_data() -{ - // Use the same test data as the multiply test. - multiplyFactor3_data(); -} -void tst_QVector::divide3() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, factor); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - - QVector3D v1(x1, y1, z1); - QVector3D v2(x2, y2, z2); - - if (factor == (qreal)0.0f) - return; - - QVERIFY((v2 / factor) == v1); - - QVector3D v3(v2); - v3 /= factor; - QVERIFY(v3 == v1); - - QCOMPARE(v3.x(), v2.x() / factor); - QCOMPARE(v3.y(), v2.y() / factor); - QCOMPARE(v3.z(), v2.z() / factor); -} - -// Test vector division by a factor for 4D vectors. -void tst_QVector::divide4_data() -{ - // Use the same test data as the multiply test. - multiplyFactor4_data(); -} -void tst_QVector::divide4() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - QFETCH(qreal, factor); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, w2); - - QVector4D v1(x1, y1, z1, w1); - QVector4D v2(x2, y2, z2, w2); - - if (factor == (qreal)0.0f) - return; - - QVERIFY((v2 / factor) == v1); - - QVector4D v3(v2); - v3 /= factor; - QVERIFY(v3 == v1); - - QCOMPARE(v3.x(), v2.x() / factor); - QCOMPARE(v3.y(), v2.y() / factor); - QCOMPARE(v3.z(), v2.z() / factor); - QCOMPARE(v3.w(), v2.w() / factor); -} - -// Test vector negation for 2D vectors. -void tst_QVector::negate2_data() -{ - // Use the same test data as the add test. - add2_data(); -} -void tst_QVector::negate2() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - - QVector2D v1(x1, y1); - QVector2D v2(-x1, -y1); - - QVERIFY(-v1 == v2); -} - -// Test vector negation for 3D vectors. -void tst_QVector::negate3_data() -{ - // Use the same test data as the add test. - add3_data(); -} -void tst_QVector::negate3() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - - QVector3D v1(x1, y1, z1); - QVector3D v2(-x1, -y1, -z1); - - QVERIFY(-v1 == v2); -} - -// Test vector negation for 4D vectors. -void tst_QVector::negate4_data() -{ - // Use the same test data as the add test. - add4_data(); -} -void tst_QVector::negate4() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - - QVector4D v1(x1, y1, z1, w1); - QVector4D v2(-x1, -y1, -z1, -w1); - - QVERIFY(-v1 == v2); -} - -// Test the computation of vector cross-products. -void tst_QVector::crossProduct_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("x3"); - QTest::addColumn("y3"); - QTest::addColumn("z3"); - QTest::addColumn("dot"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f; - - QTest::newRow("unitvec") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f; - - QTest::newRow("complex") - << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f - << (qreal)4.0f << (qreal)5.0f << (qreal)6.0f - << (qreal)-3.0f << (qreal)6.0f << (qreal)-3.0f - << (qreal)32.0f; -} -void tst_QVector::crossProduct() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - - QVector3D v1(x1, y1, z1); - QVector3D v2(x2, y2, z2); - QVector3D v3(x3, y3, z3); - - QVector3D v4 = QVector3D::crossProduct(v1, v2); - QVERIFY(v4 == v3); - - // Compute the cross-product long-hand and check again. - qreal xres = y1 * z2 - z1 * y2; - qreal yres = z1 * x2 - x1 * z2; - qreal zres = x1 * y2 - y1 * x2; - - QCOMPARE(v4.x(), xres); - QCOMPARE(v4.y(), yres); - QCOMPARE(v4.z(), zres); -} - -// Test the computation of normals. -void tst_QVector::normal_data() -{ - // Use the same test data as the crossProduct test. - crossProduct_data(); -} -void tst_QVector::normal() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - - QVector3D v1(x1, y1, z1); - QVector3D v2(x2, y2, z2); - QVector3D v3(x3, y3, z3); - - QVERIFY(QVector3D::normal(v1, v2) == v3.normalized()); - QVERIFY(QVector3D::normal(QVector3D(), v1, v2) == v3.normalized()); - - QVector3D point(1.0f, 2.0f, 3.0f); - QVERIFY(QVector3D::normal(point, v1 + point, v2 + point) == v3.normalized()); -} - -// Test distance to plane calculations. -void tst_QVector::distanceToPlane_data() -{ - QTest::addColumn("x1"); // Point on plane - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("x2"); // Normal to plane - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("x3"); // Point to test for distance - QTest::addColumn("y3"); - QTest::addColumn("z3"); - QTest::addColumn("x4"); // Second point on plane - QTest::addColumn("y4"); - QTest::addColumn("z4"); - QTest::addColumn("x5"); // Third point on plane - QTest::addColumn("y5"); - QTest::addColumn("z5"); - QTest::addColumn("distance"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f - << (qreal)0.0f; - - QTest::newRow("above") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f - << (qreal)2.0f; - - QTest::newRow("below") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)-1.0f << (qreal)1.0f << (qreal)-2.0f - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f - << (qreal)-2.0f; -} -void tst_QVector::distanceToPlane() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - QFETCH(qreal, x4); - QFETCH(qreal, y4); - QFETCH(qreal, z4); - QFETCH(qreal, x5); - QFETCH(qreal, y5); - QFETCH(qreal, z5); - QFETCH(qreal, distance); - - QVector3D v1(x1, y1, z1); - QVector3D v2(x2, y2, z2); - QVector3D v3(x3, y3, z3); - QVector3D v4(x4, y4, z4); - QVector3D v5(x5, y5, z5); - - QCOMPARE(v3.distanceToPlane(v1, v2), distance); - QCOMPARE(v3.distanceToPlane(v1, v4, v5), distance); -} - -// Test distance to line calculations. -void tst_QVector::distanceToLine_data() -{ - QTest::addColumn("x1"); // Point on line - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("x2"); // Direction of the line - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("x3"); // Point to test for distance - QTest::addColumn("y3"); - QTest::addColumn("z3"); - QTest::addColumn("distance"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f; - - QTest::newRow("on line") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)5.0f - << (qreal)0.0f; - - QTest::newRow("off line") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)1.0f; - - QTest::newRow("off line 2") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f << (qreal)-2.0f << (qreal)0.0f - << (qreal)2.0f; - - QTest::newRow("points") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)5.0f << (qreal)0.0f - << (qreal)5.0f; -} -void tst_QVector::distanceToLine() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - QFETCH(qreal, distance); - - QVector3D v1(x1, y1, z1); - QVector3D v2(x2, y2, z2); - QVector3D v3(x3, y3, z3); - - QCOMPARE(v3.distanceToLine(v1, v2), distance); -} - -// Test the computation of dot products for 2D vectors. -void tst_QVector::dotProduct2_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("dot"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f; - - QTest::newRow("unitvec") - << (qreal)1.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)1.0f - << (qreal)0.0f; - - QTest::newRow("complex") - << (qreal)1.0f << (qreal)2.0f - << (qreal)4.0f << (qreal)5.0f - << (qreal)14.0f; -} -void tst_QVector::dotProduct2() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, dot); - - QVector2D v1(x1, y1); - QVector2D v2(x2, y2); - - QVERIFY(QVector2D::dotProduct(v1, v2) == dot); - - // Compute the dot-product long-hand and check again. - qreal d = x1 * x2 + y1 * y2; - - QCOMPARE(QVector2D::dotProduct(v1, v2), d); -} - -// Test the computation of dot products for 3D vectors. -void tst_QVector::dotProduct3_data() -{ - // Use the same test data as the crossProduct test. - crossProduct_data(); -} -void tst_QVector::dotProduct3() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, x3); - QFETCH(qreal, y3); - QFETCH(qreal, z3); - QFETCH(qreal, dot); - - Q_UNUSED(x3); - Q_UNUSED(y3); - Q_UNUSED(z3); - - QVector3D v1(x1, y1, z1); - QVector3D v2(x2, y2, z2); - - QVERIFY(QVector3D::dotProduct(v1, v2) == dot); - - // Compute the dot-product long-hand and check again. - qreal d = x1 * x2 + y1 * y2 + z1 * z2; - - QCOMPARE(QVector3D::dotProduct(v1, v2), d); -} - -// Test the computation of dot products for 4D vectors. -void tst_QVector::dotProduct4_data() -{ - QTest::addColumn("x1"); - QTest::addColumn("y1"); - QTest::addColumn("z1"); - QTest::addColumn("w1"); - QTest::addColumn("x2"); - QTest::addColumn("y2"); - QTest::addColumn("z2"); - QTest::addColumn("w2"); - QTest::addColumn("dot"); - - QTest::newRow("null") - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f; - - QTest::newRow("unitvec") - << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f - << (qreal)0.0f; - - QTest::newRow("complex") - << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)4.0f - << (qreal)4.0f << (qreal)5.0f << (qreal)6.0f << (qreal)7.0f - << (qreal)60.0f; -} -void tst_QVector::dotProduct4() -{ - QFETCH(qreal, x1); - QFETCH(qreal, y1); - QFETCH(qreal, z1); - QFETCH(qreal, w1); - QFETCH(qreal, x2); - QFETCH(qreal, y2); - QFETCH(qreal, z2); - QFETCH(qreal, w2); - QFETCH(qreal, dot); - - QVector4D v1(x1, y1, z1, w1); - QVector4D v2(x2, y2, z2, w2); - - QVERIFY(QVector4D::dotProduct(v1, v2) == dot); - - // Compute the dot-product long-hand and check again. - qreal d = x1 * x2 + y1 * y2 + z1 * z2 + w1 * w2; - - QCOMPARE(QVector4D::dotProduct(v1, v2), d); -} - -class tst_QVectorProperties : public QObject -{ - Q_OBJECT - Q_PROPERTY(QVector2D vector2D READ vector2D WRITE setVector2D) - Q_PROPERTY(QVector3D vector3D READ vector3D WRITE setVector3D) - Q_PROPERTY(QVector4D vector4D READ vector4D WRITE setVector4D) -public: - tst_QVectorProperties(QObject *parent = 0) : QObject(parent) {} - - QVector2D vector2D() const { return v2; } - void setVector2D(const QVector2D& value) { v2 = value; } - - QVector3D vector3D() const { return v3; } - void setVector3D(const QVector3D& value) { v3 = value; } - - QVector4D vector4D() const { return v4; } - void setVector4D(const QVector4D& value) { v4 = value; } - -private: - QVector2D v2; - QVector3D v3; - QVector4D v4; -}; - -// Test getting and setting vector properties via the metaobject system. -void tst_QVector::properties() -{ - tst_QVectorProperties obj; - - obj.setVector2D(QVector2D(1.0f, 2.0f)); - obj.setVector3D(QVector3D(3.0f, 4.0f, 5.0f)); - obj.setVector4D(QVector4D(6.0f, 7.0f, 8.0f, 9.0f)); - - QVector2D v2 = qVariantValue(obj.property("vector2D")); - QCOMPARE(v2.x(), (qreal)1.0f); - QCOMPARE(v2.y(), (qreal)2.0f); - - QVector3D v3 = qVariantValue(obj.property("vector3D")); - QCOMPARE(v3.x(), (qreal)3.0f); - QCOMPARE(v3.y(), (qreal)4.0f); - QCOMPARE(v3.z(), (qreal)5.0f); - - QVector4D v4 = qVariantValue(obj.property("vector4D")); - QCOMPARE(v4.x(), (qreal)6.0f); - QCOMPARE(v4.y(), (qreal)7.0f); - QCOMPARE(v4.z(), (qreal)8.0f); - QCOMPARE(v4.w(), (qreal)9.0f); - - obj.setProperty("vector2D", - qVariantFromValue(QVector2D(-1.0f, -2.0f))); - obj.setProperty("vector3D", - qVariantFromValue(QVector3D(-3.0f, -4.0f, -5.0f))); - obj.setProperty("vector4D", - qVariantFromValue(QVector4D(-6.0f, -7.0f, -8.0f, -9.0f))); - - v2 = qVariantValue(obj.property("vector2D")); - QCOMPARE(v2.x(), (qreal)-1.0f); - QCOMPARE(v2.y(), (qreal)-2.0f); - - v3 = qVariantValue(obj.property("vector3D")); - QCOMPARE(v3.x(), (qreal)-3.0f); - QCOMPARE(v3.y(), (qreal)-4.0f); - QCOMPARE(v3.z(), (qreal)-5.0f); - - v4 = qVariantValue(obj.property("vector4D")); - QCOMPARE(v4.x(), (qreal)-6.0f); - QCOMPARE(v4.y(), (qreal)-7.0f); - QCOMPARE(v4.z(), (qreal)-8.0f); - QCOMPARE(v4.w(), (qreal)-9.0f); -} - -void tst_QVector::metaTypes() -{ - QVERIFY(QMetaType::type("QVector2D") == QMetaType::QVector2D); - QVERIFY(QMetaType::type("QVector3D") == QMetaType::QVector3D); - QVERIFY(QMetaType::type("QVector4D") == QMetaType::QVector4D); - - QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector2D)), - QByteArray("QVector2D")); - QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector3D)), - QByteArray("QVector3D")); - QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector4D)), - QByteArray("QVector4D")); - - QVERIFY(QMetaType::isRegistered(QMetaType::QVector2D)); - QVERIFY(QMetaType::isRegistered(QMetaType::QVector3D)); - QVERIFY(QMetaType::isRegistered(QMetaType::QVector4D)); - - QVERIFY(qMetaTypeId() == QMetaType::QVector2D); - QVERIFY(qMetaTypeId() == QMetaType::QVector3D); - QVERIFY(qMetaTypeId() == QMetaType::QVector4D); -} - -QTEST_APPLESS_MAIN(tst_QVector) - -#include "tst_qvectornd.moc" diff --git a/tests/auto/math3d/shared/math3dincludes.h b/tests/auto/math3d/shared/math3dincludes.h deleted file mode 100644 index 243c5a5..0000000 --- a/tests/auto/math3d/shared/math3dincludes.h +++ /dev/null @@ -1,52 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** No Commercial Usage -** This file contains pre-release code and may not be distributed. -** You may use this file in accordance with the terms and conditions -** contained in the either Technology Preview License Agreement or the -** Beta Release License Agreement. -** -** 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, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, 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. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef MATH3DINCLUDES_H -#define MATH3DINCLUDES_H - -#include -#include -#include -#include -#include -#include - -#endif diff --git a/tests/auto/qmatrixnxn/qmatrixnxn.pro b/tests/auto/qmatrixnxn/qmatrixnxn.pro new file mode 100644 index 0000000..cf6e4a1 --- /dev/null +++ b/tests/auto/qmatrixnxn/qmatrixnxn.pro @@ -0,0 +1,2 @@ +load(qttest_p4) +SOURCES += tst_qmatrixnxn.cpp diff --git a/tests/auto/qmatrixnxn/tst_qmatrixnxn.cpp b/tests/auto/qmatrixnxn/tst_qmatrixnxn.cpp new file mode 100644 index 0000000..b8c04c0 --- /dev/null +++ b/tests/auto/qmatrixnxn/tst_qmatrixnxn.cpp @@ -0,0 +1,3383 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** 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, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +class tst_QMatrixNxN : public QObject +{ + Q_OBJECT +public: + tst_QMatrixNxN() {} + ~tst_QMatrixNxN() {} + +private slots: + void create2x2(); + void create3x3(); + void create4x4(); + void create4x3(); + + void isIdentity2x2(); + void isIdentity3x3(); + void isIdentity4x4(); + void isIdentity4x3(); + + void compare2x2(); + void compare3x3(); + void compare4x4(); + void compare4x3(); + + void transposed2x2(); + void transposed3x3(); + void transposed4x4(); + void transposed4x3(); + + void add2x2_data(); + void add2x2(); + void add3x3_data(); + void add3x3(); + void add4x4_data(); + void add4x4(); + void add4x3_data(); + void add4x3(); + + void subtract2x2_data(); + void subtract2x2(); + void subtract3x3_data(); + void subtract3x3(); + void subtract4x4_data(); + void subtract4x4(); + void subtract4x3_data(); + void subtract4x3(); + + void multiply2x2_data(); + void multiply2x2(); + void multiply3x3_data(); + void multiply3x3(); + void multiply4x4_data(); + void multiply4x4(); + void multiply4x3_data(); + void multiply4x3(); + + void multiplyFactor2x2_data(); + void multiplyFactor2x2(); + void multiplyFactor3x3_data(); + void multiplyFactor3x3(); + void multiplyFactor4x4_data(); + void multiplyFactor4x4(); + void multiplyFactor4x3_data(); + void multiplyFactor4x3(); + + void divideFactor2x2_data(); + void divideFactor2x2(); + void divideFactor3x3_data(); + void divideFactor3x3(); + void divideFactor4x4_data(); + void divideFactor4x4(); + void divideFactor4x3_data(); + void divideFactor4x3(); + + void negate2x2_data(); + void negate2x2(); + void negate3x3_data(); + void negate3x3(); + void negate4x4_data(); + void negate4x4(); + void negate4x3_data(); + void negate4x3(); + + void inverted4x4_data(); + void inverted4x4(); + + void orthonormalInverse4x4(); + + void scale4x4_data(); + void scale4x4(); + + void translate4x4_data(); + void translate4x4(); + + void rotate4x4_data(); + void rotate4x4(); + + void normalMatrix_data(); + void normalMatrix(); + + void optimizedTransforms(); + + void ortho(); + void frustum(); + void perspective(); + void flipCoordinates(); + + void convertGeneric(); + + void extractAxisRotation_data(); + void extractAxisRotation(); + + void extractTranslation_data(); + void extractTranslation(); + + void inferSpecialType_data(); + void inferSpecialType(); + + void columnsAndRows(); + + void convertQMatrix(); + void convertQTransform(); + + void fill(); + + void mapRect_data(); + void mapRect(); + + void properties(); + void metaTypes(); + +private: + static void setMatrix(QMatrix2x2& m, const qreal *values); + static void setMatrixDirect(QMatrix2x2& m, const qreal *values); + static bool isSame(const QMatrix2x2& m, const qreal *values); + static bool isIdentity(const QMatrix2x2& m); + + static void setMatrix(QMatrix3x3& m, const qreal *values); + static void setMatrixDirect(QMatrix3x3& m, const qreal *values); + static bool isSame(const QMatrix3x3& m, const qreal *values); + static bool isIdentity(const QMatrix3x3& m); + + static void setMatrix(QMatrix4x4& m, const qreal *values); + static void setMatrixDirect(QMatrix4x4& m, const qreal *values); + static bool isSame(const QMatrix4x4& m, const qreal *values); + static bool isIdentity(const QMatrix4x4& m); + + static void setMatrix(QMatrix4x3& m, const qreal *values); + static void setMatrixDirect(QMatrix4x3& m, const qreal *values); + static bool isSame(const QMatrix4x3& m, const qreal *values); + static bool isIdentity(const QMatrix4x3& m); +}; + +static const qreal nullValues2[] = + {0.0f, 0.0f, + 0.0f, 0.0f}; + +static qreal const identityValues2[16] = + {1.0f, 0.0f, + 0.0f, 1.0f}; + +static const qreal doubleIdentity2[] = + {2.0f, 0.0f, + 0.0f, 2.0f}; + +static qreal const uniqueValues2[16] = + {1.0f, 2.0f, + 5.0f, 6.0f}; + +static qreal const transposedValues2[16] = + {1.0f, 5.0f, + 2.0f, 6.0f}; + +static const qreal nullValues3[] = + {0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f}; + +static qreal const identityValues3[16] = + {1.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 1.0f}; + +static const qreal doubleIdentity3[] = + {2.0f, 0.0f, 0.0f, + 0.0f, 2.0f, 0.0f, + 0.0f, 0.0f, 2.0f}; + +static qreal const uniqueValues3[16] = + {1.0f, 2.0f, 3.0f, + 5.0f, 6.0f, 7.0f, + 9.0f, 10.0f, 11.0f}; + +static qreal const transposedValues3[16] = + {1.0f, 5.0f, 9.0f, + 2.0f, 6.0f, 10.0f, + 3.0f, 7.0f, 11.0f}; + +static const qreal nullValues4[] = + {0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f}; + +static qreal const identityValues4[16] = + {1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + +static const qreal doubleIdentity4[] = + {2.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 2.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 2.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 2.0f}; + +static qreal const uniqueValues4[16] = + {1.0f, 2.0f, 3.0f, 4.0f, + 5.0f, 6.0f, 7.0f, 8.0f, + 9.0f, 10.0f, 11.0f, 12.0f, + 13.0f, 14.0f, 15.0f, 16.0f}; + +static qreal const transposedValues4[16] = + {1.0f, 5.0f, 9.0f, 13.0f, + 2.0f, 6.0f, 10.0f, 14.0f, + 3.0f, 7.0f, 11.0f, 15.0f, + 4.0f, 8.0f, 12.0f, 16.0f}; + +static const qreal nullValues4x3[] = + {0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f}; + +static qreal const identityValues4x3[12] = + {1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f}; + +static qreal const doubleIdentity4x3[12] = + {2.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 2.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 2.0f, 0.0f}; + +static qreal const uniqueValues4x3[12] = + {1.0f, 2.0f, 3.0f, 4.0f, + 5.0f, 6.0f, 7.0f, 8.0f, + 9.0f, 10.0f, 11.0f, 12.0f}; + +static qreal const transposedValues3x4[12] = + {1.0f, 5.0f, 9.0f, + 2.0f, 6.0f, 10.0f, + 3.0f, 7.0f, 11.0f, + 4.0f, 8.0f, 12.0f}; + +// Set a matrix to a specified array of values, which are assumed +// to be in row-major order. This sets the values using floating-point. +void tst_QMatrixNxN::setMatrix(QMatrix2x2& m, const qreal *values) +{ + for (int row = 0; row < 2; ++row) + for (int col = 0; col < 2; ++col) + m(row, col) = values[row * 2 + col]; +} +void tst_QMatrixNxN::setMatrix(QMatrix3x3& m, const qreal *values) +{ + for (int row = 0; row < 3; ++row) + for (int col = 0; col < 3; ++col) + m(row, col) = values[row * 3 + col]; +} +void tst_QMatrixNxN::setMatrix(QMatrix4x4& m, const qreal *values) +{ + for (int row = 0; row < 4; ++row) + for (int col = 0; col < 4; ++col) + m(row, col) = values[row * 4 + col]; +} +void tst_QMatrixNxN::setMatrix(QMatrix4x3& m, const qreal *values) +{ + for (int row = 0; row < 3; ++row) + for (int col = 0; col < 4; ++col) + m(row, col) = values[row * 4 + col]; +} + +// Set a matrix to a specified array of values, which are assumed +// to be in row-major order. This sets the values directly into +// the internal data() array. +void tst_QMatrixNxN::setMatrixDirect(QMatrix2x2& m, const qreal *values) +{ + float *data = m.data(); + for (int row = 0; row < 2; ++row) { + for (int col = 0; col < 2; ++col) { + data[row + col * 2] = values[row * 2 + col]; + } + } +} +void tst_QMatrixNxN::setMatrixDirect(QMatrix3x3& m, const qreal *values) +{ + float *data = m.data(); + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 3; ++col) { + data[row + col * 3] = values[row * 3 + col]; + } + } +} +void tst_QMatrixNxN::setMatrixDirect(QMatrix4x4& m, const qreal *values) +{ + float *data = m.data(); + for (int row = 0; row < 4; ++row) { + for (int col = 0; col < 4; ++col) { + data[row + col * 4] = values[row * 4 + col]; + } + } +} +void tst_QMatrixNxN::setMatrixDirect(QMatrix4x3& m, const qreal *values) +{ + float *data = m.data(); + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 4; ++col) { + data[row + col * 3] = values[row * 4 + col]; + } + } +} + +// qFuzzyCompare isn't always "fuzzy" enough to handle conversion +// between float, double, and qreal. So create "fuzzier" compares. +static bool fuzzyCompare(float x, float y, qreal epsilon = 0.001) +{ + float diff = x - y; + if (diff < 0.0f) + diff = -diff; + return (diff < epsilon); +} + +static bool fuzzyCompare(const QVector3D &v1, const QVector3D &v2, qreal epsilon = 0.001) +{ + if (!fuzzyCompare(v1.x(), v2.x(), epsilon)) + return false; + if (!fuzzyCompare(v1.y(), v2.y(), epsilon)) + return false; + if (!fuzzyCompare(v1.z(), v2.z(), epsilon)) + return false; + return true; +} + +static bool matrixFuzzyCompare(const QMatrix4x4 &m1, const QMatrix4x4 &m2) +{ + bool ret = true; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + ret = ret && fuzzyCompare(m1(i, j), m2(i, j)); + } + } + + return ret; +} + +// Determine if a matrix is the same as a specified array of values. +// The values are assumed to be specified in row-major order. +bool tst_QMatrixNxN::isSame(const QMatrix2x2& m, const qreal *values) +{ + const float *mv = m.constData(); + for (int row = 0; row < 2; ++row) { + for (int col = 0; col < 2; ++col) { + // Check the values using the operator() function. + if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 2 + col]))) { + qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 2 + col]; + return false; + } + + // Check the values using direct access, which verifies that the values + // are stored internally in column-major order. + if (!fuzzyCompare((float)(mv[col * 2 + row]), (float)(values[row * 2 + col]))) { + qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 2 + row] << "expected =" << values[row * 2 + col]; + return false; + } + } + } + return true; +} +bool tst_QMatrixNxN::isSame(const QMatrix3x3& m, const qreal *values) +{ + const float *mv = m.constData(); + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 3; ++col) { + // Check the values using the operator() access function. + if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 3 + col]))) { + qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 3 + col]; + return false; + } + + // Check the values using direct access, which verifies that the values + // are stored internally in column-major order. + if (!fuzzyCompare((float)(mv[col * 3 + row]), (float)(values[row * 3 + col]))) { + qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 3 + row] << "expected =" << values[row * 3 + col]; + return false; + } + } + } + return true; +} +bool tst_QMatrixNxN::isSame(const QMatrix4x4& m, const qreal *values) +{ + const float *mv = m.constData(); + for (int row = 0; row < 4; ++row) { + for (int col = 0; col < 4; ++col) { + // Check the values using the operator() access function. + if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 4 + col]))) { + qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 4 + col]; + return false; + } + + // Check the values using direct access, which verifies that the values + // are stored internally in column-major order. + if (!fuzzyCompare((float)(mv[col * 4 + row]), (float)(values[row * 4 + col]))) { + qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 4 + row] << "expected =" << values[row * 4 + col]; + return false; + } + } + } + return true; +} +bool tst_QMatrixNxN::isSame(const QMatrix4x3& m, const qreal *values) +{ + const float *mv = m.constData(); + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 4; ++col) { + // Check the values using the operator() access function. + if (!fuzzyCompare((float)(m(row, col)), (float)(values[row * 4 + col]))) { + qDebug() << "floating-point failure at" << row << col << "actual =" << m(row, col) << "expected =" << values[row * 4 + col]; + return false; + } + + // Check the values using direct access, which verifies that the values + // are stored internally in column-major order. + if (!fuzzyCompare((float)(mv[col * 3 + row]), (float)(values[row * 4 + col]))) { + qDebug() << "column floating-point failure at" << row << col << "actual =" << mv[col * 3 + row] << "expected =" << values[row * 4 + col]; + return false; + } + } + } + return true; +} + +// Determine if a matrix is the identity. +bool tst_QMatrixNxN::isIdentity(const QMatrix2x2& m) +{ + return isSame(m, identityValues2); +} +bool tst_QMatrixNxN::isIdentity(const QMatrix3x3& m) +{ + return isSame(m, identityValues3); +} +bool tst_QMatrixNxN::isIdentity(const QMatrix4x4& m) +{ + return isSame(m, identityValues4); +} +bool tst_QMatrixNxN::isIdentity(const QMatrix4x3& m) +{ + return isSame(m, identityValues4x3); +} + +// Test the creation of QMatrix2x2 objects in various ways: +// construct, copy, and modify. +void tst_QMatrixNxN::create2x2() +{ + QMatrix2x2 m1; + QVERIFY(isIdentity(m1)); + QVERIFY(m1.isIdentity()); + + QMatrix2x2 m2; + setMatrix(m2, uniqueValues2); + QVERIFY(isSame(m2, uniqueValues2)); + QVERIFY(!m2.isIdentity()); + + QMatrix2x2 m3; + setMatrixDirect(m3, uniqueValues2); + QVERIFY(isSame(m3, uniqueValues2)); + + QMatrix2x2 m4(m3); + QVERIFY(isSame(m4, uniqueValues2)); + + QMatrix2x2 m5; + m5 = m3; + QVERIFY(isSame(m5, uniqueValues2)); + + m5.setIdentity(); + QVERIFY(isIdentity(m5)); + + QMatrix2x2 m6(uniqueValues2); + QVERIFY(isSame(m6, uniqueValues2)); + qreal vals[4]; + m6.toValueArray(vals); + for (int index = 0; index < 4; ++index) + QCOMPARE((float)(vals[index]), (float)(uniqueValues2[index])); +} + +// Test the creation of QMatrix3x3 objects in various ways: +// construct, copy, and modify. +void tst_QMatrixNxN::create3x3() +{ + QMatrix3x3 m1; + QVERIFY(isIdentity(m1)); + QVERIFY(m1.isIdentity()); + + QMatrix3x3 m2; + setMatrix(m2, uniqueValues3); + QVERIFY(isSame(m2, uniqueValues3)); + QVERIFY(!m2.isIdentity()); + + QMatrix3x3 m3; + setMatrixDirect(m3, uniqueValues3); + QVERIFY(isSame(m3, uniqueValues3)); + + QMatrix3x3 m4(m3); + QVERIFY(isSame(m4, uniqueValues3)); + + QMatrix3x3 m5; + m5 = m3; + QVERIFY(isSame(m5, uniqueValues3)); + + m5.setIdentity(); + QVERIFY(isIdentity(m5)); + + QMatrix3x3 m6(uniqueValues3); + QVERIFY(isSame(m6, uniqueValues3)); + qreal vals[9]; + m6.toValueArray(vals); + for (int index = 0; index < 9; ++index) + QCOMPARE((float)(vals[index]), (float)(uniqueValues3[index])); +} + +// Test the creation of QMatrix4x4 objects in various ways: +// construct, copy, and modify. +void tst_QMatrixNxN::create4x4() +{ + QMatrix4x4 m1; + QVERIFY(isIdentity(m1)); + QVERIFY(m1.isIdentity()); + + QMatrix4x4 m2; + setMatrix(m2, uniqueValues4); + QVERIFY(isSame(m2, uniqueValues4)); + QVERIFY(!m2.isIdentity()); + + QMatrix4x4 m3; + setMatrixDirect(m3, uniqueValues4); + QVERIFY(isSame(m3, uniqueValues4)); + + QMatrix4x4 m4(m3); + QVERIFY(isSame(m4, uniqueValues4)); + + QMatrix4x4 m5; + m5 = m3; + QVERIFY(isSame(m5, uniqueValues4)); + + m5.setIdentity(); + QVERIFY(isIdentity(m5)); + + QMatrix4x4 m6(uniqueValues4); + QVERIFY(isSame(m6, uniqueValues4)); + qreal vals[16]; + m6.toValueArray(vals); + for (int index = 0; index < 16; ++index) + QCOMPARE((float)(vals[index]), (float)(uniqueValues4[index])); + + QMatrix4x4 m8 + (uniqueValues4[0], uniqueValues4[1], uniqueValues4[2], uniqueValues4[3], + uniqueValues4[4], uniqueValues4[5], uniqueValues4[6], uniqueValues4[7], + uniqueValues4[8], uniqueValues4[9], uniqueValues4[10], uniqueValues4[11], + uniqueValues4[12], uniqueValues4[13], uniqueValues4[14], uniqueValues4[15]); + QVERIFY(isSame(m8, uniqueValues4)); +} + +// Test the creation of QMatrix4x3 objects in various ways: +// construct, copy, and modify. +void tst_QMatrixNxN::create4x3() +{ + QMatrix4x3 m1; + QVERIFY(isIdentity(m1)); + QVERIFY(m1.isIdentity()); + + QMatrix4x3 m2; + setMatrix(m2, uniqueValues4x3); + QVERIFY(isSame(m2, uniqueValues4x3)); + QVERIFY(!m2.isIdentity()); + + QMatrix4x3 m3; + setMatrixDirect(m3, uniqueValues4x3); + QVERIFY(isSame(m3, uniqueValues4x3)); + + QMatrix4x3 m4(m3); + QVERIFY(isSame(m4, uniqueValues4x3)); + + QMatrix4x3 m5; + m5 = m3; + QVERIFY(isSame(m5, uniqueValues4x3)); + + m5.setIdentity(); + QVERIFY(isIdentity(m5)); + + QMatrix4x3 m6(uniqueValues4x3); + QVERIFY(isSame(m6, uniqueValues4x3)); + qreal vals[12]; + m6.toValueArray(vals); + for (int index = 0; index < 12; ++index) + QCOMPARE((float)(vals[index]), (float)(uniqueValues4x3[index])); +} + +// Test isIdentity() for 2x2 matrices. +void tst_QMatrixNxN::isIdentity2x2() +{ + for (int i = 0; i < 2 * 2; ++i) { + QMatrix2x2 m; + QVERIFY(m.isIdentity()); + m.data()[i] = 42.0f; + QVERIFY(!m.isIdentity()); + } +} + +// Test isIdentity() for 3x3 matrices. +void tst_QMatrixNxN::isIdentity3x3() +{ + for (int i = 0; i < 3 * 3; ++i) { + QMatrix3x3 m; + QVERIFY(m.isIdentity()); + m.data()[i] = 42.0f; + QVERIFY(!m.isIdentity()); + } +} + +// Test isIdentity() for 4x4 matrices. +void tst_QMatrixNxN::isIdentity4x4() +{ + for (int i = 0; i < 4 * 4; ++i) { + QMatrix4x4 m; + QVERIFY(m.isIdentity()); + m.data()[i] = 42.0f; + QVERIFY(!m.isIdentity()); + } + + // Force the "Identity" flag bit to be lost and check again. + QMatrix4x4 m2; + m2.data()[0] = 1.0f; + QVERIFY(m2.isIdentity()); +} + +// Test isIdentity() for 4x3 matrices. +void tst_QMatrixNxN::isIdentity4x3() +{ + for (int i = 0; i < 4 * 3; ++i) { + QMatrix4x3 m; + QVERIFY(m.isIdentity()); + m.data()[i] = 42.0f; + QVERIFY(!m.isIdentity()); + } +} + +// Test 2x2 matrix comparisons. +void tst_QMatrixNxN::compare2x2() +{ + QMatrix2x2 m1(uniqueValues2); + QMatrix2x2 m2(uniqueValues2); + QMatrix2x2 m3(transposedValues2); + + QVERIFY(m1 == m2); + QVERIFY(!(m1 != m2)); + QVERIFY(m1 != m3); + QVERIFY(!(m1 == m3)); +} + +// Test 3x3 matrix comparisons. +void tst_QMatrixNxN::compare3x3() +{ + QMatrix3x3 m1(uniqueValues3); + QMatrix3x3 m2(uniqueValues3); + QMatrix3x3 m3(transposedValues3); + + QVERIFY(m1 == m2); + QVERIFY(!(m1 != m2)); + QVERIFY(m1 != m3); + QVERIFY(!(m1 == m3)); +} + +// Test 4x4 matrix comparisons. +void tst_QMatrixNxN::compare4x4() +{ + QMatrix4x4 m1(uniqueValues4); + QMatrix4x4 m2(uniqueValues4); + QMatrix4x4 m3(transposedValues4); + + QVERIFY(m1 == m2); + QVERIFY(!(m1 != m2)); + QVERIFY(m1 != m3); + QVERIFY(!(m1 == m3)); +} + +// Test 4x3 matrix comparisons. +void tst_QMatrixNxN::compare4x3() +{ + QMatrix4x3 m1(uniqueValues4x3); + QMatrix4x3 m2(uniqueValues4x3); + QMatrix4x3 m3(transposedValues3x4); + + QVERIFY(m1 == m2); + QVERIFY(!(m1 != m2)); + QVERIFY(m1 != m3); + QVERIFY(!(m1 == m3)); +} + +// Test matrix 2x2 transpose operations. +void tst_QMatrixNxN::transposed2x2() +{ + // Transposing the identity should result in the identity. + QMatrix2x2 m1; + QMatrix2x2 m2 = m1.transposed(); + QVERIFY(isIdentity(m2)); + + // Transpose a more interesting matrix that allows us to track + // exactly where each source element ends up. + QMatrix2x2 m3(uniqueValues2); + QMatrix2x2 m4 = m3.transposed(); + QVERIFY(isSame(m4, transposedValues2)); + + // Transpose in-place, just to check that the compiler is sane. + m3 = m3.transposed(); + QVERIFY(isSame(m3, transposedValues2)); +} + +// Test matrix 3x3 transpose operations. +void tst_QMatrixNxN::transposed3x3() +{ + // Transposing the identity should result in the identity. + QMatrix3x3 m1; + QMatrix3x3 m2 = m1.transposed(); + QVERIFY(isIdentity(m2)); + + // Transpose a more interesting matrix that allows us to track + // exactly where each source element ends up. + QMatrix3x3 m3(uniqueValues3); + QMatrix3x3 m4 = m3.transposed(); + QVERIFY(isSame(m4, transposedValues3)); + + // Transpose in-place, just to check that the compiler is sane. + m3 = m3.transposed(); + QVERIFY(isSame(m3, transposedValues3)); +} + +// Test matrix 4x4 transpose operations. +void tst_QMatrixNxN::transposed4x4() +{ + // Transposing the identity should result in the identity. + QMatrix4x4 m1; + QMatrix4x4 m2 = m1.transposed(); + QVERIFY(isIdentity(m2)); + + // Transpose a more interesting matrix that allows us to track + // exactly where each source element ends up. + QMatrix4x4 m3(uniqueValues4); + QMatrix4x4 m4 = m3.transposed(); + QVERIFY(isSame(m4, transposedValues4)); + + // Transpose in-place, just to check that the compiler is sane. + m3 = m3.transposed(); + QVERIFY(isSame(m3, transposedValues4)); +} + +// Test matrix 4x3 transpose operations. +void tst_QMatrixNxN::transposed4x3() +{ + QMatrix4x3 m3(uniqueValues4x3); + QMatrix3x4 m4 = m3.transposed(); + qreal values[12]; + m4.toValueArray(values); + for (int index = 0; index < 12; ++index) + QCOMPARE(values[index], transposedValues3x4[index]); +} + +// Test matrix addition for 2x2 matrices. +void tst_QMatrixNxN::add2x2_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("m2Values"); + QTest::addColumn("m3Values"); + + QTest::newRow("null") + << (void *)nullValues2 << (void *)nullValues2 << (void *)nullValues2; + + QTest::newRow("identity/null") + << (void *)identityValues2 << (void *)nullValues2 << (void *)identityValues2; + + QTest::newRow("identity/identity") + << (void *)identityValues2 << (void *)identityValues2 << (void *)doubleIdentity2; + + static qreal const sumValues[16] = + {2.0f, 7.0f, + 7.0f, 12.0f}; + QTest::newRow("unique") + << (void *)uniqueValues2 << (void *)transposedValues2 << (void *)sumValues; +} +void tst_QMatrixNxN::add2x2() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix2x2 m1((const qreal *)m1Values); + QMatrix2x2 m2((const qreal *)m2Values); + + QMatrix2x2 m4(m1); + m4 += m2; + QVERIFY(isSame(m4, (const qreal *)m3Values)); + + QMatrix2x2 m5; + m5 = m1 + m2; + QVERIFY(isSame(m5, (const qreal *)m3Values)); +} + +// Test matrix addition for 3x3 matrices. +void tst_QMatrixNxN::add3x3_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("m2Values"); + QTest::addColumn("m3Values"); + + QTest::newRow("null") + << (void *)nullValues3 << (void *)nullValues3 << (void *)nullValues3; + + QTest::newRow("identity/null") + << (void *)identityValues3 << (void *)nullValues3 << (void *)identityValues3; + + QTest::newRow("identity/identity") + << (void *)identityValues3 << (void *)identityValues3 << (void *)doubleIdentity3; + + static qreal const sumValues[16] = + {2.0f, 7.0f, 12.0f, + 7.0f, 12.0f, 17.0f, + 12.0f, 17.0f, 22.0f}; + QTest::newRow("unique") + << (void *)uniqueValues3 << (void *)transposedValues3 << (void *)sumValues; +} +void tst_QMatrixNxN::add3x3() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix3x3 m1((const qreal *)m1Values); + QMatrix3x3 m2((const qreal *)m2Values); + + QMatrix3x3 m4(m1); + m4 += m2; + QVERIFY(isSame(m4, (const qreal *)m3Values)); + + QMatrix3x3 m5; + m5 = m1 + m2; + QVERIFY(isSame(m5, (const qreal *)m3Values)); +} + +// Test matrix addition for 4x4 matrices. +void tst_QMatrixNxN::add4x4_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("m2Values"); + QTest::addColumn("m3Values"); + + QTest::newRow("null") + << (void *)nullValues4 << (void *)nullValues4 << (void *)nullValues4; + + QTest::newRow("identity/null") + << (void *)identityValues4 << (void *)nullValues4 << (void *)identityValues4; + + QTest::newRow("identity/identity") + << (void *)identityValues4 << (void *)identityValues4 << (void *)doubleIdentity4; + + static qreal const sumValues[16] = + {2.0f, 7.0f, 12.0f, 17.0f, + 7.0f, 12.0f, 17.0f, 22.0f, + 12.0f, 17.0f, 22.0f, 27.0f, + 17.0f, 22.0f, 27.0f, 32.0f}; + QTest::newRow("unique") + << (void *)uniqueValues4 << (void *)transposedValues4 << (void *)sumValues; +} +void tst_QMatrixNxN::add4x4() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix4x4 m1((const qreal *)m1Values); + QMatrix4x4 m2((const qreal *)m2Values); + + QMatrix4x4 m4(m1); + m4 += m2; + QVERIFY(isSame(m4, (const qreal *)m3Values)); + + QMatrix4x4 m5; + m5 = m1 + m2; + QVERIFY(isSame(m5, (const qreal *)m3Values)); +} + +// Test matrix addition for 4x3 matrices. +void tst_QMatrixNxN::add4x3_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("m2Values"); + QTest::addColumn("m3Values"); + + QTest::newRow("null") + << (void *)nullValues4x3 << (void *)nullValues4x3 << (void *)nullValues4x3; + + QTest::newRow("identity/null") + << (void *)identityValues4x3 << (void *)nullValues4x3 << (void *)identityValues4x3; + + QTest::newRow("identity/identity") + << (void *)identityValues4x3 << (void *)identityValues4x3 << (void *)doubleIdentity4x3; + + static qreal const sumValues[16] = + {2.0f, 7.0f, 12.0f, 6.0f, + 11.0f, 16.0f, 10.0f, 15.0f, + 20.0f, 14.0f, 19.0f, 24.0f}; + QTest::newRow("unique") + << (void *)uniqueValues4x3 << (void *)transposedValues3x4 << (void *)sumValues; +} +void tst_QMatrixNxN::add4x3() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix4x3 m1((const qreal *)m1Values); + QMatrix4x3 m2((const qreal *)m2Values); + + QMatrix4x3 m4(m1); + m4 += m2; + QVERIFY(isSame(m4, (const qreal *)m3Values)); + + QMatrix4x3 m5; + m5 = m1 + m2; + QVERIFY(isSame(m5, (const qreal *)m3Values)); +} + +// Test matrix subtraction for 2x2 matrices. +void tst_QMatrixNxN::subtract2x2_data() +{ + // Use the same test cases as the add test. + add2x2_data(); +} +void tst_QMatrixNxN::subtract2x2() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix2x2 m1((const qreal *)m1Values); + QMatrix2x2 m2((const qreal *)m2Values); + QMatrix2x2 m3((const qreal *)m3Values); + + QMatrix2x2 m4(m3); + m4 -= m1; + QVERIFY(isSame(m4, (const qreal *)m2Values)); + + QMatrix2x2 m5; + m5 = m3 - m1; + QVERIFY(isSame(m5, (const qreal *)m2Values)); + + QMatrix2x2 m6(m3); + m6 -= m2; + QVERIFY(isSame(m6, (const qreal *)m1Values)); + + QMatrix2x2 m7; + m7 = m3 - m2; + QVERIFY(isSame(m7, (const qreal *)m1Values)); +} + +// Test matrix subtraction for 3x3 matrices. +void tst_QMatrixNxN::subtract3x3_data() +{ + // Use the same test cases as the add test. + add3x3_data(); +} +void tst_QMatrixNxN::subtract3x3() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix3x3 m1((const qreal *)m1Values); + QMatrix3x3 m2((const qreal *)m2Values); + QMatrix3x3 m3((const qreal *)m3Values); + + QMatrix3x3 m4(m3); + m4 -= m1; + QVERIFY(isSame(m4, (const qreal *)m2Values)); + + QMatrix3x3 m5; + m5 = m3 - m1; + QVERIFY(isSame(m5, (const qreal *)m2Values)); + + QMatrix3x3 m6(m3); + m6 -= m2; + QVERIFY(isSame(m6, (const qreal *)m1Values)); + + QMatrix3x3 m7; + m7 = m3 - m2; + QVERIFY(isSame(m7, (const qreal *)m1Values)); +} + +// Test matrix subtraction for 4x4 matrices. +void tst_QMatrixNxN::subtract4x4_data() +{ + // Use the same test cases as the add test. + add4x4_data(); +} +void tst_QMatrixNxN::subtract4x4() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix4x4 m1((const qreal *)m1Values); + QMatrix4x4 m2((const qreal *)m2Values); + QMatrix4x4 m3((const qreal *)m3Values); + + QMatrix4x4 m4(m3); + m4 -= m1; + QVERIFY(isSame(m4, (const qreal *)m2Values)); + + QMatrix4x4 m5; + m5 = m3 - m1; + QVERIFY(isSame(m5, (const qreal *)m2Values)); + + QMatrix4x4 m6(m3); + m6 -= m2; + QVERIFY(isSame(m6, (const qreal *)m1Values)); + + QMatrix4x4 m7; + m7 = m3 - m2; + QVERIFY(isSame(m7, (const qreal *)m1Values)); +} + +// Test matrix subtraction for 4x3 matrices. +void tst_QMatrixNxN::subtract4x3_data() +{ + // Use the same test cases as the add test. + add4x3_data(); +} +void tst_QMatrixNxN::subtract4x3() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix4x3 m1((const qreal *)m1Values); + QMatrix4x3 m2((const qreal *)m2Values); + QMatrix4x3 m3((const qreal *)m3Values); + + QMatrix4x3 m4(m3); + m4 -= m1; + QVERIFY(isSame(m4, (const qreal *)m2Values)); + + QMatrix4x3 m5; + m5 = m3 - m1; + QVERIFY(isSame(m5, (const qreal *)m2Values)); + + QMatrix4x3 m6(m3); + m6 -= m2; + QVERIFY(isSame(m6, (const qreal *)m1Values)); + + QMatrix4x3 m7; + m7 = m3 - m2; + QVERIFY(isSame(m7, (const qreal *)m1Values)); +} + +// Test matrix multiplication for 2x2 matrices. +void tst_QMatrixNxN::multiply2x2_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("m2Values"); + QTest::addColumn("m3Values"); + + QTest::newRow("null") + << (void *)nullValues2 << (void *)nullValues2 << (void *)nullValues2; + + QTest::newRow("null/unique") + << (void *)nullValues2 << (void *)uniqueValues2 << (void *)nullValues2; + + QTest::newRow("unique/null") + << (void *)uniqueValues2 << (void *)nullValues2 << (void *)nullValues2; + + QTest::newRow("unique/identity") + << (void *)uniqueValues2 << (void *)identityValues2 << (void *)uniqueValues2; + + QTest::newRow("identity/unique") + << (void *)identityValues2 << (void *)uniqueValues2 << (void *)uniqueValues2; + + static qreal uniqueResult[4]; + for (int row = 0; row < 2; ++row) { + for (int col = 0; col < 2; ++col) { + qreal sum = 0.0f; + for (int j = 0; j < 2; ++j) + sum += uniqueValues2[row * 2 + j] * transposedValues2[j * 2 + col]; + uniqueResult[row * 2 + col] = sum; + } + } + + QTest::newRow("unique/transposed") + << (void *)uniqueValues2 << (void *)transposedValues2 << (void *)uniqueResult; +} +void tst_QMatrixNxN::multiply2x2() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix2x2 m1((const qreal *)m1Values); + QMatrix2x2 m2((const qreal *)m2Values); + + QMatrix2x2 m5; + m5 = m1 * m2; + QVERIFY(isSame(m5, (const qreal *)m3Values)); +} + +// Test matrix multiplication for 3x3 matrices. +void tst_QMatrixNxN::multiply3x3_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("m2Values"); + QTest::addColumn("m3Values"); + + QTest::newRow("null") + << (void *)nullValues3 << (void *)nullValues3 << (void *)nullValues3; + + QTest::newRow("null/unique") + << (void *)nullValues3 << (void *)uniqueValues3 << (void *)nullValues3; + + QTest::newRow("unique/null") + << (void *)uniqueValues3 << (void *)nullValues3 << (void *)nullValues3; + + QTest::newRow("unique/identity") + << (void *)uniqueValues3 << (void *)identityValues3 << (void *)uniqueValues3; + + QTest::newRow("identity/unique") + << (void *)identityValues3 << (void *)uniqueValues3 << (void *)uniqueValues3; + + static qreal uniqueResult[9]; + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 3; ++col) { + qreal sum = 0.0f; + for (int j = 0; j < 3; ++j) + sum += uniqueValues3[row * 3 + j] * transposedValues3[j * 3 + col]; + uniqueResult[row * 3 + col] = sum; + } + } + + QTest::newRow("unique/transposed") + << (void *)uniqueValues3 << (void *)transposedValues3 << (void *)uniqueResult; +} +void tst_QMatrixNxN::multiply3x3() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix3x3 m1((const qreal *)m1Values); + QMatrix3x3 m2((const qreal *)m2Values); + + QMatrix3x3 m5; + m5 = m1 * m2; + QVERIFY(isSame(m5, (const qreal *)m3Values)); +} + +// Test matrix multiplication for 4x4 matrices. +void tst_QMatrixNxN::multiply4x4_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("m2Values"); + QTest::addColumn("m3Values"); + + QTest::newRow("null") + << (void *)nullValues4 << (void *)nullValues4 << (void *)nullValues4; + + QTest::newRow("null/unique") + << (void *)nullValues4 << (void *)uniqueValues4 << (void *)nullValues4; + + QTest::newRow("unique/null") + << (void *)uniqueValues4 << (void *)nullValues4 << (void *)nullValues4; + + QTest::newRow("unique/identity") + << (void *)uniqueValues4 << (void *)identityValues4 << (void *)uniqueValues4; + + QTest::newRow("identity/unique") + << (void *)identityValues4 << (void *)uniqueValues4 << (void *)uniqueValues4; + + static qreal uniqueResult[16]; + for (int row = 0; row < 4; ++row) { + for (int col = 0; col < 4; ++col) { + qreal sum = 0.0f; + for (int j = 0; j < 4; ++j) + sum += uniqueValues4[row * 4 + j] * transposedValues4[j * 4 + col]; + uniqueResult[row * 4 + col] = sum; + } + } + + QTest::newRow("unique/transposed") + << (void *)uniqueValues4 << (void *)transposedValues4 << (void *)uniqueResult; +} +void tst_QMatrixNxN::multiply4x4() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix4x4 m1((const qreal *)m1Values); + QMatrix4x4 m2((const qreal *)m2Values); + + QMatrix4x4 m4; + m4 = m1; + m4 *= m2; + QVERIFY(isSame(m4, (const qreal *)m3Values)); + + QMatrix4x4 m5; + m5 = m1 * m2; + QVERIFY(isSame(m5, (const qreal *)m3Values)); +} + +// Test matrix multiplication for 4x3 matrices. +void tst_QMatrixNxN::multiply4x3_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("m2Values"); + QTest::addColumn("m3Values"); + + QTest::newRow("null") + << (void *)nullValues4x3 << (void *)nullValues4x3 << (void *)nullValues3; + + QTest::newRow("null/unique") + << (void *)nullValues4x3 << (void *)uniqueValues4x3 << (void *)nullValues3; + + QTest::newRow("unique/null") + << (void *)uniqueValues4x3 << (void *)nullValues4x3 << (void *)nullValues3; + + static qreal uniqueResult[9]; + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 3; ++col) { + qreal sum = 0.0f; + for (int j = 0; j < 4; ++j) + sum += uniqueValues4x3[row * 4 + j] * transposedValues3x4[j * 3 + col]; + uniqueResult[row * 3 + col] = sum; + } + } + + QTest::newRow("unique/transposed") + << (void *)uniqueValues4x3 << (void *)transposedValues3x4 << (void *)uniqueResult; +} +void tst_QMatrixNxN::multiply4x3() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(void *, m3Values); + + QMatrix4x3 m1((const qreal *)m1Values); + QMatrix3x4 m2((const qreal *)m2Values); + + QGenericMatrix<3, 3, qreal, float> m4; + m4 = m1 * m2; + qreal values[9]; + m4.toValueArray(values); + for (int index = 0; index < 9; ++index) + QCOMPARE(values[index], ((const qreal *)m3Values)[index]); +} + +// Test matrix multiplication by a factor for 2x2 matrices. +void tst_QMatrixNxN::multiplyFactor2x2_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("factor"); + QTest::addColumn("m2Values"); + + QTest::newRow("null") + << (void *)nullValues2 << (qreal)1.0f << (void *)nullValues2; + + QTest::newRow("double identity") + << (void *)identityValues2 << (qreal)2.0f << (void *)doubleIdentity2; + + static qreal const values[16] = + {1.0f, 2.0f, + 5.0f, 6.0f}; + static qreal const doubleValues[16] = + {2.0f, 4.0f, + 10.0f, 12.0f}; + static qreal const negDoubleValues[16] = + {-2.0f, -4.0f, + -10.0f, -12.0f}; + + QTest::newRow("unique") + << (void *)values << (qreal)2.0f << (void *)doubleValues; + + QTest::newRow("neg") + << (void *)values << (qreal)-2.0f << (void *)negDoubleValues; + + QTest::newRow("zero") + << (void *)values << (qreal)0.0f << (void *)nullValues4; +} +void tst_QMatrixNxN::multiplyFactor2x2() +{ + QFETCH(void *, m1Values); + QFETCH(qreal, factor); + QFETCH(void *, m2Values); + + QMatrix2x2 m1((const qreal *)m1Values); + + QMatrix2x2 m3; + m3 = m1; + m3 *= factor; + QVERIFY(isSame(m3, (const qreal *)m2Values)); + + QMatrix2x2 m4; + m4 = m1 * factor; + QVERIFY(isSame(m4, (const qreal *)m2Values)); + + QMatrix2x2 m5; + m5 = factor * m1; + QVERIFY(isSame(m5, (const qreal *)m2Values)); +} + +// Test matrix multiplication by a factor for 3x3 matrices. +void tst_QMatrixNxN::multiplyFactor3x3_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("factor"); + QTest::addColumn("m2Values"); + + QTest::newRow("null") + << (void *)nullValues3 << (qreal)1.0f << (void *)nullValues3; + + QTest::newRow("double identity") + << (void *)identityValues3 << (qreal)2.0f << (void *)doubleIdentity3; + + static qreal const values[16] = + {1.0f, 2.0f, 3.0f, + 5.0f, 6.0f, 7.0f, + 9.0f, 10.0f, 11.0f}; + static qreal const doubleValues[16] = + {2.0f, 4.0f, 6.0f, + 10.0f, 12.0f, 14.0f, + 18.0f, 20.0f, 22.0f}; + static qreal const negDoubleValues[16] = + {-2.0f, -4.0f, -6.0f, + -10.0f, -12.0f, -14.0f, + -18.0f, -20.0f, -22.0f}; + + QTest::newRow("unique") + << (void *)values << (qreal)2.0f << (void *)doubleValues; + + QTest::newRow("neg") + << (void *)values << (qreal)-2.0f << (void *)negDoubleValues; + + QTest::newRow("zero") + << (void *)values << (qreal)0.0f << (void *)nullValues4; +} +void tst_QMatrixNxN::multiplyFactor3x3() +{ + QFETCH(void *, m1Values); + QFETCH(qreal, factor); + QFETCH(void *, m2Values); + + QMatrix3x3 m1((const qreal *)m1Values); + + QMatrix3x3 m3; + m3 = m1; + m3 *= factor; + QVERIFY(isSame(m3, (const qreal *)m2Values)); + + QMatrix3x3 m4; + m4 = m1 * factor; + QVERIFY(isSame(m4, (const qreal *)m2Values)); + + QMatrix3x3 m5; + m5 = factor * m1; + QVERIFY(isSame(m5, (const qreal *)m2Values)); +} + +// Test matrix multiplication by a factor for 4x4 matrices. +void tst_QMatrixNxN::multiplyFactor4x4_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("factor"); + QTest::addColumn("m2Values"); + + QTest::newRow("null") + << (void *)nullValues4 << (qreal)1.0f << (void *)nullValues4; + + QTest::newRow("double identity") + << (void *)identityValues4 << (qreal)2.0f << (void *)doubleIdentity4; + + static qreal const values[16] = + {1.0f, 2.0f, 3.0f, 4.0f, + 5.0f, 6.0f, 7.0f, 8.0f, + 9.0f, 10.0f, 11.0f, 12.0f, + 13.0f, 14.0f, 15.0f, 16.0f}; + static qreal const doubleValues[16] = + {2.0f, 4.0f, 6.0f, 8.0f, + 10.0f, 12.0f, 14.0f, 16.0f, + 18.0f, 20.0f, 22.0f, 24.0f, + 26.0f, 28.0f, 30.0f, 32.0f}; + static qreal const negDoubleValues[16] = + {-2.0f, -4.0f, -6.0f, -8.0f, + -10.0f, -12.0f, -14.0f, -16.0f, + -18.0f, -20.0f, -22.0f, -24.0f, + -26.0f, -28.0f, -30.0f, -32.0f}; + + QTest::newRow("unique") + << (void *)values << (qreal)2.0f << (void *)doubleValues; + + QTest::newRow("neg") + << (void *)values << (qreal)-2.0f << (void *)negDoubleValues; + + QTest::newRow("zero") + << (void *)values << (qreal)0.0f << (void *)nullValues4; +} +void tst_QMatrixNxN::multiplyFactor4x4() +{ + QFETCH(void *, m1Values); + QFETCH(qreal, factor); + QFETCH(void *, m2Values); + + QMatrix4x4 m1((const qreal *)m1Values); + + QMatrix4x4 m3; + m3 = m1; + m3 *= factor; + QVERIFY(isSame(m3, (const qreal *)m2Values)); + + QMatrix4x4 m4; + m4 = m1 * factor; + QVERIFY(isSame(m4, (const qreal *)m2Values)); + + QMatrix4x4 m5; + m5 = factor * m1; + QVERIFY(isSame(m5, (const qreal *)m2Values)); +} + +// Test matrix multiplication by a factor for 4x3 matrices. +void tst_QMatrixNxN::multiplyFactor4x3_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("factor"); + QTest::addColumn("m2Values"); + + QTest::newRow("null") + << (void *)nullValues4x3 << (qreal)1.0f << (void *)nullValues4x3; + + QTest::newRow("double identity") + << (void *)identityValues4x3 << (qreal)2.0f << (void *)doubleIdentity4x3; + + static qreal const values[12] = + {1.0f, 2.0f, 3.0f, 4.0f, + 5.0f, 6.0f, 7.0f, 8.0f, + 9.0f, 10.0f, 11.0f, 12.0f}; + static qreal const doubleValues[12] = + {2.0f, 4.0f, 6.0f, 8.0f, + 10.0f, 12.0f, 14.0f, 16.0f, + 18.0f, 20.0f, 22.0f, 24.0f}; + static qreal const negDoubleValues[12] = + {-2.0f, -4.0f, -6.0f, -8.0f, + -10.0f, -12.0f, -14.0f, -16.0f, + -18.0f, -20.0f, -22.0f, -24.0f}; + + QTest::newRow("unique") + << (void *)values << (qreal)2.0f << (void *)doubleValues; + + QTest::newRow("neg") + << (void *)values << (qreal)-2.0f << (void *)negDoubleValues; + + QTest::newRow("zero") + << (void *)values << (qreal)0.0f << (void *)nullValues4x3; +} +void tst_QMatrixNxN::multiplyFactor4x3() +{ + QFETCH(void *, m1Values); + QFETCH(qreal, factor); + QFETCH(void *, m2Values); + + QMatrix4x3 m1((const qreal *)m1Values); + + QMatrix4x3 m3; + m3 = m1; + m3 *= factor; + QVERIFY(isSame(m3, (const qreal *)m2Values)); + + QMatrix4x3 m4; + m4 = m1 * factor; + QVERIFY(isSame(m4, (const qreal *)m2Values)); + + QMatrix4x3 m5; + m5 = factor * m1; + QVERIFY(isSame(m5, (const qreal *)m2Values)); +} + +// Test matrix division by a factor for 2x2 matrices. +void tst_QMatrixNxN::divideFactor2x2_data() +{ + // Use the same test cases as the multiplyFactor test. + multiplyFactor2x2_data(); +} +void tst_QMatrixNxN::divideFactor2x2() +{ + QFETCH(void *, m1Values); + QFETCH(qreal, factor); + QFETCH(void *, m2Values); + + if (factor == 0.0f) + return; + + QMatrix2x2 m2((const qreal *)m2Values); + + QMatrix2x2 m3; + m3 = m2; + m3 /= factor; + QVERIFY(isSame(m3, (const qreal *)m1Values)); + + QMatrix2x2 m4; + m4 = m2 / factor; + QVERIFY(isSame(m4, (const qreal *)m1Values)); +} + +// Test matrix division by a factor for 3x3 matrices. +void tst_QMatrixNxN::divideFactor3x3_data() +{ + // Use the same test cases as the multiplyFactor test. + multiplyFactor3x3_data(); +} +void tst_QMatrixNxN::divideFactor3x3() +{ + QFETCH(void *, m1Values); + QFETCH(qreal, factor); + QFETCH(void *, m2Values); + + if (factor == 0.0f) + return; + + QMatrix3x3 m2((const qreal *)m2Values); + + QMatrix3x3 m3; + m3 = m2; + m3 /= factor; + QVERIFY(isSame(m3, (const qreal *)m1Values)); + + QMatrix3x3 m4; + m4 = m2 / factor; + QVERIFY(isSame(m4, (const qreal *)m1Values)); +} + +// Test matrix division by a factor for 4x4 matrices. +void tst_QMatrixNxN::divideFactor4x4_data() +{ + // Use the same test cases as the multiplyFactor test. + multiplyFactor4x4_data(); +} +void tst_QMatrixNxN::divideFactor4x4() +{ + QFETCH(void *, m1Values); + QFETCH(qreal, factor); + QFETCH(void *, m2Values); + + if (factor == 0.0f) + return; + + QMatrix4x4 m2((const qreal *)m2Values); + + QMatrix4x4 m3; + m3 = m2; + m3 /= factor; + QVERIFY(isSame(m3, (const qreal *)m1Values)); + + QMatrix4x4 m4; + m4 = m2 / factor; + QVERIFY(isSame(m4, (const qreal *)m1Values)); +} + +// Test matrix division by a factor for 4x3 matrices. +void tst_QMatrixNxN::divideFactor4x3_data() +{ + // Use the same test cases as the multiplyFactor test. + multiplyFactor4x3_data(); +} +void tst_QMatrixNxN::divideFactor4x3() +{ + QFETCH(void *, m1Values); + QFETCH(qreal, factor); + QFETCH(void *, m2Values); + + if (factor == 0.0f) + return; + + QMatrix4x3 m2((const qreal *)m2Values); + + QMatrix4x3 m3; + m3 = m2; + m3 /= factor; + QVERIFY(isSame(m3, (const qreal *)m1Values)); + + QMatrix4x3 m4; + m4 = m2 / factor; + QVERIFY(isSame(m4, (const qreal *)m1Values)); +} + +// Test matrix negation for 2x2 matrices. +void tst_QMatrixNxN::negate2x2_data() +{ + // Use the same test cases as the multiplyFactor test. + multiplyFactor2x2_data(); +} +void tst_QMatrixNxN::negate2x2() +{ + QFETCH(void *, m1Values); + + const qreal *values = (const qreal *)m1Values; + + QMatrix2x2 m1(values); + + qreal negated[4]; + for (int index = 0; index < 4; ++index) + negated[index] = -values[index]; + + QMatrix2x2 m2; + m2 = -m1; + QVERIFY(isSame(m2, negated)); +} + +// Test matrix negation for 3x3 matrices. +void tst_QMatrixNxN::negate3x3_data() +{ + // Use the same test cases as the multiplyFactor test. + multiplyFactor3x3_data(); +} +void tst_QMatrixNxN::negate3x3() +{ + QFETCH(void *, m1Values); + + const qreal *values = (const qreal *)m1Values; + + QMatrix3x3 m1(values); + + qreal negated[9]; + for (int index = 0; index < 9; ++index) + negated[index] = -values[index]; + + QMatrix3x3 m2; + m2 = -m1; + QVERIFY(isSame(m2, negated)); +} + +// Test matrix negation for 4x4 matrices. +void tst_QMatrixNxN::negate4x4_data() +{ + // Use the same test cases as the multiplyFactor test. + multiplyFactor4x4_data(); +} +void tst_QMatrixNxN::negate4x4() +{ + QFETCH(void *, m1Values); + + const qreal *values = (const qreal *)m1Values; + + QMatrix4x4 m1(values); + + qreal negated[16]; + for (int index = 0; index < 16; ++index) + negated[index] = -values[index]; + + QMatrix4x4 m2; + m2 = -m1; + QVERIFY(isSame(m2, negated)); +} + +// Test matrix negation for 4x3 matrices. +void tst_QMatrixNxN::negate4x3_data() +{ + // Use the same test cases as the multiplyFactor test. + multiplyFactor4x3_data(); +} +void tst_QMatrixNxN::negate4x3() +{ + QFETCH(void *, m1Values); + + const qreal *values = (const qreal *)m1Values; + + QMatrix4x3 m1(values); + + qreal negated[12]; + for (int index = 0; index < 12; ++index) + negated[index] = -values[index]; + + QMatrix4x3 m2; + m2 = -m1; + QVERIFY(isSame(m2, negated)); +} + +// Matrix inverted. This is a more straight-forward implementation +// of the algorithm at http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q24 +// than the optimized version in the QMatrix4x4 code. Hopefully it is +// easier to verify that this version is the same as the reference. + +struct Matrix3 +{ + qreal v[9]; +}; +struct Matrix4 +{ + qreal v[16]; +}; + +static qreal m3Determinant(const Matrix3& m) +{ + return m.v[0] * (m.v[4] * m.v[8] - m.v[7] * m.v[5]) - + m.v[1] * (m.v[3] * m.v[8] - m.v[6] * m.v[5]) + + m.v[2] * (m.v[3] * m.v[7] - m.v[6] * m.v[4]); +} + +static bool m3Inverse(const Matrix3& min, Matrix3& mout) +{ + qreal det = m3Determinant(min); + if (det == 0.0f) + return false; + mout.v[0] = (min.v[4] * min.v[8] - min.v[5] * min.v[7]) / det; + mout.v[1] = -(min.v[1] * min.v[8] - min.v[2] * min.v[7]) / det; + mout.v[2] = (min.v[1] * min.v[5] - min.v[4] * min.v[2]) / det; + mout.v[3] = -(min.v[3] * min.v[8] - min.v[5] * min.v[6]) / det; + mout.v[4] = (min.v[0] * min.v[8] - min.v[6] * min.v[2]) / det; + mout.v[5] = -(min.v[0] * min.v[5] - min.v[3] * min.v[2]) / det; + mout.v[6] = (min.v[3] * min.v[7] - min.v[6] * min.v[4]) / det; + mout.v[7] = -(min.v[0] * min.v[7] - min.v[6] * min.v[1]) / det; + mout.v[8] = (min.v[0] * min.v[4] - min.v[1] * min.v[3]) / det; + return true; +} + +static void m3Transpose(Matrix3& m) +{ + qSwap(m.v[1], m.v[3]); + qSwap(m.v[2], m.v[6]); + qSwap(m.v[5], m.v[7]); +} + +static void m4Submatrix(const Matrix4& min, Matrix3& mout, int i, int j) +{ + for (int di = 0; di < 3; ++di) { + for (int dj = 0; dj < 3; ++dj) { + int si = di + ((di >= i) ? 1 : 0); + int sj = dj + ((dj >= j) ? 1 : 0); + mout.v[di * 3 + dj] = min.v[si * 4 + sj]; + } + } +} + +static qreal m4Determinant(const Matrix4& m) +{ + qreal det; + qreal result = 0.0f; + qreal i = 1.0f; + Matrix3 msub; + for (int n = 0; n < 4; ++n, i *= -1.0f) { + m4Submatrix(m, msub, 0, n); + det = m3Determinant(msub); + result += m.v[n] * det * i; + } + return result; +} + +static void m4Inverse(const Matrix4& min, Matrix4& mout) +{ + qreal det = m4Determinant(min); + Matrix3 msub; + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { + qreal sign = 1.0f - ((i + j) % 2) * 2.0f; + m4Submatrix(min, msub, i, j); + mout.v[i + j * 4] = (m3Determinant(msub) * sign) / det; + } + } +} + +// Test matrix inverted for 4x4 matrices. +void tst_QMatrixNxN::inverted4x4_data() +{ + QTest::addColumn("m1Values"); + QTest::addColumn("m2Values"); + QTest::addColumn("invertible"); + + QTest::newRow("null") + << (void *)nullValues4 << (void *)identityValues4 << false; + + QTest::newRow("identity") + << (void *)identityValues4 << (void *)identityValues4 << true; + + QTest::newRow("unique") + << (void *)uniqueValues4 << (void *)identityValues4 << false; + + static Matrix4 const invertible = { + {5.0f, 0.0f, 0.0f, 2.0f, + 0.0f, 6.0f, 0.0f, 3.0f, + 0.0f, 0.0f, 7.0f, 4.0f, + 0.0f, 0.0f, 0.0f, 1.0f} + }; + static Matrix4 inverted; + m4Inverse(invertible, inverted); + + QTest::newRow("invertible") + << (void *)invertible.v << (void *)inverted.v << true; + + static Matrix4 const translate = { + {1.0f, 0.0f, 0.0f, 2.0f, + 0.0f, 1.0f, 0.0f, 3.0f, + 0.0f, 0.0f, 1.0f, 4.0f, + 0.0f, 0.0f, 0.0f, 1.0f} + }; + static Matrix4 const inverseTranslate = { + {1.0f, 0.0f, 0.0f, -2.0f, + 0.0f, 1.0f, 0.0f, -3.0f, + 0.0f, 0.0f, 1.0f, -4.0f, + 0.0f, 0.0f, 0.0f, 1.0f} + }; + + QTest::newRow("translate") + << (void *)translate.v << (void *)inverseTranslate.v << true; +} +void tst_QMatrixNxN::inverted4x4() +{ + QFETCH(void *, m1Values); + QFETCH(void *, m2Values); + QFETCH(bool, invertible); + + QMatrix4x4 m1((const qreal *)m1Values); + + if (invertible) + QVERIFY(m1.determinant() != 0.0f); + else + QVERIFY(m1.determinant() == 0.0f); + + Matrix4 m1alt; + memcpy(m1alt.v, (const qreal *)m1Values, sizeof(m1alt.v)); + + QCOMPARE((float)(m1.determinant()), (float)(m4Determinant(m1alt))); + + QMatrix4x4 m2; + bool inv; + m2 = m1.inverted(&inv); + QVERIFY(isSame(m2, (const qreal *)m2Values)); + + if (invertible) { + QVERIFY(inv); + + Matrix4 m2alt; + m4Inverse(m1alt, m2alt); + QVERIFY(isSame(m2, m2alt.v)); + + QMatrix4x4 m3; + m3 = m1 * m2; + QVERIFY(isIdentity(m3)); + + QMatrix4x4 m4; + m4 = m2 * m1; + QVERIFY(isIdentity(m4)); + } else { + QVERIFY(!inv); + } + + // Test again, after inferring the special matrix type. + m1.inferSpecialType(); + m2 = m1.inverted(&inv); + QVERIFY(isSame(m2, (const qreal *)m2Values)); + QCOMPARE(inv, invertible); +} + +void tst_QMatrixNxN::orthonormalInverse4x4() +{ + QMatrix4x4 m1; + QVERIFY(matrixFuzzyCompare(m1.inverted(), m1)); + + QMatrix4x4 m2; + m2.rotate(45.0, 1.0, 0.0, 0.0); + m2.translate(10.0, 0.0, 0.0); + + // Use inferSpecialType() to drop the internal flags that + // mark the matrix as orthonormal. This will force inverted() + // to compute m3.inverted() the long way. We can then compare + // the result to what the faster algorithm produces on m2. + QMatrix4x4 m3 = m2; + m3.inferSpecialType(); + bool invertible; + QVERIFY(matrixFuzzyCompare(m2.inverted(&invertible), m3.inverted())); + QVERIFY(invertible); + + QMatrix4x4 m4; + m4.rotate(45.0, 0.0, 1.0, 0.0); + QMatrix4x4 m5 = m4; + m5.inferSpecialType(); + QVERIFY(matrixFuzzyCompare(m4.inverted(), m5.inverted())); + + QMatrix4x4 m6; + m1.rotate(88, 0.0, 0.0, 1.0); + m1.translate(-20.0, 20.0, 15.0); + m1.rotate(25, 1.0, 0.0, 0.0); + QMatrix4x4 m7 = m6; + m7.inferSpecialType(); + QVERIFY(matrixFuzzyCompare(m6.inverted(), m7.inverted())); +} + +// Test the generation and use of 4x4 scale matrices. +void tst_QMatrixNxN::scale4x4_data() +{ + QTest::addColumn("x"); + QTest::addColumn("y"); + QTest::addColumn("z"); + QTest::addColumn("resultValues"); + + static const qreal nullScale[] = + {0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (void *)nullScale; + + QTest::newRow("identity") + << (qreal)1.0f << (qreal)1.0f << (qreal)1.0f << (void *)identityValues4; + + static const qreal doubleScale[] = + {2.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 2.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 2.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("double") + << (qreal)2.0f << (qreal)2.0f << (qreal)2.0f << (void *)doubleScale; + + static const qreal complexScale[] = + {2.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 11.0f, 0.0f, 0.0f, + 0.0f, 0.0f, -6.5f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("complex") + << (qreal)2.0f << (qreal)11.0f << (qreal)-6.5f << (void *)complexScale; + + static const qreal complexScale2D[] = + {2.0f, 0.0f, 0.0f, 0.0f, + 0.0f, -11.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("complex2D") + << (qreal)2.0f << (qreal)-11.0f << (qreal)1.0f << (void *)complexScale2D; +} +void tst_QMatrixNxN::scale4x4() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + QFETCH(void *, resultValues); + + QMatrix4x4 result((const qreal *)resultValues); + + QMatrix4x4 m1; + m1.scale(QVector3D(x, y, z)); + QVERIFY(isSame(m1, (const qreal *)resultValues)); + + QMatrix4x4 m2; + m2.scale(x, y, z); + QVERIFY(isSame(m2, (const qreal *)resultValues)); + + if (z == 1.0f) { + QMatrix4x4 m2b; + m2b.scale(x, y); + QVERIFY(m2b == m2); + } + + QVector3D v1(2.0f, 3.0f, -4.0f); + QVector3D v2 = m1 * v1; + QCOMPARE(v2.x(), (qreal)(2.0f * x)); + QCOMPARE(v2.y(), (qreal)(3.0f * y)); + QCOMPARE(v2.z(), (qreal)(-4.0f * z)); + + v2 = v1 * m1; + QCOMPARE(v2.x(), (qreal)(2.0f * x)); + QCOMPARE(v2.y(), (qreal)(3.0f * y)); + QCOMPARE(v2.z(), (qreal)(-4.0f * z)); + + QVector4D v3(2.0f, 3.0f, -4.0f, 34.0f); + QVector4D v4 = m1 * v3; + QCOMPARE(v4.x(), (qreal)(2.0f * x)); + QCOMPARE(v4.y(), (qreal)(3.0f * y)); + QCOMPARE(v4.z(), (qreal)(-4.0f * z)); + QCOMPARE(v4.w(), (qreal)34.0f); + + v4 = v3 * m1; + QCOMPARE(v4.x(), (qreal)(2.0f * x)); + QCOMPARE(v4.y(), (qreal)(3.0f * y)); + QCOMPARE(v4.z(), (qreal)(-4.0f * z)); + QCOMPARE(v4.w(), (qreal)34.0f); + + QPoint p1(2, 3); + QPoint p2 = m1 * p1; + QCOMPARE(p2.x(), (int)(2.0f * x)); + QCOMPARE(p2.y(), (int)(3.0f * y)); + + p2 = p1 * m1; + QCOMPARE(p2.x(), (int)(2.0f * x)); + QCOMPARE(p2.y(), (int)(3.0f * y)); + + QPointF p3(2.0f, 3.0f); + QPointF p4 = m1 * p3; + QCOMPARE(p4.x(), (qreal)(2.0f * x)); + QCOMPARE(p4.y(), (qreal)(3.0f * y)); + + p4 = p3 * m1; + QCOMPARE(p4.x(), (qreal)(2.0f * x)); + QCOMPARE(p4.y(), (qreal)(3.0f * y)); + + QMatrix4x4 m3(uniqueValues4); + QMatrix4x4 m4(m3); + m4.scale(x, y, z); + QVERIFY(m4 == m3 * m1); + + if (x == y && y == z) { + QMatrix4x4 m5; + m5.scale(x); + QVERIFY(isSame(m5, (const qreal *)resultValues)); + } + + if (z == 1.0f) { + QMatrix4x4 m4b(m3); + m4b.scale(x, y); + QVERIFY(m4b == m4); + } + + // Test coverage when the special matrix type is unknown. + + QMatrix4x4 m6; + m6(0, 0) = 1.0f; + m6.scale(QVector3D(x, y, z)); + QVERIFY(isSame(m6, (const qreal *)resultValues)); + + QMatrix4x4 m7; + m7(0, 0) = 1.0f; + m7.scale(x, y, z); + QVERIFY(isSame(m7, (const qreal *)resultValues)); + + if (x == y && y == z) { + QMatrix4x4 m8; + m8(0, 0) = 1.0f; + m8.scale(x); + QVERIFY(isSame(m8, (const qreal *)resultValues)); + + m8.inferSpecialType(); + m8.scale(1.0f); + QVERIFY(isSame(m8, (const qreal *)resultValues)); + + QMatrix4x4 m9; + m9.translate(0.0f, 0.0f, 0.0f); + m9.scale(x); + QVERIFY(isSame(m9, (const qreal *)resultValues)); + } +} + +// Test the generation and use of 4x4 translation matrices. +void tst_QMatrixNxN::translate4x4_data() +{ + QTest::addColumn("x"); + QTest::addColumn("y"); + QTest::addColumn("z"); + QTest::addColumn("resultValues"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (void *)identityValues4; + + static const qreal identityTranslate[] = + {1.0f, 0.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("identity") + << (qreal)1.0f << (qreal)1.0f << (qreal)1.0f << (void *)identityTranslate; + + static const qreal complexTranslate[] = + {1.0f, 0.0f, 0.0f, 2.0f, + 0.0f, 1.0f, 0.0f, 11.0f, + 0.0f, 0.0f, 1.0f, -6.5f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("complex") + << (qreal)2.0f << (qreal)11.0f << (qreal)-6.5f << (void *)complexTranslate; + + static const qreal complexTranslate2D[] = + {1.0f, 0.0f, 0.0f, 2.0f, + 0.0f, 1.0f, 0.0f, -11.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("complex2D") + << (qreal)2.0f << (qreal)-11.0f << (qreal)0.0f << (void *)complexTranslate2D; +} +void tst_QMatrixNxN::translate4x4() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + QFETCH(void *, resultValues); + + QMatrix4x4 result((const qreal *)resultValues); + + QMatrix4x4 m1; + m1.translate(QVector3D(x, y, z)); + QVERIFY(isSame(m1, (const qreal *)resultValues)); + + QMatrix4x4 m2; + m2.translate(x, y, z); + QVERIFY(isSame(m2, (const qreal *)resultValues)); + + if (z == 0.0f) { + QMatrix4x4 m2b; + m2b.translate(x, y); + QVERIFY(m2b == m2); + } + + QVector3D v1(2.0f, 3.0f, -4.0f); + QVector3D v2 = m1 * v1; + QCOMPARE(v2.x(), (qreal)(2.0f + x)); + QCOMPARE(v2.y(), (qreal)(3.0f + y)); + QCOMPARE(v2.z(), (qreal)(-4.0f + z)); + + QVector4D v3(2.0f, 3.0f, -4.0f, 1.0f); + QVector4D v4 = m1 * v3; + QCOMPARE(v4.x(), (qreal)(2.0f + x)); + QCOMPARE(v4.y(), (qreal)(3.0f + y)); + QCOMPARE(v4.z(), (qreal)(-4.0f + z)); + QCOMPARE(v4.w(), (qreal)1.0f); + + QVector4D v5(2.0f, 3.0f, -4.0f, 34.0f); + QVector4D v6 = m1 * v5; + QCOMPARE(v6.x(), (qreal)(2.0f + x * 34.0f)); + QCOMPARE(v6.y(), (qreal)(3.0f + y * 34.0f)); + QCOMPARE(v6.z(), (qreal)(-4.0f + z * 34.0f)); + QCOMPARE(v6.w(), (qreal)34.0f); + + QPoint p1(2, 3); + QPoint p2 = m1 * p1; + QCOMPARE(p2.x(), (int)(2.0f + x)); + QCOMPARE(p2.y(), (int)(3.0f + y)); + + QPointF p3(2.0f, 3.0f); + QPointF p4 = m1 * p3; + QCOMPARE(p4.x(), (qreal)(2.0f + x)); + QCOMPARE(p4.y(), (qreal)(3.0f + y)); + + QMatrix4x4 m3(uniqueValues4); + QMatrix4x4 m4(m3); + m4.translate(x, y, z); + QVERIFY(m4 == m3 * m1); + + if (z == 0.0f) { + QMatrix4x4 m4b(m3); + m4b.translate(x, y); + QVERIFY(m4b == m4); + } +} + +// Test the generation and use of 4x4 rotation matrices. +void tst_QMatrixNxN::rotate4x4_data() +{ + QTest::addColumn("angle"); + QTest::addColumn("x"); + QTest::addColumn("y"); + QTest::addColumn("z"); + QTest::addColumn("resultValues"); + + static const qreal nullRotate[] = + {0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("null") + << (qreal)90.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (void *)nullRotate; + + static const qreal noRotate[] = + {1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("zerodegrees") + << (qreal)0.0f + << (qreal)2.0f << (qreal)3.0f << (qreal)-4.0f + << (void *)noRotate; + + static const qreal xRotate[] = + {1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, -1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("xrotate") + << (qreal)90.0f + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (void *)xRotate; + + static const qreal xRotateNeg[] = + {1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, -1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("-xrotate") + << (qreal)90.0f + << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f + << (void *)xRotateNeg; + + static const qreal yRotate[] = + {0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("yrotate") + << (qreal)90.0f + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f + << (void *)yRotate; + + static const qreal yRotateNeg[] = + {0.0f, 0.0f, -1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("-yrotate") + << (qreal)90.0f + << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f + << (void *)yRotateNeg; + + static const qreal zRotate[] = + {0.0f, -1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("zrotate") + << (qreal)90.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (void *)zRotate; + + static const qreal zRotateNeg[] = + {0.0f, 1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + QTest::newRow("-zrotate") + << (qreal)90.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f + << (void *)zRotateNeg; + + // Algorithm from http://en.wikipedia.org/wiki/Rotation_matrix. + // Deliberately different from the one in the code for cross-checking. + static qreal complexRotate[16]; + qreal x = 1.0f; + qreal y = 2.0f; + qreal z = -6.0f; + qreal angle = -45.0f; + qreal c = qCos(angle * M_PI / 180.0f); + qreal s = qSin(angle * M_PI / 180.0f); + qreal len = qSqrt(x * x + y * y + z * z); + qreal xu = x / len; + qreal yu = y / len; + qreal zu = z / len; + complexRotate[0] = (qreal)((1 - xu * xu) * c + xu * xu); + complexRotate[1] = (qreal)(-zu * s - xu * yu * c + xu * yu); + complexRotate[2] = (qreal)(yu * s - xu * zu * c + xu * zu); + complexRotate[3] = 0; + complexRotate[4] = (qreal)(zu * s - xu * yu * c + xu * yu); + complexRotate[5] = (qreal)((1 - yu * yu) * c + yu * yu); + complexRotate[6] = (qreal)(-xu * s - yu * zu * c + yu * zu); + complexRotate[7] = 0; + complexRotate[8] = (qreal)(-yu * s - xu * zu * c + xu * zu); + complexRotate[9] = (qreal)(xu * s - yu * zu * c + yu * zu); + complexRotate[10] = (qreal)((1 - zu * zu) * c + zu * zu); + complexRotate[11] = 0; + complexRotate[12] = 0; + complexRotate[13] = 0; + complexRotate[14] = 0; + complexRotate[15] = 1; + + QTest::newRow("complex") + << (qreal)angle + << (qreal)x << (qreal)y << (qreal)z + << (void *)complexRotate; +} +void tst_QMatrixNxN::rotate4x4() +{ + QFETCH(qreal, angle); + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + QFETCH(void *, resultValues); + + QMatrix4x4 m1; + m1.rotate(angle, QVector3D(x, y, z)); + QVERIFY(isSame(m1, (const qreal *)resultValues)); + + QMatrix4x4 m2; + m2.rotate(angle, x, y, z); + QVERIFY(isSame(m2, (const qreal *)resultValues)); + + QMatrix4x4 m3(uniqueValues4); + QMatrix4x4 m4(m3); + m4.rotate(angle, x, y, z); + QVERIFY(matrixFuzzyCompare(m4, m3 * m1)); + + // Null vectors don't make sense for quaternion rotations. + if (x != 0 || y != 0 || z != 0) { + QMatrix4x4 m5; + m5.rotate(QQuaternion::fromAxisAndAngle(QVector3D(x, y, z), angle)); + QVERIFY(isSame(m5, (const qreal *)resultValues)); + } + +#define ROTATE4(xin,yin,zin,win,xout,yout,zout,wout) \ + do { \ + xout = ((const qreal *)resultValues)[0] * xin + \ + ((const qreal *)resultValues)[1] * yin + \ + ((const qreal *)resultValues)[2] * zin + \ + ((const qreal *)resultValues)[3] * win; \ + yout = ((const qreal *)resultValues)[4] * xin + \ + ((const qreal *)resultValues)[5] * yin + \ + ((const qreal *)resultValues)[6] * zin + \ + ((const qreal *)resultValues)[7] * win; \ + zout = ((const qreal *)resultValues)[8] * xin + \ + ((const qreal *)resultValues)[9] * yin + \ + ((const qreal *)resultValues)[10] * zin + \ + ((const qreal *)resultValues)[11] * win; \ + wout = ((const qreal *)resultValues)[12] * xin + \ + ((const qreal *)resultValues)[13] * yin + \ + ((const qreal *)resultValues)[14] * zin + \ + ((const qreal *)resultValues)[15] * win; \ + } while (0) + + // Rotate various test vectors using the straight-forward approach. + qreal v1x, v1y, v1z, v1w; + ROTATE4(2.0f, 3.0f, -4.0f, 1.0f, v1x, v1y, v1z, v1w); + v1x /= v1w; + v1y /= v1w; + v1z /= v1w; + qreal v3x, v3y, v3z, v3w; + ROTATE4(2.0f, 3.0f, -4.0f, 1.0f, v3x, v3y, v3z, v3w); + qreal v5x, v5y, v5z, v5w; + ROTATE4(2.0f, 3.0f, -4.0f, 34.0f, v5x, v5y, v5z, v5w); + qreal p1x, p1y, p1z, p1w; + ROTATE4(2.0f, 3.0f, 0.0f, 1.0f, p1x, p1y, p1z, p1w); + p1x /= p1w; + p1y /= p1w; + p1z /= p1w; + + QVector3D v1(2.0f, 3.0f, -4.0f); + QVector3D v2 = m1 * v1; + QVERIFY(fuzzyCompare(v2.x(), v1x)); + QVERIFY(fuzzyCompare(v2.y(), v1y)); + QVERIFY(fuzzyCompare(v2.z(), v1z)); + + QVector4D v3(2.0f, 3.0f, -4.0f, 1.0f); + QVector4D v4 = m1 * v3; + QVERIFY(fuzzyCompare(v4.x(), v3x)); + QVERIFY(fuzzyCompare(v4.y(), v3y)); + QVERIFY(fuzzyCompare(v4.z(), v3z)); + QVERIFY(fuzzyCompare(v4.w(), v3w)); + + QVector4D v5(2.0f, 3.0f, -4.0f, 34.0f); + QVector4D v6 = m1 * v5; + QVERIFY(fuzzyCompare(v6.x(), v5x)); + QVERIFY(fuzzyCompare(v6.y(), v5y)); + QVERIFY(fuzzyCompare(v6.z(), v5z)); + QVERIFY(fuzzyCompare(v6.w(), v5w)); + + QPoint p1(2, 3); + QPoint p2 = m1 * p1; + QCOMPARE(p2.x(), qRound(p1x)); + QCOMPARE(p2.y(), qRound(p1y)); + + QPointF p3(2.0f, 3.0f); + QPointF p4 = m1 * p3; + QVERIFY(fuzzyCompare((float)(p4.x()), p1x)); + QVERIFY(fuzzyCompare((float)(p4.y()), p1y)); + + if (x != 0 || y != 0 || z != 0) { + QQuaternion q = QQuaternion::fromAxisAndAngle(QVector3D(x, y, z), angle); + QVector3D vq = q.rotateVector(v1); + QVERIFY(fuzzyCompare(vq.x(), v1x)); + QVERIFY(fuzzyCompare(vq.y(), v1y)); + QVERIFY(fuzzyCompare(vq.z(), v1z)); + } +} + +static bool isSame(const QMatrix3x3& m1, const Matrix3& m2) +{ + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 3; ++col) { + if (!fuzzyCompare(m1(row, col), m2.v[row * 3 + col])) + return false; + } + } + return true; +} + +// Test the computation of normal matrices from 4x4 transformation matrices. +void tst_QMatrixNxN::normalMatrix_data() +{ + QTest::addColumn("mValues"); + + QTest::newRow("identity") + << (void *)identityValues4; + QTest::newRow("unique") + << (void *)uniqueValues4; // Not invertible because determinant == 0. + + static qreal const translateValues[16] = + {1.0f, 0.0f, 0.0f, 4.0f, + 0.0f, 1.0f, 0.0f, 5.0f, + 0.0f, 0.0f, 1.0f, -3.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const scaleValues[16] = + {2.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 7.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 9.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const bothValues[16] = + {2.0f, 0.0f, 0.0f, 4.0f, + 0.0f, 7.0f, 0.0f, 5.0f, + 0.0f, 0.0f, 9.0f, -3.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const nullScaleValues1[16] = + {0.0f, 0.0f, 0.0f, 4.0f, + 0.0f, 7.0f, 0.0f, 5.0f, + 0.0f, 0.0f, 9.0f, -3.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const nullScaleValues2[16] = + {2.0f, 0.0f, 0.0f, 4.0f, + 0.0f, 0.0f, 0.0f, 5.0f, + 0.0f, 0.0f, 9.0f, -3.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const nullScaleValues3[16] = + {2.0f, 0.0f, 0.0f, 4.0f, + 0.0f, 7.0f, 0.0f, 5.0f, + 0.0f, 0.0f, 0.0f, -3.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + + QTest::newRow("translate") << (void *)translateValues; + QTest::newRow("scale") << (void *)scaleValues; + QTest::newRow("both") << (void *)bothValues; + QTest::newRow("null scale 1") << (void *)nullScaleValues1; + QTest::newRow("null scale 2") << (void *)nullScaleValues2; + QTest::newRow("null scale 3") << (void *)nullScaleValues3; +} +void tst_QMatrixNxN::normalMatrix() +{ + QFETCH(void *, mValues); + const qreal *values = (const qreal *)mValues; + + // Compute the expected answer the long way. + Matrix3 min; + Matrix3 answer; + min.v[0] = values[0]; + min.v[1] = values[1]; + min.v[2] = values[2]; + min.v[3] = values[4]; + min.v[4] = values[5]; + min.v[5] = values[6]; + min.v[6] = values[8]; + min.v[7] = values[9]; + min.v[8] = values[10]; + bool invertible = m3Inverse(min, answer); + m3Transpose(answer); + + // Perform the test. + QMatrix4x4 m1(values); + QMatrix3x3 n1 = m1.normalMatrix(); + + if (invertible) + QVERIFY(::isSame(n1, answer)); + else + QVERIFY(isIdentity(n1)); + + // Perform the test again, after inferring special matrix types. + // This tests the optimized paths in the normalMatrix() function. + m1.inferSpecialType(); + n1 = m1.normalMatrix(); + + if (invertible) + QVERIFY(::isSame(n1, answer)); + else + QVERIFY(isIdentity(n1)); +} + +// Test optimized transformations on 4x4 matrices. +void tst_QMatrixNxN::optimizedTransforms() +{ + static qreal const translateValues[16] = + {1.0f, 0.0f, 0.0f, 4.0f, + 0.0f, 1.0f, 0.0f, 5.0f, + 0.0f, 0.0f, 1.0f, -3.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const translateDoubleValues[16] = + {1.0f, 0.0f, 0.0f, 8.0f, + 0.0f, 1.0f, 0.0f, 10.0f, + 0.0f, 0.0f, 1.0f, -6.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const scaleValues[16] = + {2.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 7.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 9.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const scaleDoubleValues[16] = + {4.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 49.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 81.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const bothValues[16] = + {2.0f, 0.0f, 0.0f, 4.0f, + 0.0f, 7.0f, 0.0f, 5.0f, + 0.0f, 0.0f, 9.0f, -3.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const bothReverseValues[16] = + {2.0f, 0.0f, 0.0f, 4.0f * 2.0f, + 0.0f, 7.0f, 0.0f, 5.0f * 7.0f, + 0.0f, 0.0f, 9.0f, -3.0f * 9.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const bothThenTranslateValues[16] = + {2.0f, 0.0f, 0.0f, 4.0f + 2.0f * 4.0f, + 0.0f, 7.0f, 0.0f, 5.0f + 7.0f * 5.0f, + 0.0f, 0.0f, 9.0f, -3.0f + 9.0f * -3.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + static qreal const bothThenScaleValues[16] = + {4.0f, 0.0f, 0.0f, 4.0f, + 0.0f, 49.0f, 0.0f, 5.0f, + 0.0f, 0.0f, 81.0f, -3.0f, + 0.0f, 0.0f, 0.0f, 1.0f}; + + QMatrix4x4 translate(translateValues); + QMatrix4x4 scale(scaleValues); + QMatrix4x4 both(bothValues); + + QMatrix4x4 m1; + m1.translate(4.0f, 5.0f, -3.0f); + QVERIFY(isSame(m1, translateValues)); + m1.translate(4.0f, 5.0f, -3.0f); + QVERIFY(isSame(m1, translateDoubleValues)); + + QMatrix4x4 m2; + m2.translate(QVector3D(4.0f, 5.0f, -3.0f)); + QVERIFY(isSame(m2, translateValues)); + m2.translate(QVector3D(4.0f, 5.0f, -3.0f)); + QVERIFY(isSame(m2, translateDoubleValues)); + + QMatrix4x4 m3; + m3.scale(2.0f, 7.0f, 9.0f); + QVERIFY(isSame(m3, scaleValues)); + m3.scale(2.0f, 7.0f, 9.0f); + QVERIFY(isSame(m3, scaleDoubleValues)); + + QMatrix4x4 m4; + m4.scale(QVector3D(2.0f, 7.0f, 9.0f)); + QVERIFY(isSame(m4, scaleValues)); + m4.scale(QVector3D(2.0f, 7.0f, 9.0f)); + QVERIFY(isSame(m4, scaleDoubleValues)); + + QMatrix4x4 m5; + m5.translate(4.0f, 5.0f, -3.0f); + m5.scale(2.0f, 7.0f, 9.0f); + QVERIFY(isSame(m5, bothValues)); + m5.translate(4.0f, 5.0f, -3.0f); + QVERIFY(isSame(m5, bothThenTranslateValues)); + + QMatrix4x4 m6; + m6.translate(QVector3D(4.0f, 5.0f, -3.0f)); + m6.scale(QVector3D(2.0f, 7.0f, 9.0f)); + QVERIFY(isSame(m6, bothValues)); + m6.translate(QVector3D(4.0f, 5.0f, -3.0f)); + QVERIFY(isSame(m6, bothThenTranslateValues)); + + QMatrix4x4 m7; + m7.scale(2.0f, 7.0f, 9.0f); + m7.translate(4.0f, 5.0f, -3.0f); + QVERIFY(isSame(m7, bothReverseValues)); + + QMatrix4x4 m8; + m8.scale(QVector3D(2.0f, 7.0f, 9.0f)); + m8.translate(QVector3D(4.0f, 5.0f, -3.0f)); + QVERIFY(isSame(m8, bothReverseValues)); + + QMatrix4x4 m9; + m9.translate(4.0f, 5.0f, -3.0f); + m9.scale(2.0f, 7.0f, 9.0f); + QVERIFY(isSame(m9, bothValues)); + m9.scale(2.0f, 7.0f, 9.0f); + QVERIFY(isSame(m9, bothThenScaleValues)); + + QMatrix4x4 m10; + m10.translate(QVector3D(4.0f, 5.0f, -3.0f)); + m10.scale(QVector3D(2.0f, 7.0f, 9.0f)); + QVERIFY(isSame(m10, bothValues)); + m10.scale(QVector3D(2.0f, 7.0f, 9.0f)); + QVERIFY(isSame(m10, bothThenScaleValues)); +} + +// Test orthographic projections. +void tst_QMatrixNxN::ortho() +{ + QMatrix4x4 m1; + m1.ortho(QRect(0, 0, 300, 150)); + QPointF p1 = m1 * QPointF(0, 0); + QPointF p2 = m1 * QPointF(300, 0); + QPointF p3 = m1 * QPointF(0, 150); + QPointF p4 = m1 * QPointF(300, 150); + QVector3D p5 = m1 * QVector3D(300, 150, 1); + QVERIFY(fuzzyCompare(p1.x(), -1.0)); + QVERIFY(fuzzyCompare(p1.y(), 1.0)); + QVERIFY(fuzzyCompare(p2.x(), 1.0)); + QVERIFY(fuzzyCompare(p2.y(), 1.0)); + QVERIFY(fuzzyCompare(p3.x(), -1.0)); + QVERIFY(fuzzyCompare(p3.y(), -1.0)); + QVERIFY(fuzzyCompare(p4.x(), 1.0)); + QVERIFY(fuzzyCompare(p4.y(), -1.0)); + QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0)); + QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0)); + QVERIFY(fuzzyCompare(p5.z(), (qreal)-1.0)); + + QMatrix4x4 m2; + m2.ortho(QRectF(0, 0, 300, 150)); + p1 = m2 * QPointF(0, 0); + p2 = m2 * QPointF(300, 0); + p3 = m2 * QPointF(0, 150); + p4 = m2 * QPointF(300, 150); + p5 = m2 * QVector3D(300, 150, 1); + QVERIFY(fuzzyCompare(p1.x(), -1.0)); + QVERIFY(fuzzyCompare(p1.y(), 1.0)); + QVERIFY(fuzzyCompare(p2.x(), 1.0)); + QVERIFY(fuzzyCompare(p2.y(), 1.0)); + QVERIFY(fuzzyCompare(p3.x(), -1.0)); + QVERIFY(fuzzyCompare(p3.y(), -1.0)); + QVERIFY(fuzzyCompare(p4.x(), 1.0)); + QVERIFY(fuzzyCompare(p4.y(), -1.0)); + QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0)); + QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0)); + QVERIFY(fuzzyCompare(p5.z(), (qreal)-1.0)); + + QMatrix4x4 m3; + m3.ortho(0, 300, 150, 0, -1, 1); + p1 = m3 * QPointF(0, 0); + p2 = m3 * QPointF(300, 0); + p3 = m3 * QPointF(0, 150); + p4 = m3 * QPointF(300, 150); + p5 = m3 * QVector3D(300, 150, 1); + QVERIFY(fuzzyCompare(p1.x(), -1.0)); + QVERIFY(fuzzyCompare(p1.y(), 1.0)); + QVERIFY(fuzzyCompare(p2.x(), 1.0)); + QVERIFY(fuzzyCompare(p2.y(), 1.0)); + QVERIFY(fuzzyCompare(p3.x(), -1.0)); + QVERIFY(fuzzyCompare(p3.y(), -1.0)); + QVERIFY(fuzzyCompare(p4.x(), 1.0)); + QVERIFY(fuzzyCompare(p4.y(), -1.0)); + QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0)); + QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0)); + QVERIFY(fuzzyCompare(p5.z(), (qreal)-1.0)); + + QMatrix4x4 m4; + m4.ortho(0, 300, 150, 0, -2, 3); + p1 = m4 * QPointF(0, 0); + p2 = m4 * QPointF(300, 0); + p3 = m4 * QPointF(0, 150); + p4 = m4 * QPointF(300, 150); + p5 = m4 * QVector3D(300, 150, 1); + QVERIFY(fuzzyCompare(p1.x(), -1.0)); + QVERIFY(fuzzyCompare(p1.y(), 1.0)); + QVERIFY(fuzzyCompare(p2.x(), 1.0)); + QVERIFY(fuzzyCompare(p2.y(), 1.0)); + QVERIFY(fuzzyCompare(p3.x(), -1.0)); + QVERIFY(fuzzyCompare(p3.y(), -1.0)); + QVERIFY(fuzzyCompare(p4.x(), 1.0)); + QVERIFY(fuzzyCompare(p4.y(), -1.0)); + QVERIFY(fuzzyCompare(p5.x(), (qreal)1.0)); + QVERIFY(fuzzyCompare(p5.y(), (qreal)-1.0)); + QVERIFY(fuzzyCompare(p5.z(), (qreal)-0.6)); + + // An empty view volume should leave the matrix alone. + QMatrix4x4 m5; + m5.ortho(0, 0, 150, 0, -2, 3); + QVERIFY(m5.isIdentity()); + m5.ortho(0, 300, 150, 150, -2, 3); + QVERIFY(m5.isIdentity()); + m5.ortho(0, 300, 150, 0, 2, 2); + QVERIFY(m5.isIdentity()); +} + +// Test perspective frustum projections. +void tst_QMatrixNxN::frustum() +{ + QMatrix4x4 m1; + m1.frustum(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f); + QVector3D p1 = m1 * QVector3D(-1.0f, -1.0f, 1.0f); + QVector3D p2 = m1 * QVector3D(1.0f, -1.0f, 1.0f); + QVector3D p3 = m1 * QVector3D(-1.0f, 1.0f, 1.0f); + QVector3D p4 = m1 * QVector3D(1.0f, 1.0f, 1.0f); + QVector3D p5 = m1 * QVector3D(0.0f, 0.0f, 2.0f); + QVERIFY(fuzzyCompare(p1.x(), -1.0f)); + QVERIFY(fuzzyCompare(p1.y(), -1.0f)); + QVERIFY(fuzzyCompare(p1.z(), -1.0f)); + QVERIFY(fuzzyCompare(p2.x(), 1.0f)); + QVERIFY(fuzzyCompare(p2.y(), -1.0f)); + QVERIFY(fuzzyCompare(p2.z(), -1.0f)); + QVERIFY(fuzzyCompare(p3.x(), -1.0f)); + QVERIFY(fuzzyCompare(p3.y(), 1.0f)); + QVERIFY(fuzzyCompare(p3.z(), -1.0f)); + QVERIFY(fuzzyCompare(p4.x(), 1.0f)); + QVERIFY(fuzzyCompare(p4.y(), 1.0f)); + QVERIFY(fuzzyCompare(p4.z(), -1.0f)); + QVERIFY(fuzzyCompare(p5.x(), 0.0f)); + QVERIFY(fuzzyCompare(p5.y(), 0.0f)); + QVERIFY(fuzzyCompare(p5.z(), -0.5f)); + + // An empty view volume should leave the matrix alone. + QMatrix4x4 m5; + m5.frustum(0, 0, 150, 0, -2, 3); + QVERIFY(m5.isIdentity()); + m5.frustum(0, 300, 150, 150, -2, 3); + QVERIFY(m5.isIdentity()); + m5.frustum(0, 300, 150, 0, 2, 2); + QVERIFY(m5.isIdentity()); +} + +// Test perspective field-of-view projections. +void tst_QMatrixNxN::perspective() +{ + QMatrix4x4 m1; + m1.perspective(45.0f, 1.0f, -1.0f, 1.0f); + QVector3D p1 = m1 * QVector3D(-1.0f, -1.0f, 1.0f); + QVector3D p2 = m1 * QVector3D(1.0f, -1.0f, 1.0f); + QVector3D p3 = m1 * QVector3D(-1.0f, 1.0f, 1.0f); + QVector3D p4 = m1 * QVector3D(1.0f, 1.0f, 1.0f); + QVector3D p5 = m1 * QVector3D(0.0f, 0.0f, 2.0f); + QVERIFY(fuzzyCompare(p1.x(), 2.41421)); + QVERIFY(fuzzyCompare(p1.y(), 2.41421)); + QVERIFY(fuzzyCompare(p1.z(), -1)); + QVERIFY(fuzzyCompare(p2.x(), -2.41421)); + QVERIFY(fuzzyCompare(p2.y(), 2.41421)); + QVERIFY(fuzzyCompare(p2.z(), -1.0f)); + QVERIFY(fuzzyCompare(p3.x(), 2.41421)); + QVERIFY(fuzzyCompare(p3.y(), -2.41421)); + QVERIFY(fuzzyCompare(p3.z(), -1.0f)); + QVERIFY(fuzzyCompare(p4.x(), -2.41421)); + QVERIFY(fuzzyCompare(p4.y(), -2.41421)); + QVERIFY(fuzzyCompare(p4.z(), -1.0f)); + QVERIFY(fuzzyCompare(p5.x(), 0.0f)); + QVERIFY(fuzzyCompare(p5.y(), 0.0f)); + QVERIFY(fuzzyCompare(p5.z(), -0.5f)); + + // An empty view volume should leave the matrix alone. + QMatrix4x4 m5; + m5.perspective(45.0f, 1.0f, 0.0f, 0.0f); + QVERIFY(m5.isIdentity()); + m5.perspective(45.0f, 0.0f, -1.0f, 1.0f); + QVERIFY(m5.isIdentity()); + m5.perspective(0.0f, 1.0f, -1.0f, 1.0f); + QVERIFY(m5.isIdentity()); +} + +// Test left-handed vs right-handed coordinate flipping. +void tst_QMatrixNxN::flipCoordinates() +{ + QMatrix4x4 m1; + m1.flipCoordinates(); + QVector3D p1 = m1 * QVector3D(2, 3, 4); + QVERIFY(p1 == QVector3D(2, -3, -4)); + + QMatrix4x4 m2; + m2.scale(2.0f, 3.0f, 1.0f); + m2.flipCoordinates(); + QVector3D p2 = m2 * QVector3D(2, 3, 4); + QVERIFY(p2 == QVector3D(4, -9, -4)); + + QMatrix4x4 m3; + m3.translate(2.0f, 3.0f, 1.0f); + m3.flipCoordinates(); + QVector3D p3 = m3 * QVector3D(2, 3, 4); + QVERIFY(p3 == QVector3D(4, 0, -3)); + + QMatrix4x4 m4; + m4.rotate(90.0f, 0.0f, 0.0f, 1.0f); + m4.flipCoordinates(); + QVector3D p4 = m4 * QVector3D(2, 3, 4); + QVERIFY(p4 == QVector3D(3, 2, -4)); +} + +// Test conversion of generic matrices to and from the non-generic types. +void tst_QMatrixNxN::convertGeneric() +{ + QMatrix4x3 m1(uniqueValues4x3); + + static qreal const unique4x4[16] = { + 1.0f, 2.0f, 3.0f, 4.0f, + 5.0f, 6.0f, 7.0f, 8.0f, + 9.0f, 10.0f, 11.0f, 12.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; +#if !defined(QT_NO_MEMBER_TEMPLATES) + QMatrix4x4 m4(m1); + QVERIFY(isSame(m4, unique4x4)); +#endif + QMatrix4x4 m5 = qGenericMatrixToMatrix4x4(m1); + QVERIFY(isSame(m5, unique4x4)); + + static qreal const conv4x4[12] = { + 1.0f, 2.0f, 3.0f, 4.0f, + 5.0f, 6.0f, 7.0f, 8.0f, + 9.0f, 10.0f, 11.0f, 12.0f + }; + QMatrix4x4 m9(uniqueValues4); +#if !defined(QT_NO_MEMBER_TEMPLATES) + QMatrix4x3 m10 = m9.toGenericMatrix<4, 3>(); + QVERIFY(isSame(m10, conv4x4)); +#endif + + QMatrix4x3 m11 = qGenericMatrixFromMatrix4x4<4, 3>(m9); + QVERIFY(isSame(m11, conv4x4)); +} + +void tst_QMatrixNxN::extractAxisRotation_data() +{ + QTest::addColumn("x"); + QTest::addColumn("y"); + QTest::addColumn("z"); + QTest::addColumn("angle"); + + QTest::newRow("1, 0, 0, 0 deg") << 1.0f << 0.0f << 0.0f << 0.0f; + QTest::newRow("1, 0, 0, 90 deg") << 1.0f << 0.0f << 0.0f << 90.0f; + QTest::newRow("1, 0, 0, 270 deg") << 1.0f << 0.0f << 0.0f << 270.0f; + QTest::newRow("1, 0, 0, 45 deg") << 1.0f << 0.0f << 0.0f << 45.0f; + QTest::newRow("1, 0, 0, 120 deg") << 1.0f << 0.0f << 0.0f << 120.0f; + QTest::newRow("1, 0, 0, 300 deg") << 1.0f << 0.0f << 0.0f << 300.0f; + + QTest::newRow("0, 1, 0, 90 deg") << 0.0f << 1.0f << 0.0f << 90.0f; + QTest::newRow("0, 1, 0, 270 deg") << 0.0f << 1.0f << 0.0f << 270.0f; + QTest::newRow("0, 1, 0, 45 deg") << 0.0f << 1.0f << 0.0f << 45.0f; + QTest::newRow("0, 1, 0, 120 deg") << 0.0f << 1.0f << 0.0f << 120.0f; + QTest::newRow("0, 1, 0, 300 deg") << 0.0f << 1.0f << 0.0f << 300.0f; + + QTest::newRow("0, 0, 1, 90 deg") << 0.0f << 0.0f << 1.0f << 90.0f; + QTest::newRow("0, 0, 1, 270 deg") << 0.0f << 0.0f << 1.0f << 270.0f; + QTest::newRow("0, 0, 1, 45 deg") << 0.0f << 0.0f << 1.0f << 45.0f; + QTest::newRow("0, 0, 1, 120 deg") << 0.0f << 0.0f << 1.0f << 120.0f; + QTest::newRow("0, 0, 1, 300 deg") << 0.0f << 0.0f << 1.0f << 300.0f; + + QTest::newRow("1, 1, 1, 90 deg") << 1.0f << 1.0f << 1.0f << 90.0f; + QTest::newRow("1, 1, 1, 270 deg") << 1.0f << 1.0f << 1.0f << 270.0f; + QTest::newRow("1, 1, 1, 45 deg") << 1.0f << 1.0f << 1.0f << 45.0f; + QTest::newRow("1, 1, 1, 120 deg") << 1.0f << 1.0f << 1.0f << 120.0f; + QTest::newRow("1, 1, 1, 300 deg") << 1.0f << 1.0f << 1.0f << 300.0f; +} + +void tst_QMatrixNxN::extractAxisRotation() +{ + QFETCH(float, x); + QFETCH(float, y); + QFETCH(float, z); + QFETCH(float, angle); + + QMatrix4x4 m; + QVector3D origAxis(x, y, z); + + m.rotate(angle, x, y, z); + + origAxis.normalize(); + QVector3D extractedAxis; + qreal extractedAngle; + + m.extractAxisRotation(extractedAngle, extractedAxis); + + qreal epsilon = 0.001; + + if (angle > 180) { + QVERIFY(fuzzyCompare(360.0f - angle, extractedAngle, epsilon)); + QVERIFY(fuzzyCompare(extractedAxis, -origAxis, epsilon)); + } else { + QVERIFY(fuzzyCompare(angle, extractedAngle, epsilon)); + QVERIFY(fuzzyCompare(extractedAxis, origAxis, epsilon)); + } +} + +void tst_QMatrixNxN::extractTranslation_data() +{ + QTest::addColumn("rotation"); + QTest::addColumn("x"); + QTest::addColumn("y"); + QTest::addColumn("z"); + + static QMatrix4x4 m1; + + QTest::newRow("identity, 100, 50, 25") + << m1 << 100.0f << 50.0f << 250.0f; + + m1.rotate(45.0, 1.0, 0.0, 0.0); + QTest::newRow("rotX 45 + 100, 50, 25") << m1 << 100.0f << 50.0f << 25.0f; + + m1.setIdentity(); + m1.rotate(45.0, 0.0, 1.0, 0.0); + QTest::newRow("rotY 45 + 100, 50, 25") << m1 << 100.0f << 50.0f << 25.0f; + + m1.setIdentity(); + m1.rotate(75, 0.0, 0.0, 1.0); + m1.rotate(25, 1.0, 0.0, 0.0); + m1.rotate(45, 0.0, 1.0, 0.0); + QTest::newRow("rotZ 75, rotX 25, rotY 45, 100, 50, 25") << m1 << 100.0f << 50.0f << 25.0f; +} + +void tst_QMatrixNxN::extractTranslation() +{ + QFETCH(QMatrix4x4, rotation); + QFETCH(float, x); + QFETCH(float, y); + QFETCH(float, z); + + rotation.translate(x, y, z); + + QVector3D vec = rotation.extractTranslation(); + + qreal epsilon = 0.001; + + QVERIFY(fuzzyCompare(vec.x(), x, epsilon)); + QVERIFY(fuzzyCompare(vec.y(), y, epsilon)); + QVERIFY(fuzzyCompare(vec.z(), z, epsilon)); + + QMatrix4x4 lookAt; + QVector3D eye(1.5f, -2.5f, 2.5f); + lookAt.lookAt(eye, + QVector3D(10.0f, 10.0f, 10.0f), + QVector3D(0.0f, 1.0f, 0.0f)); + + QVector3D extEye = lookAt.extractTranslation(); + + QVERIFY(fuzzyCompare(eye.x(), -extEye.x(), epsilon)); + QVERIFY(fuzzyCompare(eye.y(), -extEye.y(), epsilon)); + QVERIFY(fuzzyCompare(eye.z(), -extEye.z(), epsilon)); +} + +// Copy of "flagBits" in qmatrix4x4.h. +enum { + Identity = 0x0001, // Identity matrix + General = 0x0002, // General matrix, unknown contents + Translation = 0x0004, // Contains a simple translation + Scale = 0x0008, // Contains a simple scale + Rotation = 0x0010 // Contains a simple rotation +}; + +// Structure that allows direct access to "flagBits" for testing. +struct Matrix4x4 +{ + float m[4][4]; + int flagBits; +}; + +// Test the inferring of special matrix types. +void tst_QMatrixNxN::inferSpecialType_data() +{ + QTest::addColumn("mValues"); + QTest::addColumn("flagBits"); + + QTest::newRow("null") + << (void *)nullValues4 << (int)General; + QTest::newRow("identity") + << (void *)identityValues4 << (int)Identity; + QTest::newRow("unique") + << (void *)uniqueValues4 << (int)General; + + static qreal scaleValues[16] = { + 2.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 3.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 4.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + QTest::newRow("scale") + << (void *)scaleValues << (int)Scale; + + static qreal translateValues[16] = { + 1.0f, 0.0f, 0.0f, 2.0f, + 0.0f, 1.0f, 0.0f, 3.0f, + 0.0f, 0.0f, 1.0f, 4.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + QTest::newRow("scale") + << (void *)translateValues << (int)Translation; + + static qreal bothValues[16] = { + 1.0f, 0.0f, 0.0f, 2.0f, + 0.0f, 2.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 4.0f, + 0.0f, 0.0f, 0.0f, 1.0f + }; + QTest::newRow("both") + << (void *)bothValues << (int)(Scale | Translation); + + static qreal belowValues[16] = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 4.0f, 0.0f, 0.0f, 1.0f + }; + QTest::newRow("below") + << (void *)belowValues << (int)General; +} +void tst_QMatrixNxN::inferSpecialType() +{ + QFETCH(void *, mValues); + QFETCH(int, flagBits); + + QMatrix4x4 m((const qreal *)mValues); + m.inferSpecialType(); + + QCOMPARE(reinterpret_cast(&m)->flagBits, flagBits); +} + +void tst_QMatrixNxN::columnsAndRows() +{ + QMatrix4x4 m1(uniqueValues4); + + QVERIFY(m1.column(0) == QVector4D(1, 5, 9, 13)); + QVERIFY(m1.column(1) == QVector4D(2, 6, 10, 14)); + QVERIFY(m1.column(2) == QVector4D(3, 7, 11, 15)); + QVERIFY(m1.column(3) == QVector4D(4, 8, 12, 16)); + + QVERIFY(m1.row(0) == QVector4D(1, 2, 3, 4)); + QVERIFY(m1.row(1) == QVector4D(5, 6, 7, 8)); + QVERIFY(m1.row(2) == QVector4D(9, 10, 11, 12)); + QVERIFY(m1.row(3) == QVector4D(13, 14, 15, 16)); + + m1.setColumn(0, QVector4D(-1, -5, -9, -13)); + m1.setColumn(1, QVector4D(-2, -6, -10, -14)); + m1.setColumn(2, QVector4D(-3, -7, -11, -15)); + m1.setColumn(3, QVector4D(-4, -8, -12, -16)); + + QVERIFY(m1.column(0) == QVector4D(-1, -5, -9, -13)); + QVERIFY(m1.column(1) == QVector4D(-2, -6, -10, -14)); + QVERIFY(m1.column(2) == QVector4D(-3, -7, -11, -15)); + QVERIFY(m1.column(3) == QVector4D(-4, -8, -12, -16)); + + QVERIFY(m1.row(0) == QVector4D(-1, -2, -3, -4)); + QVERIFY(m1.row(1) == QVector4D(-5, -6, -7, -8)); + QVERIFY(m1.row(2) == QVector4D(-9, -10, -11, -12)); + QVERIFY(m1.row(3) == QVector4D(-13, -14, -15, -16)); + + m1.setRow(0, QVector4D(1, 5, 9, 13)); + m1.setRow(1, QVector4D(2, 6, 10, 14)); + m1.setRow(2, QVector4D(3, 7, 11, 15)); + m1.setRow(3, QVector4D(4, 8, 12, 16)); + + QVERIFY(m1.column(0) == QVector4D(1, 2, 3, 4)); + QVERIFY(m1.column(1) == QVector4D(5, 6, 7, 8)); + QVERIFY(m1.column(2) == QVector4D(9, 10, 11, 12)); + QVERIFY(m1.column(3) == QVector4D(13, 14, 15, 16)); + + QVERIFY(m1.row(0) == QVector4D(1, 5, 9, 13)); + QVERIFY(m1.row(1) == QVector4D(2, 6, 10, 14)); + QVERIFY(m1.row(2) == QVector4D(3, 7, 11, 15)); + QVERIFY(m1.row(3) == QVector4D(4, 8, 12, 16)); +} + +// Test converting QMatrix objects into QMatrix4x4 and then +// checking that transformations in the original perform the +// equivalent transformations in the new matrix. +void tst_QMatrixNxN::convertQMatrix() +{ + QMatrix m1; + m1.translate(-3.5, 2.0); + QPointF p1 = m1.map(QPointF(100.0, 150.0)); + QCOMPARE(p1.x(), 100.0 - 3.5); + QCOMPARE(p1.y(), 150.0 + 2.0); + + QMatrix4x4 m2(m1); + QPointF p2 = m2 * QPointF(100.0, 150.0); + QCOMPARE((double)p2.x(), 100.0 - 3.5); + QCOMPARE((double)p2.y(), 150.0 + 2.0); + QVERIFY(m1 == m2.toAffine()); + + QMatrix m3; + m3.scale(1.5, -2.0); + QPointF p3 = m3.map(QPointF(100.0, 150.0)); + QCOMPARE(p3.x(), 1.5 * 100.0); + QCOMPARE(p3.y(), -2.0 * 150.0); + + QMatrix4x4 m4(m3); + QPointF p4 = m4 * QPointF(100.0, 150.0); + QCOMPARE((double)p4.x(), 1.5 * 100.0); + QCOMPARE((double)p4.y(), -2.0 * 150.0); + QVERIFY(m3 == m4.toAffine()); + + QMatrix m5; + m5.rotate(45.0); + QPointF p5 = m5.map(QPointF(100.0, 150.0)); + + QMatrix4x4 m6(m5); + QPointF p6 = m6 * QPointF(100.0, 150.0); + QVERIFY(fuzzyCompare(p5.x(), p6.x(), 0.005)); + QVERIFY(fuzzyCompare(p5.y(), p6.y(), 0.005)); + + QMatrix m7 = m6.toAffine(); + QVERIFY(fuzzyCompare(m5.m11(), m7.m11())); + QVERIFY(fuzzyCompare(m5.m12(), m7.m12())); + QVERIFY(fuzzyCompare(m5.m21(), m7.m21())); + QVERIFY(fuzzyCompare(m5.m22(), m7.m22())); + QVERIFY(fuzzyCompare(m5.dx(), m7.dx())); + QVERIFY(fuzzyCompare(m5.dy(), m7.dy())); +} + +// Test converting QTransform objects into QMatrix4x4 and then +// checking that transformations in the original perform the +// equivalent transformations in the new matrix. +void tst_QMatrixNxN::convertQTransform() +{ + QTransform m1; + m1.translate(-3.5, 2.0); + QPointF p1 = m1.map(QPointF(100.0, 150.0)); + QCOMPARE(p1.x(), 100.0 - 3.5); + QCOMPARE(p1.y(), 150.0 + 2.0); + + QMatrix4x4 m2(m1); + QPointF p2 = m2 * QPointF(100.0, 150.0); + QCOMPARE((double)p2.x(), 100.0 - 3.5); + QCOMPARE((double)p2.y(), 150.0 + 2.0); + QVERIFY(m1 == m2.toTransform()); + + QTransform m3; + m3.scale(1.5, -2.0); + QPointF p3 = m3.map(QPointF(100.0, 150.0)); + QCOMPARE(p3.x(), 1.5 * 100.0); + QCOMPARE(p3.y(), -2.0 * 150.0); + + QMatrix4x4 m4(m3); + QPointF p4 = m4 * QPointF(100.0, 150.0); + QCOMPARE((double)p4.x(), 1.5 * 100.0); + QCOMPARE((double)p4.y(), -2.0 * 150.0); + QVERIFY(m3 == m4.toTransform()); + + QTransform m5; + m5.rotate(45.0); + QPointF p5 = m5.map(QPointF(100.0, 150.0)); + + QMatrix4x4 m6(m5); + QPointF p6 = m6 * QPointF(100.0, 150.0); + QVERIFY(fuzzyCompare(p5.x(), p6.x(), 0.005)); + QVERIFY(fuzzyCompare(p5.y(), p6.y(), 0.005)); + + QTransform m7 = m6.toTransform(); + QVERIFY(fuzzyCompare(m5.m11(), m7.m11())); + QVERIFY(fuzzyCompare(m5.m12(), m7.m12())); + QVERIFY(fuzzyCompare(m5.m21(), m7.m21())); + QVERIFY(fuzzyCompare(m5.m22(), m7.m22())); + QVERIFY(fuzzyCompare(m5.dx(), m7.dx())); + QVERIFY(fuzzyCompare(m5.dy(), m7.dy())); + QVERIFY(fuzzyCompare(m5.m13(), m7.m13())); + QVERIFY(fuzzyCompare(m5.m23(), m7.m23())); + QVERIFY(fuzzyCompare(m5.m33(), m7.m33())); +} + +// Test filling matrices with specific values. +void tst_QMatrixNxN::fill() +{ + QMatrix4x4 m1; + m1.fill(0.0f); + QVERIFY(isSame(m1, nullValues4)); + + static const qreal fillValues4[] = + {2.5f, 2.5f, 2.5f, 2.5f, + 2.5f, 2.5f, 2.5f, 2.5f, + 2.5f, 2.5f, 2.5f, 2.5f, + 2.5f, 2.5f, 2.5f, 2.5f}; + m1.fill(2.5f); + QVERIFY(isSame(m1, fillValues4)); + + QMatrix4x3 m2; + m2.fill(0.0f); + QVERIFY(isSame(m2, nullValues4x3)); + + static const qreal fillValues4x3[] = + {2.5f, 2.5f, 2.5f, 2.5f, + 2.5f, 2.5f, 2.5f, 2.5f, + 2.5f, 2.5f, 2.5f, 2.5f}; + m2.fill(2.5f); + QVERIFY(isSame(m2, fillValues4x3)); +} + +// Test the mapRect() function for QRect and QRectF. +void tst_QMatrixNxN::mapRect_data() +{ + QTest::addColumn("x"); + QTest::addColumn("y"); + QTest::addColumn("width"); + QTest::addColumn("height"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + QTest::newRow("rect") + << (qreal)1.0f << (qreal)-20.5f << (qreal)100.0f << (qreal)63.75f; +} +void tst_QMatrixNxN::mapRect() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, width); + QFETCH(qreal, height); + + QRectF rect(x, y, width, height); + QRect recti(qRound(x), qRound(y), qRound(width), qRound(height)); + + QMatrix4x4 m1; + QVERIFY(m1.mapRect(rect) == rect); + QVERIFY(m1.mapRect(recti) == recti); + + QMatrix4x4 m2; + m2.translate(-100.5f, 64.0f); + QRectF translated = rect.translated(-100.5f, 64.0f); + QRect translatedi = QRect(qRound(recti.x() - 100.5f), recti.y() + 64, + recti.width(), recti.height()); + QVERIFY(m2.mapRect(rect) == translated); + QVERIFY(m2.mapRect(recti) == translatedi); + + QMatrix4x4 m3; + m3.scale(-100.5f, 64.0f); + qreal scalex = x * -100.5f; + qreal scaley = y * 64.0f; + qreal scalewid = width * -100.5f; + qreal scaleht = height * 64.0f; + if (scalewid < 0.0f) { + scalewid = -scalewid; + scalex -= scalewid; + } + if (scaleht < 0.0f) { + scaleht = -scaleht; + scaley -= scaleht; + } + QRectF scaled(scalex, scaley, scalewid, scaleht); + QVERIFY(m3.mapRect(rect) == scaled); + scalex = recti.x() * -100.5f; + scaley = recti.y() * 64.0f; + scalewid = recti.width() * -100.5f; + scaleht = recti.height() * 64.0f; + if (scalewid < 0.0f) { + scalewid = -scalewid; + scalex -= scalewid; + } + if (scaleht < 0.0f) { + scaleht = -scaleht; + scaley -= scaleht; + } + QRect scaledi(qRound(scalex), qRound(scaley), + qRound(scalewid), qRound(scaleht)); + QVERIFY(m3.mapRect(recti) == scaledi); + + QMatrix4x4 m4; + m4.translate(-100.5f, 64.0f); + m4.scale(-2.5f, 4.0f); + qreal transx1 = x * -2.5f - 100.5f; + qreal transy1 = y * 4.0f + 64.0f; + qreal transx2 = (x + width) * -2.5f - 100.5f; + qreal transy2 = (y + height) * 4.0f + 64.0f; + if (transx1 > transx2) + qSwap(transx1, transx2); + if (transy1 > transy2) + qSwap(transy1, transy2); + QRectF trans(transx1, transy1, transx2 - transx1, transy2 - transy1); + QVERIFY(m4.mapRect(rect) == trans); + transx1 = recti.x() * -2.5f - 100.5f; + transy1 = recti.y() * 4.0f + 64.0f; + transx2 = (recti.x() + recti.width()) * -2.5f - 100.5f; + transy2 = (recti.y() + recti.height()) * 4.0f + 64.0f; + if (transx1 > transx2) + qSwap(transx1, transx2); + if (transy1 > transy2) + qSwap(transy1, transy2); + QRect transi(qRound(transx1), qRound(transy1), + qRound(transx2) - qRound(transx1), + qRound(transy2) - qRound(transy1)); + QVERIFY(m4.mapRect(recti) == transi); + + m4.rotate(45.0f, 0.0f, 0.0f, 1.0f); + + QTransform t4; + t4.translate(-100.5f, 64.0f); + t4.scale(-2.5f, 4.0f); + t4.rotate(45.0f); + QRectF mr = m4.mapRect(rect); + QRectF tr = t4.mapRect(rect); + QVERIFY(fuzzyCompare(mr.x(), tr.x())); + QVERIFY(fuzzyCompare(mr.y(), tr.y())); + QVERIFY(fuzzyCompare(mr.width(), tr.width())); + QVERIFY(fuzzyCompare(mr.height(), tr.height())); + + QRect mri = m4.mapRect(recti); + QRect tri = t4.mapRect(recti); + QVERIFY(mri == tri); +} + +class tst_QMatrixNxN4x4Properties : public QObject +{ + Q_OBJECT + Q_PROPERTY(QMatrix4x4 matrix READ matrix WRITE setMatrix) +public: + tst_QMatrixNxN4x4Properties(QObject *parent = 0) : QObject(parent) {} + + QMatrix4x4 matrix() const { return m; } + void setMatrix(const QMatrix4x4& value) { m = value; } + +private: + QMatrix4x4 m; +}; + +// Test getting and setting matrix properties via the metaobject system. +void tst_QMatrixNxN::properties() +{ + tst_QMatrixNxN4x4Properties obj; + + QMatrix4x4 m1(uniqueValues4); + obj.setMatrix(m1); + + QMatrix4x4 m2 = qVariantValue(obj.property("matrix")); + QVERIFY(isSame(m2, uniqueValues4)); + + QMatrix4x4 m3(transposedValues4); + obj.setProperty("matrix", qVariantFromValue(m3)); + + m2 = qVariantValue(obj.property("matrix")); + QVERIFY(isSame(m2, transposedValues4)); +} + +void tst_QMatrixNxN::metaTypes() +{ + QVERIFY(QMetaType::type("QMatrix4x4") == QMetaType::QMatrix4x4); + + QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QMatrix4x4)), + QByteArray("QMatrix4x4")); + + QVERIFY(QMetaType::isRegistered(QMetaType::QMatrix4x4)); + + QVERIFY(qMetaTypeId() == QMetaType::QMatrix4x4); +} + +QTEST_APPLESS_MAIN(tst_QMatrixNxN) + +#include "tst_qmatrixnxn.moc" diff --git a/tests/auto/qquaternion/qquaternion.pro b/tests/auto/qquaternion/qquaternion.pro new file mode 100644 index 0000000..6f740cf --- /dev/null +++ b/tests/auto/qquaternion/qquaternion.pro @@ -0,0 +1,2 @@ +load(qttest_p4) +SOURCES += tst_qquaternion.cpp diff --git a/tests/auto/qquaternion/tst_qquaternion.cpp b/tests/auto/qquaternion/tst_qquaternion.cpp new file mode 100644 index 0000000..ba546f1 --- /dev/null +++ b/tests/auto/qquaternion/tst_qquaternion.cpp @@ -0,0 +1,882 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** 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, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include + +class tst_QQuaternion : public QObject +{ + Q_OBJECT +public: + tst_QQuaternion() {} + ~tst_QQuaternion() {} + +private slots: + void create(); + + void length_data(); + void length(); + + void normalized_data(); + void normalized(); + + void normalize_data(); + void normalize(); + + void compare(); + + void add_data(); + void add(); + + void subtract_data(); + void subtract(); + + void multiply_data(); + void multiply(); + + void multiplyFactor_data(); + void multiplyFactor(); + + void divide_data(); + void divide(); + + void negate_data(); + void negate(); + + void conjugate_data(); + void conjugate(); + + void fromAxisAndAngle_data(); + void fromAxisAndAngle(); + + void slerp_data(); + void slerp(); + + void nlerp_data(); + void nlerp(); + + void properties(); + void metaTypes(); +}; + +// qFuzzyCompare isn't always "fuzzy" enough to handle conversion +// between float, double, and qreal. So create "fuzzier" compares. +static bool fuzzyCompare(float x, float y) +{ + float diff = x - y; + if (diff < 0.0f) + diff = -diff; + return (diff < 0.001); +} + +// Test the creation of QQuaternion objects in various ways: +// construct, copy, and modify. +void tst_QQuaternion::create() +{ + QQuaternion identity; + QCOMPARE(identity.x(), (qreal)0.0f); + QCOMPARE(identity.y(), (qreal)0.0f); + QCOMPARE(identity.z(), (qreal)0.0f); + QCOMPARE(identity.scalar(), (qreal)1.0f); + QVERIFY(identity.isIdentity()); + + QQuaternion v1(34.0f, 1.0f, 2.5f, -89.25f); + QCOMPARE(v1.x(), (qreal)1.0f); + QCOMPARE(v1.y(), (qreal)2.5f); + QCOMPARE(v1.z(), (qreal)-89.25f); + QCOMPARE(v1.scalar(), (qreal)34.0f); + QVERIFY(!v1.isNull()); + + QQuaternion v1i(34, 1, 2, -89); + QCOMPARE(v1i.x(), (qreal)1.0f); + QCOMPARE(v1i.y(), (qreal)2.0f); + QCOMPARE(v1i.z(), (qreal)-89.0f); + QCOMPARE(v1i.scalar(), (qreal)34.0f); + QVERIFY(!v1i.isNull()); + + QQuaternion v2(v1); + QCOMPARE(v2.x(), (qreal)1.0f); + QCOMPARE(v2.y(), (qreal)2.5f); + QCOMPARE(v2.z(), (qreal)-89.25f); + QCOMPARE(v2.scalar(), (qreal)34.0f); + QVERIFY(!v2.isNull()); + + QQuaternion v4; + QCOMPARE(v4.x(), (qreal)0.0f); + QCOMPARE(v4.y(), (qreal)0.0f); + QCOMPARE(v4.z(), (qreal)0.0f); + QCOMPARE(v4.scalar(), (qreal)1.0f); + QVERIFY(v4.isIdentity()); + v4 = v1; + QCOMPARE(v4.x(), (qreal)1.0f); + QCOMPARE(v4.y(), (qreal)2.5f); + QCOMPARE(v4.z(), (qreal)-89.25f); + QCOMPARE(v4.scalar(), (qreal)34.0f); + QVERIFY(!v4.isNull()); + + QQuaternion v9(34, QVector3D(1.0f, 2.5f, -89.25f)); + QCOMPARE(v9.x(), (qreal)1.0f); + QCOMPARE(v9.y(), (qreal)2.5f); + QCOMPARE(v9.z(), (qreal)-89.25f); + QCOMPARE(v9.scalar(), (qreal)34.0f); + QVERIFY(!v9.isNull()); + + v1.setX(3.0f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)2.5f); + QCOMPARE(v1.z(), (qreal)-89.25f); + QCOMPARE(v1.scalar(), (qreal)34.0f); + QVERIFY(!v1.isNull()); + + v1.setY(10.5f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)10.5f); + QCOMPARE(v1.z(), (qreal)-89.25f); + QCOMPARE(v1.scalar(), (qreal)34.0f); + QVERIFY(!v1.isNull()); + + v1.setZ(15.5f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)10.5f); + QCOMPARE(v1.z(), (qreal)15.5f); + QCOMPARE(v1.scalar(), (qreal)34.0f); + QVERIFY(!v1.isNull()); + + v1.setScalar(6.0f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)10.5f); + QCOMPARE(v1.z(), (qreal)15.5f); + QCOMPARE(v1.scalar(), (qreal)6.0f); + QVERIFY(!v1.isNull()); + + v1.setVector(2.0f, 6.5f, -1.25f); + QCOMPARE(v1.x(), (qreal)2.0f); + QCOMPARE(v1.y(), (qreal)6.5f); + QCOMPARE(v1.z(), (qreal)-1.25f); + QCOMPARE(v1.scalar(), (qreal)6.0f); + QVERIFY(!v1.isNull()); + QVERIFY(v1.vector() == QVector3D(2.0f, 6.5f, -1.25f)); + + v1.setVector(QVector3D(-2.0f, -6.5f, 1.25f)); + QCOMPARE(v1.x(), (qreal)-2.0f); + QCOMPARE(v1.y(), (qreal)-6.5f); + QCOMPARE(v1.z(), (qreal)1.25f); + QCOMPARE(v1.scalar(), (qreal)6.0f); + QVERIFY(!v1.isNull()); + QVERIFY(v1.vector() == QVector3D(-2.0f, -6.5f, 1.25f)); + + v1.setX(0.0f); + v1.setY(0.0f); + v1.setZ(0.0f); + v1.setScalar(0.0f); + QCOMPARE(v1.x(), (qreal)0.0f); + QCOMPARE(v1.y(), (qreal)0.0f); + QCOMPARE(v1.z(), (qreal)0.0f); + QCOMPARE(v1.scalar(), (qreal)0.0f); + QVERIFY(v1.isNull()); + + QVector4D v10 = v9.toVector4D(); + QCOMPARE(v10.x(), (qreal)1.0f); + QCOMPARE(v10.y(), (qreal)2.5f); + QCOMPARE(v10.z(), (qreal)-89.25f); + QCOMPARE(v10.w(), (qreal)34.0f); +} + +// Test length computation for quaternions. +void tst_QQuaternion::length_data() +{ + QTest::addColumn("x"); + QTest::addColumn("y"); + QTest::addColumn("z"); + QTest::addColumn("w"); + QTest::addColumn("len"); + + QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("1z") << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f; + QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("-1z") << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("-1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f; + QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)2.0f << (qreal)2.0f << (qreal)qSqrt(16.0f); +} +void tst_QQuaternion::length() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + QFETCH(qreal, w); + QFETCH(qreal, len); + + QQuaternion v(w, x, y, z); + QCOMPARE((float)(v.length()), (float)len); + QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y + z * z + w * w)); +} + +// Test the unit vector conversion for quaternions. +void tst_QQuaternion::normalized_data() +{ + // Use the same test data as the length test. + length_data(); +} +void tst_QQuaternion::normalized() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + QFETCH(qreal, w); + QFETCH(qreal, len); + + QQuaternion v(w, x, y, z); + QQuaternion u = v.normalized(); + if (v.isNull()) + QVERIFY(u.isNull()); + else + QCOMPARE((float)(u.length()), (float)1.0f); + QCOMPARE((float)(u.x() * len), (float)(v.x())); + QCOMPARE((float)(u.y() * len), (float)(v.y())); + QCOMPARE((float)(u.z() * len), (float)(v.z())); + QCOMPARE((float)(u.scalar() * len), (float)(v.scalar())); +} + +// Test the unit vector conversion for quaternions. +void tst_QQuaternion::normalize_data() +{ + // Use the same test data as the length test. + length_data(); +} +void tst_QQuaternion::normalize() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + QFETCH(qreal, w); + + QQuaternion v(w, x, y, z); + bool isNull = v.isNull(); + v.normalize(); + if (isNull) + QVERIFY(v.isNull()); + else + QCOMPARE((float)(v.length()), (float)1.0f); +} + +// Test the comparison operators for quaternions. +void tst_QQuaternion::compare() +{ + QQuaternion v1(8, 1, 2, 4); + QQuaternion v2(8, 1, 2, 4); + QQuaternion v3(8, 3, 2, 4); + QQuaternion v4(8, 1, 3, 4); + QQuaternion v5(8, 1, 2, 3); + QQuaternion v6(3, 1, 2, 4); + + QVERIFY(v1 == v2); + QVERIFY(v1 != v3); + QVERIFY(v1 != v4); + QVERIFY(v1 != v5); + QVERIFY(v1 != v6); +} + +// Test addition for quaternions. +void tst_QQuaternion::add_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("w1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("w2"); + QTest::addColumn("x3"); + QTest::addColumn("y3"); + QTest::addColumn("z3"); + QTest::addColumn("w3"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("zonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f; + + QTest::newRow("wonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f; + + QTest::newRow("all") + << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)8.0f + << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)9.0f + << (qreal)5.0f << (qreal)7.0f << (qreal)-3.0f << (qreal)17.0f; +} +void tst_QQuaternion::add() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, w2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + QFETCH(qreal, w3); + + QQuaternion v1(w1, x1, y1, z1); + QQuaternion v2(w2, x2, y2, z2); + QQuaternion v3(w3, x3, y3, z3); + + QVERIFY((v1 + v2) == v3); + + QQuaternion v4(v1); + v4 += v2; + QVERIFY(v4 == v3); + + QCOMPARE(v4.x(), v1.x() + v2.x()); + QCOMPARE(v4.y(), v1.y() + v2.y()); + QCOMPARE(v4.z(), v1.z() + v2.z()); + QCOMPARE(v4.scalar(), v1.scalar() + v2.scalar()); +} + +// Test subtraction for quaternions. +void tst_QQuaternion::subtract_data() +{ + // Use the same test data as the add test. + add_data(); +} +void tst_QQuaternion::subtract() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, w2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + QFETCH(qreal, w3); + + QQuaternion v1(w1, x1, y1, z1); + QQuaternion v2(w2, x2, y2, z2); + QQuaternion v3(w3, x3, y3, z3); + + QVERIFY((v3 - v1) == v2); + QVERIFY((v3 - v2) == v1); + + QQuaternion v4(v3); + v4 -= v1; + QVERIFY(v4 == v2); + + QCOMPARE(v4.x(), v3.x() - v1.x()); + QCOMPARE(v4.y(), v3.y() - v1.y()); + QCOMPARE(v4.z(), v3.z() - v1.z()); + QCOMPARE(v4.scalar(), v3.scalar() - v1.scalar()); + + QQuaternion v5(v3); + v5 -= v2; + QVERIFY(v5 == v1); + + QCOMPARE(v5.x(), v3.x() - v2.x()); + QCOMPARE(v5.y(), v3.y() - v2.y()); + QCOMPARE(v5.z(), v3.z() - v2.z()); + QCOMPARE(v5.scalar(), v3.scalar() - v2.scalar()); +} + +// Test quaternion multiplication. +void tst_QQuaternion::multiply_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("w1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("w2"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("unitvec") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f; + + QTest::newRow("complex") + << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)7.0f + << (qreal)4.0f << (qreal)5.0f << (qreal)6.0f << (qreal)8.0f; +} +void tst_QQuaternion::multiply() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, w2); + + QQuaternion q1(w1, x1, y1, z1); + QQuaternion q2(w2, x2, y2, z2); + + // Use the simple algorithm at: + // http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q53 + // to calculate the answer we expect to get. + QVector3D v1(x1, y1, z1); + QVector3D v2(x2, y2, z2); + qreal scalar = w1 * w2 - QVector3D::dotProduct(v1, v2); + QVector3D vector = w1 * v2 + w2 * v1 + QVector3D::crossProduct(v1, v2); + QQuaternion result(scalar, vector); + + QVERIFY((q1 * q2) == result); +} + +// Test multiplication by a factor for quaternions. +void tst_QQuaternion::multiplyFactor_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("w1"); + QTest::addColumn("factor"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("w2"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)100.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f + << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("zonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f + << (qreal)2.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f; + + QTest::newRow("wonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)2.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f; + + QTest::newRow("all") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f + << (qreal)2.0f + << (qreal)2.0f << (qreal)4.0f << (qreal)-6.0f << (qreal)8.0f; + + QTest::newRow("allzero") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f + << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; +} +void tst_QQuaternion::multiplyFactor() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + QFETCH(qreal, factor); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, w2); + + QQuaternion v1(w1, x1, y1, z1); + QQuaternion v2(w2, x2, y2, z2); + + QVERIFY((v1 * factor) == v2); + QVERIFY((factor * v1) == v2); + + QQuaternion v3(v1); + v3 *= factor; + QVERIFY(v3 == v2); + + QCOMPARE(v3.x(), v1.x() * factor); + QCOMPARE(v3.y(), v1.y() * factor); + QCOMPARE(v3.z(), v1.z() * factor); + QCOMPARE(v3.scalar(), v1.scalar() * factor); +} + +// Test division by a factor for quaternions. +void tst_QQuaternion::divide_data() +{ + // Use the same test data as the multiply test. + multiplyFactor_data(); +} +void tst_QQuaternion::divide() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + QFETCH(qreal, factor); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, w2); + + QQuaternion v1(w1, x1, y1, z1); + QQuaternion v2(w2, x2, y2, z2); + + if (factor == (qreal)0.0f) + return; + + QVERIFY((v2 / factor) == v1); + + QQuaternion v3(v2); + v3 /= factor; + QVERIFY(v3 == v1); + + QCOMPARE(v3.x(), v2.x() / factor); + QCOMPARE(v3.y(), v2.y() / factor); + QCOMPARE(v3.z(), v2.z() / factor); + QCOMPARE(v3.scalar(), v2.scalar() / factor); +} + +// Test negation for quaternions. +void tst_QQuaternion::negate_data() +{ + // Use the same test data as the add test. + add_data(); +} +void tst_QQuaternion::negate() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + + QQuaternion v1(w1, x1, y1, z1); + QQuaternion v2(-w1, -x1, -y1, -z1); + + QVERIFY(-v1 == v2); +} + +// Test quaternion conjugate calculations. +void tst_QQuaternion::conjugate_data() +{ + // Use the same test data as the add test. + add_data(); +} +void tst_QQuaternion::conjugate() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + + QQuaternion v1(w1, x1, y1, z1); + QQuaternion v2(w1, -x1, -y1, -z1); + + QVERIFY(v1.conjugate() == v2); +} + +// Test quaternion creation from an axis and an angle. +void tst_QQuaternion::fromAxisAndAngle_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("angle"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)90.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)180.0f; + + QTest::newRow("zonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)270.0f; + + QTest::newRow("complex") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)45.0f; +} +void tst_QQuaternion::fromAxisAndAngle() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, angle); + + // Use a straight-forward implementation of the algorithm at: + // http://www.j3d.org/matrix_faq/matrfaq_latest.html#Q56 + // to calculate the answer we expect to get. + QVector3D vector = QVector3D(x1, y1, z1).normalized(); + qreal sin_a = qSin((angle * M_PI / 180.0) / 2.0); + qreal cos_a = qCos((angle * M_PI / 180.0) / 2.0); + QQuaternion result((qreal)cos_a, + (qreal)(vector.x() * sin_a), + (qreal)(vector.y() * sin_a), + (qreal)(vector.z() * sin_a)); + result = result.normalized(); + + QQuaternion answer = QQuaternion::fromAxisAndAngle(QVector3D(x1, y1, z1), angle); + QVERIFY(fuzzyCompare(answer.x(), result.x())); + QVERIFY(fuzzyCompare(answer.y(), result.y())); + QVERIFY(fuzzyCompare(answer.z(), result.z())); + QVERIFY(fuzzyCompare(answer.scalar(), result.scalar())); + + answer = QQuaternion::fromAxisAndAngle(x1, y1, z1, angle); + QVERIFY(fuzzyCompare(answer.x(), result.x())); + QVERIFY(fuzzyCompare(answer.y(), result.y())); + QVERIFY(fuzzyCompare(answer.z(), result.z())); + QVERIFY(fuzzyCompare(answer.scalar(), result.scalar())); +} + +// Test spherical interpolation of quaternions. +void tst_QQuaternion::slerp_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("angle1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("angle2"); + QTest::addColumn("t"); + QTest::addColumn("x3"); + QTest::addColumn("y3"); + QTest::addColumn("z3"); + QTest::addColumn("angle3"); + + QTest::newRow("first") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f + << (qreal)0.0f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f; + QTest::newRow("first2") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f + << (qreal)-0.5f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f; + QTest::newRow("second") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f + << (qreal)1.0f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f; + QTest::newRow("second2") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f + << (qreal)1.5f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f; + QTest::newRow("middle") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)90.0f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)180.0f + << (qreal)0.5f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)135.0f; + QTest::newRow("wide angle") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)0.0f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)270.0f + << (qreal)0.5f + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)-45.0f; +} +void tst_QQuaternion::slerp() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, angle1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, angle2); + QFETCH(qreal, t); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + QFETCH(qreal, angle3); + + QQuaternion q1 = QQuaternion::fromAxisAndAngle(x1, y1, z1, angle1); + QQuaternion q2 = QQuaternion::fromAxisAndAngle(x2, y2, z2, angle2); + QQuaternion q3 = QQuaternion::fromAxisAndAngle(x3, y3, z3, angle3); + + QQuaternion result = QQuaternion::slerp(q1, q2, t); + + QVERIFY(fuzzyCompare(result.x(), q3.x())); + QVERIFY(fuzzyCompare(result.y(), q3.y())); + QVERIFY(fuzzyCompare(result.z(), q3.z())); + QVERIFY(fuzzyCompare(result.scalar(), q3.scalar())); +} + +// Test normalized linear interpolation of quaternions. +void tst_QQuaternion::nlerp_data() +{ + slerp_data(); +} +void tst_QQuaternion::nlerp() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, angle1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, angle2); + QFETCH(qreal, t); + + QQuaternion q1 = QQuaternion::fromAxisAndAngle(x1, y1, z1, angle1); + QQuaternion q2 = QQuaternion::fromAxisAndAngle(x2, y2, z2, angle2); + + QQuaternion result = QQuaternion::nlerp(q1, q2, t); + + qreal resultx, resulty, resultz, resultscalar; + if (t <= 0.0f) { + resultx = q1.x(); + resulty = q1.y(); + resultz = q1.z(); + resultscalar = q1.scalar(); + } else if (t >= 1.0f) { + resultx = q2.x(); + resulty = q2.y(); + resultz = q2.z(); + resultscalar = q2.scalar(); + } else if (qAbs(angle1 - angle2) <= 180.f) { + resultx = q1.x() * (1 - t) + q2.x() * t; + resulty = q1.y() * (1 - t) + q2.y() * t; + resultz = q1.z() * (1 - t) + q2.z() * t; + resultscalar = q1.scalar() * (1 - t) + q2.scalar() * t; + } else { + // Angle greater than 180 degrees: negate q2. + resultx = q1.x() * (1 - t) - q2.x() * t; + resulty = q1.y() * (1 - t) - q2.y() * t; + resultz = q1.z() * (1 - t) - q2.z() * t; + resultscalar = q1.scalar() * (1 - t) - q2.scalar() * t; + } + + QQuaternion q3 = QQuaternion(resultscalar, resultx, resulty, resultz).normalized(); + + QVERIFY(fuzzyCompare(result.x(), q3.x())); + QVERIFY(fuzzyCompare(result.y(), q3.y())); + QVERIFY(fuzzyCompare(result.z(), q3.z())); + QVERIFY(fuzzyCompare(result.scalar(), q3.scalar())); +} + +class tst_QQuaternionProperties : public QObject +{ + Q_OBJECT + Q_PROPERTY(QQuaternion quaternion READ quaternion WRITE setQuaternion) +public: + tst_QQuaternionProperties(QObject *parent = 0) : QObject(parent) {} + + QQuaternion quaternion() const { return q; } + void setQuaternion(const QQuaternion& value) { q = value; } + +private: + QQuaternion q; +}; + +// Test getting and setting quaternion properties via the metaobject system. +void tst_QQuaternion::properties() +{ + tst_QQuaternionProperties obj; + + obj.setQuaternion(QQuaternion(6.0f, 7.0f, 8.0f, 9.0f)); + + QQuaternion q = qVariantValue(obj.property("quaternion")); + QCOMPARE(q.scalar(), (qreal)6.0f); + QCOMPARE(q.x(), (qreal)7.0f); + QCOMPARE(q.y(), (qreal)8.0f); + QCOMPARE(q.z(), (qreal)9.0f); + + obj.setProperty("quaternion", + qVariantFromValue(QQuaternion(-6.0f, -7.0f, -8.0f, -9.0f))); + + q = qVariantValue(obj.property("quaternion")); + QCOMPARE(q.scalar(), (qreal)-6.0f); + QCOMPARE(q.x(), (qreal)-7.0f); + QCOMPARE(q.y(), (qreal)-8.0f); + QCOMPARE(q.z(), (qreal)-9.0f); +} + +void tst_QQuaternion::metaTypes() +{ + QVERIFY(QMetaType::type("QQuaternion") == QMetaType::QQuaternion); + + QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QQuaternion)), + QByteArray("QQuaternion")); + + QVERIFY(QMetaType::isRegistered(QMetaType::QQuaternion)); + + QVERIFY(qMetaTypeId() == QMetaType::QQuaternion); +} + +QTEST_APPLESS_MAIN(tst_QQuaternion) + +#include "tst_qquaternion.moc" diff --git a/tests/auto/qvectornd/qvectornd.pro b/tests/auto/qvectornd/qvectornd.pro new file mode 100644 index 0000000..6346199 --- /dev/null +++ b/tests/auto/qvectornd/qvectornd.pro @@ -0,0 +1,2 @@ +load(qttest_p4) +SOURCES += tst_qvectornd.cpp diff --git a/tests/auto/qvectornd/tst_qvectornd.cpp b/tests/auto/qvectornd/tst_qvectornd.cpp new file mode 100644 index 0000000..22f0ce1 --- /dev/null +++ b/tests/auto/qvectornd/tst_qvectornd.cpp @@ -0,0 +1,2143 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** 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, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include + +class tst_QVector : public QObject +{ + Q_OBJECT +public: + tst_QVector() {} + ~tst_QVector() {} + +private slots: + void create2(); + void create3(); + void create4(); + + void length2_data(); + void length2(); + void length3_data(); + void length3(); + void length4_data(); + void length4(); + + void normalized2_data(); + void normalized2(); + void normalized3_data(); + void normalized3(); + void normalized4_data(); + void normalized4(); + + void normalize2_data(); + void normalize2(); + void normalize3_data(); + void normalize3(); + void normalize4_data(); + void normalize4(); + + void compare2(); + void compare3(); + void compare4(); + + void add2_data(); + void add2(); + void add3_data(); + void add3(); + void add4_data(); + void add4(); + + void subtract2_data(); + void subtract2(); + void subtract3_data(); + void subtract3(); + void subtract4_data(); + void subtract4(); + + void multiply2_data(); + void multiply2(); + void multiply3_data(); + void multiply3(); + void multiply4_data(); + void multiply4(); + + void multiplyFactor2_data(); + void multiplyFactor2(); + void multiplyFactor3_data(); + void multiplyFactor3(); + void multiplyFactor4_data(); + void multiplyFactor4(); + + void divide2_data(); + void divide2(); + void divide3_data(); + void divide3(); + void divide4_data(); + void divide4(); + + void negate2_data(); + void negate2(); + void negate3_data(); + void negate3(); + void negate4_data(); + void negate4(); + + void crossProduct_data(); + void crossProduct(); + void normal_data(); + void normal(); + void distanceToPlane_data(); + void distanceToPlane(); + void distanceToLine_data(); + void distanceToLine(); + + void dotProduct2_data(); + void dotProduct2(); + void dotProduct3_data(); + void dotProduct3(); + void dotProduct4_data(); + void dotProduct4(); + + void properties(); + void metaTypes(); +}; + +// qFuzzyCompare isn't always "fuzzy" enough to handle conversion +// between float, double, and qreal. So create "fuzzier" compares. +static bool fuzzyCompare(float x, float y) +{ + float diff = x - y; + if (diff < 0.0f) + diff = -diff; + return (diff < 0.001); +} + +// Test the creation of QVector2D objects in various ways: +// construct, copy, and modify. +void tst_QVector::create2() +{ + QVector2D null; + QCOMPARE(null.x(), (qreal)0.0f); + QCOMPARE(null.y(), (qreal)0.0f); + QVERIFY(null.isNull()); + + QVector2D v1(1.0f, 2.5f); + QCOMPARE(v1.x(), (qreal)1.0f); + QCOMPARE(v1.y(), (qreal)2.5f); + QVERIFY(!v1.isNull()); + + QVector2D v1i(1, 2); + QCOMPARE(v1i.x(), (qreal)1.0f); + QCOMPARE(v1i.y(), (qreal)2.0f); + QVERIFY(!v1i.isNull()); + + QVector2D v2(v1); + QCOMPARE(v2.x(), (qreal)1.0f); + QCOMPARE(v2.y(), (qreal)2.5f); + QVERIFY(!v2.isNull()); + + QVector2D v4; + QCOMPARE(v4.x(), (qreal)0.0f); + QCOMPARE(v4.y(), (qreal)0.0f); + QVERIFY(v4.isNull()); + v4 = v1; + QCOMPARE(v4.x(), (qreal)1.0f); + QCOMPARE(v4.y(), (qreal)2.5f); + QVERIFY(!v4.isNull()); + + QVector2D v5(QPoint(1, 2)); + QCOMPARE(v5.x(), (qreal)1.0f); + QCOMPARE(v5.y(), (qreal)2.0f); + QVERIFY(!v5.isNull()); + + QVector2D v6(QPointF(1, 2.5)); + QCOMPARE(v6.x(), (qreal)1.0f); + QCOMPARE(v6.y(), (qreal)2.5f); + QVERIFY(!v6.isNull()); + + QVector2D v7(QVector3D(1.0f, 2.5f, 54.25f)); + QCOMPARE(v7.x(), (qreal)1.0f); + QCOMPARE(v7.y(), (qreal)2.5f); + QVERIFY(!v6.isNull()); + + QVector2D v8(QVector4D(1.0f, 2.5f, 54.25f, 34.0f)); + QCOMPARE(v8.x(), (qreal)1.0f); + QCOMPARE(v8.y(), (qreal)2.5f); + QVERIFY(!v6.isNull()); + + v1.setX(3.0f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)2.5f); + QVERIFY(!v1.isNull()); + + v1.setY(10.5f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)10.5f); + QVERIFY(!v1.isNull()); + + v1.setX(0.0f); + v1.setY(0.0f); + QCOMPARE(v1.x(), (qreal)0.0f); + QCOMPARE(v1.y(), (qreal)0.0f); + QVERIFY(v1.isNull()); + + QPoint p1 = v8.toPoint(); + QCOMPARE(p1.x(), 1); + QCOMPARE(p1.y(), 3); + + QPointF p2 = v8.toPointF(); + QCOMPARE((qreal)p2.x(), (qreal)1.0f); + QCOMPARE((qreal)p2.y(), (qreal)2.5f); + + QVector3D v9 = v8.toVector3D(); + QCOMPARE(v9.x(), (qreal)1.0f); + QCOMPARE(v9.y(), (qreal)2.5f); + QCOMPARE(v9.z(), (qreal)0.0f); + + QVector4D v10 = v8.toVector4D(); + QCOMPARE(v10.x(), (qreal)1.0f); + QCOMPARE(v10.y(), (qreal)2.5f); + QCOMPARE(v10.z(), (qreal)0.0f); + QCOMPARE(v10.w(), (qreal)0.0f); +} + +// Test the creation of QVector3D objects in various ways: +// construct, copy, and modify. +void tst_QVector::create3() +{ + QVector3D null; + QCOMPARE(null.x(), (qreal)0.0f); + QCOMPARE(null.y(), (qreal)0.0f); + QCOMPARE(null.z(), (qreal)0.0f); + QVERIFY(null.isNull()); + + QVector3D v1(1.0f, 2.5f, -89.25f); + QCOMPARE(v1.x(), (qreal)1.0f); + QCOMPARE(v1.y(), (qreal)2.5f); + QCOMPARE(v1.z(), (qreal)-89.25f); + QVERIFY(!v1.isNull()); + + QVector3D v1i(1, 2, -89); + QCOMPARE(v1i.x(), (qreal)1.0f); + QCOMPARE(v1i.y(), (qreal)2.0f); + QCOMPARE(v1i.z(), (qreal)-89.0f); + QVERIFY(!v1i.isNull()); + + QVector3D v2(v1); + QCOMPARE(v2.x(), (qreal)1.0f); + QCOMPARE(v2.y(), (qreal)2.5f); + QCOMPARE(v2.z(), (qreal)-89.25f); + QVERIFY(!v2.isNull()); + + QVector3D v3(1.0f, 2.5f, 0.0f); + QCOMPARE(v3.x(), (qreal)1.0f); + QCOMPARE(v3.y(), (qreal)2.5f); + QCOMPARE(v3.z(), (qreal)0.0f); + QVERIFY(!v3.isNull()); + + QVector3D v3i(1, 2, 0); + QCOMPARE(v3i.x(), (qreal)1.0f); + QCOMPARE(v3i.y(), (qreal)2.0f); + QCOMPARE(v3i.z(), (qreal)0.0f); + QVERIFY(!v3i.isNull()); + + QVector3D v4; + QCOMPARE(v4.x(), (qreal)0.0f); + QCOMPARE(v4.y(), (qreal)0.0f); + QCOMPARE(v4.z(), (qreal)0.0f); + QVERIFY(v4.isNull()); + v4 = v1; + QCOMPARE(v4.x(), (qreal)1.0f); + QCOMPARE(v4.y(), (qreal)2.5f); + QCOMPARE(v4.z(), (qreal)-89.25f); + QVERIFY(!v4.isNull()); + + QVector3D v5(QPoint(1, 2)); + QCOMPARE(v5.x(), (qreal)1.0f); + QCOMPARE(v5.y(), (qreal)2.0f); + QCOMPARE(v5.z(), (qreal)0.0f); + QVERIFY(!v5.isNull()); + + QVector3D v6(QPointF(1, 2.5)); + QCOMPARE(v6.x(), (qreal)1.0f); + QCOMPARE(v6.y(), (qreal)2.5f); + QCOMPARE(v6.z(), (qreal)0.0f); + QVERIFY(!v6.isNull()); + + QVector3D v7(QVector2D(1.0f, 2.5f)); + QCOMPARE(v7.x(), (qreal)1.0f); + QCOMPARE(v7.y(), (qreal)2.5f); + QCOMPARE(v7.z(), (qreal)0.0f); + QVERIFY(!v7.isNull()); + + QVector3D v8(QVector2D(1.0f, 2.5f), 54.25f); + QCOMPARE(v8.x(), (qreal)1.0f); + QCOMPARE(v8.y(), (qreal)2.5f); + QCOMPARE(v8.z(), (qreal)54.25f); + QVERIFY(!v8.isNull()); + + QVector3D v9(QVector4D(1.0f, 2.5f, 54.25f, 34.0f)); + QCOMPARE(v9.x(), (qreal)1.0f); + QCOMPARE(v9.y(), (qreal)2.5f); + QCOMPARE(v9.z(), (qreal)54.25f); + QVERIFY(!v9.isNull()); + + v1.setX(3.0f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)2.5f); + QCOMPARE(v1.z(), (qreal)-89.25f); + QVERIFY(!v1.isNull()); + + v1.setY(10.5f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)10.5f); + QCOMPARE(v1.z(), (qreal)-89.25f); + QVERIFY(!v1.isNull()); + + v1.setZ(15.5f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)10.5f); + QCOMPARE(v1.z(), (qreal)15.5f); + QVERIFY(!v1.isNull()); + + v1.setX(0.0f); + v1.setY(0.0f); + v1.setZ(0.0f); + QCOMPARE(v1.x(), (qreal)0.0f); + QCOMPARE(v1.y(), (qreal)0.0f); + QCOMPARE(v1.z(), (qreal)0.0f); + QVERIFY(v1.isNull()); + + QPoint p1 = v8.toPoint(); + QCOMPARE(p1.x(), 1); + QCOMPARE(p1.y(), 3); + + QPointF p2 = v8.toPointF(); + QCOMPARE((qreal)p2.x(), (qreal)1.0f); + QCOMPARE((qreal)p2.y(), (qreal)2.5f); + + QVector2D v10 = v8.toVector2D(); + QCOMPARE(v10.x(), (qreal)1.0f); + QCOMPARE(v10.y(), (qreal)2.5f); + + QVector4D v11 = v8.toVector4D(); + QCOMPARE(v11.x(), (qreal)1.0f); + QCOMPARE(v11.y(), (qreal)2.5f); + QCOMPARE(v11.z(), (qreal)54.25f); + QCOMPARE(v11.w(), (qreal)0.0f); +} + +// Test the creation of QVector4D objects in various ways: +// construct, copy, and modify. +void tst_QVector::create4() +{ + QVector4D null; + QCOMPARE(null.x(), (qreal)0.0f); + QCOMPARE(null.y(), (qreal)0.0f); + QCOMPARE(null.z(), (qreal)0.0f); + QCOMPARE(null.w(), (qreal)0.0f); + QVERIFY(null.isNull()); + + QVector4D v1(1.0f, 2.5f, -89.25f, 34.0f); + QCOMPARE(v1.x(), (qreal)1.0f); + QCOMPARE(v1.y(), (qreal)2.5f); + QCOMPARE(v1.z(), (qreal)-89.25f); + QCOMPARE(v1.w(), (qreal)34.0f); + QVERIFY(!v1.isNull()); + + QVector4D v1i(1, 2, -89, 34); + QCOMPARE(v1i.x(), (qreal)1.0f); + QCOMPARE(v1i.y(), (qreal)2.0f); + QCOMPARE(v1i.z(), (qreal)-89.0f); + QCOMPARE(v1i.w(), (qreal)34.0f); + QVERIFY(!v1i.isNull()); + + QVector4D v2(v1); + QCOMPARE(v2.x(), (qreal)1.0f); + QCOMPARE(v2.y(), (qreal)2.5f); + QCOMPARE(v2.z(), (qreal)-89.25f); + QCOMPARE(v2.w(), (qreal)34.0f); + QVERIFY(!v2.isNull()); + + QVector4D v3(1.0f, 2.5f, 0.0f, 0.0f); + QCOMPARE(v3.x(), (qreal)1.0f); + QCOMPARE(v3.y(), (qreal)2.5f); + QCOMPARE(v3.z(), (qreal)0.0f); + QCOMPARE(v3.w(), (qreal)0.0f); + QVERIFY(!v3.isNull()); + + QVector4D v3i(1, 2, 0, 0); + QCOMPARE(v3i.x(), (qreal)1.0f); + QCOMPARE(v3i.y(), (qreal)2.0f); + QCOMPARE(v3i.z(), (qreal)0.0f); + QCOMPARE(v3i.w(), (qreal)0.0f); + QVERIFY(!v3i.isNull()); + + QVector4D v3b(1.0f, 2.5f, -89.25f, 0.0f); + QCOMPARE(v3b.x(), (qreal)1.0f); + QCOMPARE(v3b.y(), (qreal)2.5f); + QCOMPARE(v3b.z(), (qreal)-89.25f); + QCOMPARE(v3b.w(), (qreal)0.0f); + QVERIFY(!v3b.isNull()); + + QVector4D v3bi(1, 2, -89, 0); + QCOMPARE(v3bi.x(), (qreal)1.0f); + QCOMPARE(v3bi.y(), (qreal)2.0f); + QCOMPARE(v3bi.z(), (qreal)-89.0f); + QCOMPARE(v3bi.w(), (qreal)0.0f); + QVERIFY(!v3bi.isNull()); + + QVector4D v4; + QCOMPARE(v4.x(), (qreal)0.0f); + QCOMPARE(v4.y(), (qreal)0.0f); + QCOMPARE(v4.z(), (qreal)0.0f); + QCOMPARE(v4.w(), (qreal)0.0f); + QVERIFY(v4.isNull()); + v4 = v1; + QCOMPARE(v4.x(), (qreal)1.0f); + QCOMPARE(v4.y(), (qreal)2.5f); + QCOMPARE(v4.z(), (qreal)-89.25f); + QCOMPARE(v4.w(), (qreal)34.0f); + QVERIFY(!v4.isNull()); + + QVector4D v5(QPoint(1, 2)); + QCOMPARE(v5.x(), (qreal)1.0f); + QCOMPARE(v5.y(), (qreal)2.0f); + QCOMPARE(v5.z(), (qreal)0.0f); + QCOMPARE(v5.w(), (qreal)0.0f); + QVERIFY(!v5.isNull()); + + QVector4D v6(QPointF(1, 2.5)); + QCOMPARE(v6.x(), (qreal)1.0f); + QCOMPARE(v6.y(), (qreal)2.5f); + QCOMPARE(v6.z(), (qreal)0.0f); + QCOMPARE(v6.w(), (qreal)0.0f); + QVERIFY(!v6.isNull()); + + QVector4D v7(QVector2D(1.0f, 2.5f)); + QCOMPARE(v7.x(), (qreal)1.0f); + QCOMPARE(v7.y(), (qreal)2.5f); + QCOMPARE(v7.z(), (qreal)0.0f); + QCOMPARE(v7.w(), (qreal)0.0f); + QVERIFY(!v7.isNull()); + + QVector4D v8(QVector3D(1.0f, 2.5f, -89.25f)); + QCOMPARE(v8.x(), (qreal)1.0f); + QCOMPARE(v8.y(), (qreal)2.5f); + QCOMPARE(v8.z(), (qreal)-89.25f); + QCOMPARE(v8.w(), (qreal)0.0f); + QVERIFY(!v8.isNull()); + + QVector4D v9(QVector3D(1.0f, 2.5f, -89.25f), 34); + QCOMPARE(v9.x(), (qreal)1.0f); + QCOMPARE(v9.y(), (qreal)2.5f); + QCOMPARE(v9.z(), (qreal)-89.25f); + QCOMPARE(v9.w(), (qreal)34.0f); + QVERIFY(!v9.isNull()); + + QVector4D v10(QVector2D(1.0f, 2.5f), 23.5f, -8); + QCOMPARE(v10.x(), (qreal)1.0f); + QCOMPARE(v10.y(), (qreal)2.5f); + QCOMPARE(v10.z(), (qreal)23.5f); + QCOMPARE(v10.w(), (qreal)-8.0f); + QVERIFY(!v10.isNull()); + + v1.setX(3.0f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)2.5f); + QCOMPARE(v1.z(), (qreal)-89.25f); + QCOMPARE(v1.w(), (qreal)34.0f); + QVERIFY(!v1.isNull()); + + v1.setY(10.5f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)10.5f); + QCOMPARE(v1.z(), (qreal)-89.25f); + QCOMPARE(v1.w(), (qreal)34.0f); + QVERIFY(!v1.isNull()); + + v1.setZ(15.5f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)10.5f); + QCOMPARE(v1.z(), (qreal)15.5f); + QCOMPARE(v1.w(), (qreal)34.0f); + QVERIFY(!v1.isNull()); + + v1.setW(6.0f); + QCOMPARE(v1.x(), (qreal)3.0f); + QCOMPARE(v1.y(), (qreal)10.5f); + QCOMPARE(v1.z(), (qreal)15.5f); + QCOMPARE(v1.w(), (qreal)6.0f); + QVERIFY(!v1.isNull()); + + v1.setX(0.0f); + v1.setY(0.0f); + v1.setZ(0.0f); + v1.setW(0.0f); + QCOMPARE(v1.x(), (qreal)0.0f); + QCOMPARE(v1.y(), (qreal)0.0f); + QCOMPARE(v1.z(), (qreal)0.0f); + QCOMPARE(v1.w(), (qreal)0.0f); + QVERIFY(v1.isNull()); + + QPoint p1 = v8.toPoint(); + QCOMPARE(p1.x(), 1); + QCOMPARE(p1.y(), 3); + + QPointF p2 = v8.toPointF(); + QCOMPARE((qreal)p2.x(), (qreal)1.0f); + QCOMPARE((qreal)p2.y(), (qreal)2.5f); + + QVector2D v11 = v8.toVector2D(); + QCOMPARE(v11.x(), (qreal)1.0f); + QCOMPARE(v11.y(), (qreal)2.5f); + + QVector3D v12 = v8.toVector3D(); + QCOMPARE(v12.x(), (qreal)1.0f); + QCOMPARE(v12.y(), (qreal)2.5f); + QCOMPARE(v12.z(), (qreal)-89.25f); + + QVector2D v13 = v9.toVector2DAffine(); + QVERIFY(fuzzyCompare(v13.x(), (qreal)(1.0f / 34.0f))); + QVERIFY(fuzzyCompare(v13.y(), (qreal)(2.5f / 34.0f))); + + QVector4D zerow(1.0f, 2.0f, 3.0f, 0.0f); + v13 = zerow.toVector2DAffine(); + QVERIFY(v13.isNull()); + + QVector3D v14 = v9.toVector3DAffine(); + QVERIFY(fuzzyCompare(v14.x(), (qreal)(1.0f / 34.0f))); + QVERIFY(fuzzyCompare(v14.y(), (qreal)(2.5f / 34.0f))); + QVERIFY(fuzzyCompare(v14.z(), (qreal)(-89.25f / 34.0f))); + + v14 = zerow.toVector3DAffine(); + QVERIFY(v14.isNull()); +} + +// Test vector length computation for 2D vectors. +void tst_QVector::length2_data() +{ + QTest::addColumn("x"); + QTest::addColumn("y"); + QTest::addColumn("len"); + + QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f; + QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f; + QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)qSqrt(8.0f); +} +void tst_QVector::length2() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, len); + + QVector2D v(x, y); + QCOMPARE((float)(v.length()), (float)len); + QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y)); +} + +// Test vector length computation for 3D vectors. +void tst_QVector::length3_data() +{ + QTest::addColumn("x"); + QTest::addColumn("y"); + QTest::addColumn("z"); + QTest::addColumn("len"); + + QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("1z") << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f; + QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("-1z") << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f; + QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)2.0f << (qreal)qSqrt(12.0f); +} +void tst_QVector::length3() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + QFETCH(qreal, len); + + QVector3D v(x, y, z); + QCOMPARE((float)(v.length()), (float)len); + QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y + z * z)); +} + +// Test vector length computation for 4D vectors. +void tst_QVector::length4_data() +{ + QTest::addColumn("x"); + QTest::addColumn("y"); + QTest::addColumn("z"); + QTest::addColumn("w"); + QTest::addColumn("len"); + + QTest::newRow("null") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + QTest::newRow("1x") << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("1y") << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("1z") << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)1.0f; + QTest::newRow("-1x") << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("-1y") << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("-1z") << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)0.0f << (qreal)1.0f; + QTest::newRow("-1w") << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)-1.0f << (qreal)1.0f; + QTest::newRow("two") << (qreal)2.0f << (qreal)-2.0f << (qreal)2.0f << (qreal)2.0f << (qreal)qSqrt(16.0f); +} +void tst_QVector::length4() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + QFETCH(qreal, w); + QFETCH(qreal, len); + + QVector4D v(x, y, z, w); + QCOMPARE((float)(v.length()), (float)len); + QCOMPARE((float)(v.lengthSquared()), (float)(x * x + y * y + z * z + w * w)); +} + +// Test the unit vector conversion for 2D vectors. +void tst_QVector::normalized2_data() +{ + // Use the same test data as the length test. + length2_data(); +} +void tst_QVector::normalized2() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, len); + + QVector2D v(x, y); + QVector2D u = v.normalized(); + if (v.isNull()) + QVERIFY(u.isNull()); + else + QCOMPARE((float)(u.length()), (float)1.0f); + QCOMPARE((float)(u.x() * len), (float)(v.x())); + QCOMPARE((float)(u.y() * len), (float)(v.y())); +} + +// Test the unit vector conversion for 3D vectors. +void tst_QVector::normalized3_data() +{ + // Use the same test data as the length test. + length3_data(); +} +void tst_QVector::normalized3() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + QFETCH(qreal, len); + + QVector3D v(x, y, z); + QVector3D u = v.normalized(); + if (v.isNull()) + QVERIFY(u.isNull()); + else + QCOMPARE((float)(u.length()), (float)1.0f); + QCOMPARE((float)(u.x() * len), (float)(v.x())); + QCOMPARE((float)(u.y() * len), (float)(v.y())); + QCOMPARE((float)(u.z() * len), (float)(v.z())); +} + +// Test the unit vector conversion for 4D vectors. +void tst_QVector::normalized4_data() +{ + // Use the same test data as the length test. + length4_data(); +} +void tst_QVector::normalized4() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + QFETCH(qreal, w); + QFETCH(qreal, len); + + QVector4D v(x, y, z, w); + QVector4D u = v.normalized(); + if (v.isNull()) + QVERIFY(u.isNull()); + else + QCOMPARE((float)(u.length()), (float)1.0f); + QCOMPARE((float)(u.x() * len), (float)(v.x())); + QCOMPARE((float)(u.y() * len), (float)(v.y())); + QCOMPARE((float)(u.z() * len), (float)(v.z())); + QCOMPARE((float)(u.w() * len), (float)(v.w())); +} + +// Test the unit vector conversion for 2D vectors. +void tst_QVector::normalize2_data() +{ + // Use the same test data as the length test. + length2_data(); +} +void tst_QVector::normalize2() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + + QVector2D v(x, y); + bool isNull = v.isNull(); + v.normalize(); + if (isNull) + QVERIFY(v.isNull()); + else + QCOMPARE((float)(v.length()), (float)1.0f); +} + +// Test the unit vector conversion for 3D vectors. +void tst_QVector::normalize3_data() +{ + // Use the same test data as the length test. + length3_data(); +} +void tst_QVector::normalize3() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + + QVector3D v(x, y, z); + bool isNull = v.isNull(); + v.normalize(); + if (isNull) + QVERIFY(v.isNull()); + else + QCOMPARE((float)(v.length()), (float)1.0f); +} + +// Test the unit vector conversion for 4D vectors. +void tst_QVector::normalize4_data() +{ + // Use the same test data as the length test. + length4_data(); +} +void tst_QVector::normalize4() +{ + QFETCH(qreal, x); + QFETCH(qreal, y); + QFETCH(qreal, z); + QFETCH(qreal, w); + + QVector4D v(x, y, z, w); + bool isNull = v.isNull(); + v.normalize(); + if (isNull) + QVERIFY(v.isNull()); + else + QCOMPARE((float)(v.length()), (float)1.0f); +} + +// Test the comparison operators for 2D vectors. +void tst_QVector::compare2() +{ + QVector2D v1(1, 2); + QVector2D v2(1, 2); + QVector2D v3(3, 2); + QVector2D v4(1, 3); + + QVERIFY(v1 == v2); + QVERIFY(v1 != v3); + QVERIFY(v1 != v4); +} + +// Test the comparison operators for 3D vectors. +void tst_QVector::compare3() +{ + QVector3D v1(1, 2, 4); + QVector3D v2(1, 2, 4); + QVector3D v3(3, 2, 4); + QVector3D v4(1, 3, 4); + QVector3D v5(1, 2, 3); + + QVERIFY(v1 == v2); + QVERIFY(v1 != v3); + QVERIFY(v1 != v4); + QVERIFY(v1 != v5); +} + +// Test the comparison operators for 4D vectors. +void tst_QVector::compare4() +{ + QVector4D v1(1, 2, 4, 8); + QVector4D v2(1, 2, 4, 8); + QVector4D v3(3, 2, 4, 8); + QVector4D v4(1, 3, 4, 8); + QVector4D v5(1, 2, 3, 8); + QVector4D v6(1, 2, 4, 3); + + QVERIFY(v1 == v2); + QVERIFY(v1 != v3); + QVERIFY(v1 != v4); + QVERIFY(v1 != v5); + QVERIFY(v1 != v6); +} + +// Test vector addition for 2D vectors. +void tst_QVector::add2_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("x3"); + QTest::addColumn("y3"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f + << (qreal)2.0f << (qreal)0.0f + << (qreal)3.0f << (qreal)0.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)2.0f + << (qreal)0.0f << (qreal)3.0f; + + QTest::newRow("all") + << (qreal)1.0f << (qreal)2.0f + << (qreal)4.0f << (qreal)5.0f + << (qreal)5.0f << (qreal)7.0f; +} +void tst_QVector::add2() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + + QVector2D v1(x1, y1); + QVector2D v2(x2, y2); + QVector2D v3(x3, y3); + + QVERIFY((v1 + v2) == v3); + + QVector2D v4(v1); + v4 += v2; + QVERIFY(v4 == v3); + + QCOMPARE(v4.x(), v1.x() + v2.x()); + QCOMPARE(v4.y(), v1.y() + v2.y()); +} + +// Test vector addition for 3D vectors. +void tst_QVector::add3_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("x3"); + QTest::addColumn("y3"); + QTest::addColumn("z3"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f; + + QTest::newRow("zonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f; + + QTest::newRow("all") + << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f + << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f + << (qreal)5.0f << (qreal)7.0f << (qreal)-3.0f; +} +void tst_QVector::add3() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + + QVector3D v1(x1, y1, z1); + QVector3D v2(x2, y2, z2); + QVector3D v3(x3, y3, z3); + + QVERIFY((v1 + v2) == v3); + + QVector3D v4(v1); + v4 += v2; + QVERIFY(v4 == v3); + + QCOMPARE(v4.x(), v1.x() + v2.x()); + QCOMPARE(v4.y(), v1.y() + v2.y()); + QCOMPARE(v4.z(), v1.z() + v2.z()); +} + +// Test vector addition for 4D vectors. +void tst_QVector::add4_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("w1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("w2"); + QTest::addColumn("x3"); + QTest::addColumn("y3"); + QTest::addColumn("z3"); + QTest::addColumn("w3"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("zonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f << (qreal)0.0f; + + QTest::newRow("wonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)3.0f; + + QTest::newRow("all") + << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)8.0f + << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)9.0f + << (qreal)5.0f << (qreal)7.0f << (qreal)-3.0f << (qreal)17.0f; +} +void tst_QVector::add4() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, w2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + QFETCH(qreal, w3); + + QVector4D v1(x1, y1, z1, w1); + QVector4D v2(x2, y2, z2, w2); + QVector4D v3(x3, y3, z3, w3); + + QVERIFY((v1 + v2) == v3); + + QVector4D v4(v1); + v4 += v2; + QVERIFY(v4 == v3); + + QCOMPARE(v4.x(), v1.x() + v2.x()); + QCOMPARE(v4.y(), v1.y() + v2.y()); + QCOMPARE(v4.z(), v1.z() + v2.z()); + QCOMPARE(v4.w(), v1.w() + v2.w()); +} + +// Test vector subtraction for 2D vectors. +void tst_QVector::subtract2_data() +{ + // Use the same test data as the add test. + add2_data(); +} +void tst_QVector::subtract2() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + + QVector2D v1(x1, y1); + QVector2D v2(x2, y2); + QVector2D v3(x3, y3); + + QVERIFY((v3 - v1) == v2); + QVERIFY((v3 - v2) == v1); + + QVector2D v4(v3); + v4 -= v1; + QVERIFY(v4 == v2); + + QCOMPARE(v4.x(), v3.x() - v1.x()); + QCOMPARE(v4.y(), v3.y() - v1.y()); + + QVector2D v5(v3); + v5 -= v2; + QVERIFY(v5 == v1); + + QCOMPARE(v5.x(), v3.x() - v2.x()); + QCOMPARE(v5.y(), v3.y() - v2.y()); +} + +// Test vector subtraction for 3D vectors. +void tst_QVector::subtract3_data() +{ + // Use the same test data as the add test. + add3_data(); +} +void tst_QVector::subtract3() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + + QVector3D v1(x1, y1, z1); + QVector3D v2(x2, y2, z2); + QVector3D v3(x3, y3, z3); + + QVERIFY((v3 - v1) == v2); + QVERIFY((v3 - v2) == v1); + + QVector3D v4(v3); + v4 -= v1; + QVERIFY(v4 == v2); + + QCOMPARE(v4.x(), v3.x() - v1.x()); + QCOMPARE(v4.y(), v3.y() - v1.y()); + QCOMPARE(v4.z(), v3.z() - v1.z()); + + QVector3D v5(v3); + v5 -= v2; + QVERIFY(v5 == v1); + + QCOMPARE(v5.x(), v3.x() - v2.x()); + QCOMPARE(v5.y(), v3.y() - v2.y()); + QCOMPARE(v5.z(), v3.z() - v2.z()); +} + +// Test vector subtraction for 4D vectors. +void tst_QVector::subtract4_data() +{ + // Use the same test data as the add test. + add4_data(); +} +void tst_QVector::subtract4() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, w2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + QFETCH(qreal, w3); + + QVector4D v1(x1, y1, z1, w1); + QVector4D v2(x2, y2, z2, w2); + QVector4D v3(x3, y3, z3, w3); + + QVERIFY((v3 - v1) == v2); + QVERIFY((v3 - v2) == v1); + + QVector4D v4(v3); + v4 -= v1; + QVERIFY(v4 == v2); + + QCOMPARE(v4.x(), v3.x() - v1.x()); + QCOMPARE(v4.y(), v3.y() - v1.y()); + QCOMPARE(v4.z(), v3.z() - v1.z()); + QCOMPARE(v4.w(), v3.w() - v1.w()); + + QVector4D v5(v3); + v5 -= v2; + QVERIFY(v5 == v1); + + QCOMPARE(v5.x(), v3.x() - v2.x()); + QCOMPARE(v5.y(), v3.y() - v2.y()); + QCOMPARE(v5.z(), v3.z() - v2.z()); + QCOMPARE(v5.w(), v3.w() - v2.w()); +} + +// Test component-wise vector multiplication for 2D vectors. +void tst_QVector::multiply2_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("x3"); + QTest::addColumn("y3"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f + << (qreal)2.0f << (qreal)0.0f + << (qreal)2.0f << (qreal)0.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)2.0f + << (qreal)0.0f << (qreal)2.0f; + + QTest::newRow("all") + << (qreal)1.0f << (qreal)2.0f + << (qreal)4.0f << (qreal)5.0f + << (qreal)4.0f << (qreal)10.0f; +} +void tst_QVector::multiply2() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + + QVector2D v1(x1, y1); + QVector2D v2(x2, y2); + QVector2D v3(x3, y3); + + QVERIFY((v1 * v2) == v3); + + QVector2D v4(v1); + v4 *= v2; + QVERIFY(v4 == v3); + + QCOMPARE(v4.x(), v1.x() * v2.x()); + QCOMPARE(v4.y(), v1.y() * v2.y()); +} + +// Test component-wise vector multiplication for 3D vectors. +void tst_QVector::multiply3_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("x3"); + QTest::addColumn("y3"); + QTest::addColumn("z3"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f; + + QTest::newRow("zonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f; + + QTest::newRow("all") + << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f + << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f + << (qreal)4.0f << (qreal)10.0f << (qreal)-18.0f; +} +void tst_QVector::multiply3() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + + QVector3D v1(x1, y1, z1); + QVector3D v2(x2, y2, z2); + QVector3D v3(x3, y3, z3); + + QVERIFY((v1 * v2) == v3); + + QVector3D v4(v1); + v4 *= v2; + QVERIFY(v4 == v3); + + QCOMPARE(v4.x(), v1.x() * v2.x()); + QCOMPARE(v4.y(), v1.y() * v2.y()); + QCOMPARE(v4.z(), v1.z() * v2.z()); +} + +// Test component-wise vector multiplication for 4D vectors. +void tst_QVector::multiply4_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("w1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("w2"); + QTest::addColumn("x3"); + QTest::addColumn("y3"); + QTest::addColumn("z3"); + QTest::addColumn("w3"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("zonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f; + + QTest::newRow("wonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f; + + QTest::newRow("all") + << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)8.0f + << (qreal)4.0f << (qreal)5.0f << (qreal)-6.0f << (qreal)9.0f + << (qreal)4.0f << (qreal)10.0f << (qreal)-18.0f << (qreal)72.0f; +} +void tst_QVector::multiply4() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, w2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + QFETCH(qreal, w3); + + QVector4D v1(x1, y1, z1, w1); + QVector4D v2(x2, y2, z2, w2); + QVector4D v3(x3, y3, z3, w3); + + QVERIFY((v1 * v2) == v3); + + QVector4D v4(v1); + v4 *= v2; + QVERIFY(v4 == v3); + + QCOMPARE(v4.x(), v1.x() * v2.x()); + QCOMPARE(v4.y(), v1.y() * v2.y()); + QCOMPARE(v4.z(), v1.z() * v2.z()); + QCOMPARE(v4.w(), v1.w() * v2.w()); +} + +// Test vector multiplication by a factor for 2D vectors. +void tst_QVector::multiplyFactor2_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("factor"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f + << (qreal)100.0f + << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f + << (qreal)2.0f + << (qreal)2.0f << (qreal)0.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f + << (qreal)2.0f + << (qreal)0.0f << (qreal)2.0f; + + QTest::newRow("all") + << (qreal)1.0f << (qreal)2.0f + << (qreal)2.0f + << (qreal)2.0f << (qreal)4.0f; + + QTest::newRow("allzero") + << (qreal)1.0f << (qreal)2.0f + << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f; +} +void tst_QVector::multiplyFactor2() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, factor); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + + QVector2D v1(x1, y1); + QVector2D v2(x2, y2); + + QVERIFY((v1 * factor) == v2); + QVERIFY((factor * v1) == v2); + + QVector2D v3(v1); + v3 *= factor; + QVERIFY(v3 == v2); + + QCOMPARE(v3.x(), v1.x() * factor); + QCOMPARE(v3.y(), v1.y() * factor); +} + +// Test vector multiplication by a factor for 3D vectors. +void tst_QVector::multiplyFactor3_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("factor"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)100.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f + << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f + << (qreal)2.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f; + + QTest::newRow("zonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)2.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f; + + QTest::newRow("all") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f + << (qreal)2.0f + << (qreal)2.0f << (qreal)4.0f << (qreal)-6.0f; + + QTest::newRow("allzero") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f + << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; +} +void tst_QVector::multiplyFactor3() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, factor); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + + QVector3D v1(x1, y1, z1); + QVector3D v2(x2, y2, z2); + + QVERIFY((v1 * factor) == v2); + QVERIFY((factor * v1) == v2); + + QVector3D v3(v1); + v3 *= factor; + QVERIFY(v3 == v2); + + QCOMPARE(v3.x(), v1.x() * factor); + QCOMPARE(v3.y(), v1.y() * factor); + QCOMPARE(v3.z(), v1.z() * factor); +} + +// Test vector multiplication by a factor for 4D vectors. +void tst_QVector::multiplyFactor4_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("w1"); + QTest::addColumn("factor"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("w2"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)100.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("xonly") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f + << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("yonly") + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)2.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f << (qreal)0.0f; + + QTest::newRow("zonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f + << (qreal)2.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f; + + QTest::newRow("wonly") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)2.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f; + + QTest::newRow("all") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f + << (qreal)2.0f + << (qreal)2.0f << (qreal)4.0f << (qreal)-6.0f << (qreal)8.0f; + + QTest::newRow("allzero") + << (qreal)1.0f << (qreal)2.0f << (qreal)-3.0f << (qreal)4.0f + << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f; +} +void tst_QVector::multiplyFactor4() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + QFETCH(qreal, factor); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, w2); + + QVector4D v1(x1, y1, z1, w1); + QVector4D v2(x2, y2, z2, w2); + + QVERIFY((v1 * factor) == v2); + QVERIFY((factor * v1) == v2); + + QVector4D v3(v1); + v3 *= factor; + QVERIFY(v3 == v2); + + QCOMPARE(v3.x(), v1.x() * factor); + QCOMPARE(v3.y(), v1.y() * factor); + QCOMPARE(v3.z(), v1.z() * factor); + QCOMPARE(v3.w(), v1.w() * factor); +} + +// Test vector division by a factor for 2D vectors. +void tst_QVector::divide2_data() +{ + // Use the same test data as the multiply test. + multiplyFactor2_data(); +} +void tst_QVector::divide2() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, factor); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + + QVector2D v1(x1, y1); + QVector2D v2(x2, y2); + + if (factor == (qreal)0.0f) + return; + + QVERIFY((v2 / factor) == v1); + + QVector2D v3(v2); + v3 /= factor; + QVERIFY(v3 == v1); + + QCOMPARE(v3.x(), v2.x() / factor); + QCOMPARE(v3.y(), v2.y() / factor); +} + +// Test vector division by a factor for 3D vectors. +void tst_QVector::divide3_data() +{ + // Use the same test data as the multiply test. + multiplyFactor3_data(); +} +void tst_QVector::divide3() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, factor); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + + QVector3D v1(x1, y1, z1); + QVector3D v2(x2, y2, z2); + + if (factor == (qreal)0.0f) + return; + + QVERIFY((v2 / factor) == v1); + + QVector3D v3(v2); + v3 /= factor; + QVERIFY(v3 == v1); + + QCOMPARE(v3.x(), v2.x() / factor); + QCOMPARE(v3.y(), v2.y() / factor); + QCOMPARE(v3.z(), v2.z() / factor); +} + +// Test vector division by a factor for 4D vectors. +void tst_QVector::divide4_data() +{ + // Use the same test data as the multiply test. + multiplyFactor4_data(); +} +void tst_QVector::divide4() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + QFETCH(qreal, factor); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, w2); + + QVector4D v1(x1, y1, z1, w1); + QVector4D v2(x2, y2, z2, w2); + + if (factor == (qreal)0.0f) + return; + + QVERIFY((v2 / factor) == v1); + + QVector4D v3(v2); + v3 /= factor; + QVERIFY(v3 == v1); + + QCOMPARE(v3.x(), v2.x() / factor); + QCOMPARE(v3.y(), v2.y() / factor); + QCOMPARE(v3.z(), v2.z() / factor); + QCOMPARE(v3.w(), v2.w() / factor); +} + +// Test vector negation for 2D vectors. +void tst_QVector::negate2_data() +{ + // Use the same test data as the add test. + add2_data(); +} +void tst_QVector::negate2() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + + QVector2D v1(x1, y1); + QVector2D v2(-x1, -y1); + + QVERIFY(-v1 == v2); +} + +// Test vector negation for 3D vectors. +void tst_QVector::negate3_data() +{ + // Use the same test data as the add test. + add3_data(); +} +void tst_QVector::negate3() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + + QVector3D v1(x1, y1, z1); + QVector3D v2(-x1, -y1, -z1); + + QVERIFY(-v1 == v2); +} + +// Test vector negation for 4D vectors. +void tst_QVector::negate4_data() +{ + // Use the same test data as the add test. + add4_data(); +} +void tst_QVector::negate4() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + + QVector4D v1(x1, y1, z1, w1); + QVector4D v2(-x1, -y1, -z1, -w1); + + QVERIFY(-v1 == v2); +} + +// Test the computation of vector cross-products. +void tst_QVector::crossProduct_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("x3"); + QTest::addColumn("y3"); + QTest::addColumn("z3"); + QTest::addColumn("dot"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f; + + QTest::newRow("unitvec") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f; + + QTest::newRow("complex") + << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f + << (qreal)4.0f << (qreal)5.0f << (qreal)6.0f + << (qreal)-3.0f << (qreal)6.0f << (qreal)-3.0f + << (qreal)32.0f; +} +void tst_QVector::crossProduct() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + + QVector3D v1(x1, y1, z1); + QVector3D v2(x2, y2, z2); + QVector3D v3(x3, y3, z3); + + QVector3D v4 = QVector3D::crossProduct(v1, v2); + QVERIFY(v4 == v3); + + // Compute the cross-product long-hand and check again. + qreal xres = y1 * z2 - z1 * y2; + qreal yres = z1 * x2 - x1 * z2; + qreal zres = x1 * y2 - y1 * x2; + + QCOMPARE(v4.x(), xres); + QCOMPARE(v4.y(), yres); + QCOMPARE(v4.z(), zres); +} + +// Test the computation of normals. +void tst_QVector::normal_data() +{ + // Use the same test data as the crossProduct test. + crossProduct_data(); +} +void tst_QVector::normal() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + + QVector3D v1(x1, y1, z1); + QVector3D v2(x2, y2, z2); + QVector3D v3(x3, y3, z3); + + QVERIFY(QVector3D::normal(v1, v2) == v3.normalized()); + QVERIFY(QVector3D::normal(QVector3D(), v1, v2) == v3.normalized()); + + QVector3D point(1.0f, 2.0f, 3.0f); + QVERIFY(QVector3D::normal(point, v1 + point, v2 + point) == v3.normalized()); +} + +// Test distance to plane calculations. +void tst_QVector::distanceToPlane_data() +{ + QTest::addColumn("x1"); // Point on plane + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("x2"); // Normal to plane + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("x3"); // Point to test for distance + QTest::addColumn("y3"); + QTest::addColumn("z3"); + QTest::addColumn("x4"); // Second point on plane + QTest::addColumn("y4"); + QTest::addColumn("z4"); + QTest::addColumn("x5"); // Third point on plane + QTest::addColumn("y5"); + QTest::addColumn("z5"); + QTest::addColumn("distance"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f + << (qreal)0.0f; + + QTest::newRow("above") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)2.0f + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f + << (qreal)2.0f; + + QTest::newRow("below") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)-1.0f << (qreal)1.0f << (qreal)-2.0f + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)2.0f << (qreal)0.0f + << (qreal)-2.0f; +} +void tst_QVector::distanceToPlane() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + QFETCH(qreal, x4); + QFETCH(qreal, y4); + QFETCH(qreal, z4); + QFETCH(qreal, x5); + QFETCH(qreal, y5); + QFETCH(qreal, z5); + QFETCH(qreal, distance); + + QVector3D v1(x1, y1, z1); + QVector3D v2(x2, y2, z2); + QVector3D v3(x3, y3, z3); + QVector3D v4(x4, y4, z4); + QVector3D v5(x5, y5, z5); + + QCOMPARE(v3.distanceToPlane(v1, v2), distance); + QCOMPARE(v3.distanceToPlane(v1, v4, v5), distance); +} + +// Test distance to line calculations. +void tst_QVector::distanceToLine_data() +{ + QTest::addColumn("x1"); // Point on line + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("x2"); // Direction of the line + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("x3"); // Point to test for distance + QTest::addColumn("y3"); + QTest::addColumn("z3"); + QTest::addColumn("distance"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f; + + QTest::newRow("on line") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)5.0f + << (qreal)0.0f; + + QTest::newRow("off line") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)1.0f; + + QTest::newRow("off line 2") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f << (qreal)-2.0f << (qreal)0.0f + << (qreal)2.0f; + + QTest::newRow("points") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)5.0f << (qreal)0.0f + << (qreal)5.0f; +} +void tst_QVector::distanceToLine() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + QFETCH(qreal, distance); + + QVector3D v1(x1, y1, z1); + QVector3D v2(x2, y2, z2); + QVector3D v3(x3, y3, z3); + + QCOMPARE(v3.distanceToLine(v1, v2), distance); +} + +// Test the computation of dot products for 2D vectors. +void tst_QVector::dotProduct2_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("dot"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f; + + QTest::newRow("unitvec") + << (qreal)1.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)1.0f + << (qreal)0.0f; + + QTest::newRow("complex") + << (qreal)1.0f << (qreal)2.0f + << (qreal)4.0f << (qreal)5.0f + << (qreal)14.0f; +} +void tst_QVector::dotProduct2() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, dot); + + QVector2D v1(x1, y1); + QVector2D v2(x2, y2); + + QVERIFY(QVector2D::dotProduct(v1, v2) == dot); + + // Compute the dot-product long-hand and check again. + qreal d = x1 * x2 + y1 * y2; + + QCOMPARE(QVector2D::dotProduct(v1, v2), d); +} + +// Test the computation of dot products for 3D vectors. +void tst_QVector::dotProduct3_data() +{ + // Use the same test data as the crossProduct test. + crossProduct_data(); +} +void tst_QVector::dotProduct3() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, x3); + QFETCH(qreal, y3); + QFETCH(qreal, z3); + QFETCH(qreal, dot); + + Q_UNUSED(x3); + Q_UNUSED(y3); + Q_UNUSED(z3); + + QVector3D v1(x1, y1, z1); + QVector3D v2(x2, y2, z2); + + QVERIFY(QVector3D::dotProduct(v1, v2) == dot); + + // Compute the dot-product long-hand and check again. + qreal d = x1 * x2 + y1 * y2 + z1 * z2; + + QCOMPARE(QVector3D::dotProduct(v1, v2), d); +} + +// Test the computation of dot products for 4D vectors. +void tst_QVector::dotProduct4_data() +{ + QTest::addColumn("x1"); + QTest::addColumn("y1"); + QTest::addColumn("z1"); + QTest::addColumn("w1"); + QTest::addColumn("x2"); + QTest::addColumn("y2"); + QTest::addColumn("z2"); + QTest::addColumn("w2"); + QTest::addColumn("dot"); + + QTest::newRow("null") + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f; + + QTest::newRow("unitvec") + << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f << (qreal)1.0f << (qreal)0.0f << (qreal)0.0f + << (qreal)0.0f; + + QTest::newRow("complex") + << (qreal)1.0f << (qreal)2.0f << (qreal)3.0f << (qreal)4.0f + << (qreal)4.0f << (qreal)5.0f << (qreal)6.0f << (qreal)7.0f + << (qreal)60.0f; +} +void tst_QVector::dotProduct4() +{ + QFETCH(qreal, x1); + QFETCH(qreal, y1); + QFETCH(qreal, z1); + QFETCH(qreal, w1); + QFETCH(qreal, x2); + QFETCH(qreal, y2); + QFETCH(qreal, z2); + QFETCH(qreal, w2); + QFETCH(qreal, dot); + + QVector4D v1(x1, y1, z1, w1); + QVector4D v2(x2, y2, z2, w2); + + QVERIFY(QVector4D::dotProduct(v1, v2) == dot); + + // Compute the dot-product long-hand and check again. + qreal d = x1 * x2 + y1 * y2 + z1 * z2 + w1 * w2; + + QCOMPARE(QVector4D::dotProduct(v1, v2), d); +} + +class tst_QVectorProperties : public QObject +{ + Q_OBJECT + Q_PROPERTY(QVector2D vector2D READ vector2D WRITE setVector2D) + Q_PROPERTY(QVector3D vector3D READ vector3D WRITE setVector3D) + Q_PROPERTY(QVector4D vector4D READ vector4D WRITE setVector4D) +public: + tst_QVectorProperties(QObject *parent = 0) : QObject(parent) {} + + QVector2D vector2D() const { return v2; } + void setVector2D(const QVector2D& value) { v2 = value; } + + QVector3D vector3D() const { return v3; } + void setVector3D(const QVector3D& value) { v3 = value; } + + QVector4D vector4D() const { return v4; } + void setVector4D(const QVector4D& value) { v4 = value; } + +private: + QVector2D v2; + QVector3D v3; + QVector4D v4; +}; + +// Test getting and setting vector properties via the metaobject system. +void tst_QVector::properties() +{ + tst_QVectorProperties obj; + + obj.setVector2D(QVector2D(1.0f, 2.0f)); + obj.setVector3D(QVector3D(3.0f, 4.0f, 5.0f)); + obj.setVector4D(QVector4D(6.0f, 7.0f, 8.0f, 9.0f)); + + QVector2D v2 = qVariantValue(obj.property("vector2D")); + QCOMPARE(v2.x(), (qreal)1.0f); + QCOMPARE(v2.y(), (qreal)2.0f); + + QVector3D v3 = qVariantValue(obj.property("vector3D")); + QCOMPARE(v3.x(), (qreal)3.0f); + QCOMPARE(v3.y(), (qreal)4.0f); + QCOMPARE(v3.z(), (qreal)5.0f); + + QVector4D v4 = qVariantValue(obj.property("vector4D")); + QCOMPARE(v4.x(), (qreal)6.0f); + QCOMPARE(v4.y(), (qreal)7.0f); + QCOMPARE(v4.z(), (qreal)8.0f); + QCOMPARE(v4.w(), (qreal)9.0f); + + obj.setProperty("vector2D", + qVariantFromValue(QVector2D(-1.0f, -2.0f))); + obj.setProperty("vector3D", + qVariantFromValue(QVector3D(-3.0f, -4.0f, -5.0f))); + obj.setProperty("vector4D", + qVariantFromValue(QVector4D(-6.0f, -7.0f, -8.0f, -9.0f))); + + v2 = qVariantValue(obj.property("vector2D")); + QCOMPARE(v2.x(), (qreal)-1.0f); + QCOMPARE(v2.y(), (qreal)-2.0f); + + v3 = qVariantValue(obj.property("vector3D")); + QCOMPARE(v3.x(), (qreal)-3.0f); + QCOMPARE(v3.y(), (qreal)-4.0f); + QCOMPARE(v3.z(), (qreal)-5.0f); + + v4 = qVariantValue(obj.property("vector4D")); + QCOMPARE(v4.x(), (qreal)-6.0f); + QCOMPARE(v4.y(), (qreal)-7.0f); + QCOMPARE(v4.z(), (qreal)-8.0f); + QCOMPARE(v4.w(), (qreal)-9.0f); +} + +void tst_QVector::metaTypes() +{ + QVERIFY(QMetaType::type("QVector2D") == QMetaType::QVector2D); + QVERIFY(QMetaType::type("QVector3D") == QMetaType::QVector3D); + QVERIFY(QMetaType::type("QVector4D") == QMetaType::QVector4D); + + QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector2D)), + QByteArray("QVector2D")); + QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector3D)), + QByteArray("QVector3D")); + QCOMPARE(QByteArray(QMetaType::typeName(QMetaType::QVector4D)), + QByteArray("QVector4D")); + + QVERIFY(QMetaType::isRegistered(QMetaType::QVector2D)); + QVERIFY(QMetaType::isRegistered(QMetaType::QVector3D)); + QVERIFY(QMetaType::isRegistered(QMetaType::QVector4D)); + + QVERIFY(qMetaTypeId() == QMetaType::QVector2D); + QVERIFY(qMetaTypeId() == QMetaType::QVector3D); + QVERIFY(qMetaTypeId() == QMetaType::QVector4D); +} + +QTEST_APPLESS_MAIN(tst_QVector) + +#include "tst_qvectornd.moc" -- cgit v0.12 From af98f27a847688e53ab1d34b4a9c04bdc63fe3e1 Mon Sep 17 00:00:00 2001 From: Bill King Date: Wed, 19 Aug 2009 10:09:49 +1000 Subject: Fixes compile --- examples/xml/streambookmarks/xbelreader.cpp | 9 +++++++++ examples/xml/streambookmarks/xbelreader.h | 1 + 2 files changed, 10 insertions(+) diff --git a/examples/xml/streambookmarks/xbelreader.cpp b/examples/xml/streambookmarks/xbelreader.cpp index 729fcf8..4472f8a 100644 --- a/examples/xml/streambookmarks/xbelreader.cpp +++ b/examples/xml/streambookmarks/xbelreader.cpp @@ -73,6 +73,15 @@ bool XbelReader::read(QIODevice *device) } //! [1] +//! [2] +void XbelReader::readUnknownElement() +{ + while (readNextStartElement()) { + readUnknownElement(); + } +} +//! [2] + //! [3] void XbelReader::readXBEL() { diff --git a/examples/xml/streambookmarks/xbelreader.h b/examples/xml/streambookmarks/xbelreader.h index 2debadc..80f0a28 100644 --- a/examples/xml/streambookmarks/xbelreader.h +++ b/examples/xml/streambookmarks/xbelreader.h @@ -62,6 +62,7 @@ public: private: //! [2] + void readUnknownElement(); void readXBEL(); void readTitle(QTreeWidgetItem *item); void readSeparator(QTreeWidgetItem *item); -- cgit v0.12