@@ -370,21 +370,27 @@ def add_text(
370
370
# PNG image stream (IHDR/IEND)
371
371
372
372
373
+ class _RewindState (NamedTuple ):
374
+ info : dict [str | tuple [int , int ], Any ]
375
+ tile : list [ImageFile ._Tile ]
376
+ seq_num : int | None
377
+
378
+
373
379
class PngStream (ChunkStream ):
374
- def __init__ (self , fp ) :
380
+ def __init__ (self , fp : IO [ bytes ]) -> None :
375
381
super ().__init__ (fp )
376
382
377
383
# local copies of Image attributes
378
- self .im_info = {}
379
- self .im_text = {}
384
+ self .im_info : dict [ str | tuple [ int , int ], Any ] = {}
385
+ self .im_text : dict [ str , str | iTXt ] = {}
380
386
self .im_size = (0 , 0 )
381
- self .im_mode = None
382
- self .im_tile = None
383
- self .im_palette = None
384
- self .im_custom_mimetype = None
385
- self .im_n_frames = None
386
- self ._seq_num = None
387
- self .rewind_state = None
387
+ self .im_mode = ""
388
+ self .im_tile : list [ ImageFile . _Tile ] = []
389
+ self .im_palette : tuple [ str , bytes ] | None = None
390
+ self .im_custom_mimetype : str | None = None
391
+ self .im_n_frames : int | None = None
392
+ self ._seq_num : int | None = None
393
+ self .rewind_state = _RewindState ({}, [], None )
388
394
389
395
self .text_memory = 0
390
396
@@ -398,16 +404,16 @@ def check_text_memory(self, chunklen: int) -> None:
398
404
raise ValueError (msg )
399
405
400
406
def save_rewind (self ) -> None :
401
- self .rewind_state = {
402
- "info" : self .im_info .copy (),
403
- "tile" : self .im_tile ,
404
- "seq_num" : self ._seq_num ,
405
- }
407
+ self .rewind_state = _RewindState (
408
+ self .im_info .copy (),
409
+ self .im_tile ,
410
+ self ._seq_num ,
411
+ )
406
412
407
413
def rewind (self ) -> None :
408
- self .im_info = self .rewind_state [ " info" ] .copy ()
409
- self .im_tile = self .rewind_state [ " tile" ]
410
- self ._seq_num = self .rewind_state [ " seq_num" ]
414
+ self .im_info = self .rewind_state . info .copy ()
415
+ self .im_tile = self .rewind_state . tile
416
+ self ._seq_num = self .rewind_state . seq_num
411
417
412
418
def chunk_iCCP (self , pos : int , length : int ) -> bytes :
413
419
# ICC profile
@@ -461,11 +467,11 @@ def chunk_IHDR(self, pos: int, length: int) -> bytes:
461
467
def chunk_IDAT (self , pos : int , length : int ) -> NoReturn :
462
468
# image data
463
469
if "bbox" in self .im_info :
464
- tile = [("zip" , self .im_info ["bbox" ], pos , self .im_rawmode )]
470
+ tile = [ImageFile . _Tile ("zip" , self .im_info ["bbox" ], pos , self .im_rawmode )]
465
471
else :
466
472
if self .im_n_frames is not None :
467
473
self .im_info ["default_image" ] = True
468
- tile = [("zip" , (0 , 0 ) + self .im_size , pos , self .im_rawmode )]
474
+ tile = [ImageFile . _Tile ("zip" , (0 , 0 ) + self .im_size , pos , self .im_rawmode )]
469
475
self .im_tile = tile
470
476
self .im_idat = length
471
477
msg = "image data found"
0 commit comments