1 #include <cstdint>
2
3 #include <kms++/kms++.h>
4 #include <kms++util/kms++util.h>
5
6 namespace kms
7 {
8 static const RGB colors32[] = {
9 RGB(255, 255, 255),
10 RGB(255, 0, 0),
11 RGB(255, 255, 255),
12 RGB(0, 255, 0),
13 RGB(255, 255, 255),
14 RGB(0, 0, 255),
15 RGB(255, 255, 255),
16 RGB(200, 200, 200),
17 RGB(255, 255, 255),
18 RGB(100, 100, 100),
19 RGB(255, 255, 255),
20 RGB(50, 50, 50),
21 };
22
23 static const uint16_t colors16[] = {
24 colors32[0].rgb565(),
25 colors32[1].rgb565(),
26 colors32[2].rgb565(),
27 colors32[3].rgb565(),
28 colors32[4].rgb565(),
29 colors32[5].rgb565(),
30 colors32[6].rgb565(),
31 colors32[7].rgb565(),
32 colors32[8].rgb565(),
33 colors32[9].rgb565(),
34 colors32[10].rgb565(),
35 colors32[11].rgb565(),
36 };
37
drm_draw_color_bar_rgb888(IFramebuffer & buf,int old_xpos,int xpos,int width)38 static void drm_draw_color_bar_rgb888(IFramebuffer& buf, int old_xpos, int xpos, int width)
39 {
40 for (unsigned y = 0; y < buf.height(); ++y) {
41 RGB bcol = colors32[y * ARRAY_SIZE(colors32) / buf.height()];
42 uint32_t *line = (uint32_t*)(buf.map(0) + buf.stride(0) * y);
43
44 if (old_xpos >= 0) {
45 for (int x = old_xpos; x < old_xpos + width; ++x)
46 line[x] = 0;
47 }
48
49 for (int x = xpos; x < xpos + width; ++x)
50 line[x] = bcol.argb8888();
51 }
52 }
53
drm_draw_color_bar_rgb565(IFramebuffer & buf,int old_xpos,int xpos,int width)54 static void drm_draw_color_bar_rgb565(IFramebuffer& buf, int old_xpos, int xpos, int width)
55 {
56 static_assert(ARRAY_SIZE(colors32) == ARRAY_SIZE(colors16), "bad colors arrays");
57
58 for (unsigned y = 0; y < buf.height(); ++y) {
59 uint16_t bcol = colors16[y * ARRAY_SIZE(colors16) / buf.height()];
60 uint16_t *line = (uint16_t*)(buf.map(0) + buf.stride(0) * y);
61
62 if (old_xpos >= 0) {
63 for (int x = old_xpos; x < old_xpos + width; ++x)
64 line[x] = 0;
65 }
66
67 for (int x = xpos; x < xpos + width; ++x)
68 line[x] = bcol;
69 }
70 }
71
drm_draw_color_bar_semiplanar_yuv(IFramebuffer & buf,int old_xpos,int xpos,int width)72 static void drm_draw_color_bar_semiplanar_yuv(IFramebuffer& buf, int old_xpos, int xpos, int width)
73 {
74 const uint8_t colors[] = {
75 0xff,
76 0x00,
77 0xff,
78 0x20,
79 0xff,
80 0x40,
81 0xff,
82 0x80,
83 0xff,
84 };
85
86 for (unsigned y = 0; y < buf.height(); ++y) {
87 unsigned int bcol = colors[y * ARRAY_SIZE(colors) / buf.height()];
88 uint8_t *line = (uint8_t*)(buf.map(0) + buf.stride(0) * y);
89
90 if (old_xpos >= 0) {
91 for (int x = old_xpos; x < old_xpos + width; ++x)
92 line[x] = 0;
93 }
94
95 for (int x = xpos; x < xpos + width; ++x)
96 line[x] = bcol;
97 }
98 }
99
draw_color_bar(IFramebuffer & buf,int old_xpos,int xpos,int width)100 void draw_color_bar(IFramebuffer& buf, int old_xpos, int xpos, int width)
101 {
102 switch (buf.format()) {
103 case PixelFormat::NV12:
104 case PixelFormat::NV21:
105 // XXX not right but gets something on the screen
106 drm_draw_color_bar_semiplanar_yuv(buf, old_xpos, xpos, width);
107 break;
108
109 case PixelFormat::YUYV:
110 case PixelFormat::UYVY:
111 // XXX not right but gets something on the screen
112 drm_draw_color_bar_rgb565(buf, old_xpos, xpos, width);
113 break;
114
115 case PixelFormat::RGB565:
116 drm_draw_color_bar_rgb565(buf, old_xpos, xpos, width);
117 break;
118
119 case PixelFormat::BGR565:
120 // XXX not right, red and blue are reversed
121 drm_draw_color_bar_rgb565(buf, old_xpos, xpos, width);
122 break;
123
124 case PixelFormat::XRGB8888:
125 drm_draw_color_bar_rgb888(buf, old_xpos, xpos, width);
126 break;
127
128 default:
129 ASSERT(false);
130 }
131 }
132 }
133