aboutsummaryrefslogtreecommitdiffstats
path: root/tests/baseline/scenegraph/scenegrabber/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/baseline/scenegraph/scenegrabber/main.cpp')
-rw-r--r--tests/baseline/scenegraph/scenegrabber/main.cpp228
1 files changed, 228 insertions, 0 deletions
diff --git a/tests/baseline/scenegraph/scenegrabber/main.cpp b/tests/baseline/scenegraph/scenegrabber/main.cpp
new file mode 100644
index 0000000000..f9e1dc8fbb
--- /dev/null
+++ b/tests/baseline/scenegraph/scenegrabber/main.cpp
@@ -0,0 +1,228 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtCore/QTimer>
+#include <QtCore/QDebug>
+#include <QtCore/QFileInfo>
+#include <QtCore/QHashFunctions>
+#include <QtGui/QGuiApplication>
+#include <QtGui/QImage>
+
+#include <QtQuick/QQuickView>
+#include <QtQuick/QQuickItem>
+
+#ifdef Q_OS_WIN
+# include <fcntl.h>
+# include <io.h>
+#endif // Q_OS_WIN
+
+// Timeout values:
+
+// A valid screen grab requires the scene to not change
+// for SCENE_STABLE_TIME ms
+#define SCENE_STABLE_TIME 200
+
+// Give up after SCENE_TIMEOUT ms
+#define SCENE_TIMEOUT 6000
+
+//#define GRABBERDEBUG
+
+static const QSize DefaultGrabSize(320, 480);
+
+class GrabbingView : public QQuickView
+{
+ Q_OBJECT
+
+public:
+ GrabbingView(const QString &outputFile)
+ : ofile(outputFile), grabNo(0), isGrabbing(false), initDone(false), justShow(outputFile.isEmpty())
+ {
+ if (justShow)
+ return;
+ grabTimer = new QTimer(this);
+ grabTimer->setSingleShot(true);
+ grabTimer->setInterval(SCENE_STABLE_TIME);
+ connect(grabTimer, SIGNAL(timeout()), SLOT(grab()));
+
+ connect(this, SIGNAL(afterRendering()), SLOT(startGrabbing()));
+
+ QTimer::singleShot(SCENE_TIMEOUT, this, SLOT(timedOut()));
+ }
+
+private slots:
+ void startGrabbing()
+ {
+ if (!initDone) {
+ initDone = true;
+ grabTimer->start();
+ }
+ }
+
+ void grab()
+ {
+ if (isGrabbing)
+ return;
+ isGrabbing = true;
+ grabNo++;
+#ifdef GRABBERDEBUG
+ printf("grab no. %i\n", grabNo);
+#endif
+ QImage img = grabWindow();
+ if (!img.isNull() && img == lastGrab) {
+ sceneStabilized();
+ } else {
+ lastGrab = img;
+ grabTimer->start();
+ }
+
+ isGrabbing = false;
+ }
+
+ void sceneStabilized()
+ {
+#ifdef GRABBERDEBUG
+ printf("...sceneStabilized IN\n");
+#endif
+ if (QGuiApplication::platformName() == QLatin1String("eglfs")) {
+ QSize grabSize = initialSize().isEmpty() ? DefaultGrabSize : initialSize();
+ lastGrab = lastGrab.copy(QRect(QPoint(0, 0), grabSize));
+ }
+
+ if (ofile == "-") { // Write to stdout
+ QFile of;
+#ifdef Q_OS_WIN
+ // Make sure write to stdout doesn't do LF->CRLF
+ _setmode(_fileno(stdout), _O_BINARY);
+#endif // Q_OS_WIN
+ if (!of.open(1, QIODevice::WriteOnly) || !lastGrab.save(&of, "ppm")) {
+ qWarning() << "Error: failed to write grabbed image to stdout.";
+ QGuiApplication::exit(2);
+ return;
+ }
+ } else {
+ if (!lastGrab.save(ofile)) {
+ qWarning() << "Error: failed to store grabbed image to" << ofile;
+ QGuiApplication::exit(2);
+ return;
+ }
+ }
+ QGuiApplication::exit(0);
+#ifdef GRABBERDEBUG
+ printf("...sceneStabilized OUT\n");
+#endif
+ }
+
+ void timedOut()
+ {
+ qWarning() << "Error: timed out waiting for scene to stabilize." << grabNo << "grab(s) done. Last grab was" << (lastGrab.isNull() ? "invalid." : "valid.");
+ QGuiApplication::exit(3);
+ }
+
+private:
+ QImage lastGrab;
+ QTimer *grabTimer = nullptr;
+ QString ofile;
+ int grabNo;
+ bool isGrabbing;
+ bool initDone;
+ bool justShow;
+};
+
+
+int main(int argc, char *argv[])
+{
+ qSetGlobalQHashSeed(0);
+
+ QGuiApplication a(argc, argv);
+
+ // Parse command line
+ QString ifile, ofile;
+ bool noText = false;
+ bool justShow = false;
+ QStringList args = a.arguments();
+ int i = 0;
+ bool argError = false;
+ while (++i < args.size()) {
+ QString arg = args.at(i);
+ if ((arg == "-o") && (i < args.size()-1)) {
+ ofile = args.at(++i);
+ }
+ else if (arg == "-notext") {
+ noText = true;
+ }
+ else if (arg == "--cache-distance-fields") {
+ ;
+ }
+ else if (arg == "-viewonly") {
+ justShow = true;
+ }
+ else if (ifile.isEmpty()) {
+ ifile = arg;
+ }
+ else {
+ argError = true;
+ break;
+ }
+ }
+ if (argError || ifile.isEmpty() || (ofile.isEmpty() && !justShow)) {
+ qWarning() << "Usage:" << args.at(0).toLatin1().constData() << "[-notext] <qml-infile> {-o <outfile or - for ppm on stdout>|-viewonly}";
+ return 1;
+ }
+
+ QFileInfo ifi(ifile);
+ if (!ifi.exists() || !ifi.isReadable() || !ifi.isFile()) {
+ qWarning() << args.at(0).toLatin1().constData() << " error: unreadable input file" << ifile;
+ return 1;
+ }
+ // End parsing
+
+ GrabbingView v(ofile);
+ v.setSource(QUrl::fromLocalFile(ifile));
+
+ if (noText) {
+ const QList<QQuickItem*> items = v.rootObject()->findChildren<QQuickItem*>();
+ for (QQuickItem *item : items) {
+ if (QByteArray(item->metaObject()->className()).contains("Text"))
+ item->setVisible(false);
+ }
+ }
+
+ if (v.initialSize().isEmpty())
+ v.resize(DefaultGrabSize);
+
+ v.show();
+
+ int retVal = a.exec();
+#ifdef GRABBERDEBUG
+ printf("...retVal=%i\n", retVal);
+#endif
+
+ return retVal;
+}
+
+#include "main.moc"