Krita Source Code Documentation
Loading...
Searching...
No Matches
KisGLImageWidget Class Reference

#include <KisGLImageWidget.h>

+ Inheritance diagram for KisGLImageWidget:

Public Member Functions

void initializeGL () override
 
 KisGLImageWidget (const KisSurfaceColorSpaceWrapper &colorSpace, QWidget *parent=nullptr)
 
 KisGLImageWidget (QWidget *parent=nullptr)
 
void loadImage (const KisGLImageF16 &image)
 
void paintEvent (QPaintEvent *event) override
 
void paintGL () override
 
void resizeEvent (QResizeEvent *event) override
 
QSize sizeHint () const override
 
 ~KisGLImageWidget ()
 

Private Slots

void slotOpenGLContextDestroyed ()
 

Private Member Functions

void updateVerticesBuffer (const QRect &rect)
 

Private Attributes

bool m_havePendingTextureUpdate = false
 
QScopedPointer< QOpenGLShaderProgram > m_shader
 
KisGLImageF16 m_sourceImage
 
QOpenGLTexture m_texture
 
QOpenGLBuffer m_textureVerticesBuffer
 
QOpenGLVertexArrayObject m_vao
 
QOpenGLBuffer m_verticesBuffer
 

Detailed Description

Definition at line 19 of file KisGLImageWidget.h.

Constructor & Destructor Documentation

◆ KisGLImageWidget() [1/2]

KisGLImageWidget::KisGLImageWidget ( QWidget * parent = nullptr)

◆ KisGLImageWidget() [2/2]

KisGLImageWidget::KisGLImageWidget ( const KisSurfaceColorSpaceWrapper & colorSpace,
QWidget * parent = nullptr )

Definition at line 46 of file KisGLImageWidget.cpp.

48 : QOpenGLWidget(parent),
49 m_texture(QOpenGLTexture::Target2D)
50{
51 Q_UNUSED(colorSpace);
52
53 setTextureFormat(GL_RGBA16F);
54
55#ifdef HAVE_HDR
56 setTextureColorSpace(colorSpace);
57#endif
58
59 setUpdateBehavior(QOpenGLWidget::NoPartialUpdate);
60}
QOpenGLTexture m_texture

◆ ~KisGLImageWidget()

KisGLImageWidget::~KisGLImageWidget ( )

Definition at line 62 of file KisGLImageWidget.cpp.

63{
64 // force releasing the resources on destruction
66}

References slotOpenGLContextDestroyed().

Member Function Documentation

◆ initializeGL()

void KisGLImageWidget::initializeGL ( )
override

Definition at line 68 of file KisGLImageWidget.cpp.

69{
70 initializeOpenGLFunctions();
71
72 connect(context(), SIGNAL(aboutToBeDestroyed()), SLOT(slotOpenGLContextDestroyed()));
73 m_shader.reset(new QOpenGLShaderProgram);
74
75 QFile vertexShaderFile(QString(":/") + "kis_gl_image_widget.vert");
76 if (!vertexShaderFile.open(QIODevice::ReadOnly)) {
77 qDebug() << "Could not open vertex code";
78 return;
79 }
80 QString vertSource = vertexShaderFile.readAll();
81
82 QFile fragShaderFile(QString(":/") + "kis_gl_image_widget.frag");
83 if (!fragShaderFile.open(QIODevice::ReadOnly)) {
84 qDebug() << "Could not open fragment code";
85 return;
86 }
87 QString fragSource = fragShaderFile.readAll();
88
89 if (context()->isOpenGLES()) {
90 const char *versionHelper = "#define USE_OPENGLES\n";
91 vertSource.prepend(versionHelper);
92 fragSource.prepend(versionHelper);
93
94 const char *versionDefinition = "#version 100\n";
95 vertSource.prepend(versionDefinition);
96 fragSource.prepend(versionDefinition);
97 } else {
98#ifdef Q_OS_MACOS
99 const char *versionDefinition = KisOpenGL::supportsLoD() ? "#version 150\n" : "#version 120\n";
100#else
101 const char *versionDefinition = KisOpenGL::supportsLoD() ? "#version 130\n" : "#version 120\n";
102#endif
103 vertSource.prepend(versionDefinition);
104 fragSource.prepend(versionDefinition);
105 }
106
107 if (!m_shader->addShaderFromSourceCode(QOpenGLShader::Vertex, vertSource)) {
108 qDebug() << "Could not add vertex code";
109 return;
110 }
111
112 if (!m_shader->addShaderFromSourceCode(QOpenGLShader::Fragment, fragSource)) {
113 qDebug() << "Could not add fragment code";
114 return;
115 }
116
117 if (!m_shader->link()) {
118 qDebug() << "Could not link";
119 return;
120 }
121
122 if (!m_shader->bind()) {
123 qDebug() << "Could not bind";
124 return;
125 }
126
127 m_shader->release();
128
129
130 m_vao.create();
131 m_vao.bind();
132
133 m_verticesBuffer.create();
134 updateVerticesBuffer(this->rect());
135
136 QVector<QVector2D> textureVertices(6);
137 rectToTexCoords(textureVertices.data(), QRect(0.0, 0.0, 1.0, 1.0));
138
141 m_textureVerticesBuffer.setUsagePattern(QOpenGLBuffer::DynamicDraw);
142 m_textureVerticesBuffer.allocate(2 * 3 * sizeof(QVector2D));
143 m_verticesBuffer.write(0, textureVertices.data(), m_textureVerticesBuffer.size());
144 m_textureVerticesBuffer.release();
145
146 m_vao.release();
147
148
149 if (!m_sourceImage.isNull()) {
151 }
152}
bool isNull() const
QOpenGLBuffer m_verticesBuffer
QOpenGLVertexArrayObject m_vao
QOpenGLBuffer m_textureVerticesBuffer
KisGLImageF16 m_sourceImage
void updateVerticesBuffer(const QRect &rect)
void loadImage(const KisGLImageF16 &image)
QScopedPointer< QOpenGLShaderProgram > m_shader
static bool supportsLoD()
void rectToTexCoords(QVector2D *texCoords, const QRectF &rc)

References KisGLImageF16::isNull(), loadImage(), m_shader, m_sourceImage, m_textureVerticesBuffer, m_vao, m_verticesBuffer, slotOpenGLContextDestroyed(), KisOpenGL::supportsLoD(), and updateVerticesBuffer().

◆ loadImage()

void KisGLImageWidget::loadImage ( const KisGLImageF16 & image)

Definition at line 254 of file KisGLImageWidget.cpp.

255{
256 if (m_sourceImage != image) {
257 m_sourceImage = image;
258 }
259
261
262
263 updateGeometry();
264 update();
265}
bool update(QSpinBox *spinBox)

References m_havePendingTextureUpdate, and m_sourceImage.

◆ paintEvent()

void KisGLImageWidget::paintEvent ( QPaintEvent * event)
override

Definition at line 267 of file KisGLImageWidget.cpp.

268{
269 QOpenGLWidget::paintEvent(event);
270}

◆ paintGL()

void KisGLImageWidget::paintGL ( )
override

Definition at line 183 of file KisGLImageWidget.cpp.

184{
185 // TODO: fix conversion to the destination surface space
186 // Fill with bright color as as default for debugging purposes
187 // glClearColor(bgColor.redF(), bgColor.greenF(), bgColor.blueF(), 1.0f);
188 glClearColor(0.3, 0.2, 0.8, 1.0f);
189 glClear(GL_COLOR_BUFFER_BIT);
190
191
192
195
196 if (!m_texture.isCreated() ||
197 m_sourceImage.width() != m_texture.width() ||
198 m_sourceImage.height() != m_texture.height()) {
199
200 if (m_texture.isCreated()) {
201 m_texture.destroy();
202 }
203
204 m_texture.setFormat(QOpenGLTexture::RGBA16F);
206 m_texture.allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::Float16);
207 m_texture.setMinificationFilter(QOpenGLTexture::LinearMipMapLinear);
208 m_texture.setMagnificationFilter(QOpenGLTexture::Linear);
209 m_texture.setWrapMode(QOpenGLTexture::ClampToEdge);
210 }
211
212 m_texture.setData(QOpenGLTexture::RGBA, QOpenGLTexture::Float16, m_sourceImage.constData());
213 }
214
215 if (!m_texture.isCreated()) return;
216
217 m_vao.bind();
218 m_shader->bind();
219
220 {
221 QMatrix4x4 projectionMatrix;
222 projectionMatrix.setToIdentity();
223 projectionMatrix.ortho(0, width(), height(), 0, -1, 1);
224 QMatrix4x4 viewProjectionMatrix;
225
226 // use a QTransform to scale, translate, rotate your view
227 QTransform transform; // TODO: noop!
228 viewProjectionMatrix = projectionMatrix * QMatrix4x4(transform);
229
230 m_shader->setUniformValue("viewProjectionMatrix", viewProjectionMatrix);
231 }
232
233 m_shader->enableAttributeArray("vertexPosition");
234 m_verticesBuffer.bind();
235 m_shader->setAttributeBuffer("vertexPosition", GL_FLOAT, 0, 3);
236
237 m_shader->enableAttributeArray("texturePosition");
239 m_shader->setAttributeBuffer("texturePosition", GL_FLOAT, 0, 2);
240
241 glActiveTexture(GL_TEXTURE0);
242 m_texture.bind();
243
244 // draw 2 triangles = 6 vertices starting at offset 0 in the buffer
245 glDrawArrays(GL_TRIANGLES, 0, 6);
246
247 m_verticesBuffer.release();
248 m_textureVerticesBuffer.release();
249 m_texture.release();
250 m_shader->release();
251 m_vao.release();
252}
int height() const
const half * constData() const
int width() const

References KisGLImageF16::constData(), KisGLImageF16::height(), m_havePendingTextureUpdate, m_shader, m_sourceImage, m_texture, m_textureVerticesBuffer, m_vao, m_verticesBuffer, and KisGLImageF16::width().

◆ resizeEvent()

void KisGLImageWidget::resizeEvent ( QResizeEvent * event)
override

Definition at line 272 of file KisGLImageWidget.cpp.

273{
274 updateVerticesBuffer(QRect(QPoint(),event->size()));
275 QOpenGLWidget::resizeEvent(event);
276}

References updateVerticesBuffer().

◆ sizeHint()

QSize KisGLImageWidget::sizeHint ( ) const
override

Definition at line 278 of file KisGLImageWidget.cpp.

279{
280 return m_sourceImage.size();
281}
QSize size() const

References m_sourceImage, and KisGLImageF16::size().

◆ slotOpenGLContextDestroyed

void KisGLImageWidget::slotOpenGLContextDestroyed ( )
privateslot

Definition at line 154 of file KisGLImageWidget.cpp.

155{
156 this->makeCurrent();
157
158 m_shader.reset();
159 m_texture.destroy();
160 m_verticesBuffer.destroy();
161 m_textureVerticesBuffer.destroy();
162 m_vao.destroy();
164
165 this->doneCurrent();
166}

References m_havePendingTextureUpdate, m_shader, m_texture, m_textureVerticesBuffer, m_vao, and m_verticesBuffer.

◆ updateVerticesBuffer()

void KisGLImageWidget::updateVerticesBuffer ( const QRect & rect)
private

Definition at line 168 of file KisGLImageWidget.cpp.

169{
170 if (!m_vao.isCreated() || !m_verticesBuffer.isCreated()) return;
171
172 QVector<QVector3D> vertices(6);
173 rectToVertices(vertices.data(), rect);
174
175 m_verticesBuffer.bind();
176 m_verticesBuffer.setUsagePattern(QOpenGLBuffer::DynamicDraw);
177 m_verticesBuffer.allocate(2 * 3 * sizeof(QVector3D));
178 m_verticesBuffer.write(0, vertices.data(), m_verticesBuffer.size());
179 m_verticesBuffer.release();
180}
void rectToVertices(QVector3D *vertices, const QRectF &rc)

References m_vao, and m_verticesBuffer.

Member Data Documentation

◆ m_havePendingTextureUpdate

bool KisGLImageWidget::m_havePendingTextureUpdate = false
private

Definition at line 56 of file KisGLImageWidget.h.

◆ m_shader

QScopedPointer<QOpenGLShaderProgram> KisGLImageWidget::m_shader
private

Definition at line 50 of file KisGLImageWidget.h.

◆ m_sourceImage

KisGLImageF16 KisGLImageWidget::m_sourceImage
private

Definition at line 48 of file KisGLImageWidget.h.

◆ m_texture

QOpenGLTexture KisGLImageWidget::m_texture
private

Definition at line 54 of file KisGLImageWidget.h.

◆ m_textureVerticesBuffer

QOpenGLBuffer KisGLImageWidget::m_textureVerticesBuffer
private

Definition at line 53 of file KisGLImageWidget.h.

◆ m_vao

QOpenGLVertexArrayObject KisGLImageWidget::m_vao
private

Definition at line 51 of file KisGLImageWidget.h.

◆ m_verticesBuffer

QOpenGLBuffer KisGLImageWidget::m_verticesBuffer
private

Definition at line 52 of file KisGLImageWidget.h.


The documentation for this class was generated from the following files: