From 8f0d0a3a52ce2e22bde34793647cbe2a930452f0 Mon Sep 17 00:00:00 2001 From: yuquanjun Date: Fri, 4 Sep 2026 08:50:00 +0800 Subject: [PATCH] Fix status-bar battery to match mode.png with intact percent. Replace the mistaken fill bitmap that embedded "80%" text with a solid level bar, right-align size-9 "N%" with reserved 100% width, and refresh Free/Expert battery updates. Co-authored-by: Cursor --- UI/UI_ExpertMode.c | 8 +- UI/UI_FreeMode.c | 8 +- UI/UI_global.c | 30 +++-- UI/UI_global.h | 6 +- .../LCD_ILI9341/Drv_ILI9341_Lcd_ChineseFont.h | 106 +++++++++--------- .../LCD_ILI9341/Drv_ILI9341_Lcd_EnglishFont.h | 12 +- tools/gen_ui0902_assets.py | 12 +- tools/gen_wqy_font.py | 22 +++- 8 files changed, 119 insertions(+), 85 deletions(-) diff --git a/UI/UI_ExpertMode.c b/UI/UI_ExpertMode.c index aa3e69b..a6c0f0c 100644 --- a/UI/UI_ExpertMode.c +++ b/UI/UI_ExpertMode.c @@ -27,13 +27,7 @@ void UI_ExpertMode_Process(DisplayTaskMessage_Type msg) } break; case MSG_ID_BATTERY_VALUE: -// if(usb_charging_state) -// { -// Draw_Battery_Icon(180, 5, msg.DataU16[1], 1, GREEN, BLACK, GREEN); -// }else -// { -// Draw_Battery_Icon(180, 5, msg.DataU16[1], 1, WHITE, BLACK, WHITE); -// } + Draw_Status_Battery_Icon(percentage); break; case MSG_ID_TAP_SPEED: diff --git a/UI/UI_FreeMode.c b/UI/UI_FreeMode.c index 6a1491e..d191c62 100644 --- a/UI/UI_FreeMode.c +++ b/UI/UI_FreeMode.c @@ -28,13 +28,7 @@ void UI_FreeMode_Process(DisplayTaskMessage_Type msg) } break; case MSG_ID_BATTERY_VALUE: -// if(usb_charging_state) -// { -// Draw_Battery_Icon(180, 5, msg.DataU16[1], 1, GREEN, BLACK, GREEN); -// }else -// { -// Draw_Battery_Icon(180, 5, msg.DataU16[1], 1, WHITE, BLACK, WHITE); -// } + Draw_Status_Battery_Icon(percentage); break; case MSG_ID_TAP_SPEED: diff --git a/UI/UI_global.c b/UI/UI_global.c index 2406db0..d212152 100644 --- a/UI/UI_global.c +++ b/UI/UI_global.c @@ -271,27 +271,43 @@ void Draw_Status_Battery_Icon(uint8_t battery_percent) { uint8_t Info[8]; uint16_t fill_w; - uint16_t text_w; + uint16_t slot_w; + uint16_t actual_w; uint16_t bat_x; uint16_t text_x; uint16_t text_y; + uint16_t fill_x1, fill_y1, fill_x2, fill_y2; + uint8_t adv = UI0902_ASCII_W(UI0902_BATTERY_TEXT_SIZE); if (battery_percent > 100) battery_percent = 100; sprintf((char *)Info, "%d%%", battery_percent); - text_w = (uint16_t)(strlen((char *)Info) * (UI0902_BATTERY_TEXT_SIZE / 2)); - bat_x = (uint16_t)(240 - UI0902_BATTERY_RIGHT_MARGIN - text_w + actual_w = (uint16_t)(strlen((char *)Info) * adv); + /* 固定按「100%」占位,右对齐,切换位数时图标不跳、% 不被切 */ + slot_w = (uint16_t)(4u * adv); + + bat_x = (uint16_t)(240 - UI0902_BATTERY_RIGHT_MARGIN - slot_w - UI0902_BATTERY_TEXT_GAP - UI0902_BATTERY_W); - text_x = (uint16_t)(bat_x + UI0902_BATTERY_W + UI0902_BATTERY_TEXT_GAP); - text_y = (uint16_t)((UI_STATUS_BAR_H - UI0902_BATTERY_TEXT_SIZE) / 2); + text_x = (uint16_t)(bat_x + UI0902_BATTERY_W + UI0902_BATTERY_TEXT_GAP + + (slot_w - actual_w)); + text_y = (uint16_t)(UI0902_BATTERY_Y + + ((int16_t)UI0902_BATTERY_H - (int16_t)UI0902_BATTERY_TEXT_SIZE) / 2); + if ((int16_t)text_y < 0) + text_y = 0; LCD_FillByColor(bat_x > 2 ? (uint16_t)(bat_x - 2) : 0, 0, 240, UI_STATUS_BAR_H, UI0902_BG_COLOR); + /* 实心电量条(旧 fill 图误含「80%」文字) */ fill_w = (uint16_t)((22UL * battery_percent) / 100); - LCD_WR_PIC_ClipX(bat_x + 3, UI0902_BATTERY_Y + 2, 22, 9, fill_w, - gImage_UI0902_BatteryFill_22x9); + if (fill_w > 0) { + fill_x1 = (uint16_t)(bat_x + 3); + fill_y1 = (uint16_t)(UI0902_BATTERY_Y + 2); + fill_x2 = (uint16_t)(fill_x1 + fill_w - 1); + fill_y2 = (uint16_t)(fill_y1 + 8); + LCD_FillByColor(fill_x1, fill_y1, fill_x2, fill_y2, WHITE); + } LCD_WR_PIC_Trans(bat_x, UI0902_BATTERY_Y, UI0902_BATTERY_W, UI0902_BATTERY_H, gImage_UI0902_BatteryOutline_29x12, BLACK); LCD_ShowString(text_x, text_y, Info, WHITE, UI0902_BG_COLOR, diff --git a/UI/UI_global.h b/UI/UI_global.h index 54aebcc..fe50e77 100644 --- a/UI/UI_global.h +++ b/UI/UI_global.h @@ -122,10 +122,10 @@ void CallUI_RestoreSelect(void); #define UI0902_BT_Y 5 #define UI0902_BATTERY_W 29 #define UI0902_BATTERY_H 12 -#define UI0902_BATTERY_Y 7 -#define UI0902_BATTERY_RIGHT_MARGIN 8 +#define UI0902_BATTERY_Y 14 /* mode.png 状态栏电池顶 ≈y14 */ +#define UI0902_BATTERY_RIGHT_MARGIN 6 #define UI0902_BATTERY_TEXT_GAP 4 -#define UI0902_BATTERY_TEXT_SIZE 12 +#define UI0902_BATTERY_TEXT_SIZE 9 /* mode.png 百分比字号 ≈9,完整显示 % */ #define UI0902_NAV_UNIVERSAL 0 /* 底栏:万能模式 */ #define UI0902_NAV_NORMAL 1 /* 底栏:普通模式 */ #define UI0902_NAV_EXPERT 2 /* 底栏:专业模式 */ diff --git a/device/LCD_ILI9341/Drv_ILI9341_Lcd_ChineseFont.h b/device/LCD_ILI9341/Drv_ILI9341_Lcd_ChineseFont.h index f07bdb1..fa4ffba 100644 --- a/device/LCD_ILI9341/Drv_ILI9341_Lcd_ChineseFont.h +++ b/device/LCD_ILI9341/Drv_ILI9341_Lcd_ChineseFont.h @@ -954,64 +954,64 @@ const unsigned char Chinese_font_12[][24] = { }; const unsigned char Chinese_font_9[][18] = { -{0x18,0x00,0x60,0x00,0xFA,0x80,0x22,0x80,0x32,0x80,0x2A,0x80,0x6A,0x80,0x23,0x80,0x20,0x00},/*"和",0*/ -{0xE4,0x00,0x22,0x00,0xE2,0x00,0x85,0x00,0x8E,0x00,0xE0,0x00,0x22,0x00,0x9E,0x80,0x48,0x80},/*"弦",1*/ +{0x18,0x00,0x60,0x00,0xF2,0x80,0x32,0x80,0x32,0x80,0x2A,0x80,0x22,0x80,0x23,0x80,0x20,0x00},/*"和",0*/ +{0xE4,0x00,0x36,0x00,0xF6,0x00,0x84,0x00,0x8E,0x00,0xE0,0x00,0x20,0x00,0x1E,0x80,0x48,0x80},/*"弦",1*/ {0x08,0x00,0x7F,0x00,0x08,0x00,0xFF,0x80,0x08,0x00,0x08,0x00,0x0F,0x00,0x68,0x00,0x9F,0x80},/*"走",2*/ -{0x10,0x00,0x20,0x00,0x81,0x00,0xBD,0x00,0xA5,0x00,0xA5,0x00,0xBD,0x00,0x81,0x00,0x83,0x00},/*"向",3*/ -{0xE4,0x00,0x22,0x00,0xE2,0x00,0x85,0x00,0x8E,0x00,0xE0,0x00,0x22,0x00,0x9E,0x80,0x48,0x80},/*"弦",4*/ -{0x08,0x00,0x7F,0x00,0x14,0x00,0xFF,0x80,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x3E,0x00},/*"音",5*/ -{0x10,0x00,0x3E,0x00,0x7F,0x00,0x89,0x00,0x09,0x00,0x3F,0x00,0x00,0x00,0x00,0x80,0x3F,0x80},/*"色",6*/ -{0x4A,0x00,0x0A,0x00,0x12,0x00,0xDF,0x80,0x04,0x00,0x04,0x80,0x08,0x80,0x60,0x00,0x9F,0x80},/*"选",7*/ -{0x44,0x00,0x03,0x00,0x09,0x00,0xC9,0x00,0x04,0x00,0x04,0x00,0x12,0x00,0x09,0x00,0x10,0x80},/*"择",8*/ -{0xFA,0x00,0x12,0x00,0x94,0x80,0xFC,0x00,0x10,0x00,0xD0,0x00,0x93,0x00,0x14,0x80,0x38,0x80},/*"歌",9*/ -{0x12,0x00,0x12,0x00,0x52,0x80,0x52,0x80,0x52,0x80,0x7F,0x80,0x52,0x80,0x7F,0x80,0x40,0x80},/*"曲",10*/ -{0x10,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00},/*"自",11*/ +{0x10,0x00,0x30,0x00,0x81,0x00,0x99,0x00,0xA5,0x00,0xB5,0x00,0x99,0x00,0x81,0x00,0x83,0x00},/*"向",3*/ +{0xE4,0x00,0x36,0x00,0xF6,0x00,0x84,0x00,0x8E,0x00,0xE0,0x00,0x20,0x00,0x1E,0x80,0x48,0x80},/*"弦",4*/ +{0x08,0x00,0x7F,0x00,0x14,0x00,0xFF,0x80,0x00,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0x3E,0x00},/*"音",5*/ +{0x10,0x00,0x3E,0x00,0x7F,0x00,0xE9,0x00,0x29,0x00,0x3F,0x00,0x00,0x00,0x00,0x80,0x3F,0x80},/*"色",6*/ +{0x4A,0x00,0x0E,0x00,0x06,0x00,0xDF,0x80,0x06,0x00,0x00,0x80,0x00,0x80,0x60,0x00,0x9F,0x80},/*"选",7*/ +{0x44,0x00,0x03,0x00,0x09,0x00,0xC9,0x00,0x04,0x00,0x04,0x00,0x30,0x00,0x21,0x00,0x10,0x80},/*"择",8*/ +{0xFA,0x00,0x12,0x00,0xD4,0x80,0xFC,0x00,0x10,0x00,0xD0,0x00,0xD3,0x00,0x14,0x80,0x18,0x80},/*"歌",9*/ +{0x12,0x00,0x16,0x00,0x5E,0x80,0x52,0x80,0x52,0x80,0x7F,0x80,0x52,0x80,0x7F,0x80,0x40,0x80},/*"曲",10*/ +{0x10,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x22,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x22,0x00},/*"自",11*/ {0x08,0x00,0x08,0x00,0x49,0x00,0x49,0x00,0x7F,0x00,0x49,0x00,0x49,0x00,0x7F,0x00,0x41,0x00},/*"由",12*/ -{0x00,0x00,0xFF,0x80,0x10,0x00,0x1E,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x46,0x00},/*"万",13*/ -{0x02,0x00,0x53,0x00,0x02,0x80,0x7B,0x80,0x48,0x00,0x7B,0x00,0x4A,0x00,0x4A,0x80,0x5B,0x80},/*"能",14*/ -{0x4E,0x00,0x08,0x00,0x11,0x80,0xC0,0x00,0x1F,0x00,0x09,0x00,0x04,0x00,0x04,0x00,0x39,0x80},/*"设",15*/ -{0x7F,0x00,0x55,0x00,0x08,0x00,0xFF,0x80,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0xFF,0x80},/*"置",16*/ -{0x22,0x00,0xC7,0x80,0xF5,0x00,0x02,0x00,0x2C,0x00,0x13,0x80,0x44,0x80,0x00,0x00,0x0E,0x00},/*"移",17*/ -{0x5F,0x80,0x12,0x80,0xD2,0x80,0x1F,0x80,0x10,0x80,0x16,0x80,0x14,0x80,0x10,0x80,0x21,0x80},/*"调",18*/ -{0x42,0x00,0x3F,0x80,0x1F,0x80,0xD2,0x80,0x1F,0x80,0x06,0x00,0x0B,0x00,0x62,0x00,0x9F,0x80},/*"速",19*/ -{0x08,0x00,0x7F,0x80,0x7F,0x00,0x52,0x00,0x5E,0x00,0x40,0x00,0x7E,0x00,0x8C,0x00,0xB3,0x00},/*"度",20*/ -{0x42,0x00,0x1F,0x80,0xBF,0x80,0x62,0x00,0x0F,0x00,0x0B,0x00,0xCF,0x00,0x4F,0x00,0x59,0x80},/*"演",21*/ -{0x08,0x00,0x7F,0x00,0xFF,0x80,0x22,0x00,0x3E,0x00,0xC9,0x80,0x3E,0x00,0x22,0x00,0x41,0x00},/*"奏",22*/ -{0x36,0x00,0x44,0x00,0x69,0x80,0x40,0x00,0x6F,0x00,0x49,0x00,0x44,0x00,0x44,0x00,0x59,0x80},/*"段",23*/ -{0x22,0x00,0xFF,0x80,0x4E,0x00,0x18,0x00,0x86,0x00,0x68,0x00,0x11,0x80,0x48,0x00,0x4E,0x00},/*"落",24*/ -{0x00,0x00,0xFF,0x80,0x10,0x00,0x1E,0x00,0x10,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x46,0x00},/*"万",25*/ -{0x02,0x00,0x53,0x00,0x02,0x80,0x7B,0x80,0x48,0x00,0x7B,0x00,0x4A,0x00,0x4A,0x80,0x5B,0x80},/*"能",26*/ -{0x22,0x00,0x7F,0x00,0x14,0x00,0xFF,0x80,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x3E,0x00},/*"普",27*/ -{0x5F,0x00,0x04,0x00,0x12,0x80,0xDF,0x80,0x12,0x80,0x1F,0x80,0x12,0x80,0x60,0x00,0x9F,0x80},/*"通",28*/ -{0x08,0x00,0x3F,0x00,0x08,0x00,0xFF,0x80,0x10,0x00,0x3F,0x00,0x00,0x00,0x04,0x00,0x02,0x00},/*"专",29*/ -{0x12,0x00,0x12,0x00,0x92,0x80,0x53,0x00,0x13,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0xFF,0x80},/*"业",30*/ -{0x04,0x00,0x1F,0x80,0x0F,0x00,0x29,0x00,0x5F,0x00,0x49,0x00,0x9F,0x80,0x04,0x00,0x19,0x80},/*"模",31*/ -{0x04,0x00,0x05,0x00,0xFF,0x80,0x04,0x00,0x74,0x00,0x24,0x00,0x22,0x00,0x30,0x80,0xC1,0x80},/*"式",32*/ -{0x7F,0x80,0x48,0x80,0x7E,0x80,0x48,0x80,0x7E,0x80,0x62,0x80,0x62,0x80,0x40,0x80,0x7F,0x80},/*"固",33*/ -{0x22,0x00,0x2A,0x00,0x1F,0x00,0x62,0x00,0x82,0x00,0x1F,0x80,0x02,0x00,0x02,0x00,0x02,0x00},/*"件",34*/ -{0x21,0x00,0x6E,0x00,0x7F,0x80,0x4D,0x00,0x4B,0x00,0x6B,0x00,0x68,0x00,0xAB,0x00,0xB4,0x80},/*"版",35*/ -{0x08,0x00,0x08,0x00,0x1C,0x00,0x2A,0x00,0x2A,0x00,0x08,0x00,0x49,0x00,0x08,0x00,0x08,0x00},/*"本",36*/ -{0x22,0x00,0xFF,0x80,0x64,0x00,0x67,0x00,0x6A,0x00,0x20,0x00,0x7F,0x00,0x55,0x00,0xFF,0x80},/*"蓝",37*/ +{0x00,0x00,0xFF,0x80,0x10,0x00,0x1E,0x00,0x12,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x46,0x00},/*"万",13*/ +{0x02,0x00,0xD3,0x00,0x02,0x00,0x7B,0x80,0x48,0x00,0x7B,0x00,0x4A,0x00,0x4A,0x80,0x5B,0x80},/*"能",14*/ +{0x4E,0x00,0x08,0x00,0x01,0x80,0xC0,0x00,0x1F,0x00,0x09,0x00,0x24,0x00,0x24,0x00,0x39,0x80},/*"设",15*/ +{0x7F,0x00,0x5D,0x00,0x08,0x00,0xFF,0x80,0x22,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0xFF,0x80},/*"置",16*/ +{0x22,0x00,0xC7,0x80,0xF0,0x00,0x62,0x00,0x2E,0x00,0x43,0x80,0x44,0x80,0x00,0x00,0x0E,0x00},/*"移",17*/ +{0x5F,0x80,0x16,0x80,0xD6,0x80,0x5F,0x80,0x10,0x80,0x16,0x80,0x36,0x80,0x30,0x80,0x21,0x80},/*"调",18*/ +{0x42,0x00,0x3F,0x80,0x0F,0x80,0xD6,0x80,0x1F,0x80,0x06,0x00,0x02,0x00,0x62,0x00,0x9F,0x80},/*"速",19*/ +{0x08,0x00,0x7F,0x80,0x7F,0x00,0x56,0x00,0x5C,0x00,0x40,0x00,0x5E,0x00,0x8C,0x00,0xB3,0x00},/*"度",20*/ +{0x42,0x00,0x1F,0x80,0x1F,0x80,0x36,0x00,0x0F,0x00,0x0F,0x00,0xCF,0x00,0x4F,0x00,0x59,0x80},/*"演",21*/ +{0x08,0x00,0x7F,0x00,0xFF,0x80,0x36,0x00,0x3E,0x00,0xC9,0x80,0x3E,0x00,0x00,0x00,0x41,0x00},/*"奏",22*/ +{0x36,0x00,0x44,0x00,0x61,0x80,0x40,0x00,0x6F,0x00,0x49,0x00,0xC4,0x00,0xC4,0x00,0x59,0x80},/*"段",23*/ +{0x22,0x00,0xFF,0x80,0x06,0x00,0x0A,0x00,0x86,0x00,0x68,0x00,0x01,0x80,0xCA,0x00,0x4E,0x00},/*"落",24*/ +{0x00,0x00,0xFF,0x80,0x10,0x00,0x1E,0x00,0x12,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x46,0x00},/*"万",25*/ +{0x02,0x00,0xD3,0x00,0x02,0x00,0x7B,0x80,0x48,0x00,0x7B,0x00,0x4A,0x00,0x4A,0x80,0x5B,0x80},/*"能",26*/ +{0x22,0x00,0x7F,0x00,0x14,0x00,0xFF,0x80,0x00,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0x3E,0x00},/*"普",27*/ +{0x5F,0x00,0x07,0x00,0x1E,0x80,0xDF,0x80,0x12,0x80,0x1F,0x80,0x12,0x80,0x60,0x00,0x9F,0x80},/*"通",28*/ +{0x08,0x00,0x3F,0x00,0x08,0x00,0xFF,0x80,0x10,0x00,0x1F,0x00,0x00,0x00,0x04,0x00,0x00,0x00},/*"专",29*/ +{0x12,0x00,0x12,0x00,0x12,0x80,0x12,0x00,0x13,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0xFF,0x80},/*"业",30*/ +{0x07,0x00,0x7F,0x80,0x6F,0x00,0x29,0x00,0x7F,0x00,0x49,0x00,0x0F,0x80,0x04,0x00,0x19,0x80},/*"模",31*/ +{0x04,0x00,0x04,0x00,0xFF,0x80,0x04,0x00,0x74,0x00,0x24,0x00,0x22,0x00,0x30,0x80,0xC1,0x80},/*"式",32*/ +{0x7F,0x80,0x48,0x80,0x7E,0x80,0x48,0x80,0x5C,0x80,0x62,0x80,0x76,0x80,0x40,0x80,0x7F,0x80},/*"固",33*/ +{0x22,0x00,0x2A,0x00,0x0F,0x00,0x66,0x00,0xA2,0x00,0x0F,0x80,0x02,0x00,0x02,0x00,0x02,0x00},/*"件",34*/ +{0x21,0x00,0x6C,0x00,0x7F,0x80,0x4D,0x00,0x49,0x00,0x6B,0x00,0x68,0x00,0xAB,0x00,0xB4,0x80},/*"版",35*/ +{0x08,0x00,0x08,0x00,0x1C,0x00,0x08,0x00,0x2A,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00},/*"本",36*/ +{0x22,0x00,0xFF,0x80,0x24,0x00,0x67,0x00,0x6A,0x00,0x33,0x00,0x7F,0x00,0x55,0x00,0xFF,0x80},/*"蓝",37*/ {0x7F,0x80,0x02,0x00,0x02,0x00,0x7F,0x80,0x06,0x00,0x0A,0x00,0x12,0x00,0xC2,0x00,0x06,0x00},/*"牙",38*/ -{0x42,0x00,0x57,0x80,0x84,0x00,0xFF,0x80,0x08,0x00,0xFF,0x80,0x08,0x00,0x34,0x00,0x13,0x80},/*"链",39*/ -{0x02,0x00,0x1F,0x80,0x04,0x00,0x1F,0x80,0x22,0x00,0x5F,0x80,0x85,0x00,0x03,0x00,0xDC,0x80},/*"接",40*/ -{0x10,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00},/*"自",41*/ -{0x02,0x00,0x72,0x00,0x07,0x80,0xFA,0x80,0x02,0x80,0x02,0x80,0x52,0x80,0x14,0x80,0x09,0x00},/*"动",42*/ -{0x00,0x00,0x22,0x00,0x08,0x00,0x08,0x00,0xFF,0x00,0x08,0x00,0x14,0x00,0x00,0x00,0xC1,0x80},/*"关",43*/ -{0x00,0x00,0x0E,0x00,0xF8,0x00,0x08,0x00,0x68,0x00,0x58,0x00,0x88,0x00,0x10,0x80,0x21,0x80},/*"机",44*/ -{0x04,0x00,0x1F,0x80,0x94,0x00,0x88,0x00,0x8A,0x80,0x15,0x00,0x20,0x00,0x05,0x00,0x08,0x80},/*"恢",45*/ -{0x00,0x00,0x3F,0x80,0xBE,0x00,0x00,0x00,0x3E,0x00,0x20,0x00,0x3E,0x00,0x0C,0x00,0xF3,0x80},/*"复",46*/ +{0x42,0x00,0x57,0x80,0x84,0x00,0xFF,0x80,0x6B,0x00,0xFF,0x80,0x08,0x00,0x30,0x00,0x33,0x80},/*"链",39*/ +{0x02,0x00,0x7F,0x80,0x60,0x00,0x0F,0x80,0x22,0x00,0x4F,0x80,0x05,0x00,0x03,0x00,0xDC,0x80},/*"接",40*/ +{0x10,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x22,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x22,0x00},/*"自",41*/ +{0x02,0x00,0x72,0x00,0x07,0x80,0xFE,0x80,0x22,0x80,0x02,0x80,0xD0,0x80,0x14,0x80,0x09,0x00},/*"动",42*/ +{0x00,0x00,0x36,0x00,0x08,0x00,0x08,0x00,0xFF,0x00,0x08,0x00,0x14,0x00,0x00,0x00,0xC1,0x80},/*"关",43*/ +{0x00,0x00,0x0E,0x00,0xF8,0x00,0x68,0x00,0x68,0x00,0x48,0x00,0x88,0x00,0x00,0x00,0x21,0x80},/*"机",44*/ +{0x04,0x00,0x3F,0x80,0xB4,0x00,0x88,0x00,0x8A,0x80,0x31,0x00,0x20,0x00,0x05,0x00,0x08,0x80},/*"恢",45*/ +{0x20,0x00,0x7F,0x80,0xFE,0x00,0x22,0x00,0x3E,0x00,0x30,0x00,0x3E,0x00,0x0C,0x00,0xF3,0x80},/*"复",46*/ {0x08,0x00,0x49,0x00,0x49,0x00,0x7F,0x00,0x08,0x00,0x88,0x80,0x88,0x80,0x88,0x80,0xFF,0x80},/*"出",47*/ {0x00,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x80,0x00},/*"厂",48*/ -{0x4E,0x00,0x08,0x00,0x11,0x80,0xC0,0x00,0x1F,0x00,0x09,0x00,0x04,0x00,0x04,0x00,0x39,0x80},/*"设",49*/ -{0x7F,0x00,0x55,0x00,0x08,0x00,0xFF,0x80,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0xFF,0x80},/*"置",50*/ -{0x44,0x00,0x1F,0x80,0x0A,0x00,0xDF,0x00,0x02,0x00,0x1F,0x80,0x02,0x00,0x62,0x00,0x9F,0x80},/*"连",51*/ -{0x3E,0x00,0x20,0x00,0x20,0x00,0x3E,0x00,0x00,0x00,0xFF,0x80,0x08,0x00,0x68,0x00,0x9F,0x80},/*"是",52*/ -{0x22,0x00,0xFF,0x80,0x00,0x00,0x7E,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00},/*"节",53*/ -{0x08,0x00,0x2A,0x00,0x2A,0x00,0x08,0x00,0x41,0x00,0x08,0x00,0xFF,0x80,0x22,0x00,0xC1,0x80},/*"类",54*/ -{0x7D,0x00,0x13,0x00,0xFF,0x00,0x13,0x00,0x11,0x00,0x59,0x00,0x08,0x00,0x08,0x00,0xFF,0x80},/*"型",55*/ -{0x02,0x00,0x0A,0x00,0xEB,0x00,0x0F,0x00,0x1B,0x00,0x0B,0x00,0x0B,0x00,0xC8,0x80,0x07,0x80},/*"地",56*/ -{0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00},/*"目",57*/ +{0x4E,0x00,0x08,0x00,0x01,0x80,0xC0,0x00,0x1F,0x00,0x09,0x00,0x24,0x00,0x24,0x00,0x39,0x80},/*"设",49*/ +{0x7F,0x00,0x5D,0x00,0x08,0x00,0xFF,0x80,0x22,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0xFF,0x80},/*"置",50*/ +{0x44,0x00,0x0F,0x80,0x00,0x00,0xCF,0x00,0x02,0x00,0x0F,0x80,0x02,0x00,0x62,0x00,0x9F,0x80},/*"连",51*/ +{0x3E,0x00,0x32,0x00,0x32,0x00,0x3E,0x00,0x00,0x00,0xFF,0x80,0x08,0x00,0x68,0x00,0x9F,0x80},/*"是",52*/ +{0x22,0x00,0xFF,0x80,0x00,0x00,0x7E,0x00,0x12,0x00,0x10,0x00,0x12,0x00,0x10,0x00,0x10,0x00},/*"节",53*/ +{0x08,0x00,0x3E,0x00,0x3E,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0xFF,0x80,0x00,0x00,0xC1,0x80},/*"类",54*/ +{0x7D,0x00,0x13,0x00,0xFF,0x00,0x77,0x00,0x11,0x00,0x09,0x00,0x08,0x00,0x08,0x00,0xFF,0x80},/*"型",55*/ +{0x02,0x00,0x0A,0x00,0xEB,0x00,0x6F,0x00,0x1B,0x00,0x0B,0x00,0x2B,0x00,0xC8,0x80,0x07,0x80},/*"地",56*/ +{0x3E,0x00,0x00,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x22,0x00},/*"目",57*/ }; const unsigned char Chinese_font_11[][22] = { diff --git a/device/LCD_ILI9341/Drv_ILI9341_Lcd_EnglishFont.h b/device/LCD_ILI9341/Drv_ILI9341_Lcd_EnglishFont.h index 025e3e0..5784bad 100644 --- a/device/LCD_ILI9341/Drv_ILI9341_Lcd_EnglishFont.h +++ b/device/LCD_ILI9341/Drv_ILI9341_Lcd_EnglishFont.h @@ -996,8 +996,8 @@ const unsigned char ascii_94[][9]={ {0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x08},/*"!",1*/ {0x00,0x00,0x00,0x14,0x14,0x14,0x00,0x00,0x00},/*""",2*/ {0x24,0x24,0x7E,0x24,0x24,0x12,0x7F,0x12,0x12},/*"#",3*/ -{0x00,0x0C,0x02,0x02,0x0C,0x10,0x10,0x0C,0x00},/*"$",4*/ -{0x00,0x02,0x15,0x0D,0x2A,0x54,0x50,0x20,0x00},/*"%",5*/ +{0x0C,0x0C,0x02,0x02,0x0C,0x10,0x10,0x0C,0x0C},/*"$",4*/ +{0x02,0x25,0x12,0x08,0x24,0x52,0x20,0x00,0x00},/*"%",5*/ {0x0C,0x12,0x12,0x0A,0x26,0x25,0x19,0x09,0x36},/*"&",6*/ {0x00,0x00,0x00,0x08,0x08,0x08,0x00,0x00,0x00},/*"'",7*/ {0x08,0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x08},/*"(",8*/ @@ -1024,7 +1024,7 @@ const unsigned char ascii_94[][9]={ {0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00,0x00},/*"=",29*/ {0x00,0x00,0x02,0x1C,0x20,0x18,0x06,0x00,0x00},/*">",30*/ {0x1C,0x22,0x20,0x20,0x10,0x08,0x08,0x00,0x08},/*"?",31*/ -{0x3C,0x40,0x6D,0x53,0x1B,0x25,0x01,0x1E,0x00},/*"@",32*/ +{0x3C,0x40,0x4D,0x53,0x13,0x05,0x01,0x1E,0x00},/*"@",32*/ {0x08,0x14,0x14,0x14,0x22,0x3E,0x22,0x41,0x41},/*"A",33*/ {0x1F,0x21,0x21,0x21,0x1F,0x21,0x21,0x21,0x1F},/*"B",34*/ {0x3C,0x42,0x01,0x01,0x01,0x01,0x01,0x42,0x3C},/*"C",35*/ @@ -1041,13 +1041,13 @@ const unsigned char ascii_94[][9]={ {0x41,0x43,0x43,0x45,0x49,0x49,0x51,0x61,0x41},/*"N",46*/ {0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x22,0x1C},/*"O",47*/ {0x1F,0x21,0x21,0x21,0x1F,0x01,0x01,0x01,0x01},/*"P",48*/ -{0x0C,0x12,0x21,0x21,0x21,0x21,0x12,0x00,0x18},/*"Q",49*/ +{0x0C,0x00,0x21,0x21,0x21,0x21,0x12,0x0C,0x18},/*"Q",49*/ {0x3F,0x41,0x41,0x41,0x3F,0x09,0x11,0x21,0x41},/*"R",50*/ {0x1E,0x21,0x01,0x06,0x18,0x20,0x20,0x31,0x1E},/*"S",51*/ {0x7F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"T",52*/ {0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x1C},/*"U",53*/ {0x41,0x41,0x22,0x22,0x22,0x14,0x14,0x14,0x08},/*"V",54*/ -{0x00,0x49,0x4D,0x36,0x36,0x36,0x12,0x00,0x00},/*"W",55*/ +{0x00,0x49,0x4D,0x36,0x36,0x36,0x12,0x12,0x00},/*"W",55*/ {0x41,0x22,0x14,0x0C,0x08,0x14,0x14,0x22,0x41},/*"X",56*/ {0x41,0x22,0x14,0x14,0x08,0x08,0x08,0x08,0x08},/*"Y",57*/ {0x3E,0x20,0x10,0x10,0x08,0x04,0x04,0x02,0x3E},/*"Z",58*/ @@ -1079,7 +1079,7 @@ const unsigned char ascii_94[][9]={ {0x08,0x08,0x1C,0x08,0x08,0x08,0x08,0x08,0x10},/*"t",84*/ {0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x3C,0x00},/*"u",85*/ {0x00,0x22,0x22,0x14,0x14,0x14,0x14,0x08,0x00},/*"v",86*/ -{0x00,0x00,0x49,0x36,0x36,0x36,0x00,0x00,0x00},/*"w",87*/ +{0x00,0x00,0x49,0x0C,0x36,0x36,0x00,0x00,0x00},/*"w",87*/ {0x00,0x22,0x14,0x14,0x08,0x14,0x14,0x22,0x00},/*"x",88*/ {0x22,0x22,0x14,0x14,0x14,0x0C,0x08,0x08,0x06},/*"y",89*/ {0x00,0x3E,0x20,0x10,0x08,0x04,0x02,0x3E,0x00},/*"z",90*/ diff --git a/tools/gen_ui0902_assets.py b/tools/gen_ui0902_assets.py index 544d63b..fd469ee 100644 --- a/tools/gen_ui0902_assets.py +++ b/tools/gen_ui0902_assets.py @@ -90,6 +90,11 @@ def make_battery_outline(): return im +def make_battery_fill(): + """Solid white 22x9 level strip (do NOT use 电池电量 mockup — it embeds \"80%\" text).""" + return Image.new("RGBA", (22, 9), (255, 255, 255, 255)) + + def make_cancel_button(): """Generate 取消 106x56 dialog button matching 控件-10 style.""" im = Image.new("RGBA", (106, 56), (0, 0, 0, 0)) @@ -107,7 +112,7 @@ def make_cancel_button(): INTERNAL = [ ("gImage_UI0902_Volume_20x15", "02_顶部图标/音量图标-10.png"), ("gImage_UI0902_Bluetooth_11x17", "02_顶部图标/蓝牙图标-10.png"), - ("gImage_UI0902_BatteryFill_22x9", "02_顶部图标/电池电量-10-11.png"), + # BatteryFill generated by make_battery_fill() — not from mockup PNG ("gImage_UI0902_TabSetting_Sel_36x28", "03_底部图标/底部图标-10.png"), ("gImage_UI0902_TabSetting_Not_35x28", "03_底部图标/底部图标-11.png"), ("gImage_UI0902_TabMixer_Sel_35x27", "03_底部图标/底部图标-12.png"), @@ -208,6 +213,11 @@ def main(): h_lines.append("extern const unsigned char gImage_UI0902_BatteryOutline_29x12[];") total_int += len(data) + data, w, h = rgba_to_rgb565(make_battery_fill()) + emit_c_array(c_lines, "gImage_UI0902_BatteryFill_22x9", data, w, h) + h_lines.append(f"extern const unsigned char gImage_UI0902_BatteryFill_22x9[{len(data)}];") + total_int += len(data) + for name, rel in INTERNAL: data, w, h = rgba_to_rgb565(Image.open(SRC / rel)) emit_c_array(c_lines, name, data, w, h) diff --git a/tools/gen_wqy_font.py b/tools/gen_wqy_font.py index 3839ae2..d2456d9 100644 --- a/tools/gen_wqy_font.py +++ b/tools/gen_wqy_font.py @@ -129,6 +129,24 @@ def ascii_cell_width(size: int) -> int: }.get(size, max(3, size // 2)) +def percent_pixels(dst_w: int, dst_h: int) -> list[int]: + """Clear 1bpp percent for status bar — Liberation small % is too sparse.""" + # Classic 7-wide pattern (row-major), scaled/centered into dst cell + src_w, src_h = 7, 9 + src = [ + 0,1,0,0,0,0,0, + 1,0,1,0,0,1,0, + 0,1,0,0,1,0,0, + 0,0,0,1,0,0,0, + 0,0,1,0,0,1,0, + 0,1,0,0,1,0,1, + 0,0,0,0,0,1,0, + 0,0,0,0,0,0,0, + 0,0,0,0,0,0,0, + ] + return fit_to_cell(src_w, src_h, src, dst_w, dst_h) + + def fit_to_cell(src_w, src_h, pixels, dst_w, dst_h) -> list[int]: """Place glyph into dst cell. Never crop ink — scale to fit. Only add 1px margin when the cell is wide enough; tiny cells keep solid strokes. @@ -167,7 +185,9 @@ def fit_to_cell(src_w, src_h, pixels, dst_w, dst_h) -> list[int]: def glyph_pixels(ch: str, size: int, latin: bool = False) -> list[int]: code = ord(ch) - # 调号用正常拉丁字母 b(Db/Eb…),不用手绘降号——降号竖笔过长、与 D 高低不一致 + # 调号用正常拉丁字母 b(Db/Eb…);状态栏 % 用手绘清晰点阵 + if latin and ch == "%" and size <= 12: + return percent_pixels(ascii_cell_width(size), size) if latin or (32 <= code < 127): bdf_name = SIZE_TO_LATIN_BDF.get(size, SIZE_TO_BDF[size]) gmap = load_bdf(bdf_name)