File indexing completed on 2024-06-09 04:26:47

0001 /*
0002  *  SPDX-FileCopyrightText: 2012 Boudewijn Rempt <boud@valdyas.org>
0003  *  SPDX-FileCopyrightText: 2021 L. E. Segovia <amy@amyspark.me>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 #ifndef OCIO_DISPLAY_FILTER_H
0008 #define OCIO_DISPLAY_FILTER_H
0009 
0010 #include <QOpenGLShaderProgram>
0011 
0012 #include <OpenColorIO.h>
0013 #include <OpenColorTransforms.h>
0014 #include <OpenColorTypes.h>
0015 
0016 #include <kis_display_filter.h>
0017 #include <kis_exposure_gamma_correction_interface.h>
0018 
0019 namespace OCIO = OCIO_NAMESPACE;
0020 
0021 enum OCIO_CHANNEL_SWIZZLE {
0022     LUMINANCE,
0023     RGBA,
0024     R,
0025     G,
0026     B,
0027     A
0028 };
0029 
0030 class OcioDisplayFilter : public KisDisplayFilter
0031 {
0032     Q_OBJECT
0033 public:
0034     explicit OcioDisplayFilter(KisExposureGammaCorrectionInterface *interface, QObject *parent = 0);
0035     ~OcioDisplayFilter();
0036 
0037     void filter(quint8 *pixels, quint32 numPixels) override;
0038     void approximateInverseTransformation(quint8 *pixels, quint32 numPixels) override;
0039     void approximateForwardTransformation(quint8 *pixels, quint32 numPixels) override;
0040     bool useInternalColorManagement() const override;
0041     bool lockCurrentColorVisualRepresentation() const override;
0042     void setLockCurrentColorVisualRepresentation(bool value);
0043 
0044     bool updateShader() override;
0045     template <class F>
0046     bool updateShaderImpl(F *f);
0047 
0048     void setupTextures(GLFunctions *f, QOpenGLShaderProgram *program) const override;
0049 
0050     KisExposureGammaCorrectionInterface *correctionInterface() const override;
0051 
0052     virtual QString program() const override;
0053 
0054     void updateProcessor();
0055 
0056     OCIO::ConstConfigRcPtr config;
0057 
0058     const char *inputColorSpaceName {nullptr};
0059     const char *displayDevice {nullptr};
0060     const char *view {nullptr};
0061     const char *look {nullptr};
0062     OCIO_CHANNEL_SWIZZLE swizzle {RGBA};
0063     float exposure {0.0};
0064     float gamma {0.0};
0065     float blackPoint {0.0};
0066     float whitePoint {0.0};
0067     bool forceInternalColorManagement {false};
0068 
0069 private:
0070 
0071     OCIO::ConstProcessorRcPtr m_processor;
0072     OCIO::ConstProcessorRcPtr m_reverseApproximationProcessor;
0073     OCIO::ConstProcessorRcPtr m_forwardApproximationProcessor;
0074 
0075     KisExposureGammaCorrectionInterface *m_interface {nullptr};
0076 
0077     bool m_lockCurrentColorVisualRepresentation {false};
0078 
0079     QString m_program;
0080     GLuint m_lut3dTexID {0};
0081     QVector<float> m_lut3d;
0082     QString m_lut3dcacheid;
0083     QString m_shadercacheid;
0084 
0085     bool m_shaderDirty {true};
0086 };
0087 
0088 #endif // OCIO_DISPLAY_FILTER_H