diff --git a/preview/PreviewImage.cpp b/preview/PreviewImage.cpp index daef6864..b3841962 100644 --- a/preview/PreviewImage.cpp +++ b/preview/PreviewImage.cpp @@ -46,7 +46,6 @@ void PreviewImage::spot(std::vector &ret, int64_t in_xpixel, int64_t in_ypi void PreviewImage::roi(std::vector &ret, int64_t in_xpixel, int64_t in_ypixel, int64_t roi_number) const { color_pixel(ret, in_xpixel, in_ypixel, plotly[roi_number % 10]); } - template std::vector PreviewImage::GenerateRGB(const uint8_t *value_8, int64_t special_value_64, @@ -87,16 +86,32 @@ std::vector PreviewImage::GenerateRGB(const uint8_t *value_8, } + // LUT-based mapping (fast path) + const auto &lut = scale.LUTData(); + const int64_t lut_size = static_cast(lut.size()); + const float lut_scale = static_cast(lut_size - 1); + const float inv_range = (foreground > background) + ? (lut_scale / (foreground - background)) + : 0.0f; + + const rgb gap_color = scale.Apply(ColorScaleSpecial::Gap); + const rgb bad_color = scale.Apply(ColorScaleSpecial::BadPixel); + std::vector ret(xpixel * ypixel); - for (int i = 0; i < xpixel*ypixel; i++) { - if (mask[i] == MaskGap) - ret[i] = scale.Apply(ColorScaleSpecial::Gap); - else if ((value[i] == special_value) - || (mask[i] == MaskDet) - || (settings.show_user_mask && (mask[i] == MaskUsr))) { - ret[i] = scale.Apply(ColorScaleSpecial::BadPixel); - } else - ret[i] = scale.Apply(value[i], background, foreground); + for (int i = 0; i < xpixel * ypixel; i++) { + if (mask[i] == MaskGap) { + ret[i] = gap_color; + } else if ((value[i] == special_value) + || (mask[i] == MaskDet) + || (settings.show_user_mask && (mask[i] == MaskUsr))) { + ret[i] = bad_color; + } else { + const float v = static_cast(value[i]); + int64_t idx = static_cast((v - background) * inv_range + 0.5f); + if (idx < 0) idx = 0; + else if (idx >= lut_size) idx = lut_size - 1; + ret[i] = lut[idx]; + } } return ret; }