Когда-то, втискивая 272*480 во внутреннюю память ST32F429, я пробовал для хранения использовать формат RRRGGGBB - который распаковывался LUT:
Код
static void
fillLUT_L8(
LTDC_Layer_TypeDef* LTDC_Layerx
)
{
unsigned color;
for (color = 0; color < 256; ++ color)
{
#define XRGB(zr,zg,zb) do { r = (zr), g = (zg), b = (zb); } while (0)
uint_fast8_t r, g, b;
switch (color)
{
case TFTRGB(0, 0, 0) /*COLOR_BLACK*/: XRGB(0, 0, 0); break; // 0x00 черный
case TFTRGB(255, 0, 0) /*COLOR_RED*/: XRGB(255, 0, 0); break; // 0xE0 красный
case TFTRGB(0, 255, 0) /*COLOR_GREEN*/: XRGB(0, 255, 0); break; // 0x1C зеленый
case TFTRGB(0, 0, 255) /*COLOR_BLUE*/: XRGB(0, 0, 255); break; // 0x03 синий
case TFTRGB(128, 0, 0) /*COLOR_DARKRED*/: XRGB(128, 0, 0); break; //
case TFTRGB(0, 128, 0) /*COLOR_DARKGREEN*/: XRGB(0, 128, 0); break; //
case TFTRGB(0, 0, 128) /*COLOR_DARKBLUE*/: XRGB(0, 0, 128); break; //
case TFTRGB(255, 255, 0) /*COLOR_YELLOW*/: XRGB(255, 255, 0); break; // 0xFC желтый
case TFTRGB(255, 0, 255) /*COLOR_MAGENTA*/: XRGB(255, 0, 255); break; // 0x83 пурпурный
case TFTRGB(0, 255, 255) /*COLOR_CYAN*/: XRGB(0, 255, 255); break; // 0x1F голубой
case TFTRGB(255, 255, 255) /*COLOR_WHITE*/: XRGB(255, 255, 255); break; // 0xff белый
case TFTRGB(128, 128, 128) /*COLOR_GRAY*/: XRGB(128, 128, 128); break; // серый
case TFTRGB(0xa5, 0x2a, 0x2a) /*COLOR_BROWN*/: XRGB(0xa5, 0x2a, 0x2a); break; // 0x64 коричневый
case TFTRGB(0xff, 0xd7, 0x00) /*COLOR_GOLD*/: XRGB(0xff, 0xd7, 0x00); break; // 0xF4 золото
case TFTRGB(0xd1, 0xe2, 0x31) /*COLOR_PEAR*/: XRGB(0xd1, 0xe2, 0x31); break; // 0xDC грушевый
#undef XRGB
default:
r = ((color & 0xe0) << 0) | ((color & 0x80) ? 0x1f : 0); // red
g = ((color & 0x1c) << 3) | ((color & 0x10) ? 0x1f : 0); // green
b = ((color & 0x03) << 6) | ((color & 0x02) ? 0x3f : 0); // blue
break;
}
/* запись значений в регистры палитры */
LTDC_Layerx->CLUTWR =
((color << 24) & LTDC_LxCLUTWR_CLUTADD) |
((r << 16) & LTDC_LxCLUTWR_RED) |
((g << 8) & LTDC_LxCLUTWR_GREEN) |
((b << 0) & LTDC_LxCLUTWR_BLUE);
}
LTDC_Layerx->CR |= LTDC_LxCR_CLUTEN;
}