mirror of
https://github.com/python-pillow/Pillow.git
synced 2026-02-04 14:35:54 +03:00
Merge db5bfe8d28 into 62aa42f9da
This commit is contained in:
commit
163452e216
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -540,3 +540,18 @@ def test_save_large_file(tmp_path: Path, pixel_format: str, mode: str) -> None:
|
|||
im = hopper(mode).resize((440, 440))
|
||||
# should not error in valgrind
|
||||
im.save(tmp_path / "img.dds", pixel_format=pixel_format)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"test_file",
|
||||
[
|
||||
"Tests/images/timeout-041dd17dfde800360a47a172269df127af138c6b.dds",
|
||||
"Tests/images/timeout-755a4d204f4208e3597ac3391edebee196462bd0.dds",
|
||||
"Tests/images/timeout-52d106579505547091ef69b58341351a37c23e31.dds",
|
||||
"Tests/images/timeout-c60a3d7314213624607bfb3e38d551a8b24a7435.dds",
|
||||
],
|
||||
)
|
||||
def test_not_enough_image_data(test_file: str) -> None:
|
||||
with Image.open(test_file) as im:
|
||||
with pytest.raises(ValueError, match="not enough image data"):
|
||||
im.load()
|
||||
|
|
|
|||
|
|
@ -489,9 +489,14 @@ class DdsRgbDecoder(ImageFile.PyDecoder):
|
|||
_pulls_fd = True
|
||||
|
||||
def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
|
||||
assert self.fd is not None
|
||||
bitcount, masks = self.args
|
||||
|
||||
data = bytearray()
|
||||
bytecount = bitcount // 8
|
||||
if not bytecount:
|
||||
self.set_as_raw(data)
|
||||
return -1, 0
|
||||
|
||||
# Some masks will be padded with zeros, e.g. R 0b11 G 0b1100
|
||||
# Calculate how many zeros each mask is padded with
|
||||
mask_offsets = []
|
||||
|
|
@ -505,11 +510,13 @@ class DdsRgbDecoder(ImageFile.PyDecoder):
|
|||
mask_offsets.append(offset)
|
||||
mask_totals.append(mask >> offset)
|
||||
|
||||
data = bytearray()
|
||||
bytecount = bitcount // 8
|
||||
assert self.fd is not None
|
||||
dest_length = self.state.xsize * self.state.ysize * len(masks)
|
||||
while len(data) < dest_length:
|
||||
value = int.from_bytes(self.fd.read(bytecount), "little")
|
||||
bytes_read = self.fd.read(bytecount)
|
||||
if len(bytes_read) < bytecount:
|
||||
break
|
||||
value = int.from_bytes(bytes_read, "little")
|
||||
for i, mask in enumerate(masks):
|
||||
masked_value = value & mask
|
||||
# Remove the zero padding, and scale it to 8 bits
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user