From 5b2c8137ebffcd757a5dc1a128eac70d1ca59a33 Mon Sep 17 00:00:00 2001 From: yuquanjun Date: Tue, 13 Oct 2026 16:00:17 +0800 Subject: [PATCH] fix(ui): draw mixer volume badges from the rounded art swatch Co-authored-by: Cursor --- UI/UI_Mixer.c | 41 ++++++++--------------- UI/mixer_knob_0902.h | 78 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 28 deletions(-) create mode 100644 UI/mixer_knob_0902.h diff --git a/UI/UI_Mixer.c b/UI/UI_Mixer.c index 28005cd..fc54dec 100644 --- a/UI/UI_Mixer.c +++ b/UI/UI_Mixer.c @@ -1,4 +1,5 @@ #include "includes.h" +#include "mixer_knob_0902.h" extern const Touch_AreaTypeDef *pCurrentTouch_Area; static int8_t s_mixer_focus = -1; static int8_t s_mixer_grab = -1; /* 按下锁定的推子,松手前不换轨 */ @@ -54,39 +55,22 @@ void DrawAllFaders(void) drv_nvm_save_to_flash(); } -/* 0902-06:圆钮定位半径 = 色条半宽;填充略大以盖住柱端抗锯齿白边(夹紧不画出柱外) */ -#define MIXER_KNOB_R 15 -#define MIXER_KNOB_FILL_R 16 -#define MIXER_TRACK_HALF_W 15 +/* 美工 0902-31 方圆色块 24x23;透明角贴在色条上,数字另画 */ +#define MIXER_KNOB_W MIXER_KNOB_ART_W +#define MIXER_KNOB_H MIXER_KNOB_ART_H -/* 与柱端半圆同形的实心圆钮:顶/底档位与色条圆角完美贴合,无虚线白边 */ static void DrawMixerKnob(uint16_t cx, uint16_t cy) { - int16_t dy; - int32_t r2 = (int32_t)MIXER_KNOB_FILL_R * (int32_t)MIXER_KNOB_FILL_R; - for (dy = -(int16_t)MIXER_KNOB_R; dy <= (int16_t)MIXER_KNOB_R; dy++) - { - int32_t xx = r2 - (int32_t)dy * (int32_t)dy; - int16_t dx = 0; - int16_t half; - if (xx < 0) - continue; - while ((int32_t)(dx + 1) * (dx + 1) <= xx) - dx++; - half = dx; - if (half > (int16_t)MIXER_TRACK_HALF_W) - half = (int16_t)MIXER_TRACK_HALF_W; - LCD_FillByColor((uint16_t)(cx - half), (uint16_t)(cy + dy), - (uint16_t)(cx + half + 1), (uint16_t)(cy + dy + 1), - COLOR_GRAD_MID); - } + uint16_t x = (uint16_t)(cx - MIXER_KNOB_W / 2); + uint16_t y = (uint16_t)(cy - MIXER_KNOB_H / 2); + LCD_WR_PIC_Trans(x, y, MIXER_KNOB_W, MIXER_KNOB_H, gImage_MixerKnob_24x23, BLACK); } static void DrawFaderSlider(Fader_t *f, uint16_t slider_y) { uint16_t cx = f->x + f->w / 2; uint16_t ly = f->y + f->h + 8; - uint16_t cy = (uint16_t)(slider_y + MIXER_KNOB_R); + uint16_t cy = (uint16_t)(slider_y + MIXER_KNOB_H / 2); char buf[8]; DrawMixerKnob(cx, cy); sprintf(buf, "%d", f->val); @@ -175,14 +159,15 @@ void UpdateFaderByTouch(int idx, uint16_t y) } // ============================================================ -// 滑块顶边 Y:val0/10 时圆心落在色条底/顶半圆中心,两端对称贴合 +// 滑块顶边 Y:0/10 档方圆贴色条底/顶,不超出柱身 // ============================================================ static uint16_t CalcSliderY(Fader_t *f) { - uint16_t top_cy = (uint16_t)(f->y + MIXER_KNOB_R); - uint16_t bot_cy = (uint16_t)(f->y + f->h - 1 - MIXER_KNOB_R); + uint16_t half = (uint16_t)(MIXER_KNOB_H / 2); + uint16_t top_cy = (uint16_t)(f->y + half); + uint16_t bot_cy = (uint16_t)(f->y + f->h - (MIXER_KNOB_H - half)); uint16_t cy = (uint16_t)(bot_cy - ((uint32_t)(bot_cy - top_cy) * f->val) / 10); - return (uint16_t)(cy - MIXER_KNOB_R); + return (uint16_t)(cy - half); } int CheckTouchFader(uint16_t x, uint16_t y) diff --git a/UI/mixer_knob_0902.h b/UI/mixer_knob_0902.h new file mode 100644 index 0000000..53602de --- /dev/null +++ b/UI/mixer_knob_0902.h @@ -0,0 +1,78 @@ +#ifndef MIXER_KNOB_0902_H +#define MIXER_KNOB_0902_H +/* Doc/UI/调音台色块.zip 0902-31 24x23 方圆,透明角。a<128 为 0x0000。 */ +#include +#define MIXER_KNOB_ART_W 24 +#define MIXER_KNOB_ART_H 23 +static const uint8_t gImage_MixerKnob_24x23[1104] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00,0x00,0x00, + 0x00,0x00,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x00,0x00,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00, + 0x00,0x00,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A,0x02,0x7A, + 0x02,0x7A,0x02,0x7A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; +#endif