MayaFlux 0.5.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ normalize_range_inplace()

MAYAFLUX_API void MayaFlux::Kinesis::Vision::normalize_range_inplace ( std::span< float >  data,
float  lo,
float  hi 
)

Clamp and remap values from [lo, hi] to [0, 1] in-place.

Values outside [lo, hi] are clamped before remapping.

Parameters
dataFloat span to remap in-place.
loInput range lower bound.
hiInput range upper bound.

Definition at line 398 of file PixelOps.cpp.

399{
400 if (lo == hi)
401 return;
402
403 const float inv = 1.0F / (hi - lo);
404 float* out = data.data();
405 const size_t n = data.size();
406
407#ifdef MAYAFLUX_ARCH_X64
408 const __m256 v_lo = _mm256_set1_ps(lo);
409 const __m256 v_inv = _mm256_set1_ps(inv);
410 const __m256 v_zero = _mm256_setzero_ps();
411 const __m256 v_one = _mm256_set1_ps(1.0F);
412 size_t i = 0;
413 for (; i + 8 <= n; i += 8) {
414 __m256 v = _mm256_loadu_ps(out + i);
415 v = _mm256_mul_ps(_mm256_sub_ps(v, v_lo), v_inv);
416 v = _mm256_min_ps(_mm256_max_ps(v, v_zero), v_one);
417 _mm256_storeu_ps(out + i, v);
418 }
419 for (; i < n; ++i)
420 out[i] = std::clamp((out[i] - lo) * inv, 0.0F, 1.0F);
421
422#elif defined(MAYAFLUX_ARCH_ARM64)
423 const float32x4_t v_lo = vdupq_n_f32(lo);
424 const float32x4_t v_inv = vdupq_n_f32(inv);
425 const float32x4_t v_zero = vdupq_n_f32(0.0F);
426 const float32x4_t v_one = vdupq_n_f32(1.0F);
427 size_t i = 0;
428 for (; i + 4 <= n; i += 4) {
429 float32x4_t v = vld1q_f32(out + i);
430 v = vmulq_f32(vsubq_f32(v, v_lo), v_inv);
431 v = vminq_f32(vmaxq_f32(v, v_zero), v_one);
432 vst1q_f32(out + i, v);
433 }
434 for (; i < n; ++i)
435 out[i] = std::clamp((out[i] - lo) * inv, 0.0F, 1.0F);
436
437#else
438 P::transform(P::par_unseq, data.begin(), data.end(), data.begin(),
439 [lo, inv](float v) { return std::clamp((v - lo) * inv, 0.0F, 1.0F); });
440#endif
441}
float lo
float hi

References hi, and lo.