purple_bunny_zoomed.py
Created by
fizban
Created on
October 28, 2024
6.08 KB
from kandinsky import fill_rect as fr , draw_string as ds
from ion import keydown as kd
from numpy import array as ar , concatenate as ct , zeros as zs
B64 = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ "
ID = 1
class TP :
def __init__ ( self , w1 , w2 , w3 , mb , lo , ll ):
self . w1 , self . w2 , self . w3 , self . mb = w1 , w2 , w3 , mb
self . lo , self . ll = lo , ll
self . m1l = self . _cmv ( w1 )
self . m1d = self . _cmv ( 6 - w1 if mb > 1 else 7 - w1 )
if mb == 1 : self . md = self . m1d ; return
self . m2l = self . _cmv ( w2 )
self . m2d = self . _cmv ( 13 - w2 if mb > 2 else 14 - w2 )
if mb == 2 : self . md = self . m2d ; return
self . m3l = self . _cmv ( w3 )
self . m3d = self . _cmv ( 20 - w3 if mb > 3 else 21 - w3 )
self . md = min ( self . m3d , 2047 )
def _cmv ( self , w ): return ( 2 << ( w - 1 )) - 1 if w > 0 else 0
class SW :
def __init__ ( self , ws ):
self . ws = ws
self . buf = zs ( ws , dtype = ID )
self . idx = 0
self . of = 0
def add_b ( self , b ):
self . buf [ self . idx ] = b
self . of += (( self . idx + 1 ) // self . ws ) * ( self . ws )
self . idx = ( self . idx + 1 ) % self . ws
def get_b ( self , d ):
idx = ( self . idx - d - 1 ) % self . ws
return int ( self . buf [ idx ])
def get_l ( self ):
return self . idx + self . of
def pw ( gen ):
while True :
try :
a = next ( gen )
b = next ( gen )
yield a , b
except StopIteration :
break
class TI :
def __init__ ( self , data , tps , p = None ):
self . img = dc ( fb64 ( data ), tps )
self . tps = tps
p = p or self . img
self . clrs = [
r565 ( next ( p ) * 256 + next ( p ))
for _ in range ( next ( p ) + 1 )
]
dims = ( next ( self . img ) << 24 ) | ( next ( self . img ) << 16 ) | ( next ( self . img ) << 8 ) | next ( self . img )
self . w , self . h = dims >> 18 , ( dims >> 4 ) & 0x3FFF
def dr_img ( self , x , y ):
x0 = x
for b in self . img :
l , c = ( b >> 4 ) + 1 , b & 0x0F
if x + l * 4 > x0 + self . w * 4 :
x , y = x0 , y + 4
if self . clrs [ c ] != ( 255 , 255 , 255 ):
fr ( x , y , l * 4 , 4 , self . clrs [ c ])
x += l * 4
def dld ( eb , tps ):
if eb [ 0 ] & 0b11000000 == 0b10000000 or tps . mb == 1 :
d = ( eb [ 0 ] >> tps . w1 ) & (( 1 << ( 6 - tps . w1 )) - 1 )
l = eb [ 0 ] & (( 1 << tps . w1 ) - 1 )
return l + 3 , d + 1 , 1
elif ( eb [ 0 ] & 0b11000000 == 0b11000000 and eb [ 1 ] & 0b10000000 == 0 ) or tps . mb == 2 :
cv = (( eb [ 0 ] & 0b00111111 ) << ( 8 if tps . mb <= 2 else 7 )) | eb [ 1 ]
d = cv >> tps . w2
l = cv & (( 1 << tps . w2 ) - 1 )
if d <= tps . m1d : l += tps . m1l
return l + 3 , d + 1 , 2
elif ( eb [ 0 ] & 0b11000000 == 0b11000000 and eb [ 1 ] & 0b10000000 == 0b10000000 and eb [ 2 ] & 0b10000000 == 0 ) or tps . mb == 3 :
cv = (( eb [ 0 ] & 0b00111111 ) << ( 15 if tps . mb <= 3 else 14 )) | (( eb [ 1 ] & 0b01111111 ) << 8 ) | eb [ 2 ]
d = cv >> tps . w3
l = cv & (( 1 << tps . w3 ) - 1 )
if d <= tps . m1d : l += tps . m1l + tps . m2l
elif d <= tps . m2d : l += tps . m2l
return l + 3 , d + 1 , 3
elif ( eb [ 0 ] & 0b11000000 == 0b11000000 and eb [ 1 ] & 0b10000000 == 0b10000000 and eb [ 2 ] & 0b10000000 == 0b10000000 ) or tps . mb == 4 :
cv = (( eb [ 0 ] & 0b00111111 ) << 22 ) | (( eb [ 1 ] & 0b01111111 ) << 15 ) | (( eb [ 2 ] & 0b01111111 ) << 8 ) | eb [ 3 ]
d = cv >> 17
l = cv & (( 1 << 17 ) - 1 )
return l + 3 , d + 1 , 4
def dc ( data , tps ):
tl , of , tx , p = len ( data ), 0 , SW ( tps . md ), 0
while of < tl :
od = data [ of ]
if od & 0x80 == 0x00 :
if tps . lo <= od <= tps . lo + 127 - tps . ll :
tx . add_b ( od )
of += 1
else :
ll = 127 - od + 1 + tps . lo
of += 1
for i in range ( ll ):
tx . add_b ( data [ of + i ])
of += ll
else :
l , d , nb = dld ( data [ of : of + 4 ], tps )
of += nb
ep = tx . get_l () - ( d - l )
if ep <= tx . get_l ():
for i in range ( l ):
tx . add_b ( tx . get_b ( d - 1 ))
else :
ch = [ tx . get_b ( d - i - 1 ) for i in range ( d )] * ( l // d + 1 )
for i in range ( l ):
tx . add_b ( ch [ i ])
while p < tx . get_l ():
yield tx . get_b ( tx . get_l () - p - 1 )
p += 1
def r565 ( c ): return (( c >> 11 & 0x1F ) * 255 // 31 , ( c >> 5 & 0x3F ) * 255 // 63 , ( c & 0x1F ) * 255 // 31 )
def gclr ( p ):
p = fb64 ( p )
return [ r565 ( p [ 1 + i ] * 256 + p [ 2 + i ]) for i in range ( 0 , p [ 0 ] * 2 , 2 )]
def fb64 ( eb ):
dl = ( len ( eb ) * 3 ) // 4 - eb . count ( ' = ' )
da = zs ( dl , dtype = ID )
ai = 0
for i in range ( 0 , len ( eb ), 4 ):
bl = eb [ i : i + 4 ]. replace ( " = " , " A " )
bi = sum (( B64 . index ( c ) << ( 6 * ( 3 - j ))) for j , c in enumerate ( bl ))
for byte in bi . to_bytes ( 3 , " big " ):
if ai < dl :
da [ ai ] = byte
ai += 1
return da
tps = TP ( 1 , 3 , 9 , 2 , 0 , 32 )
img = TI ( ' D2Cud6aYKGsgSNQasxqSOe9czRzd3HHUnjdI77Q7vtiMegB58ANw8PDwsMAdfnAxjGVgMiEgASAB8FDwUAMUBQYDcSMSEfAA8DABAySaIQAREjQGAwGjAzQWAxEAEQNErqEgAjQFFgMxA0QmAxF08PAQAQM0JgMhAzRGuXyQB1ABwMEDNAYIGQUGCnXwEIAnICEDFBU2AsFACgknBgNg8CBwRxAhAyYTAgYDEQYkCgk3BgIBMAfAkBcLECEMAwIDFAwTxCgGR7wgJ3SwkBEAQQMkAyQTBRTBUQMBMEdqoMAxA5QVBgg3DQMBQAEXwNAhA6QWOcWoQBFgwMAhAgMGpBYKAhMx8DDAEQMEBgIMBgoGdAUGE0HwMLDEwBZ9tAYDwFJ99BQWkiBxsBEKBAN0E2QGAzGAF4CgwZgTeHQjVBYDIfAwwGZBIAF60ACBAAEOoAQ3JKVRG29hcAuRAAMZBAUHAhMnBBMUCclQMRoWDHjREA4LHhsOEbcnA0ckCQQJFCYTAQoCBicIDAAOCw4rHgseC8HZFCcCBwJHVCYMAwoDBVcKAg57oQ4bXgvDKBZgtzQ2AyYDVwgHAg4LLisuzgMGBZcJVgoDRgNXCQgCngtzrgsOAwYNCVcZFiwjFs1YRwkIA3KezgMJDRpIDQUsGQIFJs2BJwgXCAN4jr4CCUc4dwLIKAwJFwgnA2COzgJHCKcClAYDBwgJFw0HA37OAghXCGcJAgWUBQMYFw0XA3N+vgMEEgmHCCK0BQYMzFCeFAIXCHtnAgWkBdF5RwgJA2huvgMkEggJJwkGAsQFBAUEBgMIJwkIDQKuBSQGDAYtBQJUBRIKFAXIsMM4GAxvfs4DNAI5AlQGA4QmAwgXKAKgBhQJBQInAgkFJAwDepQmAxgpDMNZBgMCBAgCCCccFCN6lDYDKA0FxiADFgwTCkcSAxYCfIRGA0ihJggZdWcJDQYCdFYKOAKewQACBSl1dwYCBlRWAz0Drs6eKRg3KAImBQRzdgMYDQO+3gITAkkIScLgeZYDDQITzt7EsBJ5iQwCFwoSVrRg7p4tAxkICQUSWQgMBwknBDwGAgMvTZ5uXQoDIgwCcxcFBwgHOQ0TT2xtbo5N3wJTEhNvTY6+/f09vv7+/sAd '
, tps )
img . dr_img ( 40 , 0 )