Source code for scfile.formats.ol.decoder
from abc import ABC, abstractmethod
from typing import Generic
import lz4.block
from scfile.consts import FileSignature
from scfile.core import FileDecoder, TextureContent
from scfile.enums import ByteOrder, F, FileFormat
from scfile.structures.texture import DefaultTexture, TextureType
from .exceptions import OlFormatUnsupported
from .formats import SUPPORTED_FORMATS
from .io import OlFileIO
# mro nightmare
[docs]
class BaseOlDecoder(FileDecoder[TextureContent[TextureType]], OlFileIO, Generic[TextureType], ABC):
format = FileFormat.OL
order = ByteOrder.BIG
signature = FileSignature.OL
[docs]
def to_dds(self):
from scfile.formats.dds.encoder import DdsEncoder
return self.convert_to(DdsEncoder)
[docs]
def parse(self):
self._parse_header()
self._parse_format()
self._parse_sizes()
self._parse_image()
def _parse_header(self):
self.data.width = self._readb(F.U32)
self.data.height = self._readb(F.U32)
self.data.mipmap_count = self._readb(F.U32)
def _parse_format(self):
self.data.format = self._readformat()
if self.data.format not in SUPPORTED_FORMATS:
raise OlFormatUnsupported(self.path, self.data.format)
def _parse_image(self):
self.texture_id = self._reads()
self._parse_mipmaps()
@abstractmethod
def _parse_sizes(self):
pass
@abstractmethod
def _parse_mipmaps(self):
pass
[docs]
class OlDecoder(BaseOlDecoder[DefaultTexture]):
_content = TextureContent
def _parse_sizes(self):
self.data.texture.uncompressed = self._readsizes(self.data.mipmap_count)
self.data.texture.compressed = self._readsizes(self.data.mipmap_count)
def _parse_mipmaps(self):
for mipmap in range(self.data.mipmap_count):
self.data.texture.mipmaps.append(
lz4.block.decompress(
self.read(self.data.texture.compressed[mipmap]),
self.data.texture.uncompressed[mipmap],
)
)