Fix mode-page glyph clip, digit tracking, and nav separator.

Match mode.png: widen card value slots, use ASCII advance spacing so 1364 is not cramped, and draw the section/nav divider line.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
yuquanjun 2026-09-04 07:30:24 +08:00
parent 5290d897a0
commit d7af2cee1a
3 changed files with 50 additions and 23 deletions

View File

@ -412,8 +412,10 @@ void Refresh_Transpose(const LEBEL_UI *UI, GUI_SWITCH * Group)
clear_w = UI0902_CARD_VALUE_W; clear_w = UI0902_CARD_VALUE_W;
value_y = UI_CardTextDrawY(UI0902_CARD_VALUE_Y, UI0902_CARD_VALUE_H, value_y = UI_CardTextDrawY(UI0902_CARD_VALUE_Y, UI0902_CARD_VALUE_H,
UI0902_CARD_VALUE_LH, UI0902_CARD_VALUE_SIZE); UI0902_CARD_VALUE_LH, UI0902_CARD_VALUE_SIZE);
/* 清区高度不得侵入 KEY/BPM 行 */ /* 清区高度保证主值完整;不得侵入 KEY/BPM 行 */
clear_h = (uint16_t)(UI0902_CARD_VALUE_SIZE + 1); clear_h = (uint16_t)(UI0902_CARD_VALUE_H + 1);
if (clear_h < (uint16_t)(UI0902_CARD_VALUE_SIZE + 1))
clear_h = (uint16_t)(UI0902_CARD_VALUE_SIZE + 1);
if (value_y + clear_h > UI0902_CARD_SUB_Y) if (value_y + clear_h > UI0902_CARD_SUB_Y)
clear_h = (uint16_t)(UI0902_CARD_SUB_Y - value_y); clear_h = (uint16_t)(UI0902_CARD_SUB_Y - value_y);
x1 = UI_CardTextBoxX1(cx, clear_w, clear_w); x1 = UI_CardTextBoxX1(cx, clear_w, clear_w);
@ -761,7 +763,10 @@ void Draw_Bottom_Bar(uint8_t sel, uint8_t first_back)
uint8_t i; uint8_t i;
(void)first_back; (void)first_back;
LCD_FillByColor(0, 275, 240, 320, UI0902_BG_COLOR); LCD_FillByColor(0, 263, 240, 320, UI0902_BG_COLOR);
/* mode.png段落钮与底栏之间横线分隔 */
LCD_DrawLine(0, UI0902_SEP_LINE_Y, 239, UI0902_SEP_LINE_Y, UI0902_SEP_LINE_COLOR);
LCD_DrawLine(0, UI0902_SEP_LINE_Y + 1, 239, UI0902_SEP_LINE_Y + 1, UI0902_SEP_LINE_COLOR);
if (sel == UI0902_NAV_UNIVERSAL) { icons[0] = gImage_Nav_Universal_Sel; ws[0] = 36; hs[0] = 28; } if (sel == UI0902_NAV_UNIVERSAL) { icons[0] = gImage_Nav_Universal_Sel; ws[0] = 36; hs[0] = 28; }
else { icons[0] = gImage_Nav_Universal_Not; ws[0] = 36; hs[0] = 28; } else { icons[0] = gImage_Nav_Universal_Not; ws[0] = 36; hs[0] = 28; }

View File

@ -54,13 +54,13 @@ void CallUI_RestoreSelect(void);
#define UI0902_FONT_NAV 9 #define UI0902_FONT_NAV 9
/* ASCII 字宽(须与 Drv LCD_GetAsciiMetrics 一致) */ /* ASCII 字宽(须与 Drv LCD_GetAsciiMetrics 一致) */
#define UI0902_ASCII_W(sz) \ #define UI0902_ASCII_W(sz) \
((sz) == 8 ? 5 : \ ((sz) == 8 ? 6 : \
(sz) == 9 ? 7 : \ (sz) == 9 ? 8 : \
(sz) == 11 ? 6 : \ (sz) == 11 ? 7 : \
(sz) == 12 ? 7 : \ (sz) == 12 ? 8 : \
(sz) == 13 || (sz) == 15 || (sz) == 16 ? 8 : ((sz) / 2)) (sz) == 13 || (sz) == 15 || (sz) == 16 ? 10 : ((sz) / 2 + 1))
/* 移调卡文字(0902-04 实测绝对 Y */ /* 移调卡文字(主值加宽+下移 KEY防 Cb/101 底/右裁切 */
#define UI0902_CARD_TEXT_CX_L (UI0902_MARGIN_X + UI0902_CARD_W / 2) /* 64 */ #define UI0902_CARD_TEXT_CX_L (UI0902_MARGIN_X + UI0902_CARD_W / 2) /* 64 */
#define UI0902_CARD_TEXT_CX_R (UI0902_MARGIN_X + UI0902_CARD_W + UI0902_CARD_GAP + UI0902_CARD_W / 2) /* 176 */ #define UI0902_CARD_TEXT_CX_R (UI0902_MARGIN_X + UI0902_CARD_W + UI0902_CARD_GAP + UI0902_CARD_W / 2) /* 176 */
@ -72,15 +72,19 @@ void CallUI_RestoreSelect(void);
#define UI0902_CARD_VALUE_SIZE UI0902_FONT_HERO /* 16 */ #define UI0902_CARD_VALUE_SIZE UI0902_FONT_HERO /* 16 */
#define UI0902_CARD_VALUE_LH 16 #define UI0902_CARD_VALUE_LH 16
#define UI0902_CARD_VALUE_W 24 #define UI0902_CARD_VALUE_W 34 /* 3×10 字距步进101 不贴边 */
#define UI0902_CARD_VALUE_H 16 #define UI0902_CARD_VALUE_H 17
#define UI0902_CARD_VALUE_Y 70 #define UI0902_CARD_VALUE_Y 69
#define UI0902_CARD_SUB_SIZE UI0902_FONT_SUB /* 9 */ #define UI0902_CARD_SUB_SIZE UI0902_FONT_SUB /* 9 */
#define UI0902_CARD_SUB_LH 9 #define UI0902_CARD_SUB_LH 9
#define UI0902_CARD_SUB_W 28 #define UI0902_CARD_SUB_W 28
#define UI0902_CARD_SUB_H 9 #define UI0902_CARD_SUB_H 9
#define UI0902_CARD_SUB_Y 89 #define UI0902_CARD_SUB_Y 91
/* 段落钮与底栏分隔线mode.png ≈ y274 */
#define UI0902_SEP_LINE_Y 274
#define UI0902_SEP_LINE_COLOR 0x0883 /* #09111C */
/* 兼容旧相对偏移宏(= 绝对Y - CARD_Y */ /* 兼容旧相对偏移宏(= 绝对Y - CARD_Y */
#define UI0902_CARD_LABEL_DY (UI0902_CARD_LABEL_Y - UI0902_CARD_Y) #define UI0902_CARD_LABEL_DY (UI0902_CARD_LABEL_Y - UI0902_CARD_Y)

View File

@ -91,7 +91,7 @@ static uint16_t LCD_GetChsTableSize(uint8_t sizey)
static uint8_t LCD_GetAsciiMetrics(uint8_t size, uint8_t *char_width, uint8_t *char_height) static uint8_t LCD_GetAsciiMetrics(uint8_t size, uint8_t *char_width, uint8_t *char_height)
{ {
/* 字宽略大于 size/2避免 WQY/Liberation 缩进窄格时右缘被裁 */ /* 与点阵源一致的字形格宽ShowChar 窗口必须匹配字库) */
*char_height = size; *char_height = size;
switch (size) switch (size)
{ {
@ -108,6 +108,17 @@ static uint8_t LCD_GetAsciiMetrics(uint8_t size, uint8_t *char_width, uint8_t *c
} }
} }
/* 显示步进:字形宽 + 字距,和弦数字等更舒展,避免右缘贴死 */
static uint8_t LCD_GetAsciiAdvance(uint8_t size)
{
uint8_t w, h;
if (!LCD_GetAsciiMetrics(size, &w, &h))
return (uint8_t)(size / 2);
if (size >= 13)
return (uint8_t)(w + 2); /* 字距 +2对齐 mode.png 舒展感 */
return (uint8_t)(w + 1);
}
//r:0-31 g:0-63 b:0-31 //r:0-31 g:0-63 b:0-31
uint16_t RGB(int r,int g,int b) uint16_t RGB(int r,int g,int b)
{ {
@ -950,12 +961,14 @@ void LCD_DrawRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t c
void LCD_ShowString(uint16_t x, uint16_t y, const uint8_t *p, uint16_t fc, uint16_t bc, uint8_t sizey, uint8_t mode) void LCD_ShowString(uint16_t x, uint16_t y, const uint8_t *p, uint16_t fc, uint16_t bc, uint8_t sizey, uint8_t mode)
{ {
uint8_t cw, ch; uint8_t cw, ch;
uint8_t adv;
if (!LCD_GetAsciiMetrics(sizey, &cw, &ch)) if (!LCD_GetAsciiMetrics(sizey, &cw, &ch))
return; return;
adv = LCD_GetAsciiAdvance(sizey);
while(*p != '\0') while(*p != '\0')
{ {
LCD_ShowChar(x, y, *p, fc, bc, sizey, mode); LCD_ShowChar(x, y, *p, fc, bc, sizey, mode);
x += cw; x += adv;
p++; p++;
} }
} }
@ -1043,7 +1056,7 @@ static uint16_t LCD_GetMixedStringWidth(uint8_t *str, uint8_t sizey)
{ {
uint16_t width = 0; uint16_t width = 0;
uint8_t xStepCn = sizey; uint8_t xStepCn = sizey;
uint8_t xStepAscii = sizey / 2; uint8_t xStepAscii = LCD_GetAsciiAdvance(sizey);
while(*str != '\0') while(*str != '\0')
{ {
@ -1078,7 +1091,7 @@ uint16_t LCD_ShowMixedString(uint16_t x1, uint16_t x2, uint16_t y, uint8_t *str,
{ {
const char (*codeTab)[2] = NULL; const char (*codeTab)[2] = NULL;
uint8_t xStepCn = sizey; uint8_t xStepCn = sizey;
uint8_t xStepAscii = sizey / 2; uint8_t xStepAscii = LCD_GetAsciiAdvance(sizey);
uint16_t draw_x; uint16_t draw_x;
codeTab = LCD_GetChsTable(sizey); codeTab = LCD_GetChsTable(sizey);
@ -1151,11 +1164,12 @@ uint16_t LCD_ShowMixedString(uint16_t x1, uint16_t x2, uint16_t y, uint8_t *str,
******************************************************************************/ ******************************************************************************/
void LCD_ClearString(uint16_t x, uint16_t y, const uint8_t *p, uint16_t bc, uint8_t sizey, uint8_t mode) void LCD_ClearString(uint16_t x, uint16_t y, const uint8_t *p, uint16_t bc, uint8_t sizey, uint8_t mode)
{ {
uint8_t adv = LCD_GetAsciiAdvance(sizey);
while (*p != '\0') while (*p != '\0')
{ {
// 用背景色bc作为“前景色”显示空格字符覆盖原字符 // 用背景色bc作为“前景色”显示空格字符覆盖原字符
LCD_ShowChar(x, y, ' ', bc, bc, sizey, mode); // 前景色=背景色=bc相当于清除 LCD_ShowChar(x, y, ' ', bc, bc, sizey, mode); // 前景色=背景色=bc相当于清除
x += sizey / 2; // 与原显示函数x步长一致 x += adv;
p++; p++;
} }
} }
@ -1357,9 +1371,11 @@ uint16_t LCD_ShowString_AutoAlign(uint16_t x1, uint16_t x2, uint16_t y, const ui
uint8_t align, uint16_t fc, uint16_t bc, uint8_t mode, uint8_t size) uint8_t align, uint16_t fc, uint16_t bc, uint8_t mode, uint8_t size)
{ {
uint8_t CHAR_WIDTH, CHAR_HEIGHT; uint8_t CHAR_WIDTH, CHAR_HEIGHT;
uint8_t CHAR_ADV;
if (!LCD_GetAsciiMetrics(size, &CHAR_WIDTH, &CHAR_HEIGHT)) if (!LCD_GetAsciiMetrics(size, &CHAR_WIDTH, &CHAR_HEIGHT))
return 0; return 0;
CHAR_ADV = LCD_GetAsciiAdvance(size);
uint16_t str_len = 0; uint16_t str_len = 0;
uint16_t str_total_width; uint16_t str_total_width;
@ -1372,8 +1388,8 @@ uint16_t LCD_ShowString_AutoAlign(uint16_t x1, uint16_t x2, uint16_t y, const ui
str_len++; str_len++;
} }
// 计算字符串总宽度 // 计算字符串总宽度(含字距)
str_total_width = str_len * CHAR_WIDTH; str_total_width = str_len * CHAR_ADV;
// 根据对齐方式计算起始 X 坐标 // 根据对齐方式计算起始 X 坐标
switch (align) switch (align)
@ -1399,7 +1415,7 @@ uint16_t LCD_ShowString_AutoAlign(uint16_t x1, uint16_t x2, uint16_t y, const ui
while (*p != '\0') while (*p != '\0')
{ {
LCD_ShowChar(curr_x, y, *p, fc, bc, CHAR_HEIGHT, mode); LCD_ShowChar(curr_x, y, *p, fc, bc, CHAR_HEIGHT, mode);
curr_x += CHAR_WIDTH; curr_x += CHAR_ADV;
p++; p++;
} }
return curr_x; return curr_x;
@ -1541,9 +1557,11 @@ uint16_t LCD_ShowString_AutoAlign_Gradient(uint16_t x1, uint16_t x2, uint16_t y,
uint16_t color_top, uint16_t color_bottom, uint8_t size) uint16_t color_top, uint16_t color_bottom, uint8_t size)
{ {
uint8_t CHAR_WIDTH, CHAR_HEIGHT; uint8_t CHAR_WIDTH, CHAR_HEIGHT;
uint8_t CHAR_ADV;
if (!LCD_GetAsciiMetrics(size, &CHAR_WIDTH, &CHAR_HEIGHT)) if (!LCD_GetAsciiMetrics(size, &CHAR_WIDTH, &CHAR_HEIGHT))
return 0; return 0;
CHAR_ADV = LCD_GetAsciiAdvance(size);
uint16_t str_len = 0; uint16_t str_len = 0;
uint16_t str_total_width; uint16_t str_total_width;
@ -1553,7 +1571,7 @@ uint16_t LCD_ShowString_AutoAlign_Gradient(uint16_t x1, uint16_t x2, uint16_t y,
while (p[str_len] != '\0') str_len++; while (p[str_len] != '\0') str_len++;
if (str_len == 0) return 0; if (str_len == 0) return 0;
str_total_width = str_len * CHAR_WIDTH; str_total_width = str_len * CHAR_ADV;
switch (align) switch (align)
{ {
@ -1569,7 +1587,7 @@ uint16_t LCD_ShowString_AutoAlign_Gradient(uint16_t x1, uint16_t x2, uint16_t y,
break; break;
} }
// 1. 画垂直渐变背景 // 1. 画垂直渐变背景(覆盖字形+字距)
LCD_FillGradient(curr_x, y, curr_x + str_total_width, y + CHAR_HEIGHT, color_top, color_bottom); LCD_FillGradient(curr_x, y, curr_x + str_total_width, y + CHAR_HEIGHT, color_top, color_bottom);
// 2. 叠加模式显示文字mode=1 // 2. 叠加模式显示文字mode=1