File indexing completed on 2024-05-12 05:31:41

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2023 Xaver Hugl <xaver.hugl@gmail.com>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 #include "gllut.h"
0010 
0011 #include <vector>
0012 
0013 namespace KWin
0014 {
0015 
0016 GlLookUpTable::GlLookUpTable(GLuint handle, size_t size)
0017     : m_handle(handle)
0018     , m_size(size)
0019 {
0020 }
0021 
0022 GlLookUpTable::~GlLookUpTable()
0023 {
0024     glDeleteTextures(1, &m_handle);
0025 }
0026 
0027 GLuint GlLookUpTable::handle() const
0028 {
0029     return m_handle;
0030 }
0031 
0032 size_t GlLookUpTable::size() const
0033 {
0034     return m_size;
0035 }
0036 
0037 void GlLookUpTable::bind()
0038 {
0039     glBindTexture(GL_TEXTURE_2D, m_handle);
0040 }
0041 
0042 std::unique_ptr<GlLookUpTable> GlLookUpTable::create(const std::function<QVector3D(size_t value)> &func, size_t size)
0043 {
0044     GLuint handle = 0;
0045     glGenTextures(1, &handle);
0046     if (!handle) {
0047         return nullptr;
0048     }
0049     // this uses 2D textures because OpenGL ES doesn't support 1D textures
0050     glBindTexture(GL_TEXTURE_2D, handle);
0051     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
0052     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, 0);
0053     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, 0);
0054     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
0055     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
0056     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
0057     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
0058     std::vector<float> data;
0059     data.reserve(4 * size);
0060     for (size_t i = 0; i < size; i++) {
0061         const auto color = func(i);
0062         data.push_back(color.x());
0063         data.push_back(color.y());
0064         data.push_back(color.z());
0065         data.push_back(1);
0066     }
0067     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, size, 1, 0, GL_RGBA, GL_FLOAT, data.data());
0068     glBindTexture(GL_TEXTURE_2D, 0);
0069     return std::make_unique<GlLookUpTable>(handle, size);
0070 }
0071 
0072 }