From 89b9fb8c4fa5eff54f3505b4525c14c5768a33e9 Mon Sep 17 00:00:00 2001 From: vsfos Date: Sat, 11 Jan 2025 04:02:47 +0800 Subject: [PATCH] [component/tgui/scgui_view] prepare vsf_tgui_control_v_draw_tile --- .../tgui/demo/tgui_demo/tgui_demo/tgui_demo.c | 2 + .../component/ui/tgui/view/scgui_view/scgui.c | 35 ++++++++++ .../component/ui/tgui/view/scgui_view/scgui.h | 9 +++ .../view/scgui_view/vsf_tgui_scguiv_control.c | 3 +- .../view/scgui_view/vsf_tgui_scguiv_port.c | 69 ++++++++++++++++--- .../view/simple_view/vsf_tgui_sv_control.c | 6 +- source/component/ui/tgui/vsf_tgui_common.c | 11 +++ source/component/ui/tgui/vsf_tgui_common.h | 3 + 8 files changed, 126 insertions(+), 12 deletions(-) diff --git a/example/tgui/demo/tgui_demo/tgui_demo/tgui_demo.c b/example/tgui/demo/tgui_demo/tgui_demo/tgui_demo.c index 0682b6b34..d81897554 100644 --- a/example/tgui/demo/tgui_demo/tgui_demo/tgui_demo.c +++ b/example/tgui/demo/tgui_demo/tgui_demo/tgui_demo.c @@ -92,6 +92,8 @@ unsigned char * vsf_tgui_tile_get_pixelmap(const vsf_tgui_tile_t *tile_ptr) if (tile_ptr->_.tCore.Attribute.u2RootTileType == 0) { // buf tile return (unsigned char *)&__tiles_data[(uint32_t)tile_ptr->tBufRoot.ptBitmap]; + } else if (tile_ptr->_.tCore.Attribute.u2RootTileType == 2) { // buf_addr tile + return (unsigned char *)tile_ptr->tBufRoot.ptBitmap; } else { // index tile VSF_TGUI_ASSERT(0); return NULL; diff --git a/source/component/ui/tgui/view/scgui_view/scgui.c b/source/component/ui/tgui/view/scgui_view/scgui.c index 3e30e4b49..c23e8a420 100644 --- a/source/component/ui/tgui/view/scgui_view/scgui.c +++ b/source/component/ui/tgui/view/scgui_view/scgui.c @@ -130,6 +130,41 @@ void SC_pfb_DrawFill(SC_tile *dest,int xs,int ys,int xe,int ye,uint16_t fc) } } +/**fun: 显示图片*/ +void SC_pfb_Image(SC_tile *dest,int xs,int ys,SC_img_t *src) +{ + //===========计算相交=============== + SC_ARER intersection; + if(!SC_pfb_intersection(dest,&intersection,xs,ys,xs+src->w-1,ys+src->h-1)) + { + return; + } + if (intersection.xs < gui->lcd_area.xs) { + intersection.xs = gui->lcd_area.xs; + } + if (intersection.ys < gui->lcd_area.ys) { + intersection.ys = gui->lcd_area.ys; + } + if (intersection.xe > gui->lcd_area.xe) { + intersection.xe = gui->lcd_area.xe; + } + if (intersection.ye > gui->lcd_area.ye) { + intersection.ye = gui->lcd_area.ye; + } + uint16_t *Image=(uint16_t*)src->map; + uint16_t pitch = 0; + for (int y = intersection.ys; y <=intersection.ye; y++) + { + int dest_offs=(y-dest->ys) * dest->w -dest->xs; + int src_offs= (y-ys) * src->w - xs; + for (int x = intersection.xs; x <=intersection.xe; x++) + { + dest->buf[dest_offs+x]=Image[src_offs+x+pitch]; + } + pitch+=src->pitch; + } +} + ///=============================字体位图================================================ /**fun: get_bpp_value*/ static inline uint16_t get_bpp_value(const uint8_t *buffer,uint16_t offset, uint8_t bpp) diff --git a/source/component/ui/tgui/view/scgui_view/scgui.h b/source/component/ui/tgui/view/scgui_view/scgui.h index 1f88dc7ab..3c0b5da76 100644 --- a/source/component/ui/tgui/view/scgui_view/scgui.h +++ b/source/component/ui/tgui/view/scgui_view/scgui.h @@ -41,6 +41,14 @@ typedef struct int ye; } SC_ARER; +typedef struct +{ + const uint8_t *map; + uint16_t w; + uint16_t h; + uint16_t pitch; +} SC_img_t; + typedef struct { // uint16_t state; @@ -68,6 +76,7 @@ uint16_t alphaBlend( uint16_t fc, uint16_t bc,uint8_t alpha); void SC_GUI_Init(uint16_t bkc,uint16_t bc,uint16_t fc); void SC_pfb_clip(SC_tile *clip, int xs,int ys,int xe,int ye,uint16_t colour); void SC_pfb_DrawFill(SC_tile *dest,int xs,int ys,int xe,int ye,uint16_t fc); +void SC_pfb_Image(SC_tile *dest,int xs,int ys,SC_img_t *src); void SC_pfb_RoundFrame(SC_tile *dest,int xs,int ys,int xe,int ye, int r,int ir, uint16_t ac,uint16_t bc); int SC_pfb_printf(SC_tile *dest, int x,int y,const char* txt,uint16_t fc,uint16_t bc, lv_font_t* font, int width, int line_space, SC_ALIGN align); diff --git a/source/component/ui/tgui/view/scgui_view/vsf_tgui_scguiv_control.c b/source/component/ui/tgui/view/scgui_view/vsf_tgui_scguiv_control.c index bf19fc1c7..14b39b234 100644 --- a/source/component/ui/tgui/view/scgui_view/vsf_tgui_scguiv_control.c +++ b/source/component/ui/tgui/view/scgui_view/vsf_tgui_scguiv_control.c @@ -81,13 +81,14 @@ fsm_rt_t vsf_tgui_control_v_rendering( vsf_tgui_t* gui_ptr, vsf_tgui_region_t draw_abs_region = { 0 }; vsf_tgui_control_calculate_absolute_location(control_ptr, &draw_abs_region.tLocation); + vsf_tgui_region_t dirty_abs_region = *dirty_region_ptr; vsf_tgui_control_calculate_absolute_location(control_ptr, &dirty_abs_region.tLocation); - gui->lcd_area.xs = dirty_abs_region.iX; gui->lcd_area.ys = dirty_abs_region.iY; gui->lcd_area.xe = dirty_abs_region.iX + dirty_abs_region.iWidth - 1; gui->lcd_area.ye = dirty_abs_region.iY + dirty_abs_region.iHeight - 1; + SC_pfb_RoundFrame(&gui_ptr->cur_tile, draw_abs_region.iX, draw_abs_region.iY, draw_abs_region.iX + control_ptr->iWidth - 1, diff --git a/source/component/ui/tgui/view/scgui_view/vsf_tgui_scguiv_port.c b/source/component/ui/tgui/view/scgui_view/vsf_tgui_scguiv_port.c index 672144893..f06cd8c2c 100644 --- a/source/component/ui/tgui/view/scgui_view/vsf_tgui_scguiv_port.c +++ b/source/component/ui/tgui/view/scgui_view/vsf_tgui_scguiv_port.c @@ -40,6 +40,13 @@ /*============================ PROTOTYPES ====================================*/ /*============================ IMPLEMENTATION ================================*/ +VSF_CAL_WEAK(vsf_tgui_tile_get_pixelmap) +unsigned char* vsf_tgui_tile_get_pixelmap(const vsf_tgui_tile_t *tile_ptr) +{ + VSF_TGUI_ASSERT(0); + return NULL; +} + /**********************************************************************************/ /*! \brief begin a refresh loop *! \param gui_ptr the tgui object address @@ -277,9 +284,9 @@ void vsf_tgui_control_v_draw_text( vsf_tgui_t* gui_ptr, vsf_tgui_region_update_with_align(&text_abs_region, &temp_region, mode); text_abs_region.iX = 0; vsf_tgui_control_calculate_absolute_location(control_ptr, &text_abs_region.tLocation); + vsf_tgui_region_t dirty_abs_region = *dirty_region_ptr; vsf_tgui_control_calculate_absolute_location(control_ptr, &dirty_abs_region.tLocation); - gui->lcd_area.xs = dirty_abs_region.iX; gui->lcd_area.ys = dirty_abs_region.iY; gui->lcd_area.xe = dirty_abs_region.iX + dirty_abs_region.iWidth - 1; @@ -293,16 +300,58 @@ void vsf_tgui_control_v_draw_text( vsf_tgui_t* gui_ptr, gui->alpha = alpha; } -extern void vsf_tgui_control_v_draw_tile(vsf_tgui_t* gui_ptr, - const vsf_tgui_control_t* control_ptr, - const vsf_tgui_region_t* dirty_region_ptr, - const vsf_tgui_tile_t* tile_ptr, - const vsf_tgui_align_mode_t mode, - const uint8_t trans_rate, - vsf_tgui_region_t* ptPlacedRegion, - vsf_tgui_v_color_t color, - vsf_tgui_v_color_t bg_color) +void vsf_tgui_control_v_draw_tile( vsf_tgui_t* gui_ptr, + const vsf_tgui_control_t* control_ptr, + const vsf_tgui_region_t* dirty_region_ptr, + const vsf_tgui_tile_t* tile_ptr, + const vsf_tgui_align_mode_t mode, + const uint8_t trans_rate, + vsf_tgui_region_t* placed_region_ptr, + vsf_tgui_v_color_t color, + vsf_tgui_v_color_t bg_color) { + vsf_tgui_region_t resource_region; + + tile_ptr = vsf_tgui_tile_get_root(tile_ptr, &resource_region); + VSF_TGUI_ASSERT(tile_ptr != NULL); + vsf_tgui_size_t tile_size = vsf_tgui_root_tile_get_size(tile_ptr); + + if (placed_region_ptr != NULL) { + *placed_region_ptr = resource_region; + } + + vsf_tgui_region_t image_abs_region = { + .tSize = control_ptr->tSize, + }; + vsf_tgui_region_update_with_align(&image_abs_region, &resource_region, mode); + vsf_tgui_control_calculate_absolute_location(control_ptr, &image_abs_region.tLocation); + + vsf_tgui_region_t dirty_abs_region = *dirty_region_ptr; + vsf_tgui_control_calculate_absolute_location(control_ptr, &dirty_abs_region.tLocation); + gui->lcd_area.xs = dirty_abs_region.iX; + gui->lcd_area.ys = dirty_abs_region.iY; + gui->lcd_area.xe = dirty_abs_region.iX + dirty_abs_region.iWidth - 1; + gui->lcd_area.ye = dirty_abs_region.iY + dirty_abs_region.iHeight - 1; + + uint16_t pixel_size = vsf_tgui_root_tile_get_pixel_bitsize(tile_ptr); + SC_img_t img = { + .map = vsf_tgui_tile_get_pixelmap(tile_ptr) + resource_region.iX * 16, + .w = vsf_min(resource_region.iWidth, tile_size.iWidth - resource_region.iX), + .h = vsf_min(resource_region.iHeight, tile_size.iHeight - resource_region.iY), + .pitch = (tile_ptr->tBufRoot.iWidth * pixel_size) >> 3, + }; + + switch (tile_ptr->tCore.Attribute.u2ColorType) { + case VSF_TGUI_TILE_COLORTYPE_RGB: + switch (pixel_size) { + case 16: + SC_pfb_Image(&gui_ptr->cur_tile, image_abs_region.iX, image_abs_region.iY, &img); + break; + } + break; + default: + break; + } } #endif diff --git a/source/component/ui/tgui/view/simple_view/vsf_tgui_sv_control.c b/source/component/ui/tgui/view/simple_view/vsf_tgui_sv_control.c index b2233e1e0..7b085a307 100644 --- a/source/component/ui/tgui/view/simple_view/vsf_tgui_sv_control.c +++ b/source/component/ui/tgui/view/simple_view/vsf_tgui_sv_control.c @@ -121,11 +121,15 @@ fsm_rt_t vsf_tgui_control_v_rendering( vsf_tgui_t* gui_ptr, VSF_TGUI_LOG(VSF_TRACE_INFO, "[Simple View]%s(%p) control view rendering" VSF_TRACE_CFG_LINEEND, vsf_tgui_control_get_node_name(control_ptr), control_ptr); #endif + if (control_ptr->__skip_frame) { + return fsm_rt_cpl; + } + #if VSF_TGUI_CFG_V_SUPPORT_FLUXIBLE_BACKGROUND_COLOR == ENABLED || VSF_TGUI_CFG_V_SUPPORT_FIXED_BACKGROUND_COLOR == ENABLED vsf_tgui_v_color_t color = vsf_tgui_sv_get_background_color(control_ptr); vsf_tgui_v_color_t bg_color = vsf_tgui_sv_get_parent_background_color(control_ptr); uint_fast8_t trans_rate = vsf_tgui_sv_color_get_trans_rate(color); - if (trans_rate && !control_ptr->__skip_frame) { + if (trans_rate) { vsf_tgui_region_t region = { .tLocation = {.iX = 0, .iY = 0}, .tSize = *vsf_tgui_control_get_size(control_ptr), diff --git a/source/component/ui/tgui/vsf_tgui_common.c b/source/component/ui/tgui/vsf_tgui_common.c index b86949140..81c6b1696 100644 --- a/source/component/ui/tgui/vsf_tgui_common.c +++ b/source/component/ui/tgui/vsf_tgui_common.c @@ -66,6 +66,17 @@ vsf_tgui_size_t vsf_tgui_root_tile_get_size(const vsf_tgui_tile_t* ptTile) } } +uint16_t vsf_tgui_root_tile_get_pixel_bitsize(const vsf_tgui_tile_t* ptTile) +{ + VSF_TGUI_ASSERT(ptTile != NULL); + VSF_TGUI_ASSERT(ptTile->_.tCore.Attribute.bIsRootTile == 1); + static const uint16_t __color_sizes[8] = { + /* 0: 1bit, 2: 4bit, 3: 8bit 4: 16bit, 5: 32bit, 6: 24bit */ + 1, 0, 4, 8, 16, 32, 24, 0 + }; + + return __color_sizes[ptTile->tCore.Attribute.u3ColorSize]; +} vsf_tgui_tile_t* vsf_tgui_tile_get_root( const vsf_tgui_tile_t* ptTile, vsf_tgui_region_t* region_ptr) diff --git a/source/component/ui/tgui/vsf_tgui_common.h b/source/component/ui/tgui/vsf_tgui_common.h index 74bc99f74..e92dc1c39 100644 --- a/source/component/ui/tgui/vsf_tgui_common.h +++ b/source/component/ui/tgui/vsf_tgui_common.h @@ -597,6 +597,9 @@ vsf_tgui_tile_t* vsf_tgui_tile_get_root( const vsf_tgui_tile_t* ptTile, extern vsf_tgui_size_t vsf_tgui_root_tile_get_size(const vsf_tgui_tile_t* ptTile); +extern +uint16_t vsf_tgui_root_tile_get_pixel_bitsize(const vsf_tgui_tile_t* ptTile); + extern bool vsf_tgui_tile_is_root(const vsf_tgui_tile_t* ptTile);