|
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