summaryrefslogtreecommitdiffstats
path: root/examples/threads/mandelbrot/renderthread.cpp
diff options
context:
space:
mode:
authorTopi Reinio <topi.reinio@digia.com>2014-10-15 13:50:27 +0200
committerTopi Reiniƶ <topi.reinio@digia.com>2014-10-17 14:57:13 +0200
commitcf8f369f8575dcb9ca4d5116f3afc7cff4a080af (patch)
treea685f393b50786a892fcd3ad638b4c01e9002894 /examples/threads/mandelbrot/renderthread.cpp
parent45485d9eb47d3129b8a74c2e9d854c07673161cd (diff)
Move Qt Core examples under a common subdirectory
Qt Core examples were scattered into several subdirectories under qtbase/examples. This caused an issue with the example manifest file generated by QDoc; it expects to find all examples under a common directory in order to produde correct paths to the example .pro files. Qt Creator will not find the examples without a valid manifest file. This change moves the examples and edits the documentation files accordingly. Task-number: QTBUG-41963 Change-Id: I51d86782e0ba21c5c9bae5f15401ec774abe5cf8 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com> Reviewed-by: Leena Miettinen <riitta-leena.miettinen@digia.com>
Diffstat (limited to 'examples/threads/mandelbrot/renderthread.cpp')
-rw-r--r--examples/threads/mandelbrot/renderthread.cpp215
1 files changed, 0 insertions, 215 deletions
diff --git a/examples/threads/mandelbrot/renderthread.cpp b/examples/threads/mandelbrot/renderthread.cpp
deleted file mode 100644
index 5779c65c9c..0000000000
--- a/examples/threads/mandelbrot/renderthread.cpp
+++ /dev/null
@@ -1,215 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
-** of its contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "renderthread.h"
-
-#include <QtWidgets>
-
-#include <math.h>
-
-//! [0]
-RenderThread::RenderThread(QObject *parent)
- : QThread(parent)
-{
- restart = false;
- abort = false;
-
- for (int i = 0; i < ColormapSize; ++i)
- colormap[i] = rgbFromWaveLength(380.0 + (i * 400.0 / ColormapSize));
-}
-//! [0]
-
-//! [1]
-RenderThread::~RenderThread()
-{
- mutex.lock();
- abort = true;
- condition.wakeOne();
- mutex.unlock();
-
- wait();
-}
-//! [1]
-
-//! [2]
-void RenderThread::render(double centerX, double centerY, double scaleFactor,
- QSize resultSize)
-{
- QMutexLocker locker(&mutex);
-
- this->centerX = centerX;
- this->centerY = centerY;
- this->scaleFactor = scaleFactor;
- this->resultSize = resultSize;
-
- if (!isRunning()) {
- start(LowPriority);
- } else {
- restart = true;
- condition.wakeOne();
- }
-}
-//! [2]
-
-//! [3]
-void RenderThread::run()
-{
- forever {
- mutex.lock();
- QSize resultSize = this->resultSize;
- double scaleFactor = this->scaleFactor;
- double centerX = this->centerX;
- double centerY = this->centerY;
- mutex.unlock();
-//! [3]
-
-//! [4]
- int halfWidth = resultSize.width() / 2;
-//! [4] //! [5]
- int halfHeight = resultSize.height() / 2;
- QImage image(resultSize, QImage::Format_RGB32);
-
- const int NumPasses = 8;
- int pass = 0;
- while (pass < NumPasses) {
- const int MaxIterations = (1 << (2 * pass + 6)) + 32;
- const int Limit = 4;
- bool allBlack = true;
-
- for (int y = -halfHeight; y < halfHeight; ++y) {
- if (restart)
- break;
- if (abort)
- return;
-
- uint *scanLine =
- reinterpret_cast<uint *>(image.scanLine(y + halfHeight));
- double ay = centerY + (y * scaleFactor);
-
- for (int x = -halfWidth; x < halfWidth; ++x) {
- double ax = centerX + (x * scaleFactor);
- double a1 = ax;
- double b1 = ay;
- int numIterations = 0;
-
- do {
- ++numIterations;
- double a2 = (a1 * a1) - (b1 * b1) + ax;
- double b2 = (2 * a1 * b1) + ay;
- if ((a2 * a2) + (b2 * b2) > Limit)
- break;
-
- ++numIterations;
- a1 = (a2 * a2) - (b2 * b2) + ax;
- b1 = (2 * a2 * b2) + ay;
- if ((a1 * a1) + (b1 * b1) > Limit)
- break;
- } while (numIterations < MaxIterations);
-
- if (numIterations < MaxIterations) {
- *scanLine++ = colormap[numIterations % ColormapSize];
- allBlack = false;
- } else {
- *scanLine++ = qRgb(0, 0, 0);
- }
- }
- }
-
- if (allBlack && pass == 0) {
- pass = 4;
- } else {
- if (!restart)
- emit renderedImage(image, scaleFactor);
-//! [5] //! [6]
- ++pass;
- }
-//! [6] //! [7]
- }
-//! [7]
-
-//! [8]
- mutex.lock();
-//! [8] //! [9]
- if (!restart)
- condition.wait(&mutex);
- restart = false;
- mutex.unlock();
- }
-}
-//! [9]
-
-//! [10]
-uint RenderThread::rgbFromWaveLength(double wave)
-{
- double r = 0.0;
- double g = 0.0;
- double b = 0.0;
-
- if (wave >= 380.0 && wave <= 440.0) {
- r = -1.0 * (wave - 440.0) / (440.0 - 380.0);
- b = 1.0;
- } else if (wave >= 440.0 && wave <= 490.0) {
- g = (wave - 440.0) / (490.0 - 440.0);
- b = 1.0;
- } else if (wave >= 490.0 && wave <= 510.0) {
- g = 1.0;
- b = -1.0 * (wave - 510.0) / (510.0 - 490.0);
- } else if (wave >= 510.0 && wave <= 580.0) {
- r = (wave - 510.0) / (580.0 - 510.0);
- g = 1.0;
- } else if (wave >= 580.0 && wave <= 645.0) {
- r = 1.0;
- g = -1.0 * (wave - 645.0) / (645.0 - 580.0);
- } else if (wave >= 645.0 && wave <= 780.0) {
- r = 1.0;
- }
-
- double s = 1.0;
- if (wave > 700.0)
- s = 0.3 + 0.7 * (780.0 - wave) / (780.0 - 700.0);
- else if (wave < 420.0)
- s = 0.3 + 0.7 * (wave - 380.0) / (420.0 - 380.0);
-
- r = pow(r * s, 0.8);
- g = pow(g * s, 0.8);
- b = pow(b * s, 0.8);
- return qRgb(int(r * 255), int(g * 255), int(b * 255));
-}
-//! [10]