RGB332 native display format in LVGL 9

Description

I would like to use RGB332 as LVGL’s native format in my application. My display is a RGB332 1024x600 RGB TTL display on a ESP32S3.

lv.conf has these options for LV_COLOR_DEPTH:

/*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/

None of which seem to fit. I am setting up drawing using

    lv_init();
    lv_display_t * lv_display = lv_display_create(1024, 600);
    lv_display_set_flush_cb(lv_display, lv_flush_cb);
    lv_display_set_buffers(lv_display, lv_buf, NULL, H_RES*V_RES/10, LV_DISPLAY_RENDER_MODE_PARTIAL);

and then in my lv_flush_cb:

void lv_flush_cb(lv_display_t * display, const lv_area_t * area, unsigned char * px_map)
{
    uint8_t * buf = (uint8_t *)px_map; 
    int16_t x, y;
    for(y = area->y1; y <= area->y2; y++) {
        for(x = area->x1; x <= area->x2; x++) {
            // bg is a framebuffer i maintain that is drawn to the ESP GDMA to the display
            bg[y*1024 + x] = (*buf);
            buf++;
        }
    }
    // Inform LVGL that you are ready with the flushing and buf is not used anymore
    lv_display_flush_ready(display);
}

With LV_COLOR_DEPTH at 8, this only results in a black screen. Setting LV_COLOR_DEPTH to 16 and converting RGB565 to RGB332 on the fly in lv_flush_cb does work fine, but is slow and wastes CPU and RAM.

How can I achieve this? I can’t find much information online other than older versions of LVGL which indicated that LV_COLOR_DEPTH = 8 was for RGB332. But that seems to have changed.

I’ve eventually done this myself, including color blending for RGB332. If this is any interest to anyone it is in the Tulip fork here: lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb332.c at tulip · bwhitman/lvgl · GitHub