根据新版本调整set_pattern:0~65535
This commit is contained in:
118
app/solid_color_scale.py
Normal file
118
app/solid_color_scale.py
Normal file
@@ -0,0 +1,118 @@
|
||||
"""UCD SolidColor 码值刻度(与 UniTAP ``SolidColorParams`` 一致,0–65535)。"""
|
||||
from __future__ import annotations
|
||||
|
||||
SOLID_COLOR_MIN = 0
|
||||
SOLID_COLOR_MAX = 65535
|
||||
# 官方 work_with_solid_color.py:65535 刻度需 bpc>=10
|
||||
SOLID_COLOR_MIN_BPC = 10
|
||||
|
||||
# Limited Range 在 SolidColor 刻度下的端点(等价于 8bit 的 16 / 235)
|
||||
_LIMITED_8BIT_BLACK = 16
|
||||
_LIMITED_8BIT_WHITE = 235
|
||||
LIMITED_SOLID_COLOR_BLACK = round(_LIMITED_8BIT_BLACK / 255 * SOLID_COLOR_MAX)
|
||||
LIMITED_SOLID_COLOR_WHITE = round(_LIMITED_8BIT_WHITE / 255 * SOLID_COLOR_MAX)
|
||||
|
||||
|
||||
def clamp_solid_color(value: int | float) -> int:
|
||||
"""将码值限制在 SolidColor 合法范围内。"""
|
||||
return max(SOLID_COLOR_MIN, min(SOLID_COLOR_MAX, int(round(value))))
|
||||
|
||||
|
||||
def pct_to_solid_color(pct: float) -> int:
|
||||
"""灰阶/亮度百分比 (0–100) → SolidColor 码值。"""
|
||||
pct = max(0.0, min(100.0, float(pct)))
|
||||
return int(round(pct / 100.0 * SOLID_COLOR_MAX))
|
||||
|
||||
|
||||
def solid_color_to_pct(value: int | float) -> float:
|
||||
"""SolidColor 码值 → 百分比 (0–100)。"""
|
||||
if SOLID_COLOR_MAX <= 0:
|
||||
return 0.0
|
||||
return clamp_solid_color(value) / SOLID_COLOR_MAX * 100.0
|
||||
|
||||
|
||||
def solid_color_to_byte(value: int | float) -> int:
|
||||
"""SolidColor 码值 → 8bit(UI 色块 / HEX 显示用)。"""
|
||||
return int(round(clamp_solid_color(value) / SOLID_COLOR_MAX * 255))
|
||||
|
||||
|
||||
def byte_to_solid_color(value: int | float) -> int:
|
||||
"""旧 8bit 码值 (0–255) → SolidColor 刻度。"""
|
||||
byte = max(0, min(255, int(round(value))))
|
||||
return int(round(byte / 255.0 * SOLID_COLOR_MAX))
|
||||
|
||||
|
||||
def solid_color_rgb(r: int, g: int, b: int) -> list[int]:
|
||||
"""将旧 8bit RGB 三元组转为 SolidColor 刻度。"""
|
||||
return [byte_to_solid_color(r), byte_to_solid_color(g), byte_to_solid_color(b)]
|
||||
|
||||
|
||||
def is_legacy_8bit_pattern_params(params: list) -> bool:
|
||||
"""判断 ``pattern_params`` 是否仍为旧 0–255 刻度。"""
|
||||
if not params:
|
||||
return False
|
||||
max_val = 0
|
||||
for row in params:
|
||||
if not row:
|
||||
continue
|
||||
for channel in row[:3]:
|
||||
try:
|
||||
max_val = max(max_val, int(channel))
|
||||
except (TypeError, ValueError):
|
||||
pass
|
||||
return max_val <= 255
|
||||
|
||||
|
||||
def migrate_pattern_params(params: list) -> list:
|
||||
"""将 0–255 刻度的 pattern 参数迁移到 SolidColor 刻度。"""
|
||||
if not is_legacy_8bit_pattern_params(params):
|
||||
return params
|
||||
migrated: list = []
|
||||
for row in params:
|
||||
head = [byte_to_solid_color(v) for v in row[:3]]
|
||||
migrated.append(head + list(row[3:]))
|
||||
return migrated
|
||||
|
||||
|
||||
def ensure_solid_color_pattern(pattern: dict) -> dict:
|
||||
"""确保 pattern 字典中的 ``pattern_params`` 使用 SolidColor 刻度。"""
|
||||
params = pattern.get("pattern_params")
|
||||
if params:
|
||||
pattern["pattern_params"] = migrate_pattern_params(params)
|
||||
return pattern
|
||||
|
||||
|
||||
def pack_solid_color_hw_registers(
|
||||
rgb: tuple[int, int, int] | list[int],
|
||||
) -> tuple[int, int]:
|
||||
"""将 65535 刻度 RGB 打包为 PG 硬件寄存器值(``shifter=0``,新版 UCD API)。
|
||||
|
||||
旧版 UniTAP SDK 在 ``set_pattern_params`` 内还会按 ``16-bpc`` 左移;
|
||||
65535 刻度下左移会导致 32 位溢出(30%/50%/80% 灰阶发暗)。
|
||||
新版 UCD 直接接受 0–65535,须绕过 SDK 移位。
|
||||
"""
|
||||
r = clamp_solid_color(rgb[0])
|
||||
g = clamp_solid_color(rgb[1])
|
||||
b = clamp_solid_color(rgb[2])
|
||||
param0 = ((r << 16) | g) & 0xFFFFFFFF
|
||||
param1 = b & 0xFFFFFFFF
|
||||
return param0, param1
|
||||
|
||||
|
||||
__all__ = [
|
||||
"SOLID_COLOR_MIN",
|
||||
"SOLID_COLOR_MAX",
|
||||
"SOLID_COLOR_MIN_BPC",
|
||||
"LIMITED_SOLID_COLOR_BLACK",
|
||||
"LIMITED_SOLID_COLOR_WHITE",
|
||||
"clamp_solid_color",
|
||||
"pct_to_solid_color",
|
||||
"solid_color_to_pct",
|
||||
"solid_color_to_byte",
|
||||
"byte_to_solid_color",
|
||||
"solid_color_rgb",
|
||||
"is_legacy_8bit_pattern_params",
|
||||
"migrate_pattern_params",
|
||||
"ensure_solid_color_pattern",
|
||||
"pack_solid_color_hw_registers",
|
||||
]
|
||||
Reference in New Issue
Block a user