Add custom implementation of half float

This commit is contained in:
2025-03-06 15:35:12 +01:00
parent 7b70b6cce5
commit 05b0aa9a2f
3 changed files with 90 additions and 8 deletions
+28 -8
View File
@@ -1,6 +1,7 @@
#include "rawimage.h"
#include <cstring>
#include <lcms2.h>
#include <algorithm>
#ifndef NO_QT
#include <QDebug>
#include <QElapsedTimer>
@@ -8,9 +9,16 @@
#include <QColorSpace>
using F16 = qfloat16;
#else
#include <algorithm>
#define __STDC_WANT_IEC_60559_TYPES_EXT__
#include <float.h>
#ifdef FLT16_MAX
using F16 = _Float16;
#endif
#else
#include "tfloat16.h"
using F16 = TFloat16;// this is only for MXE
#endif // FLT16_MAX
#endif // NO_QT
int THUMB_SIZE = 128;
int THUMB_SIZE_BORDER = 138;
@@ -464,13 +472,25 @@ void RawImage::convertToThumbnail()
if(m_channels == 1)
{
out[idx] = out[idx + 1] = out[idx + 2] = (F16)(in[idx2] * scale);
if(scale == 1.0f)
out[idx] = out[idx + 1] = out[idx + 2] = (F16)(in[idx2]);
else
out[idx] = out[idx + 1] = out[idx + 2] = (F16)(in[idx2] * scale);
}
else
{
out[idx] = (F16)(in[idx2] * scale);
out[idx + 1] = (F16)(in[idx2 + 1] * scale);
out[idx + 2] = (F16)(in[idx2 + 2] * scale);
if(scale == 1.0f)
{
out[idx] = (F16)(in[idx2]);
out[idx + 1] = (F16)(in[idx2 + 1]);
out[idx + 2] = (F16)(in[idx2 + 2]);
}
else
{
out[idx] = (F16)(in[idx2] * scale);
out[idx + 1] = (F16)(in[idx2 + 1] * scale);
out[idx + 2] = (F16)(in[idx2 + 2] * scale);
}
}
out[idx + 3] = (F16)1.0f;
}
@@ -546,9 +566,9 @@ void convertType2(size_t size, const T *src, U *dst)
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());
float scale = (float)(1.0 / (double)std::numeric_limits<T>::max());
for(size_t i = 0; i < size; i++)
dst[i] = (U)src[i] * scale;
dst[i] = (U)(src[i] * scale);
}
}