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 <cursoragent@cursor.com>
This commit is contained in:
yuquanjun 2026-09-04 08:50:00 +08:00
parent e56f480135
commit 8f0d0a3a52
8 changed files with 119 additions and 85 deletions

View File

@ -27,13 +27,7 @@ void UI_ExpertMode_Process(DisplayTaskMessage_Type msg)
} }
break; break;
case MSG_ID_BATTERY_VALUE: case MSG_ID_BATTERY_VALUE:
// if(usb_charging_state) Draw_Status_Battery_Icon(percentage);
// {
// 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);
// }
break; break;
case MSG_ID_TAP_SPEED: case MSG_ID_TAP_SPEED:

View File

@ -28,13 +28,7 @@ void UI_FreeMode_Process(DisplayTaskMessage_Type msg)
} }
break; break;
case MSG_ID_BATTERY_VALUE: case MSG_ID_BATTERY_VALUE:
// if(usb_charging_state) Draw_Status_Battery_Icon(percentage);
// {
// 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);
// }
break; break;
case MSG_ID_TAP_SPEED: case MSG_ID_TAP_SPEED:

View File

@ -271,27 +271,43 @@ void Draw_Status_Battery_Icon(uint8_t battery_percent)
{ {
uint8_t Info[8]; uint8_t Info[8];
uint16_t fill_w; uint16_t fill_w;
uint16_t text_w; uint16_t slot_w;
uint16_t actual_w;
uint16_t bat_x; uint16_t bat_x;
uint16_t text_x; uint16_t text_x;
uint16_t text_y; 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) if (battery_percent > 100)
battery_percent = 100; battery_percent = 100;
sprintf((char *)Info, "%d%%", battery_percent); sprintf((char *)Info, "%d%%", battery_percent);
text_w = (uint16_t)(strlen((char *)Info) * (UI0902_BATTERY_TEXT_SIZE / 2)); actual_w = (uint16_t)(strlen((char *)Info) * adv);
bat_x = (uint16_t)(240 - UI0902_BATTERY_RIGHT_MARGIN - text_w /* 固定按「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); - UI0902_BATTERY_TEXT_GAP - UI0902_BATTERY_W);
text_x = (uint16_t)(bat_x + UI0902_BATTERY_W + UI0902_BATTERY_TEXT_GAP); 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); + (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, LCD_FillByColor(bat_x > 2 ? (uint16_t)(bat_x - 2) : 0, 0, 240, UI_STATUS_BAR_H,
UI0902_BG_COLOR); UI0902_BG_COLOR);
/* 实心电量条(旧 fill 图误含「80%」文字) */
fill_w = (uint16_t)((22UL * battery_percent) / 100); fill_w = (uint16_t)((22UL * battery_percent) / 100);
LCD_WR_PIC_ClipX(bat_x + 3, UI0902_BATTERY_Y + 2, 22, 9, fill_w, if (fill_w > 0) {
gImage_UI0902_BatteryFill_22x9); 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, LCD_WR_PIC_Trans(bat_x, UI0902_BATTERY_Y, UI0902_BATTERY_W, UI0902_BATTERY_H,
gImage_UI0902_BatteryOutline_29x12, BLACK); gImage_UI0902_BatteryOutline_29x12, BLACK);
LCD_ShowString(text_x, text_y, Info, WHITE, UI0902_BG_COLOR, LCD_ShowString(text_x, text_y, Info, WHITE, UI0902_BG_COLOR,

View File

@ -122,10 +122,10 @@ void CallUI_RestoreSelect(void);
#define UI0902_BT_Y 5 #define UI0902_BT_Y 5
#define UI0902_BATTERY_W 29 #define UI0902_BATTERY_W 29
#define UI0902_BATTERY_H 12 #define UI0902_BATTERY_H 12
#define UI0902_BATTERY_Y 7 #define UI0902_BATTERY_Y 14 /* mode.png 状态栏电池顶 ≈y14 */
#define UI0902_BATTERY_RIGHT_MARGIN 8 #define UI0902_BATTERY_RIGHT_MARGIN 6
#define UI0902_BATTERY_TEXT_GAP 4 #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_UNIVERSAL 0 /* 底栏:万能模式 */
#define UI0902_NAV_NORMAL 1 /* 底栏:普通模式 */ #define UI0902_NAV_NORMAL 1 /* 底栏:普通模式 */
#define UI0902_NAV_EXPERT 2 /* 底栏:专业模式 */ #define UI0902_NAV_EXPERT 2 /* 底栏:专业模式 */

View File

@ -954,64 +954,64 @@ const unsigned char Chinese_font_12[][24] = {
}; };
const unsigned char Chinese_font_9[][18] = { 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*/ {0x18,0x00,0x60,0x00,0xF2,0x80,0x32,0x80,0x32,0x80,0x2A,0x80,0x22,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*/ {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*/ {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*/ {0x10,0x00,0x30,0x00,0x81,0x00,0x99,0x00,0xA5,0x00,0xB5,0x00,0x99,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*/ {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,0x00,0x00,0x00,0x00,0x3E,0x00},/*"音",5*/ {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,0x89,0x00,0x09,0x00,0x3F,0x00,0x00,0x00,0x00,0x80,0x3F,0x80},/*"色",6*/ {0x10,0x00,0x3E,0x00,0x7F,0x00,0xE9,0x00,0x29,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*/ {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,0x12,0x00,0x09,0x00,0x10,0x80},/*"择",8*/ {0x44,0x00,0x03,0x00,0x09,0x00,0xC9,0x00,0x04,0x00,0x04,0x00,0x30,0x00,0x21,0x00,0x10,0x80},/*"择",8*/
{0xFA,0x00,0x12,0x00,0x94,0x80,0xFC,0x00,0x10,0x00,0xD0,0x00,0x93,0x00,0x14,0x80,0x38,0x80},/*"歌",9*/ {0xFA,0x00,0x12,0x00,0xD4,0x80,0xFC,0x00,0x10,0x00,0xD0,0x00,0xD3,0x00,0x14,0x80,0x18,0x80},/*"歌",9*/
{0x12,0x00,0x12,0x00,0x52,0x80,0x52,0x80,0x52,0x80,0x7F,0x80,0x52,0x80,0x7F,0x80,0x40,0x80},/*"曲",10*/ {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,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00},/*"自",11*/ {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*/ {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*/ {0x00,0x00,0xFF,0x80,0x10,0x00,0x1E,0x00,0x12,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*/ {0x02,0x00,0xD3,0x00,0x02,0x00,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*/ {0x4E,0x00,0x08,0x00,0x01,0x80,0xC0,0x00,0x1F,0x00,0x09,0x00,0x24,0x00,0x24,0x00,0x39,0x80},/*"设",15*/
{0x7F,0x00,0x55,0x00,0x08,0x00,0xFF,0x80,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0xFF,0x80},/*"置",16*/ {0x7F,0x00,0x5D,0x00,0x08,0x00,0xFF,0x80,0x22,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0xFF,0x80},/*"置",16*/
{0x22,0x00,0xC7,0x80,0xF5,0x00,0x02,0x00,0x2C,0x00,0x13,0x80,0x44,0x80,0x00,0x00,0x0E,0x00},/*"移",17*/ {0x22,0x00,0xC7,0x80,0xF0,0x00,0x62,0x00,0x2E,0x00,0x43,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*/ {0x5F,0x80,0x16,0x80,0xD6,0x80,0x5F,0x80,0x10,0x80,0x16,0x80,0x36,0x80,0x30,0x80,0x21,0x80},/*"调",18*/
{0x42,0x00,0x3F,0x80,0x1F,0x80,0xD2,0x80,0x1F,0x80,0x06,0x00,0x0B,0x00,0x62,0x00,0x9F,0x80},/*"速",19*/ {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,0x52,0x00,0x5E,0x00,0x40,0x00,0x7E,0x00,0x8C,0x00,0xB3,0x00},/*"度",20*/ {0x08,0x00,0x7F,0x80,0x7F,0x00,0x56,0x00,0x5C,0x00,0x40,0x00,0x5E,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*/ {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,0x22,0x00,0x3E,0x00,0xC9,0x80,0x3E,0x00,0x22,0x00,0x41,0x00},/*"奏",22*/ {0x08,0x00,0x7F,0x00,0xFF,0x80,0x36,0x00,0x3E,0x00,0xC9,0x80,0x3E,0x00,0x00,0x00,0x41,0x00},/*"奏",22*/
{0x36,0x00,0x44,0x00,0x69,0x80,0x40,0x00,0x6F,0x00,0x49,0x00,0x44,0x00,0x44,0x00,0x59,0x80},/*"段",23*/ {0x36,0x00,0x44,0x00,0x61,0x80,0x40,0x00,0x6F,0x00,0x49,0x00,0xC4,0x00,0xC4,0x00,0x59,0x80},/*"段",23*/
{0x22,0x00,0xFF,0x80,0x4E,0x00,0x18,0x00,0x86,0x00,0x68,0x00,0x11,0x80,0x48,0x00,0x4E,0x00},/*"落",24*/ {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,0x10,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x46,0x00},/*"万",25*/ {0x00,0x00,0xFF,0x80,0x10,0x00,0x1E,0x00,0x12,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*/ {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,0x00,0x00,0x00,0x00,0x3E,0x00},/*"普",27*/ {0x22,0x00,0x7F,0x00,0x14,0x00,0xFF,0x80,0x00,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0x3E,0x00},/*"普",27*/
{0x5F,0x00,0x04,0x00,0x12,0x80,0xDF,0x80,0x12,0x80,0x1F,0x80,0x12,0x80,0x60,0x00,0x9F,0x80},/*"通",28*/ {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,0x3F,0x00,0x00,0x00,0x04,0x00,0x02,0x00},/*"专",29*/ {0x08,0x00,0x3F,0x00,0x08,0x00,0xFF,0x80,0x10,0x00,0x1F,0x00,0x00,0x00,0x04,0x00,0x00,0x00},/*"专",29*/
{0x12,0x00,0x12,0x00,0x92,0x80,0x53,0x00,0x13,0x00,0x12,0x00,0x12,0x00,0x12,0x00,0xFF,0x80},/*"业",30*/ {0x12,0x00,0x12,0x00,0x12,0x80,0x12,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*/ {0x07,0x00,0x7F,0x80,0x6F,0x00,0x29,0x00,0x7F,0x00,0x49,0x00,0x0F,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*/ {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,0x7E,0x80,0x62,0x80,0x62,0x80,0x40,0x80,0x7F,0x80},/*"固",33*/ {0x7F,0x80,0x48,0x80,0x7E,0x80,0x48,0x80,0x5C,0x80,0x62,0x80,0x76,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*/ {0x22,0x00,0x2A,0x00,0x0F,0x00,0x66,0x00,0xA2,0x00,0x0F,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*/ {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,0x2A,0x00,0x2A,0x00,0x08,0x00,0x49,0x00,0x08,0x00,0x08,0x00},/*"本",36*/ {0x08,0x00,0x08,0x00,0x1C,0x00,0x08,0x00,0x2A,0x00,0x08,0x00,0x08,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*/ {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*/ {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*/ {0x42,0x00,0x57,0x80,0x84,0x00,0xFF,0x80,0x6B,0x00,0xFF,0x80,0x08,0x00,0x30,0x00,0x33,0x80},/*"链",39*/
{0x02,0x00,0x1F,0x80,0x04,0x00,0x1F,0x80,0x22,0x00,0x5F,0x80,0x85,0x00,0x03,0x00,0xDC,0x80},/*"接",40*/ {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,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00},/*"自",41*/ {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,0xFA,0x80,0x02,0x80,0x02,0x80,0x52,0x80,0x14,0x80,0x09,0x00},/*"动",42*/ {0x02,0x00,0x72,0x00,0x07,0x80,0xFE,0x80,0x22,0x80,0x02,0x80,0xD0,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,0x36,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*/ {0x00,0x00,0x0E,0x00,0xF8,0x00,0x68,0x00,0x68,0x00,0x48,0x00,0x88,0x00,0x00,0x00,0x21,0x80},/*"机",44*/
{0x04,0x00,0x1F,0x80,0x94,0x00,0x88,0x00,0x8A,0x80,0x15,0x00,0x20,0x00,0x05,0x00,0x08,0x80},/*"恢",45*/ {0x04,0x00,0x3F,0x80,0xB4,0x00,0x88,0x00,0x8A,0x80,0x31,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*/ {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*/ {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*/ {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*/ {0x4E,0x00,0x08,0x00,0x01,0x80,0xC0,0x00,0x1F,0x00,0x09,0x00,0x24,0x00,0x24,0x00,0x39,0x80},/*"设",49*/
{0x7F,0x00,0x55,0x00,0x08,0x00,0xFF,0x80,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0xFF,0x80},/*"置",50*/ {0x7F,0x00,0x5D,0x00,0x08,0x00,0xFF,0x80,0x22,0x00,0x3E,0x00,0x22,0x00,0x22,0x00,0xFF,0x80},/*"置",50*/
{0x44,0x00,0x1F,0x80,0x0A,0x00,0xDF,0x00,0x02,0x00,0x1F,0x80,0x02,0x00,0x62,0x00,0x9F,0x80},/*"连",51*/ {0x44,0x00,0x0F,0x80,0x00,0x00,0xCF,0x00,0x02,0x00,0x0F,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*/ {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,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00},/*"节",53*/ {0x22,0x00,0xFF,0x80,0x00,0x00,0x7E,0x00,0x12,0x00,0x10,0x00,0x12,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*/ {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,0x13,0x00,0x11,0x00,0x59,0x00,0x08,0x00,0x08,0x00,0xFF,0x80},/*"型",55*/ {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,0x0F,0x00,0x1B,0x00,0x0B,0x00,0x0B,0x00,0xC8,0x80,0x07,0x80},/*"地",56*/ {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,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00},/*"目",57*/ {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] = { const unsigned char Chinese_font_11[][22] = {

View File

@ -996,8 +996,8 @@ const unsigned char ascii_94[][9]={
{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x08},/*"!",1*/ {0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x08},/*"!",1*/
{0x00,0x00,0x00,0x14,0x14,0x14,0x00,0x00,0x00},/*""",2*/ {0x00,0x00,0x00,0x14,0x14,0x14,0x00,0x00,0x00},/*""",2*/
{0x24,0x24,0x7E,0x24,0x24,0x12,0x7F,0x12,0x12},/*"#",3*/ {0x24,0x24,0x7E,0x24,0x24,0x12,0x7F,0x12,0x12},/*"#",3*/
{0x00,0x0C,0x02,0x02,0x0C,0x10,0x10,0x0C,0x00},/*"$",4*/ {0x0C,0x0C,0x02,0x02,0x0C,0x10,0x10,0x0C,0x0C},/*"$",4*/
{0x00,0x02,0x15,0x0D,0x2A,0x54,0x50,0x20,0x00},/*"%",5*/ {0x02,0x25,0x12,0x08,0x24,0x52,0x20,0x00,0x00},/*"%",5*/
{0x0C,0x12,0x12,0x0A,0x26,0x25,0x19,0x09,0x36},/*"&",6*/ {0x0C,0x12,0x12,0x0A,0x26,0x25,0x19,0x09,0x36},/*"&",6*/
{0x00,0x00,0x00,0x08,0x08,0x08,0x00,0x00,0x00},/*"'",7*/ {0x00,0x00,0x00,0x08,0x08,0x08,0x00,0x00,0x00},/*"'",7*/
{0x08,0x00,0x04,0x04,0x04,0x04,0x04,0x00,0x08},/*"(",8*/ {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,0x3E,0x00,0x00,0x3E,0x00,0x00,0x00},/*"=",29*/
{0x00,0x00,0x02,0x1C,0x20,0x18,0x06,0x00,0x00},/*">",30*/ {0x00,0x00,0x02,0x1C,0x20,0x18,0x06,0x00,0x00},/*">",30*/
{0x1C,0x22,0x20,0x20,0x10,0x08,0x08,0x00,0x08},/*"?",31*/ {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*/ {0x08,0x14,0x14,0x14,0x22,0x3E,0x22,0x41,0x41},/*"A",33*/
{0x1F,0x21,0x21,0x21,0x1F,0x21,0x21,0x21,0x1F},/*"B",34*/ {0x1F,0x21,0x21,0x21,0x1F,0x21,0x21,0x21,0x1F},/*"B",34*/
{0x3C,0x42,0x01,0x01,0x01,0x01,0x01,0x42,0x3C},/*"C",35*/ {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*/ {0x41,0x43,0x43,0x45,0x49,0x49,0x51,0x61,0x41},/*"N",46*/
{0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x22,0x1C},/*"O",47*/ {0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x22,0x1C},/*"O",47*/
{0x1F,0x21,0x21,0x21,0x1F,0x01,0x01,0x01,0x01},/*"P",48*/ {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*/ {0x3F,0x41,0x41,0x41,0x3F,0x09,0x11,0x21,0x41},/*"R",50*/
{0x1E,0x21,0x01,0x06,0x18,0x20,0x20,0x31,0x1E},/*"S",51*/ {0x1E,0x21,0x01,0x06,0x18,0x20,0x20,0x31,0x1E},/*"S",51*/
{0x7F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"T",52*/ {0x7F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"T",52*/
{0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x1C},/*"U",53*/ {0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x1C},/*"U",53*/
{0x41,0x41,0x22,0x22,0x22,0x14,0x14,0x14,0x08},/*"V",54*/ {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,0x0C,0x08,0x14,0x14,0x22,0x41},/*"X",56*/
{0x41,0x22,0x14,0x14,0x08,0x08,0x08,0x08,0x08},/*"Y",57*/ {0x41,0x22,0x14,0x14,0x08,0x08,0x08,0x08,0x08},/*"Y",57*/
{0x3E,0x20,0x10,0x10,0x08,0x04,0x04,0x02,0x3E},/*"Z",58*/ {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*/ {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,0x22,0x22,0x22,0x22,0x3C,0x00},/*"u",85*/
{0x00,0x22,0x22,0x14,0x14,0x14,0x14,0x08,0x00},/*"v",86*/ {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*/ {0x00,0x22,0x14,0x14,0x08,0x14,0x14,0x22,0x00},/*"x",88*/
{0x22,0x22,0x14,0x14,0x14,0x0C,0x08,0x08,0x06},/*"y",89*/ {0x22,0x22,0x14,0x14,0x14,0x0C,0x08,0x08,0x06},/*"y",89*/
{0x00,0x3E,0x20,0x10,0x08,0x04,0x02,0x3E,0x00},/*"z",90*/ {0x00,0x3E,0x20,0x10,0x08,0x04,0x02,0x3E,0x00},/*"z",90*/

View File

@ -90,6 +90,11 @@ def make_battery_outline():
return im 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(): def make_cancel_button():
"""Generate 取消 106x56 dialog button matching 控件-10 style.""" """Generate 取消 106x56 dialog button matching 控件-10 style."""
im = Image.new("RGBA", (106, 56), (0, 0, 0, 0)) im = Image.new("RGBA", (106, 56), (0, 0, 0, 0))
@ -107,7 +112,7 @@ def make_cancel_button():
INTERNAL = [ INTERNAL = [
("gImage_UI0902_Volume_20x15", "02_顶部图标/音量图标-10.png"), ("gImage_UI0902_Volume_20x15", "02_顶部图标/音量图标-10.png"),
("gImage_UI0902_Bluetooth_11x17", "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_Sel_36x28", "03_底部图标/底部图标-10.png"),
("gImage_UI0902_TabSetting_Not_35x28", "03_底部图标/底部图标-11.png"), ("gImage_UI0902_TabSetting_Not_35x28", "03_底部图标/底部图标-11.png"),
("gImage_UI0902_TabMixer_Sel_35x27", "03_底部图标/底部图标-12.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[];") h_lines.append("extern const unsigned char gImage_UI0902_BatteryOutline_29x12[];")
total_int += len(data) 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: for name, rel in INTERNAL:
data, w, h = rgba_to_rgb565(Image.open(SRC / rel)) data, w, h = rgba_to_rgb565(Image.open(SRC / rel))
emit_c_array(c_lines, name, data, w, h) emit_c_array(c_lines, name, data, w, h)

View File

@ -129,6 +129,24 @@ def ascii_cell_width(size: int) -> int:
}.get(size, max(3, size // 2)) }.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]: 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. """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. 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]: def glyph_pixels(ch: str, size: int, latin: bool = False) -> list[int]:
code = ord(ch) code = ord(ch)
# 调号用正常拉丁字母 bDb/Eb…不用手绘降号——降号竖笔过长、与 D 高低不一致 # 调号用正常拉丁字母 bDb/Eb…状态栏 % 用手绘清晰点阵
if latin and ch == "%" and size <= 12:
return percent_pixels(ascii_cell_width(size), size)
if latin or (32 <= code < 127): if latin or (32 <= code < 127):
bdf_name = SIZE_TO_LATIN_BDF.get(size, SIZE_TO_BDF[size]) bdf_name = SIZE_TO_LATIN_BDF.get(size, SIZE_TO_BDF[size])
gmap = load_bdf(bdf_name) gmap = load_bdf(bdf_name)