feat(ui): draw system settings with MiSans bitmaps
Match the requirement screen using the settings-hub method, and keep the glyphs 1-bit so the image still fits in application flash. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
e6de959366
commit
968f8ae1ec
|
|
@ -119,7 +119,7 @@ void UI_Setting_Init(void)
|
||||||
{
|
{
|
||||||
UI_ClearFocus();
|
UI_ClearFocus();
|
||||||
LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR);
|
LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR);
|
||||||
UI_DrawSubPageHeader((const uint8_t *)"\xCF\xB5\xCD\xB3\xC9\xE8\xD6\xC3");
|
UI_DrawSystemSetHeader();
|
||||||
DrawSystemSetting();
|
DrawSystemSetting();
|
||||||
pCurrentTouch_Area = Touch_SystemSetting_Areas;
|
pCurrentTouch_Area = Touch_SystemSetting_Areas;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
204
UI/UI_global.c
204
UI/UI_global.c
|
|
@ -1237,19 +1237,117 @@ void RestoreSetting(void)
|
||||||
drv_nvm_save_to_flash();
|
drv_nvm_save_to_flash();
|
||||||
LOG_I("NVM", "factory restore applied and saved");
|
LOG_I("NVM", "factory restore applied and saved");
|
||||||
}
|
}
|
||||||
|
/* 文字是 1 位 MiSans(省内部 Flash);左右三角仍是 RGB565 */
|
||||||
|
static void UI_BlitSys(uint16_t x, uint16_t y, const SysSetGlyph *g)
|
||||||
|
{
|
||||||
|
uint16_t row, col, stride;
|
||||||
|
if (!g || !g->data || !g->w || !g->h)
|
||||||
|
return;
|
||||||
|
if (g->mode)
|
||||||
|
{
|
||||||
|
LCD_WR_PIC_Trans(x, y, g->w, g->h, g->data, BLACK);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
stride = (uint16_t)((g->w + 7u) >> 3);
|
||||||
|
for (row = 0; row < g->h; row++)
|
||||||
|
{
|
||||||
|
const uint8_t *p = g->data + (uint32_t)row * stride;
|
||||||
|
for (col = 0; col < g->w; col++)
|
||||||
|
{
|
||||||
|
if (p[col >> 3] & (uint8_t)(0x80u >> (col & 7)))
|
||||||
|
LCD_DrawPoint((uint16_t)(x + col), (uint16_t)(y + row), WHITE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t UI_SysRowTextY(uint16_t row_y, uint8_t glyph_h)
|
||||||
|
{
|
||||||
|
if (glyph_h >= UI0902_SET_ROW_H)
|
||||||
|
return row_y;
|
||||||
|
return (uint16_t)(row_y + (UI0902_SET_ROW_H - glyph_h) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const SysSetGlyph *UI_SysDigitGlyph(char ch)
|
||||||
|
{
|
||||||
|
switch (ch)
|
||||||
|
{
|
||||||
|
case '0': return &g_SysSet_D0;
|
||||||
|
case '1': return &g_SysSet_D1;
|
||||||
|
case '2': return &g_SysSet_D2;
|
||||||
|
case '3': return &g_SysSet_D3;
|
||||||
|
case '4': return &g_SysSet_D4;
|
||||||
|
case '5': return &g_SysSet_D5;
|
||||||
|
case '6': return &g_SysSet_D6;
|
||||||
|
case '7': return &g_SysSet_D7;
|
||||||
|
case '8': return &g_SysSet_D8;
|
||||||
|
case '9': return &g_SysSet_D9;
|
||||||
|
case '.': return &g_SysSet_Dot;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t UI_SysMeasure(const char *s)
|
||||||
|
{
|
||||||
|
uint16_t w = 0;
|
||||||
|
while (s && *s)
|
||||||
|
{
|
||||||
|
const SysSetGlyph *g = UI_SysDigitGlyph(*s++);
|
||||||
|
if (g)
|
||||||
|
w = (uint16_t)(w + g->adv);
|
||||||
|
}
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UI_SysDrawNum(uint16_t x, uint16_t y, const char *s)
|
||||||
|
{
|
||||||
|
while (s && *s)
|
||||||
|
{
|
||||||
|
const SysSetGlyph *g = UI_SysDigitGlyph(*s++);
|
||||||
|
int16_t bx;
|
||||||
|
if (!g)
|
||||||
|
continue;
|
||||||
|
bx = (int16_t)g->bear;
|
||||||
|
if (bx < 0)
|
||||||
|
bx = 0;
|
||||||
|
UI_BlitSys((uint16_t)(x + bx), y, g);
|
||||||
|
x = (uint16_t)(x + g->adv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UI_SysCenterInSlot(uint16_t row_y, const SysSetGlyph *g)
|
||||||
|
{
|
||||||
|
uint16_t x;
|
||||||
|
uint16_t y;
|
||||||
|
if (!g)
|
||||||
|
return;
|
||||||
|
x = SYSSET_VAL_X;
|
||||||
|
if (g->w < SYSSET_VAL_W)
|
||||||
|
x = (uint16_t)(SYSSET_VAL_X + (SYSSET_VAL_W - g->w) / 2);
|
||||||
|
y = UI_SysRowTextY(row_y, g->h);
|
||||||
|
UI_BlitSys(x, y, g);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void UI_SysDrawSteppers(uint16_t row_y)
|
||||||
|
{
|
||||||
|
UI_BlitSys(SYSSET_TRIL_X, (uint16_t)(row_y + SYSSET_TRIL_DY), &g_SysSet_TriL);
|
||||||
|
UI_BlitSys(SYSSET_TRIR_X, (uint16_t)(row_y + SYSSET_TRIR_DY), &g_SysSet_TriR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UI_DrawSystemSetHeader(void)
|
||||||
|
{
|
||||||
|
uint16_t tx = 0;
|
||||||
|
if (g_SysSet_Title.w < 240)
|
||||||
|
tx = (uint16_t)((240 - g_SysSet_Title.w) / 2);
|
||||||
|
UI_BlitSys(SYSSET_BACK_X, SYSSET_BACK_Y, &g_SysSet_Back);
|
||||||
|
UI_BlitSys(tx, SYSSET_TITLE_Y, &g_SysSet_Title);
|
||||||
|
}
|
||||||
|
|
||||||
void Draw_System_Item_List(const LEBEL_UI *UI, GUI_SWITCH *Group)
|
void Draw_System_Item_List(const LEBEL_UI *UI, GUI_SWITCH *Group)
|
||||||
{
|
{
|
||||||
NvmParam_Type * nvm = drv_nvm_param_ptr();
|
NvmParam_Type * nvm = drv_nvm_param_ptr();
|
||||||
char Info[40];
|
char Info[16];
|
||||||
uint16_t c_top, c_bot;
|
|
||||||
uint16_t row_w = UI->w ? UI->w : UI0902_SET_ROW_W;
|
uint16_t row_w = UI->w ? UI->w : UI0902_SET_ROW_W;
|
||||||
uint8_t label_sz = UI->Tab_size ? UI->Tab_size : UI0902_SET_ROW_FONT;
|
const SysSetGlyph *label = 0;
|
||||||
uint8_t value_sz = UI->Text_size ? UI->Text_size : UI0902_FONT_LABEL;
|
|
||||||
uint16_t text_y = UI->y + (UI->h - label_sz) / 2;
|
|
||||||
/* “USB模式”约到 x+87,三角再右移让开;中间放下 USB MIDI / USB更新 */
|
|
||||||
uint16_t val_x1 = UI->x + 84;
|
|
||||||
uint16_t val_x2 = UI->x + row_w - 10;
|
|
||||||
uint16_t chev_cy = UI->y + UI->h / 2;
|
|
||||||
|
|
||||||
/* 先清整块外接矩形为页面底色,避免焦点蓝圆角残留四角描边 */
|
/* 先清整块外接矩形为页面底色,避免焦点蓝圆角残留四角描边 */
|
||||||
LCD_FillByColor(UI->x, UI->y, (uint16_t)(UI->x + row_w), (uint16_t)(UI->y + UI->h),
|
LCD_FillByColor(UI->x, UI->y, (uint16_t)(UI->x + row_w), (uint16_t)(UI->y + UI->h),
|
||||||
|
|
@ -1257,77 +1355,67 @@ void Draw_System_Item_List(const LEBEL_UI *UI, GUI_SWITCH *Group)
|
||||||
|
|
||||||
if (UI_IsFocused(Group->Id))
|
if (UI_IsFocused(Group->Id))
|
||||||
{
|
{
|
||||||
c_top = START_COLOR;
|
LCD_FillRoundRectGradient(UI->x, UI->y, row_w, UI->h, SYSSET_CARD_R, START_COLOR, END_COLOR);
|
||||||
c_bot = END_COLOR;
|
|
||||||
LCD_FillRoundRectGradient(UI->x, UI->y, row_w, UI->h, UI0902_RADIUS_CARD, c_top, c_bot);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
c_top = c_bot = UI0902_ROW_BG;
|
LCD_FillRoundRect(UI->x, UI->y, row_w, UI->h, SYSSET_CARD_R, UI0902_ROW_BG);
|
||||||
LCD_FillRoundRect(UI->x, UI->y, row_w, UI->h, UI0902_RADIUS_CARD, UI0902_ROW_BG);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0924 系统设置行:无左侧图标。含 ASCII(USB模式)时走混排,中文绘制会丢掉字母 */
|
switch (Group->Id)
|
||||||
if (UI->p && strchr((const char *)UI->p, 'U'))
|
{
|
||||||
LCD_ShowMixedString(UI->x + 12, UI->x + row_w, text_y, (uint8_t *)UI->p,
|
case GUI_VERSION: label = &g_SysSet_LblVer; break;
|
||||||
LCD_ALIGN_LEFT, WHITE, c_top, label_sz, 0);
|
case GUI_USB_MODE: label = &g_SysSet_LblUsb; break;
|
||||||
else
|
case GUI_AUTOCLOSE: label = &g_SysSet_LblAuto; break;
|
||||||
LCD_ShowChinese_AutoAlign_Gradient(UI->x + 12, UI->x + row_w, text_y, UI->p,
|
case GUI_RESTORE: label = &g_SysSet_LblRestore; break;
|
||||||
LCD_ALIGN_LEFT, WHITE, c_top, c_bot, label_sz);
|
default: break;
|
||||||
|
}
|
||||||
|
if (label)
|
||||||
|
UI_BlitSys((uint16_t)(UI->x + SYSSET_LABEL_DX),
|
||||||
|
UI_SysRowTextY(UI->y, label->h), label);
|
||||||
|
|
||||||
switch(Group->Id)
|
switch(Group->Id)
|
||||||
{
|
{
|
||||||
case GUI_VERSION:
|
case GUI_VERSION:
|
||||||
sprintf (Info, "%d.%d.%d", Version[0], Version[1],Version[2]);
|
sprintf(Info, "%d.%d.%d", Version[0], Version[1], Version[2]);
|
||||||
{
|
{
|
||||||
const uint16_t ver_box_w = 54;
|
const uint16_t pill_x = (uint16_t)(UI->x + SYSSET_PILL_DX);
|
||||||
const uint16_t ver_x1 = (uint16_t)(val_x2 - ver_box_w);
|
const uint16_t pill_y = (uint16_t)(UI->y + SYSSET_PILL_DY);
|
||||||
LCD_FillRoundRect(ver_x1, UI->y + (UI->h - 22) / 2, ver_box_w, 22, 4, UI0902_BG_COLOR);
|
uint16_t tw = UI_SysMeasure(Info);
|
||||||
LCD_ShowString_AutoAlign(ver_x1, val_x2,
|
uint16_t tx = pill_x;
|
||||||
UI->y + (UI->h - value_sz) / 2,
|
if (tw < SYSSET_PILL_W)
|
||||||
(const uint8_t*)Info, LCD_ALIGN_CENTER, WHITE, UI0902_BG_COLOR, 0, value_sz);
|
tx = (uint16_t)(pill_x + (SYSSET_PILL_W - tw) / 2);
|
||||||
|
LCD_FillRoundRect(pill_x, pill_y, SYSSET_PILL_W, SYSSET_PILL_H,
|
||||||
|
SYSSET_PILL_R, UI0902_BG_COLOR);
|
||||||
|
UI_SysDrawNum(tx, (uint16_t)(pill_y + (SYSSET_PILL_H - g_SysSet_D0.h) / 2), Info);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GUI_USB_MODE:
|
case GUI_USB_MODE:
|
||||||
UI_DrawTriLeft(val_x1, chev_cy);
|
UI_SysDrawSteppers(UI->y);
|
||||||
if (Group->Current)
|
UI_SysCenterInSlot(UI->y, Group->Current ? &g_SysSet_UsbUpdate : &g_SysSet_UsbMidi);
|
||||||
LCD_ShowMixedString(val_x1 + UI0902_TRI_L_W, val_x2 - UI0902_TRI_R_W, text_y,
|
|
||||||
(uint8_t *)"USB\xB8\xFC\xD0\xC2",
|
|
||||||
LCD_ALIGN_CENTER, WHITE, c_top, value_sz, 0);
|
|
||||||
else
|
|
||||||
LCD_ShowMixedString(val_x1 + UI0902_TRI_L_W, val_x2 - UI0902_TRI_R_W, text_y,
|
|
||||||
(uint8_t *)"USB MIDI",
|
|
||||||
LCD_ALIGN_CENTER, WHITE, c_top, value_sz, 0);
|
|
||||||
UI_DrawTriRight((uint16_t)(val_x2 - UI0902_TRI_R_W), chev_cy);
|
|
||||||
break;
|
break;
|
||||||
case GUI_AUTOCLOSE:
|
case GUI_AUTOCLOSE:
|
||||||
ApplyAutoCloseIndex(Group->Current);
|
ApplyAutoCloseIndex(Group->Current);
|
||||||
UI_DrawTriLeft(val_x1, chev_cy);
|
UI_SysDrawSteppers(UI->y);
|
||||||
if(Group->Current != 4)
|
if (Group->Current != 4)
|
||||||
{
|
{
|
||||||
sprintf (Info, "%d",AutoCloseTime);
|
uint16_t tw;
|
||||||
/* 与蓝牙「关」相同:数值在左右三角之间水平居中;数字相对标签下移 2px */
|
uint16_t tx = SYSSET_VAL_X;
|
||||||
LCD_ShowString_AutoAlign_Gradient(val_x1 + UI0902_TRI_L_W, val_x2 - UI0902_TRI_R_W,
|
sprintf(Info, "%d", AutoCloseTime);
|
||||||
(uint16_t)(text_y + 2),
|
tw = UI_SysMeasure(Info);
|
||||||
(const uint8_t *)Info, LCD_ALIGN_CENTER,
|
if (tw < SYSSET_VAL_W)
|
||||||
WHITE, c_top, c_bot, value_sz);
|
tx = (uint16_t)(SYSSET_VAL_X + (SYSSET_VAL_W - tw) / 2);
|
||||||
}else
|
UI_SysDrawNum(tx, UI_SysRowTextY(UI->y, g_SysSet_D0.h), Info);
|
||||||
{
|
}
|
||||||
/* 手册「不自动」;字库无「不」,界面显示「关闭」(字库已补「闭」) */
|
else
|
||||||
LCD_ShowChinese_AutoAlign_Gradient(val_x1 + UI0902_TRI_L_W, val_x2 - UI0902_TRI_R_W, text_y,
|
{
|
||||||
(const uint8_t*)"\xB9\xD8\xB1\xD5",
|
UI_SysCenterInSlot(UI->y, &g_SysSet_Off);
|
||||||
LCD_ALIGN_CENTER, WHITE, c_top, c_bot, value_sz);
|
|
||||||
}
|
}
|
||||||
UI_DrawTriRight((uint16_t)(val_x2 - UI0902_TRI_R_W), chev_cy);
|
|
||||||
nvm->param.AutoCloseTime = Group->Current;
|
nvm->param.AutoCloseTime = Group->Current;
|
||||||
drv_nvm_save_to_flash();
|
drv_nvm_save_to_flash();
|
||||||
break;
|
break;
|
||||||
case GUI_RESTORE:
|
case GUI_RESTORE:
|
||||||
LCD_WR_PIC_FROM_FLASH_Trans(
|
UI_BlitSys(SYSSET_CHEV_X, SYSSET_CHEV_Y, &g_SysSet_Chevron);
|
||||||
(uint16_t)(val_x2 - UI0902_ICON_CHEVRON_W),
|
|
||||||
(uint16_t)(UI->y + (UI->h - UI0902_ICON_CHEVRON_H) / 2),
|
|
||||||
UI0902_ICON_CHEVRON_W, UI0902_ICON_CHEVRON_H,
|
|
||||||
UI0902_ICON_CHEVRON_ADDR);
|
|
||||||
break;
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -277,6 +277,8 @@ extern void RestoreSetting(void);
|
||||||
extern void Draw_System_Item_List(const LEBEL_UI *UI, GUI_SWITCH *Group);
|
extern void Draw_System_Item_List(const LEBEL_UI *UI, GUI_SWITCH *Group);
|
||||||
/* 子页顶栏:左返回 + 居中标题(调音台/系统设置) */
|
/* 子页顶栏:左返回 + 居中标题(调音台/系统设置) */
|
||||||
extern void UI_DrawSubPageHeader(const uint8_t *title_gbk);
|
extern void UI_DrawSubPageHeader(const uint8_t *title_gbk);
|
||||||
|
/* 系统设置顶栏:MiSans 标题 + 需求图返回箭头 */
|
||||||
|
extern void UI_DrawSystemSetHeader(void);
|
||||||
/* 节奏类型→1.bin / 本地曲目→2.bin / 万能→3.bin */
|
/* 节奏类型→1.bin / 本地曲目→2.bin / 万能→3.bin */
|
||||||
extern void UI_ApplyToneAddress(void);
|
extern void UI_ApplyToneAddress(void);
|
||||||
extern void UI_ReloadTonePreset(void);
|
extern void UI_ReloadTonePreset(void);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,303 @@
|
||||||
|
#include "Drv_ILI9341_Lcd_Image_SysSet.h"
|
||||||
|
|
||||||
|
/* Auto-generated by tools/gen_sysset_font.py — MiSans Medium */
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_Title_64x16[128] = { /* 64x16 1-bit MSB */
|
||||||
|
0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x1F,0xFC,0x18,0x60,0x31,0xF8,0x3F,0xFC,
|
||||||
|
0x3F,0xFC,0x13,0xFE,0x39,0xF8,0x26,0x64,0x07,0x10,0x33,0xFE,0x19,0x98,0x3F,0xFC,
|
||||||
|
0x0C,0x38,0x6C,0xC0,0x03,0x1E,0x01,0x80,0x3F,0xE0,0x7D,0x98,0x77,0x0E,0x7F,0xFE,
|
||||||
|
0x1F,0xD0,0x7B,0x0C,0x70,0x00,0x01,0x80,0x07,0x38,0x13,0xFE,0x33,0xFC,0x1F,0xF8,
|
||||||
|
0x3E,0xFC,0x31,0xF4,0x33,0x0C,0x1F,0xF8,0x3F,0xFE,0x7C,0xB0,0x31,0x98,0x1F,0xF8,
|
||||||
|
0x01,0x84,0x71,0xB0,0x35,0xD8,0x1F,0xF8,0x1D,0xB8,0x01,0xB2,0x3C,0xF0,0x18,0x18,
|
||||||
|
0x39,0x9C,0x7D,0xB2,0x38,0xF8,0x1F,0xF8,0x77,0x86,0x7F,0x1E,0x37,0x9E,0x7F,0xFE,
|
||||||
|
0x07,0x80,0x06,0x1E,0x06,0x06,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_Title = { gImage_SysSet_Title_64x16, 64, 16, 64, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_LblVer_51x13[91] = { /* 51x13 1-bit MSB */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC1,0x08,0x14,0x18,0x08,0x00,0xFF,0xE1,
|
||||||
|
0x68,0x3D,0xF8,0x08,0x00,0xC4,0x63,0x7E,0x3D,0x01,0xFF,0xC0,0xFF,0xE3,0x7F,0x3D,
|
||||||
|
0xF0,0x1C,0x00,0xC4,0x67,0xC8,0x3F,0xF8,0x3E,0x00,0xDF,0x67,0xC8,0x31,0xD8,0x2A,
|
||||||
|
0x00,0xDF,0x67,0x0C,0x3D,0xD0,0x6B,0x00,0xD1,0x63,0xFF,0x3D,0x70,0xC9,0x80,0xDF,
|
||||||
|
0x63,0x08,0x35,0x71,0xBE,0xC0,0xC0,0x63,0x08,0x37,0x71,0x7F,0x40,0xFF,0xE3,0x08,
|
||||||
|
0x26,0xD8,0x08,0x00,0xC0,0x62,0x08,0x24,0x88,0x08,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_LblVer = { gImage_SysSet_LblVer_51x13, 51, 13, 51, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_LblUsb_52x13[91] = { /* 52x13 1-bit MSB */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x90,0x02,0x80,0x61,0x9F,
|
||||||
|
0x3F,0x0B,0xFC,0x02,0x40,0x61,0xB3,0x3F,0x9E,0x90,0xFF,0xE0,0x61,0xA0,0x31,0x9D,
|
||||||
|
0xFC,0xFF,0xE0,0x61,0xB0,0x31,0x8D,0x0C,0x03,0x00,0x61,0xBC,0x3F,0x1D,0xFC,0xFF,
|
||||||
|
0x00,0x61,0x8F,0x3F,0x9F,0xFC,0x7B,0x00,0x61,0x83,0xB1,0x98,0x60,0x33,0x00,0x61,
|
||||||
|
0x21,0xB1,0x8B,0xFC,0x31,0x20,0x73,0x33,0x33,0x88,0x70,0x3D,0xA0,0x3E,0x3F,0x3F,
|
||||||
|
0x09,0xD8,0xF8,0xE0,0x00,0x00,0x00,0x0B,0x0C,0x00,0xC0,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_LblUsb = { gImage_SysSet_LblUsb_52x13, 52, 13, 52, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_LblAuto_51x13[91] = { /* 51x13 1-bit MSB */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x08,0x08,0x60,0xC0,0x00,0x7F,0xC7,
|
||||||
|
0xC8,0x0C,0x40,0xCF,0x00,0x7F,0xC0,0x3F,0x1F,0xF1,0xE9,0x00,0x40,0x40,0x3F,0x1F,
|
||||||
|
0xF1,0xE9,0x00,0x7F,0xC7,0xD9,0x01,0x00,0xC9,0x00,0x7F,0xC3,0x1B,0x03,0x00,0xE9,
|
||||||
|
0x00,0x40,0x43,0x9B,0x3F,0xF9,0xF9,0x00,0x7F,0xC2,0xDB,0x03,0x81,0xC9,0x00,0x60,
|
||||||
|
0x46,0x53,0x03,0x80,0xD9,0x40,0x40,0x47,0xF3,0x0E,0xE0,0xD9,0x40,0x7F,0xC4,0x3F,
|
||||||
|
0x38,0x78,0xF1,0xC0,0x40,0x40,0x26,0x30,0x18,0xF0,0xC0,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_LblAuto = { gImage_SysSet_LblAuto_51x13, 51, 13, 51, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_LblRestore_78x13[130] = { /* 78x13 1-bit MSB */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0xC0,0x00,0x80,0x00,
|
||||||
|
0x02,0x3C,0x1F,0xF0,0x37,0xF1,0xFF,0x88,0x88,0x7F,0xE3,0x3E,0x36,0xD8,0x7F,0xF3,
|
||||||
|
0x80,0x08,0x88,0x60,0x01,0x66,0x3F,0xF8,0x7A,0xC3,0xFF,0x08,0x88,0x60,0x00,0x67,
|
||||||
|
0x03,0x80,0x76,0xD1,0xFF,0x0F,0xF8,0x60,0x06,0x40,0x3F,0xF8,0x77,0xF1,0x81,0x0F,
|
||||||
|
0xF8,0x60,0x02,0x7E,0x1F,0xF0,0x77,0xE1,0xFF,0x00,0x80,0x60,0x02,0x66,0x1F,0xF0,
|
||||||
|
0x3D,0xC0,0xC0,0x18,0x8C,0x60,0x02,0x26,0x1F,0xF0,0x3D,0xC1,0xFF,0x18,0x8C,0x40,
|
||||||
|
0x03,0xBC,0x1F,0xF0,0x39,0x63,0x7E,0x18,0x8C,0xC0,0x03,0x9C,0x1F,0xF0,0x37,0x30,
|
||||||
|
0xFF,0x1F,0xFC,0xC0,0x03,0xF7,0x18,0x30,0x34,0x13,0xC3,0x80,0x0C,0x80,0x00,0xC1,
|
||||||
|
0x3F,0xF8,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_LblRestore = { gImage_SysSet_LblRestore_78x13, 78, 13, 78, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_UsbUpdate_52x13[91] = { /* 52x13 1-bit MSB */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFC,0x20,0x20,0x61,0x9F,
|
||||||
|
0x3F,0x1F,0xFC,0xFF,0xE0,0x61,0xB3,0x3F,0x8F,0xF8,0x5B,0x00,0x61,0xA0,0x31,0x8F,
|
||||||
|
0xF8,0x5B,0x00,0x61,0xB0,0x31,0x8D,0xC8,0xFF,0xE0,0x61,0xBC,0x3F,0x0F,0xF8,0x33,
|
||||||
|
0xE0,0x61,0x8F,0x3F,0x8C,0xC8,0xFF,0x40,0x61,0x83,0xB1,0x8F,0xF8,0xFB,0x40,0x61,
|
||||||
|
0x21,0xB1,0x85,0x80,0xFA,0x40,0x73,0x33,0x33,0x87,0x80,0xBE,0x40,0x3E,0x3F,0x3F,
|
||||||
|
0x0F,0xFC,0xF6,0x40,0x00,0x00,0x00,0x18,0x3C,0x64,0x40,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_UsbUpdate = { gImage_SysSet_UsbUpdate_52x13, 52, 13, 52, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_UsbMidi_59x12[96] = { /* 59x12 1-bit MSB */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x61,0x9F,0x3F,0x00,0xC0,0xCD,0xF8,0x60,
|
||||||
|
0x61,0xB3,0x3F,0x80,0xC1,0xCD,0xFC,0x60,0x61,0xA0,0x31,0x80,0xE1,0xCD,0x86,0x60,
|
||||||
|
0x61,0xB0,0x31,0x80,0xF3,0xCD,0x86,0x60,0x61,0xBC,0x3F,0x00,0xF2,0xCD,0x86,0x60,
|
||||||
|
0x61,0x8F,0x3F,0x80,0xDE,0xCD,0x82,0x60,0x61,0x83,0xB1,0x80,0xCC,0xCD,0x86,0x60,
|
||||||
|
0x61,0x21,0xB1,0x80,0xC8,0xCD,0x86,0x60,0x73,0x33,0x33,0x80,0xC0,0xCD,0xBC,0x60,
|
||||||
|
0x3E,0x3F,0x3F,0x00,0xC0,0xCD,0xF8,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_UsbMidi = { gImage_SysSet_UsbMidi_59x12, 59, 12, 59, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_Off_25x13[52] = { /* 25x13 1-bit MSB */
|
||||||
|
0x00,0x00,0x00,0x00,0x10,0xC1,0x3F,0x00,0x18,0x81,0xBF,0x80,0x3F,0xE0,0x89,0x80,
|
||||||
|
0x3F,0xE3,0x0D,0x80,0x02,0x03,0xFF,0x80,0x06,0x03,0x1D,0x80,0x7F,0xF3,0x3D,0x80,
|
||||||
|
0x07,0x03,0x6D,0x80,0x07,0x03,0xCD,0x80,0x1D,0xC3,0x9D,0x80,0x70,0xF3,0x3F,0x80,
|
||||||
|
0x60,0x33,0x07,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_Off = { gImage_SysSet_Off_25x13, 25, 13, 25, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_D0_8x13[13] = { /* 8x13 1-bit MSB */
|
||||||
|
0x00,0x3C,0x76,0x62,0x63,0x43,0x43,0x63,0x63,0x76,0x3C,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_D0 = { gImage_SysSet_D0_8x13, 8, 13, 8, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_D1_4x13[13] = { /* 4x13 1-bit MSB */
|
||||||
|
0x00,0x30,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_D1 = { gImage_SysSet_D1_4x13, 4, 13, 6, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_D2_7x13[13] = { /* 7x13 1-bit MSB */
|
||||||
|
0x00,0x3C,0x6E,0x46,0x06,0x0C,0x0C,0x18,0x30,0x60,0xFE,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_D2 = { gImage_SysSet_D2_7x13, 7, 13, 8, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_D3_7x13[13] = { /* 7x13 1-bit MSB */
|
||||||
|
0x00,0xFC,0xFC,0x18,0x30,0x78,0x0C,0x04,0x04,0xCC,0x78,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_D3 = { gImage_SysSet_D3_7x13, 7, 13, 8, 1, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_D4_8x13[13] = { /* 8x13 1-bit MSB */
|
||||||
|
0x00,0x0C,0x1C,0x1C,0x34,0x24,0x64,0xFE,0xFF,0x04,0x04,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_D4 = { gImage_SysSet_D4_8x13, 8, 13, 8, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_D5_7x13[13] = { /* 7x13 1-bit MSB */
|
||||||
|
0x00,0xFC,0xF8,0xC0,0xC0,0xF8,0xCC,0x04,0x04,0xCC,0x78,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_D5 = { gImage_SysSet_D5_7x13, 7, 13, 8, 1, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_D6_8x13[13] = { /* 8x13 1-bit MSB */
|
||||||
|
0x00,0x18,0x18,0x30,0x30,0x7E,0x66,0x43,0x43,0x66,0x3C,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_D6 = { gImage_SysSet_D6_8x13, 8, 13, 8, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_D7_7x13[13] = { /* 7x13 1-bit MSB */
|
||||||
|
0x00,0xFE,0x7E,0x0C,0x0C,0x18,0x18,0x10,0x30,0x30,0x60,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_D7 = { gImage_SysSet_D7_7x13, 7, 13, 7, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_D8_8x13[13] = { /* 8x13 1-bit MSB */
|
||||||
|
0x00,0x3C,0x66,0x62,0x66,0x3C,0x7E,0x63,0x43,0x67,0x3E,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_D8 = { gImage_SysSet_D8_8x13, 8, 13, 8, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_D9_8x13[13] = { /* 8x13 1-bit MSB */
|
||||||
|
0x00,0x3C,0x66,0x42,0xC2,0x66,0x7E,0x1C,0x0C,0x18,0x18,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_D9 = { gImage_SysSet_D9_8x13, 8, 13, 8, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_Dot_2x13[13] = { /* 2x13 1-bit MSB */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_Dot = { gImage_SysSet_Dot_2x13, 2, 13, 3, 1, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_Back_29x24[96] = { /* 29x24 1-bit MSB */
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,
|
||||||
|
0x00,0x78,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xFF,0xFE,0x00,0x01,0xFF,0xFE,0x00,
|
||||||
|
0x01,0xFF,0xFE,0x00,0x00,0xF0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x3C,0x00,0x00,
|
||||||
|
0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_Back = { gImage_SysSet_Back_29x24, 29, 24, 29, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_Chevron_10x17[34] = { /* 10x17 1-bit MSB */
|
||||||
|
0xC0,0x00,0x60,0x00,0x78,0x00,0x3C,0x00,0x1E,0x00,0x07,0x00,0x03,0x80,0x01,0xC0,
|
||||||
|
0x01,0xC0,0x03,0xC0,0x07,0x80,0x0E,0x00,0x3C,0x00,0x78,0x00,0x70,0x00,0xE0,0x00,
|
||||||
|
0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_Chevron = { gImage_SysSet_Chevron_10x17, 10, 17, 10, 0, 0 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_TriL_22x21[924] = { /* 22x21 RGB565 BE */
|
||||||
|
0x00,0x00,0x00,0x00,0x08,0x62,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,
|
||||||
|
0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,
|
||||||
|
0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x83,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x08,0xA4,0x00,0x00,0x08,0x62,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x08,0x83,0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0x83,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x6B,0x6E,0xE7,0x1C,0x7B,0xF0,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x5B,0x0D,
|
||||||
|
0xE7,0x1C,0xFF,0xFF,0xFF,0xFF,0xC6,0x39,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x4A,0x8B,0xC6,0x39,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||||
|
0xFF,0xFF,0xC6,0x39,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x00,0x00,
|
||||||
|
0xC6,0x39,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x39,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0x83,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x00,0x00,0xA5,0x55,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x39,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0xC6,0x39,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x39,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0xA5,0x55,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||||
|
0xFF,0xFF,0xC6,0x39,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x4A,0x8B,0xC6,0x39,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x39,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0x83,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x6B,0x6E,0xE7,0x1C,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x39,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x6B,0x6E,0xE7,0x1C,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x39,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x00,0x00,0x8C,0x52,0xF7,0x9E,
|
||||||
|
0xFF,0xFF,0xC6,0x39,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x00,0x00,0x7B,0xF0,0x00,0x00,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0x83,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0x83,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x08,0xA4,0x00,0x00,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0x62,
|
||||||
|
0x00,0x00,0x08,0x62,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0x83,0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_TriL = { gImage_SysSet_TriL_22x21, 22, 21, 22, 0, 1 };
|
||||||
|
|
||||||
|
const unsigned char gImage_SysSet_TriR_21x21[882] = { /* 21x21 RGB565 BE */
|
||||||
|
0x00,0x00,0x00,0x00,0x08,0x63,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,
|
||||||
|
0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,0x08,0x83,
|
||||||
|
0x08,0x83,0x08,0x83,0x08,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x08,0x62,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0xB5,0xB7,
|
||||||
|
0xC6,0x39,0x4A,0x8B,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x39,
|
||||||
|
0x00,0x00,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA5,0x55,0x00,0x00,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0xFF,0xFF,0xFF,0xFF,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x94,0xD4,0x00,0x00,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x9E,0x8C,0x52,0x00,0x00,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0x8C,0x52,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x6B,0x6E,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xA5,0x55,0x00,0x00,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0xFF,0xFF,
|
||||||
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x39,0x4A,0x8B,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
|
||||||
|
0xC6,0x39,0x4A,0x8B,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0xFF,0xFF,0xFF,0xFF,0xE7,0x1C,0x6B,0x6E,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x4A,0x8B,0x6B,0x6E,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0xA3,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x00,0x00,0x08,0xA3,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,
|
||||||
|
0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x10,0xA4,0x08,0xA4,
|
||||||
|
0x00,0x00,
|
||||||
|
};
|
||||||
|
|
||||||
|
const SysSetGlyph g_SysSet_TriR = { gImage_SysSet_TriR_21x21, 21, 21, 21, 0, 1 };
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
#ifndef __DRV_ILI9341_LCD_IMAGE_SYSSET_H
|
||||||
|
#define __DRV_ILI9341_LCD_IMAGE_SYSSET_H
|
||||||
|
|
||||||
|
#include "stdint.h"
|
||||||
|
|
||||||
|
/* MiSans-Medium strips, same blit path as the settings hub cards. */
|
||||||
|
typedef struct {
|
||||||
|
const unsigned char *data;
|
||||||
|
uint8_t w;
|
||||||
|
uint8_t h;
|
||||||
|
uint8_t adv;
|
||||||
|
int8_t bear;
|
||||||
|
uint8_t mode; /* 0 = 1-bit ink, 1 = RGB565 */
|
||||||
|
} SysSetGlyph;
|
||||||
|
|
||||||
|
extern const SysSetGlyph g_SysSet_Title;
|
||||||
|
extern const SysSetGlyph g_SysSet_LblVer;
|
||||||
|
extern const SysSetGlyph g_SysSet_LblUsb;
|
||||||
|
extern const SysSetGlyph g_SysSet_LblAuto;
|
||||||
|
extern const SysSetGlyph g_SysSet_LblRestore;
|
||||||
|
extern const SysSetGlyph g_SysSet_UsbUpdate;
|
||||||
|
extern const SysSetGlyph g_SysSet_UsbMidi;
|
||||||
|
extern const SysSetGlyph g_SysSet_Off;
|
||||||
|
extern const SysSetGlyph g_SysSet_D0;
|
||||||
|
extern const SysSetGlyph g_SysSet_D1;
|
||||||
|
extern const SysSetGlyph g_SysSet_D2;
|
||||||
|
extern const SysSetGlyph g_SysSet_D3;
|
||||||
|
extern const SysSetGlyph g_SysSet_D4;
|
||||||
|
extern const SysSetGlyph g_SysSet_D5;
|
||||||
|
extern const SysSetGlyph g_SysSet_D6;
|
||||||
|
extern const SysSetGlyph g_SysSet_D7;
|
||||||
|
extern const SysSetGlyph g_SysSet_D8;
|
||||||
|
extern const SysSetGlyph g_SysSet_D9;
|
||||||
|
extern const SysSetGlyph g_SysSet_Dot;
|
||||||
|
extern const SysSetGlyph g_SysSet_Back;
|
||||||
|
extern const SysSetGlyph g_SysSet_Chevron;
|
||||||
|
extern const SysSetGlyph g_SysSet_TriL;
|
||||||
|
extern const SysSetGlyph g_SysSet_TriR;
|
||||||
|
|
||||||
|
#define SYSSET_BACK_X 8
|
||||||
|
#define SYSSET_BACK_Y 7
|
||||||
|
#define SYSSET_CHEV_X 203
|
||||||
|
#define SYSSET_CHEV_Y 261
|
||||||
|
#define SYSSET_TRIL_X 100
|
||||||
|
#define SYSSET_TRIL_DY 18
|
||||||
|
#define SYSSET_TRIR_X 191
|
||||||
|
#define SYSSET_TRIR_DY 18
|
||||||
|
#define SYSSET_TITLE_Y 12
|
||||||
|
#define SYSSET_LABEL_DX 12
|
||||||
|
#define SYSSET_VAL_X 122
|
||||||
|
#define SYSSET_VAL_W 69
|
||||||
|
#define SYSSET_PILL_DX 143
|
||||||
|
#define SYSSET_PILL_DY 18
|
||||||
|
#define SYSSET_PILL_W 54
|
||||||
|
#define SYSSET_PILL_H 22
|
||||||
|
#define SYSSET_PILL_R 4
|
||||||
|
#define SYSSET_CARD_R 7
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -2096,6 +2096,12 @@
|
||||||
<file>
|
<file>
|
||||||
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image_ChargePct.h</name>
|
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image_ChargePct.h</name>
|
||||||
</file>
|
</file>
|
||||||
|
<file>
|
||||||
|
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image_SysSet.c</name>
|
||||||
|
</file>
|
||||||
|
<file>
|
||||||
|
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image_SysSet.h</name>
|
||||||
|
</file>
|
||||||
<file>
|
<file>
|
||||||
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image.h</name>
|
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image.h</name>
|
||||||
</file>
|
</file>
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@
|
||||||
#include "Drv_ILI9341_Lcd_Image.h"
|
#include "Drv_ILI9341_Lcd_Image.h"
|
||||||
#include "Drv_ILI9341_Lcd_Image_UI0902.h"
|
#include "Drv_ILI9341_Lcd_Image_UI0902.h"
|
||||||
#include "Drv_ILI9341_Lcd_Image_ChargePct.h"
|
#include "Drv_ILI9341_Lcd_Image_ChargePct.h"
|
||||||
|
#include "Drv_ILI9341_Lcd_Image_SysSet.h"
|
||||||
#include "UI0902_Res_Addr.h"
|
#include "UI0902_Res_Addr.h"
|
||||||
#include "ExtFlash_Tone_Addr.h"
|
#include "ExtFlash_Tone_Addr.h"
|
||||||
#include "LocalSongNames.h"
|
#include "LocalSongNames.h"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,353 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""System-settings text as MiSans-Medium RGB565, same pipeline as the settings hub cards."""
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
|
||||||
|
ROOT = Path(r"C:\Users\qjyu\Documents\SoundWalker\一诺国际吉他")
|
||||||
|
CODE = ROOT / "Code" / "YNGJ-GT1-M - AT32F403ARCT7"
|
||||||
|
FONT = next((ROOT / "Doc" / "UI" / "MiSans").rglob("MiSans-Medium.ttf"))
|
||||||
|
SCREEN = CODE / "screen.png"
|
||||||
|
OUT_C = CODE / "device" / "LCD_ILI9341" / "Drv_ILI9341_Lcd_Image_SysSet.c"
|
||||||
|
OUT_H = CODE / "device" / "LCD_ILI9341" / "Drv_ILI9341_Lcd_Image_SysSet.h"
|
||||||
|
PREVIEW = CODE / "tools" / "out" / "sysset_preview.png"
|
||||||
|
|
||||||
|
TITLE_PX = 16
|
||||||
|
LABEL_PX = 13
|
||||||
|
VALUE_PX = 13
|
||||||
|
|
||||||
|
|
||||||
|
def render_phrase(text, px):
|
||||||
|
font = ImageFont.truetype(str(FONT), px)
|
||||||
|
scratch = Image.new("RGBA", (220, 48), (0, 0, 0, 0))
|
||||||
|
dr = ImageDraw.Draw(scratch)
|
||||||
|
dr.text((2, 2), text, font=font, fill=(255, 255, 255, 255))
|
||||||
|
bbox = scratch.getbbox()
|
||||||
|
if bbox is None:
|
||||||
|
raise SystemExit("empty " + text)
|
||||||
|
return scratch.crop(bbox)
|
||||||
|
|
||||||
|
|
||||||
|
CELL_H = 13
|
||||||
|
BASELINE = 11
|
||||||
|
|
||||||
|
|
||||||
|
def render_glyph(ch, px):
|
||||||
|
"""Fixed-height cell so '.' shares the digit baseline. Horizontal crop only."""
|
||||||
|
font = ImageFont.truetype(str(FONT), px)
|
||||||
|
origin = 8
|
||||||
|
scratch = Image.new("RGBA", (72, CELL_H), (0, 0, 0, 0))
|
||||||
|
dr = ImageDraw.Draw(scratch)
|
||||||
|
try:
|
||||||
|
dr.text((origin, BASELINE), ch, font=font, fill=(255, 255, 255, 255), anchor="ls")
|
||||||
|
except TypeError:
|
||||||
|
ascent, _ = font.getmetrics()
|
||||||
|
dr.text((origin, BASELINE - ascent), ch, font=font, fill=(255, 255, 255, 255))
|
||||||
|
alpha = np.array(scratch)[:, :, 3]
|
||||||
|
cols = np.where(alpha.max(axis=0) >= 40)[0]
|
||||||
|
adv = max(1, int(round(font.getlength(ch))))
|
||||||
|
if len(cols) == 0:
|
||||||
|
im = Image.new("RGBA", (adv, CELL_H), (0, 0, 0, 0))
|
||||||
|
return im, 0, adv
|
||||||
|
x0, x1 = int(cols[0]), int(cols[-1])
|
||||||
|
im = scratch.crop((x0, 0, x1 + 1, CELL_H))
|
||||||
|
bear = x0 - origin
|
||||||
|
if bear < 0:
|
||||||
|
pad = Image.new("RGBA", (im.size[0] - bear, CELL_H), (0, 0, 0, 0))
|
||||||
|
pad.paste(im, (-bear, 0))
|
||||||
|
im = pad
|
||||||
|
bear = 0
|
||||||
|
adv = max(bear + im.size[0], adv)
|
||||||
|
return im, bear, adv
|
||||||
|
|
||||||
|
|
||||||
|
def to_rgb565(im):
|
||||||
|
im = im.convert("RGBA")
|
||||||
|
w, h = im.size
|
||||||
|
out = bytearray(w * h * 2)
|
||||||
|
i = 0
|
||||||
|
px = im.load()
|
||||||
|
for y in range(h):
|
||||||
|
for x in range(w):
|
||||||
|
r, g, b, a = px[x, y]
|
||||||
|
if a < 40:
|
||||||
|
out[i] = 0
|
||||||
|
out[i + 1] = 0
|
||||||
|
else:
|
||||||
|
r = (r * a) // 255
|
||||||
|
g = (g * a) // 255
|
||||||
|
b = (b * a) // 255
|
||||||
|
v = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3)
|
||||||
|
out[i] = (v >> 8) & 0xFF
|
||||||
|
out[i + 1] = v & 0xFF
|
||||||
|
i += 2
|
||||||
|
return bytes(out)
|
||||||
|
|
||||||
|
|
||||||
|
def crop_widget(im, x0, y0, x1, y1, key_fn):
|
||||||
|
"""RGB crop; keyed pixels become transparent black."""
|
||||||
|
sub = im.crop((x0, y0, x1 + 1, y1 + 1)).convert("RGBA")
|
||||||
|
px = sub.load()
|
||||||
|
w, h = sub.size
|
||||||
|
for y in range(h):
|
||||||
|
for x in range(w):
|
||||||
|
r, g, b, a = px[x, y]
|
||||||
|
if key_fn(r, g, b):
|
||||||
|
px[x, y] = (0, 0, 0, 0)
|
||||||
|
else:
|
||||||
|
px[x, y] = (r, g, b, 255)
|
||||||
|
bbox = sub.getbbox()
|
||||||
|
if bbox is None:
|
||||||
|
raise SystemExit("empty widget")
|
||||||
|
ox, oy = bbox[0], bbox[1]
|
||||||
|
return sub.crop(bbox), x0 + ox, y0 + oy
|
||||||
|
|
||||||
|
|
||||||
|
def is_page_bg(r, g, b):
|
||||||
|
return r < 14 and g < 18 and b < 28
|
||||||
|
|
||||||
|
|
||||||
|
def is_card(r, g, b):
|
||||||
|
return 24 <= r <= 48 and 32 <= g <= 56 and 44 <= b <= 72
|
||||||
|
|
||||||
|
|
||||||
|
def to_1bit(im):
|
||||||
|
"""MSB-first ink. About 1/16 the size of RGB565, which is what internal flash can hold."""
|
||||||
|
im = im.convert("RGBA")
|
||||||
|
w, h = im.size
|
||||||
|
stride = (w + 7) // 8
|
||||||
|
out = bytearray(stride * h)
|
||||||
|
px = im.load()
|
||||||
|
for y in range(h):
|
||||||
|
for x in range(w):
|
||||||
|
r, g, b, a = px[x, y]
|
||||||
|
if a >= 96 and (r + g + b) > 180:
|
||||||
|
out[y * stride + (x >> 3)] |= 0x80 >> (x & 7)
|
||||||
|
return bytes(out)
|
||||||
|
|
||||||
|
|
||||||
|
def emit_array(lines, name, data, note):
|
||||||
|
lines.append(f"const unsigned char {name}[{len(data)}] = {{ /* {note} */")
|
||||||
|
hexes = [f"0x{b:02X}" for b in data]
|
||||||
|
for i in range(0, len(hexes), 16):
|
||||||
|
lines.append(" " + ",".join(hexes[i:i + 16]) + ",")
|
||||||
|
lines.append("};")
|
||||||
|
lines.append("")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
screen = Image.open(SCREEN).convert("RGB")
|
||||||
|
phrases = {
|
||||||
|
"Title": ("系统设置", TITLE_PX),
|
||||||
|
"LblVer": ("固件版本", LABEL_PX),
|
||||||
|
"LblUsb": ("USB模式", LABEL_PX),
|
||||||
|
"LblAuto": ("自动关机", LABEL_PX),
|
||||||
|
"LblRestore": ("恢复出厂设置", LABEL_PX),
|
||||||
|
"UsbUpdate": ("USB更新", VALUE_PX),
|
||||||
|
"UsbMidi": ("USB MIDI", VALUE_PX),
|
||||||
|
"Off": ("关闭", VALUE_PX),
|
||||||
|
}
|
||||||
|
pics = {}
|
||||||
|
for name, (text, px) in phrases.items():
|
||||||
|
im = render_phrase(text, px)
|
||||||
|
pics[name] = im
|
||||||
|
print(f"{name:12} {text} {im.size}")
|
||||||
|
|
||||||
|
glyphs = {}
|
||||||
|
for ch in "0123456789.":
|
||||||
|
im, bear, adv = render_glyph(ch, VALUE_PX)
|
||||||
|
glyphs[ch] = (im, bear, adv)
|
||||||
|
print(f"glyph {ch!r:4} {im.size} bear {bear} adv {adv}")
|
||||||
|
|
||||||
|
back, back_x, back_y = crop_widget(screen, 8, 6, 36, 32, is_page_bg)
|
||||||
|
chev, chev_x, chev_y = crop_widget(screen, 198, 255, 218, 282, lambda r, g, b: is_card(r, g, b) or is_page_bg(r, g, b))
|
||||||
|
tri_l, tlx, tly = crop_widget(screen, 100, 132, 121, 152, is_card)
|
||||||
|
tri_r, trx, try_ = crop_widget(screen, 191, 132, 211, 152, is_card)
|
||||||
|
print("back", back.size, back_x, back_y)
|
||||||
|
print("chev", chev.size, chev_x, chev_y)
|
||||||
|
print("triL", tri_l.size, tlx, tly, "triR", tri_r.size, trx, try_)
|
||||||
|
|
||||||
|
h_lines = [
|
||||||
|
"#ifndef __DRV_ILI9341_LCD_IMAGE_SYSSET_H",
|
||||||
|
"#define __DRV_ILI9341_LCD_IMAGE_SYSSET_H",
|
||||||
|
"",
|
||||||
|
'#include "stdint.h"',
|
||||||
|
"",
|
||||||
|
"/* MiSans-Medium strips, same blit path as the settings hub cards. */",
|
||||||
|
"typedef struct {",
|
||||||
|
" const unsigned char *data;",
|
||||||
|
" uint8_t w;",
|
||||||
|
" uint8_t h;",
|
||||||
|
" uint8_t adv;",
|
||||||
|
" int8_t bear;",
|
||||||
|
" uint8_t mode; /* 0 = 1-bit ink, 1 = RGB565 */",
|
||||||
|
"} SysSetGlyph;",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
c_lines = [
|
||||||
|
'#include "Drv_ILI9341_Lcd_Image_SysSet.h"',
|
||||||
|
"",
|
||||||
|
"/* Auto-generated by tools/gen_sysset_font.py — MiSans Medium */",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
|
||||||
|
payload = [0]
|
||||||
|
|
||||||
|
def add_pic(sym, im, bear=0, adv=None, rgb565=False):
|
||||||
|
w, h = im.size
|
||||||
|
if adv is None:
|
||||||
|
adv = w
|
||||||
|
if rgb565:
|
||||||
|
data = to_rgb565(im)
|
||||||
|
note = f"{w}x{h} RGB565 BE"
|
||||||
|
mode = 1
|
||||||
|
else:
|
||||||
|
data = to_1bit(im)
|
||||||
|
note = f"{w}x{h} 1-bit MSB"
|
||||||
|
mode = 0
|
||||||
|
payload[0] += len(data)
|
||||||
|
arr = f"gImage_SysSet_{sym}_{w}x{h}"
|
||||||
|
emit_array(c_lines, arr, data, note)
|
||||||
|
c_lines.append(
|
||||||
|
f"const SysSetGlyph g_SysSet_{sym} = {{ {arr}, {w}, {h}, {adv}, {bear}, {mode} }};"
|
||||||
|
)
|
||||||
|
c_lines.append("")
|
||||||
|
h_lines.append(f"extern const SysSetGlyph g_SysSet_{sym};")
|
||||||
|
|
||||||
|
for name, im in pics.items():
|
||||||
|
add_pic(name, im)
|
||||||
|
|
||||||
|
for ch, (im, bear, adv) in glyphs.items():
|
||||||
|
sym = "Dot" if ch == "." else f"D{ch}"
|
||||||
|
add_pic(sym, im, bear, adv)
|
||||||
|
|
||||||
|
add_pic("Back", back)
|
||||||
|
add_pic("Chevron", chev)
|
||||||
|
add_pic("TriL", tri_l, rgb565=True)
|
||||||
|
add_pic("TriR", tri_r, rgb565=True)
|
||||||
|
|
||||||
|
h_lines += [
|
||||||
|
"",
|
||||||
|
f"#define SYSSET_BACK_X {back_x}",
|
||||||
|
f"#define SYSSET_BACK_Y {back_y}",
|
||||||
|
f"#define SYSSET_CHEV_X {chev_x}",
|
||||||
|
f"#define SYSSET_CHEV_Y {chev_y}",
|
||||||
|
f"#define SYSSET_TRIL_X {tlx}",
|
||||||
|
f"#define SYSSET_TRIL_DY {tly - 114}",
|
||||||
|
f"#define SYSSET_TRIR_X {trx}",
|
||||||
|
f"#define SYSSET_TRIR_DY {try_ - 114}",
|
||||||
|
"#define SYSSET_TITLE_Y 12",
|
||||||
|
"#define SYSSET_LABEL_DX 12",
|
||||||
|
"#define SYSSET_VAL_X 122",
|
||||||
|
"#define SYSSET_VAL_W 69",
|
||||||
|
"#define SYSSET_PILL_DX 143",
|
||||||
|
"#define SYSSET_PILL_DY 18",
|
||||||
|
"#define SYSSET_PILL_W 54",
|
||||||
|
"#define SYSSET_PILL_H 22",
|
||||||
|
"#define SYSSET_PILL_R 4",
|
||||||
|
"#define SYSSET_CARD_R 7",
|
||||||
|
"",
|
||||||
|
"#endif",
|
||||||
|
"",
|
||||||
|
]
|
||||||
|
OUT_H.write_text("\n".join(h_lines), encoding="utf-8", newline="\n")
|
||||||
|
OUT_C.write_text("\n".join(c_lines), encoding="utf-8", newline="\n")
|
||||||
|
print("wrote", OUT_C.stat().st_size, OUT_H.stat().st_size, "payload", payload[0])
|
||||||
|
preview(screen, pics, glyphs, back, (back_x, back_y), chev, (chev_x, chev_y),
|
||||||
|
tri_l, (tlx, tly), tri_r, (trx, try_))
|
||||||
|
|
||||||
|
|
||||||
|
def fill_round(canvas, x, y, w, h, r, color):
|
||||||
|
yy, xx = np.ogrid[0:h, 0:w]
|
||||||
|
m = np.ones((h, w), dtype=bool)
|
||||||
|
for cx, cy, sx, sy in (
|
||||||
|
(r, r, 1, 1),
|
||||||
|
(w - 1 - r, r, -1, 1),
|
||||||
|
(r, h - 1 - r, 1, -1),
|
||||||
|
(w - 1 - r, h - 1 - r, -1, -1),
|
||||||
|
):
|
||||||
|
corner = (xx - cx) ** 2 + (yy - cy) ** 2 > r * r
|
||||||
|
region = np.zeros_like(m)
|
||||||
|
if sx > 0:
|
||||||
|
region[:, :r] = True
|
||||||
|
else:
|
||||||
|
region[:, w - r:] = True
|
||||||
|
if sy > 0:
|
||||||
|
band = yy < r
|
||||||
|
else:
|
||||||
|
band = yy >= h - r
|
||||||
|
m[region & band & corner] = False
|
||||||
|
canvas[y:y + h, x:x + w][m] = color
|
||||||
|
|
||||||
|
|
||||||
|
def paste(canvas, im, x, y):
|
||||||
|
im = im.convert("RGBA")
|
||||||
|
px = im.load()
|
||||||
|
w, h = im.size
|
||||||
|
for yy in range(h):
|
||||||
|
for xx in range(w):
|
||||||
|
r, g, b, a = px[xx, yy]
|
||||||
|
if a < 40:
|
||||||
|
continue
|
||||||
|
if 0 <= y + yy < 320 and 0 <= x + xx < 240:
|
||||||
|
canvas[y + yy, x + xx] = (r * a // 255, g * a // 255, b * a // 255)
|
||||||
|
|
||||||
|
|
||||||
|
def text_w(s, glyphs):
|
||||||
|
w = 0
|
||||||
|
for ch in s:
|
||||||
|
im, bear, adv = glyphs[ch]
|
||||||
|
w += adv
|
||||||
|
return w
|
||||||
|
|
||||||
|
|
||||||
|
def draw_text(canvas, x, y, s, glyphs):
|
||||||
|
"""y is the top of the tallest glyph's bitmap, using bear within advance."""
|
||||||
|
# Align by bitmap top: caller passes top y. Glyphs share similar height.
|
||||||
|
for ch in s:
|
||||||
|
im, bear, adv = glyphs[ch]
|
||||||
|
paste(canvas, im, x + bear, y)
|
||||||
|
x += adv
|
||||||
|
|
||||||
|
|
||||||
|
def preview(screen, pics, glyphs, back, back_xy, chev, chev_xy, tri_l, tl, tri_r, tr):
|
||||||
|
canvas = np.zeros((320, 240, 3), dtype=np.uint8)
|
||||||
|
canvas[:, :] = (0, 8, 16)
|
||||||
|
card = (32, 40, 56)
|
||||||
|
for i in range(4):
|
||||||
|
fill_round(canvas, 16, 51 + 63 * i, 207, 58, 7, card)
|
||||||
|
paste(canvas, back, back_xy[0], back_xy[1])
|
||||||
|
title = pics["Title"]
|
||||||
|
paste(canvas, title, (240 - title.size[0]) // 2, 12)
|
||||||
|
labels = ["LblVer", "LblUsb", "LblAuto", "LblRestore"]
|
||||||
|
for i, name in enumerate(labels):
|
||||||
|
im = pics[name]
|
||||||
|
y = 51 + 63 * i + (58 - im.size[1]) // 2
|
||||||
|
paste(canvas, im, 16 + 12, y)
|
||||||
|
# buttons on rows 1 and 2
|
||||||
|
for row_y in (114, 177):
|
||||||
|
paste(canvas, tri_l, tl[0], row_y + (tl[1] - 114))
|
||||||
|
paste(canvas, tri_r, tr[0], row_y + (tr[1] - 114))
|
||||||
|
# version
|
||||||
|
fill_round(canvas, 159, 51 + 18, 54, 22, 4, (0, 8, 16))
|
||||||
|
ver = "0.2.35"
|
||||||
|
tw = text_w(ver, glyphs)
|
||||||
|
gh = glyphs["0"][0].size[1]
|
||||||
|
draw_text(canvas, 159 + (54 - tw) // 2, 51 + 18 + (22 - gh) // 2, ver, glyphs)
|
||||||
|
upd = pics["UsbUpdate"]
|
||||||
|
paste(canvas, upd, 122 + (69 - upd.size[0]) // 2, 114 + (58 - upd.size[1]) // 2)
|
||||||
|
num = "15"
|
||||||
|
tw = text_w(num, glyphs)
|
||||||
|
draw_text(canvas, 122 + (69 - tw) // 2, 177 + (58 - gh) // 2, num, glyphs)
|
||||||
|
paste(canvas, chev, chev_xy[0], chev_xy[1])
|
||||||
|
PREVIEW.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
Image.fromarray(canvas).save(PREVIEW)
|
||||||
|
ref = np.array(screen.convert("RGB"))
|
||||||
|
d = np.abs(canvas.astype(int) - ref.astype(int)).sum(axis=2)
|
||||||
|
print("preview", PREVIEW, "mean", round(float(d.mean()), 2), "pct>40", round(float((d > 40).mean()), 4))
|
||||||
|
print("USB MIDI w", pics["UsbMidi"].size, "关闭", pics["Off"].size)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Loading…
Reference in New Issue