Skip to content

Commit

Permalink
Added _min_frame property
Browse files Browse the repository at this point in the history
  • Loading branch information
radarhere committed Sep 30, 2017
1 parent f61b70a commit c8b65f4
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 18 deletions.
6 changes: 4 additions & 2 deletions PIL/ImageFile.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ class ImageFile(Image.Image):
def __init__(self, fp=None, filename=None):
Image.Image.__init__(self)

self._min_frame = 0

self.tile = None
self.readonly = 1 # until we know better

Expand Down Expand Up @@ -276,11 +278,11 @@ def load_end(self):
# pass

def _seek_check(self, frame):
if (frame < 0 or
if (frame < self._min_frame or
# Only check upper limit on frames if additional seek operations
# are not required to do so
(not (hasattr(self, "_n_frames") and self._n_frames is None) and
frame >= self.n_frames)):
frame >= self.n_frames+self._min_frame)):
raise EOFError("attempt to seek outside sequence")

return self.tell() != frame
Expand Down
5 changes: 2 additions & 3 deletions PIL/PsdImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,8 @@ def _open(self):

# keep the file open
self._fp = self.fp
self.frame = 0
self.frame = 1
self._min_frame = 1

@property
def n_frames(self):
Expand All @@ -140,8 +141,6 @@ def seek(self, layer):

# seek to given layer (1..max)
try:
if layer == 0:
raise IndexError
name, mode, bbox, tile = self.layers[layer-1]
self.mode = mode
self.tile = tile
Expand Down
23 changes: 10 additions & 13 deletions Tests/test_file_psd.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,26 +34,23 @@ def test_n_frames(self):

def test_eoferror(self):
im = Image.open(test_file)
# PSD seek index starts at 1 rather than 0
n_frames = im.n_frames+1

n_frames = im.n_frames
while True:
n_frames -= 1
try:
# PSD seek index starts at 1 rather than 0
im.seek(n_frames+1)
break
except EOFError:
self.assertLess(im.tell(), n_frames)
# Test seeking past the last frame
self.assertRaises(EOFError, im.seek, n_frames)
self.assertLess(im.tell(), n_frames)

# Test that seeking to the last frame does not raise an error
im.seek(n_frames-1)

def test_seek_tell(self):
im = Image.open(test_file)

layer_number = im.tell()
self.assertEqual(layer_number, 0)
self.assertEqual(layer_number, 1)

im.seek(0)
layer_number = im.tell()
self.assertEqual(layer_number, 0)
self.assertRaises(EOFError, im.seek, 0)

im.seek(1)
layer_number = im.tell()
Expand Down

0 comments on commit c8b65f4

Please sign in to comment.