From b17611917f3b785d0a470060fb860ab7bc4521b5 Mon Sep 17 00:00:00 2001 From: bjcscat Date: Tue, 8 Mar 2022 23:24:48 +0000 Subject: [PATCH] Add support for string gravity + speechbubble command --- assets/images/speechbubble.png | Bin 0 -> 32774 bytes commands/image-editing/speechbubble.js | 18 +++++++++++ natives/watermark.cc | 43 +------------------------ utils/image-runner.js | 18 +++++++++++ 4 files changed, 37 insertions(+), 42 deletions(-) create mode 100644 assets/images/speechbubble.png create mode 100644 commands/image-editing/speechbubble.js diff --git a/assets/images/speechbubble.png b/assets/images/speechbubble.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca27d2867d5be7ace248fa5ab4a8ea342462f80 GIT binary patch literal 32774 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 J<;t4+{y*{6^eX@W literal 0 HcmV?d00001 diff --git a/commands/image-editing/speechbubble.js b/commands/image-editing/speechbubble.js new file mode 100644 index 0000000..16a1298 --- /dev/null +++ b/commands/image-editing/speechbubble.js @@ -0,0 +1,18 @@ +import ImageCommand from "../../classes/imageCommand.js"; + +class SpeechbubbleCommand extends ImageCommand { + params = { + water: "./assets/images/speechbubble.png", + gravity: "north", + resize: true, + yscale: 0.2, + }; + + static description = "Adds a speech bubble to the image."; + static aliases = ["speech","speechbubble"]; + + static noImage = "You need to provide an image/GIF to add a speech bubble." + static command = "watermark"; +} + +export default SpeechbubbleCommand; diff --git a/natives/watermark.cc b/natives/watermark.cc index 93649d3..ed78c3f 100644 --- a/natives/watermark.cc +++ b/natives/watermark.cc @@ -7,47 +7,6 @@ using namespace std; using namespace Magick; -Magick::GravityType NapiToGravity(const Napi::Value gravity) { - Magick::GravityType g = Magick::GravityType(); - if (gravity.IsNumber()) { - return Magick::GravityType(gravity.As().Int64Value()); - }else if (gravity.IsString()) { - string grav = gravity.As().Utf8Value(); - if (grav == "northwest") { - g = Magick::NorthWestGravity; - } else if (grav == "north") { - g = Magick::NorthGravity; - } else if (grav == "northeast") { - g = Magick::NorthEastGravity; - } else if (grav == "west") { - g = Magick::WestGravity; - } else if (grav == "center") { - g = Magick::CenterGravity; - } else if (grav == "east") { - g = Magick::EastGravity; - } else if (grav == "southwest") { - g = Magick::SouthWestGravity; - } else if (grav == "south") { - g = Magick::SouthGravity; - } else if (grav == "southeast") { - g = Magick::SouthEastGravity; - } else if (grav == "forget") { - g = Magick::ForgetGravity; - } else if (grav == "north_east") { - g = Magick::NorthEastGravity; - } else if (grav == "north_west") { - g = Magick::NorthWestGravity; - } else if (grav == "south_east") { - g = Magick::SouthEastGravity; - } else if (grav == "south_west") { - g = Magick::SouthWestGravity; - } else { - g = Magick::CenterGravity; - } - } - return g; -} - Napi::Value Watermark(const Napi::CallbackInfo &info) { Napi::Env env = info.Env(); @@ -55,7 +14,7 @@ Napi::Value Watermark(const Napi::CallbackInfo &info) { Napi::Object obj = info[0].As(); Napi::Buffer data = obj.Get("data").As>(); string water = obj.Get("water").As().Utf8Value(); - Magick::GravityType gravity = NapiToGravity(obj.Get("gravity")); + Magick::GravityType gravity = Magick::GravityType(obj.Get("gravity").As().Int64Value()); bool resize = obj.Has("resize") ? obj.Get("resize").As().Value() : false; diff --git a/utils/image-runner.js b/utils/image-runner.js index 6679636..197f3f7 100644 --- a/utils/image-runner.js +++ b/utils/image-runner.js @@ -6,6 +6,19 @@ const nodeRequire = createRequire(import.meta.url); const magick = nodeRequire(`../build/${process.env.DEBUG && process.env.DEBUG === "true" ? "Debug" : "Release"}/image.node`); +const enumMap = { + "forget":0, + "northwest":1, + "north":2, + "northeast":3, + "west":4, + "center":5, + "east":6, + "southwest":7, + "south":8, + "southeast":9 +} + export default function run(object) { return new Promise((resolve, reject) => { // If the image has a path, it must also have a type @@ -24,6 +37,11 @@ export default function run(object) { promise.then(buf => { object.params.data = buf; const objectWithFixedType = Object.assign({}, object.params, {type: fileExtension}); + if (objectWithFixedType.gravity) { + if (isNaN(Number(objectWithFixedType.gravity))){ + objectWithFixedType.gravity=enumMap[objectWithFixedType.gravity]; + } + } try { const result = magick[object.cmd](objectWithFixedType); const returnObject = {