// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only // Qt-Security score:critical reason:data-parser #include "shaderfeatures.h" #include #include ShaderFeatures::ShaderFeatures() { } // Browse the shaders and check which features are used in them. void ShaderFeatures::update(const QString &vs, const QString &fs, const QString &qml) { QStringList vsList = vs.split("\n"); QStringList fsList = fs.split("\n"); QStringList code = vsList + fsList; Features newFeatures = {}; m_gridMeshWidth = 1; m_gridMeshHeight = 1; for (const auto &line : code) checkLine(line, newFeatures); // iTime may also be used in QML side, without being used in shaders. // In this case enable the time helpers creation. if (qml.contains("iTime")) newFeatures.setFlag(Time, true); if (newFeatures != m_enabledFeatures) m_enabledFeatures = newFeatures; } void ShaderFeatures::checkLine(const QString &line, Features &features) { if (line.contains("iTime")) features.setFlag(Time, true); if (line.contains("iFrame")) features.setFlag(Frame, true); if (line.contains("iResolution")) features.setFlag(Resolution, true); if (line.contains("iSource")) features.setFlag(Source, true); if (line.contains("iMouse")) features.setFlag(Mouse, true); if (line.contains("fragCoord")) features.setFlag(FragCoord, true); if (line.contains("@mesh")) { // Get the mesh size, remove "@mesh" QString l = line.trimmed().sliced(5); QStringList list = l.split(QLatin1Char(',')); if (list.size() >= 2) { int w = list.at(0).trimmed().toInt(); int h = list.at(1).trimmed().toInt(); // Set size to max values m_gridMeshWidth = std::max(m_gridMeshWidth, w); m_gridMeshHeight = std::max(m_gridMeshHeight, h); } // If is bigger than default (1, 1), set the feature if (m_gridMeshWidth > 1 || m_gridMeshHeight > 1) features.setFlag(GridMesh, true); } if (line.contains("@blursources")) features.setFlag(BlurSources, true); }