- CODE/dsk/ext4.c: minimal full ext4 read/write (GPT probe, feature gate, extent depth 0/1 rw, block/inode alloc-free, dir insert, write-verify); boot selftest PASS on p2. Unsupported features panic (FS-E2x), zero fallback. - DSK fat32 write: on-demand FAT entry RMW + chunked free-cluster scan (fixes "no free clusters" on 5.3G ESP); rec_len shrink offset (+4) and chunk alignment fixes. USER.CONF write-verify ok, firstInit flip ok. - First-boot: wizard -> persist -> forced login (FS-E06 if skipped/failed) -> desktop. login.elf loaded via system/user/use fallback. - FirstInit network page: Connect now panics NET-E01 (no wlan stack); Save (config only) is the only path forward. - FirstInit/DSK fatal: ohMyLogo lotus fatal screen (NET-E01 / FS-E series). - Boot screen: Logo.png image removed, "DESHAB P01" text centered only; dcp/xj logos regenerated from TEXTURES/. - run_qemu.bat: main GPT image on SATA ide.0 (AHCI provider must see ext4).
62 lines
2.2 KiB
Python
62 lines
2.2 KiB
Python
#!/usr/bin/env python3
|
|
"""Generate RGBA8888 C array from a PNG (panic screen / login intro logo).
|
|
|
|
- Downscale logo to target width (keep aspect), RGBA8888
|
|
- Sample the 4 corners (averaged) as background color
|
|
Usage: python gen_panic_logo.py <src.png> <out.c> [target_width]
|
|
"""
|
|
import sys
|
|
from PIL import Image
|
|
|
|
SRC = r"d:/Code/DEAICUP/Deshab/ohMyLogo.png"
|
|
DST = r"d:/Code/DEAICUP/Deshab/CODE/UTSM/kernel/panic_logo_data.inc"
|
|
TARGET_W = 384
|
|
|
|
|
|
def main() -> None:
|
|
src = sys.argv[1] if len(sys.argv) > 1 else SRC
|
|
dst = sys.argv[2] if len(sys.argv) > 2 else DST
|
|
target_w = int(sys.argv[3]) if len(sys.argv) > 3 else TARGET_W
|
|
im = Image.open(src).convert("RGBA")
|
|
w0, h0 = im.size
|
|
scale = target_w / w0
|
|
w, h = target_w, max(1, round(h0 * scale))
|
|
im = im.resize((w, h), Image.LANCZOS)
|
|
px = im.load()
|
|
|
|
# background color: average of 4 corner pixels (5x5 patches)
|
|
rs = gs = bs = n = 0
|
|
for cx, cy in ((2, 2), (w - 3, 2), (2, h - 3), (w - 3, h - 3)):
|
|
for dy in range(-2, 3):
|
|
for dx in range(-2, 3):
|
|
r, g, b, _ = px[cx + dx, cy + dy]
|
|
rs += r; gs += g; bs += b; n += 1
|
|
r, g, b = rs // n, gs // n, bs // n
|
|
bg = 0xFF000000 | (r << 16) | (g << 8) | b
|
|
|
|
lines = []
|
|
lines.append("/* Auto-generated from ohMyLogo.png — panic screen logo (RGBA8888) */")
|
|
lines.append("/* DO NOT EDIT. Regenerate via: python gen_panic_logo.py */")
|
|
lines.append("")
|
|
lines.append(f"static const int g_panic_logo_w = {w};")
|
|
lines.append(f"static const int g_panic_logo_h = {h};")
|
|
lines.append(f"/* panic 界面背景色 = 图片四角平均色 RGB({r},{g},{b}) */")
|
|
lines.append(f"static const unsigned int g_panic_logo_bg = 0x{bg:08X}u;")
|
|
lines.append("static const unsigned char g_panic_logo_rgba[] = {")
|
|
for y in range(h):
|
|
row = []
|
|
base = y * w
|
|
for x in range(w):
|
|
r, g, b, a = px[x, y]
|
|
row.append(f"0x{r:02X},0x{g:02X},0x{b:02X},0x{a:02X}")
|
|
lines.append(" " + ",".join(row) + ",")
|
|
lines.append("};")
|
|
with open(dst, "w", encoding="utf-8") as f:
|
|
f.write("\n".join(lines) + "\n")
|
|
print(f"[gen_panic_logo] {w}x{h} bg=0x{bg:08X} -> {dst}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|