Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_opengl_image_textures.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2005-2007 Adrian Page <adrian@pagenet.plus.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#ifndef KIS_OPENGL_IMAGE_TEXTURES_H_
7#define KIS_OPENGL_IMAGE_TEXTURES_H_
8
9#include <QVector>
10#include <QMap>
11#include <QOpenGLFunctions>
12
13#include "kritaui_export.h"
14
15#include "kis_shared.h"
16
21
24
25class KoColorProfile;
26class KisTextureTileUpdateInfoPoolCollection;
28
31
32
36class KRITAUI_EXPORT KisOpenGLImageTextures : public QObject, public KisShared
37{
38 Q_OBJECT
39public:
47 static KisOpenGLImageTexturesSP createImageTextures(KisImageWSP image,
48 const KoColorProfile *monitorProfile, KoColorConversionTransformation::Intent renderingIntent,
49 KoColorConversionTransformation::ConversionFlags conversionFlags);
50
55
60
64 KisImageSP image() const;
65
72 void setMonitorProfile(const KoColorProfile *monitorProfile,
74 KoColorConversionTransformation::ConversionFlags conversionFlags);
75
80 bool setImageColorSpace(const KoColorSpace *cs);
81
86 void initGL(QOpenGLFunctions *f);
87
88 void setChannelFlags(const QBitArray &channelFlags);
89 void setProofingConfig(KisProofingConfigurationSP);
90
91 bool internalColorManagementActive() const;
92 bool setInternalColorManagementActive(bool value);
93
97 static const int BACKGROUND_TEXTURE_CHECK_SIZE = 32;
98 static const int BACKGROUND_TEXTURE_SIZE = BACKGROUND_TEXTURE_CHECK_SIZE * 2;
99
104 void generateCheckerTexture(const QImage & checkImage);
105 GLuint checkerTexture();
106
107 void updateConfig(bool useBuffer, int NumMipmapLevels);
108
109 void testingForceInitialized();
110
111public:
112 inline QRect storedImageBounds() {
113 return m_storedImageBounds;
114 }
115
116 inline int xToCol(int x) {
117 return x / m_texturesInfo.effectiveWidth;
118 }
119
120 inline int yToRow(int y) {
121 return y / m_texturesInfo.effectiveHeight;
122 }
123
124 inline KisTextureTile* getTextureTileCR(int col, int row) {
125 if (m_initialized) {
126 int tile = row * m_numCols + col;
127 KIS_ASSERT_RECOVER_RETURN_VALUE(m_textureTiles.size() > tile, 0);
128 return m_textureTiles[tile];
129 }
130 return 0;
131 }
132
133 inline int getTextureBufferIndexCR(int col, int row) {
134 if (m_initialized) {
135 int tile = row * m_numCols + col;
136 KIS_ASSERT_RECOVER_RETURN_VALUE(m_textureTiles.size() > tile, 0);
137 return tile;
138 }
139 return -1;
140 }
141
142 QOpenGLBuffer* tileVertexBuffer() {
143 return &m_tileVertexBuffer;
144 }
145
146 QOpenGLBuffer* tileTexCoordBuffer() {
147 return &m_tileTexCoordBuffer;
148 }
149
150 inline qreal texelSize() const {
151 Q_ASSERT(m_texturesInfo.width == m_texturesInfo.height);
152 return 1.0 / m_texturesInfo.width;
153 }
154
155 KisOpenGLUpdateInfoSP updateCache(const QRect& rect, KisImageSP srcImage);
156 KisOpenGLUpdateInfoSP updateCacheNoConversion(const QRect& rect);
157
158 void recalculateCache(KisUpdateInfoSP info, bool blockMipmapRegeneration);
159
160 void slotImageSizeChanged(qint32 w, qint32 h);
161
162 KisOpenGLUpdateInfoBuilder& updateInfoBuilder();
163 const KoColorProfile* monitorProfile();
164
165Q_SIGNALS:
166 void sigShowFloatingMessage(const QString &message, int timeout, bool priority);
167
168protected:
169
170 KisOpenGLImageTextures(KisImageWSP image, const KoColorProfile *monitorProfile,
172 KoColorConversionTransformation::ConversionFlags conversionFlags);
173
174 void recreateImageTextureTiles();
175
176 void destroyImageTextureTiles();
177
178 void initBufferStorage(bool useBuffer);
179
180private:
181
182 void getTextureSize(KisGLTexturesInfo *texturesInfo);
183
184 void updateTextureFormat();
185 KisOpenGLUpdateInfoSP updateCacheImpl(const QRect& rect, KisImageSP srcImage, bool convertColorSpace);
186
187private:
190 const KoColorProfile *m_monitorProfile {nullptr};
192 KoColorConversionTransformation::ConversionFlags m_conversionFlags;
193
200 bool m_internalColorManagementActive {true};
201
202 boost::optional<GLuint> m_checkerTexture;
203
205 int m_numCols {0};
206
207 // buffers are used by texture tiles, so they must come first
210 QOpenGLBuffer m_tileVertexBuffer;
211 QOpenGLBuffer m_tileTexCoordBuffer;
212
213 QOpenGLFunctions *m_glFuncs {nullptr};
214
215 bool m_useOcio {false};
216 bool m_initialized {false};
217
219};
220
221#endif // KIS_OPENGL_IMAGE_TEXTURES_H_
222
float value(const T *src, size_t ch)
int getTextureBufferIndexCR(int col, int row)
KisOpenGLBufferCircularStorage m_bufferStorage
void sigShowFloatingMessage(const QString &message, int timeout, bool priority)
KoColorConversionTransformation::ConversionFlags m_conversionFlags
KoColorConversionTransformation::Intent m_renderingIntent
QVector< KisTextureTile * > m_textureTiles
boost::optional< GLuint > m_checkerTexture
KisTextureTile * getTextureTileCR(int col, int row)
KisOpenGLUpdateInfoBuilder m_updateInfoBuilder
The KisProofingConfiguration struct Little struct that stores the proofing configuration for a given ...
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:85
QSharedPointer< KisTextureTileInfoPool > KisTextureTileInfoPoolSP
QSharedPointer< KisProofingConfiguration > KisProofingConfigurationSP
KisSharedPtr< KisOpenGLImageTextures > KisOpenGLImageTexturesSP