Skip to content

Commit bb026e8

Browse files
refactor(texture): texture loading accelerated even more again
1 parent 200c8cd commit bb026e8

File tree

3 files changed

+26
-21
lines changed

3 files changed

+26
-21
lines changed

xcoder/bytestream.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,45 @@
11
import io
2+
import struct
23
from typing import Literal
34

45

5-
class Reader(io.BytesIO):
6+
class Reader:
67
def __init__(
78
self,
89
initial_buffer: bytes = b"",
910
endian: Literal["little", "big"] = "little",
1011
):
11-
super().__init__(initial_buffer)
12+
self._internal_reader = io.BytesIO(initial_buffer)
13+
1214
self.endian: Literal["little", "big"] = endian
15+
self.endian_sign: Literal["<", ">"] = "<" if endian == "little" else ">"
16+
17+
def seek(self, position: int) -> None:
18+
self._internal_reader.seek(position)
1319

14-
def read_integer(self, length: int, signed=False) -> int:
15-
return int.from_bytes(self.read(length), self.endian, signed=signed)
20+
def tell(self) -> int:
21+
return self._internal_reader.tell()
22+
23+
def read(self, size: int) -> bytes:
24+
return self._internal_reader.read(size)
1625

1726
def read_uchar(self) -> int:
18-
return self.read_integer(1)
27+
return struct.unpack("B", self.read(1))[0]
1928

2029
def read_char(self) -> int:
21-
return self.read_integer(1, True)
30+
return struct.unpack("b", self.read(1))[0]
2231

2332
def read_ushort(self) -> int:
24-
return self.read_integer(2)
33+
return struct.unpack(f"{self.endian_sign}H", self.read(2))[0]
2534

2635
def read_short(self) -> int:
27-
return self.read_integer(2, True)
36+
return struct.unpack(f"{self.endian_sign}h", self.read(2))[0]
2837

2938
def read_uint(self) -> int:
30-
return self.read_integer(4)
39+
return struct.unpack(f"{self.endian_sign}I", self.read(4))[0]
3140

3241
def read_int(self) -> int:
33-
return self.read_integer(4, True)
42+
return struct.unpack(f"{self.endian_sign}i", self.read(4))[0]
3443

3544
def read_twip(self) -> float:
3645
return self.read_int() / 20
@@ -72,6 +81,7 @@ def write_string(self, string: str | None = None):
7281
if string is None:
7382
self.write_byte(0xFF)
7483
return
84+
7585
encoded = string.encode()
7686
self.write_byte(len(encoded))
7787
self.write(encoded)

xcoder/images.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,9 @@ def load_texture(reader: Reader, pixel_type: int, width: int, height: int) -> No
135135
pixel_buffer.write(channel_count.to_bytes(1, "little"))
136136

137137
for y in range(height):
138-
for x in range(width):
139-
pixel = read_pixel(reader)
140-
pixel_buffer.write(bytearray(pixel))
138+
pixel_buffer.write(
139+
b"".join([bytearray(read_pixel(reader)) for _ in range(width)])
140+
)
141141

142142
Console.progress_bar(locale.crt_pic, y, height)
143143

xcoder/pixel_utils.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,7 @@ def get_channel_count_by_pixel_type(pixel_type: int) -> int:
2727

2828

2929
def _read_rgba8(reader: Reader) -> PixelChannels:
30-
return (
31-
reader.read_uchar(),
32-
reader.read_uchar(),
33-
reader.read_uchar(),
34-
reader.read_uchar(),
35-
)
30+
return tuple(reader.read(4))
3631

3732

3833
def _read_rgba4(reader: Reader) -> PixelChannels:
@@ -61,11 +56,11 @@ def _read_rgb565(reader: Reader) -> PixelChannels:
6156

6257

6358
def _read_luminance8_alpha8(reader: Reader) -> PixelChannels:
64-
return (reader.read_uchar(), reader.read_uchar())[::-1]
59+
return tuple(reader.read(2))[::-1]
6560

6661

6762
def _read_luminance8(reader: Reader) -> PixelChannels:
68-
return (reader.read_uchar(),)
63+
return tuple(reader.read(1))
6964

7065

7166
def _write_rgba8(pixel: PixelChannels) -> bytes:

0 commit comments

Comments
 (0)