SmashMUGENWeb/Public/ecma/Models/SFFv1Model.ecma.js
2026-07-20 07:23:37 +02:00

177 lines
4.8 KiB
JavaScript

"use strict";
import {Common} from "http://localhost:18000/Public/ecma/Utils/Common.ecma.js";
import {Tools} from "../Utils/Tools.ecma.js";
export const SFFPCXModel = (function(){
const SFFPCXModel = function(pcx, palette_size = 0){
const self = this;
this.id = null;
this.version = null;
this.encoding = null;
this.bit = null;
this.x = null;
this.y = null;
this.width = null;
this.height = null;
this.horizontal = null;
this.vertical = null;
this.color_map = null;
this.reserved = null;
this.planes = null;
this.bytes_per_line = null;
this.information = null;
this.filler = null;
this.data = null;
this.ok = null;
this.palette = null;
const constructor = () => {
Object.entries(Tools.load_binary(pcx, [
["id", "integer", 1],
["version", "integer", 1],
["encoding", "integer", 1],
["bit", "integer", 1],
["x", "integer", 2],
["y", "integer", 2],
["width", "integer", 2],
["height", "integer", 2],
["horizontal", "integer", 2],
["vertical", "integer", 2],
["color_map", (bytes, _) => bytes.reduce((map, byte, j) => {
const k = j / 3 >> 0;
(map[k] || (map[k] = []))[j % 3] = byte;
return map;
}), 48],
["reserved", "integer", 1],
["planes", "integer", 1],
["bytes_per_line", "integer", 2],
["information", "integer", 2],
["filler", "bytes", 58],
["data", "bytes", object => pcx.length - 128 - palette_size - (palette_size ? 1 : 0)],
["ok", (bytes, _) => !bytes.length || bytes[0] == 12, palette_size ? 1 : 0],
["palette", "bytes", palette_size]
])).forEach(([key, value]) => {
self[key] = value;
});
};
constructor();
};
return SFFPCXModel;
})();
export const SFFv1ImageModel = (function(){
const SFFv1ImageModel = function(version, data){
const self = this;
this.next = null;
this.length = null;
this.x = null;
this.y = null;
this.group = null;
this.i = null;
this.shared_flag = null;
this.comments = null;
this.image = null;
const constructor = () => {
Object.entries(Tools.load_binary(data, [
["next", "integer", 4],
["length", "integer", 4],
["x", "integer", 2],
["y", "integer", 2],
["group", "integer", 2],
["i", "integer", 2],
["shared_flag", "boolean", 1],
["comments", "string", 15],
["image", "bytes", object => object.length]
])).forEach(([key, value]) => {
if(key == "image"){
self[key] = new SFFPCXModel(value, self.shared_flag ? 0 : 768);
}else
self[key] = value;
});
};
constructor();
};
return SFFv1ImageModel;
})();
export const SFFv1Model = (function(){
const SFFv1Model = function(sff, callback = null){
const self = this;
this.signature = "";
this.version = [];
this.groups = {};
this.images = [];
this.next = null;
this.offset_palette = null;
this.shared_palette = null;
this.comments = "";
const constructor = () => {
let images_l,
groups_l,
offset;
Object.entries(Tools.load_binary(sff, [
["signature", "string", 12],
["version", "bytes", 4],
["groups", "integer", 4],
["images", "integer", 4],
["next", "integer", 4],
["offset_palette", "integer", 4],
["shared_palette", "boolean", 4],
["comments", "string", object => object.next - 36]
])).forEach(([key, value]) => {
if(key == "images")
images_l = value;
else if(key == "groups")
groups_l = value;
else
self[key] = value;
});
offset = self.next;
while(self.images.length < images_l){
const image = new SFFImageModel(self.version, sff.slice(offset));
self.images.push(image);
offset = image.next;
};
Common.execute(callback, self);
};
constructor();
};
return SFFv1Model;
})();