From 9a7bfe8f710ec30960230701cd1eb8c083cb5d90 Mon Sep 17 00:00:00 2001 From: Christian Henning Date: Thu, 22 Mar 2018 10:22:34 -0400 Subject: [PATCH] generate indexed_image_view from two views --- .../toolbox/image_types/indexed_image.hpp | 30 +++++++++++++ toolbox/test/indexed_image_test.cpp | 45 +++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/include/boost/gil/extension/toolbox/image_types/indexed_image.hpp b/include/boost/gil/extension/toolbox/image_types/indexed_image.hpp index 3a41bd033..8c65c5c76 100644 --- a/include/boost/gil/extension/toolbox/image_types/indexed_image.hpp +++ b/include/boost/gil/extension/toolbox/image_types/indexed_image.hpp @@ -209,6 +209,36 @@ private: std::size_t _num_colors; }; +// build an indexed_image_view from two views +template +indexed_image_view +< + typename indexed_image_locator_type + < + typename Index_View::locator + , typename Palette_View::locator + >::type +> + view(Index_View iv, Palette_View pv) +{ + typedef indexed_image_view< + typename indexed_image_locator_type< + typename Index_View::locator + , typename Palette_View::locator + >::type + > view_t; + + typedef indexed_image_deref_fn< + typename Index_View::locator + , typename Palette_View::locator + > defer_fn_t; + + return view_t( + iv.dimensions() + , pv.dimensions().x + , view_t::locator(point_t(0, 0), point_t(1, 1), defer_fn_t(iv.xy_at(0, 0), pv.xy_at(0, 0))) + ); +} template< typename Index , typename Pixel diff --git a/toolbox/test/indexed_image_test.cpp b/toolbox/test/indexed_image_test.cpp index ef04ed66b..032e713aa 100644 --- a/toolbox/test/indexed_image_test.cpp +++ b/toolbox/test/indexed_image_test.cpp @@ -152,4 +152,49 @@ BOOST_AUTO_TEST_CASE( index_image_test ) } } +BOOST_AUTO_TEST_CASE(index_image_view_test) +{ + // generate some data + int width = 640; + int height = 480; + int num_colors = 3; + + // indices + vector indices(width * height, 2); + + // colors + vector palette(num_colors); + palette[0] = rgb8_pixel_t(10, 20, 30); + palette[1] = rgb8_pixel_t(40, 50, 60); + palette[2] = rgb8_pixel_t(70, 80, 90); + + // create image views from raw memory + typedef gray8_image_t::view_t::locator indices_loc_t; + typedef rgb8_image_t::view_t::locator palette_loc_t; + + + auto indices_view = interleaved_view(width, height + , (gray8_image_t::view_t::x_iterator) indices.data() + , width // row size in bytes + ); + + auto palette_view = interleaved_view(100, 1 + , (rgb8_image_t::view_t::x_iterator) palette.data() + , num_colors * 3 // row size in bytes + ); + + auto ii_view = view(indices_view, palette_view); + + auto p = ii_view(point_t(0, 0)); + auto q = *ii_view.at(point_t(0, 0)); + + assert(get_color(p, red_t()) == 70); + assert(get_color(p, green_t()) == 80); + assert(get_color(p, blue_t()) == 90); + + assert(get_color(q, red_t()) == 70); + assert(get_color(q, green_t()) == 80); + assert(get_color(q, blue_t()) == 90); +} + BOOST_AUTO_TEST_SUITE_END()