// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma // de Barcelona (UAB). // // This work is licensed under the terms of the MIT license. // For a copy, see . #pragma once #include "carla/image/BoostGil.h" #include "carla/image/ColorConverter.h" #include "carla/sensor/data/Color.h" #include "carla/sensor/data/ImageTmpl.h" #include namespace carla { namespace image { class ImageView { private: template using GrayPixelLayout = boost::gil::pixel::type, boost::gil::gray_layout_t>; template static auto MakeViewFromSensorImage(ImageT &image) { using namespace boost::gil; namespace sd = carla::sensor::data; static_assert( std::is_same::value, "Invalid pixel type"); static_assert( sizeof(sd::Color) == sizeof(DstPixelT), "Invalid pixel size"); return interleaved_view( image.GetWidth(), image.GetHeight(), reinterpret_cast(image.data()), sizeof(sd::Color) * image.GetWidth()); // row length in bytes. } public: template static auto MakeView(ImageT &image) { return boost::gil::view(image); } static auto MakeView(sensor::data::ImageTmpl &image) { return MakeViewFromSensorImage(image); } static auto MakeView(const sensor::data::ImageTmpl &image) { return MakeViewFromSensorImage(image); } template static auto MakeColorConvertedView(const SrcViewT &src, CC cc) { return _MakeColorConvertedView(src, cc); } template > static auto MakeColorConvertedView(const SrcViewT &src, ColorConverter::Depth cc) { return _MakeColorConvertedView(src, cc); } template > static auto MakeColorConvertedView(const SrcViewT &src, ColorConverter::LogarithmicDepth) { auto intermediate_view = _MakeColorConvertedView(src, ColorConverter::Depth()); return _MakeColorConvertedView(intermediate_view, ColorConverter::LogarithmicLinear()); } template static auto MakeColorConvertedView(const SrcViewT &src, ColorConverter::CityScapesPalette cc) { return _MakeColorConvertedView(src, cc); } private: template struct color_converted_type { private: typedef boost::gil::color_convert_deref_fn deref_t; typedef typename SrcView::template add_deref add_ref_t; public: typedef typename add_ref_t::type type; static type make(const SrcView &sv, CC cc) { return add_ref_t::make(sv, deref_t(cc)); } }; template static auto _MakeColorConvertedView(const SrcViewT &src, CC cc) { return color_converted_type::make(src, cc); } }; } // namespace image } // namespace carla