mirror of
https://github.com/lvgl/lvgl.git
synced 2026-05-29 06:36:05 +08:00
feat(disp): allow rotation with FULL render mode (#8107)
This commit is contained in:
@@ -21,11 +21,14 @@ according to the current rotation settings of the display.
|
|||||||
Note that in :cpp:enumerator:`LV_DISPLAY_RENDER_MODE_DIRECT` the small changed areas
|
Note that in :cpp:enumerator:`LV_DISPLAY_RENDER_MODE_DIRECT` the small changed areas
|
||||||
are rendered directly in the frame buffer so they cannot be
|
are rendered directly in the frame buffer so they cannot be
|
||||||
rotated later. Therefore in direct mode only the whole frame buffer can be rotated.
|
rotated later. Therefore in direct mode only the whole frame buffer can be rotated.
|
||||||
The same is true for :cpp:enumerator:`LV_DISPLAY_RENDER_MODE_FULL`.
|
|
||||||
|
|
||||||
In the case of :cpp:enumerator:`LV_DISPLAY_RENDER_MODE_PARTIAL` the small rendered areas
|
In the case of :cpp:enumerator:`LV_DISPLAY_RENDER_MODE_PARTIAL` the small rendered areas
|
||||||
can be rotated on their own before flushing to the frame buffer.
|
can be rotated on their own before flushing to the frame buffer.
|
||||||
|
|
||||||
|
:cpp:enumerator:`LV_DISPLAY_RENDER_MODE_FULL` can work with rotation if the buffer(s)
|
||||||
|
being rendered to are different than the buffer(s) being rotated to in the flush callback
|
||||||
|
and the buffers being rendered to do not have a stride requirement.
|
||||||
|
|
||||||
Below is an example for rotating when the rendering mode is
|
Below is an example for rotating when the rendering mode is
|
||||||
:cpp:enumerator:`LV_DISPLAY_RENDER_MODE_PARTIAL` and the rotated image should be sent to a
|
:cpp:enumerator:`LV_DISPLAY_RENDER_MODE_PARTIAL` and the rotated image should be sent to a
|
||||||
**display controller**.
|
**display controller**.
|
||||||
|
|||||||
+9
-3
@@ -696,9 +696,15 @@ static void refr_area(const lv_area_t * area_p, int32_t y_offset)
|
|||||||
/*In direct mode and full mode the the buffer area is always the whole screen, not considering rotation*/
|
/*In direct mode and full mode the the buffer area is always the whole screen, not considering rotation*/
|
||||||
layer->buf_area.x1 = 0;
|
layer->buf_area.x1 = 0;
|
||||||
layer->buf_area.y1 = 0;
|
layer->buf_area.y1 = 0;
|
||||||
layer->buf_area.x2 = lv_display_get_original_horizontal_resolution(disp_refr) - 1;
|
if(lv_display_get_matrix_rotation(disp_refr)) {
|
||||||
layer->buf_area.y2 = lv_display_get_original_vertical_resolution(disp_refr) - 1;
|
layer->buf_area.x2 = lv_display_get_original_horizontal_resolution(disp_refr) - 1;
|
||||||
layer_reshape_draw_buf(layer, layer->draw_buf->header.stride);
|
layer->buf_area.y2 = lv_display_get_original_vertical_resolution(disp_refr) - 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
layer->buf_area.x2 = lv_display_get_horizontal_resolution(disp_refr) - 1;
|
||||||
|
layer->buf_area.y2 = lv_display_get_vertical_resolution(disp_refr) - 1;
|
||||||
|
}
|
||||||
|
layer_reshape_draw_buf(layer, disp_refr->stride_is_auto ? LV_STRIDE_AUTO : layer->draw_buf->header.stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Try to divide the area to smaller tiles*/
|
/*Try to divide the area to smaller tiles*/
|
||||||
|
|||||||
@@ -439,6 +439,8 @@ void lv_display_set_draw_buffers(lv_display_t * disp, lv_draw_buf_t * buf1, lv_d
|
|||||||
disp->buf_1 = buf1;
|
disp->buf_1 = buf1;
|
||||||
disp->buf_2 = buf2;
|
disp->buf_2 = buf2;
|
||||||
disp->buf_act = disp->buf_1;
|
disp->buf_act = disp->buf_1;
|
||||||
|
|
||||||
|
disp->stride_is_auto = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lv_display_set_3rd_draw_buffer(lv_display_t * disp, lv_draw_buf_t * buf3)
|
void lv_display_set_3rd_draw_buffer(lv_display_t * disp, lv_draw_buf_t * buf3)
|
||||||
@@ -480,11 +482,19 @@ void lv_display_set_buffers(lv_display_t * disp, void * buf1, void * buf2, uint3
|
|||||||
lv_draw_buf_init(&disp->_static_buf2, w, h, cf, stride, buf2, buf_size);
|
lv_draw_buf_init(&disp->_static_buf2, w, h, cf, stride, buf2, buf_size);
|
||||||
lv_display_set_draw_buffers(disp, &disp->_static_buf1, buf2 ? &disp->_static_buf2 : NULL);
|
lv_display_set_draw_buffers(disp, &disp->_static_buf1, buf2 ? &disp->_static_buf2 : NULL);
|
||||||
lv_display_set_render_mode(disp, render_mode);
|
lv_display_set_render_mode(disp, render_mode);
|
||||||
|
|
||||||
|
/* the stride was not set explicitly */
|
||||||
|
disp->stride_is_auto = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lv_display_set_buffers_with_stride(lv_display_t * disp, void * buf1, void * buf2, uint32_t buf_size,
|
void lv_display_set_buffers_with_stride(lv_display_t * disp, void * buf1, void * buf2, uint32_t buf_size,
|
||||||
uint32_t stride, lv_display_render_mode_t render_mode)
|
uint32_t stride, lv_display_render_mode_t render_mode)
|
||||||
{
|
{
|
||||||
|
if(stride == LV_STRIDE_AUTO) {
|
||||||
|
lv_display_set_buffers(disp, buf1, buf2, buf_size, render_mode);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
LV_ASSERT_MSG(buf1 != NULL, "Null buffer");
|
LV_ASSERT_MSG(buf1 != NULL, "Null buffer");
|
||||||
lv_color_format_t cf = lv_display_get_color_format(disp);
|
lv_color_format_t cf = lv_display_get_color_format(disp);
|
||||||
uint32_t w = lv_display_get_original_horizontal_resolution(disp);
|
uint32_t w = lv_display_get_original_horizontal_resolution(disp);
|
||||||
@@ -505,6 +515,8 @@ void lv_display_set_buffers_with_stride(lv_display_t * disp, void * buf1, void *
|
|||||||
lv_draw_buf_init(&disp->_static_buf2, w, h, cf, stride, buf2, buf_size);
|
lv_draw_buf_init(&disp->_static_buf2, w, h, cf, stride, buf2, buf_size);
|
||||||
lv_display_set_draw_buffers(disp, &disp->_static_buf1, buf2 ? &disp->_static_buf2 : NULL);
|
lv_display_set_draw_buffers(disp, &disp->_static_buf1, buf2 ? &disp->_static_buf2 : NULL);
|
||||||
lv_display_set_render_mode(disp, render_mode);
|
lv_display_set_render_mode(disp, render_mode);
|
||||||
|
|
||||||
|
disp->stride_is_auto = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lv_display_set_render_mode(lv_display_t * disp, lv_display_render_mode_t render_mode)
|
void lv_display_set_render_mode(lv_display_t * disp, lv_display_render_mode_t render_mode)
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ struct _lv_display_t {
|
|||||||
lv_display_render_mode_t render_mode;
|
lv_display_render_mode_t render_mode;
|
||||||
uint32_t antialiasing : 1; /**< 1: anti-aliasing is enabled on this display.*/
|
uint32_t antialiasing : 1; /**< 1: anti-aliasing is enabled on this display.*/
|
||||||
uint32_t tile_cnt : 8; /**< Divide the display buffer into these number of tiles */
|
uint32_t tile_cnt : 8; /**< Divide the display buffer into these number of tiles */
|
||||||
|
uint32_t stride_is_auto : 1; /**< 1: The stride of the buffers was not set explicitly. */
|
||||||
|
|
||||||
|
|
||||||
/** 1: The current screen rendering is in progress*/
|
/** 1: The current screen rendering is in progress*/
|
||||||
|
|||||||
Reference in New Issue
Block a user