Files
Verstack Local 841a95c56a Complete native workbench, imports, signatures, and catalog management
Save the tested release workflows, RAM media processing, program discovery, FLIRT library, and shared-object maintenance. Add Git exclusions, file attributes, and instructions for a later push using a forwarded SSH agent.
2026-09-13 16:38:57 -05:00

71 lines
3.3 KiB
Python

"""Bounded indexed DMD bitmap decoding, including keyframe-dependent delta frames.
Grammar recovered from named GOT 1.37 functions (binary SHA-256 637acf6d...):
image_alloc_and_decompress_{column,row}_whitespace, row_16, and
image_get_keyframe_and_decompress_{column,row}_delta. See docs/decoder-evidence.md.
Returns exact indices; palette/application compositing is separate.
"""
import struct
FORMATS={0:'raw-indexed8',1:'column-whitespace',3:'column-delta',7:'row-whitespace',9:'row-delta',12:'row-indexed4'}
def decode(record, keyframes):
if len(record)<13:raise ValueError('truncated DMD record')
identity,flags,width,height=struct.unpack_from('<IIHH',record)
size=width*height;mode=record[12];pos=13
if not 0<width<=4096 or not 0<height<=4096 or size>16777216:raise ValueError('DMD dimensions exceed bound')
if mode not in FORMATS:raise ValueError(f'unsupported DMD encoding {mode}')
base=None
if mode in (3,9):
base=next((keyframes[k] for k in ((identity-1)&0xffff,identity&0xffff) if k in keyframes and keyframes[k][0:2]==(width,height)),None)
if base is None:raise ValueError('DMD delta lacks matching preceding keyframe')
pixels=bytearray(base[2])
else:pixels=bytearray(size)
cursor=0
def take(n):
nonlocal pos
if n<0 or pos+n>len(record):raise ValueError('truncated DMD packet')
data=record[pos:pos+n];pos+=n;return data
def write(values):
nonlocal cursor
if cursor+len(values)>size:raise ValueError('DMD packet exceeds pixel bounds')
if mode not in (1,3):
pixels[cursor:cursor+len(values)]=values;cursor+=len(values)
else:
start=0
while start<len(values):
count=min(height-cursor%height,len(values)-start)
offset=(cursor%height)*width+cursor//height
pixels[offset:offset+count*width:width]=values[start:start+count]
cursor+=count;start+=count
if mode==0:
pixels[:]=take(size);cursor=size
elif mode==12:
packed=bytes(take((size+1)//2))
pixels[0::2]=packed.translate(bytes(value&15 for value in range(256)))
pixels[1::2]=packed[:size//2].translate(bytes(value>>4 for value in range(256)))
cursor=size
else:
while True:
token=take(1)[0]
if token==0:break
if mode in (3,9):
if token>=128:
cursor+=256-token
if cursor>size:raise ValueError('DMD delta skip exceeds bounds')
else:write(take(token))
else:
count=token>>2;kind=token&3
if not count:raise ValueError('empty DMD whitespace packet')
if kind==0:write(take(count))
elif kind in (1,2):write(bytes([0 if kind==1 else 15])*count)
else:write(bytes(take(1))*count)
if cursor!=size:raise ValueError('DMD packet did not cover complete frame')
result=bytes(pixels)
if mode in (3,9):
keyframes.pop((identity-1)&0xffff,None)
keyframes[identity&0xffff]=(width,height,result)
elif flags&4:
keyframes[identity&0xffff]=(width,height,result)
return {'pixels':result,'consumed':pos,'format':FORMATS[mode],'mode':mode,'width':width,'height':height,'record_id':identity,'flags':flags,'base_record':(identity-1)&0xffff if base else None}