|
11 | 11 |
|
12 | 12 | from . import Image, ImageFile
|
13 | 13 | from ._binary import i32be as i32
|
14 |
| -from ._binary import o8 |
15 | 14 |
|
16 | 15 |
|
17 | 16 | def _accept(prefix):
|
@@ -49,55 +48,61 @@ def _add_to_previous_pixels(self, value):
|
49 | 48 | def decode(self, buffer):
|
50 | 49 | self._previously_seen_pixels = {}
|
51 | 50 | 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))) |
53 | 52 |
|
54 | 53 | data = bytearray()
|
55 | 54 | 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: |
57 | 57 | byte = self.fd.read(1)[0]
|
58 | 58 | 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:] |
60 | 60 | elif byte == 0b11111111: # QOI_OP_RGBA
|
61 | 61 | value = self.fd.read(4)
|
62 | 62 | else:
|
63 | 63 | op = byte >> 6
|
64 | 64 | if op == 0: # QOI_OP_INDEX
|
65 | 65 | 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 | + ) |
67 | 69 | 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 | + ) |
74 | 79 | )
|
75 |
| - value += (self._previous_pixel[3],) |
76 | 80 | elif op == 2: # QOI_OP_LUMA
|
77 | 81 | second_byte = self.fd.read(1)[0]
|
78 | 82 | diff_green = (byte & 0b00111111) - 32
|
79 | 83 | diff_red = ((second_byte & 0b11110000) >> 4) - 8
|
80 | 84 | diff_blue = (second_byte & 0b00001111) - 8
|
81 | 85 |
|
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 | + ) |
85 | 91 | )
|
86 |
| - value += (self._previous_pixel[3],) |
| 92 | + value += self._previous_pixel[3:] |
87 | 93 | elif op == 3: # QOI_OP_RUN
|
88 | 94 | run_length = (byte & 0b00111111) + 1
|
89 | 95 | value = self._previous_pixel
|
90 | 96 | if bands == 3:
|
91 | 97 | value = value[:3]
|
92 | 98 | data += value * run_length
|
93 | 99 | continue
|
94 |
| - value = b"".join(o8(i) for i in value) |
95 | 100 | self._add_to_previous_pixels(value)
|
96 | 101 |
|
97 | 102 | if bands == 3:
|
98 | 103 | value = value[:3]
|
99 | 104 | data += value
|
100 |
| - self.set_as_raw(bytes(data)) |
| 105 | + self.set_as_raw(data) |
101 | 106 | return -1, 0
|
102 | 107 |
|
103 | 108 |
|
|
0 commit comments