Skip to content

Commit

Permalink
[component/tgui/scgui_view] prepare vsf_tgui_control_v_draw_tile
Browse files Browse the repository at this point in the history
  • Loading branch information
versaloon committed Jan 10, 2025
1 parent 856ee59 commit 89b9fb8
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 12 deletions.
2 changes: 2 additions & 0 deletions example/tgui/demo/tgui_demo/tgui_demo/tgui_demo.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
35 changes: 35 additions & 0 deletions source/component/ui/tgui/view/scgui_view/scgui.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 9 additions & 0 deletions source/component/ui/tgui/view/scgui_view/scgui.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
69 changes: 59 additions & 10 deletions source/component/ui/tgui/view/scgui_view/vsf_tgui_scguiv_port.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand All @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
11 changes: 11 additions & 0 deletions source/component/ui/tgui/vsf_tgui_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions source/component/ui/tgui/vsf_tgui_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit 89b9fb8

Please sign in to comment.