Skip to content

Commit 1d733f4

Browse files
authored
Merge pull request #7925 from radarhere/qoi
2 parents d31148b + b7d0908 commit 1d733f4

File tree

5 files changed

+32
-24
lines changed

5 files changed

+32
-24
lines changed

src/PIL/BlpImagePlugin.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ def _load(self):
341341
if self._blp_encoding in (4, 5):
342342
palette = self._read_palette()
343343
data = self._read_bgra(palette)
344-
self.set_as_raw(bytes(data))
344+
self.set_as_raw(data)
345345
else:
346346
msg = f"Unsupported BLP encoding {repr(self._blp_encoding)}"
347347
raise BLPFormatError(msg)
@@ -412,7 +412,7 @@ def _load(self):
412412
msg = f"Unknown BLP compression {repr(self._blp_compression)}"
413413
raise BLPFormatError(msg)
414414

415-
self.set_as_raw(bytes(data))
415+
self.set_as_raw(data)
416416

417417

418418
class BLPEncoder(ImageFile.PyEncoder):

src/PIL/BmpImagePlugin.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,8 @@ def decode(self, buffer):
291291
rle4 = self.args[1]
292292
data = bytearray()
293293
x = 0
294-
while len(data) < self.state.xsize * self.state.ysize:
294+
dest_length = self.state.xsize * self.state.ysize
295+
while len(data) < dest_length:
295296
pixels = self.fd.read(1)
296297
byte = self.fd.read(1)
297298
if not pixels or not byte:

src/PIL/DdsImagePlugin.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -497,15 +497,16 @@ def decode(self, buffer):
497497

498498
data = bytearray()
499499
bytecount = bitcount // 8
500-
while len(data) < self.state.xsize * self.state.ysize * len(masks):
500+
dest_length = self.state.xsize * self.state.ysize * len(masks)
501+
while len(data) < dest_length:
501502
value = int.from_bytes(self.fd.read(bytecount), "little")
502503
for i, mask in enumerate(masks):
503504
masked_value = value & mask
504505
# Remove the zero padding, and scale it to 8 bits
505506
data += o8(
506507
int(((masked_value >> mask_offsets[i]) / mask_totals[i]) * 255)
507508
)
508-
self.set_as_raw(bytes(data))
509+
self.set_as_raw(data)
509510
return -1, 0
510511

511512

src/PIL/PpmImagePlugin.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,8 @@ def decode(self, buffer: bytes) -> tuple[int, int]:
307307
out_byte_count = 4 if self.mode == "I" else 1
308308
out_max = 65535 if self.mode == "I" else 255
309309
bands = Image.getmodebands(self.mode)
310-
while len(data) < self.state.xsize * self.state.ysize * bands * out_byte_count:
310+
dest_length = self.state.xsize * self.state.ysize * bands * out_byte_count
311+
while len(data) < dest_length:
311312
pixels = self.fd.read(in_byte_count * bands)
312313
if len(pixels) < in_byte_count * bands:
313314
# eof

src/PIL/QoiImagePlugin.py

+23-18
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
from . import Image, ImageFile
1313
from ._binary import i32be as i32
14-
from ._binary import o8
1514

1615

1716
def _accept(prefix):
@@ -49,55 +48,61 @@ def _add_to_previous_pixels(self, value):
4948
def decode(self, buffer):
5049
self._previously_seen_pixels = {}
5150
self._previous_pixel = None
52-
self._add_to_previous_pixels(b"".join(o8(i) for i in (0, 0, 0, 255)))
51+
self._add_to_previous_pixels(bytearray((0, 0, 0, 255)))
5352

5453
data = bytearray()
5554
bands = Image.getmodebands(self.mode)
56-
while len(data) < self.state.xsize * self.state.ysize * bands:
55+
dest_length = self.state.xsize * self.state.ysize * bands
56+
while len(data) < dest_length:
5757
byte = self.fd.read(1)[0]
5858
if byte == 0b11111110: # QOI_OP_RGB
59-
value = self.fd.read(3) + self._previous_pixel[3:]
59+
value = bytearray(self.fd.read(3)) + self._previous_pixel[3:]
6060
elif byte == 0b11111111: # QOI_OP_RGBA
6161
value = self.fd.read(4)
6262
else:
6363
op = byte >> 6
6464
if op == 0: # QOI_OP_INDEX
6565
op_index = byte & 0b00111111
66-
value = self._previously_seen_pixels.get(op_index, (0, 0, 0, 0))
66+
value = self._previously_seen_pixels.get(
67+
op_index, bytearray((0, 0, 0, 0))
68+
)
6769
elif op == 1: # QOI_OP_DIFF
68-
value = (
69-
(self._previous_pixel[0] + ((byte & 0b00110000) >> 4) - 2)
70-
% 256,
71-
(self._previous_pixel[1] + ((byte & 0b00001100) >> 2) - 2)
72-
% 256,
73-
(self._previous_pixel[2] + (byte & 0b00000011) - 2) % 256,
70+
value = bytearray(
71+
(
72+
(self._previous_pixel[0] + ((byte & 0b00110000) >> 4) - 2)
73+
% 256,
74+
(self._previous_pixel[1] + ((byte & 0b00001100) >> 2) - 2)
75+
% 256,
76+
(self._previous_pixel[2] + (byte & 0b00000011) - 2) % 256,
77+
self._previous_pixel[3],
78+
)
7479
)
75-
value += (self._previous_pixel[3],)
7680
elif op == 2: # QOI_OP_LUMA
7781
second_byte = self.fd.read(1)[0]
7882
diff_green = (byte & 0b00111111) - 32
7983
diff_red = ((second_byte & 0b11110000) >> 4) - 8
8084
diff_blue = (second_byte & 0b00001111) - 8
8185

82-
value = tuple(
83-
(self._previous_pixel[i] + diff_green + diff) % 256
84-
for i, diff in enumerate((diff_red, 0, diff_blue))
86+
value = bytearray(
87+
tuple(
88+
(self._previous_pixel[i] + diff_green + diff) % 256
89+
for i, diff in enumerate((diff_red, 0, diff_blue))
90+
)
8591
)
86-
value += (self._previous_pixel[3],)
92+
value += self._previous_pixel[3:]
8793
elif op == 3: # QOI_OP_RUN
8894
run_length = (byte & 0b00111111) + 1
8995
value = self._previous_pixel
9096
if bands == 3:
9197
value = value[:3]
9298
data += value * run_length
9399
continue
94-
value = b"".join(o8(i) for i in value)
95100
self._add_to_previous_pixels(value)
96101

97102
if bands == 3:
98103
value = value[:3]
99104
data += value
100-
self.set_as_raw(bytes(data))
105+
self.set_as_raw(data)
101106
return -1, 0
102107

103108

0 commit comments

Comments
 (0)