// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #ifndef JUNGFRAUJOCH_PREVIEWIMAGE_H #define JUNGFRAUJOCH_PREVIEWIMAGE_H #include #include #include "../common/SpotToSave.h" #include "../common/DiffractionExperiment.h" #include "../common/PixelMask.h" #include "PreviewCounter.h" #include "../common/ColorScale.h" enum class PreviewImageFormat {JPEG, TIFF}; struct PreviewImageSettings { std::optional saturation_value = 10; std::optional background_value = 0; int64_t jpeg_quality = 70; bool show_beam_center = true; bool show_spots = true; bool show_roi = false; bool show_user_mask = true; bool show_res_est = false; std::optional resolution_ring; ColorScaleEnum scale = ColorScaleEnum::Indigo; PreviewImageFormat format = PreviewImageFormat::JPEG; }; class PreviewImage { mutable std::mutex m; DiffractionExperiment experiment; std::vector mask; std::vector spots; size_t xpixel = 0; size_t ypixel = 0; size_t pixel_depth_bytes = 2; bool pixel_is_signed = false; float beam_x = 0; float beam_y = 0; constexpr static uint8_t MaskGap = 1; constexpr static uint8_t MaskUsr = 2; constexpr static uint8_t MaskDet = 3; constexpr static float auto_foreground_range = 0.001f; template std::vector GenerateRGB(const uint8_t* value, int64_t special_value, int64_t sat_value, const ColorScale &scale, const PreviewImageSettings& settings) const; std::vector GenerateRGB(const PreviewImageSettings& settings, const DataMessage &msg) const; void AddResolutionRing(std::vector &rgb_image, float d) const; void AddBeamCenter(std::vector &rgb_image) const; void AddSpots(std::vector &rgb_image, const std::vector& spots) const; void AddROI(std::vector &rgb_image) const; void color_pixel(std::vector& ret, int64_t xpixel, int64_t ypixel, const rgb &color) const; void spot(std::vector& ret, int64_t xpixel, int64_t ypixel, const rgb &color) const; void roi(std::vector& ret, int64_t xpixel, int64_t ypixel, int64_t roi_number) const; std::string GenerateImage(const PreviewImageSettings& settings, const DataMessage &msg) const; public: void Configure(const DiffractionExperiment& experiment, const PixelMask& mask); void Configure(); [[nodiscard]] std::string GenerateImage(const PreviewImageSettings& settings, const std::vector& cbor_format); [[nodiscard]] static std::string GenerateTIFF(const std::vector& cbor_format) ; }; #endif //JUNGFRAUJOCH_PREVIEWIMAGE_H