Skip to content

Commit 4da9a89

Browse files
Finomniscfriedt
authored andcommitted
display: sdl: Add support for AL_88 color format
The SDL display driver can now handle and display AL_88 content. Signed-off-by: Martin Stumpf <[email protected]>
1 parent a769062 commit 4da9a89

File tree

3 files changed

+67
-1
lines changed

3 files changed

+67
-1
lines changed

doc/releases/release-notes-4.3.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ New APIs and options
8989

9090
* Added new pixel format :c:enum:`PIXEL_FORMAT_AL_88`
9191

92+
* SDL
93+
94+
* :kconfig:option:`CONFIG_SDL_DISPLAY_DEFAULT_PIXEL_FORMAT_AL_88`
95+
9296
* Logging:
9397

9498
* Added rate-limited logging macros to prevent log flooding when messages are generated frequently.

drivers/display/Kconfig.sdl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ choice SDL_DISPLAY_DEFAULT_PIXEL_FORMAT
4040
config SDL_DISPLAY_DEFAULT_PIXEL_FORMAT_L_8
4141
bool "Grayscale 8bit"
4242

43+
config SDL_DISPLAY_DEFAULT_PIXEL_FORMAT_AL_88
44+
bool "Grayscale 8bit with Alpha"
45+
4346
endchoice
4447

4548
config SDL_DISPLAY_ZOOM_PCT

drivers/display/display_sdl.c

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ static int sdl_display_init(const struct device *dev)
160160
PIXEL_FORMAT_BGR_565
161161
#elif defined(CONFIG_SDL_DISPLAY_DEFAULT_PIXEL_FORMAT_L_8)
162162
PIXEL_FORMAT_L_8
163+
#elif defined(CONFIG_SDL_DISPLAY_DEFAULT_PIXEL_FORMAT_AL_88)
164+
PIXEL_FORMAT_AL_88
163165
#else /* SDL_DISPLAY_DEFAULT_PIXEL_FORMAT */
164166
PIXEL_FORMAT_ARGB_8888
165167
#endif /* SDL_DISPLAY_DEFAULT_PIXEL_FORMAT */
@@ -210,6 +212,31 @@ static void sdl_display_write_rgb888(uint8_t *disp_buf,
210212
}
211213
}
212214

215+
static void sdl_display_write_al88(uint8_t *disp_buf,
216+
const struct display_buffer_descriptor *desc, const void *buf)
217+
{
218+
uint32_t w_idx;
219+
uint32_t h_idx;
220+
uint32_t pixel;
221+
const uint8_t *byte_ptr;
222+
223+
__ASSERT((desc->pitch * 2U * desc->height) <= desc->buf_size,
224+
"Input buffer too small");
225+
226+
for (h_idx = 0U; h_idx < desc->height; ++h_idx) {
227+
for (w_idx = 0U; w_idx < desc->width; ++w_idx) {
228+
byte_ptr = (const uint8_t *)buf +
229+
((h_idx * desc->pitch) + w_idx) * 2U;
230+
pixel = *(byte_ptr + 1) << 24;
231+
pixel |= *(byte_ptr) << 16;
232+
pixel |= *(byte_ptr) << 8;
233+
pixel |= *(byte_ptr);
234+
*((uint32_t *)disp_buf) = pixel;
235+
disp_buf += 4;
236+
}
237+
}
238+
}
239+
213240
static void sdl_display_write_rgb565(uint8_t *disp_buf,
214241
const struct display_buffer_descriptor *desc, const void *buf)
215242
{
@@ -392,6 +419,8 @@ static int sdl_display_write(const struct device *dev, const uint16_t x,
392419
sdl_display_write_bgr565(disp_data->buf, desc, buf);
393420
} else if (disp_data->current_pixel_format == PIXEL_FORMAT_L_8) {
394421
sdl_display_write_l8(disp_data->buf, desc, buf);
422+
} else if (disp_data->current_pixel_format == PIXEL_FORMAT_AL_88) {
423+
sdl_display_write_al88(disp_data->buf, desc, buf);
395424
}
396425

397426
if (k_current_get() == &disp_data->sdl_thread) {
@@ -543,6 +572,29 @@ static void sdl_display_read_l8(const uint8_t *read_buf,
543572
}
544573
}
545574

575+
static void sdl_display_read_al88(const uint8_t *read_buf,
576+
const struct display_buffer_descriptor *desc, void *buf)
577+
{
578+
uint32_t w_idx;
579+
uint32_t h_idx;
580+
uint8_t *buf8;
581+
const uint32_t *pix_ptr;
582+
583+
__ASSERT((desc->pitch * 2U * desc->height) <= desc->buf_size, "Read buffer is too small");
584+
585+
for (h_idx = 0U; h_idx < desc->height; ++h_idx) {
586+
buf8 = ((uint8_t *)buf) + desc->pitch * 2U * h_idx;
587+
588+
for (w_idx = 0U; w_idx < desc->width; ++w_idx) {
589+
pix_ptr = (const uint32_t *)read_buf + ((h_idx * desc->pitch) + w_idx);
590+
*buf8 = (*pix_ptr & 0xFF);
591+
buf8 += 1;
592+
*buf8 = (*pix_ptr & 0xFF000000) >> 24;
593+
buf8 += 1;
594+
}
595+
}
596+
}
597+
546598
static int sdl_display_read(const struct device *dev, const uint16_t x, const uint16_t y,
547599
const struct display_buffer_descriptor *desc, void *buf)
548600
{
@@ -580,6 +632,8 @@ static int sdl_display_read(const struct device *dev, const uint16_t x, const ui
580632
sdl_display_read_bgr565(disp_data->read_buf, desc, buf);
581633
} else if (disp_data->current_pixel_format == PIXEL_FORMAT_L_8) {
582634
sdl_display_read_l8(disp_data->read_buf, desc, buf);
635+
} else if (disp_data->current_pixel_format == PIXEL_FORMAT_AL_88) {
636+
sdl_display_read_al88(disp_data->read_buf, desc, buf);
583637
}
584638
k_mutex_unlock(&disp_data->task_mutex);
585639

@@ -615,6 +669,9 @@ static int sdl_display_clear(const struct device *dev)
615669
case PIXEL_FORMAT_BGR_565:
616670
size = config->width * config->height * 2U;
617671
break;
672+
case PIXEL_FORMAT_AL_88:
673+
size = config->width * config->height * 2U;
674+
break;
618675
default:
619676
__ASSERT_MSG_INFO("Pixel format not supported");
620677
return -EINVAL;
@@ -688,7 +745,8 @@ static void sdl_display_get_capabilities(
688745
PIXEL_FORMAT_MONO10 |
689746
PIXEL_FORMAT_RGB_565 |
690747
PIXEL_FORMAT_BGR_565 |
691-
PIXEL_FORMAT_L_8;
748+
PIXEL_FORMAT_L_8 |
749+
PIXEL_FORMAT_AL_88;
692750
capabilities->current_pixel_format = disp_data->current_pixel_format;
693751
capabilities->screen_info =
694752
(IS_ENABLED(CONFIG_SDL_DISPLAY_MONO_VTILED) ? SCREEN_INFO_MONO_VTILED : 0) |
@@ -708,6 +766,7 @@ static int sdl_display_set_pixel_format(const struct device *dev,
708766
case PIXEL_FORMAT_RGB_565:
709767
case PIXEL_FORMAT_BGR_565:
710768
case PIXEL_FORMAT_L_8:
769+
case PIXEL_FORMAT_AL_88:
711770
disp_data->current_pixel_format = pixel_format;
712771
return 0;
713772
default:

0 commit comments

Comments
 (0)