Repository for mbEditorPro 2.0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.9 KiB

# • ▌ ▄ ·. ▄▄▄▄· ▄▄▄ .·▄▄▄▄ ▪ ▄▄▄▄▄ ▄▄▄ ▄▄▄·▄▄▄
# ·██ ▐███▪▐█ ▀█▪ ▀▄.▀·██▪ ██ ██ •██ ▪ ▀▄ █· ▐█ ▄█▀▄ █·▪
# ▐█ ▌▐▌▐█·▐█▀▀█▄ ▐▀▀▪▄▐█· ▐█▌▐█· ▐█.▪ ▄█▀▄ ▐▀▀▄ ██▀·▐▀▀▄ ▄█▀▄
# ██ ██▌▐█▌██▄▪▐█ ▐█▄▄▌██. ██ ▐█▌ ▐█▌·▐█▌.▐▌▐█•█▌ ▐█▪·•▐█•█▌▐█▌.▐▌
# ▀▀ █▪▀▀▀·▀▀▀▀ ▀▀▀ ▀▀▀▀▀• ▀▀▀ ▀▀▀ ▀█▄▀▪.▀ ▀ .▀ .▀ ▀ ▀█▄▀▪
# Magicbane Emulator Project © 2013 - 2022
# www.magicbane.com
from PIL import Image, ImageOps
from arcane.util import ResStream
class ArcTexture:
VALUE_TO_MODE = {
(4, 8, 2): 'RGBA',
(3, 0, 0): 'RGB',
(1, 0, 0): 'L',
(1, 8, 2): 'P',
}
MODE_TO_VALUE = {value: key for key, value in VALUE_TO_MODE.items()}
def load_binary(self, stream: ResStream):
self.image_width = stream.read_dword()
self.image_height = stream.read_dword()
self.image_color_depth = stream.read_dword()
self.image_alpha = stream.read_dword()
self.image_type = stream.read_dword()
self.image_compressed = stream.read_bool()
self.image_linear = stream.read_bool()
data_size = stream.read_dword()
self.image_data = stream.read_bytes(data_size)
def save_binary(self, stream: ResStream):
stream.write_dword(self.image_width)
stream.write_dword(self.image_height)
stream.write_dword(self.image_color_depth)
stream.write_dword(self.image_alpha)
stream.write_dword(self.image_type)
stream.write_bool(self.image_compressed)
stream.write_bool(self.image_linear)
stream.write_dword(len(self.image_data))
stream.write_bytes(self.image_data)
def load_img(self, filepath):
img = Image.open(filepath)
img = ImageOps.mirror(img).rotate(180)
self.image_width = img.width
self.image_height = img.height
self.image_color_depth, self.image_alpha, self.image_type = self.MODE_TO_VALUE[img.mode]
self.image_compressed = True
self.image_linear = True
self.image_data = img.tobytes()
def save_img(self, filepath):
mode = self.VALUE_TO_MODE[
(self.image_color_depth, self.image_alpha, self.image_type)
]
img = Image.frombytes(mode, (self.image_width, self.image_height), self.image_data)
img = ImageOps.mirror(img.rotate(180))
img.save(filepath)
class ArcTerrain(ArcTexture):
VALUE_TO_MODE = {
(1, 1, 0): 'P',
}
MODE_TO_VALUE = {value: key for key, value in VALUE_TO_MODE.items()}