Pixel-Composer/scripts/sprite_add_functions/sprite_add_functions.gml

91 lines
2.8 KiB
Text
Raw Normal View History

globalvar SPRITE_PATH_MAP;
SPRITE_PATH_MAP = {};
function sprite_add_map(path) {
2024-08-29 03:53:19 +02:00
var _real_path = sprite_path_check_depth(path);
var _s = sprite_add(_real_path, 1, 0, 0, 0, 0);
SPRITE_PATH_MAP[$ path] = _s;
return _s;
}
2023-09-22 17:01:56 +02:00
function sprite_add_center(path) {
2023-12-08 03:50:09 +01:00
if(!file_exists_empty(path)) return noone;
2023-09-22 17:01:56 +02:00
var _s = sprite_add(path, 0, 0, 0, 0, 0);
var _sw = sprite_get_width(_s);
var _sh = sprite_get_height(_s);
sprite_set_offset(_s, _sw / 2, _sh / 2);
return _s;
2024-08-29 03:53:19 +02:00
}
function sprite_path_check_depth(path, noti = true) {
if(filename_ext(path) != ".png") return path;
var _data = read_png_header(path, noti);
if(_data == noone) return path;
if(_data.depth <= 8) return path;
2024-08-29 03:53:19 +02:00
if(noti) noti_warning($"{_data.depth} bits image is not supported. Proxy will be used.");
var path_magick = filepath_resolve(PREFERENCES.ImageMagick_path) + "magick.exe";
var proxy_path = $"{TEMPDIR}{filename_name_only(path)}_{seed_random(6)}.png";
var shell_cmd = $"convert \"{path}\" -depth 8 \"{proxy_path}\"";
shell_execute(path_magick, shell_cmd, self);
return proxy_path;
}
#region ================================= SERIALIZE ==================================
function sprite_array_serialize(arr) { return json_stringify(__sprite_array_serialize(arr)); }
function __sprite_array_serialize(arr) {
if(!is_array(arr)) {
if(!sprite_exists(arr)) return arr;
var ww = sprite_get_width(arr);
var hh = sprite_get_height(arr);
var _srf = surface_create(ww, hh);
surface_set_target(_srf); DRAW_CLEAR draw_sprite(arr, 0, 0, 0); surface_reset_target();
var buff = buffer_create(ww * hh * 4, buffer_fixed, 1);
buffer_get_surface(buff, _srf, 0);
var comp = buffer_compress(buff, 0, buffer_get_size(buff));
var enc = buffer_base64_encode(comp, 0, buffer_get_size(comp));
surface_free(_srf);
buffer_delete(buff);
return { width: ww, height: hh, buffer: enc };
}
var _arr = array_create(array_length(arr));
for( var i = 0, n = array_length(arr); i < n; i++ )
_arr[i] = __sprite_array_serialize(arr[i]);
return _arr;
}
function sprite_array_deserialize(dat) { return __sprite_array_deserialize(json_try_parse(dat, 0)); }
function __sprite_array_deserialize(arr) {
if(!is_array(arr)) {
if(!is_struct(arr) || !struct_has(arr, "buffer")) return noone;
var buff = buffer_base64_decode(arr.buffer);
buff = buffer_decompress(buff);
var _surf = surface_create_from_buffer(arr.width, arr.height, buff);
var _spr = sprite_create_from_surface(_surf, 0, 0, arr.width, arr.height, false, false, 0, 0);
surface_free_safe(_surf);
return _spr;
}
var _arr = array_create(array_length(arr));
for( var i = 0, n = array_length(arr); i < n; i++ )
_arr[i] = __sprite_array_deserialize(arr[i]);
return _arr;
}
#endregion