mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-27 23:02:02 +00:00
feat(core): enable hw decoding of grayscale JPEGs
[no changelog]
This commit is contained in:
parent
8302f70d2a
commit
f5a51b0671
@ -44,6 +44,7 @@ bool dma2d_rgb565_blend_mono8(const gfx_bitblt_t* bb);
|
||||
|
||||
bool dma2d_rgba8888_fill(const gfx_bitblt_t* bb);
|
||||
bool dma2d_rgba8888_copy_mono4(const gfx_bitblt_t* bb);
|
||||
bool dma2d_rgba8888_copy_mono8(const gfx_bitblt_t* bb);
|
||||
bool dma2d_rgba8888_copy_rgb565(const gfx_bitblt_t* bb);
|
||||
bool dma2d_rgba8888_copy_rgba8888(const gfx_bitblt_t* bb);
|
||||
bool dma2d_rgba8888_blend_mono4(const gfx_bitblt_t* bb);
|
||||
@ -53,4 +54,5 @@ bool dma2d_rgba8888_blend_mono8(const gfx_bitblt_t* bb);
|
||||
bool dma2d_rgba8888_copy_ycbcr420(const gfx_bitblt_t* bb);
|
||||
bool dma2d_rgba8888_copy_ycbcr422(const gfx_bitblt_t* bb);
|
||||
bool dma2d_rgba8888_copy_ycbcr444(const gfx_bitblt_t* bb);
|
||||
bool dma2d_rgba8888_copy_y(const gfx_bitblt_t* bb);
|
||||
#endif
|
||||
|
@ -763,6 +763,37 @@ bool dma2d_rgba8888_blend_mono8(const gfx_bitblt_t* bb) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dma2d_rgba8888_copy_mono8(const gfx_bitblt_t* bb) {
|
||||
dma2d_driver_t* drv = &g_dma2d_driver;
|
||||
|
||||
if (!drv->initialized) {
|
||||
return false;
|
||||
}
|
||||
|
||||
dma2d_wait();
|
||||
|
||||
if (!dma2d_accessible(bb->dst_row) || !dma2d_accessible(bb->src_row)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
drv->handle.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
|
||||
drv->handle.Init.Mode = DMA2D_M2M_PFC;
|
||||
drv->handle.Init.OutputOffset = bb->dst_stride / sizeof(uint32_t) - bb->width;
|
||||
HAL_DMA2D_Init(&drv->handle);
|
||||
|
||||
drv->handle.LayerCfg[1].InputColorMode = DMA2D_INPUT_A8;
|
||||
drv->handle.LayerCfg[1].InputOffset = bb->src_stride - bb->width;
|
||||
drv->handle.LayerCfg[1].AlphaMode = 0;
|
||||
drv->handle.LayerCfg[1].InputAlpha = gfx_color_to_color32(bb->src_fg);
|
||||
HAL_DMA2D_ConfigLayer(&drv->handle, 1);
|
||||
|
||||
HAL_DMA2D_Start(&drv->handle, (uint32_t)bb->src_row + bb->src_x,
|
||||
(uint32_t)bb->dst_row + bb->dst_x * sizeof(uint32_t),
|
||||
bb->width, bb->height);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool dma2d_rgba8888_copy_rgba8888(const gfx_bitblt_t* bb) {
|
||||
dma2d_driver_t* drv = &g_dma2d_driver;
|
||||
|
||||
@ -848,6 +879,34 @@ bool dma2d_rgba8888_copy_ycbcr444(const gfx_bitblt_t* bb) {
|
||||
return dma2d_rgba8888_copy_ycbcr(bb, DMA2D_NO_CSS);
|
||||
}
|
||||
|
||||
bool dma2d_rgba8888_copy_y(const gfx_bitblt_t* bb) {
|
||||
gfx_bitblt_t bb_copy = *bb;
|
||||
|
||||
if (bb->height % 8 != 0 || bb->width % 8 != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// src cotains only Y channel organized in 8x8 blocks
|
||||
|
||||
bb_copy.height = 8;
|
||||
bb_copy.width = 8;
|
||||
bb_copy.src_stride = 8;
|
||||
bb_copy.src_fg = gfx_color_rgb(255, 255, 255);
|
||||
|
||||
for (uint16_t y = 0; y < bb->height; y += 8) {
|
||||
bb_copy.dst_x = 0;
|
||||
for (uint16_t x = 0; x < bb->width; x += 8) {
|
||||
if (!dma2d_rgba8888_copy_mono8(&bb_copy)) {
|
||||
return false;
|
||||
}
|
||||
bb_copy.dst_x += 8;
|
||||
bb_copy.src_row = (uint8_t*)bb_copy.src_row + 64;
|
||||
}
|
||||
bb_copy.dst_y += 8;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Temporary hack to invalidate CLUT cache used in jpeg decoder.
|
||||
// This function should be removed in the future with DMA2D syscalls.
|
||||
void dma2d_invalidate_clut(void) {
|
||||
|
@ -456,7 +456,8 @@ bool jpegdec_get_slice_rgba8888(uint32_t *rgba8888, jpegdec_slice_t *slice) {
|
||||
result = dma2d_rgba8888_copy_ycbcr444(&bb);
|
||||
break;
|
||||
case JPEGDEC_IMAGE_GRAYSCALE:
|
||||
// Conversion from grayscale to RGBA8888 is not supported
|
||||
result = dma2d_rgba8888_copy_y(&bb);
|
||||
break;
|
||||
default:
|
||||
result = false;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user