From d09bbd813bcf46c4b2e39f5e0caf3164107a07d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Thu, 25 Mar 2021 09:33:53 +0100 Subject: [PATCH] Refractor upload to OpenGL --- imagescrollareagl.cpp | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/imagescrollareagl.cpp b/imagescrollareagl.cpp index 1ca426b..38633c9 100644 --- a/imagescrollareagl.cpp +++ b/imagescrollareagl.cpp @@ -7,6 +7,23 @@ #include #include +struct RawImageType +{ + QOpenGLTexture::PixelFormat pixelFormat; + QOpenGLTexture::TextureFormat textureFormat; + QOpenGLTexture::PixelType dataType; + bool bw; +}; + +const RawImageType rawImageTypes[] = { + {QOpenGLTexture::Red, QOpenGLTexture::R8_UNorm, QOpenGLTexture::UInt8, true}, + {QOpenGLTexture::Red, QOpenGLTexture::R16_UNorm, QOpenGLTexture::UInt16, true}, + {QOpenGLTexture::Red, QOpenGLTexture::R32F, QOpenGLTexture::Float32, true}, + {QOpenGLTexture::RGB, QOpenGLTexture::R8_UNorm, QOpenGLTexture::UInt8, true}, + {QOpenGLTexture::RGB, QOpenGLTexture::RGB16_UNorm, QOpenGLTexture::UInt16, true}, + {QOpenGLTexture::RGB, QOpenGLTexture::RGB32F, QOpenGLTexture::Float32, true} +}; + void setScrollRange(QScrollBar *scrollBar, int newRange) { int page = scrollBar->pageStep(); @@ -43,28 +60,18 @@ void ImageWidget::setImage(RawImage *image) m_imgWidth = image->width(); m_imgHeight = image->height(); + const RawImageType &rawImageType = rawImageTypes[image->type()]; + m_image->destroy(); - m_image->setFormat(QOpenGLTexture::R16_UNorm); + m_image->setFormat(rawImageType.textureFormat); m_image->setSize(image->width(), image->height()); m_image->allocateStorage(); m_image->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::Linear); m_image->setWrapMode(QOpenGLTexture::ClampToBorder); m_image->setBorderColor(0, 0, 0, 0); - switch(image->type()) - { - case RawImage::UINT8: - m_image->setData(0, QOpenGLTexture::Red, QOpenGLTexture::UInt8, image->data(), m_transferOptions.get()); - break; - case RawImage::UINT16: - m_image->setData(0, QOpenGLTexture::Red, QOpenGLTexture::UInt16, image->data(), m_transferOptions.get()); - break; - case RawImage::FLOAT32: - m_image->setData(0, QOpenGLTexture::Red, QOpenGLTexture::Float32, image->data(), m_transferOptions.get()); - m_range = 1; - break; - } + m_image->setData(0, rawImageType.pixelFormat, rawImageType.dataType, image->data(), m_transferOptions.get()); m_image->generateMipMaps(); - m_bwImg = true; + m_bwImg = rawImageType.bw; update(); }