|
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,50 +48,55 @@ 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 | 55 | dest_length = self.state.xsize * self.state.ysize * bands |
57 | 56 | while len(data) < dest_length: |
58 | 57 | byte = self.fd.read(1)[0] |
59 | 58 | if byte == 0b11111110: # QOI_OP_RGB |
60 | | - value = self.fd.read(3) + self._previous_pixel[3:] |
| 59 | + value = bytearray(self.fd.read(3)) + self._previous_pixel[3:] |
61 | 60 | elif byte == 0b11111111: # QOI_OP_RGBA |
62 | 61 | value = self.fd.read(4) |
63 | 62 | else: |
64 | 63 | op = byte >> 6 |
65 | 64 | if op == 0: # QOI_OP_INDEX |
66 | 65 | op_index = byte & 0b00111111 |
67 | | - 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 | + ) |
68 | 69 | elif op == 1: # QOI_OP_DIFF |
69 | | - value = ( |
70 | | - (self._previous_pixel[0] + ((byte & 0b00110000) >> 4) - 2) |
71 | | - % 256, |
72 | | - (self._previous_pixel[1] + ((byte & 0b00001100) >> 2) - 2) |
73 | | - % 256, |
74 | | - (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 | + ) |
75 | 79 | ) |
76 | | - value += (self._previous_pixel[3],) |
77 | 80 | elif op == 2: # QOI_OP_LUMA |
78 | 81 | second_byte = self.fd.read(1)[0] |
79 | 82 | diff_green = (byte & 0b00111111) - 32 |
80 | 83 | diff_red = ((second_byte & 0b11110000) >> 4) - 8 |
81 | 84 | diff_blue = (second_byte & 0b00001111) - 8 |
82 | 85 |
|
83 | | - value = tuple( |
84 | | - (self._previous_pixel[i] + diff_green + diff) % 256 |
85 | | - 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 | + ) |
86 | 91 | ) |
87 | | - value += (self._previous_pixel[3],) |
| 92 | + value += self._previous_pixel[3:] |
88 | 93 | elif op == 3: # QOI_OP_RUN |
89 | 94 | run_length = (byte & 0b00111111) + 1 |
90 | 95 | value = self._previous_pixel |
91 | 96 | if bands == 3: |
92 | 97 | value = value[:3] |
93 | 98 | data += value * run_length |
94 | 99 | continue |
95 | | - value = b"".join(o8(i) for i in value) |
96 | 100 | self._add_to_previous_pixels(value) |
97 | 101 |
|
98 | 102 | if bands == 3: |
|
0 commit comments