85 lines
2.9 KiB
Python
85 lines
2.9 KiB
Python
# -*- coding: utf-8 -*-
|
||||
|
|
"""gen_textures.py — 桌面纹理资产转换(PNG/webP → 裸 RGBA 字节流)
|
|||
|
|
|
|||
|
|
输入(SYSTEM/system/deshab64/desktop/textures/):
|
|||
|
|
back.webp 用户启动背景(889×500,缩放铺满 boot 屏)
|
|||
|
|
startMenuLogo.png 开始按钮/开始菜单 logo(216×210,带 alpha)
|
|||
|
|
|
|||
|
|
输出(同目录):
|
|||
|
|
back.rgba 889×500×4
|
|||
|
|
startMenuLogo.rgba 216×210×4
|
|||
|
|
bootlogo.rgba 157×157×4(自 CODE/dsk/logo_data.c 的嵌入数据提取,
|
|||
|
|
即 DSK 静态开机 Logo,desktop boot 屏复用)
|
|||
|
|
|
|||
|
|
注意:不能用 PIL 直接 save(".rgba")——扩展名被 SgiImagePlugin 认领(512B 头)。
|
|||
|
|
"""
|
|||
|
|
import os
|
|||
|
|
import re
|
|||
|
|
import sys
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
from PIL import Image
|
|||
|
|
except ImportError:
|
|||
|
|
print("PIL required: pip install pillow", file=sys.stderr)
|
|||
|
|
sys.exit(1)
|
|||
|
|
|
|||
|
|
ROOT = os.path.join(os.path.dirname(__file__), "..", "..")
|
|||
|
|
TEX_DIR = os.path.join(ROOT, "SYSTEM", "system", "deshab64", "desktop", "textures")
|
|||
|
|
LOGO_C = os.path.join(ROOT, "CODE", "dsk", "logo_data.c")
|
|||
|
|
|
|||
|
|
# (源文件, 输出名, 期望宽, 期望高)
|
|||
|
|
ASSETS = [
|
|||
|
|
("back.webp", "back.rgba", 889, 500),
|
|||
|
|
("startMenuLogo.png", "startMenuLogo.rgba", 216, 210),
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
|
|||
|
|
def save_raw(im, name, w, h):
|
|||
|
|
if im.size != (w, h):
|
|||
|
|
im = im.resize((w, h), Image.LANCZOS)
|
|||
|
|
data = im.convert("RGBA").tobytes()
|
|||
|
|
out = os.path.join(TEX_DIR, name)
|
|||
|
|
with open(out, "wb") as f:
|
|||
|
|
f.write(data)
|
|||
|
|
print("%s: %dx%d %d bytes" % (name, w, h, len(data)))
|
|||
|
|
|
|||
|
|
|
|||
|
|
def extract_bootlogo():
|
|||
|
|
"""从 DSK logo_data.c 提取 g_logo_rgba 字节数组 → bootlogo.rgba"""
|
|||
|
|
src = open(LOGO_C, "r", encoding="utf-8", errors="replace").read()
|
|||
|
|
m = re.search(r"g_logo_w\s*=\s*(\d+)", src)
|
|||
|
|
n = re.search(r"g_logo_h\s*=\s*(\d+)", src)
|
|||
|
|
if not m or not n:
|
|||
|
|
print("logo_data.c: no g_logo_w/h", file=sys.stderr)
|
|||
|
|
return False
|
|||
|
|
w, h = int(m.group(1)), int(n.group(1))
|
|||
|
|
body = re.search(r"g_logo_rgba\[\]\s*=\s*\{(.*?)\};", src, re.S)
|
|||
|
|
if not body:
|
|||
|
|
print("logo_data.c: no g_logo_rgba array", file=sys.stderr)
|
|||
|
|
return False
|
|||
|
|
vals = [int(v, 0) for v in re.findall(r"0x[0-9a-fA-F]+|\b\d+\b", body.group(1))]
|
|||
|
|
expect = w * h * 4
|
|||
|
|
if len(vals) < expect:
|
|||
|
|
print("logo_data.c: %d bytes < expect %d" % (len(vals), expect), file=sys.stderr)
|
|||
|
|
return False
|
|||
|
|
out = os.path.join(TEX_DIR, "bootlogo.rgba")
|
|||
|
|
with open(out, "wb") as f:
|
|||
|
|
f.write(bytes(vals[:expect]))
|
|||
|
|
print("bootlogo.rgba: %dx%d %d bytes (from logo_data.c)" % (w, h, expect))
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
os.makedirs(TEX_DIR, exist_ok=True)
|
|||
|
|
for src_name, out_name, w, h in ASSETS:
|
|||
|
|
src = os.path.join(TEX_DIR, src_name)
|
|||
|
|
if not os.path.exists(src):
|
|||
|
|
print("skip missing:", src_name)
|
|||
|
|
continue
|
|||
|
|
save_raw(Image.open(src), out_name, w, h)
|
|||
|
|
extract_bootlogo()
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|