diff --git a/docs/reference/plugins.rst b/docs/reference/plugins.rst index 243d4f353f5..a34f813c1a1 100644 --- a/docs/reference/plugins.rst +++ b/docs/reference/plugins.rst @@ -276,6 +276,11 @@ Plugin reference :undoc-members: :show-inheritance: +.. autoclass:: PIL.PsdImagePlugin._Layer() + :member-order: bysource + :members: + :show-inheritance: + :mod:`~PIL.SgiImagePlugin` module --------------------------------- diff --git a/src/PIL/PsdImagePlugin.py b/src/PIL/PsdImagePlugin.py index 201909abde6..f44bdf6d38b 100644 --- a/src/PIL/PsdImagePlugin.py +++ b/src/PIL/PsdImagePlugin.py @@ -19,7 +19,7 @@ import io from functools import cached_property -from typing import IO +from typing import IO, NamedTuple from . import Image, ImageFile, ImagePalette from ._binary import i8 @@ -43,6 +43,13 @@ } +class _Layer(NamedTuple): + name: str + mode: str + box: tuple[int, int, int, int] + tile: list[ImageFile._Tile] + + # --------------------------------------------------------------------. # read PSD images @@ -145,9 +152,7 @@ def _open(self) -> None: self._min_frame = 1 @cached_property - def layers( - self, - ) -> list[tuple[str, str, tuple[int, int, int, int], list[ImageFile._Tile]]]: + def layers(self) -> list[_Layer]: layers = [] if self._layers_position is not None: if isinstance(self._fp, DeferredError): @@ -178,9 +183,9 @@ def seek(self, layer: int) -> None: if layer > len(self.layers): msg = "no more images in PSD file" raise EOFError(msg) - _, mode, _, tile = self.layers[layer - 1] - self._mode = mode - self.tile = tile + current_layer = self.layers[layer - 1] + self._mode = current_layer.mode + self.tile = current_layer.tile self.frame = layer self.fp = self._fp @@ -189,9 +194,7 @@ def tell(self) -> int: return self.frame -def _layerinfo( - fp: IO[bytes], ct_bytes: int -) -> list[tuple[str, str, tuple[int, int, int, int], list[ImageFile._Tile]]]: +def _layerinfo(fp: IO[bytes], ct_bytes: int) -> list[_Layer]: # read layerinfo block layers = [] @@ -277,7 +280,7 @@ def read(size: int) -> bytes: t = _maketile(fp, m, bbox, 1) if t: tile.extend(t) - layerinfo.append((name, mode, bbox, tile)) + layerinfo.append(_Layer(name, mode, bbox, tile)) return layerinfo @@ -303,7 +306,7 @@ def _maketile( if mode == "CMYK": layer += ";I" tiles.append(ImageFile._Tile("raw", bbox, offset, layer)) - offset = offset + xsize * ysize + offset += xsize * ysize elif compression == 1: # @@ -317,7 +320,7 @@ def _maketile( layer += ";I" tiles.append(ImageFile._Tile("packbits", bbox, offset, layer)) for y in range(ysize): - offset = offset + i16(bytecount, i) + offset += i16(bytecount, i) i += 2 file.seek(offset)