summaryrefslogtreecommitdiff
path: root/wasm-qt
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2022-01-09 02:15:12 +0100
committerJan-Marek Glogowski <glogow@fbihome.de>2022-01-19 20:18:29 +0100
commit49ebfdd9b7cf9c5363e3e06765b3fae284ab0379 (patch)
tree09b7c894e46b543983a6c25b458037554e5b77cb /wasm-qt
parentbd5492275d31f59b1d269205018d1487af52426f (diff)
WASM merge wasm-qt into static module
Change-Id: I1ed26685561fd79d26cc0844faa3dfe4c00d439a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128625 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Diffstat (limited to 'wasm-qt')
-rw-r--r--wasm-qt/CustomTarget_wasm-qt5-mandelbrot_moc.mk37
-rw-r--r--wasm-qt/Executable_wasm-qt5-mandelbrot.mk32
-rw-r--r--wasm-qt/Makefile13
-rw-r--r--wasm-qt/Module_wasm-qt.mk20
-rw-r--r--wasm-qt/README.md299
-rw-r--r--wasm-qt/source/qt5-mandelbrot/main.cxx66
-rw-r--r--wasm-qt/source/qt5-mandelbrot/mandelbrotwidget.cxx228
-rw-r--r--wasm-qt/source/qt5-mandelbrot/mandelbrotwidget.h91
-rw-r--r--wasm-qt/source/qt5-mandelbrot/renderthread.cxx232
-rw-r--r--wasm-qt/source/qt5-mandelbrot/renderthread.h97
10 files changed, 0 insertions, 1115 deletions
diff --git a/wasm-qt/CustomTarget_wasm-qt5-mandelbrot_moc.mk b/wasm-qt/CustomTarget_wasm-qt5-mandelbrot_moc.mk
deleted file mode 100644
index 6267db3f5b8d..000000000000
--- a/wasm-qt/CustomTarget_wasm-qt5-mandelbrot_moc.mk
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-$(eval $(call gb_CustomTarget_CustomTarget,wasm-qt/qt5-mandelbrot))
-
-$(call gb_CustomTarget_get_target,wasm-qt/qt5-mandelbrot) : \
- $(call gb_CustomTarget_get_workdir,wasm-qt/qt5-mandelbrot)/renderthread.moc \
- $(call gb_CustomTarget_get_workdir,wasm-qt/qt5-mandelbrot)/mandelbrotwidget.moc \
-
-qt5_mandelbrot_MOCDEFS_H := $(call gb_CustomTarget_get_workdir,wasm-qt/qt5-mandelbrot)/moc_predefs.h
-qt5_mandelbrot_MOCDEFS_CXX := $(call gb_CustomTarget_get_workdir,wasm-qt/qt5-mandelbrot)/moc_dummy.cxx
-qt5_mandelbrot_WORKDIR := $(call gb_CustomTarget_get_workdir,wasm-qt/qt5-mandelbrot)/.dir
-
-$(qt5_mandelbrot_MOCDEFS_CXX): | $(qt5_mandelbrot_WORKDIR)
- touch $@
-
-$(qt5_mandelbrot_MOCDEFS_H): $(qt5_mandelbrot_MOCDEFS_CXX) | $(qt5_mandelbrot_WORKDIR)
- $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),CXX,1)
- $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),CXX)
- $(CXX) -pipe -O2 -std=gnu++11 -fno-exceptions $(gb_EMSCRIPTEN_CPPFLAGS) -dM -E -o $@ $<
- $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),MOC)
-
-$(call gb_CustomTarget_get_workdir,wasm-qt/qt5-mandelbrot)/%.moc : \
- $(SRCDIR)/wasm-qt/source/qt5-mandelbrot/%.h \
- $(qt5_mandelbrot_MOCDEFS_H) | $(qt5_mandelbrot_WORKDIR)
- $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),MOC,1)
- $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),MOC)
- $(MOC5) --include $(qt5_mandelbrot_MOCDEFS_H) $(gb_EMSCRIPTEN_QTDEFS) $< -o $@
- $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),MOC)
-
-# vim: set noet sw=4:
diff --git a/wasm-qt/Executable_wasm-qt5-mandelbrot.mk b/wasm-qt/Executable_wasm-qt5-mandelbrot.mk
deleted file mode 100644
index 040fad441219..000000000000
--- a/wasm-qt/Executable_wasm-qt5-mandelbrot.mk
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-$(eval $(call gb_Executable_Executable,wasm-qt5-mandelbrot))
-
-$(eval $(call gb_Executable_use_custom_headers,wasm-qt5-mandelbrot,wasm-qt/qt5-mandelbrot))
-
-$(eval $(call gb_Executable_use_externals,wasm-qt5-mandelbrot,\
- graphite \
- freetype \
- harfbuzz \
- libpng \
- qt5 \
-))
-
-$(eval $(call gb_Executable_add_exception_objects,wasm-qt5-mandelbrot,\
- wasm-qt/source/qt5-mandelbrot/main \
- wasm-qt/source/qt5-mandelbrot/mandelbrotwidget \
- wasm-qt/source/qt5-mandelbrot/renderthread \
-))
-
-$(eval $(call gb_Executable_add_defs,wasm-qt5-mandelbrot,\
- -DVCL_INTERNALS \
-))
-
-# vim: set noet sw=4 ts=4:
diff --git a/wasm-qt/Makefile b/wasm-qt/Makefile
deleted file mode 100644
index 0c6f47b1790f..000000000000
--- a/wasm-qt/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST))))
-
-include $(module_directory)/../solenv/gbuild/partial_build.mk
-
-# vim: set noet sw=4 ts=4:
diff --git a/wasm-qt/Module_wasm-qt.mk b/wasm-qt/Module_wasm-qt.mk
deleted file mode 100644
index 8e86df4e8baa..000000000000
--- a/wasm-qt/Module_wasm-qt.mk
+++ /dev/null
@@ -1,20 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-$(eval $(call gb_Module_Module,wasm-qt))
-
-ifeq ($(OS),EMSCRIPTEN)
-
-$(eval $(call gb_Module_add_targets,wasm-qt,\
- CustomTarget_wasm-qt5-mandelbrot_moc \
- Executable_wasm-qt5-mandelbrot \
-))
-
-endif
-
-# vim: set noet sw=4 ts=4:
diff --git a/wasm-qt/README.md b/wasm-qt/README.md
deleted file mode 100644
index bfe930ef6775..000000000000
--- a/wasm-qt/README.md
+++ /dev/null
@@ -1,299 +0,0 @@
-# Support for Emscripten Cross Build
-
-This module provides support for emscripten cross build
-
-## Status
-
- $ make
-
-You can run the WASM mandelbrot Qt example, if you copy its HTML
-and the qtloader.js from the Qt's example folder after build with:
-
- $ emrun --serve_after_close workdir/LinkTarget/Executable/mandelbrot.html
-
-REMINDER: Always start new tabs in the browser, reload might fail / cache!
-
-
-## Setup for the LO WASM build (with Qt)
-
-We're using Qt 5.15 with the officially supported emscripten v1.39.8.
-But there are several potential problems with threads and exceptions, so this will likely
-change later to a newer emscripten.
-
-Qt WASM is not yet used with LO, just if you're wondering!
-
-- See below under Docker build for another build option
-
-### Setup emscripten
-
-<https://emscripten.org/docs/getting_started/index.html>
-
- git clone https://github.com/emscripten-core/emsdk.git
- ./emsdk install 1.39.8
- ./emsdk activate --embedded 1.39.8
-
-Example `bashrc` scriptlet:
-
- EMSDK_ENV=$HOME/Development/libreoffice/git_emsdk/emsdk_env.sh
- [ -f "$EMSDK_ENV" ] && \. "$EMSDK_ENV" 1>/dev/null 2>&1
-
-### Setup Qt
-
-<https://doc.qt.io/qt-5/wasm.html>
-
-I originally build the Qt 5.15 branch, but probably better to build a tag like v5.15.2.
-
-So:
-
- git clone https://github.com/qt/qt5.git
- cd qt5
- git checkout v5.15.2
- ./init-repository
- ./configure -xplatform wasm-emscripten -feature-thread -compile-examples -prefix $PWD/qtbase
- make -j<CORES> module-qtbase module-qtdeclarative
-
-Building with examples will break with some of them, but at that point Qt already works.
-
-At some point Qt configure failed for me with:
-
-"Checking for target architecture... Project ERROR: target architecture detection binary not found."
-
-What seems to have fixed this was to run "emsdk activate 1.39.8" again.
-
-Current Qt fails to start the demo webserver: <https://bugreports.qt.io/browse/QTCREATORBUG-24072>
-
-Use `emrun --serve_after_close` to run Qt WASM demos
-
-Enabling multi-thread support in Firefox is a bit of work with older versions:
-
-- <https://bugzilla.mozilla.org/show_bug.cgi?id=1477743#c7>
-- <https://wiki.qt.io/Qt_for_WebAssembly#Multithreading_Support>
-- <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer>
-
-
-### Setup LO
-
-`autogen.sh` is patched to use emconfigure. That basically sets various environment vars,
-especially `EMMAKEN_JUST_CONFIGURE`, which will create the correct output file names, checked by
-`configure` (`a.out`).
-
-There's a distro config for WASM (work in progress), that gets your
-defaults right (and currently disables a ton of 3rd party stuff which
-is not essential).
-
-Recommended configure setup is thusly:
-
-* grab defaults
- `--with-distro=LibreOfficeWASM32`
-
-* local config
- `QT5DIR=/dir/of/git_qt5/qtbase`
-
-* if you want to use ccache on both sides of the build
- `--with-build-platform-configure-options=--enable-ccache`
- `--enable-ccache`
-
-### Using Docker to cross-build with emscripten
-
-If you prefer a controlled environment (sadly emsdk install/activate
-is _not_ stable over time, as e.g. nodejs versions evolve), that is
-easy to replicate across different machines - consider the docker
-images we're providing.
-
-Config/setup file see
-<https://git.libreoffice.org/lode/+/ccb36979563635b51215477455953252c99ec013>
-
-Run
-
- docker-compose build
-
-in the lode/docker dir to get the container prepared. Run
-
- PARALLELISM=4 BUILD_OPTIONS= BUILD_TARGET=build docker-compose run --rm -e PARALLELISM -e BUILD_TARGET -e BUILD_OPTIONS builder
-
-to perform an actual `srcdir != builddir` build; the container mounts
-checked-out git repo and output dir via `docker-compose.yml` (so make
-sure the path names there match your setup):
-
-The lode setup expects, inside the lode/docker subdir, the following directories:
-
-- core (`git checkout`)
-- workdir (the output dir - gets written into)
-- cache (`ccache tree`)
-- tarballs (external project tarballs gets written and cached there)
-
-
-## Ideas for an UNO bridge implementation
-
-My post to Discord #emscripten:
-
-"I'm looking for a way to do an abstract call
-from one WASM C++ object to another WASM C++ object, so like FFI / WebIDL,
-just within WASM. All my code is C++ and normally I have bridge code, with
-assembler to implement the function call /RTTI and exception semantics of the
-specified platform. Code is at
-<https://cgit.freedesktop.org/libreoffice/core/tree/bridges/source/cpp_uno>.
-I've read a bit about `call_indirect` and stuff, but I don't have yet a good
-idea, how I could implement this (and there is an initial feature/wasm branch
-for the interested). I probably need some fixed lookup table, like on iOS,
-because AFAIK you can't dynamically generate code in WASM. So any pointers or
-ideas for an implementation? I can disassemble some minimalistic WASM example
-and read clang code for `WASM_EmscriptenInvoke`, but if there were some
-standalone code or documentation I'm missing, that would be nice to know."
-
-We basically would go the same way then the other backends. Write the bridge in
-C++, which is probably largely boilerplate code, but the function call in WAT
-(<https://github.com/WebAssembly/wabt>) based on the LLVM WASM calling
-conventions in `WASM_EmscriptenInvoke`. I didn't get a reply to that question for
-hours. Maybe I'll open an Emscripten issue, if we really have to implement
-this.
-
-WASM dynamic dispatch:
-
-- <https://fitzgeraldnick.com/2018/04/26/how-does-dynamic-dispatch-work-in-wasm.html>
-
-
-## Workaround for eventual clang WASM compiler bug
-
-````
-sc/source/core/data/attarray.cxx:378:44: error: call to member function 'erase' is ambiguous
- aNewCondFormatData.erase(nIndex);
- ~~~~~~~~~~~~~~~~~~~^~~~~
-include/o3tl/sorted_vector.hxx:86:15: note: candidate function
- size_type erase( const Value& x )
- ^
-include/o3tl/sorted_vector.hxx:97:10: note: candidate function
- void erase( size_t index )
-````
-
-This is currently patched by using `x.erase` (`x.begin() + nIndex`).
-
-There shouldn't be an ambiguity, because of "[WebAssembly] Change size_t to `unsigned long`."
-<https://reviews.llvm.org/rGdf07a35912d78781ed6a62a7c032bfef5085a4f5#change-IrS9f6jH6PFq>,
-from "Jul 23 2018" which pre-dates the emscripten tag 1.39.8 from 02/14/2020 by ~1.5y.
-
-
-## Tools for problem diagnosis
-
-* `nm -s` should list the symbols in the archive, based on the index generated by ranlib.
- If you get linking errors that archive has no index.
-
-
-## Emscripten filesystem access with threads
-
-This is closed, but not really fixed IMHO:
-
-- <https://github.com/emscripten-core/emscripten/issues/3922>
-
-
-## Dynamic libraries `/` modules in emscripten
-
-There is a good summary in:
-
-- <https://bugreports.qt.io/browse/QTBUG-63925>
-
-Summary: you can't use modules and threads.
-
-This is mentioned at the end of:
-
-- <https://github.com/emscripten-core/emscripten/wiki/Linking>
-
-The usage of `MAIN_MODULE` and `SIDE_MODULE` has other problems, a major one IMHO is symbol resolution at runtime only.
-So this works really more like plugins in the sense of symbol resolution without dependencies `/` rpath.
-
-There is some clang-level dynamic-linking in progress (WASM dlload). The following link is already a bit old,
-but I found it a god summary of problems to expect:
-
-- <https://iandouglasscott.com/2019/07/18/experimenting-with-webassembly-dynamic-linking-with-clang/>
-
-
-## Mixed information, links, problems, TODO
-
-More info on Qt WASM emscripten pthreads:
-
-- <https://wiki.qt.io/Qt_for_WebAssembly#Multithreading_Support>
-
-WASM needs `-pthread` at compile, not just link time for atomics support. Alternatively you can provide
-`-s USE_PTHREADS=1`, but both don't seem to work reliable, so best provide both.
-<https://github.com/emscripten-core/emscripten/issues/10370>
-
-The output file must have the prefix .o, otherwise the WASM files will get a
-`node.js` shebang (!) and ranlib won't be able to index the library (link errors).
-
-Qt with threads has further memory limit. From Qt configure:
-````
-Project MESSAGE: Setting PTHREAD_POOL_SIZE to 4
-Project MESSAGE: Setting TOTAL_MEMORY to 1GB
-````
-
-You can actually allocate 4GB:
-
-- <https://bugzilla.mozilla.org/show_bug.cgi?id=1392234>
-
-LO uses a nested event loop to run dialogs in general, but that won't work, because you can't drive
-the browser event loop. like VCL does with the system event loop in the various VCL backends.
-Changing this will need some major work (basically dropping Application::Execute).
-
-But with the know problems with exceptions and threads, this might change:
-
-- <https://github.com/emscripten-core/emscripten/pull/11518>
-- <https://github.com/emscripten-core/emscripten/issues/11503>
-- <https://github.com/emscripten-core/emscripten/issues/11233>
-- <https://github.com/emscripten-core/emscripten/issues/12035>
-
-We're also using emconfigure at the moment. Originally I patched emscripten, because it
-wouldn't create the correct a.out file for C++ configure tests. Later I found that
-the `emconfigure` sets `EMMAKEN_JUST_CONFIGURE` to work around the problem.
-
-ICU bug:
-
-- <https://github.com/emscripten-core/emscripten/issues/10129>
-
-Alternative, probably:
-
-- <https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Intl>
-
-There is a wasm64, but that still uses 32bit pointers!
-
-Old outdated docs:
-
-- <https://wiki.documentfoundation.org/Development/Emscripten>
-
-Reverted patch:
-
-- <https://cgit.freedesktop.org/libreoffice/core/commit/?id=0e21f6619c72f1e17a7b0a52b6317810973d8a3e>
-
-Generally <https://emscripten.org/docs/porting>:
-
-- <https://emscripten.org/docs/porting/guidelines/api_limitations.html#api-limitations>
-- <https://emscripten.org/docs/porting/files/file_systems_overview.html#file-system-overview>
-- <https://emscripten.org/docs/porting/pthreads.html>
-- <https://emscripten.org/docs/porting/emscripten-runtime-environment.html>
-
-This will be interesting:
-
-- <https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-an-event-loop>
-
-This didn't help much yet:
-
-- <https://github.com/emscripten-ports>
-
-Emscripten supports standalone WASI binaries:
-
-- <https://github.com/emscripten-core/emscripten/wiki/WebAssembly-Standalone>
-- <https://www.qt.io/qt-examples-for-webassembly>
-- <http://qtandeverything.blogspot.com/2017/06/qt-for-web-assembly.html>
-- <http://qtandeverything.blogspot.com/2020/>
-- <https://emscripten.org/docs/api_reference/Filesystem-API.html>
-- <https://discuss.python.org/t/add-a-webassembly-wasm-runtime/3957/12>
-- <http://git.savannah.gnu.org/cgit/config.git>
-- <https://webassembly.org/specs/>
-- <https://developer.chrome.com/docs/native-client/>
-- <https://emscripten.org/docs/getting_started/downloads.html>
-- <https://github.com/openpgpjs/openpgpjs/blob/master/README.md#getting-started>
-- <https://developer.mozilla.org/en-US/docs/WebAssembly/Using_the_JavaScript_API>
-- <https://github.com/bytecodealliance/wasmtime/blob/main/docs/WASI-intro.md>
-- <https://www.ip6.li/de/security/x.509_kochbuch/openssl-fuer-webassembly-compilieren>
-- <https://emscripten.org/docs/introducing_emscripten/about_emscripten.html#about-emscripten-porting-code>
-- <https://emscripten.org/docs/compiling/Building-Projects.html>
-
diff --git a/wasm-qt/source/qt5-mandelbrot/main.cxx b/wasm-qt/source/qt5-mandelbrot/main.cxx
deleted file mode 100644
index 037c63153cf2..000000000000
--- a/wasm-qt/source/qt5-mandelbrot/main.cxx
+++ /dev/null
@@ -1,66 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** 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.
-**
-** BSD License Usage
-** Alternatively, 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 The Qt Company Ltd 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 "mandelbrotwidget.h"
-
-#include <QtWidgets/QApplication>
-#include <QtCore/QtPlugin>
-
-Q_IMPORT_PLUGIN(QWasmIntegrationPlugin)
-
-int main(int argc, char* argv[])
-{
- QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
- QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
- QApplication app(argc, argv);
- MandelbrotWidget widget;
- widget.show();
- return app.exec();
-}
diff --git a/wasm-qt/source/qt5-mandelbrot/mandelbrotwidget.cxx b/wasm-qt/source/qt5-mandelbrot/mandelbrotwidget.cxx
deleted file mode 100644
index 5886dd2664c0..000000000000
--- a/wasm-qt/source/qt5-mandelbrot/mandelbrotwidget.cxx
+++ /dev/null
@@ -1,228 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** 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.
-**
-** BSD License Usage
-** Alternatively, 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 The Qt Company Ltd 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 "mandelbrotwidget.h"
-#include "mandelbrotwidget.moc"
-
-#include <QtGui/QPainter>
-#include <QtGui/QKeyEvent>
-
-#include <math.h>
-
-const double DefaultCenterX = -0.637011;
-const double DefaultCenterY = -0.0395159;
-const double DefaultScale = 0.00403897;
-
-const double ZoomInFactor = 0.8;
-const double ZoomOutFactor = 1 / ZoomInFactor;
-const int ScrollStep = 20;
-
-MandelbrotWidget::MandelbrotWidget(QWidget* parent)
- : QWidget(parent)
- , centerX(DefaultCenterX)
- , centerY(DefaultCenterY)
- , pixmapScale(DefaultScale)
- , curScale(DefaultScale)
-{
- connect(&thread, &RenderThread::renderedImage, this, &MandelbrotWidget::updatePixmap);
-
- setWindowTitle(tr("Mandelbrot"));
-#if QT_CONFIG(cursor)
- setCursor(Qt::CrossCursor);
-#endif
- resize(550, 400);
-}
-
-void MandelbrotWidget::paintEvent(QPaintEvent* /* event */)
-{
- QPainter painter(this);
- painter.fillRect(rect(), Qt::black);
-
- if (pixmap.isNull())
- {
- painter.setPen(Qt::white);
- painter.drawText(rect(), Qt::AlignCenter, tr("Rendering initial image, please wait..."));
- return;
- }
-
- if (qFuzzyCompare(curScale, pixmapScale))
- {
- painter.drawPixmap(pixmapOffset, pixmap);
- }
- else
- {
- auto previewPixmap = qFuzzyCompare(pixmap.devicePixelRatioF(), qreal(1))
- ? pixmap
- : pixmap.scaled(pixmap.size() / pixmap.devicePixelRatioF(),
- Qt::KeepAspectRatio, Qt::SmoothTransformation);
- double scaleFactor = pixmapScale / curScale;
- int newWidth = int(previewPixmap.width() * scaleFactor);
- int newHeight = int(previewPixmap.height() * scaleFactor);
- int newX = pixmapOffset.x() + (previewPixmap.width() - newWidth) / 2;
- int newY = pixmapOffset.y() + (previewPixmap.height() - newHeight) / 2;
-
- painter.save();
- painter.translate(newX, newY);
- painter.scale(scaleFactor, scaleFactor);
-
- QRectF exposed = painter.transform().inverted().mapRect(rect()).adjusted(-1, -1, 1, 1);
- painter.drawPixmap(exposed, previewPixmap, exposed);
- painter.restore();
- }
-
- QString text = tr("Use mouse wheel or the '+' and '-' keys to zoom. "
- "Press and hold left mouse button to scroll.");
- QFontMetrics metrics = painter.fontMetrics();
- int textWidth = metrics.horizontalAdvance(text);
-
- painter.setPen(Qt::NoPen);
- painter.setBrush(QColor(0, 0, 0, 127));
- painter.drawRect((width() - textWidth) / 2 - 5, 0, textWidth + 10, metrics.lineSpacing() + 5);
- painter.setPen(Qt::white);
- painter.drawText((width() - textWidth) / 2, metrics.leading() + metrics.ascent(), text);
-}
-
-void MandelbrotWidget::resizeEvent(QResizeEvent* /* event */)
-{
- thread.render(centerX, centerY, curScale, size(), devicePixelRatioF());
-}
-
-void MandelbrotWidget::keyPressEvent(QKeyEvent* event)
-{
- switch (event->key())
- {
- case Qt::Key_Plus:
- zoom(ZoomInFactor);
- break;
- case Qt::Key_Minus:
- zoom(ZoomOutFactor);
- break;
- case Qt::Key_Left:
- scroll(-ScrollStep, 0);
- break;
- case Qt::Key_Right:
- scroll(+ScrollStep, 0);
- break;
- case Qt::Key_Down:
- scroll(0, -ScrollStep);
- break;
- case Qt::Key_Up:
- scroll(0, +ScrollStep);
- break;
- default:
- QWidget::keyPressEvent(event);
- }
-}
-
-#if QT_CONFIG(wheelevent)
-void MandelbrotWidget::wheelEvent(QWheelEvent* event)
-{
- const int numDegrees = event->angleDelta().y() / 8;
- const double numSteps = numDegrees / double(15);
- zoom(pow(ZoomInFactor, numSteps));
-}
-#endif
-
-void MandelbrotWidget::mousePressEvent(QMouseEvent* event)
-{
- if (event->button() == Qt::LeftButton)
- lastDragPos = event->pos();
-}
-
-void MandelbrotWidget::mouseMoveEvent(QMouseEvent* event)
-{
- if (event->buttons() & Qt::LeftButton)
- {
- pixmapOffset += event->pos() - lastDragPos;
- lastDragPos = event->pos();
- update();
- }
-}
-
-void MandelbrotWidget::mouseReleaseEvent(QMouseEvent* event)
-{
- if (event->button() == Qt::LeftButton)
- {
- pixmapOffset += event->pos() - lastDragPos;
- lastDragPos = QPoint();
-
- const auto pixmapSize = pixmap.size() / pixmap.devicePixelRatioF();
- int deltaX = (width() - pixmapSize.width()) / 2 - pixmapOffset.x();
- int deltaY = (height() - pixmapSize.height()) / 2 - pixmapOffset.y();
- scroll(deltaX, deltaY);
- }
-}
-
-void MandelbrotWidget::updatePixmap(const QImage& image, double scaleFactor)
-{
- if (!lastDragPos.isNull())
- return;
-
- pixmap = QPixmap::fromImage(image);
- pixmapOffset = QPoint();
- lastDragPos = QPoint();
- pixmapScale = scaleFactor;
- update();
-}
-
-void MandelbrotWidget::zoom(double zoomFactor)
-{
- curScale *= zoomFactor;
- update();
- thread.render(centerX, centerY, curScale, size(), devicePixelRatioF());
-}
-
-void MandelbrotWidget::scroll(int deltaX, int deltaY)
-{
- centerX += deltaX * curScale;
- centerY += deltaY * curScale;
- update();
- thread.render(centerX, centerY, curScale, size(), devicePixelRatioF());
-}
diff --git a/wasm-qt/source/qt5-mandelbrot/mandelbrotwidget.h b/wasm-qt/source/qt5-mandelbrot/mandelbrotwidget.h
deleted file mode 100644
index 72e95568b522..000000000000
--- a/wasm-qt/source/qt5-mandelbrot/mandelbrotwidget.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** 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.
-**
-** BSD License Usage
-** Alternatively, 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 The Qt Company Ltd 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$
-**
-****************************************************************************/
-
-#pragma once
-
-#include <QtGui/QPixmap>
-#include <QtWidgets/QWidget>
-
-#include "renderthread.h"
-
-class MandelbrotWidget : public QWidget
-{
- Q_OBJECT
-
-public:
- MandelbrotWidget(QWidget* parent = nullptr);
-
-protected:
- void paintEvent(QPaintEvent* event) override;
- void resizeEvent(QResizeEvent* event) override;
- void keyPressEvent(QKeyEvent* event) override;
-#if QT_CONFIG(wheelevent)
- void wheelEvent(QWheelEvent* event) override;
-#endif
- void mousePressEvent(QMouseEvent* event) override;
- void mouseMoveEvent(QMouseEvent* event) override;
- void mouseReleaseEvent(QMouseEvent* event) override;
-
-private slots:
- void updatePixmap(const QImage& image, double scaleFactor);
- void zoom(double zoomFactor);
-
-private:
- void scroll(int deltaX, int deltaY);
-
- RenderThread thread;
- QPixmap pixmap;
- QPoint pixmapOffset;
- QPoint lastDragPos;
- double centerX;
- double centerY;
- double pixmapScale;
- double curScale;
-};
diff --git a/wasm-qt/source/qt5-mandelbrot/renderthread.cxx b/wasm-qt/source/qt5-mandelbrot/renderthread.cxx
deleted file mode 100644
index 398e43ded15d..000000000000
--- a/wasm-qt/source/qt5-mandelbrot/renderthread.cxx
+++ /dev/null
@@ -1,232 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** 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.
-**
-** BSD License Usage
-** Alternatively, 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 The Qt Company Ltd 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 "renderthread.moc"
-
-#include <QtGui/QImage>
-#include <cmath>
-
-RenderThread::RenderThread(QObject* parent)
- : QThread(parent)
-{
- for (int i = 0; i < ColormapSize; ++i)
- m_colormap[i] = rgbFromWaveLength(380.0 + (i * 400.0 / ColormapSize));
-}
-
-RenderThread::~RenderThread()
-{
- m_mutex.lock();
- m_abort = true;
- m_condition.wakeOne();
- m_mutex.unlock();
-
- wait();
-}
-
-void RenderThread::render(double centerX, double centerY, double scaleFactor, QSize resultSize,
- double devicePixelRatio)
-{
- QMutexLocker locker(&m_mutex);
-
- m_centerX = centerX;
- m_centerY = centerY;
- m_scaleFactor = scaleFactor;
- m_devicePixelRatio = devicePixelRatio;
- m_resultSize = resultSize;
-
- if (!isRunning())
- {
- start(LowPriority);
- }
- else
- {
- m_restart = true;
- m_condition.wakeOne();
- }
-}
-
-void RenderThread::run()
-{
- forever
- {
- m_mutex.lock();
- const double devicePixelRatio = m_devicePixelRatio;
- const QSize resultSize = m_resultSize * devicePixelRatio;
- const double requestedScaleFactor = m_scaleFactor;
- const double scaleFactor = requestedScaleFactor / devicePixelRatio;
- const double centerX = m_centerX;
- const double centerY = m_centerY;
- m_mutex.unlock();
-
- int halfWidth = resultSize.width() / 2;
- int halfHeight = resultSize.height() / 2;
- QImage image(resultSize, QImage::Format_RGB32);
- image.setDevicePixelRatio(devicePixelRatio);
-
- 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 (m_restart)
- break;
- if (m_abort)
- return;
-
- auto scanLine = reinterpret_cast<uint*>(image.scanLine(y + halfHeight));
- const double ay = centerY + (y * scaleFactor);
-
- for (int x = -halfWidth; x < halfWidth; ++x)
- {
- const double ax = centerX + (x * scaleFactor);
- double a1 = ax;
- double b1 = ay;
- int numIterations = 0;
-
- do
- {
- ++numIterations;
- const double a2 = (a1 * a1) - (b1 * b1) + ax;
- const 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++ = m_colormap[numIterations % ColormapSize];
- allBlack = false;
- }
- else
- {
- *scanLine++ = qRgb(0, 0, 0);
- }
- }
- }
-
- if (allBlack && pass == 0)
- {
- pass = 4;
- }
- else
- {
- if (!m_restart)
- emit renderedImage(image, requestedScaleFactor);
- ++pass;
- }
- }
-
- m_mutex.lock();
- if (!m_restart)
- m_condition.wait(&m_mutex);
- m_restart = false;
- m_mutex.unlock();
- }
-}
-
-uint RenderThread::rgbFromWaveLength(double wave)
-{
- double r = 0;
- double g = 0;
- double b = 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 = std::pow(r * s, 0.8);
- g = std::pow(g * s, 0.8);
- b = std::pow(b * s, 0.8);
- return qRgb(int(r * 255), int(g * 255), int(b * 255));
-}
diff --git a/wasm-qt/source/qt5-mandelbrot/renderthread.h b/wasm-qt/source/qt5-mandelbrot/renderthread.h
deleted file mode 100644
index 16c0d86fd46c..000000000000
--- a/wasm-qt/source/qt5-mandelbrot/renderthread.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** 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.
-**
-** BSD License Usage
-** Alternatively, 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 The Qt Company Ltd 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$
-**
-****************************************************************************/
-
-#pragma once
-
-#include <QtCore/QMutex>
-#include <QtCore/QSize>
-#include <QtCore/QThread>
-#include <QtCore/QWaitCondition>
-
-QT_BEGIN_NAMESPACE
-class QImage;
-QT_END_NAMESPACE
-
-class RenderThread : public QThread
-{
- Q_OBJECT
-
-public:
- RenderThread(QObject* parent = nullptr);
- ~RenderThread();
-
- void render(double centerX, double centerY, double scaleFactor, QSize resultSize,
- double devicePixelRatio);
-
-signals:
- void renderedImage(const QImage& image, double scaleFactor);
-
-protected:
- void run() override;
-
-private:
- static uint rgbFromWaveLength(double wave);
-
- QMutex m_mutex;
- QWaitCondition m_condition;
- double m_centerX;
- double m_centerY;
- double m_scaleFactor;
- double m_devicePixelRatio;
- QSize m_resultSize;
- bool m_restart = false;
- bool m_abort = false;
-
- enum
- {
- ColormapSize = 512
- };
- uint m_colormap[ColormapSize];
-};