Pixel-Composer/scripts/ase_object/ase_object.gml

112 lines
No EOL
2.6 KiB
Text

function ase_cel(_layer, _data, _file) constructor {
data = _data;
file = _file;
layerTarget = _layer;
static checkSurface = function() {
var width = data[$ "Width"];
var height = data[$ "Height"];
data[$ "Surface"] = surface_verify(data[$ "Surface"], width, height);
var color = file[$ "Color depth"];
if(color == 32) {//rgba
buffer_set_surface(data[$ "Buffer"], data[$ "Surface"], 0);
return;
}
var size = width * height;
var buff = buffer_create(size * 4, buffer_fixed, 1);
buffer_seek(buff, buffer_seek_start, 0);
buffer_seek(data[$ "Buffer"], buffer_seek_start, 0);
if(color == 16) { //grey
repeat(size) {
var _bin = buffer_read(data[$ "Buffer"], buffer_u16);
buffer_write(buff, buffer_u8, _bin);
buffer_write(buff, buffer_u8, _bin);
buffer_write(buff, buffer_u8, _bin);
buffer_write(buff, buffer_u8, _bin >> 8);
}
} else if(color == 8) { //index
var palet = file[$ "Palette"];
repeat(size) {
var _bin = buffer_read(data[$ "Buffer"], buffer_u8);
var cc = array_safe_get_fast(palet, _bin);
for( var i = 0; i < 4; i++ )
buffer_write(buff, buffer_u8, cc[i]);
}
}
buffer_set_surface(buff, data[$ "Surface"], 0);
}
static getSurface = function() {
var type = data[$ "Cel type"];
if(type == 0) {
} else if(type == 1) {
var frTarget = data[$ "Frame position"];
// print($"Get frame {frTarget}")
var cel = layerTarget.getCelRaw(frTarget);
if(!cel) return noone;
return cel.getSurface();
} else if(type == 2) {
checkSurface();
return data[$ "Surface"];
}
return noone;
}
function toStr() {
return {
type: data[$ "Cel type"],
link: data[$ "Frame position"]
};
}
function toString() {
var st = json_stringify(toStr());
return $"[ase cel] {st}";
}
}
function ase_layer(name, type = 0) constructor {
self.name = name;
self.type = type;
cels = [];
tag = noone;
static setFrameCel = function(index, cel) { cels[index] = cel; }
static getCelRaw = function(index = CURRENT_FRAME) {
ind = safe_mod(index, array_length(cels));
return array_safe_get_fast(cels, ind);
}
static getCel = function(index = CURRENT_FRAME) {
if(tag == noone) return getCelRaw(index);
var st = tag[$ "Frame start"];
var ed = tag[$ "Frame end"];
var ind = st + safe_mod(index, ed - st + 1);
return array_safe_get_fast(cels, ind);
}
function toString() {
var st = json_stringify({
type,
cels : array_map(cels, function(cel) /*=>*/ {return cel.toStr()}),
});
return $"[ase layer] {st}";
}
}