191{
192 std::visit(
193 [&](auto& vec) {
194 using T = typename std::decay_t<decltype(vec)>::value_type;
195
196 if constexpr (std::is_same_v<T, uint8_t>
197 || std::is_same_v<T, uint16_t>
198 || std::is_same_v<T, float>) {
199
200 if (elem_index >= vec.size())
201 return;
202
203 double raw {};
204
205 if (range) {
206 if (std::isnan(
value)) {
207 if (!range->invalid)
208 return;
209 raw = *range->invalid;
210 } else {
211 raw = range->min
212 + std::clamp(
value, 0.0, 1.0) * (range->max - range->min);
213 }
214 } else if constexpr (std::is_same_v<T, uint8_t>) {
215 raw = std::clamp(
value * 255.0, 0.0, 255.0);
216 } else if constexpr (std::is_same_v<T, uint16_t>) {
219 : std::clamp(
value * 65535.0, 0.0, 65535.0);
220 } else {
222 }
223
224 if constexpr (std::is_same_v<T, uint8_t>) {
225 vec[elem_index] = static_cast<uint8_t>(std::clamp(raw, 0.0, 255.0));
226 } else if constexpr (std::is_same_v<T, uint16_t>) {
228 vec[elem_index] = encode_half(static_cast<float>(raw));
229 } else {
230 vec[elem_index] = static_cast<uint16_t>(std::clamp(raw, 0.0, 65535.0));
231 }
232 } else {
233 vec[elem_index] = static_cast<float>(raw);
234 }
235 }
236 },
237 v);
238}
bool is_float_format(ImageFormat format)