Files
pqAutomationApp/app/solid_color_scale.py
2026-07-07 18:59:44 +08:00

119 lines
3.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""UCD SolidColor 码值刻度(与 UniTAP ``SolidColorParams`` 一致065535"""
from __future__ import annotations
SOLID_COLOR_MIN = 0
SOLID_COLOR_MAX = 65535
# 官方 work_with_solid_color.py65535 刻度需 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:
"""灰阶/亮度百分比 (0100) → 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 码值 → 百分比 (0100)。"""
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 码值 → 8bitUI 色块 / HEX 显示用)。"""
return int(round(clamp_solid_color(value) / SOLID_COLOR_MAX * 255))
def byte_to_solid_color(value: int | float) -> int:
"""旧 8bit 码值 (0255) → 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`` 是否仍为旧 0255 刻度。"""
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:
"""将 0255 刻度的 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 直接接受 065535须绕过 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",
]