summaryrefslogtreecommitdiff
path: root/testsuite/backend/genesys/tests_image.cpp
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2020-02-02 17:14:32 +0100
committerJörg Frings-Fürst <debian@jff-webhosting.net>2020-02-02 17:14:32 +0100
commit5dadc28ea784db1ba1f56c2ea8618d2db67af1c8 (patch)
tree808b2499b54563b3290f34d70d159b1024310873 /testsuite/backend/genesys/tests_image.cpp
parent5bb4cf12855ec0151de15d6c5a2354ff08766957 (diff)
parent3dade5db2a37543f19f0967901d8d80a52a1e459 (diff)
Merge branch 'feature/upstream' into develop
Diffstat (limited to 'testsuite/backend/genesys/tests_image.cpp')
-rw-r--r--testsuite/backend/genesys/tests_image.cpp576
1 files changed, 576 insertions, 0 deletions
diff --git a/testsuite/backend/genesys/tests_image.cpp b/testsuite/backend/genesys/tests_image.cpp
new file mode 100644
index 0000000..bc8b923
--- /dev/null
+++ b/testsuite/backend/genesys/tests_image.cpp
@@ -0,0 +1,576 @@
+/* sane - Scanner Access Now Easy.
+
+ Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+*/
+
+#define DEBUG_DECLARE_ONLY
+
+#include "tests.h"
+#include "minigtest.h"
+#include "tests_printers.h"
+
+#include "../../../backend/genesys/image.h"
+#include "../../../backend/genesys/image_pipeline.h"
+#include <vector>
+
+namespace genesys {
+
+void test_get_pixel_from_row()
+{
+ std::vector<std::uint8_t> data = {
+ 0x12, 0x34, 0x56, 0x67, 0x89, 0xab,
+ 0xcd, 0xef, 0x21, 0x43, 0x65, 0x87
+ };
+ ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::I1),
+ Pixel(0, 0, 0));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 3, PixelFormat::I1),
+ Pixel(0xffff, 0xffff, 0xffff));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::RGB111),
+ Pixel(0, 0, 0));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::RGB111),
+ Pixel(0xffff, 0, 0));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 2, PixelFormat::RGB111),
+ Pixel(0xffff, 0, 0));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 3, PixelFormat::RGB111),
+ Pixel(0, 0xffff, 0xffff));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::I8),
+ Pixel(0x1212, 0x1212, 0x1212));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::I8),
+ Pixel(0x3434, 0x3434, 0x3434));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::RGB888),
+ Pixel(0x1212, 0x3434, 0x5656));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::RGB888),
+ Pixel(0x6767, 0x8989, 0xabab));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::BGR888),
+ Pixel(0x5656, 0x3434, 0x1212));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::BGR888),
+ Pixel(0xabab, 0x8989, 0x6767));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::I16),
+ Pixel(0x3412, 0x3412, 0x3412));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::I16),
+ Pixel(0x6756, 0x6756, 0x6756));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::RGB161616),
+ Pixel(0x3412, 0x6756, 0xab89));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::RGB161616),
+ Pixel(0xefcd, 0x4321, 0x8765));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::BGR161616),
+ Pixel(0xab89, 0x6756, 0x3412));
+ ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::BGR161616),
+ Pixel(0x8765, 0x4321, 0xefcd));
+}
+
+void test_set_pixel_to_row()
+{
+ using Data = std::vector<std::uint8_t>;
+ Data data;
+ data.resize(12, 0);
+
+ auto reset = [&]() { std::fill(data.begin(), data.end(), 0); };
+
+ Pixel pixel;
+
+ pixel = Pixel(0x8000, 0x8000, 0x8000);
+ set_pixel_to_row(data.data(), 0, pixel, PixelFormat::I1);
+ ASSERT_EQ(data, Data({0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x8000, 0x8000, 0x8000);
+ set_pixel_to_row(data.data(), 2, pixel, PixelFormat::I1);
+ ASSERT_EQ(data, Data({0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x8000, 0x8000, 0x8000);
+ set_pixel_to_row(data.data(), 8, pixel, PixelFormat::I1);
+ ASSERT_EQ(data, Data({0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x8000, 0x0000, 0x8000);
+ set_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB111);
+ ASSERT_EQ(data, Data({0xa0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x8000, 0x0000, 0x8000);
+ set_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB111);
+ ASSERT_EQ(data, Data({0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x8000, 0x0000, 0x8000);
+ set_pixel_to_row(data.data(), 8, pixel, PixelFormat::RGB111);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0xa0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1200, 0x1200, 0x1200);
+ set_pixel_to_row(data.data(), 0, pixel, PixelFormat::I8);
+ ASSERT_EQ(data, Data({0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1200, 0x1200, 0x1200);
+ set_pixel_to_row(data.data(), 2, pixel, PixelFormat::I8);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1200, 0x3400, 0x5600);
+ set_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB888);
+ ASSERT_EQ(data, Data({0x12, 0x34, 0x56, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1200, 0x3400, 0x5600);
+ set_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB888);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x12, 0x34, 0x56,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1200, 0x3400, 0x5600);
+ set_pixel_to_row(data.data(), 0, pixel, PixelFormat::BGR888);
+ ASSERT_EQ(data, Data({0x56, 0x34, 0x12, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1200, 0x3400, 0x5600);
+ set_pixel_to_row(data.data(), 1, pixel, PixelFormat::BGR888);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x56, 0x34, 0x12,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1234, 0x1234, 0x1234);
+ set_pixel_to_row(data.data(), 0, pixel, PixelFormat::I16);
+ ASSERT_EQ(data, Data({0x34, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1234, 0x1234, 0x1234);
+ set_pixel_to_row(data.data(), 1, pixel, PixelFormat::I16);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x34, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1234, 0x5678, 0x9abc);
+ set_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB161616);
+ ASSERT_EQ(data, Data({0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1234, 0x5678, 0x9abc);
+ set_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB161616);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a}));
+ reset();
+
+ pixel = Pixel(0x1234, 0x5678, 0x9abc);
+ set_pixel_to_row(data.data(), 0, pixel, PixelFormat::BGR161616);
+ ASSERT_EQ(data, Data({0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1234, 0x5678, 0x9abc);
+ set_pixel_to_row(data.data(), 1, pixel, PixelFormat::BGR161616);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12}));
+ reset();
+}
+
+void test_get_raw_pixel_from_row()
+{
+ std::vector<std::uint8_t> data = {
+ 0x12, 0x34, 0x56, 0x67, 0x89, 0xab,
+ 0xcd, 0xef, 0x21, 0x43, 0x65, 0x87
+ };
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::I1),
+ RawPixel(0x0));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 3, PixelFormat::I1),
+ RawPixel(0x1));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::RGB111),
+ RawPixel(0));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::RGB111),
+ RawPixel(0x4));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 2, PixelFormat::RGB111),
+ RawPixel(0x4));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 3, PixelFormat::RGB111),
+ RawPixel(0x3));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::I8),
+ RawPixel(0x12));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::I8),
+ RawPixel(0x34));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::RGB888),
+ RawPixel(0x12, 0x34, 0x56));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::RGB888),
+ RawPixel(0x67, 0x89, 0xab));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::BGR888),
+ RawPixel(0x12, 0x34, 0x56));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::BGR888),
+ RawPixel(0x67, 0x89, 0xab));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::I16),
+ RawPixel(0x12, 0x34));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::I16),
+ RawPixel(0x56, 0x67));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::RGB161616),
+ RawPixel(0x12, 0x34, 0x56, 0x67, 0x89, 0xab));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::RGB161616),
+ RawPixel(0xcd, 0xef, 0x21, 0x43, 0x65, 0x87));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::BGR161616),
+ RawPixel(0x12, 0x34, 0x56, 0x67, 0x89, 0xab));
+ ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::BGR161616),
+ RawPixel(0xcd, 0xef, 0x21, 0x43, 0x65, 0x87));
+}
+
+void test_set_raw_pixel_to_row()
+{
+ using Data = std::vector<std::uint8_t>;
+ Data data;
+ data.resize(12, 0);
+
+ auto reset = [&]() { std::fill(data.begin(), data.end(), 0); };
+
+ RawPixel pixel;
+
+ pixel = RawPixel(0x01);
+ set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::I1);
+ ASSERT_EQ(data, Data({0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x01);
+ set_raw_pixel_to_row(data.data(), 2, pixel, PixelFormat::I1);
+ ASSERT_EQ(data, Data({0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x01);
+ set_raw_pixel_to_row(data.data(), 8, pixel, PixelFormat::I1);
+ ASSERT_EQ(data, Data({0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x05);
+ set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB111);
+ ASSERT_EQ(data, Data({0xa0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x05);
+ set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB111);
+ ASSERT_EQ(data, Data({0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x05);
+ set_raw_pixel_to_row(data.data(), 8, pixel, PixelFormat::RGB111);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0xa0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x12);
+ set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::I8);
+ ASSERT_EQ(data, Data({0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x12);
+ set_raw_pixel_to_row(data.data(), 2, pixel, PixelFormat::I8);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x12, 0x34, 0x56);
+ set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB888);
+ ASSERT_EQ(data, Data({0x12, 0x34, 0x56, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x12, 0x34, 0x56);
+ set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB888);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x12, 0x34, 0x56,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x12, 0x34, 0x56);
+ set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::BGR888);
+ ASSERT_EQ(data, Data({0x12, 0x34, 0x56, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x12, 0x34, 0x56);
+ set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::BGR888);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x12, 0x34, 0x56,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x34, 0x12);
+ set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::I16);
+ ASSERT_EQ(data, Data({0x34, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x34, 0x12);
+ set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::I16);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x34, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a);
+ set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB161616);
+ ASSERT_EQ(data, Data({0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a);
+ set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB161616);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a}));
+ reset();
+
+ pixel = RawPixel(0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a);
+ set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::BGR161616);
+ ASSERT_EQ(data, Data({0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = RawPixel(0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a);
+ set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::BGR161616);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a}));
+ reset();
+}
+
+void test_get_raw_channel_from_row()
+{
+ std::vector<std::uint8_t> data = {
+ 0x12, 0x34, 0x56, 0x67, 0x89, 0xab,
+ 0xcd, 0xef, 0x21, 0x43, 0x65, 0x87
+ };
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::I1), 0);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 3, 0, PixelFormat::I1), 1);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::RGB111), 0);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 1, PixelFormat::RGB111), 0);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 2, PixelFormat::RGB111), 0);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::RGB111), 1);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 1, PixelFormat::RGB111), 0);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 2, PixelFormat::RGB111), 0);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 2, 0, PixelFormat::RGB111), 1);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 2, 1, PixelFormat::RGB111), 0);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 2, 2, PixelFormat::RGB111), 0);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 3, 0, PixelFormat::RGB111), 0);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 3, 1, PixelFormat::RGB111), 1);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 3, 2, PixelFormat::RGB111), 1);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::I8), 0x12);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::I8), 0x34);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::RGB888), 0x12);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 1, PixelFormat::RGB888), 0x34);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 2, PixelFormat::RGB888), 0x56);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::RGB888), 0x67);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 1, PixelFormat::RGB888), 0x89);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 2, PixelFormat::RGB888), 0xab);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::BGR888), 0x12);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 1, PixelFormat::BGR888), 0x34);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 2, PixelFormat::BGR888), 0x56);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::BGR888), 0x67);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 1, PixelFormat::BGR888), 0x89);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 2, PixelFormat::BGR888), 0xab);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::I16), 0x3412);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::I16), 0x6756);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::RGB161616), 0x3412);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 1, PixelFormat::RGB161616), 0x6756);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 2, PixelFormat::RGB161616), 0xab89);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::RGB161616), 0xefcd);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 1, PixelFormat::RGB161616), 0x4321);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 2, PixelFormat::RGB161616), 0x8765);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::BGR161616), 0x3412);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 1, PixelFormat::BGR161616), 0x6756);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 2, PixelFormat::BGR161616), 0xab89);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::BGR161616), 0xefcd);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 1, PixelFormat::BGR161616), 0x4321);
+ ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 2, PixelFormat::BGR161616), 0x8765);
+}
+
+void test_set_raw_channel_to_row()
+{
+ using Data = std::vector<std::uint8_t>;
+ Data data;
+ data.resize(12, 0);
+
+ auto reset = [&]() { std::fill(data.begin(), data.end(), 0); };
+
+ set_raw_channel_to_row(data.data(), 0, 0, 1, PixelFormat::I1);
+ ASSERT_EQ(data, Data({0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 2, 0, 1, PixelFormat::I1);
+ ASSERT_EQ(data, Data({0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 8, 0, 1, PixelFormat::I1);
+ ASSERT_EQ(data, Data({0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 0, 0, 1, PixelFormat::RGB111);
+ ASSERT_EQ(data, Data({0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 0, 1, 1, PixelFormat::RGB111);
+ ASSERT_EQ(data, Data({0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 0, 2, 1, PixelFormat::RGB111);
+ ASSERT_EQ(data, Data({0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 8, 0, 1, PixelFormat::RGB111);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 0, 0, 0x12, PixelFormat::I8);
+ ASSERT_EQ(data, Data({0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 2, 0, 0x12, PixelFormat::I8);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ for (auto format : { PixelFormat::RGB888, PixelFormat::BGR888 }) {
+ set_raw_channel_to_row(data.data(), 0, 0, 0x12, format);
+ ASSERT_EQ(data, Data({0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 0, 1, 0x12, format);
+ ASSERT_EQ(data, Data({0x00, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 0, 2, 0x12, format);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 1, 0, 0x12, format);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 1, 1, 0x12, format);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 1, 2, 0x12, format);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+ }
+
+ set_raw_channel_to_row(data.data(), 0, 0, 0x1234, PixelFormat::I16);
+ ASSERT_EQ(data, Data({0x34, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 1, 0, 0x1234, PixelFormat::I16);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x34, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ for (auto format : { PixelFormat::RGB161616, PixelFormat::BGR161616 }) {
+ set_raw_channel_to_row(data.data(), 0, 0, 0x1234, format);
+ ASSERT_EQ(data, Data({0x34, 0x12, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 0, 1, 0x1234, format);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x34, 0x12, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 0, 2, 0x1234, format);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x34, 0x12,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 1, 0, 0x1234, format);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x34, 0x12, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 1, 1, 0x1234, format);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x34, 0x12, 0x00, 0x00}));
+ reset();
+
+ set_raw_channel_to_row(data.data(), 1, 2, 0x1234, format);
+ ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x34, 0x12}));
+ reset();
+ }
+}
+
+void test_convert_pixel_row_format()
+{
+ // The actual work is done in set_channel_to_row and get_channel_from_row, so we don't need
+ // to test all format combinations.
+ using Data = std::vector<std::uint8_t>;
+
+ Data in_data = {
+ 0x12, 0x34, 0x56,
+ 0x78, 0x98, 0xab,
+ 0xcd, 0xef, 0x21,
+ };
+ Data out_data;
+ out_data.resize(in_data.size() * 2);
+
+ convert_pixel_row_format(in_data.data(), PixelFormat::RGB888,
+ out_data.data(), PixelFormat::BGR161616, 3);
+
+ Data expected_data = {
+ 0x56, 0x56, 0x34, 0x34, 0x12, 0x12,
+ 0xab, 0xab, 0x98, 0x98, 0x78, 0x78,
+ 0x21, 0x21, 0xef, 0xef, 0xcd, 0xcd,
+ };
+
+ ASSERT_EQ(out_data, expected_data);
+}
+
+void test_image()
+{
+ test_get_pixel_from_row();
+ test_set_pixel_to_row();
+ test_get_raw_pixel_from_row();
+ test_set_raw_pixel_to_row();
+ test_get_raw_channel_from_row();
+ test_set_raw_channel_to_row();
+ test_convert_pixel_row_format();
+}
+
+} // namespace genesys