From 08e49537f9fe790a09cada03ce46cc35caa43d95 Mon Sep 17 00:00:00 2001 From: Essem Date: Mon, 12 Jul 2021 16:02:00 -0500 Subject: [PATCH] Added whisper --- assets/whisper.otf | Bin 0 -> 24708 bytes commands/image-editing/whisper.js | 21 +++++++ natives/image.cc | 6 +- natives/whisper.cc | 89 ++++++++++++++++++++++++++++++ natives/whisper.h | 5 ++ 5 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 assets/whisper.otf create mode 100644 commands/image-editing/whisper.js create mode 100644 natives/whisper.cc create mode 100644 natives/whisper.h diff --git a/assets/whisper.otf b/assets/whisper.otf new file mode 100644 index 0000000000000000000000000000000000000000..49ed5e75f5ef5c19e54d5ceb00e897ac934555dc GIT binary patch literal 24708 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 literal 0 HcmV?d00001 diff --git a/commands/image-editing/whisper.js b/commands/image-editing/whisper.js new file mode 100644 index 0000000..e0376cd --- /dev/null +++ b/commands/image-editing/whisper.js @@ -0,0 +1,21 @@ +const ImageCommand = require("../../classes/imageCommand.js"); + +class WhisperCommand extends ImageCommand { + params(args, url) { + const newArgs = args.filter(item => !item.includes(url)); + return { + caption: newArgs.join(" ").replaceAll("&", "\\&").replaceAll(">", "\\>").replaceAll("<", "\\<").replaceAll("\"", "\\"").replaceAll("'", "\\'").replaceAll("%", "\\%") + }; + } + + static description = "Adds a Whisper style caption to an image"; + static aliases = ["caption4"]; + static arguments = ["[text]"]; + + static requiresText = true; + static noText = "You need to provide some text to add a caption!"; + static noImage = "You need to provide an image to add a caption!"; + static command = "whisper"; +} + +module.exports = WhisperCommand; \ No newline at end of file diff --git a/natives/image.cc b/natives/image.cc index ca43fce..bccbd94 100644 --- a/natives/image.cc +++ b/natives/image.cc @@ -35,8 +35,9 @@ #include "trump.h" #include "uncaption.h" #include "wall.h" -#include "wdt.h" #include "watermark.h" +#include "wdt.h" +#include "whisper.h" Napi::Object Init(Napi::Env env, Napi::Object exports) { @@ -75,8 +76,9 @@ Napi::Object Init(Napi::Env env, Napi::Object exports) exports.Set(Napi::String::New(env, "trump"), Napi::Function::New(env, Trump)); exports.Set(Napi::String::New(env, "uncaption"), Napi::Function::New(env, Uncaption)); exports.Set(Napi::String::New(env, "wall"), Napi::Function::New(env, Wall)); - exports.Set(Napi::String::New(env, "wdt"), Napi::Function::New(env, Wdt)); exports.Set(Napi::String::New(env, "watermark"), Napi::Function::New(env, Watermark)); + exports.Set(Napi::String::New(env, "wdt"), Napi::Function::New(env, Wdt)); + exports.Set(Napi::String::New(env, "whisper"), Napi::Function::New(env, Whisper)); return exports; } diff --git a/natives/whisper.cc b/natives/whisper.cc new file mode 100644 index 0000000..626413a --- /dev/null +++ b/natives/whisper.cc @@ -0,0 +1,89 @@ +#include +#include + +#include + +using namespace std; +using namespace Magick; + +Napi::Value Whisper(const Napi::CallbackInfo &info) { + Napi::Env env = info.Env(); + + try { + Napi::Object obj = info[0].As(); + Napi::Buffer data = obj.Get("data").As>(); + string caption = obj.Get("caption").As().Utf8Value(); + string type = obj.Get("type").As().Utf8Value(); + int delay = + obj.Has("delay") ? obj.Get("delay").As().Int32Value() : 0; + + Blob blob; + + list frames; + list coalesced; + list captioned; + Blob caption_blob; + readImages(&frames, Blob(data.Data(), data.Length())); + + size_t width = frames.front().baseColumns(); + size_t height = frames.front().baseRows(); + + int dividedWidth = width / 150; + + Image caption_image; + caption_image.size(Geometry(to_string(width) + "x" + to_string(height))); + caption_image.backgroundColor("none"); + caption_image.fillColor("white"); + caption_image.font("Upright"); + caption_image.fontPointsize(width / 6); + caption_image.textGravity(Magick::CenterGravity); + caption_image.read("pango:" + caption); + caption_image.trim(); + caption_image.repage(); + Image caption_fill = caption_image; + caption_fill.extent(Geometry(width, height), Magick::CenterGravity); + caption_fill.channel(Magick::AlphaChannel); + caption_fill.morphology(Magick::EdgeOutMorphology, "Octagon", + dividedWidth != 0 ? dividedWidth : 1); + caption_fill.backgroundColor("black"); + caption_fill.alphaChannel(Magick::ShapeAlphaChannel); + size_t fill_width = caption_fill.columns(); + size_t fill_height = caption_fill.rows(); + caption_image.extent(Geometry(fill_width, fill_height), + Magick::CenterGravity); + caption_image.composite(caption_fill, Magick::CenterGravity, + Magick::DstOverCompositeOp); + + coalesceImages(&coalesced, frames.begin(), frames.end()); + + for (Image &image : coalesced) { + list images; + image.composite(caption_image, Magick::CenterGravity, + Magick::OverCompositeOp); + image.magick(type); + image.animationDelay(delay == 0 ? image.animationDelay() : delay); + captioned.push_back(image); + } + + optimizeTransparency(captioned.begin(), captioned.end()); + + if (type == "gif") { + for (Image &image : captioned) { + image.quantizeDither(false); + image.quantize(); + } + } + + writeImages(captioned.begin(), captioned.end(), &blob); + + Napi::Object result = Napi::Object::New(env); + result.Set("data", Napi::Buffer::Copy(env, (char *)blob.data(), + blob.length())); + result.Set("type", type); + return result; + } catch (std::exception const &err) { + throw Napi::Error::New(env, err.what()); + } catch (...) { + throw Napi::Error::New(env, "Unknown error"); + } +} \ No newline at end of file diff --git a/natives/whisper.h b/natives/whisper.h new file mode 100644 index 0000000..1b97c70 --- /dev/null +++ b/natives/whisper.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +Napi::Value Whisper(const Napi::CallbackInfo& info);