Skip to content

Commit 1859bc3

Browse files
committed
Added reading non-JPEG BLP1 as RGBA
1 parent 3ec9282 commit 1859bc3

File tree

1 file changed

+34
-41
lines changed

1 file changed

+34
-41
lines changed

src/PIL/BlpImagePlugin.py

Lines changed: 34 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -288,15 +288,12 @@ def _open(self):
288288
self.fp.seek(2, os.SEEK_CUR)
289289
self._size = struct.unpack("<II", self.fp.read(8))
290290

291-
if self.magic == b"BLP1":
292-
decoder = "BLP1"
293-
self.mode = "RGB"
294-
elif self.magic == b"BLP2":
295-
decoder = "BLP2"
296-
self.mode = "RGBA" if self._blp_alpha_depth else "RGB"
291+
if self.magic in (b"BLP1", b"BLP2"):
292+
decoder = self.magic.decode()
297293
else:
298294
raise BLPFormatError(f"Bad BLP magic {repr(self.magic)}")
299295

296+
self.mode = "RGBA" if self._blp_alpha_depth else "RGB"
300297
self.tile = [(decoder, (0, 0) + self.size, 0, (self.mode, 0, 1))]
301298

302299

@@ -311,19 +308,6 @@ def decode(self, buffer):
311308
raise OSError("Truncated BLP file") from e
312309
return 0, 0
313310

314-
def _safe_read(self, length):
315-
return ImageFile._safe_read(self.fd, length)
316-
317-
def _read_palette(self):
318-
ret = []
319-
for i in range(256):
320-
try:
321-
b, g, r, a = struct.unpack("<4B", self._safe_read(4))
322-
except struct.error:
323-
break
324-
ret.append((b, g, r, a))
325-
return ret
326-
327311
def _read_blp_header(self):
328312
self.fd.seek(4)
329313
(self._blp_compression,) = struct.unpack("<i", self._safe_read(4))
@@ -343,6 +327,34 @@ def _read_blp_header(self):
343327
self._blp_offsets = struct.unpack("<16I", self._safe_read(16 * 4))
344328
self._blp_lengths = struct.unpack("<16I", self._safe_read(16 * 4))
345329

330+
def _safe_read(self, length):
331+
return ImageFile._safe_read(self.fd, length)
332+
333+
def _read_palette(self):
334+
ret = []
335+
for i in range(256):
336+
try:
337+
b, g, r, a = struct.unpack("<4B", self._safe_read(4))
338+
except struct.error:
339+
break
340+
ret.append((b, g, r, a))
341+
return ret
342+
343+
def _read_bgra(self, palette):
344+
data = bytearray()
345+
_data = BytesIO(self._safe_read(self._blp_lengths[0]))
346+
while True:
347+
try:
348+
(offset,) = struct.unpack("<B", _data.read(1))
349+
except struct.error:
350+
break
351+
b, g, r, a = palette[offset]
352+
d = (r, g, b)
353+
if self._blp_alpha_depth:
354+
d += (a,)
355+
data.extend(d)
356+
return data
357+
346358

347359
class BLP1Decoder(_BLPBaseDecoder):
348360
def _load(self):
@@ -351,17 +363,8 @@ def _load(self):
351363

352364
elif self._blp_compression == 1:
353365
if self._blp_encoding in (4, 5):
354-
data = bytearray()
355366
palette = self._read_palette()
356-
_data = BytesIO(self._safe_read(self._blp_lengths[0]))
357-
while True:
358-
try:
359-
(offset,) = struct.unpack("<B", _data.read(1))
360-
except struct.error:
361-
break
362-
b, g, r, a = palette[offset]
363-
data.extend([r, g, b])
364-
367+
data = self._read_bgra(palette)
365368
self.set_as_raw(bytes(data))
366369
else:
367370
raise BLPFormatError(
@@ -392,26 +395,16 @@ class BLP2Decoder(_BLPBaseDecoder):
392395
def _load(self):
393396
palette = self._read_palette()
394397

395-
data = bytearray()
396398
self.fd.seek(self._blp_offsets[0])
397399

398400
if self._blp_compression == 1:
399401
# Uncompressed or DirectX compression
400402

401403
if self._blp_encoding == Encoding.UNCOMPRESSED:
402-
_data = BytesIO(self._safe_read(self._blp_lengths[0]))
403-
while True:
404-
try:
405-
(offset,) = struct.unpack("<B", _data.read(1))
406-
except struct.error:
407-
break
408-
b, g, r, a = palette[offset]
409-
d = (r, g, b)
410-
if self._blp_alpha_depth:
411-
d += (a,)
412-
data.extend(d)
404+
data = self._read_bgra(palette)
413405

414406
elif self._blp_encoding == Encoding.DXT:
407+
data = bytearray()
415408
if self._blp_alpha_encoding == AlphaEncoding.DXT1:
416409
linesize = (self.size[0] + 3) // 4 * 8
417410
for yb in range((self.size[1] + 3) // 4):

0 commit comments

Comments
 (0)