|
发表于 2021-11-30 14:24:07
|
显示全部楼层
GX_RECTANGLE Limit;
GX_RECTANGLE Copy;
ULONG offset;
INT copy_width;
INT copy_height;
INT row;
INT frame_pitch_offset;
USHORT *get;
USHORT *put;
gx_utility_rectangle_define(&Limit, 0, 0,
canvas->gx_canvas_x_resolution - 1,
canvas->gx_canvas_y_resolution - 1);
// 切换可见帧:
visible_frame ^= 1;
int working_frame = visible_frame ^ 0x01;
LCD_FillFrameBuffer(s_psBufferLcd[1U]);
ELCDIF_SetNextBufferAddr(LCDIF, (uint32_t) s_psBufferLcd[visible_frame]);/* 设置ELCDIF的下一个缓冲区地址 */
canvas ->gx_canvas_memory = (ULONG *) s_psBufferLcd[working_frame];
// 等待硬件完成当前帧:
gx_frame_done = GX_FALSE;
while(!gx_frame_done)
{
}
/* 从新可见框架复制到新工作框架 */
if (gx_utility_rectangle_overlap_detect(&Limit, &canvas->gx_canvas_dirty_area, &Copy))
{
/* 将修改部分从可见框架复制到工作框架 */
copy_width = Copy.gx_rectangle_right - Copy.gx_rectangle_left + 1;
copy_height = Copy.gx_rectangle_bottom - Copy.gx_rectangle_top + 1;
offset = Copy.gx_rectangle_top * canvas -> gx_canvas_x_resolution;
offset += Copy.gx_rectangle_left;
get = (USHORT *)s_psBufferLcd[visible_frame];
get += offset;
// 通过dirty rect pos进行偏移
put = (USHORT *)canvas->gx_canvas_memory;
// 按画布偏移进行偏移:
offset = (canvas->gx_canvas_display_offset_y + Copy.gx_rectangle_top) * canvas->gx_canvas_x_resolution;
offset += canvas->gx_canvas_display_offset_x + Copy.gx_rectangle_left;
put += offset;
frame_pitch_offset = canvas -> gx_canvas_x_resolution;
for(row = 0; row < copy_height; row++)
{
memcpy(put, get, copy_width * 2);
put += frame_pitch_offset;
get += frame_pitch_offset;
}
} |
|