fix(ui): draw mixer volume badges from the rounded art swatch

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
yuquanjun 2026-10-13 16:00:17 +08:00
parent ac01d0f6b7
commit 5b2c8137eb
2 changed files with 91 additions and 28 deletions

View File

@ -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)

78
UI/mixer_knob_0902.h Normal file
View File

@ -0,0 +1,78 @@
#ifndef MIXER_KNOB_0902_H
#define MIXER_KNOB_0902_H
/* Doc/UI/调音台色块.zip 0902-31 24x23 方圆,透明角。a<128 为 0x0000。 */
#include <stdint.h>
#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