mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-02-11 17:10:58 +03:00
Allow upgrading LONG to LONG8
This commit is contained in:
parent
618339e2d2
commit
a8381c619d
|
@ -746,7 +746,7 @@ class TestFileTiff:
|
|||
assert reread.n_frames == 3
|
||||
|
||||
def test_fixoffsets(self) -> None:
|
||||
b = BytesIO(b"II\x2a\x00\x00\x00\x00\x00")
|
||||
b = BytesIO(b"II\x2A\x00\x00\x00\x00\x00")
|
||||
with TiffImagePlugin.AppendingTiffWriter(b) as a:
|
||||
b.seek(0)
|
||||
a.fixOffsets(1, isShort=True)
|
||||
|
@ -759,6 +759,23 @@ class TestFileTiff:
|
|||
with pytest.raises(RuntimeError):
|
||||
a.fixOffsets(1)
|
||||
|
||||
b = BytesIO(b"II\x2A\x00\x00\x00\x00\x00")
|
||||
with TiffImagePlugin.AppendingTiffWriter(b) as a:
|
||||
a.offsetOfNewPage = 2**16
|
||||
|
||||
b.seek(0)
|
||||
a.fixOffsets(1, isShort=True)
|
||||
|
||||
b = BytesIO(b"II\x2B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")
|
||||
with TiffImagePlugin.AppendingTiffWriter(b) as a:
|
||||
a.offsetOfNewPage = 2**32
|
||||
|
||||
b.seek(0)
|
||||
a.fixOffsets(1, isShort=True)
|
||||
|
||||
b.seek(0)
|
||||
a.fixOffsets(1, isLong=True)
|
||||
|
||||
def test_appending_tiff_writer_writelong(self) -> None:
|
||||
data = b"II\x2A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
b = BytesIO(data)
|
||||
|
@ -766,6 +783,13 @@ class TestFileTiff:
|
|||
a.writeLong(2**32 - 1)
|
||||
assert b.getvalue() == data + b"\xff\xff\xff\xff"
|
||||
|
||||
def test_appending_tiff_writer_rewritelastshorttolong(self) -> None:
|
||||
data = b"II\x2A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
b = BytesIO(data)
|
||||
with TiffImagePlugin.AppendingTiffWriter(b) as a:
|
||||
a.rewriteLastShortToLong(2**32 - 1)
|
||||
assert b.getvalue() == data[:-2] + b"\xff\xff\xff\xff"
|
||||
|
||||
def test_saving_icc_profile(self, tmp_path: Path) -> None:
|
||||
# Tests saving TIFF with icc_profile set.
|
||||
# At the time of writing this will only work for non-compressed tiffs
|
||||
|
|
|
@ -2175,17 +2175,19 @@ class AppendingTiffWriter(io.BytesIO):
|
|||
msg = f"wrote only {bytes_written} bytes but wanted {expected}"
|
||||
raise RuntimeError(msg)
|
||||
|
||||
def rewriteLastShortToLong(self, value: int) -> None:
|
||||
self.f.seek(-2, os.SEEK_CUR)
|
||||
bytes_written = self.f.write(struct.pack(self.longFmt, value))
|
||||
self._verify_bytes_written(bytes_written, 4)
|
||||
|
||||
def _rewriteLast(self, value: int, field_size: int) -> None:
|
||||
def _rewriteLast(
|
||||
self, value: int, field_size: int, new_field_size: int = 0
|
||||
) -> None:
|
||||
self.f.seek(-field_size, os.SEEK_CUR)
|
||||
if not new_field_size:
|
||||
new_field_size = field_size
|
||||
bytes_written = self.f.write(
|
||||
struct.pack(self.endian + self._fmt(field_size), value)
|
||||
struct.pack(self.endian + self._fmt(new_field_size), value)
|
||||
)
|
||||
self._verify_bytes_written(bytes_written, field_size)
|
||||
self._verify_bytes_written(bytes_written, new_field_size)
|
||||
|
||||
def rewriteLastShortToLong(self, value: int) -> None:
|
||||
self._rewriteLast(value, 2, 4)
|
||||
|
||||
def rewriteLastShort(self, value: int) -> None:
|
||||
return self._rewriteLast(value, 2)
|
||||
|
@ -2245,18 +2247,27 @@ class AppendingTiffWriter(io.BytesIO):
|
|||
for i in range(count):
|
||||
offset = self._read(field_size)
|
||||
offset += self.offsetOfNewPage
|
||||
if field_size == 2 and offset >= 65536:
|
||||
# offset is now too large - we must convert shorts to longs
|
||||
|
||||
new_field_size = 0
|
||||
if self._bigtiff and field_size in (2, 4) and offset >= 2**32:
|
||||
# offset is now too large - we must convert long to long8
|
||||
new_field_size = 8
|
||||
elif field_size == 2 and offset >= 2**16:
|
||||
# offset is now too large - we must convert short to long
|
||||
new_field_size = 4
|
||||
if new_field_size:
|
||||
if count != 1:
|
||||
msg = "not implemented"
|
||||
raise RuntimeError(msg) # XXX TODO
|
||||
|
||||
# simple case - the offset is just one and therefore it is
|
||||
# local (not referenced with another offset)
|
||||
self.rewriteLastShortToLong(offset)
|
||||
self.f.seek(-10, os.SEEK_CUR)
|
||||
self.writeShort(TiffTags.LONG) # rewrite the type to LONG
|
||||
self.f.seek(8, os.SEEK_CUR)
|
||||
self._rewriteLast(offset, field_size, new_field_size)
|
||||
# Move back past the new offset, past 'count', and before 'field_type'
|
||||
rewind = -new_field_size - 4 - 2
|
||||
self.f.seek(rewind, os.SEEK_CUR)
|
||||
self.writeShort(new_field_size) # rewrite the type
|
||||
self.f.seek(2 - rewind, os.SEEK_CUR)
|
||||
else:
|
||||
self._rewriteLast(offset, field_size)
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user