#include"menu_indicator.h"#include<stddef.h>#include"cfbd_define.h"#include"device/graphic_device.h"#include"menu.h"#include"menu_config.h"staticuint8_ts_indicator_buf[((CFBD_MENU_INDICATOR_MAX_WIDTH_PX+7)/8)*CFBD_MENU_INDICATOR_MAX_HEIGHT_PX];/* compute bytes per row for given pixel width (1bpp) */staticinlinesize_tbytes_per_row_px(uint16_tpx_width){return(px_width+7)/8;}/* fill a byte buffer with 0xFF (set pixels) or 0x00 (clear) */staticvoidblit_fill_rect_bytes(uint8_t*buf,uint16_tw_px,uint16_th_px,uint8_tfill_byte){size_trowb=bytes_per_row_px(w_px);for(uint16_tr=0;r<h_px;++r){uint8_t*rowp=buf+r*rowb;for(size_ti=0;i<rowb;++i){rowp[i]=fill_byte;}}}voidCFBD_InitDefaultMenuIndicator(CFBD_MenuIndicator*menuIndicatorDefault){menuIndicatorDefault->width=CFBD_MENU_INDICATOR_WIDTH;menuIndicatorDefault->x=CFBD_MENU_INDICATOR_POSX;}CFBD_BoolCFBD_DrawMenuIndicator(CFBD_Menu*menu,uint16_tx,uint16_ty,uint16_tw,uint16_th){CFBD_GraphicDevice*dev=menu->device;/* safety clamp (防止越界) */if(w>CFBD_MENU_INDICATOR_MAX_WIDTH_PX||h>CFBD_MENU_INDICATOR_MAX_HEIGHT_PX){returnCFBD_FALSE;}blit_fill_rect_bytes(s_indicator_buf,w,h,0xFF);returndev->ops->setArea(dev,x,y,w,h,s_indicator_buf);}