Natives Rework (Thank you Essem)

Co-authored-by: Essem <TheEssem@users.noreply.github.com>
This commit is contained in:
murm 2023-03-19 04:40:32 -04:00
parent b424b2f813
commit ff7f0a3110
88 changed files with 3358 additions and 3104 deletions

40
app.js
View File

@ -75,27 +75,27 @@ async function* getFiles(dir) {
async function init() { async function init() {
await exec("git rev-parse HEAD").then(output => output.stdout.substring(0, 7), () => "unknown commit").then(o => process.env.GIT_REV = o); await exec("git rev-parse HEAD").then(output => output.stdout.substring(0, 7), () => "unknown commit").then(o => process.env.GIT_REV = o);
console.log(` console.log(`
,*\`$ z\`"v
F zBw\`% A ,W "W
,\` ,EBBBWp"%. ,-=~~==-,+* 4BBE T
M BBBBBBBB* ,w=####Wpw 4BBBBB# 1
F BBBBBBBMwBBBBBBBBBBBBB#wXBBBBBH E
F BBBBBBkBBBBBBBBBBBBBBBBBBBBE4BL k
# BFBBBBBBBBBBBBF" "RBBBW F
V ' 4BBBBBBBBBBM TBBL F
F BBBBBBBBBBF JBB L
F FBBBBBBBEB BBL 4
E [BB4BBBBEBL BBL 4
I #BBBBBBBEB 4BBH *w
A 4BBBBBBBBBEW, ,BBBB W [
.A ,k 4BBBBBBBBBBBEBW####BBBBBBM BF F
k <BBBw BBBBEBBBBBBBBBBBBBBBBBQ4BM #
5, REBBB4BBBBB#BBBBBBBBBBBBP5BFF ,F
*w \`*4BBW\`"FF#F##FFFF"\` , * +"
*+, " F'"'*^~~~^"^\` V+*^
\`"""
esmBot ${esmBotVersion} (${process.env.GIT_REV}) mrmBot-matrix ${esmBotVersion} (${process.env.GIT_REV})
`); `);
if (!types.classic && !types.application) { if (!types.classic && !types.application) {

View File

@ -79,14 +79,17 @@ class ImageCommand extends Command {
} }
try { try {
const { buffer, type } = await runImageJob(imageParams); const { buffer, type, width, height } = await runImageJob(imageParams);
if (type === "nogif" && this.constructor.requiresGIF) { if (type === "nogif" && this.constructor.requiresGIF) {
return "That isn't a GIF!"; return "That isn't a GIF!";
} }
this.success = true; this.success = true;
return { return {
contents: buffer, contents: buffer,
name: `${this.constructor.command}.${type}` name: `${this.constructor.command}.${type}`,
type,
width,
height
}; };
} catch (e) { } catch (e) {
if (e === "Request ended prematurely due to a closed connection") return "This image job couldn't be completed because the server it was running on went down. Try running your command again."; if (e === "Request ended prematurely due to a closed connection") return "This image job couldn't be completed because the server it was running on went down. Try running your command again.";

View File

@ -1,6 +1,10 @@
import ImageCommand from "../../classes/imageCommand.js"; import ImageCommand from "../../classes/imageCommand.js";
class ExplodeCommand extends ImageCommand { class ExplodeCommand extends ImageCommand {
params = {
implode: false
};
static category = "image-editing" static category = "image-editing"
static description = "Explodes an image"; static description = "Explodes an image";
static aliases = ["exp"]; static aliases = ["exp"];

View File

@ -2,6 +2,9 @@ import ImageCommand from "../../classes/imageCommand.js";
class FlipCommand extends ImageCommand { class FlipCommand extends ImageCommand {
static category = "image-editing" static category = "image-editing"
params = {
flop: false
};
static description = "Flips an image"; static description = "Flips an image";
static noImage = "You need to provide an image/GIF to flip!"; static noImage = "You need to provide an image/GIF to flip!";

View File

@ -99,11 +99,15 @@ export default async function (matrixClient, event, room, toStartOfTimeline) {
} else { } else {
const mxcUri = await matrixClient.uploadContent(result.contents); const mxcUri = await matrixClient.uploadContent(result.contents);
// TODO: make info object get width, height, and mime from natives so i dont need to read the buffer // TODO: make info object get width, height, and mime from natives so i dont need to read the buffer
const imgsize = sizeOf(result.contents) // const imgsize = sizeOf(result.contents)
let mime = imgsize.type; const mime = result.type;
if (mime == "jpg") { const imgsize = {
mime = "jpeg"; width: result.width,
height: result.height
} }
// if (mime === "jpg") {
// mime = "jpeg";
// }
await matrixClient.sendImageMessage(event.event.room_id, mxcUri.content_uri, {h: imgsize.height, w: imgsize.width, mimetype: `image/${mime}`, size: result.contents.length, thumbnail_info: {h: imgsize.height, w: imgsize.width, mimetype: `image/${mime}`, size: result.contents.length}}, result.name) await matrixClient.sendImageMessage(event.event.room_id, mxcUri.content_uri, {h: imgsize.height, w: imgsize.width, mimetype: `image/${mime}`, size: result.contents.length, thumbnail_info: {h: imgsize.height, w: imgsize.width, mimetype: `image/${mime}`, size: result.contents.length}}, result.name)
} }
} else { } else {

View File

@ -7,7 +7,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Blur(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Blur(string type, string *outType, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
bool sharp = GetArgument<bool>(Arguments, "sharp"); bool sharp = GetArgument<bool>(Arguments, "sharp");
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
@ -27,5 +27,10 @@ char *Blur(string type, string *outType, char *BufferData, size_t BufferLength,
void *buf; void *buf;
out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize); out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = out.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Blur(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Blur(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -7,7 +7,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Bounce(string type, string *outType, char *BufferData, ArgumentMap Bounce(string type, string *outType, char *BufferData,
size_t BufferLength, [[maybe_unused]] ArgumentMap Arguments, size_t BufferLength, [[maybe_unused]] ArgumentMap Arguments,
size_t *DataSize) { size_t *DataSize) {
VOption *options = VImage::option(); VOption *options = VImage::option();
@ -47,5 +47,10 @@ char *Bounce(string type, string *outType, char *BufferData,
*outType = "gif"; *outType = "gif";
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight + halfHeight;
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Bounce(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Bounce(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -6,7 +6,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Caption(string type, string *outType, char *BufferData, ArgumentMap Caption(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
string caption = GetArgument<string>(Arguments, "caption"); string caption = GetArgument<string>(Arguments, "caption");
string font = GetArgument<string>(Arguments, "font"); string font = GetArgument<string>(Arguments, "font");
@ -73,5 +73,10 @@ char *Caption(string type, string *outType, char *BufferData,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = final.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Caption(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Caption(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -7,7 +7,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *CaptionTwo(string type, string *outType, char *BufferData, ArgumentMap CaptionTwo(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
bool top = GetArgument<bool>(Arguments, "top"); bool top = GetArgument<bool>(Arguments, "top");
string caption = GetArgument<string>(Arguments, "caption"); string caption = GetArgument<string>(Arguments, "caption");
@ -77,5 +77,10 @@ char *CaptionTwo(string type, string *outType, char *BufferData,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = final.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* CaptionTwo(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap CaptionTwo(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -11,7 +11,7 @@
using namespace std; using namespace std;
using namespace Magick; using namespace Magick;
char *Circle(string type, string *outType, char *BufferData, ArgumentMap Circle(string type, string *outType, char *BufferData,
size_t BufferLength, [[maybe_unused]] ArgumentMap Arguments, size_t BufferLength, [[maybe_unused]] ArgumentMap Arguments,
size_t *DataSize) { size_t *DataSize) {
Blob blob; Blob blob;
@ -50,5 +50,11 @@ char *Circle(string type, string *outType, char *BufferData,
// workaround because the data is tied to the blob // workaround because the data is tied to the blob
char *data = (char *)malloc(*DataSize); char *data = (char *)malloc(*DataSize);
memcpy(data, blob.data(), *DataSize); memcpy(data, blob.data(), *DataSize);
return data;
ArgumentMap output;
output["buf"] = data;
output["width"] = (int)blurred.front().columns();
output["height"] = (int)blurred.front().rows();
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Circle(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Circle(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -10,7 +10,7 @@ using namespace vips;
VImage sepia = VImage::new_matrixv(3, 3, 0.3588, 0.7044, 0.1368, 0.2990, 0.5870, VImage sepia = VImage::new_matrixv(3, 3, 0.3588, 0.7044, 0.1368, 0.2990, 0.5870,
0.1140, 0.2392, 0.4696, 0.0912); 0.1140, 0.2392, 0.4696, 0.0912);
char *Colors(string type, string *outType, char *BufferData, ArgumentMap Colors(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
string color = GetArgument<string>(Arguments, "color"); string color = GetArgument<string>(Arguments, "color");
@ -32,5 +32,10 @@ char *Colors(string type, string *outType, char *BufferData,
void *buf; void *buf;
out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize); out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = out.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Colors(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Colors(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -9,7 +9,7 @@ using std::map;
using std::string; using std::string;
using std::variant; using std::variant;
typedef variant<string, float, bool, int> ArgumentVariant; typedef variant<char*, string, float, bool, int> ArgumentVariant;
typedef map<string, ArgumentVariant> ArgumentMap; typedef map<string, ArgumentVariant> ArgumentMap;
#include "blur.h" #include "blur.h"
@ -85,7 +85,7 @@ const std::unordered_map<std::string, std::string> fontPaths{
{"roboto", "assets/fonts/reddit.ttf"}}; {"roboto", "assets/fonts/reddit.ttf"}};
const std::map<std::string, const std::map<std::string,
char* (*)(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap (*)(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize)> ArgumentMap Arguments, size_t* DataSize)>
FunctionMap = {{"blur", &Blur}, FunctionMap = {{"blur", &Blur},
{"bounce", &Bounce}, {"bounce", &Bounce},
@ -126,5 +126,5 @@ const std::map<std::string,
{"zamn", Zamn}}; {"zamn", Zamn}};
const std::map<std::string, const std::map<std::string,
char* (*)(string type, string* outType, ArgumentMap Arguments, size_t* DataSize)> ArgumentMap (*)(string type, string* outType, ArgumentMap Arguments, size_t* DataSize)>
NoInputFunctionMap = {{"homebrew", Homebrew}, {"sonic", Sonic}}; NoInputFunctionMap = {{"homebrew", Homebrew}, {"sonic", Sonic}};

View File

@ -7,7 +7,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Crop(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Crop(string type, string *outType, char *BufferData, size_t BufferLength,
[[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) { [[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
@ -47,5 +47,10 @@ char *Crop(string type, string *outType, char *BufferData, size_t BufferLength,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = finalHeight;
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Crop(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Crop(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -6,7 +6,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Deepfry(string type, string *outType, char *BufferData, ArgumentMap Deepfry(string type, string *outType, char *BufferData,
size_t BufferLength, [[maybe_unused]] ArgumentMap Arguments, size_t BufferLength, [[maybe_unused]] ArgumentMap Arguments,
size_t *DataSize) { size_t *DataSize) {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
@ -57,5 +57,10 @@ char *Deepfry(string type, string *outType, char *BufferData,
("." + *outType).c_str(), &buf, DataSize, ("." + *outType).c_str(), &buf, DataSize,
*outType == "gif" ? VImage::option()->set("dither", 0) : 0); *outType == "gif" ? VImage::option()->set("dither", 0) : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight;
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Deepfry(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Deepfry(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Explode(string type, string *outType, char *BufferData, ArgumentMap Explode(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
bool implode = GetArgumentWithFallback<bool>(Arguments, "implode", false); bool implode = GetArgumentWithFallback<bool>(Arguments, "implode", false);
string basePath = GetArgument<string>(Arguments, "basePath"); string basePath = GetArgument<string>(Arguments, "basePath");
@ -48,5 +48,10 @@ char *Explode(string type, string *outType, char *BufferData,
void *buf; void *buf;
final.write_to_buffer(("." + *outType).c_str(), &buf, DataSize); final.write_to_buffer(("." + *outType).c_str(), &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight;
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Explode(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Explode(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Flag(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Flag(string type, string *outType, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
string overlay = GetArgument<string>(Arguments, "overlay"); string overlay = GetArgument<string>(Arguments, "overlay");
string basePath = GetArgument<string>(Arguments, "basePath"); string basePath = GetArgument<string>(Arguments, "basePath");
@ -45,5 +45,10 @@ char *Flag(string type, string *outType, char *BufferData, size_t BufferLength,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight;
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Flag(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Flag(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -6,9 +6,9 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Flip(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Flip(string type, string *outType, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
bool flop = GetArgument<bool>(Arguments, "flop"); bool flop = GetArgumentWithFallback<bool>(Arguments, "flop", false);
VImage in = VImage::new_from_buffer(BufferData, BufferLength, "", VImage in = VImage::new_from_buffer(BufferData, BufferLength, "",
type == "gif" type == "gif"
@ -44,5 +44,10 @@ char *Flip(string type, string *outType, char *BufferData, size_t BufferLength,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = out.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Flip(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Flip(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -7,7 +7,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Freeze(string type, string *outType, char *BufferData, ArgumentMap Freeze(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
bool loop = GetArgumentWithFallback<bool>(Arguments, "loop", false); bool loop = GetArgumentWithFallback<bool>(Arguments, "loop", false);
int frame = GetArgumentWithFallback<int>(Arguments, "frame", -1); int frame = GetArgumentWithFallback<int>(Arguments, "frame", -1);
@ -42,7 +42,16 @@ char *Freeze(string type, string *outType, char *BufferData,
} }
if (none) *DataSize = BufferLength; if (none) *DataSize = BufferLength;
return newData; VImage in =
VImage::new_from_buffer(newData, *DataSize, "",
VImage::option()->set("access", "sequential"));
ArgumentMap output;
output["buf"] = newData;
output["width"] = in.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} else if (frame >= 0 && !loop) { } else if (frame >= 0 && !loop) {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
@ -62,7 +71,13 @@ char *Freeze(string type, string *outType, char *BufferData,
void *buf; void *buf;
out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize); out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = out.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} else { } else {
lastPos = (char *)memchr(fileData, '\x21', BufferLength); lastPos = (char *)memchr(fileData, '\x21', BufferLength);
while (lastPos != NULL) { while (lastPos != NULL) {
@ -78,6 +93,15 @@ char *Freeze(string type, string *outType, char *BufferData,
} }
if (none) *DataSize = BufferLength; if (none) *DataSize = BufferLength;
return fileData; VImage in =
VImage::new_from_buffer(fileData, *DataSize, "",
VImage::option()->set("access", "sequential"));
ArgumentMap output;
output["buf"] = fileData;
output["width"] = in.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Freeze(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Freeze(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Gamexplain(string type, string *outType, char *BufferData, ArgumentMap Gamexplain(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
string basePath = GetArgument<string>(Arguments, "basePath"); string basePath = GetArgument<string>(Arguments, "basePath");
@ -46,5 +46,10 @@ char *Gamexplain(string type, string *outType, char *BufferData,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = final.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Gamexplain(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Gamexplain(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Globe(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Globe(string type, string *outType, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
string basePath = GetArgument<string>(Arguments, "basePath"); string basePath = GetArgument<string>(Arguments, "basePath");
@ -69,5 +69,10 @@ char *Globe(string type, string *outType, char *BufferData, size_t BufferLength,
void *buf; void *buf;
final.write_to_buffer(".gif", &buf, DataSize); final.write_to_buffer(".gif", &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = final.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Globe(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Globe(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Homebrew(string type, string *outType, ArgumentMap Arguments, ArgumentMap Homebrew(string type, string *outType, ArgumentMap Arguments,
size_t *DataSize) { size_t *DataSize) {
string caption = GetArgument<string>(Arguments, "caption"); string caption = GetArgument<string>(Arguments, "caption");
string basePath = GetArgument<string>(Arguments, "basePath"); string basePath = GetArgument<string>(Arguments, "basePath");
@ -33,5 +33,10 @@ char *Homebrew(string type, string *outType, ArgumentMap Arguments,
void *buf; void *buf;
out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize); out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = bg.width();
output["height"] = vips_image_get_page_height(bg.get_image());
return output;
} }

View File

@ -4,4 +4,4 @@
using std::string; using std::string;
char *Homebrew(string type, string *outType, ArgumentMap Arguments, size_t *DataSize); ArgumentMap Homebrew(string type, string *outType, ArgumentMap Arguments, size_t *DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Invert(string type, string *outType, char *BufferData, ArgumentMap Invert(string type, string *outType, char *BufferData,
size_t BufferLength, [[maybe_unused]] ArgumentMap Arguments, size_t BufferLength, [[maybe_unused]] ArgumentMap Arguments,
size_t *DataSize) { size_t *DataSize) {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
@ -24,5 +24,10 @@ char *Invert(string type, string *outType, char *BufferData,
void *buf; void *buf;
out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize); out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = out.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Invert(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Invert(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,11 +5,13 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Jpeg(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Jpeg(string type, string *outType, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
int quality = GetArgumentWithFallback<int>(Arguments, "quality", 0); int quality = GetArgumentWithFallback<int>(Arguments, "quality", 0);
void *buf; void *buf;
ArgumentMap output;
if (type == "gif") { if (type == "gif") {
VImage in = VImage::new_from_buffer( VImage in = VImage::new_from_buffer(
@ -55,6 +57,9 @@ char *Jpeg(string type, string *outType, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *outType).c_str(), &buf, DataSize, ("." + *outType).c_str(), &buf, DataSize,
*outType == "gif" ? VImage::option()->set("dither", 0) : 0); *outType == "gif" ? VImage::option()->set("dither", 0) : 0);
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight;
} else { } else {
VImage in = VImage::new_from_buffer(BufferData, BufferLength, ""); VImage in = VImage::new_from_buffer(BufferData, BufferLength, "");
void *jpgBuf; void *jpgBuf;
@ -69,7 +74,10 @@ char *Jpeg(string type, string *outType, char *BufferData, size_t BufferLength,
*outType = "jpg"; *outType = "jpg";
buf = jpgBuf; buf = jpgBuf;
} }
output["buf"] = (char *)buf;
output["width"] = in.width();
output["height"] = vips_image_get_page_height(in.get_image());
} }
return (char *)buf; return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Jpeg(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Jpeg(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -9,7 +9,7 @@
using namespace std; using namespace std;
using namespace Magick; using namespace Magick;
char *Magik(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Magik(string type, string *outType, char *BufferData, size_t BufferLength,
[[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) { [[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) {
Blob blob; Blob blob;
@ -48,5 +48,11 @@ char *Magik(string type, string *outType, char *BufferData, size_t BufferLength,
char *data = (char *)malloc(*DataSize); char *data = (char *)malloc(*DataSize);
memcpy(data, blob.data(), *DataSize); memcpy(data, blob.data(), *DataSize);
return data;
ArgumentMap output;
output["buf"] = data;
output["width"] = (int)blurred.front().columns();
output["height"] = (int)blurred.front().rows();
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Magik(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Magik(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Meme(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Meme(string type, string *outType, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
string top = GetArgument<string>(Arguments, "top"); string top = GetArgument<string>(Arguments, "top");
string bottom = GetArgument<string>(Arguments, "bottom"); string bottom = GetArgument<string>(Arguments, "bottom");
@ -135,5 +135,10 @@ char *Meme(string type, string *outType, char *BufferData, size_t BufferLength,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight;
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Meme(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Meme(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Mirror(string type, string *outType, char *BufferData, ArgumentMap Mirror(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
bool vertical = GetArgumentWithFallback<bool>(Arguments, "vertical", false); bool vertical = GetArgumentWithFallback<bool>(Arguments, "vertical", false);
bool first = GetArgumentWithFallback<bool>(Arguments, "first", false); bool first = GetArgumentWithFallback<bool>(Arguments, "first", false);
@ -60,5 +60,10 @@ char *Mirror(string type, string *outType, char *BufferData,
void *buf; void *buf;
out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize); out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = in.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Mirror(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Mirror(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Motivate(string type, string *outType, char *BufferData, ArgumentMap Motivate(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
string top_text = GetArgument<string>(Arguments, "top"); string top_text = GetArgument<string>(Arguments, "top");
string bottom_text = GetArgument<string>(Arguments, "bottom"); string bottom_text = GetArgument<string>(Arguments, "bottom");
@ -119,5 +119,10 @@ char *Motivate(string type, string *outType, char *BufferData,
("." + *outType).c_str(), &buf, DataSize, ("." + *outType).c_str(), &buf, DataSize,
*outType == "gif" ? VImage::option()->set("dither", 1) : 0); *outType == "gif" ? VImage::option()->set("dither", 1) : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = in.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Motivate(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Motivate(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -67,25 +67,31 @@ Napi::Value ProcessImage(const Napi::CallbackInfo& info) {
string outType = GetArgument<bool>(Arguments, "togif") ? "gif" : type; string outType = GetArgument<bool>(Arguments, "togif") ? "gif" : type;
size_t length = 0; size_t length = 0;
char* buf; ArgumentMap outMap;
if (obj.Has("data")) { if (obj.Has("data")) {
Napi::Buffer<char> data = obj.Has("data") Napi::Buffer<char> data = obj.Has("data")
? obj.Get("data").As<Napi::Buffer<char>>() ? obj.Get("data").As<Napi::Buffer<char>>()
: Napi::Buffer<char>::New(env, 0); : Napi::Buffer<char>::New(env, 0);
buf = FunctionMap.at(command)(type, &outType, data.Data(), data.Length(), outMap = FunctionMap.at(command)(type, &outType, data.Data(), data.Length(),
Arguments, &length); Arguments, &length);
} else { } else {
buf = NoInputFunctionMap.at(command)(type, &outType, Arguments, &length); outMap = NoInputFunctionMap.at(command)(type, &outType, Arguments, &length);
} }
vips_error_clear(); vips_error_clear();
vips_thread_shutdown(); vips_thread_shutdown();
char* buf = GetArgument<char*>(outMap, "buf");
int width = GetArgument<int>(outMap, "width");
int height = GetArgument<int>(outMap, "height");
result.Set("data", result.Set("data",
Napi::Buffer<char>::New(env, buf, length, Napi::Buffer<char>::New(env, buf, length,
[]([[maybe_unused]] Napi::Env env, []([[maybe_unused]] Napi::Env env,
void* data) { free(data); })); void* data) { free(data); }));
result.Set("type", outType); result.Set("type", outType);
result.Set("width", width);
result.Set("height", height);
} catch (std::exception const& err) { } catch (std::exception const& err) {
Napi::Error::New(env, err.what()).ThrowAsJavaScriptException(); Napi::Error::New(env, err.what()).ThrowAsJavaScriptException();
} catch (...) { } catch (...) {

View File

@ -5,9 +5,9 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Reddit(string type, string *outType, char *BufferData, ArgumentMap Reddit(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
string text = GetArgumentWithFallback<string>(Arguments, "text", ""); string text = GetArgument<string>(Arguments, "caption");
string basePath = GetArgument<string>(Arguments, "basePath"); string basePath = GetArgument<string>(Arguments, "basePath");
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
@ -63,5 +63,10 @@ char *Reddit(string type, string *outType, char *BufferData,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight + watermark.height();
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Reddit(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Reddit(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Resize(string type, string *outType, char *BufferData, ArgumentMap Resize(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
bool stretch = GetArgumentWithFallback<bool>(Arguments, "stretch", false); bool stretch = GetArgumentWithFallback<bool>(Arguments, "stretch", false);
bool wide = GetArgumentWithFallback<bool>(Arguments, "wide", false); bool wide = GetArgumentWithFallback<bool>(Arguments, "wide", false);
@ -50,5 +50,10 @@ char *Resize(string type, string *outType, char *BufferData,
void *buf; void *buf;
out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize); out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = finalHeight;
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Resize(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Resize(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -6,7 +6,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Reverse(string type, string *outType, char *BufferData, ArgumentMap Reverse(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
bool soos = GetArgumentWithFallback<bool>(Arguments, "soos", false); bool soos = GetArgumentWithFallback<bool>(Arguments, "soos", false);
@ -55,5 +55,10 @@ char *Reverse(string type, string *outType, char *BufferData,
*outType = "gif"; *outType = "gif";
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight;
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Reverse(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Reverse(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Scott(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Scott(string type, string *outType, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
string basePath = GetArgument<string>(Arguments, "basePath"); string basePath = GetArgument<string>(Arguments, "basePath");
@ -51,5 +51,11 @@ char *Scott(string type, string *outType, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *outType).c_str(), &buf, DataSize, ("." + *outType).c_str(), &buf, DataSize,
*outType == "gif" ? VImage::option()->set("dither", 1) : 0); *outType == "gif" ? VImage::option()->set("dither", 1) : 0);
return (char *)buf;
ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight;
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Scott(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Scott(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Snapchat(string type, string *outType, char *BufferData, ArgumentMap Snapchat(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
string caption = GetArgument<string>(Arguments, "caption"); string caption = GetArgument<string>(Arguments, "caption");
float pos = GetArgumentWithFallback<float>(Arguments, "pos", 0.5); float pos = GetArgumentWithFallback<float>(Arguments, "pos", 0.5);
@ -68,5 +68,10 @@ char *Snapchat(string type, string *outType, char *BufferData,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight;
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Snapchat(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Snapchat(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Sonic(string type, string *outType, ArgumentMap Arguments, ArgumentMap Sonic(string type, string *outType, ArgumentMap Arguments,
size_t *DataSize) { size_t *DataSize) {
string text = GetArgument<string>(Arguments, "text"); string text = GetArgument<string>(Arguments, "text");
string basePath = GetArgument<string>(Arguments, "basePath"); string basePath = GetArgument<string>(Arguments, "basePath");
@ -31,5 +31,10 @@ char *Sonic(string type, string *outType, ArgumentMap Arguments,
void *buf; void *buf;
out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize); out.write_to_buffer(("." + *outType).c_str(), &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = out.width();
output["height"] = vips_image_get_page_height(out.get_image());
return output;
} }

View File

@ -4,4 +4,4 @@
using std::string; using std::string;
char *Sonic(string type, string *outType, ArgumentMap Arguments, size_t *DataSize); ArgumentMap Sonic(string type, string *outType, ArgumentMap Arguments, size_t *DataSize);

View File

@ -14,7 +14,7 @@ void *memset16(void *m, uint16_t val, size_t count) {
return m; return m;
} }
char *vipsRemove(char *data, size_t length, size_t *DataSize, int speed) { ArgumentMap vipsHandle(char *data, size_t length, size_t *DataSize, int speed, bool removeFrames) {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
VImage in = VImage::new_from_buffer(data, length, "", options->set("n", -1)) VImage in = VImage::new_from_buffer(data, length, "", options->set("n", -1))
@ -25,21 +25,31 @@ char *vipsRemove(char *data, size_t length, size_t *DataSize, int speed) {
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
int nPages = vips_image_get_n_pages(in.get_image()); int nPages = vips_image_get_n_pages(in.get_image());
VImage out;
if (removeFrames) {
vector<VImage> img; vector<VImage> img;
for (int i = 0; i < nPages; i += speed) { for (int i = 0; i < nPages; i += speed) {
VImage img_frame = in.crop(0, i * pageHeight, width, pageHeight); VImage img_frame = in.crop(0, i * pageHeight, width, pageHeight);
img.push_back(img_frame); img.push_back(img_frame);
} }
VImage out = VImage::arrayjoin(img, VImage::option()->set("across", 1)); out = VImage::arrayjoin(img, VImage::option()->set("across", 1));
out.set(VIPS_META_PAGE_HEIGHT, pageHeight); out.set(VIPS_META_PAGE_HEIGHT, pageHeight);
} else {
out = in;
}
void *buf; void *buf;
out.write_to_buffer(".gif", &buf, DataSize); out.write_to_buffer(".gif", &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight;
return output;
} }
char *Speed([[maybe_unused]] string type, string *outType, char *BufferData, ArgumentMap Speed([[maybe_unused]] string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
bool slow = GetArgumentWithFallback<bool>(Arguments, "slow", false); bool slow = GetArgumentWithFallback<bool>(Arguments, "slow", false);
int speed = GetArgumentWithFallback<int>(Arguments, "speed", 2); int speed = GetArgumentWithFallback<int>(Arguments, "speed", 2);
@ -92,11 +102,8 @@ char *Speed([[maybe_unused]] string type, string *outType, char *BufferData,
++currentFrame; ++currentFrame;
} }
if (removeFrames) { // TODO: this is cursed, fix it later
fileData = vipsRemove(BufferData, BufferLength, DataSize, speed); ArgumentMap output = vipsHandle(BufferData, BufferLength, DataSize, speed, removeFrames);
} else {
*DataSize = BufferLength;
}
return fileData; return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Speed(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Speed(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -9,7 +9,7 @@
using namespace std; using namespace std;
using namespace Magick; using namespace Magick;
char *Spin(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Spin(string type, string *outType, char *BufferData, size_t BufferLength,
[[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) { [[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) {
int delay = GetArgumentWithFallback<int>(Arguments, "delay", 0); int delay = GetArgumentWithFallback<int>(Arguments, "delay", 0);
@ -68,5 +68,11 @@ char *Spin(string type, string *outType, char *BufferData, size_t BufferLength,
char *data = (char *)malloc(*DataSize); char *data = (char *)malloc(*DataSize);
memcpy(data, blob.data(), *DataSize); memcpy(data, blob.data(), *DataSize);
return data;
ArgumentMap output;
output["buf"] = data;
output["width"] = (int)mid.front().columns();
output["height"] = (int)mid.front().rows();
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Spin(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Spin(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -7,7 +7,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Squish(string type, string *outType, char *BufferData, ArgumentMap Squish(string type, string *outType, char *BufferData,
size_t BufferLength, [[maybe_unused]] ArgumentMap Arguments, size_t BufferLength, [[maybe_unused]] ArgumentMap Arguments,
size_t *DataSize) { size_t *DataSize) {
VOption *options = VImage::option(); VOption *options = VImage::option();
@ -48,5 +48,10 @@ char *Squish(string type, string *outType, char *BufferData,
*outType = "gif"; *outType = "gif";
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = final.width();
output["height"] = vips_image_get_page_height(final.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Squish(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Squish(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Swirl(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Swirl(string type, string *outType, char *BufferData, size_t BufferLength,
[[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) { [[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
@ -72,5 +72,10 @@ char *Swirl(string type, string *outType, char *BufferData, size_t BufferLength,
void *buf; void *buf;
final.write_to_buffer(("." + *outType).c_str(), &buf, DataSize); final.write_to_buffer(("." + *outType).c_str(), &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = final.width();
output["height"] = vips_image_get_page_height(final.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Swirl(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Swirl(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -9,7 +9,7 @@
using namespace std; using namespace std;
using namespace Magick; using namespace Magick;
char *Tile(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Tile(string type, string *outType, char *BufferData, size_t BufferLength,
[[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) { [[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) {
Blob blob; Blob blob;
@ -61,5 +61,11 @@ char *Tile(string type, string *outType, char *BufferData, size_t BufferLength,
char *data = (char *)malloc(*DataSize); char *data = (char *)malloc(*DataSize);
memcpy(data, blob.data(), *DataSize); memcpy(data, blob.data(), *DataSize);
return data;
ArgumentMap output;
output["buf"] = data;
output["width"] = (int)mid.front().columns();
output["height"] = (int)mid.front().rows();
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Tile(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Tile(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,13 +5,18 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *ToGif(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap ToGif(string type, string *outType, char *BufferData, size_t BufferLength,
[[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) { [[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) {
if (type == "gif") { if (type == "gif") {
*DataSize = BufferLength; *DataSize = BufferLength;
char *data = (char *)malloc(BufferLength); char *data = (char *)malloc(BufferLength);
memcpy(data, BufferData, BufferLength); memcpy(data, BufferData, BufferLength);
return data;
ArgumentMap output;
output["buf"] = data;
return output;
} else { } else {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
@ -23,6 +28,11 @@ char *ToGif(string type, string *outType, char *BufferData, size_t BufferLength,
in.write_to_buffer(".gif", &buf, DataSize); in.write_to_buffer(".gif", &buf, DataSize);
*outType = "gif"; *outType = "gif";
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = in.width();
output["height"] = vips_image_get_page_height(in.get_image());
return output;
} }
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* ToGif(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap ToGif(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Uncanny(string type, string *outType, char *BufferData, ArgumentMap Uncanny(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
string caption = GetArgument<string>(Arguments, "caption"); string caption = GetArgument<string>(Arguments, "caption");
string caption2 = GetArgument<string>(Arguments, "caption2"); string caption2 = GetArgument<string>(Arguments, "caption2");
@ -97,5 +97,10 @@ char *Uncanny(string type, string *outType, char *BufferData,
("." + *outType).c_str(), &buf, DataSize, ("." + *outType).c_str(), &buf, DataSize,
*outType == "gif" ? VImage::option()->set("reoptimise", 1) : 0); *outType == "gif" ? VImage::option()->set("reoptimise", 1) : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = final.width();
output["height"] = vips_image_get_page_height(final.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Uncanny(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Uncanny(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -6,7 +6,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Uncaption(string type, string *outType, char *BufferData, ArgumentMap Uncaption(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
float tolerance = GetArgumentWithFallback<float>(Arguments, "tolerance", 0.5); float tolerance = GetArgumentWithFallback<float>(Arguments, "tolerance", 0.5);
@ -50,5 +50,10 @@ char *Uncaption(string type, string *outType, char *BufferData,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = final.width();
output["height"] = vips_image_get_page_height(final.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Uncaption(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Uncaption(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -9,7 +9,7 @@
using namespace std; using namespace std;
using namespace Magick; using namespace Magick;
char *Wall(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Wall(string type, string *outType, char *BufferData, size_t BufferLength,
[[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) { [[maybe_unused]] ArgumentMap Arguments, size_t *DataSize) {
Blob blob; Blob blob;
@ -54,5 +54,11 @@ char *Wall(string type, string *outType, char *BufferData, size_t BufferLength,
char *data = (char *)malloc(*DataSize); char *data = (char *)malloc(*DataSize);
memcpy(data, blob.data(), *DataSize); memcpy(data, blob.data(), *DataSize);
return data;
ArgumentMap output;
output["buf"] = data;
output["width"] = (int)mid.front().columns();
output["height"] = (int)mid.front().rows();
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Wall(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Wall(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -6,7 +6,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Watermark(string type, string *outType, char *BufferData, ArgumentMap Watermark(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
string water = GetArgument<string>(Arguments, "water"); string water = GetArgument<string>(Arguments, "water");
int gravity = GetArgument<int>(Arguments, "gravity"); int gravity = GetArgument<int>(Arguments, "gravity");
@ -150,5 +150,10 @@ char *Watermark(string type, string *outType, char *BufferData,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = final.width();
output["height"] = vips_image_get_page_height(final.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Watermark(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Watermark(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Whisper(string type, string *outType, char *BufferData, ArgumentMap Whisper(string type, string *outType, char *BufferData,
size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) {
string caption = GetArgument<string>(Arguments, "caption"); string caption = GetArgument<string>(Arguments, "caption");
string basePath = GetArgument<string>(Arguments, "basePath"); string basePath = GetArgument<string>(Arguments, "basePath");
@ -82,5 +82,10 @@ char *Whisper(string type, string *outType, char *BufferData,
? VImage::option()->set("dither", 0)->set("reoptimise", 1) ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = width;
output["height"] = pageHeight;
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Whisper(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Whisper(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -5,7 +5,7 @@
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Zamn(string type, string *outType, char *BufferData, size_t BufferLength, ArgumentMap Zamn(string type, string *outType, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
string basePath = GetArgument<string>(Arguments, "basePath"); string basePath = GetArgument<string>(Arguments, "basePath");
@ -43,5 +43,10 @@ char *Zamn(string type, string *outType, char *BufferData, size_t BufferLength,
void *buf; void *buf;
final.write_to_buffer(("." + *outType).c_str(), &buf, DataSize); final.write_to_buffer(("." + *outType).c_str(), &buf, DataSize);
return (char *)buf; ArgumentMap output;
output["buf"] = (char *)buf;
output["width"] = final.width();
output["height"] = vips_image_get_page_height(final.get_image());
return output;
} }

View File

@ -4,5 +4,5 @@
using std::string; using std::string;
char* Zamn(string type, string* outType, char* BufferData, size_t BufferLength, ArgumentMap Zamn(string type, string* outType, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize); ArgumentMap Arguments, size_t* DataSize);

View File

@ -50,7 +50,9 @@ export default function run(object) {
const result = img.image(object.cmd, objectWithFixedType); const result = img.image(object.cmd, objectWithFixedType);
const returnObject = { const returnObject = {
buffer: result.data, buffer: result.data,
fileExtension: result.type fileExtension: result.type,
width: result.width,
height: result.height
}; };
resolve(returnObject); resolve(returnObject);
} catch (e) { } catch (e) {

View File

@ -135,7 +135,9 @@ function waitForWorker(worker) {
worker.once("message", (data) => { worker.once("message", (data) => {
resolve({ resolve({
buffer: Buffer.from([...data.buffer]), buffer: Buffer.from([...data.buffer]),
type: data.fileExtension type: data.fileExtension,
width: data.width,
height: data.height
}); });
}); });
worker.once("error", reject); worker.once("error", reject);