Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a86c100e69 | |||
| 45ee9b7258 | |||
| be1e65251d | |||
| 9b7837e9fb |
+208
-55
@@ -10,6 +10,7 @@
|
||||
#include <QDragEnterEvent>
|
||||
#include <QPainter>
|
||||
#include "imageringlist.h"
|
||||
#include <QFloat16>
|
||||
|
||||
int FILTERING = 1;
|
||||
bool OpenGLES = false;
|
||||
@@ -110,16 +111,15 @@ void ImageWidgetGL::setImage(std::shared_ptr<RawImage> image, int index)
|
||||
m_error.clear();
|
||||
makeCurrent();
|
||||
m_rawImage = image;
|
||||
if((int)image->width() > m_maxTextureSize || (int)image->height() > m_maxTextureSize)
|
||||
{
|
||||
uint32_t newW = std::min(image->width() * m_maxTextureSize / image->width(), image->width() * m_maxTextureSize / image->height());
|
||||
uint32_t newH = std::min(image->height() * m_maxTextureSize / image->width(), image->height() * m_maxTextureSize / image->height());
|
||||
m_rawImage->resize(newW, newH);
|
||||
}
|
||||
|
||||
m_imgWidth = image->width();
|
||||
m_imgHeight = image->height();
|
||||
|
||||
bool tooBig = false;
|
||||
if((int)image->width() > m_maxTextureSize || (int)image->height() > m_maxTextureSize)
|
||||
{
|
||||
tooBig = true;
|
||||
m_swPaint = true;
|
||||
}
|
||||
|
||||
if(!m_image)return;
|
||||
|
||||
@@ -133,21 +133,26 @@ void ImageWidgetGL::setImage(std::shared_ptr<RawImage> image, int index)
|
||||
m_lut->setData(0, 0, 0, LUT_SIZE, LUT_SIZE, LUT_SIZE, 0, QOpenGLTexture::RGBA, QOpenGLTexture::RGBA, QOpenGLTexture::Float16, image->getLUT().data());
|
||||
}
|
||||
|
||||
QElapsedTimer timer;
|
||||
timer.start();
|
||||
m_image->destroy();
|
||||
m_image->setAutoMipMapGenerationEnabled(false);
|
||||
m_image->setFormat(rawImageType.textureFormat);
|
||||
m_image->setSize(image->width(), image->height());
|
||||
m_image->setMipLevels([&](){ int c = 0; int s = std::min(m_imgWidth, m_imgHeight); while(s>>=1)c++; return c; }());
|
||||
m_image->allocateStorage();
|
||||
m_image->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::Linear);
|
||||
m_image->setWrapMode(QOpenGLTexture::ClampToEdge);
|
||||
m_image->setData(0, rawImageType.pixelFormat, rawImageType.dataType, (const void*)image->data());
|
||||
m_image->bind();
|
||||
f->glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
||||
f->glGenerateMipmap(GL_TEXTURE_2D);
|
||||
qDebug() << "setImage" << timer.elapsed();
|
||||
if(!tooBig)
|
||||
{
|
||||
while(f->glGetError() != GL_NO_ERROR);
|
||||
QElapsedTimer timer;
|
||||
timer.start();
|
||||
m_image->destroy();
|
||||
m_image->setAutoMipMapGenerationEnabled(false);
|
||||
m_image->setFormat(rawImageType.textureFormat);
|
||||
m_image->setSize(image->width(), image->height());
|
||||
m_image->setMipLevels([&](){ int c = 0; int s = std::min(m_imgWidth, m_imgHeight); while(s>>=1)c++; return c; }());
|
||||
m_image->allocateStorage();
|
||||
m_image->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::Linear);
|
||||
m_image->setWrapMode(QOpenGLTexture::ClampToEdge);
|
||||
m_image->setData(0, rawImageType.pixelFormat, rawImageType.dataType, (const void*)image->data());
|
||||
m_image->bind();
|
||||
f->glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
||||
f->glGenerateMipmap(GL_TEXTURE_2D);
|
||||
qDebug() << "setImage" << timer.elapsed();
|
||||
m_swPaint = f->glGetError() != GL_NO_ERROR;
|
||||
}
|
||||
|
||||
m_unit_scale[0] = 1.0f;
|
||||
m_unit_scale[1] = 0.0f;
|
||||
@@ -185,10 +190,10 @@ void ImageWidgetGL::zoom(int zoom, const QPointF &mousePos)
|
||||
if(!mousePos.isNull())
|
||||
focus = mousePos;
|
||||
|
||||
if(width() > m_image->width() * m_scale)
|
||||
m_dx = -width() * 0.5f + m_image->width() * m_scale * 0.5f;
|
||||
if(height() > m_image->height() * m_scale)
|
||||
m_dy = -height() * 0.5f + m_image->height() * m_scale * 0.5f;
|
||||
if(width() > m_imgWidth * m_scale)
|
||||
m_dx = -width() * 0.5f + m_imgWidth * m_scale * 0.5f;
|
||||
if(height() > m_imgHeight * m_scale)
|
||||
m_dy = -height() * 0.5f + m_imgHeight * m_scale * 0.5f;
|
||||
|
||||
float newScale = std::sqrt(std::pow(2.0f, (float)m_scaleStop));
|
||||
float r = newScale / m_scale;
|
||||
@@ -232,10 +237,10 @@ QVector2D ImageWidgetGL::getImagePixelCoord(const QVector2D &pos)
|
||||
{
|
||||
float dx = m_dx;
|
||||
float dy = m_dy;
|
||||
if(m_width > m_image->width()*m_scale)
|
||||
dx = -width()*0.5f + m_image->width()*m_scale*0.5f;
|
||||
if(m_height > m_image->height()*m_scale)
|
||||
dy = -height()*0.5f + m_image->height()*m_scale*0.5f;
|
||||
if(m_width > m_imgWidth * m_scale)
|
||||
dx = -width()*0.5f + m_imgWidth*m_scale * 0.5f;
|
||||
if(m_height > m_imgHeight * m_scale)
|
||||
dy = -height()*0.5f + m_imgHeight*m_scale * 0.5f;
|
||||
|
||||
QVector2D offset(dx, dy);
|
||||
return (pos + offset) / m_scale;
|
||||
@@ -341,17 +346,158 @@ void ImageWidgetGL::showThumbnail(bool enable)
|
||||
setOffset(m_dx, m_dy);
|
||||
}
|
||||
|
||||
void swPaint(std::shared_ptr<RawImage> &rawImage, float dx, float dy, float scale, const MTFParam &mtfParams, QWidget *widget)
|
||||
{
|
||||
QPainter painter(widget);
|
||||
int width = widget->width();
|
||||
int height = widget->height();
|
||||
QImage img(width, height, QImage::Format_RGB32);
|
||||
img.fill(Qt::darkGray);
|
||||
int64_t ox = dx;
|
||||
int64_t oy = dy;
|
||||
|
||||
auto mtf = [&mtfParams](int i, float x)
|
||||
{
|
||||
x = (x - mtfParams.blackPoint[i]) / (mtfParams.whitePoint[i] - mtfParams.blackPoint[i]);
|
||||
x = std::min(std::max(x, 0.0f), 1.0f);
|
||||
return ((mtfParams.midPoint[i] - 1.0f) * x) / ((2.0f * mtfParams.midPoint[i] - 1.0f) * x - mtfParams.midPoint[i]);
|
||||
};
|
||||
|
||||
int imgWidth = rawImage->width();
|
||||
int imgHeight = rawImage->height();
|
||||
|
||||
auto convert = [&](auto *src)
|
||||
{
|
||||
float s = 1.0f;
|
||||
if constexpr(std::numeric_limits<std::remove_reference_t<decltype(*src)>>::is_integer)
|
||||
s = (float)std::numeric_limits<std::remove_reference_t<decltype(*src)>>::max();
|
||||
|
||||
float iscale = 1.0f / scale;
|
||||
float r[4];
|
||||
float g[4];
|
||||
float b[4];
|
||||
for(int64_t y = std::max((int64_t)0, -oy); y < height; y++)
|
||||
{
|
||||
uint32_t *pixels = (uint32_t*)(img.scanLine(y));
|
||||
float iptr;
|
||||
float fy = std::modf((y + oy) * iscale, &iptr);
|
||||
int64_t py = iptr;
|
||||
int64_t w = py * rawImage->widthBytes();
|
||||
int64_t w2 = w;
|
||||
if(py+1 < imgHeight)w2 += rawImage->widthBytes();
|
||||
if(py >= imgHeight)break;
|
||||
|
||||
for(int64_t x = std::max((int64_t)0, -ox); x < width; x++)
|
||||
{
|
||||
float fx = std::modf((x + ox) * iscale, &iptr);
|
||||
int px = iptr;
|
||||
int px2 = px + 1 < imgWidth ? px + 1 : px;
|
||||
if(px >= imgWidth)break;
|
||||
|
||||
|
||||
if(rawImage->channels() > 1)
|
||||
{
|
||||
r[0] = src[w + px * 4 + 0];
|
||||
g[0] = src[w + px * 4 + 1];
|
||||
b[0] = src[w + px * 4 + 2];
|
||||
if(FILTERING)
|
||||
{
|
||||
r[1] = src[w + px2 * 4 + 0];
|
||||
g[1] = src[w + px2 * 4 + 1];
|
||||
b[1] = src[w + px2 * 4 + 2];
|
||||
r[2] = src[w2 + px * 4 + 0];
|
||||
g[2] = src[w2 + px * 4 + 1];
|
||||
b[2] = src[w2 + px * 4 + 2];
|
||||
r[3] = src[w2 + px2 * 4 + 0];
|
||||
g[3] = src[w2 + px2 * 4 + 1];
|
||||
b[3] = src[w2 + px2 * 4 + 2];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
r[0] = src[w + px];
|
||||
if(FILTERING)
|
||||
{
|
||||
r[2] = src[w2 + px];
|
||||
r[1] = src[w + px2];
|
||||
r[3] = src[w2 + px2];
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t rgb = 0xff000000;
|
||||
if(FILTERING)
|
||||
{
|
||||
if(rawImage->channels() > 1)
|
||||
{
|
||||
rgb |= (uint8_t)(mtf(0, ((r[3] * fx + r[2] * (1.0f - fx)) * fy + (r[1] * fx + r[0] * (1.0f - fx)) * (1.0f - fy)) / s) * 255.0f) << 16;
|
||||
rgb |= (uint8_t)(mtf(1, ((g[3] * fx + g[2] * (1.0f - fx)) * fy + (g[1] * fx + g[0] * (1.0f - fx)) * (1.0f - fy)) / s) * 255.0f) << 8;
|
||||
rgb |= (uint8_t)(mtf(1, ((b[3] * fx + b[2] * (1.0f - fx)) * fy + (b[1] * fx + b[0] * (1.0f - fx)) * (1.0f - fy)) / s) * 255.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32_t v = (uint8_t)(mtf(0, ((r[3] * fx + r[2] * (1.0f - fx)) * fy + (r[1] * fx + r[0] * (1.0f - fx)) * (1.0f - fy)) / s) * 255.0f);
|
||||
rgb = 0xff000000 | (v << 16) | (v << 8) | v;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(rawImage->channels() > 1)
|
||||
{
|
||||
rgb |= (uint8_t)(mtf(0, r[0] / s) * 255.0f) << 16;
|
||||
rgb |= (uint8_t)(mtf(1, g[0] / s) * 255.0f) << 8;
|
||||
rgb |= (uint8_t)(mtf(1, b[0] / s) * 255.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32_t v = (uint8_t)(mtf(0, r[0] / s) * 255.0f);
|
||||
rgb = 0xff000000 | (v << 16) | (v << 8) | v;
|
||||
}
|
||||
}
|
||||
pixels[x] = rgb;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if(rawImage)
|
||||
{
|
||||
switch(rawImage->type())
|
||||
{
|
||||
case RawImage::UINT8:
|
||||
convert(static_cast<uint8_t*>(rawImage->data()));
|
||||
break;
|
||||
case RawImage::UINT16:
|
||||
convert(static_cast<uint16_t*>(rawImage->data()));
|
||||
break;
|
||||
case RawImage::UINT32:
|
||||
convert(static_cast<uint32_t*>(rawImage->data()));
|
||||
break;
|
||||
case RawImage::FLOAT16:
|
||||
convert(static_cast<qfloat16*>(rawImage->data()));
|
||||
break;
|
||||
case RawImage::FLOAT32:
|
||||
convert(static_cast<float*>(rawImage->data()));
|
||||
break;
|
||||
case RawImage::FLOAT64:
|
||||
convert(static_cast<double*>(rawImage->data()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
painter.drawImage(0, 0, img);
|
||||
}
|
||||
|
||||
void ImageWidgetGL::paintGL()
|
||||
{
|
||||
float dx = m_dx;
|
||||
float dy = m_dy;
|
||||
if(m_width > m_image->width() * m_scale)
|
||||
dx = -width() * 0.5f + m_image->width() * m_scale * 0.5f;
|
||||
if(m_height > m_image->height() * m_scale)
|
||||
dy = -height() * 0.5f + m_image->height() * m_scale * 0.5f;
|
||||
if(m_width > m_imgWidth * m_scale)
|
||||
dx = -width() * 0.5f + m_imgWidth * m_scale * 0.5f;
|
||||
if(m_height > m_imgHeight * m_scale)
|
||||
dy = -height() * 0.5f + m_imgHeight * m_scale * 0.5f;
|
||||
QBrush highlight = style()->standardPalette().highlight();
|
||||
|
||||
f->glClear(GL_COLOR_BUFFER_BIT);
|
||||
f->glBlendFunc(GL_ONE, GL_ZERO);
|
||||
if(m_showThumbnails)
|
||||
{
|
||||
m_vaoThumb->bind();
|
||||
@@ -425,31 +571,38 @@ void ImageWidgetGL::paintGL()
|
||||
}
|
||||
else
|
||||
{
|
||||
m_vao->bind();
|
||||
debayer();
|
||||
|
||||
if(m_superpixel && m_debayerTex)
|
||||
if(m_swPaint)
|
||||
{
|
||||
f->glActiveTexture(GL_TEXTURE0);
|
||||
f->glBindTexture(GL_TEXTURE_2D, m_debayerTex);
|
||||
swPaint(m_rawImage, dx, dy, m_scale, m_mtfParams, this);
|
||||
}
|
||||
else
|
||||
m_image->bind(0);
|
||||
{
|
||||
m_vao->bind();
|
||||
debayer();
|
||||
|
||||
m_program->bind();
|
||||
m_program->setUniformValue("viewport", (float)width(), (float)height());
|
||||
m_program->setUniformValue("offset", std::floor(dx), std::floor(dy));
|
||||
m_program->setUniformValueArray("mtf_param", m_mtfParams.blackPoint, 3, 3);
|
||||
m_program->setUniformValue("unit_scale", m_unit_scale[0], m_unit_scale[1]);
|
||||
m_program->setUniformValue("zoom", 1.0f/m_scale);
|
||||
m_program->setUniformValue("bw", m_bwImg && !m_superpixel);
|
||||
m_program->setUniformValue("false_color", m_falseColor && m_bwImg);
|
||||
m_program->setUniformValue("invert", m_invert);
|
||||
m_program->setUniformValue("filtering", m_scale > 1.0f ? FILTERING : 1);
|
||||
m_program->setUniformValue("lut_table", 2);
|
||||
m_program->setUniformValue("srgb", m_srgb);
|
||||
f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
m_vao->release();
|
||||
if(m_superpixel && m_debayerTex)
|
||||
{
|
||||
f->glActiveTexture(GL_TEXTURE0);
|
||||
f->glBindTexture(GL_TEXTURE_2D, m_debayerTex);
|
||||
}
|
||||
else
|
||||
m_image->bind(0);
|
||||
|
||||
m_program->bind();
|
||||
m_program->setUniformValue("viewport", (float)width(), (float)height());
|
||||
m_program->setUniformValue("offset", std::floor(dx), std::floor(dy));
|
||||
m_program->setUniformValueArray("mtf_param", m_mtfParams.blackPoint, 3, 3);
|
||||
m_program->setUniformValue("unit_scale", m_unit_scale[0], m_unit_scale[1]);
|
||||
m_program->setUniformValue("zoom", 1.0f/m_scale);
|
||||
m_program->setUniformValue("bw", m_bwImg && !m_superpixel);
|
||||
m_program->setUniformValue("false_color", m_falseColor && m_bwImg);
|
||||
m_program->setUniformValue("invert", m_invert);
|
||||
m_program->setUniformValue("filtering", m_scale > 1.0f ? FILTERING : 1);
|
||||
m_program->setUniformValue("lut_table", 2);
|
||||
m_program->setUniformValue("srgb", m_srgb);
|
||||
f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
m_vao->release();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -91,6 +91,7 @@ class ImageWidgetGL : public QOpenGLWidget, public ImageWidget
|
||||
Database *m_database = nullptr;
|
||||
QPointF m_lastPos;
|
||||
QString m_error;
|
||||
bool m_swPaint = false;
|
||||
public:
|
||||
explicit ImageWidgetGL(Database *database, QWidget *parent = nullptr);
|
||||
~ImageWidgetGL() override;
|
||||
|
||||
+46
-28
@@ -45,7 +45,7 @@ void RawImage::allocate(uint32_t w, uint32_t h, uint32_t ch, DataType type)
|
||||
m_channels = ch;
|
||||
m_ch = ch == 3 ? 4 : ch;
|
||||
m_origType = m_type = type;
|
||||
m_pixels = std::make_unique<PixelType[]>(m_width * m_height * m_ch * typeSize(type));
|
||||
m_pixels = std::make_unique<PixelType[]>((size_t)m_width * m_height * m_ch * typeSize(type));
|
||||
}
|
||||
|
||||
RawImage::RawImage()
|
||||
@@ -60,7 +60,7 @@ RawImage::RawImage(uint32_t w, uint32_t h, uint32_t ch, DataType type)
|
||||
RawImage::RawImage(const RawImage &d)
|
||||
{
|
||||
allocate(d.m_width, d.m_height, d.m_channels, d.m_type);
|
||||
std::memcpy(m_pixels.get(), d.m_pixels.get(), m_width * m_height * m_ch * typeSize(m_type));
|
||||
std::memcpy(m_pixels.get(), d.m_pixels.get(), (size_t)m_width * m_height * m_ch * typeSize(m_type));
|
||||
m_stats = d.m_stats;
|
||||
}
|
||||
|
||||
@@ -118,6 +118,24 @@ RawImage::RawImage(const QImage &img)
|
||||
for(int i=0; i<img.height(); i++)
|
||||
std::memcpy(data(i), img.scanLine(i), img.width()*2);
|
||||
}
|
||||
else if(img.format() == QImage::Format_RGB32 || img.format() == QImage::Format_ARGB32)
|
||||
{
|
||||
allocate(img.width(), img.height(), 4, UINT8);
|
||||
for(int i=0; i<img.height(); i++)
|
||||
{
|
||||
uint32_t *src = (uint32_t*)img.scanLine(i);
|
||||
uint32_t *dst = (uint32_t*)data(i);
|
||||
for(int o=0; o<img.width(); o++)
|
||||
{
|
||||
uint32_t p = src[o];
|
||||
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
|
||||
dst[o] = (p & 0xff000000) | (p >> 16 & 0xff) | (p & 0xff00) | (p << 16 & 0xff0000);
|
||||
#else
|
||||
dst[o] = (p >> 24) | (p << 8 & 0xffffff00);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
QImage tmp = img.convertToFormat(QImage::Format_RGBA8888);
|
||||
@@ -294,9 +312,9 @@ uint32_t RawImage::channels() const
|
||||
return m_channels;
|
||||
}
|
||||
|
||||
uint32_t RawImage::size() const
|
||||
uint64_t RawImage::size() const
|
||||
{
|
||||
return width()*height();
|
||||
return (uint64_t)width()*height();
|
||||
}
|
||||
|
||||
RawImage::DataType RawImage::type() const
|
||||
@@ -336,12 +354,12 @@ const void *RawImage::data() const
|
||||
|
||||
void *RawImage::data(uint32_t row, uint32_t col)
|
||||
{
|
||||
return m_pixels.get() + (m_width * row * m_ch + col * m_ch) * typeSize(m_type);
|
||||
return m_pixels.get() + ((size_t)m_width * row * m_ch + (size_t)col * m_ch) * typeSize(m_type);
|
||||
}
|
||||
|
||||
const void *RawImage::data(uint32_t row, uint32_t col) const
|
||||
{
|
||||
return m_pixels.get() + (m_width * row * m_ch + col * m_ch) * typeSize(m_type);
|
||||
return m_pixels.get() + ((size_t)m_width * row * m_ch + (size_t)col * m_ch) * typeSize(m_type);
|
||||
}
|
||||
|
||||
const void *RawImage::origData() const
|
||||
@@ -356,12 +374,12 @@ const void *RawImage::origData(uint32_t row, uint32_t col) const
|
||||
{
|
||||
if(m_original)
|
||||
{
|
||||
col = col * m_origWidth / m_width;
|
||||
row = row * m_origHeight / m_height;
|
||||
return m_original.get() + (m_origWidth * row * m_ch + col * m_ch) * typeSize(m_origType);
|
||||
col = (uint64_t)col * m_origWidth / m_width;
|
||||
row = (uint64_t)row * m_origHeight / m_height;
|
||||
return m_original.get() + ((size_t)m_origWidth * row * m_ch + (size_t)col * m_ch) * typeSize(m_origType);
|
||||
}
|
||||
else
|
||||
return m_pixels.get() + (m_width * row * m_ch + col * m_ch) * typeSize(m_type);
|
||||
return m_pixels.get() + ((size_t)m_width * row * m_ch + (size_t)col * m_ch) * typeSize(m_type);
|
||||
}
|
||||
|
||||
bool RawImage::planar() const
|
||||
@@ -381,12 +399,12 @@ void RawImage::convertToThumbnail()
|
||||
|
||||
auto loop = [&](F16 *out, auto *in, float scale)
|
||||
{
|
||||
for(int i=0; i<THUMB_SIZE; i++)
|
||||
for(int64_t i=0; i<THUMB_SIZE; i++)
|
||||
{
|
||||
for(int o=0; o<THUMB_SIZE; o++)
|
||||
for(int64_t o=0; o<THUMB_SIZE; o++)
|
||||
{
|
||||
int idx = (i*THUMB_SIZE + o)*4;
|
||||
int idx2 = ((i * m_height / THUMB_SIZE * m_width) + (o * m_width / THUMB_SIZE)) * m_ch;
|
||||
int64_t idx = (i*THUMB_SIZE + o)*4;
|
||||
int64_t idx2 = ((i * m_height / THUMB_SIZE * m_width) + (o * m_width / THUMB_SIZE)) * m_ch;
|
||||
|
||||
if(m_channels == 1)
|
||||
{
|
||||
@@ -442,21 +460,21 @@ void RawImage::convertToGLFormat()
|
||||
}
|
||||
|
||||
template<typename T, typename U>
|
||||
void convertType2(uint32_t size, const T *src, U *dst)
|
||||
void convertType2(size_t size, const T *src, U *dst)
|
||||
{
|
||||
if constexpr((std::is_floating_point_v<T> || std::is_same_v<T, F16>) && (std::is_floating_point_v<U> || std::is_same_v<T, F16>))
|
||||
{
|
||||
for(uint32_t i = 0; i < size; i++)
|
||||
for(size_t i = 0; i < size; i++)
|
||||
dst[i] = src[i];
|
||||
}
|
||||
|
||||
if constexpr(std::is_integral_v<T> && std::is_integral_v<U>)
|
||||
{
|
||||
if constexpr(sizeof(T) > sizeof(U))
|
||||
for(uint32_t i = 0; i < size; i++)
|
||||
for(size_t i = 0; i < size; i++)
|
||||
dst[i] = src[i] >> ((sizeof(T) - sizeof(U)) * 8);
|
||||
else
|
||||
for(uint32_t i = 0; i < size; i++)
|
||||
for(size_t i = 0; i < size; i++)
|
||||
dst[i] = static_cast<U>(src[i]) << ((sizeof(U) - sizeof(T)) * 8);
|
||||
}
|
||||
|
||||
@@ -464,20 +482,20 @@ void convertType2(uint32_t size, const T *src, U *dst)
|
||||
{
|
||||
U max = std::numeric_limits<U>::max();
|
||||
T scale = (T)(max);
|
||||
for(uint32_t i = 0; i < size; i++)
|
||||
for(size_t i = 0; i < size; i++)
|
||||
dst[i] = src[i] * scale;
|
||||
}
|
||||
|
||||
if constexpr(std::is_integral_v<T> && (std::is_floating_point_v<U> || std::is_same_v<U, F16>))
|
||||
{
|
||||
U scale = (U)(1.0 / (double)std::numeric_limits<T>::max());
|
||||
for(uint32_t i = 0; i < size; i++)
|
||||
for(size_t i = 0; i < size; i++)
|
||||
dst[i] = (U)src[i] * scale;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void convertType(uint32_t size, RawImage::DataType dstType, const T *src, void *dst)
|
||||
void convertType(size_t size, RawImage::DataType dstType, const T *src, void *dst)
|
||||
{
|
||||
switch(dstType)
|
||||
{
|
||||
@@ -514,7 +532,7 @@ void RawImage::convertToType(DataType type)
|
||||
allocate(m_width, m_height, m_channels, type);
|
||||
m_origType = origType;
|
||||
|
||||
uint32_t s = size() * m_ch;
|
||||
size_t s = size() * m_ch;
|
||||
switch(m_origType)
|
||||
{
|
||||
case UINT8:
|
||||
@@ -656,15 +674,15 @@ void boxResample(uint32_t w, uint32_t h, uint32_t ch, uint32_t oldw, uint32_t ol
|
||||
|
||||
float sx = (float)w / oldw;
|
||||
float sy = (float)h / oldh;
|
||||
for(uint32_t y = 0; y < h; y++)//iterate over destination Y
|
||||
for(uint64_t y = 0; y < h; y++)//iterate over destination Y
|
||||
{
|
||||
for(uint32_t x = 0; x < w; x++)//iterate over destination X
|
||||
for(uint64_t x = 0; x < w; x++)//iterate over destination X
|
||||
{
|
||||
U p[4] = {0.0f};
|
||||
uint32_t xx = x * oldw / w;//calculate source rect
|
||||
uint32_t yy = y * oldh / h;
|
||||
uint32_t xe = std::min((x + 1) * oldw / w, oldw - 1);
|
||||
uint32_t ye = std::min((y + 1) * oldh / h, oldh - 1);
|
||||
uint64_t xx = x * oldw / w;//calculate source rect
|
||||
uint64_t yy = y * oldh / h;
|
||||
uint64_t xe = std::min((x + 1) * oldw / w, (uint64_t)oldw - 1);
|
||||
uint64_t ye = std::min((y + 1) * oldh / h, (uint64_t)oldh - 1);
|
||||
for(uint32_t o = yy; o <= ye; o++)//iterate over source Y
|
||||
{
|
||||
float cy = o * sy - y;
|
||||
|
||||
+1
-1
@@ -89,7 +89,7 @@ public:
|
||||
uint32_t width() const;
|
||||
uint32_t height() const;
|
||||
uint32_t channels() const;
|
||||
uint32_t size() const;
|
||||
uint64_t size() const;
|
||||
DataType type() const;
|
||||
uint32_t norm() const;
|
||||
uint32_t widthBytes() const;
|
||||
|
||||
Reference in New Issue
Block a user