Deduplicate vips shutdown, reformat natives, remove soos alias

This commit is contained in:
Essem 2022-12-28 17:01:50 -06:00
parent 5d8974d177
commit 3c16599126
No known key found for this signature in database
GPG key ID: 7D497397CC3A2A8C
81 changed files with 360 additions and 464 deletions

1
.clang-format Normal file
View file

@ -0,0 +1 @@
BasedOnStyle: google

View file

@ -6,7 +6,7 @@ class SooSCommand extends ImageCommand {
}; };
static description = "\"Loops\" an image sequence by reversing it when it's finished"; static description = "\"Loops\" an image sequence by reversing it when it's finished";
static aliases = ["bounce", "boomerang"]; static aliases = ["boomerang"];
static requiresGIF = true; static requiresGIF = true;
static noImage = "You need to provide an image/GIF to loop!"; static noImage = "You need to provide an image/GIF to loop!";

View file

@ -195,6 +195,7 @@
"Pizza Tower", "Pizza Tower",
"ANTONBLAST", "ANTONBLAST",
"[object Object]", "[object Object]",
"Xonotic",
"The clock is ticking." "The clock is ticking."
] ]
} }

View file

@ -1,9 +1,9 @@
#include "common.h"
#include <map> #include <map>
#include <string> #include <string>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -17,8 +17,7 @@ char *Blur(string *type, char *BufferData, size_t BufferLength,
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
// TODO: find a better way to calculate the intensity for GIFs without // TODO: find a better way to calculate the intensity for GIFs without
// splitting frames // splitting frames
@ -28,8 +27,5 @@ char *Blur(string *type, char *BufferData, size_t BufferLength,
void *buf; void *buf;
out.write_to_buffer(("." + *type).c_str(), &buf, DataSize); out.write_to_buffer(("." + *type).c_str(), &buf, DataSize);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* Blur(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* Blur(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,14 +1,14 @@
#include "common.h"
#include <math.h> #include <math.h>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Bounce(string *type, char *BufferData, size_t BufferLength, char *Bounce(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
VOption *options = VImage::option(); VOption *options = VImage::option();
VImage in = VImage in =
@ -17,8 +17,7 @@ char *Bounce(string *type, char *BufferData, size_t BufferLength,
*type == "gif" ? options->set("n", -1)->set("access", "sequential") *type == "gif" ? options->set("n", -1)->set("access", "sequential")
: options) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -31,7 +30,8 @@ char *Bounce(string *type, char *BufferData, size_t BufferLength,
VImage img_frame = VImage img_frame =
*type == "gif" ? in.crop(0, i * pageHeight, width, pageHeight) : in; *type == "gif" ? in.crop(0, i * pageHeight, width, pageHeight) : in;
double height = halfHeight * ((abs(sin(i * mult)) * -1) + 1); double height = halfHeight * ((abs(sin(i * mult)) * -1) + 1);
VImage embedded = img_frame.embed(0, height, width, pageHeight + halfHeight); VImage embedded =
img_frame.embed(0, height, width, pageHeight + halfHeight);
img.push_back(embedded); img.push_back(embedded);
} }
VImage final = VImage::arrayjoin(img, VImage::option()->set("across", 1)); VImage final = VImage::arrayjoin(img, VImage::option()->set("across", 1));
@ -46,7 +46,5 @@ char *Bounce(string *type, char *BufferData, size_t BufferLength,
*type = "gif"; *type = "gif";
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,15 +1,13 @@
#include "common.h"
#include <map> #include <map>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Caption(string *type, char *BufferData, size_t BufferLength, char *Caption(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { 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");
string basePath = GetArgument<string>(Arguments, "basePath"); string basePath = GetArgument<string>(Arguments, "basePath");
@ -21,8 +19,7 @@ char *Caption(string *type, char *BufferData, size_t BufferLength,
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int size = width / 10; int size = width / 10;
@ -73,10 +70,7 @@ char *Caption(string *type, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *type).c_str(), &buf, DataSize, ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* Caption(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* Caption(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,15 +1,14 @@
#include "common.h"
#include <map> #include <map>
#include <string> #include <string>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *CaptionTwo(string *type, char *BufferData, size_t BufferLength, char *CaptionTwo(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { 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");
string font = GetArgument<string>(Arguments, "font"); string font = GetArgument<string>(Arguments, "font");
@ -22,8 +21,7 @@ char *CaptionTwo(string *type, char *BufferData, size_t BufferLength,
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int size = width / 13; int size = width / 13;
@ -76,10 +74,7 @@ char *CaptionTwo(string *type, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *type).c_str(), &buf, DataSize, ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* CaptionTwo(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* CaptionTwo(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,4 +1,3 @@
#include "common.h"
#include <Magick++.h> #include <Magick++.h>
#include <cstring> #include <cstring>
@ -7,12 +6,13 @@
#include <map> #include <map>
#include <string> #include <string>
#include "common.h"
using namespace std; using namespace std;
using namespace Magick; using namespace Magick;
char *Circle(string *type, char *BufferData, size_t BufferLength, char *Circle(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
Blob blob; Blob blob;
list<Image> frames; list<Image> frames;
@ -45,7 +45,7 @@ char *Circle(string *type, char *BufferData, size_t BufferLength,
writeImages(blurred.begin(), blurred.end(), &blob); writeImages(blurred.begin(), blurred.end(), &blob);
*DataSize = blob.length(); *DataSize = blob.length();
// 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);

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* Circle(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* Circle(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,9 +1,9 @@
#include "common.h"
#include <map> #include <map>
#include <string> #include <string>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -12,7 +12,6 @@ VImage sepia = VImage::new_matrixv(3, 3, 0.3588, 0.7044, 0.1368, 0.2990, 0.5870,
char *Colors(string *type, char *BufferData, size_t BufferLength, char *Colors(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
string color = GetArgument<string>(Arguments, "color"); string color = GetArgument<string>(Arguments, "color");
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
@ -33,8 +32,5 @@ char *Colors(string *type, char *BufferData, size_t BufferLength,
void *buf; void *buf;
out.write_to_buffer(("." + *type).c_str(), &buf, DataSize); out.write_to_buffer(("." + *type).c_str(), &buf, DataSize);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* Colors(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* Colors(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,13 +1,13 @@
#pragma once #pragma once
#include <variant>
#include <string>
#include <map> #include <map>
#include <string>
#include <unordered_map> #include <unordered_map>
#include <variant>
using std::map;
using std::string; using std::string;
using std::variant; using std::variant;
using std::map;
typedef variant<string, float, bool, int> ArgumentVariant; typedef variant<string, float, bool, int> ArgumentVariant;
typedef map<string, ArgumentVariant> ArgumentMap; typedef map<string, ArgumentVariant> ArgumentMap;
@ -25,19 +25,21 @@ template <typename T>
T GetArgumentWithFallback(ArgumentMap map, string key, T fallback) { T GetArgumentWithFallback(ArgumentMap map, string key, T fallback) {
try { try {
return std::get<T>(map.at(key)); return std::get<T>(map.at(key));
} catch (...) { // this is, not great... } catch (...) { // this is, not great...
return fallback; return fallback;
} }
} }
#define MAP_HAS(ARRAY, KEY) (ARRAY.count(KEY) > 0) #define MAP_HAS(ARRAY, KEY) (ARRAY.count(KEY) > 0)
#define MAP_GET(ARRAY, KEY, TYPE) (MAP_HAS(ARRAY, KEY) ? get<TYPE>(ARRAY.at(KEY)) : NULL) // C++ has forced my hand #define MAP_GET(ARRAY, KEY, TYPE) \
#define MAP_GET_FALLBACK(ARRAY, KEY, TYPE, FALLBACK) (MAP_HAS(ARRAY, KEY) ? get<TYPE>(ARRAY.at(KEY)) : FALLBACK) (MAP_HAS(ARRAY, KEY) ? get<TYPE>(ARRAY.at(KEY)) \
: NULL) // C++ has forced my hand
#define MAP_GET_FALLBACK(ARRAY, KEY, TYPE, FALLBACK) \
(MAP_HAS(ARRAY, KEY) ? get<TYPE>(ARRAY.at(KEY)) : FALLBACK)
#define ARG_TYPES std::variant<string, bool, int, float> #define ARG_TYPES std::variant<string, bool, int, float>
const std::unordered_map<std::string, std::string> fontPaths { const std::unordered_map<std::string, std::string> fontPaths{
{"futura", "assets/fonts/caption.otf"}, {"futura", "assets/fonts/caption.otf"},
{"helvetica", "assets/fonts/caption2.ttf"}, {"helvetica", "assets/fonts/caption2.ttf"},
{"roboto", "assets/fonts/reddit.ttf"} {"roboto", "assets/fonts/reddit.ttf"}};
};

View file

@ -1,14 +1,14 @@
#include "common.h"
#include <map> #include <map>
#include <string> #include <string>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Crop(string *type, char *BufferData, size_t BufferLength, char *Crop(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
VImage in = VImage in =
@ -44,10 +44,7 @@ char *Crop(string *type, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *type).c_str(), &buf, DataSize, ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* Crop(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* Crop(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,13 +1,13 @@
#include "common.h"
#include <map> #include <map>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Deepfry(string *type, char *BufferData, size_t BufferLength, char *Deepfry(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
VImage in = VImage in =
@ -15,8 +15,7 @@ char *Deepfry(string *type, char *BufferData, size_t BufferLength,
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -49,16 +48,13 @@ char *Deepfry(string *type, char *BufferData, size_t BufferLength,
VImage::option()->set("Q", 1)->set("strip", true)); VImage::option()->set("Q", 1)->set("strip", true));
final = VImage::new_from_buffer(jpgBuf, jpgLength, ""); final = VImage::new_from_buffer(jpgBuf, jpgLength, "");
final.set(VIPS_META_PAGE_HEIGHT, pageHeight); final.set(VIPS_META_PAGE_HEIGHT, pageHeight);
if (*type == "gif") if (*type == "gif") final.set("delay", fried.get_array_int("delay"));
final.set("delay", fried.get_array_int("delay"));
} }
void *buf; void *buf;
final.write_to_buffer(("." + *type).c_str(), &buf, DataSize, final.write_to_buffer(
*type == "gif" ? VImage::option()->set("dither", 0) : 0); ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0) : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* Deepfry(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* Deepfry(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* Explode(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* Explode(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,15 +1,14 @@
#include "common.h"
#include <map> #include <map>
#include <string> #include <string>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Flag(string *type, char *BufferData, size_t BufferLength, char *Flag(string *type, 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");
@ -20,8 +19,7 @@ char *Flag(string *type, char *BufferData, size_t BufferLength,
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -31,8 +29,8 @@ char *Flag(string *type, char *BufferData, size_t BufferLength,
VImage overlayInput = VImage::new_from_file(assetPath.c_str()); VImage overlayInput = VImage::new_from_file(assetPath.c_str());
VImage overlayImage = overlayInput.resize( VImage overlayImage = overlayInput.resize(
(double)width / (double)overlayInput.width(), (double)width / (double)overlayInput.width(),
VImage::option()->set("vscale", (double)pageHeight / VImage::option()->set(
(double)overlayInput.height())); "vscale", (double)pageHeight / (double)overlayInput.height()));
if (!overlayImage.has_alpha()) { if (!overlayImage.has_alpha()) {
overlayImage = overlayImage.bandjoin(127); overlayImage = overlayImage.bandjoin(127);
} else { } else {
@ -56,9 +54,7 @@ char *Flag(string *type, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *type).c_str(), &buf, DataSize, ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* Flag(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* Flag(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,15 +1,13 @@
#include "common.h"
#include <map> #include <map>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Flip(string *type, char *BufferData, size_t BufferLength, char *Flip(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
bool flop = GetArgument<bool>(Arguments, "flop"); bool flop = GetArgument<bool>(Arguments, "flop");
VImage in = VImage::new_from_buffer(BufferData, BufferLength, "", VImage in = VImage::new_from_buffer(BufferData, BufferLength, "",
@ -18,8 +16,7 @@ char *Flip(string *type, char *BufferData, size_t BufferLength,
"access", "sequential") "access", "sequential")
: 0) : 0)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
VImage out; VImage out;
if (flop) { if (flop) {
@ -44,9 +41,7 @@ char *Flip(string *type, char *BufferData, size_t BufferLength,
out.write_to_buffer( out.write_to_buffer(
("." + *type).c_str(), &buf, DataSize, ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* Flip(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* Flip(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,16 +1,14 @@
#include "common.h"
#include <algorithm> #include <algorithm>
#include <map> #include <map>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Freeze(string *type, char *BufferData, size_t BufferLength, char *Freeze(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { 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,22 +40,17 @@ char *Freeze(string *type, char *BufferData, size_t BufferLength,
*DataSize = BufferLength + 19; *DataSize = BufferLength + 19;
break; break;
} }
if (none) if (none) *DataSize = BufferLength;
*DataSize = BufferLength;
vips_error_clear();
vips_thread_shutdown();
return newData; return newData;
} else if (frame >= 0 && !loop) { } else if (frame >= 0 && !loop) {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
VImage in = VImage in = VImage::new_from_buffer(
VImage::new_from_buffer(BufferData, BufferLength, "", BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
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());
@ -69,9 +62,6 @@ char *Freeze(string *type, char *BufferData, size_t BufferLength,
void *buf; void *buf;
out.write_to_buffer(("." + *type).c_str(), &buf, DataSize); out.write_to_buffer(("." + *type).c_str(), &buf, DataSize);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} else { } else {
lastPos = (char *)memchr(fileData, '\x21', BufferLength); lastPos = (char *)memchr(fileData, '\x21', BufferLength);
@ -86,11 +76,8 @@ char *Freeze(string *type, char *BufferData, size_t BufferLength,
none = false; none = false;
break; break;
} }
if (none) if (none) *DataSize = BufferLength;
*DataSize = BufferLength;
vips_error_clear();
vips_thread_shutdown();
return fileData; return fileData;
} }
} }

View file

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

View file

@ -1,13 +1,12 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Gamexplain(string *type, char *BufferData, size_t BufferLength, char *Gamexplain(string *type, 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");
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
@ -16,8 +15,7 @@ char *Gamexplain(string *type, char *BufferData, size_t BufferLength,
VImage::new_from_buffer(BufferData, BufferLength, "", VImage::new_from_buffer(BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
string assetPath = basePath + "assets/images/gamexplain.png"; string assetPath = basePath + "assets/images/gamexplain.png";
VImage tmpl = VImage::new_from_file(assetPath.c_str()); VImage tmpl = VImage::new_from_file(assetPath.c_str());
@ -45,10 +43,7 @@ char *Gamexplain(string *type, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *type).c_str(), &buf, DataSize, ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,13 +1,12 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Globe(string *type, char *BufferData, size_t BufferLength, char *Globe(string *type, 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");
VOption *options = VImage::option(); VOption *options = VImage::option();
@ -16,10 +15,9 @@ char *Globe(string *type, char *BufferData, size_t BufferLength,
VImage::new_from_buffer( VImage::new_from_buffer(
BufferData, BufferLength, "", BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1)->set("access", "sequential") *type == "gif" ? options->set("n", -1)->set("access", "sequential")
: options) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -28,17 +26,15 @@ char *Globe(string *type, char *BufferData, size_t BufferLength,
double size = min(width, pageHeight); double size = min(width, pageHeight);
string diffPath = basePath + "assets/images/globediffuse.png"; string diffPath = basePath + "assets/images/globediffuse.png";
VImage diffuse = VImage diffuse = VImage::new_from_file(diffPath.c_str())
VImage::new_from_file(diffPath.c_str()) .resize(size / 500.0, VImage::option()->set(
.resize(size / 500.0, "kernel", VIPS_KERNEL_CUBIC)) /
VImage::option()->set("kernel", VIPS_KERNEL_CUBIC)) / 255;
255;
string specPath = basePath + "assets/images/globespec.png"; string specPath = basePath + "assets/images/globespec.png";
VImage specular = VImage specular = VImage::new_from_file(specPath.c_str())
VImage::new_from_file(specPath.c_str()) .resize(size / 500.0, VImage::option()->set(
.resize(size / 500.0, "kernel", VIPS_KERNEL_CUBIC));
VImage::option()->set("kernel", VIPS_KERNEL_CUBIC));
string distortPath = basePath + "assets/images/spheremap.png"; string distortPath = basePath + "assets/images/spheremap.png";
VImage distort = VImage distort =
@ -73,7 +69,5 @@ char *Globe(string *type, char *BufferData, size_t BufferLength,
void *buf; void *buf;
final.write_to_buffer(".gif", &buf, DataSize); final.write_to_buffer(".gif", &buf, DataSize);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,7 +1,7 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -34,7 +34,5 @@ char *Homebrew(string *type, ArgumentMap Arguments, size_t *DataSize) {
*type = "png"; *type = "png";
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,16 +1,16 @@
#include "common.h"
#include <napi.h> #include <napi.h>
#include <iostream>
#include <map> #include <map>
#include <string> #include <string>
#include <iostream>
#include "blur.h" #include "blur.h"
#include "bounce.h" #include "bounce.h"
#include "colors.h"
#include "caption.h" #include "caption.h"
#include "caption2.h" #include "caption2.h"
#include "circle.h" #include "circle.h"
#include "colors.h"
#include "common.h"
#include "crop.h" #include "crop.h"
#include "deepfry.h" #include "deepfry.h"
#include "explode.h" #include "explode.h"
@ -25,7 +25,6 @@
#include "magik.h" #include "magik.h"
#include "meme.h" #include "meme.h"
#include "mirror.h" #include "mirror.h"
#include "swirl.h"
#include "motivate.h" #include "motivate.h"
#include "reddit.h" #include "reddit.h"
#include "resize.h" #include "resize.h"
@ -36,6 +35,7 @@
#include "speed.h" #include "speed.h"
#include "spin.h" #include "spin.h"
#include "squish.h" #include "squish.h"
#include "swirl.h"
#include "tile.h" #include "tile.h"
#include "togif.h" #include "togif.h"
#include "uncanny.h" #include "uncanny.h"
@ -52,50 +52,50 @@
using namespace std; using namespace std;
std::map<std::string, char* (*)(string *type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize)> FunctionMap = { std::map<std::string,
{"blur", &Blur}, char* (*)(string* type, char* BufferData, size_t BufferLength,
{"bounce", &Bounce}, ArgumentMap Arguments, size_t* DataSize)>
{"caption", &Caption}, FunctionMap = {{"blur", &Blur},
{"captionTwo", &CaptionTwo}, {"bounce", &Bounce},
{"circle", &Circle}, {"caption", &Caption},
{"colors", &Colors}, {"captionTwo", &CaptionTwo},
{"crop", &Crop}, {"circle", &Circle},
{"deepfry", &Deepfry}, {"colors", &Colors},
{"explode", &Explode}, {"crop", &Crop},
{"flag", &Flag}, {"deepfry", &Deepfry},
{"flip", &Flip}, {"explode", &Explode},
{"freeze", &Freeze}, {"flag", &Flag},
{"gamexplain", Gamexplain}, {"flip", &Flip},
{"globe", Globe}, {"freeze", &Freeze},
{"invert", Invert}, {"gamexplain", Gamexplain},
{"jpeg", Jpeg}, {"globe", Globe},
{"magik", Magik}, {"invert", Invert},
{"meme", Meme}, {"jpeg", Jpeg},
{"mirror", Mirror}, {"magik", Magik},
{"motivate", Motivate}, {"meme", Meme},
{"reddit", Reddit}, {"mirror", Mirror},
{"resize", Resize}, {"motivate", Motivate},
{"reverse", Reverse}, {"reddit", Reddit},
{"scott", Scott}, {"resize", Resize},
{"snapchat", Snapchat}, {"reverse", Reverse},
{"speed", &Speed}, {"scott", Scott},
{"spin", Spin}, {"snapchat", Snapchat},
{"squish", Squish}, {"speed", &Speed},
{"swirl", Swirl}, {"spin", Spin},
{"tile", Tile}, {"squish", Squish},
{"togif", ToGif}, {"swirl", Swirl},
{"uncanny", Uncanny}, {"tile", Tile},
{"uncaption", &Uncaption}, {"togif", ToGif},
{"wall", Wall}, {"uncanny", Uncanny},
{"watermark", &Watermark}, {"uncaption", &Uncaption},
{"whisper", Whisper}, {"wall", Wall},
{"zamn", Zamn} {"watermark", &Watermark},
}; {"whisper", Whisper},
{"zamn", Zamn}};
std::map<std::string, char* (*)(string *type, ArgumentMap Arguments, size_t* DataSize)> NoInputFunctionMap = { std::map<std::string,
{"homebrew", Homebrew}, char* (*)(string* type, ArgumentMap Arguments, size_t* DataSize)>
{"sonic", Sonic} NoInputFunctionMap = {{"homebrew", Homebrew}, {"sonic", Sonic}};
};
bool isNapiValueInt(Napi::Env& env, Napi::Value& num) { bool isNapiValueInt(Napi::Env& env, Napi::Value& num) {
return env.Global() return env.Global()
@ -108,21 +108,23 @@ bool isNapiValueInt(Napi::Env& env, Napi::Value& num) {
.Value(); .Value();
} }
Napi::Value ProcessImage(const Napi::CallbackInfo &info) { Napi::Value ProcessImage(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env(); Napi::Env env = info.Env();
Napi::Object result = Napi::Object::New(env); Napi::Object result = Napi::Object::New(env);
try { try {
string command = info[0].As<Napi::String>().Utf8Value(); string command = info[0].As<Napi::String>().Utf8Value();
Napi::Object obj = info[1].As<Napi::Object>(); Napi::Object obj = info[1].As<Napi::Object>();
string type = obj.Has("type") ? obj.Get("type").As<Napi::String>().Utf8Value() : NULL; string type =
obj.Has("type") ? obj.Get("type").As<Napi::String>().Utf8Value() : NULL;
Napi::Array properties = obj.GetPropertyNames(); Napi::Array properties = obj.GetPropertyNames();
ArgumentMap Arguments; ArgumentMap Arguments;
for (unsigned int i = 0; i < properties.Length(); i++) { for (unsigned int i = 0; i < properties.Length(); i++) {
string property = properties.Get(uint32_t(i)).As<Napi::String>().Utf8Value(); string property =
properties.Get(uint32_t(i)).As<Napi::String>().Utf8Value();
if (property == "data") { if (property == "data") {
continue; continue;
@ -142,23 +144,30 @@ Napi::Value ProcessImage(const Napi::CallbackInfo &info) {
} }
} else { } else {
throw "Unimplemented value type passed to image native."; throw "Unimplemented value type passed to image native.";
//Arguments[property] = val; // Arguments[property] = val;
} }
} }
size_t length = 0; size_t length = 0;
char* buf; char* buf;
if (obj.Has("data")) { if (obj.Has("data")) {
Napi::Buffer<char> data = obj.Has("data") ? obj.Get("data").As<Napi::Buffer<char>>() : Napi::Buffer<char>::New(env, 0); Napi::Buffer<char> data = obj.Has("data")
buf = FunctionMap.at(command)(&type, data.Data(), data.Length(), Arguments, &length); ? obj.Get("data").As<Napi::Buffer<char>>()
: Napi::Buffer<char>::New(env, 0);
buf = FunctionMap.at(command)(&type, data.Data(), data.Length(),
Arguments, &length);
} else { } else {
buf = NoInputFunctionMap.at(command)(&type, Arguments, &length); buf = NoInputFunctionMap.at(command)(&type, Arguments, &length);
} }
result.Set("data", Napi::Buffer<char>::New(env, buf, length, [](Napi::Env env, void* data) {
free(data); vips_error_clear();
})); vips_thread_shutdown();
result.Set("data", Napi::Buffer<char>::New(
env, buf, length,
[](Napi::Env env, void* data) { free(data); }));
result.Set("type", type); result.Set("type", type);
} 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 (...) {
Napi::Error::New(env, "Unknown error").ThrowAsJavaScriptException(); Napi::Error::New(env, "Unknown error").ThrowAsJavaScriptException();
@ -167,30 +176,30 @@ Napi::Value ProcessImage(const Napi::CallbackInfo &info) {
return result; return result;
} }
Napi::Object Init(Napi::Env env, Napi::Object exports){ Napi::Object Init(Napi::Env env, Napi::Object exports) {
#ifdef _WIN32 #ifdef _WIN32
Magick::InitializeMagick(""); Magick::InitializeMagick("");
#endif #endif
if (vips_init("")) if (vips_init("")) vips_error_exit(NULL);
vips_error_exit(NULL); exports.Set(Napi::String::New(env, "image"),
exports.Set(Napi::String::New(env, "image"), Napi::Function::New(env, ProcessImage)); // new function handler Napi::Function::New(env, ProcessImage)); // new function handler
Napi::Array arr = Napi::Array::New(env); Napi::Array arr = Napi::Array::New(env);
size_t i = 0; size_t i = 0;
for (auto const& imap: FunctionMap) { for (auto const& imap : FunctionMap) {
Napi::HandleScope scope(env); Napi::HandleScope scope(env);
arr[i] = Napi::String::New(env, imap.first); arr[i] = Napi::String::New(env, imap.first);
i++; i++;
} }
for (auto const& imap: NoInputFunctionMap) { for (auto const& imap : NoInputFunctionMap) {
Napi::HandleScope scope(env); Napi::HandleScope scope(env);
arr[i] = Napi::String::New(env, imap.first); arr[i] = Napi::String::New(env, imap.first);
i++; i++;
} }
exports.Set(Napi::String::New(env, "funcs"), arr); exports.Set(Napi::String::New(env, "funcs"), arr);
return exports; return exports;
} }
NODE_API_MODULE(addon, Init) NODE_API_MODULE(addon, Init)

View file

@ -1,21 +1,19 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Invert(string *type, char *BufferData, size_t BufferLength, char *Invert(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
VImage in = VImage in =
VImage::new_from_buffer(BufferData, BufferLength, "", VImage::new_from_buffer(BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
VImage noAlpha = VImage noAlpha =
in.extract_band(0, VImage::option()->set("n", in.bands() - 1)); in.extract_band(0, VImage::option()->set("n", in.bands() - 1));
@ -25,7 +23,5 @@ char *Invert(string *type, char *BufferData, size_t BufferLength,
void *buf; void *buf;
out.write_to_buffer(("." + *type).c_str(), &buf, DataSize); out.write_to_buffer(("." + *type).c_str(), &buf, DataSize);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,7 +1,7 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -16,8 +16,7 @@ char *Jpeg(string *type, char *BufferData, size_t BufferLength,
BufferData, BufferLength, "", BufferData, BufferLength, "",
VImage::option()->set("access", "sequential")->set("n", -1)) VImage::option()->set("access", "sequential")->set("n", -1))
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -53,18 +52,15 @@ char *Jpeg(string *type, char *BufferData, size_t BufferLength,
final.set("delay", in.get_array_int("delay")); final.set("delay", in.get_array_int("delay"));
} }
final.write_to_buffer(("." + *type).c_str(), &buf, DataSize, final.write_to_buffer(
*type == "gif" ? VImage::option()->set("dither", 0) ("." + *type).c_str(), &buf, DataSize,
: 0); *type == "gif" ? VImage::option()->set("dither", 0) : 0);
} else { } else {
VImage in = VImage::new_from_buffer(BufferData, BufferLength, ""); VImage in = VImage::new_from_buffer(BufferData, BufferLength, "");
in.write_to_buffer(".jpg", &buf, DataSize, in.write_to_buffer(".jpg", &buf, DataSize,
VImage::option()->set("Q", quality)->set("strip", true)); VImage::option()->set("Q", quality)->set("strip", true));
*type = "jpg"; *type = "jpg";
} }
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,16 +1,16 @@
#include "common.h"
#include <Magick++.h> #include <Magick++.h>
#include <cstring> #include <cstring>
#include <iostream> #include <iostream>
#include <list> #include <list>
#include "common.h"
using namespace std; using namespace std;
using namespace Magick; using namespace Magick;
char *Magik(string *type, char *BufferData, size_t BufferLength, char *Magik(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
Blob blob; Blob blob;
list<Image> frames; list<Image> frames;

View file

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

View file

@ -1,7 +1,7 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -18,8 +18,7 @@ char *Meme(string *type, char *BufferData, size_t BufferLength,
VImage::new_from_buffer(BufferData, BufferLength, "", VImage::new_from_buffer(BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -101,11 +100,10 @@ char *Meme(string *type, char *BufferData, size_t BufferLength,
} }
bottomOutline = (bottomOutline == zeroVec); bottomOutline = (bottomOutline == zeroVec);
VImage bottomInvert = bottomOutline.extract_band(3).invert(); VImage bottomInvert = bottomOutline.extract_band(3).invert();
bottomOutline = bottomOutline = bottomOutline
bottomOutline .extract_band(0, VImage::option()->set(
.extract_band(0, "n", bottomOutline.bands() - 1))
VImage::option()->set("n", bottomOutline.bands() - 1)) .bandjoin(bottomInvert);
.bandjoin(bottomInvert);
bottomText = bottomOutline.composite2(bottomIn, VIPS_BLEND_MODE_OVER); bottomText = bottomOutline.composite2(bottomIn, VIPS_BLEND_MODE_OVER);
} }
@ -134,9 +132,7 @@ char *Meme(string *type, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *type).c_str(), &buf, DataSize, ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,7 +1,7 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -16,8 +16,7 @@ char *Mirror(string *type, char *BufferData, size_t BufferLength,
VImage::new_from_buffer(BufferData, BufferLength, "", VImage::new_from_buffer(BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
VImage out; VImage out;
@ -61,7 +60,5 @@ char *Mirror(string *type, char *BufferData, size_t BufferLength,
void *buf; void *buf;
out.write_to_buffer(("." + *type).c_str(), &buf, DataSize); out.write_to_buffer(("." + *type).c_str(), &buf, DataSize);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,7 +1,7 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -18,8 +18,7 @@ char *Motivate(string *type, char *BufferData, size_t BufferLength,
VImage::new_from_buffer(BufferData, BufferLength, "", VImage::new_from_buffer(BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int size = width / 5; int size = width / 5;
@ -100,8 +99,7 @@ char *Motivate(string *type, char *BufferData, size_t BufferLength,
VImage::option()->set("background", 0x000000)->set("expand", true)); VImage::option()->set("background", 0x000000)->set("expand", true));
} }
if (bottom_text != "") { if (bottom_text != "") {
if (top_text == "") if (top_text == "") frame = bordered3;
frame = bordered3;
frame = frame.join( frame = frame.join(
bottomImage.gravity(VIPS_COMPASS_DIRECTION_NORTH, bordered3.width(), bottomImage.gravity(VIPS_COMPASS_DIRECTION_NORTH, bordered3.width(),
bottomImage.height() + (size / 4), bottomImage.height() + (size / 4),
@ -117,10 +115,9 @@ char *Motivate(string *type, char *BufferData, size_t BufferLength,
final.set(VIPS_META_PAGE_HEIGHT, height); final.set(VIPS_META_PAGE_HEIGHT, height);
void *buf; void *buf;
final.write_to_buffer(("." + *type).c_str(), &buf, DataSize, final.write_to_buffer(
*type == "gif" ? VImage::option()->set("dither", 1) : 0); ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 1) : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,13 +1,12 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Reddit(string *type, char *BufferData, size_t BufferLength, char *Reddit(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, 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");
@ -17,8 +16,7 @@ char *Reddit(string *type, char *BufferData, size_t BufferLength,
VImage::new_from_buffer(BufferData, BufferLength, "", VImage::new_from_buffer(BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
string assetPath = basePath + "assets/images/reddit.png"; string assetPath = basePath + "assets/images/reddit.png";
VImage tmpl = VImage::new_from_file(assetPath.c_str()); VImage tmpl = VImage::new_from_file(assetPath.c_str());
@ -62,9 +60,7 @@ char *Reddit(string *type, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *type).c_str(), &buf, DataSize, ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,7 +1,7 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -50,7 +50,5 @@ char *Resize(string *type, char *BufferData, size_t BufferLength,
void *buf; void *buf;
out.write_to_buffer(("." + *type).c_str(), &buf, DataSize); out.write_to_buffer(("." + *type).c_str(), &buf, DataSize);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,8 +1,8 @@
#include "common.h"
#include <algorithm> #include <algorithm>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -55,7 +55,5 @@ char *Reverse(string *type, char *BufferData, size_t BufferLength,
*type = "gif"; *type = "gif";
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,10 +1,11 @@
#include "common.h"
#include <Magick++.h> #include <Magick++.h>
#include <cstring> #include <cstring>
#include <iostream> #include <iostream>
#include <list> #include <list>
#include "common.h"
using namespace std; using namespace std;
using namespace Magick; using namespace Magick;
@ -56,7 +57,7 @@ char *Scott(string *type, char *BufferData, size_t BufferLength,
writeImages(mid.begin(), mid.end(), &blob); writeImages(mid.begin(), mid.end(), &blob);
*DataSize = blob.length(); *DataSize = blob.length();
char *data = (char *)malloc(*DataSize); char *data = (char *)malloc(*DataSize);
memcpy(data, blob.data(), *DataSize); memcpy(data, blob.data(), *DataSize);
return data; return data;

View file

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

View file

@ -1,7 +1,7 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -17,8 +17,7 @@ char *Snapchat(string *type, char *BufferData, size_t BufferLength,
VImage::new_from_buffer(BufferData, BufferLength, "", VImage::new_from_buffer(BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -66,9 +65,7 @@ char *Snapchat(string *type, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *type).c_str(), &buf, DataSize, ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,7 +1,7 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -32,7 +32,5 @@ char *Sonic(string *type, ArgumentMap Arguments, size_t *DataSize) {
*type = "png"; *type = "png";
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,18 +1,16 @@
#include "common.h"
#include <iostream> #include <iostream>
#include <map> #include <map>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
void *memset16(void *m, uint16_t val, size_t count) { void *memset16(void *m, uint16_t val, size_t count) {
uint16_t *buf = (uint16_t *)m; uint16_t *buf = (uint16_t *)m;
while (count--) while (count--) *buf++ = val;
*buf++ = val;
return m; return m;
} }
@ -21,8 +19,7 @@ char *vipsRemove(char *data, size_t length, size_t *DataSize, int speed) {
VImage in = VImage::new_from_buffer(data, length, "", options->set("n", -1)) VImage in = VImage::new_from_buffer(data, length, "", options->set("n", -1))
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -44,7 +41,6 @@ char *vipsRemove(char *data, size_t length, size_t *DataSize, int speed) {
char *Speed(string *type, char *BufferData, size_t BufferLength, char *Speed(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { 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);
@ -102,8 +98,5 @@ char *Speed(string *type, char *BufferData, size_t BufferLength,
*DataSize = BufferLength; *DataSize = BufferLength;
} }
vips_error_clear();
vips_thread_shutdown();
return fileData; return fileData;
} }

View file

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

View file

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

View file

@ -1,14 +1,14 @@
#include "common.h"
#include <math.h> #include <math.h>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Squish(string *type, char *BufferData, size_t BufferLength, char *Squish(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
VOption *options = VImage::option(); VOption *options = VImage::option();
VImage in = VImage in =
@ -17,8 +17,7 @@ char *Squish(string *type, char *BufferData, size_t BufferLength,
*type == "gif" ? options->set("n", -1)->set("access", "sequential") *type == "gif" ? options->set("n", -1)->set("access", "sequential")
: options) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -48,7 +47,5 @@ char *Squish(string *type, char *BufferData, size_t BufferLength,
*type = "gif"; *type = "gif";
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,21 +1,19 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Swirl(string *type, char *BufferData, size_t BufferLength, char *Swirl(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
VImage in = VImage in =
VImage::new_from_buffer(BufferData, BufferLength, "", VImage::new_from_buffer(BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
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());
@ -74,7 +72,5 @@ char *Swirl(string *type, char *BufferData, size_t BufferLength,
void *buf; void *buf;
final.write_to_buffer(".gif", &buf, DataSize); final.write_to_buffer(".gif", &buf, DataSize);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,16 +1,16 @@
#include "common.h"
#include <Magick++.h> #include <Magick++.h>
#include <cstring> #include <cstring>
#include <iostream> #include <iostream>
#include <list> #include <list>
#include "common.h"
using namespace std; using namespace std;
using namespace Magick; using namespace Magick;
char *Tile(string *type, char *BufferData, size_t BufferLength, char *Tile(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
Blob blob; Blob blob;
list<Image> frames; list<Image> frames;

View file

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

View file

@ -1,32 +1,26 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *ToGif(string *type, char *BufferData, size_t BufferLength, char *ToGif(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
if (*type == "gif") { if (*type == "gif") {
vips_error_clear();
vips_thread_shutdown();
*DataSize = BufferLength; *DataSize = BufferLength;
return BufferData; return BufferData;
} else { } else {
VOption *options = VImage::option()->set("access", "sequential"); VOption *options = VImage::option()->set("access", "sequential");
VImage in = VImage::new_from_buffer(BufferData, BufferLength, "", VImage in = VImage::new_from_buffer(
*type == "webp" ? options->set("n", -1) BufferData, BufferLength, "",
: options); *type == "webp" ? options->set("n", -1) : options);
void *buf; void *buf;
in.write_to_buffer(".gif", &buf, DataSize); in.write_to_buffer(".gif", &buf, DataSize);
*type = "gif"; *type = "gif";
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }
} }

View file

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

View file

@ -1,13 +1,12 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Uncanny(string *type, char *BufferData, size_t BufferLength, char *Uncanny(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { 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");
string font = GetArgument<string>(Arguments, "font"); string font = GetArgument<string>(Arguments, "font");
@ -94,11 +93,9 @@ char *Uncanny(string *type, char *BufferData, size_t BufferLength,
final.set(VIPS_META_PAGE_HEIGHT, 720); final.set(VIPS_META_PAGE_HEIGHT, 720);
void *buf; void *buf;
final.write_to_buffer(("." + *type).c_str(), &buf, DataSize, final.write_to_buffer(
*type == "gif" ? VImage::option()->set("reoptimise", 1) ("." + *type).c_str(), &buf, DataSize,
: 0); *type == "gif" ? VImage::option()->set("reoptimise", 1) : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,14 +1,13 @@
#include "common.h"
#include <map> #include <map>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Uncaption(string *type, char *BufferData, size_t BufferLength, char *Uncaption(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
float tolerance = GetArgumentWithFallback<float>(Arguments, "tolerance", 0.5); float tolerance = GetArgumentWithFallback<float>(Arguments, "tolerance", 0.5);
VOption *options = VImage::option(); VOption *options = VImage::option();
@ -17,10 +16,9 @@ char *Uncaption(string *type, char *BufferData, size_t BufferLength,
VImage::new_from_buffer( VImage::new_from_buffer(
BufferData, BufferLength, "", BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1)->set("access", "sequential") *type == "gif" ? options->set("n", -1)->set("access", "sequential")
: options) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -49,9 +47,7 @@ char *Uncaption(string *type, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *type).c_str(), &buf, DataSize, ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* Uncaption(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* Uncaption(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,16 +1,16 @@
#include "common.h"
#include <Magick++.h> #include <Magick++.h>
#include <cstring> #include <cstring>
#include <iostream> #include <iostream>
#include <list> #include <list>
#include "common.h"
using namespace std; using namespace std;
using namespace Magick; using namespace Magick;
char *Wall(string *type, char *BufferData, size_t BufferLength, char *Wall(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { ArgumentMap Arguments, size_t *DataSize) {
Blob blob; Blob blob;
list<Image> frames; list<Image> frames;

View file

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

View file

@ -1,14 +1,13 @@
#include "common.h"
#include <map> #include <map>
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
char *Watermark(string *type, char *BufferData, size_t BufferLength, char *Watermark(string *type, char *BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t *DataSize) { 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");
@ -31,8 +30,7 @@ char *Watermark(string *type, char *BufferData, size_t BufferLength,
VImage::new_from_buffer(BufferData, BufferLength, "", VImage::new_from_buffer(BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
string merged = basePath + water; string merged = basePath + water;
VImage watermark = VImage::new_from_file(merged.c_str()); VImage watermark = VImage::new_from_file(merged.c_str());
@ -59,30 +57,30 @@ char *Watermark(string *type, char *BufferData, size_t BufferLength,
int x = 0, y = 0; int x = 0, y = 0;
switch (gravity) { switch (gravity) {
case 1: case 1:
break; break;
case 2: case 2:
x = (width / 2) - (watermark.width() / 2); x = (width / 2) - (watermark.width() / 2);
break; break;
case 3: case 3:
x = width - watermark.width(); x = width - watermark.width();
break; break;
case 5: case 5:
x = (width / 2) - (watermark.width() / 2); x = (width / 2) - (watermark.width() / 2);
y = (pageHeight / 2) - (watermark.height() / 2); y = (pageHeight / 2) - (watermark.height() / 2);
break; break;
case 6: case 6:
x = width - watermark.width(); x = width - watermark.width();
y = (pageHeight / 2) - (watermark.height() / 2); y = (pageHeight / 2) - (watermark.height() / 2);
break; break;
case 8: case 8:
x = (width / 2) - (watermark.width() / 2); x = (width / 2) - (watermark.width() / 2);
y = pageHeight - watermark.height(); y = pageHeight - watermark.height();
break; break;
case 9: case 9:
x = width - watermark.width(); x = width - watermark.width();
y = pageHeight - watermark.height(); y = pageHeight - watermark.height();
break; break;
} }
vector<VImage> img; vector<VImage> img;
@ -149,9 +147,7 @@ char *Watermark(string *type, char *BufferData, size_t BufferLength,
final.write_to_buffer( final.write_to_buffer(
("." + *type).c_str(), &buf, DataSize, ("." + *type).c_str(), &buf, DataSize,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

@ -1,9 +1,8 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <map>
using std::map;
using std::string; using std::string;
char* Watermark(string* type, char* BufferData, size_t BufferLength, ArgumentMap Arguments, size_t* DataSize); char* Watermark(string* type, char* BufferData, size_t BufferLength,
ArgumentMap Arguments, size_t* DataSize);

View file

@ -1,7 +1,7 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -16,8 +16,7 @@ char *Whisper(string *type, char *BufferData, size_t BufferLength,
VImage::new_from_buffer(BufferData, BufferLength, "", VImage::new_from_buffer(BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -82,7 +81,5 @@ char *Whisper(string *type, char *BufferData, size_t BufferLength,
*type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1) *type == "gif" ? VImage::option()->set("dither", 0)->set("reoptimise", 1)
: 0); : 0);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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

View file

@ -1,7 +1,7 @@
#include "common.h"
#include <vips/vips8> #include <vips/vips8>
#include "common.h"
using namespace std; using namespace std;
using namespace vips; using namespace vips;
@ -15,8 +15,7 @@ char *Zamn(string *type, char *BufferData, size_t BufferLength,
VImage::new_from_buffer(BufferData, BufferLength, "", VImage::new_from_buffer(BufferData, BufferLength, "",
*type == "gif" ? options->set("n", -1) : options) *type == "gif" ? options->set("n", -1) : options)
.colourspace(VIPS_INTERPRETATION_sRGB); .colourspace(VIPS_INTERPRETATION_sRGB);
if (!in.has_alpha()) if (!in.has_alpha()) in = in.bandjoin(255);
in = in.bandjoin(255);
int width = in.width(); int width = in.width();
int pageHeight = vips_image_get_page_height(in.get_image()); int pageHeight = vips_image_get_page_height(in.get_image());
@ -29,13 +28,13 @@ char *Zamn(string *type, char *BufferData, size_t BufferLength,
for (int i = 0; i < nPages; i++) { for (int i = 0; i < nPages; i++) {
VImage img_frame = VImage img_frame =
*type == "gif" ? in.crop(0, i * pageHeight, width, pageHeight) : in; *type == "gif" ? in.crop(0, i * pageHeight, width, pageHeight) : in;
VImage composited = VImage composited = tmpl.insert(
tmpl.insert(img_frame.extract_band(0, VImage::option()->set("n", 3)) img_frame.extract_band(0, VImage::option()->set("n", 3))
.bandjoin(255) .bandjoin(255)
.resize(303.0 / (double)width, .resize(
VImage::option()->set( 303.0 / (double)width,
"vscale", 438.0 / (double)pageHeight)), VImage::option()->set("vscale", 438.0 / (double)pageHeight)),
310, 76); 310, 76);
img.push_back(composited); img.push_back(composited);
} }
VImage final = VImage::arrayjoin(img, VImage::option()->set("across", 1)); VImage final = VImage::arrayjoin(img, VImage::option()->set("across", 1));
@ -44,7 +43,5 @@ char *Zamn(string *type, char *BufferData, size_t BufferLength,
void *buf; void *buf;
final.write_to_buffer(("." + *type).c_str(), &buf, DataSize); final.write_to_buffer(("." + *type).c_str(), &buf, DataSize);
vips_error_clear();
vips_thread_shutdown();
return (char *)buf; return (char *)buf;
} }

View file

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