From 05795313c411596a24acfb1a5bcd4f5f8548f3f4 Mon Sep 17 00:00:00 2001 From: Essem Date: Sat, 30 Apr 2022 16:41:44 -0500 Subject: [PATCH] Fix deepfry/jpeg delay, port speed --- natives/deepfry.cc | 6 ++- natives/jpeg.cc | 6 ++- natives/speed.cc | 91 ++++++++++++++++++---------------------------- 3 files changed, 45 insertions(+), 58 deletions(-) diff --git a/natives/deepfry.cc b/natives/deepfry.cc index 75c292e..8c62998 100644 --- a/natives/deepfry.cc +++ b/natives/deepfry.cc @@ -32,7 +32,11 @@ Napi::Value Deepfry(const Napi::CallbackInfo &info) { VImage::option()->set("Q", 1)->set("strip", true)); VImage final = VImage::new_from_buffer(jpgBuf, jpgLength, ""); final.set(VIPS_META_PAGE_HEIGHT, page_height); - if (delay) final.set("delay", delay); + if (delay) { + final.set("delay", delay); + } else if (type == "gif") { + final.set("delay", fried.get_array_int("delay")); + } void *buf; size_t length; diff --git a/natives/jpeg.cc b/natives/jpeg.cc index 3495dfb..8874e46 100644 --- a/natives/jpeg.cc +++ b/natives/jpeg.cc @@ -37,7 +37,11 @@ Napi::Value Jpeg(const Napi::CallbackInfo &info) { VImage::option()->set("Q", quality)->set("strip", true)); VImage final = VImage::new_from_buffer(jpgBuf, jpgLength, ""); final.set(VIPS_META_PAGE_HEIGHT, page_height); - if (delay) final.set("delay", delay); + if (delay) { + final.set("delay", delay); + } else if (type == "gif") { + final.set("delay", in.get_array_int("delay")); + } void *buf; size_t length; diff --git a/natives/speed.cc b/natives/speed.cc index 1beb7c5..c59f0ce 100644 --- a/natives/speed.cc +++ b/natives/speed.cc @@ -1,11 +1,9 @@ -#include #include -#include -#include +#include using namespace std; -using namespace Magick; +using namespace vips; void *memset16(void *m, uint16_t val, size_t count) { uint16_t *buf = (uint16_t *)m; @@ -14,6 +12,36 @@ void *memset16(void *m, uint16_t val, size_t count) { return m; } +void vipsRemove(Napi::Env *env, Napi::Object *result, Napi::Buffer data, + int speed) { + VOption *options = VImage::option()->set("access", "sequential"); + + VImage in = VImage::new_from_buffer(data.Data(), data.Length(), "", + options->set("n", -1)) + .colourspace(VIPS_INTERPRETATION_sRGB); + if (!in.has_alpha()) in = in.bandjoin(255); + + int width = in.width(); + int page_height = vips_image_get_page_height(in.get_image()); + int n_pages = vips_image_get_n_pages(in.get_image()); + + vector img; + for (int i = 0; i < n_pages; i += speed) { + VImage img_frame = in.crop(0, i * page_height, width, page_height); + img.push_back(img_frame); + } + VImage out = VImage::arrayjoin(img, VImage::option()->set("across", 1)); + out.set(VIPS_META_PAGE_HEIGHT, page_height); + + void *buf; + size_t length; + out.write_to_buffer(".gif", &buf, &length); + + vips_thread_shutdown(); + + result->Set("data", Napi::Buffer::Copy(*env, (char *)buf, length)); +} + Napi::Value Speed(const Napi::CallbackInfo &info) { Napi::Env env = info.Env(); @@ -80,37 +108,7 @@ Napi::Value Speed(const Napi::CallbackInfo &info) { result.Set("data", Napi::Buffer::Copy(env, fileData, data.Length())); - if (removeFrames) { - Blob blob; - - list frames; - try { - readImages(&frames, Blob(data.Data(), data.Length())); - } catch (Magick::WarningCoder &warning) { - cerr << "Coder Warning: " << warning.what() << endl; - } catch (Magick::Warning &warning) { - cerr << "Warning: " << warning.what() << endl; - } - - for (list::iterator i = frames.begin(); i != frames.end(); ++i) { - int index = distance(frames.begin(), i); - if (index >= (int)old_delays.size()) { - old_delays.resize(index+1); - old_delays[index] = old_delays[index-1]; - } - i->animationDelay(old_delays[index]); - } - - for (int i = 0; i < speed - 1; ++i) { - auto it = frames.begin(); - while(it != frames.end() && ++it != frames.end()) it = frames.erase(it); - } - - for_each(frames.begin(), frames.end(), magickImage(type)); - writeImages(frames.begin(), frames.end(), &blob); - result.Set("data", Napi::Buffer::Copy(env, (char *)blob.data(), - blob.length())); - } + if (removeFrames) vipsRemove(&env, &result, data, speed); } else { char *lastPos; @@ -133,26 +131,7 @@ Napi::Value Speed(const Napi::CallbackInfo &info) { } if (removeFrames) { - Blob blob; - - list frames; - try { - readImages(&frames, Blob(data.Data(), data.Length())); - } catch (Magick::WarningCoder &warning) { - cerr << "Coder Warning: " << warning.what() << endl; - } catch (Magick::Warning &warning) { - cerr << "Warning: " << warning.what() << endl; - } - - for (int i = 0; i < speed - 1; ++i) { - auto it = frames.begin(); - while(it != frames.end() && ++it != frames.end()) it = frames.erase(it); - } - - for_each(frames.begin(), frames.end(), magickImage(type)); - writeImages(frames.begin(), frames.end(), &blob); - result.Set("data", Napi::Buffer::Copy(env, (char *)blob.data(), - blob.length())); + vipsRemove(&env, &result, data, speed); } else { while (lastPos != NULL) { if (memcmp(lastPos, match, 4) != 0) { @@ -178,4 +157,4 @@ Napi::Value Speed(const Napi::CallbackInfo &info) { } catch (...) { throw Napi::Error::New(env, "Unknown error"); } -} +} \ No newline at end of file