1 /* sane - Scanner Access Now Easy.
2 
3    Copyright (C) 2019 Povilas Kanapickas <povilas@radix.lt>
4 
5    This file is part of the SANE package.
6 
7    This program is free software; you can redistribute it and/or
8    modify it under the terms of the GNU General Public License as
9    published by the Free Software Foundation; either version 2 of the
10    License, or (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <https://www.gnu.org/licenses/>.
19 */
20 
21 #define DEBUG_DECLARE_ONLY
22 
23 #include "tests.h"
24 #include "tests_printers.h"
25 #include "minigtest.h"
26 
27 #include "../../../backend/genesys/image.h"
28 #include "../../../backend/genesys/image_pipeline.h"
29 #include <vector>
30 
31 namespace genesys {
32 
test_get_pixel_from_row()33 void test_get_pixel_from_row()
34 {
35     std::vector<std::uint8_t> data = {
36         0x12, 0x34, 0x56, 0x67, 0x89, 0xab,
37         0xcd, 0xef, 0x21, 0x43, 0x65, 0x87
38     };
39     ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::I1),
40               Pixel(0, 0, 0));
41     ASSERT_EQ(get_pixel_from_row(data.data(), 3, PixelFormat::I1),
42               Pixel(0xffff, 0xffff, 0xffff));
43     ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::RGB111),
44               Pixel(0, 0, 0));
45     ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::RGB111),
46               Pixel(0xffff, 0, 0));
47     ASSERT_EQ(get_pixel_from_row(data.data(), 2, PixelFormat::RGB111),
48               Pixel(0xffff, 0, 0));
49     ASSERT_EQ(get_pixel_from_row(data.data(), 3, PixelFormat::RGB111),
50               Pixel(0, 0xffff, 0xffff));
51     ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::I8),
52               Pixel(0x1212, 0x1212, 0x1212));
53     ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::I8),
54               Pixel(0x3434, 0x3434, 0x3434));
55     ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::RGB888),
56               Pixel(0x1212, 0x3434, 0x5656));
57     ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::RGB888),
58               Pixel(0x6767, 0x8989, 0xabab));
59     ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::BGR888),
60               Pixel(0x5656, 0x3434, 0x1212));
61     ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::BGR888),
62               Pixel(0xabab, 0x8989, 0x6767));
63     ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::I16),
64               Pixel(0x3412, 0x3412, 0x3412));
65     ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::I16),
66               Pixel(0x6756, 0x6756, 0x6756));
67     ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::RGB161616),
68               Pixel(0x3412, 0x6756, 0xab89));
69     ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::RGB161616),
70               Pixel(0xefcd, 0x4321, 0x8765));
71     ASSERT_EQ(get_pixel_from_row(data.data(), 0, PixelFormat::BGR161616),
72               Pixel(0xab89, 0x6756, 0x3412));
73     ASSERT_EQ(get_pixel_from_row(data.data(), 1, PixelFormat::BGR161616),
74               Pixel(0x8765, 0x4321, 0xefcd));
75 }
76 
test_set_pixel_to_row()77 void test_set_pixel_to_row()
78 {
79     using Data = std::vector<std::uint8_t>;
80     Data data;
81     data.resize(12, 0);
82 
83     auto reset = [&]() { std::fill(data.begin(), data.end(), 0); };
84 
85     Pixel pixel;
86 
87     pixel = Pixel(0x8000, 0x8000, 0x8000);
88     set_pixel_to_row(data.data(), 0, pixel, PixelFormat::I1);
89     ASSERT_EQ(data, Data({0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
90                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
91     reset();
92 
93     pixel = Pixel(0x8000, 0x8000, 0x8000);
94     set_pixel_to_row(data.data(), 2, pixel, PixelFormat::I1);
95     ASSERT_EQ(data, Data({0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
96                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
97     reset();
98 
99     pixel = Pixel(0x8000, 0x8000, 0x8000);
100     set_pixel_to_row(data.data(), 8, pixel, PixelFormat::I1);
101     ASSERT_EQ(data, Data({0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
102                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
103     reset();
104 
105     pixel = Pixel(0x8000, 0x0000, 0x8000);
106     set_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB111);
107     ASSERT_EQ(data, Data({0xa0, 0x00, 0x00, 0x00, 0x00, 0x00,
108                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
109     reset();
110 
111     pixel = Pixel(0x8000, 0x0000, 0x8000);
112     set_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB111);
113     ASSERT_EQ(data, Data({0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
114                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
115     reset();
116 
117     pixel = Pixel(0x8000, 0x0000, 0x8000);
118     set_pixel_to_row(data.data(), 8, pixel, PixelFormat::RGB111);
119     ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0xa0, 0x00, 0x00,
120                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
121     reset();
122 
123     pixel = Pixel(0x1200, 0x1200, 0x1200);
124     set_pixel_to_row(data.data(), 0, pixel, PixelFormat::I8);
125     ASSERT_EQ(data, Data({0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
126                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
127     reset();
128 
129     pixel = Pixel(0x1200, 0x1200, 0x1200);
130     set_pixel_to_row(data.data(), 2, pixel, PixelFormat::I8);
131     ASSERT_EQ(data, Data({0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
132                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
133     reset();
134 
135     pixel = Pixel(0x1200, 0x3400, 0x5600);
136     set_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB888);
137     ASSERT_EQ(data, Data({0x12, 0x34, 0x56, 0x00, 0x00, 0x00,
138                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
139     reset();
140 
141     pixel = Pixel(0x1200, 0x3400, 0x5600);
142     set_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB888);
143     ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x12, 0x34, 0x56,
144                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
145     reset();
146 
147     pixel = Pixel(0x1200, 0x3400, 0x5600);
148     set_pixel_to_row(data.data(), 0, pixel, PixelFormat::BGR888);
149     ASSERT_EQ(data, Data({0x56, 0x34, 0x12, 0x00, 0x00, 0x00,
150                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
151     reset();
152 
153     pixel = Pixel(0x1200, 0x3400, 0x5600);
154     set_pixel_to_row(data.data(), 1, pixel, PixelFormat::BGR888);
155     ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x56, 0x34, 0x12,
156                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
157     reset();
158 
159     pixel = Pixel(0x1234, 0x1234, 0x1234);
160     set_pixel_to_row(data.data(), 0, pixel, PixelFormat::I16);
161     ASSERT_EQ(data, Data({0x34, 0x12, 0x00, 0x00, 0x00, 0x00,
162                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
163     reset();
164 
165     pixel = Pixel(0x1234, 0x1234, 0x1234);
166     set_pixel_to_row(data.data(), 1, pixel, PixelFormat::I16);
167     ASSERT_EQ(data, Data({0x00, 0x00, 0x34, 0x12, 0x00, 0x00,
168                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
169     reset();
170 
171     pixel = Pixel(0x1234, 0x5678, 0x9abc);
172     set_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB161616);
173     ASSERT_EQ(data, Data({0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a,
174                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
175     reset();
176 
177     pixel = Pixel(0x1234, 0x5678, 0x9abc);
178     set_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB161616);
179     ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180                           0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a}));
181     reset();
182 
183     pixel = Pixel(0x1234, 0x5678, 0x9abc);
184     set_pixel_to_row(data.data(), 0, pixel, PixelFormat::BGR161616);
185     ASSERT_EQ(data, Data({0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12,
186                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
187     reset();
188 
189     pixel = Pixel(0x1234, 0x5678, 0x9abc);
190     set_pixel_to_row(data.data(), 1, pixel, PixelFormat::BGR161616);
191     ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192                           0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12}));
193     reset();
194 }
195 
test_get_raw_pixel_from_row()196 void test_get_raw_pixel_from_row()
197 {
198     std::vector<std::uint8_t> data = {
199         0x12, 0x34, 0x56, 0x67, 0x89, 0xab,
200         0xcd, 0xef, 0x21, 0x43, 0x65, 0x87
201     };
202     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::I1),
203               RawPixel(0x0));
204     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 3, PixelFormat::I1),
205               RawPixel(0x1));
206     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::RGB111),
207               RawPixel(0));
208     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::RGB111),
209               RawPixel(0x4));
210     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 2, PixelFormat::RGB111),
211               RawPixel(0x4));
212     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 3, PixelFormat::RGB111),
213               RawPixel(0x3));
214     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::I8),
215               RawPixel(0x12));
216     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::I8),
217               RawPixel(0x34));
218     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::RGB888),
219               RawPixel(0x12, 0x34, 0x56));
220     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::RGB888),
221               RawPixel(0x67, 0x89, 0xab));
222     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::BGR888),
223               RawPixel(0x12, 0x34, 0x56));
224     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::BGR888),
225               RawPixel(0x67, 0x89, 0xab));
226     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::I16),
227               RawPixel(0x12, 0x34));
228     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::I16),
229               RawPixel(0x56, 0x67));
230     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::RGB161616),
231               RawPixel(0x12, 0x34, 0x56, 0x67, 0x89, 0xab));
232     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::RGB161616),
233               RawPixel(0xcd, 0xef, 0x21, 0x43, 0x65, 0x87));
234     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 0, PixelFormat::BGR161616),
235               RawPixel(0x12, 0x34, 0x56, 0x67, 0x89, 0xab));
236     ASSERT_EQ(get_raw_pixel_from_row(data.data(), 1, PixelFormat::BGR161616),
237               RawPixel(0xcd, 0xef, 0x21, 0x43, 0x65, 0x87));
238 }
239 
test_set_raw_pixel_to_row()240 void test_set_raw_pixel_to_row()
241 {
242     using Data = std::vector<std::uint8_t>;
243     Data data;
244     data.resize(12, 0);
245 
246     auto reset = [&]() { std::fill(data.begin(), data.end(), 0); };
247 
248     RawPixel pixel;
249 
250     pixel = RawPixel(0x01);
251     set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::I1);
252     ASSERT_EQ(data, Data({0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
253                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
254     reset();
255 
256     pixel = RawPixel(0x01);
257     set_raw_pixel_to_row(data.data(), 2, pixel, PixelFormat::I1);
258     ASSERT_EQ(data, Data({0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
259                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
260     reset();
261 
262     pixel = RawPixel(0x01);
263     set_raw_pixel_to_row(data.data(), 8, pixel, PixelFormat::I1);
264     ASSERT_EQ(data, Data({0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
265                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
266     reset();
267 
268     pixel = RawPixel(0x05);
269     set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB111);
270     ASSERT_EQ(data, Data({0xa0, 0x00, 0x00, 0x00, 0x00, 0x00,
271                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
272     reset();
273 
274     pixel = RawPixel(0x05);
275     set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB111);
276     ASSERT_EQ(data, Data({0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
277                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
278     reset();
279 
280     pixel = RawPixel(0x05);
281     set_raw_pixel_to_row(data.data(), 8, pixel, PixelFormat::RGB111);
282     ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0xa0, 0x00, 0x00,
283                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
284     reset();
285 
286     pixel = RawPixel(0x12);
287     set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::I8);
288     ASSERT_EQ(data, Data({0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
289                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
290     reset();
291 
292     pixel = RawPixel(0x12);
293     set_raw_pixel_to_row(data.data(), 2, pixel, PixelFormat::I8);
294     ASSERT_EQ(data, Data({0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
295                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
296     reset();
297 
298     pixel = RawPixel(0x12, 0x34, 0x56);
299     set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB888);
300     ASSERT_EQ(data, Data({0x12, 0x34, 0x56, 0x00, 0x00, 0x00,
301                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
302     reset();
303 
304     pixel = RawPixel(0x12, 0x34, 0x56);
305     set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB888);
306     ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x12, 0x34, 0x56,
307                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
308     reset();
309 
310     pixel = RawPixel(0x12, 0x34, 0x56);
311     set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::BGR888);
312     ASSERT_EQ(data, Data({0x12, 0x34, 0x56, 0x00, 0x00, 0x00,
313                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
314     reset();
315 
316     pixel = RawPixel(0x12, 0x34, 0x56);
317     set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::BGR888);
318     ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x12, 0x34, 0x56,
319                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
320     reset();
321 
322     pixel = RawPixel(0x34, 0x12);
323     set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::I16);
324     ASSERT_EQ(data, Data({0x34, 0x12, 0x00, 0x00, 0x00, 0x00,
325                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
326     reset();
327 
328     pixel = RawPixel(0x34, 0x12);
329     set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::I16);
330     ASSERT_EQ(data, Data({0x00, 0x00, 0x34, 0x12, 0x00, 0x00,
331                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
332     reset();
333 
334     pixel = RawPixel(0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a);
335     set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::RGB161616);
336     ASSERT_EQ(data, Data({0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a,
337                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
338     reset();
339 
340     pixel = RawPixel(0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a);
341     set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::RGB161616);
342     ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343                           0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a}));
344     reset();
345 
346     pixel = RawPixel(0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a);
347     set_raw_pixel_to_row(data.data(), 0, pixel, PixelFormat::BGR161616);
348     ASSERT_EQ(data, Data({0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a,
349                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
350     reset();
351 
352     pixel = RawPixel(0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a);
353     set_raw_pixel_to_row(data.data(), 1, pixel, PixelFormat::BGR161616);
354     ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355                           0x34, 0x12, 0x78, 0x56, 0xbc, 0x9a}));
356     reset();
357 }
358 
test_get_raw_channel_from_row()359 void test_get_raw_channel_from_row()
360 {
361     std::vector<std::uint8_t> data = {
362         0x12, 0x34, 0x56, 0x67, 0x89, 0xab,
363         0xcd, 0xef, 0x21, 0x43, 0x65, 0x87
364     };
365     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::I1), 0);
366     ASSERT_EQ(get_raw_channel_from_row(data.data(), 3, 0, PixelFormat::I1), 1);
367     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::RGB111), 0);
368     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 1, PixelFormat::RGB111), 0);
369     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 2, PixelFormat::RGB111), 0);
370     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::RGB111), 1);
371     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 1, PixelFormat::RGB111), 0);
372     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 2, PixelFormat::RGB111), 0);
373     ASSERT_EQ(get_raw_channel_from_row(data.data(), 2, 0, PixelFormat::RGB111), 1);
374     ASSERT_EQ(get_raw_channel_from_row(data.data(), 2, 1, PixelFormat::RGB111), 0);
375     ASSERT_EQ(get_raw_channel_from_row(data.data(), 2, 2, PixelFormat::RGB111), 0);
376     ASSERT_EQ(get_raw_channel_from_row(data.data(), 3, 0, PixelFormat::RGB111), 0);
377     ASSERT_EQ(get_raw_channel_from_row(data.data(), 3, 1, PixelFormat::RGB111), 1);
378     ASSERT_EQ(get_raw_channel_from_row(data.data(), 3, 2, PixelFormat::RGB111), 1);
379     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::I8), 0x12);
380     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::I8), 0x34);
381     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::RGB888), 0x12);
382     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 1, PixelFormat::RGB888), 0x34);
383     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 2, PixelFormat::RGB888), 0x56);
384     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::RGB888), 0x67);
385     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 1, PixelFormat::RGB888), 0x89);
386     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 2, PixelFormat::RGB888), 0xab);
387     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::BGR888), 0x12);
388     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 1, PixelFormat::BGR888), 0x34);
389     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 2, PixelFormat::BGR888), 0x56);
390     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::BGR888), 0x67);
391     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 1, PixelFormat::BGR888), 0x89);
392     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 2, PixelFormat::BGR888), 0xab);
393     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::I16), 0x3412);
394     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::I16), 0x6756);
395     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::RGB161616), 0x3412);
396     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 1, PixelFormat::RGB161616), 0x6756);
397     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 2, PixelFormat::RGB161616), 0xab89);
398     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::RGB161616), 0xefcd);
399     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 1, PixelFormat::RGB161616), 0x4321);
400     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 2, PixelFormat::RGB161616), 0x8765);
401     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 0, PixelFormat::BGR161616), 0x3412);
402     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 1, PixelFormat::BGR161616), 0x6756);
403     ASSERT_EQ(get_raw_channel_from_row(data.data(), 0, 2, PixelFormat::BGR161616), 0xab89);
404     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 0, PixelFormat::BGR161616), 0xefcd);
405     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 1, PixelFormat::BGR161616), 0x4321);
406     ASSERT_EQ(get_raw_channel_from_row(data.data(), 1, 2, PixelFormat::BGR161616), 0x8765);
407 }
408 
test_set_raw_channel_to_row()409 void test_set_raw_channel_to_row()
410 {
411     using Data = std::vector<std::uint8_t>;
412     Data data;
413     data.resize(12, 0);
414 
415     auto reset = [&]() { std::fill(data.begin(), data.end(), 0); };
416 
417     set_raw_channel_to_row(data.data(), 0, 0, 1, PixelFormat::I1);
418     ASSERT_EQ(data, Data({0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
419                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
420     reset();
421 
422     set_raw_channel_to_row(data.data(), 2, 0, 1, PixelFormat::I1);
423     ASSERT_EQ(data, Data({0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
424                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
425     reset();
426 
427     set_raw_channel_to_row(data.data(), 8, 0, 1, PixelFormat::I1);
428     ASSERT_EQ(data, Data({0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
429                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
430     reset();
431 
432     set_raw_channel_to_row(data.data(), 0, 0, 1, PixelFormat::RGB111);
433     ASSERT_EQ(data, Data({0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
434                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
435     reset();
436 
437     set_raw_channel_to_row(data.data(), 0, 1, 1, PixelFormat::RGB111);
438     ASSERT_EQ(data, Data({0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
439                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
440     reset();
441 
442     set_raw_channel_to_row(data.data(), 0, 2, 1, PixelFormat::RGB111);
443     ASSERT_EQ(data, Data({0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
444                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
445     reset();
446 
447     set_raw_channel_to_row(data.data(), 8, 0, 1, PixelFormat::RGB111);
448     ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
449                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
450     reset();
451 
452     set_raw_channel_to_row(data.data(), 0, 0, 0x12, PixelFormat::I8);
453     ASSERT_EQ(data, Data({0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
454                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
455     reset();
456 
457     set_raw_channel_to_row(data.data(), 2, 0, 0x12, PixelFormat::I8);
458     ASSERT_EQ(data, Data({0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
459                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
460     reset();
461 
462     for (auto format : { PixelFormat::RGB888, PixelFormat::BGR888 }) {
463         set_raw_channel_to_row(data.data(), 0, 0, 0x12, format);
464         ASSERT_EQ(data, Data({0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
465                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
466         reset();
467 
468         set_raw_channel_to_row(data.data(), 0, 1, 0x12, format);
469         ASSERT_EQ(data, Data({0x00, 0x12, 0x00, 0x00, 0x00, 0x00,
470                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
471         reset();
472 
473         set_raw_channel_to_row(data.data(), 0, 2, 0x12, format);
474         ASSERT_EQ(data, Data({0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
475                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
476         reset();
477 
478         set_raw_channel_to_row(data.data(), 1, 0, 0x12, format);
479         ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x12, 0x00, 0x00,
480                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
481         reset();
482 
483         set_raw_channel_to_row(data.data(), 1, 1, 0x12, format);
484         ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x12, 0x00,
485                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
486         reset();
487 
488         set_raw_channel_to_row(data.data(), 1, 2, 0x12, format);
489         ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x12,
490                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
491         reset();
492     }
493 
494     set_raw_channel_to_row(data.data(), 0, 0, 0x1234, PixelFormat::I16);
495     ASSERT_EQ(data, Data({0x34, 0x12, 0x00, 0x00, 0x00, 0x00,
496                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
497     reset();
498 
499     set_raw_channel_to_row(data.data(), 1, 0, 0x1234, PixelFormat::I16);
500     ASSERT_EQ(data, Data({0x00, 0x00, 0x34, 0x12, 0x00, 0x00,
501                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
502     reset();
503 
504     for (auto format : { PixelFormat::RGB161616, PixelFormat::BGR161616 }) {
505         set_raw_channel_to_row(data.data(), 0, 0, 0x1234, format);
506         ASSERT_EQ(data, Data({0x34, 0x12, 0x00, 0x00, 0x00, 0x00,
507                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
508         reset();
509 
510         set_raw_channel_to_row(data.data(), 0, 1, 0x1234, format);
511         ASSERT_EQ(data, Data({0x00, 0x00, 0x34, 0x12, 0x00, 0x00,
512                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
513         reset();
514 
515         set_raw_channel_to_row(data.data(), 0, 2, 0x1234, format);
516         ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x34, 0x12,
517                               0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
518         reset();
519 
520         set_raw_channel_to_row(data.data(), 1, 0, 0x1234, format);
521         ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
522                               0x34, 0x12, 0x00, 0x00, 0x00, 0x00}));
523         reset();
524 
525         set_raw_channel_to_row(data.data(), 1, 1, 0x1234, format);
526         ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
527                               0x00, 0x00, 0x34, 0x12, 0x00, 0x00}));
528         reset();
529 
530         set_raw_channel_to_row(data.data(), 1, 2, 0x1234, format);
531         ASSERT_EQ(data, Data({0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
532                               0x00, 0x00, 0x00, 0x00, 0x34, 0x12}));
533         reset();
534     }
535 }
536 
test_convert_pixel_row_format()537 void test_convert_pixel_row_format()
538 {
539     // The actual work is done in set_channel_to_row and get_channel_from_row, so we don't need
540     // to test all format combinations.
541     using Data = std::vector<std::uint8_t>;
542 
543     Data in_data = {
544         0x12, 0x34, 0x56,
545         0x78, 0x98, 0xab,
546         0xcd, 0xef, 0x21,
547     };
548     Data out_data;
549     out_data.resize(in_data.size() * 2);
550 
551     convert_pixel_row_format(in_data.data(), PixelFormat::RGB888,
552                              out_data.data(), PixelFormat::BGR161616, 3);
553 
554     Data expected_data = {
555         0x56, 0x56, 0x34, 0x34, 0x12, 0x12,
556         0xab, 0xab, 0x98, 0x98, 0x78, 0x78,
557         0x21, 0x21, 0xef, 0xef, 0xcd, 0xcd,
558     };
559 
560     ASSERT_EQ(out_data, expected_data);
561 }
562 
test_image()563 void test_image()
564 {
565     test_get_pixel_from_row();
566     test_set_pixel_to_row();
567     test_get_raw_pixel_from_row();
568     test_set_raw_pixel_to_row();
569     test_get_raw_channel_from_row();
570     test_set_raw_channel_to_row();
571     test_convert_pixel_row_format();
572 }
573 
574 } // namespace genesys
575