Skip to content

Commit 5bcc393

Browse files
authored
Merge pull request #26 from sketchfab/feature/updates-plugin-orgs-s24-r25_D3D-6027
Updates for S24 and R25 and adds Orgs support
2 parents d06ef20 + 17de642 commit 5bcc393

File tree

91 files changed

+3267
-2247
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+3267
-2247
lines changed

dependencies/WIN/PIL/BlpImagePlugin.py

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -286,33 +286,36 @@ def decode(self, buffer):
286286
raise OSError("Truncated Blp file") from e
287287
return 0, 0
288288

289+
def _safe_read(self, length):
290+
return ImageFile._safe_read(self.fd, length)
291+
289292
def _read_palette(self):
290293
ret = []
291294
for i in range(256):
292295
try:
293-
b, g, r, a = struct.unpack("<4B", self.fd.read(4))
296+
b, g, r, a = struct.unpack("<4B", self._safe_read(4))
294297
except struct.error:
295298
break
296299
ret.append((b, g, r, a))
297300
return ret
298301

299302
def _read_blp_header(self):
300-
(self._blp_compression,) = struct.unpack("<i", self.fd.read(4))
303+
(self._blp_compression,) = struct.unpack("<i", self._safe_read(4))
301304

302-
(self._blp_encoding,) = struct.unpack("<b", self.fd.read(1))
303-
(self._blp_alpha_depth,) = struct.unpack("<b", self.fd.read(1))
304-
(self._blp_alpha_encoding,) = struct.unpack("<b", self.fd.read(1))
305-
(self._blp_mips,) = struct.unpack("<b", self.fd.read(1))
305+
(self._blp_encoding,) = struct.unpack("<b", self._safe_read(1))
306+
(self._blp_alpha_depth,) = struct.unpack("<b", self._safe_read(1))
307+
(self._blp_alpha_encoding,) = struct.unpack("<b", self._safe_read(1))
308+
(self._blp_mips,) = struct.unpack("<b", self._safe_read(1))
306309

307-
self.size = struct.unpack("<II", self.fd.read(8))
310+
self.size = struct.unpack("<II", self._safe_read(8))
308311

309312
if self.magic == b"BLP1":
310313
# Only present for BLP1
311-
(self._blp_encoding,) = struct.unpack("<i", self.fd.read(4))
312-
(self._blp_subtype,) = struct.unpack("<i", self.fd.read(4))
314+
(self._blp_encoding,) = struct.unpack("<i", self._safe_read(4))
315+
(self._blp_subtype,) = struct.unpack("<i", self._safe_read(4))
313316

314-
self._blp_offsets = struct.unpack("<16I", self.fd.read(16 * 4))
315-
self._blp_lengths = struct.unpack("<16I", self.fd.read(16 * 4))
317+
self._blp_offsets = struct.unpack("<16I", self._safe_read(16 * 4))
318+
self._blp_lengths = struct.unpack("<16I", self._safe_read(16 * 4))
316319

317320

318321
class BLP1Decoder(_BLPBaseDecoder):
@@ -324,7 +327,7 @@ def _load(self):
324327
if self._blp_encoding in (4, 5):
325328
data = bytearray()
326329
palette = self._read_palette()
327-
_data = BytesIO(self.fd.read(self._blp_lengths[0]))
330+
_data = BytesIO(self._safe_read(self._blp_lengths[0]))
328331
while True:
329332
try:
330333
(offset,) = struct.unpack("<B", _data.read(1))
@@ -346,13 +349,14 @@ def _load(self):
346349
def _decode_jpeg_stream(self):
347350
from PIL.JpegImagePlugin import JpegImageFile
348351

349-
(jpeg_header_size,) = struct.unpack("<I", self.fd.read(4))
350-
jpeg_header = self.fd.read(jpeg_header_size)
351-
self.fd.read(self._blp_offsets[0] - self.fd.tell()) # What IS this?
352-
data = self.fd.read(self._blp_lengths[0])
352+
(jpeg_header_size,) = struct.unpack("<I", self._safe_read(4))
353+
jpeg_header = self._safe_read(jpeg_header_size)
354+
self._safe_read(self._blp_offsets[0] - self.fd.tell()) # What IS this?
355+
data = self._safe_read(self._blp_lengths[0])
353356
data = jpeg_header + data
354357
data = BytesIO(data)
355358
image = JpegImageFile(data)
359+
Image._decompression_bomb_check(image.size)
356360
self.tile = image.tile # :/
357361
self.fd = image.fp
358362
self.mode = image.mode
@@ -369,7 +373,7 @@ def _load(self):
369373
# Uncompressed or DirectX compression
370374

371375
if self._blp_encoding == BLP_ENCODING_UNCOMPRESSED:
372-
_data = BytesIO(self.fd.read(self._blp_lengths[0]))
376+
_data = BytesIO(self._safe_read(self._blp_lengths[0]))
373377
while True:
374378
try:
375379
(offset,) = struct.unpack("<B", _data.read(1))
@@ -383,20 +387,20 @@ def _load(self):
383387
linesize = (self.size[0] + 3) // 4 * 8
384388
for yb in range((self.size[1] + 3) // 4):
385389
for d in decode_dxt1(
386-
self.fd.read(linesize), alpha=bool(self._blp_alpha_depth)
390+
self._safe_read(linesize), alpha=bool(self._blp_alpha_depth)
387391
):
388392
data += d
389393

390394
elif self._blp_alpha_encoding == BLP_ALPHA_ENCODING_DXT3:
391395
linesize = (self.size[0] + 3) // 4 * 16
392396
for yb in range((self.size[1] + 3) // 4):
393-
for d in decode_dxt3(self.fd.read(linesize)):
397+
for d in decode_dxt3(self._safe_read(linesize)):
394398
data += d
395399

396400
elif self._blp_alpha_encoding == BLP_ALPHA_ENCODING_DXT5:
397401
linesize = (self.size[0] + 3) // 4 * 16
398402
for yb in range((self.size[1] + 3) // 4):
399-
for d in decode_dxt5(self.fd.read(linesize)):
403+
for d in decode_dxt5(self._safe_read(linesize)):
400404
data += d
401405
else:
402406
raise BLPFormatError(
@@ -413,9 +417,11 @@ def _load(self):
413417
self.set_as_raw(bytes(data))
414418

415419

416-
Image.register_open(
417-
BlpImageFile.format, BlpImageFile, lambda p: p[:4] in (b"BLP1", b"BLP2")
418-
)
420+
def _accept(prefix):
421+
return prefix[:4] in (b"BLP1", b"BLP2")
422+
423+
424+
Image.register_open(BlpImageFile.format, BlpImageFile, _accept)
419425
Image.register_extension(BlpImageFile.format, ".blp")
420426

421427
Image.register_decoder("BLP1", BLP1Decoder)

dependencies/WIN/PIL/BmpImagePlugin.py

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525

2626

2727
from . import Image, ImageFile, ImagePalette
28-
from ._binary import i8
2928
from ._binary import i16le as i16
3029
from ._binary import i32le as i32
3130
from ._binary import o8
@@ -52,14 +51,14 @@ def _accept(prefix):
5251

5352

5453
def _dib_accept(prefix):
55-
return i32(prefix[:4]) in [12, 40, 64, 108, 124]
54+
return i32(prefix) in [12, 40, 64, 108, 124]
5655

5756

5857
# =============================================================================
5958
# Image plugin for the Windows BMP format.
6059
# =============================================================================
6160
class BmpImageFile(ImageFile.ImageFile):
62-
""" Image plugin for the Windows Bitmap format (BMP) """
61+
"""Image plugin for the Windows Bitmap format (BMP)"""
6362

6463
# ------------------------------------------------------------- Description
6564
format_description = "Windows Bitmap"
@@ -71,7 +70,7 @@ class BmpImageFile(ImageFile.ImageFile):
7170
vars()[k] = v
7271

7372
def _bitmap(self, header=0, offset=0):
74-
""" Read relevant info about the BMP """
73+
"""Read relevant info about the BMP"""
7574
read, seek = self.fp.read, self.fp.seek
7675
if header:
7776
seek(header)
@@ -87,44 +86,42 @@ def _bitmap(self, header=0, offset=0):
8786
# -------------------------------------------------- IBM OS/2 Bitmap v1
8887
# ----- This format has different offsets because of width/height types
8988
if file_info["header_size"] == 12:
90-
file_info["width"] = i16(header_data[0:2])
91-
file_info["height"] = i16(header_data[2:4])
92-
file_info["planes"] = i16(header_data[4:6])
93-
file_info["bits"] = i16(header_data[6:8])
89+
file_info["width"] = i16(header_data, 0)
90+
file_info["height"] = i16(header_data, 2)
91+
file_info["planes"] = i16(header_data, 4)
92+
file_info["bits"] = i16(header_data, 6)
9493
file_info["compression"] = self.RAW
9594
file_info["palette_padding"] = 3
9695

9796
# --------------------------------------------- Windows Bitmap v2 to v5
9897
# v3, OS/2 v2, v4, v5
9998
elif file_info["header_size"] in (40, 64, 108, 124):
100-
file_info["y_flip"] = i8(header_data[7]) == 0xFF
99+
file_info["y_flip"] = header_data[7] == 0xFF
101100
file_info["direction"] = 1 if file_info["y_flip"] else -1
102-
file_info["width"] = i32(header_data[0:4])
101+
file_info["width"] = i32(header_data, 0)
103102
file_info["height"] = (
104-
i32(header_data[4:8])
103+
i32(header_data, 4)
105104
if not file_info["y_flip"]
106-
else 2 ** 32 - i32(header_data[4:8])
105+
else 2 ** 32 - i32(header_data, 4)
107106
)
108-
file_info["planes"] = i16(header_data[8:10])
109-
file_info["bits"] = i16(header_data[10:12])
110-
file_info["compression"] = i32(header_data[12:16])
107+
file_info["planes"] = i16(header_data, 8)
108+
file_info["bits"] = i16(header_data, 10)
109+
file_info["compression"] = i32(header_data, 12)
111110
# byte size of pixel data
112-
file_info["data_size"] = i32(header_data[16:20])
111+
file_info["data_size"] = i32(header_data, 16)
113112
file_info["pixels_per_meter"] = (
114-
i32(header_data[20:24]),
115-
i32(header_data[24:28]),
113+
i32(header_data, 20),
114+
i32(header_data, 24),
116115
)
117-
file_info["colors"] = i32(header_data[28:32])
116+
file_info["colors"] = i32(header_data, 28)
118117
file_info["palette_padding"] = 4
119-
self.info["dpi"] = tuple(
120-
int(x / 39.3701 + 0.5) for x in file_info["pixels_per_meter"]
121-
)
118+
self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"])
122119
if file_info["compression"] == self.BITFIELDS:
123120
if len(header_data) >= 52:
124121
for idx, mask in enumerate(
125122
["r_mask", "g_mask", "b_mask", "a_mask"]
126123
):
127-
file_info[mask] = i32(header_data[36 + idx * 4 : 40 + idx * 4])
124+
file_info[mask] = i32(header_data, 36 + idx * 4)
128125
else:
129126
# 40 byte headers only have the three components in the
130127
# bitfields masks, ref:
@@ -260,14 +257,14 @@ def _bitmap(self, header=0, offset=0):
260257
]
261258

262259
def _open(self):
263-
""" Open file, check magic number and read header """
260+
"""Open file, check magic number and read header"""
264261
# read 14 bytes: magic number, filesize, reserved, header final offset
265262
head_data = self.fp.read(14)
266263
# choke if the file does not have the required magic bytes
267264
if not _accept(head_data):
268265
raise SyntaxError("Not a BMP file")
269266
# read the start position of the BMP image data (u32)
270-
offset = i32(head_data[10:14])
267+
offset = i32(head_data, 10)
271268
# load bitmap information (offset=raster info)
272269
self._bitmap(offset=offset)
273270

dependencies/WIN/PIL/CurImagePlugin.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
# See the README file for information on usage and redistribution.
1717
#
1818
from . import BmpImagePlugin, Image
19-
from ._binary import i8
2019
from ._binary import i16le as i16
2120
from ._binary import i32le as i32
2221

@@ -48,17 +47,17 @@ def _open(self):
4847

4948
# pick the largest cursor in the file
5049
m = b""
51-
for i in range(i16(s[4:])):
50+
for i in range(i16(s, 4)):
5251
s = self.fp.read(16)
5352
if not m:
5453
m = s
55-
elif i8(s[0]) > i8(m[0]) and i8(s[1]) > i8(m[1]):
54+
elif s[0] > m[0] and s[1] > m[1]:
5655
m = s
5756
if not m:
5857
raise TypeError("No cursors were found")
5958

6059
# load as bitmap
61-
self._bitmap(i32(m[12:]) + offset)
60+
self._bitmap(i32(m, 12) + offset)
6261

6362
# patch up the bitmap height
6463
self._size = self.size[0], self.size[1] // 2

0 commit comments

Comments
 (0)