aboutsummaryrefslogtreecommitdiffstats
path: root/src/tools/qml2puppet/qml2puppet/editor3d/icongizmoimageprovider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/qml2puppet/qml2puppet/editor3d/icongizmoimageprovider.cpp')
-rw-r--r--src/tools/qml2puppet/qml2puppet/editor3d/icongizmoimageprovider.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/tools/qml2puppet/qml2puppet/editor3d/icongizmoimageprovider.cpp b/src/tools/qml2puppet/qml2puppet/editor3d/icongizmoimageprovider.cpp
new file mode 100644
index 0000000000..9f045ebe40
--- /dev/null
+++ b/src/tools/qml2puppet/qml2puppet/editor3d/icongizmoimageprovider.cpp
@@ -0,0 +1,53 @@
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0
+
+#include "icongizmoimageprovider.h"
+
+namespace QmlDesigner {
+namespace Internal {
+
+IconGizmoImageProvider::IconGizmoImageProvider()
+ : QQuickImageProvider(QQuickImageProvider::Image)
+{
+}
+
+QImage IconGizmoImageProvider::requestImage(const QString &id,
+ [[maybe_unused]] QSize *size,
+ [[maybe_unused]] const QSize &requestedSize)
+{
+ // id format: <file name>:<color name>
+ QStringList parts = id.split(':');
+ if (parts.size() == 2) {
+ QImage image(QStringLiteral("://qtquickplugin/mockfiles/images/%1").arg(parts[0]));
+
+ // Recolorize non-transparent image pixels
+ QColor targetColor(parts[1]);
+ int r = targetColor.red();
+ int g = targetColor.green();
+ int b = targetColor.blue();
+ int size = image.sizeInBytes();
+ uchar *byte = image.bits();
+ for (int i = 0; i < size; i += 4) {
+ // Skip if alpha is zero
+ if (*(byte + 3) != 0) {
+ // Average between target color and current color
+ *byte = uchar((int(*byte) + b) / 2);
+ ++byte;
+ *byte = uchar((int(*byte) + g) / 2);
+ ++byte;
+ *byte = uchar((int(*byte) + r) / 2);
+ ++byte;
+ // Preserve alpha
+ ++byte;
+ } else {
+ byte += 4;
+ }
+ }
+ return image;
+ } else {
+ return {};
+ }
+}
+
+}
+}