blob: 4e76574a9138eed217a2dbaa77b59bfa265dc592 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Simon Glass90b6fef2016-01-18 19:52:26 -07002/*
3 * Copyright (c) 2014 Google, Inc
4 * Written by Simon Glass <sjg@chromium.org>
Simon Glass90b6fef2016-01-18 19:52:26 -07005 */
6
7#include <common.h>
8#include <bzlib.h>
9#include <dm.h>
Simon Glass8bd7f602021-11-19 13:23:58 -070010#include <gzip.h>
Simon Glass0f2af882020-05-10 11:40:05 -060011#include <log.h>
Simon Glass9bc15642020-02-03 07:36:16 -070012#include <malloc.h>
Simon Glass90b6fef2016-01-18 19:52:26 -070013#include <mapmem.h>
14#include <os.h>
15#include <video.h>
16#include <video_console.h>
Simon Glassc3b5adf2021-11-19 13:23:50 -070017#include <asm/test.h>
Simon Glass90b6fef2016-01-18 19:52:26 -070018#include <dm/test.h>
19#include <dm/uclass-internal.h>
Simon Glass75c4d412020-07-19 10:15:37 -060020#include <test/test.h>
Simon Glass90b6fef2016-01-18 19:52:26 -070021#include <test/ut.h>
22
23/*
24 * These tests use the standard sandbox frame buffer, the resolution of which
25 * is defined in the device tree. This only supports 16bpp so the tests only
26 * test that code path. It would be possible to adjust this fairly easily,
27 * by adjusting the bpix value in struct sandbox_sdl_plat. However the code
28 * in sandbox_sdl_sync() would also need to change to handle the different
29 * surface depth.
30 */
Simon Glass90b6fef2016-01-18 19:52:26 -070031/* Basic test of the video uclass */
32static int dm_test_video_base(struct unit_test_state *uts)
33{
34 struct video_priv *priv;
35 struct udevice *dev;
36
37 ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
38 ut_asserteq(1366, video_get_xsize(dev));
39 ut_asserteq(768, video_get_ysize(dev));
40 priv = dev_get_uclass_priv(dev);
41 ut_asserteq(priv->fb_size, 1366 * 768 * 2);
42
43 return 0;
44}
Simon Glass974dccd2020-07-28 19:41:12 -060045DM_TEST(dm_test_video_base, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Simon Glass90b6fef2016-01-18 19:52:26 -070046
47/**
48 * compress_frame_buffer() - Compress the frame buffer and return its size
49 *
50 * We want to write tests which perform operations on the video console and
51 * check that the frame buffer ends up with the correct contents. But it is
52 * painful to store 'known good' images for comparison with the frame
53 * buffer. As an alternative, we can compress the frame buffer and check the
54 * size of the compressed data. This provides a pretty good level of
55 * certainty and the resulting tests need only check a single value.
56 *
Simon Glass2a0f8e32020-07-02 21:12:29 -060057 * If the copy framebuffer is enabled, this compares it to the main framebuffer
58 * too.
59 *
60 * @uts: Test state
Simon Glass90b6fef2016-01-18 19:52:26 -070061 * @dev: Video device
62 * @return compressed size of the frame buffer, or -ve on error
63 */
Simon Glass2a0f8e32020-07-02 21:12:29 -060064static int compress_frame_buffer(struct unit_test_state *uts,
65 struct udevice *dev)
Simon Glass90b6fef2016-01-18 19:52:26 -070066{
67 struct video_priv *priv = dev_get_uclass_priv(dev);
Simon Glass2a0f8e32020-07-02 21:12:29 -060068 struct video_priv *uc_priv = dev_get_uclass_priv(dev);
Simon Glass90b6fef2016-01-18 19:52:26 -070069 uint destlen;
70 void *dest;
71 int ret;
72
73 destlen = priv->fb_size;
74 dest = malloc(priv->fb_size);
75 if (!dest)
76 return -ENOMEM;
77 ret = BZ2_bzBuffToBuffCompress(dest, &destlen,
78 priv->fb, priv->fb_size,
79 3, 0, 0);
80 free(dest);
81 if (ret)
82 return ret;
83
Simon Glass2a0f8e32020-07-02 21:12:29 -060084 /* Check here that the copy frame buffer is working correctly */
85 if (IS_ENABLED(CONFIG_VIDEO_COPY)) {
86 ut_assertf(!memcmp(uc_priv->fb, uc_priv->copy_fb,
87 uc_priv->fb_size),
88 "Copy framebuffer does not match fb");
89 }
90
Simon Glass90b6fef2016-01-18 19:52:26 -070091 return destlen;
92}
93
94/*
95 * Call this function at any point to halt and show the current display. Be
96 * sure to run the test with the -l flag.
97 */
98static void __maybe_unused see_output(void)
99{
100 video_sync_all();
101 while (1);
102}
103
Simon Glassdaac9c72016-01-14 18:10:50 -0700104/* Select the video console driver to use for a video device */
105static int select_vidconsole(struct unit_test_state *uts, const char *drv_name)
106{
107 struct sandbox_sdl_plat *plat;
108 struct udevice *dev;
109
110 ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
111 ut_assert(!device_active(dev));
Simon Glassfa20e932020-12-03 16:55:20 -0700112 plat = dev_get_plat(dev);
Simon Glassdaac9c72016-01-14 18:10:50 -0700113 plat->vidconsole_drv_name = "vidconsole0";
114
115 return 0;
116}
117
Simon Glass90b6fef2016-01-18 19:52:26 -0700118/* Test text output works on the video console */
119static int dm_test_video_text(struct unit_test_state *uts)
120{
121 struct udevice *dev, *con;
122 int i;
123
124#define WHITE 0xffff
125#define SCROLL_LINES 100
126
Simon Glassdaac9c72016-01-14 18:10:50 -0700127 ut_assertok(select_vidconsole(uts, "vidconsole0"));
Simon Glass90b6fef2016-01-18 19:52:26 -0700128 ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
Simon Glass2a0f8e32020-07-02 21:12:29 -0600129 ut_asserteq(46, compress_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700130
131 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
132 vidconsole_putc_xy(con, 0, 0, 'a');
Simon Glass2a0f8e32020-07-02 21:12:29 -0600133 ut_asserteq(79, compress_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700134
135 vidconsole_putc_xy(con, 0, 0, ' ');
Simon Glass2a0f8e32020-07-02 21:12:29 -0600136 ut_asserteq(46, compress_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700137
138 for (i = 0; i < 20; i++)
Simon Glass52c10c52016-01-14 18:10:37 -0700139 vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
Simon Glass2a0f8e32020-07-02 21:12:29 -0600140 ut_asserteq(273, compress_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700141
142 vidconsole_set_row(con, 0, WHITE);
Simon Glass2a0f8e32020-07-02 21:12:29 -0600143 ut_asserteq(46, compress_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700144
145 for (i = 0; i < 20; i++)
Simon Glass52c10c52016-01-14 18:10:37 -0700146 vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
Simon Glass2a0f8e32020-07-02 21:12:29 -0600147 ut_asserteq(273, compress_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700148
149 return 0;
150}
Simon Glass974dccd2020-07-28 19:41:12 -0600151DM_TEST(dm_test_video_text, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Simon Glass90b6fef2016-01-18 19:52:26 -0700152
153/* Test handling of special characters in the console */
154static int dm_test_video_chars(struct unit_test_state *uts)
155{
156 struct udevice *dev, *con;
Simon Glass37b80202016-01-14 18:10:38 -0700157 const char *test_string = "Well\b\b\b\bxhe is\r \n\ta very \amodest \bman\n\t\tand Has much to\b\bto be modest about.";
Simon Glass90b6fef2016-01-18 19:52:26 -0700158
Simon Glassdaac9c72016-01-14 18:10:50 -0700159 ut_assertok(select_vidconsole(uts, "vidconsole0"));
Simon Glass90b6fef2016-01-18 19:52:26 -0700160 ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
161 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
Rob Clark985935b2017-09-25 15:45:08 -0400162 vidconsole_put_string(con, test_string);
Simon Glass2a0f8e32020-07-02 21:12:29 -0600163 ut_asserteq(466, compress_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700164
165 return 0;
166}
Simon Glass974dccd2020-07-28 19:41:12 -0600167DM_TEST(dm_test_video_chars, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Simon Glass90b6fef2016-01-18 19:52:26 -0700168
Rob Clark09d64b32017-09-25 15:45:09 -0400169#ifdef CONFIG_VIDEO_ANSI
170#define ANSI_ESC "\x1b"
171/* Test handling of ANSI escape sequences */
172static int dm_test_video_ansi(struct unit_test_state *uts)
173{
174 struct udevice *dev, *con;
175
176 ut_assertok(select_vidconsole(uts, "vidconsole0"));
177 ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
178 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
179
180 /* reference clear: */
181 video_clear(con->parent);
Simon Glass0806dcc2018-10-01 11:55:14 -0600182 video_sync(con->parent, false);
Simon Glass2a0f8e32020-07-02 21:12:29 -0600183 ut_asserteq(46, compress_frame_buffer(uts, dev));
Rob Clark09d64b32017-09-25 15:45:09 -0400184
185 /* test clear escape sequence: [2J */
186 vidconsole_put_string(con, "A\tB\tC"ANSI_ESC"[2J");
Simon Glass2a0f8e32020-07-02 21:12:29 -0600187 ut_asserteq(46, compress_frame_buffer(uts, dev));
Rob Clark09d64b32017-09-25 15:45:09 -0400188
189 /* test set-cursor: [%d;%df */
190 vidconsole_put_string(con, "abc"ANSI_ESC"[2;2fab"ANSI_ESC"[4;4fcd");
Simon Glass2a0f8e32020-07-02 21:12:29 -0600191 ut_asserteq(143, compress_frame_buffer(uts, dev));
Rob Clark09d64b32017-09-25 15:45:09 -0400192
193 /* test colors (30-37 fg color, 40-47 bg color) */
194 vidconsole_put_string(con, ANSI_ESC"[30;41mfoo"); /* black on red */
195 vidconsole_put_string(con, ANSI_ESC"[33;44mbar"); /* yellow on blue */
Simon Glass2a0f8e32020-07-02 21:12:29 -0600196 ut_asserteq(272, compress_frame_buffer(uts, dev));
Rob Clark09d64b32017-09-25 15:45:09 -0400197
198 return 0;
199}
Simon Glass974dccd2020-07-28 19:41:12 -0600200DM_TEST(dm_test_video_ansi, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Rob Clark09d64b32017-09-25 15:45:09 -0400201#endif
202
Simon Glass90b6fef2016-01-18 19:52:26 -0700203/**
204 * check_vidconsole_output() - Run a text console test
205 *
206 * @uts: Test state
Simon Glass4425bf42020-07-02 21:12:28 -0600207 * @rot: Console rotation (0=normal orientation, 1=90 degrees clockwise,
208 * 2=upside down, 3=90 degree counterclockwise)
Simon Glass90b6fef2016-01-18 19:52:26 -0700209 * @wrap_size: Expected size of compressed frame buffer for the wrap test
210 * @scroll_size: Same for the scroll test
211 * @return 0 on success
212 */
213static int check_vidconsole_output(struct unit_test_state *uts, int rot,
214 int wrap_size, int scroll_size)
215{
216 struct udevice *dev, *con;
217 struct sandbox_sdl_plat *plat;
218 int i;
219
220 ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
221 ut_assert(!device_active(dev));
Simon Glassfa20e932020-12-03 16:55:20 -0700222 plat = dev_get_plat(dev);
Simon Glass90b6fef2016-01-18 19:52:26 -0700223 plat->rot = rot;
224
225 ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
226 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
Simon Glass2a0f8e32020-07-02 21:12:29 -0600227 ut_asserteq(46, compress_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700228
229 /* Check display wrap */
230 for (i = 0; i < 120; i++)
231 vidconsole_put_char(con, 'A' + i % 50);
Simon Glass2a0f8e32020-07-02 21:12:29 -0600232 ut_asserteq(wrap_size, compress_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700233
234 /* Check display scrolling */
235 for (i = 0; i < SCROLL_LINES; i++) {
236 vidconsole_put_char(con, 'A' + i % 50);
237 vidconsole_put_char(con, '\n');
238 }
Simon Glass2a0f8e32020-07-02 21:12:29 -0600239 ut_asserteq(scroll_size, compress_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700240
241 /* If we scroll enough, the screen becomes blank again */
242 for (i = 0; i < SCROLL_LINES; i++)
243 vidconsole_put_char(con, '\n');
Simon Glass2a0f8e32020-07-02 21:12:29 -0600244 ut_asserteq(46, compress_frame_buffer(uts, dev));
Simon Glass90b6fef2016-01-18 19:52:26 -0700245
246 return 0;
247}
248
249/* Test text output through the console uclass */
250static int dm_test_video_context(struct unit_test_state *uts)
251{
Simon Glassdaac9c72016-01-14 18:10:50 -0700252 ut_assertok(select_vidconsole(uts, "vidconsole0"));
253 ut_assertok(check_vidconsole_output(uts, 0, 788, 453));
254
255 return 0;
Simon Glass90b6fef2016-01-18 19:52:26 -0700256}
Simon Glass974dccd2020-07-28 19:41:12 -0600257DM_TEST(dm_test_video_context, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Simon Glassa0f1efe2016-01-18 19:52:27 -0700258
259/* Test rotated text output through the console uclass */
260static int dm_test_video_rotation1(struct unit_test_state *uts)
261{
262 ut_assertok(check_vidconsole_output(uts, 1, 1112, 680));
263
264 return 0;
265}
Simon Glass974dccd2020-07-28 19:41:12 -0600266DM_TEST(dm_test_video_rotation1, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Simon Glassa0f1efe2016-01-18 19:52:27 -0700267
268/* Test rotated text output through the console uclass */
269static int dm_test_video_rotation2(struct unit_test_state *uts)
270{
Simon Glassf50a6b92020-07-02 21:12:17 -0600271 ut_assertok(check_vidconsole_output(uts, 2, 783, 445));
Simon Glassa0f1efe2016-01-18 19:52:27 -0700272
273 return 0;
274}
Simon Glass974dccd2020-07-28 19:41:12 -0600275DM_TEST(dm_test_video_rotation2, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Simon Glassa0f1efe2016-01-18 19:52:27 -0700276
277/* Test rotated text output through the console uclass */
278static int dm_test_video_rotation3(struct unit_test_state *uts)
279{
280 ut_assertok(check_vidconsole_output(uts, 3, 1134, 681));
281
282 return 0;
283}
Simon Glass974dccd2020-07-28 19:41:12 -0600284DM_TEST(dm_test_video_rotation3, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Simon Glass7a1cb292016-01-18 19:52:28 -0700285
286/* Read a file into memory and return a pointer to it */
287static int read_file(struct unit_test_state *uts, const char *fname,
288 ulong *addrp)
289{
290 int buf_size = 100000;
291 ulong addr = 0;
292 int size, fd;
293 char *buf;
294
295 buf = map_sysmem(addr, 0);
296 ut_assert(buf != NULL);
297 fd = os_open(fname, OS_O_RDONLY);
298 ut_assert(fd >= 0);
299 size = os_read(fd, buf, buf_size);
Simon Glass9050c5f2016-01-30 15:45:17 -0700300 os_close(fd);
Simon Glass7a1cb292016-01-18 19:52:28 -0700301 ut_assert(size >= 0);
302 ut_assert(size < buf_size);
Simon Glass7a1cb292016-01-18 19:52:28 -0700303 *addrp = addr;
304
305 return 0;
306}
307
308/* Test drawing a bitmap file */
309static int dm_test_video_bmp(struct unit_test_state *uts)
310{
311 struct udevice *dev;
312 ulong addr;
313
314 ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
315 ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
316
317 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
Simon Glass2a0f8e32020-07-02 21:12:29 -0600318 ut_asserteq(1368, compress_frame_buffer(uts, dev));
Simon Glass7a1cb292016-01-18 19:52:28 -0700319
320 return 0;
321}
Simon Glass974dccd2020-07-28 19:41:12 -0600322DM_TEST(dm_test_video_bmp, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Simon Glass7a1cb292016-01-18 19:52:28 -0700323
Simon Glassc3b5adf2021-11-19 13:23:50 -0700324/* Test drawing a bitmap file on a 8bpp display */
325static int dm_test_video_bmp8(struct unit_test_state *uts)
326{
327 struct udevice *dev;
328 ulong addr;
329
330 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
331 ut_assertnonnull(dev);
332 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP8));
333
334 ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
335
336 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
337 ut_asserteq(1247, compress_frame_buffer(uts, dev));
338
339 return 0;
340}
341DM_TEST(dm_test_video_bmp8, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
342
Simon Glass8bd7f602021-11-19 13:23:58 -0700343/* Test drawing a bitmap file on a 16bpp display */
344static int dm_test_video_bmp16(struct unit_test_state *uts)
345{
346 ulong src, src_len = ~0UL;
347 uint dst_len = ~0U;
348 struct udevice *dev;
349 ulong dst = 0x10000;
350
351 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
352 ut_assertnonnull(dev);
353 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP16));
354
355 ut_assertok(read_file(uts, "tools/logos/denx-16bpp.bmp.gz", &src));
356 ut_assertok(gunzip(map_sysmem(dst, 0), dst_len, map_sysmem(src, 0),
357 &src_len));
358
359 ut_assertok(video_bmp_display(dev, dst, 0, 0, false));
360 ut_asserteq(3700, compress_frame_buffer(uts, dev));
361
362 return 0;
363}
364DM_TEST(dm_test_video_bmp16, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
365
Simon Glass6a92e882021-11-19 13:23:59 -0700366/* Test drawing a 24bpp bitmap file on a 16bpp display */
367static int dm_test_video_bmp24(struct unit_test_state *uts)
368{
369 ulong src, src_len = ~0UL;
370 uint dst_len = ~0U;
371 struct udevice *dev;
372 ulong dst = 0x10000;
373
374 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
375 ut_assertnonnull(dev);
376 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP16));
377
378 ut_assertok(read_file(uts, "tools/logos/denx-24bpp.bmp.gz", &src));
379 ut_assertok(gunzip(map_sysmem(dst, 0), dst_len, map_sysmem(src, 0),
380 &src_len));
381
382 ut_assertok(video_bmp_display(dev, dst, 0, 0, false));
383 ut_asserteq(3656, compress_frame_buffer(uts, dev));
384
385 return 0;
386}
387DM_TEST(dm_test_video_bmp24, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
388
389/* Test drawing a 24bpp bitmap file on a 32bpp display */
390static int dm_test_video_bmp24_32(struct unit_test_state *uts)
391{
392 ulong src, src_len = ~0UL;
393 uint dst_len = ~0U;
394 struct udevice *dev;
395 ulong dst = 0x10000;
396
397 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
398 ut_assertnonnull(dev);
399 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP32));
400
401 ut_assertok(read_file(uts, "tools/logos/denx-24bpp.bmp.gz", &src));
402 ut_assertok(gunzip(map_sysmem(dst, 0), dst_len, map_sysmem(src, 0),
403 &src_len));
404
405 ut_assertok(video_bmp_display(dev, dst, 0, 0, false));
406 ut_asserteq(6827, compress_frame_buffer(uts, dev));
407
408 return 0;
409}
410DM_TEST(dm_test_video_bmp24_32, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
411
Simon Glassc3b5adf2021-11-19 13:23:50 -0700412/* Test drawing a bitmap file on a 32bpp display */
413static int dm_test_video_bmp32(struct unit_test_state *uts)
414{
415 struct udevice *dev;
416 ulong addr;
417
418 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
419 ut_assertnonnull(dev);
420 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP32));
421 ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
422
423 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
424 ut_asserteq(2024, compress_frame_buffer(uts, dev));
425
426 return 0;
427}
428DM_TEST(dm_test_video_bmp32, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
429
Simon Glass7a1cb292016-01-18 19:52:28 -0700430/* Test drawing a compressed bitmap file */
431static int dm_test_video_bmp_comp(struct unit_test_state *uts)
432{
433 struct udevice *dev;
434 ulong addr;
435
436 ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
437 ut_assertok(read_file(uts, "tools/logos/denx-comp.bmp", &addr));
438
439 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
Simon Glass2a0f8e32020-07-02 21:12:29 -0600440 ut_asserteq(1368, compress_frame_buffer(uts, dev));
Simon Glass7a1cb292016-01-18 19:52:28 -0700441
442 return 0;
443}
Simon Glass974dccd2020-07-28 19:41:12 -0600444DM_TEST(dm_test_video_bmp_comp, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Simon Glass32337982016-01-14 18:10:51 -0700445
Simon Glass490bb992021-11-19 13:23:55 -0700446/* Test drawing a bitmap file on a 32bpp display */
447static int dm_test_video_comp_bmp32(struct unit_test_state *uts)
448{
449 struct udevice *dev;
450 ulong addr;
451
452 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
453 ut_assertnonnull(dev);
454 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP32));
455
456 ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
457
458 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
459 ut_asserteq(2024, compress_frame_buffer(uts, dev));
460
461 return 0;
462}
463DM_TEST(dm_test_video_comp_bmp32, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
464
465/* Test drawing a bitmap file on a 8bpp display */
466static int dm_test_video_comp_bmp8(struct unit_test_state *uts)
467{
468 struct udevice *dev;
469 ulong addr;
470
471 ut_assertok(uclass_find_first_device(UCLASS_VIDEO, &dev));
472 ut_assertnonnull(dev);
473 ut_assertok(sandbox_sdl_set_bpp(dev, VIDEO_BPP8));
474
475 ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
476
477 ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
478 ut_asserteq(1247, compress_frame_buffer(uts, dev));
479
480 return 0;
481}
482DM_TEST(dm_test_video_comp_bmp8, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
483
Simon Glass32337982016-01-14 18:10:51 -0700484/* Test TrueType console */
485static int dm_test_video_truetype(struct unit_test_state *uts)
486{
487 struct udevice *dev, *con;
488 const char *test_string = "Criticism may not be agreeable, but it is necessary. It fulfils the same function as pain in the human body. It calls attention to an unhealthy state of things. Some see private enterprise as a predatory target to be shot, others as a cow to be milked, but few are those who see it as a sturdy horse pulling the wagon. The \aprice OF\b\bof greatness\n\tis responsibility.\n\nBye";
Simon Glass32337982016-01-14 18:10:51 -0700489
490 ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
491 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
Rob Clark985935b2017-09-25 15:45:08 -0400492 vidconsole_put_string(con, test_string);
Simon Glass2a0f8e32020-07-02 21:12:29 -0600493 ut_asserteq(12237, compress_frame_buffer(uts, dev));
Simon Glass32337982016-01-14 18:10:51 -0700494
495 return 0;
496}
Simon Glass974dccd2020-07-28 19:41:12 -0600497DM_TEST(dm_test_video_truetype, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Simon Glass32337982016-01-14 18:10:51 -0700498
499/* Test scrolling TrueType console */
500static int dm_test_video_truetype_scroll(struct unit_test_state *uts)
501{
502 struct sandbox_sdl_plat *plat;
503 struct udevice *dev, *con;
504 const char *test_string = "Criticism may not be agreeable, but it is necessary. It fulfils the same function as pain in the human body. It calls attention to an unhealthy state of things. Some see private enterprise as a predatory target to be shot, others as a cow to be milked, but few are those who see it as a sturdy horse pulling the wagon. The \aprice OF\b\bof greatness\n\tis responsibility.\n\nBye";
Simon Glass32337982016-01-14 18:10:51 -0700505
506 ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
507 ut_assert(!device_active(dev));
Simon Glassfa20e932020-12-03 16:55:20 -0700508 plat = dev_get_plat(dev);
Simon Glass32337982016-01-14 18:10:51 -0700509 plat->font_size = 100;
510
511 ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
512 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
Rob Clark985935b2017-09-25 15:45:08 -0400513 vidconsole_put_string(con, test_string);
Simon Glass2a0f8e32020-07-02 21:12:29 -0600514 ut_asserteq(35030, compress_frame_buffer(uts, dev));
Simon Glass32337982016-01-14 18:10:51 -0700515
516 return 0;
517}
Simon Glass974dccd2020-07-28 19:41:12 -0600518DM_TEST(dm_test_video_truetype_scroll, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
Simon Glass32337982016-01-14 18:10:51 -0700519
520/* Test TrueType backspace, within and across lines */
521static int dm_test_video_truetype_bs(struct unit_test_state *uts)
522{
523 struct sandbox_sdl_plat *plat;
524 struct udevice *dev, *con;
525 const char *test_string = "...Criticism may or may\b\b\b\b\b\bnot be agreeable, but seldom it is necessary\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bit is necessary. It fulfils the same function as pain in the human body. It calls attention to an unhealthy state of things.";
Simon Glass32337982016-01-14 18:10:51 -0700526
527 ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
528 ut_assert(!device_active(dev));
Simon Glassfa20e932020-12-03 16:55:20 -0700529 plat = dev_get_plat(dev);
Simon Glass32337982016-01-14 18:10:51 -0700530 plat->font_size = 100;
531
532 ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
533 ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
Rob Clark985935b2017-09-25 15:45:08 -0400534 vidconsole_put_string(con, test_string);
Simon Glass2a0f8e32020-07-02 21:12:29 -0600535 ut_asserteq(29018, compress_frame_buffer(uts, dev));
Simon Glass32337982016-01-14 18:10:51 -0700536
537 return 0;
538}
Simon Glass974dccd2020-07-28 19:41:12 -0600539DM_TEST(dm_test_video_truetype_bs, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);