Natives Rework (Thank you Essem)
Co-authored-by: Essem <TheEssem@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									b424b2f813
								
							
						
					
					
						commit
						ff7f0a3110
					
				
					 88 changed files with 3358 additions and 3104 deletions
				
			
		
							
								
								
									
										40
									
								
								app.js
									
										
									
									
									
								
							
							
						
						
									
										40
									
								
								app.js
									
										
									
									
									
								
							|  | @ -75,27 +75,27 @@ async function* getFiles(dir) { | |||
| 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); | ||||
|   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) { | ||||
|  |  | |||
|  | @ -79,14 +79,17 @@ class ImageCommand extends Command { | |||
|     } | ||||
| 
 | ||||
|     try { | ||||
|       const { buffer, type } = await runImageJob(imageParams); | ||||
|       const { buffer, type, width, height } = await runImageJob(imageParams); | ||||
|       if (type === "nogif" && this.constructor.requiresGIF) { | ||||
|         return "That isn't a GIF!"; | ||||
|       } | ||||
|       this.success = true; | ||||
|       return { | ||||
|         contents: buffer, | ||||
|         name: `${this.constructor.command}.${type}` | ||||
|         name: `${this.constructor.command}.${type}`, | ||||
|         type, | ||||
|         width, | ||||
|         height | ||||
|       }; | ||||
|     } 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."; | ||||
|  |  | |||
|  | @ -1,6 +1,10 @@ | |||
| import ImageCommand from "../../classes/imageCommand.js"; | ||||
| 
 | ||||
| class ExplodeCommand extends ImageCommand { | ||||
|   params = { | ||||
|     implode: false | ||||
|   }; | ||||
| 
 | ||||
|   static category = "image-editing" | ||||
|   static description = "Explodes an image"; | ||||
|   static aliases = ["exp"]; | ||||
|  |  | |||
|  | @ -2,6 +2,9 @@ import ImageCommand from "../../classes/imageCommand.js"; | |||
| 
 | ||||
| class FlipCommand extends ImageCommand { | ||||
|   static category = "image-editing" | ||||
|   params = { | ||||
|     flop: false | ||||
|   }; | ||||
|   static description = "Flips an image"; | ||||
| 
 | ||||
|   static noImage = "You need to provide an image/GIF to flip!"; | ||||
|  |  | |||
|  | @ -99,11 +99,15 @@ export default async function (matrixClient, event, room, toStartOfTimeline) { | |||
|                 } else { | ||||
|                   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
 | ||||
|                   const imgsize = sizeOf(result.contents) | ||||
|                   let mime = imgsize.type; | ||||
|                   if (mime == "jpg") { | ||||
|                     mime = "jpeg"; | ||||
|                   // const imgsize = sizeOf(result.contents)
 | ||||
|                   const mime = result.type; | ||||
|                   const imgsize = { | ||||
|                     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) | ||||
|                 } | ||||
|               } else { | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   bool sharp = GetArgument<bool>(Arguments, "sharp"); | ||||
|   VOption *options = VImage::option()->set("access", "sequential"); | ||||
|  | @ -27,5 +27,10 @@ char *Blur(string type, string *outType, char *BufferData, size_t BufferLength, | |||
|   void *buf; | ||||
|   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; | ||||
| } | ||||
|  |  | |||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -7,7 +7,7 @@ | |||
| using namespace std; | ||||
| 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 *DataSize) { | ||||
|   VOption *options = VImage::option(); | ||||
|  | @ -47,5 +47,10 @@ char *Bounce(string type, string *outType, char *BufferData, | |||
| 
 | ||||
|   *outType = "gif"; | ||||
| 
 | ||||
|   return (char *)buf; | ||||
|   ArgumentMap output; | ||||
|   output["buf"] = (char *)buf; | ||||
|   output["width"] = width; | ||||
|   output["height"] = pageHeight + halfHeight; | ||||
| 
 | ||||
|   return output; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -6,7 +6,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   string caption = GetArgument<string>(Arguments, "caption"); | ||||
|   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) | ||||
|           : 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; | ||||
| } | ||||
|  |  | |||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -7,7 +7,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   bool top = GetArgument<bool>(Arguments, "top"); | ||||
|   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) | ||||
|           : 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; | ||||
| } | ||||
|  |  | |||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -11,7 +11,7 @@ | |||
| using namespace std; | ||||
| 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 *DataSize) { | ||||
|   Blob blob; | ||||
|  | @ -50,5 +50,11 @@ char *Circle(string type, string *outType, char *BufferData, | |||
|   // workaround because the data is tied to the blob
 | ||||
|   char *data = (char *)malloc(*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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -10,7 +10,7 @@ using namespace vips; | |||
| 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); | ||||
| 
 | ||||
| char *Colors(string type, string *outType, char *BufferData, | ||||
| ArgumentMap Colors(string type, string *outType, char *BufferData, | ||||
|              size_t BufferLength, ArgumentMap Arguments, size_t *DataSize) { | ||||
|   string color = GetArgument<string>(Arguments, "color"); | ||||
| 
 | ||||
|  | @ -32,5 +32,10 @@ char *Colors(string type, string *outType, char *BufferData, | |||
|   void *buf; | ||||
|   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; | ||||
| } | ||||
|  |  | |||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -9,7 +9,7 @@ using std::map; | |||
| using std::string; | ||||
| using std::variant; | ||||
| 
 | ||||
| typedef variant<string, float, bool, int> ArgumentVariant; | ||||
| typedef variant<char*, string, float, bool, int> ArgumentVariant; | ||||
| typedef map<string, ArgumentVariant> ArgumentMap; | ||||
| 
 | ||||
| #include "blur.h" | ||||
|  | @ -85,7 +85,7 @@ const std::unordered_map<std::string, std::string> fontPaths{ | |||
|     {"roboto", "assets/fonts/reddit.ttf"}}; | ||||
| 
 | ||||
| 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)> | ||||
|     FunctionMap = {{"blur", &Blur}, | ||||
|                    {"bounce", &Bounce}, | ||||
|  | @ -126,5 +126,5 @@ const std::map<std::string, | |||
|                    {"zamn", Zamn}}; | ||||
| 
 | ||||
| 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}}; | ||||
|  | @ -7,7 +7,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   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) | ||||
|           : 0); | ||||
| 
 | ||||
|   return (char *)buf; | ||||
|   ArgumentMap output; | ||||
|   output["buf"] = (char *)buf; | ||||
|   output["width"] = width; | ||||
|   output["height"] = finalHeight; | ||||
| 
 | ||||
|   return output; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -6,7 +6,7 @@ | |||
| using namespace std; | ||||
| 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 *DataSize) { | ||||
|   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 == "gif" ? VImage::option()->set("dither", 0) : 0); | ||||
| 
 | ||||
|   return (char *)buf; | ||||
|   ArgumentMap output; | ||||
|   output["buf"] = (char *)buf; | ||||
|   output["width"] = width; | ||||
|   output["height"] = pageHeight; | ||||
| 
 | ||||
|   return output; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   bool implode = GetArgumentWithFallback<bool>(Arguments, "implode", false); | ||||
|   string basePath = GetArgument<string>(Arguments, "basePath"); | ||||
|  | @ -48,5 +48,10 @@ char *Explode(string type, string *outType, char *BufferData, | |||
|   void *buf; | ||||
|   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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   string overlay = GetArgument<string>(Arguments, "overlay"); | ||||
|   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) | ||||
|           : 0); | ||||
| 
 | ||||
|   return (char *)buf; | ||||
|   ArgumentMap output; | ||||
|   output["buf"] = (char *)buf; | ||||
|   output["width"] = width; | ||||
|   output["height"] = pageHeight; | ||||
| 
 | ||||
|   return output; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -6,9 +6,9 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   bool flop = GetArgument<bool>(Arguments, "flop"); | ||||
|   bool flop = GetArgumentWithFallback<bool>(Arguments, "flop", false); | ||||
| 
 | ||||
|   VImage in = VImage::new_from_buffer(BufferData, BufferLength, "", | ||||
|                                       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) | ||||
|           : 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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -7,7 +7,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   bool loop = GetArgumentWithFallback<bool>(Arguments, "loop", false); | ||||
|   int frame = GetArgumentWithFallback<int>(Arguments, "frame", -1); | ||||
|  | @ -42,7 +42,16 @@ char *Freeze(string type, string *outType, char *BufferData, | |||
|     } | ||||
|     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) { | ||||
|     VOption *options = VImage::option()->set("access", "sequential"); | ||||
| 
 | ||||
|  | @ -62,7 +71,13 @@ char *Freeze(string type, string *outType, char *BufferData, | |||
|     void *buf; | ||||
|     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 { | ||||
|     lastPos = (char *)memchr(fileData, '\x21', BufferLength); | ||||
|     while (lastPos != NULL) { | ||||
|  | @ -78,6 +93,15 @@ char *Freeze(string type, string *outType, char *BufferData, | |||
|     } | ||||
|     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; | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   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) | ||||
|           : 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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   string basePath = GetArgument<string>(Arguments, "basePath"); | ||||
| 
 | ||||
|  | @ -69,5 +69,10 @@ char *Globe(string type, string *outType, char *BufferData, size_t BufferLength, | |||
|   void *buf; | ||||
|   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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| using namespace vips; | ||||
| 
 | ||||
| char *Homebrew(string type, string *outType, ArgumentMap Arguments, | ||||
| ArgumentMap Homebrew(string type, string *outType, ArgumentMap Arguments, | ||||
|                size_t *DataSize) { | ||||
|   string caption = GetArgument<string>(Arguments, "caption"); | ||||
|   string basePath = GetArgument<string>(Arguments, "basePath"); | ||||
|  | @ -33,5 +33,10 @@ char *Homebrew(string type, string *outType, ArgumentMap Arguments, | |||
|   void *buf; | ||||
|   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; | ||||
| } | ||||
|  | @ -4,4 +4,4 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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 *DataSize) { | ||||
|   VOption *options = VImage::option()->set("access", "sequential"); | ||||
|  | @ -24,5 +24,10 @@ char *Invert(string type, string *outType, char *BufferData, | |||
|   void *buf; | ||||
|   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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,11 +5,13 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   int quality = GetArgumentWithFallback<int>(Arguments, "quality", 0); | ||||
| 
 | ||||
|   void *buf; | ||||
|   ArgumentMap output; | ||||
| 
 | ||||
| 
 | ||||
|   if (type == "gif") { | ||||
|     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( | ||||
|         ("." + *outType).c_str(), &buf, DataSize, | ||||
|         *outType == "gif" ? VImage::option()->set("dither", 0) : 0); | ||||
|     output["buf"] = (char *)buf; | ||||
|     output["width"] = width; | ||||
|     output["height"] = pageHeight; | ||||
|   } else { | ||||
|     VImage in = VImage::new_from_buffer(BufferData, BufferLength, ""); | ||||
|     void *jpgBuf; | ||||
|  | @ -69,7 +74,10 @@ char *Jpeg(string type, string *outType, char *BufferData, size_t BufferLength, | |||
|       *outType = "jpg"; | ||||
|       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; | ||||
| } | ||||
|  |  | |||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -9,7 +9,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   Blob blob; | ||||
| 
 | ||||
|  | @ -48,5 +48,11 @@ char *Magik(string type, string *outType, char *BufferData, size_t BufferLength, | |||
| 
 | ||||
|   char *data = (char *)malloc(*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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   string top = GetArgument<string>(Arguments, "top"); | ||||
|   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) | ||||
|           : 0); | ||||
| 
 | ||||
|   return (char *)buf; | ||||
|   ArgumentMap output; | ||||
|   output["buf"] = (char *)buf; | ||||
|   output["width"] = width; | ||||
|   output["height"] = pageHeight; | ||||
| 
 | ||||
|   return output; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   bool vertical = GetArgumentWithFallback<bool>(Arguments, "vertical", false); | ||||
|   bool first = GetArgumentWithFallback<bool>(Arguments, "first", false); | ||||
|  | @ -60,5 +60,10 @@ char *Mirror(string type, string *outType, char *BufferData, | |||
|   void *buf; | ||||
|   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; | ||||
| } | ||||
|  |  | |||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   string top_text = GetArgument<string>(Arguments, "top"); | ||||
|   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 == "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; | ||||
| } | ||||
|  |  | |||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -67,25 +67,31 @@ Napi::Value ProcessImage(const Napi::CallbackInfo& info) { | |||
|     string outType = GetArgument<bool>(Arguments, "togif") ? "gif" : type; | ||||
| 
 | ||||
|     size_t length = 0; | ||||
|     char* buf; | ||||
|     ArgumentMap outMap; | ||||
|     if (obj.Has("data")) { | ||||
|       Napi::Buffer<char> data = obj.Has("data") | ||||
|                                     ? obj.Get("data").As<Napi::Buffer<char>>() | ||||
|                                     : 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); | ||||
|     } else { | ||||
|       buf = NoInputFunctionMap.at(command)(type, &outType, Arguments, &length); | ||||
|       outMap = NoInputFunctionMap.at(command)(type, &outType, Arguments, &length); | ||||
|     } | ||||
| 
 | ||||
|     vips_error_clear(); | ||||
|     vips_thread_shutdown(); | ||||
| 
 | ||||
|     char* buf = GetArgument<char*>(outMap, "buf"); | ||||
|     int width = GetArgument<int>(outMap, "width"); | ||||
|     int height = GetArgument<int>(outMap, "height"); | ||||
| 
 | ||||
|     result.Set("data", | ||||
|                Napi::Buffer<char>::New(env, buf, length, | ||||
|                                        []([[maybe_unused]] Napi::Env env, | ||||
|                                           void* data) { free(data); })); | ||||
|     result.Set("type", outType); | ||||
|     result.Set("width", width); | ||||
|     result.Set("height", height); | ||||
|   } catch (std::exception const& err) { | ||||
|     Napi::Error::New(env, err.what()).ThrowAsJavaScriptException(); | ||||
|   } catch (...) { | ||||
|  |  | |||
|  | @ -5,9 +5,9 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   string text = GetArgumentWithFallback<string>(Arguments, "text", ""); | ||||
|   string text = GetArgument<string>(Arguments, "caption"); | ||||
|   string basePath = GetArgument<string>(Arguments, "basePath"); | ||||
| 
 | ||||
|   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) | ||||
|           : 0); | ||||
| 
 | ||||
|   return (char *)buf; | ||||
|   ArgumentMap output; | ||||
|   output["buf"] = (char *)buf; | ||||
|   output["width"] = width; | ||||
|   output["height"] = pageHeight + watermark.height(); | ||||
| 
 | ||||
|   return output; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   bool stretch = GetArgumentWithFallback<bool>(Arguments, "stretch", false); | ||||
|   bool wide = GetArgumentWithFallback<bool>(Arguments, "wide", false); | ||||
|  | @ -50,5 +50,10 @@ char *Resize(string type, string *outType, char *BufferData, | |||
|   void *buf; | ||||
|   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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -6,7 +6,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   bool soos = GetArgumentWithFallback<bool>(Arguments, "soos", false); | ||||
| 
 | ||||
|  | @ -55,5 +55,10 @@ char *Reverse(string type, string *outType, char *BufferData, | |||
| 
 | ||||
|   *outType = "gif"; | ||||
| 
 | ||||
|   return (char *)buf; | ||||
|   ArgumentMap output; | ||||
|   output["buf"] = (char *)buf; | ||||
|   output["width"] = width; | ||||
|   output["height"] = pageHeight; | ||||
| 
 | ||||
|   return output; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   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( | ||||
|       ("." + *outType).c_str(), &buf, DataSize, | ||||
|       *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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   string caption = GetArgument<string>(Arguments, "caption"); | ||||
|   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) | ||||
|           : 0); | ||||
| 
 | ||||
|   return (char *)buf; | ||||
|   ArgumentMap output; | ||||
|   output["buf"] = (char *)buf; | ||||
|   output["width"] = width; | ||||
|   output["height"] = pageHeight; | ||||
| 
 | ||||
|   return output; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| using namespace vips; | ||||
| 
 | ||||
| char *Sonic(string type, string *outType, ArgumentMap Arguments, | ||||
| ArgumentMap Sonic(string type, string *outType, ArgumentMap Arguments, | ||||
|             size_t *DataSize) { | ||||
|   string text = GetArgument<string>(Arguments, "text"); | ||||
|   string basePath = GetArgument<string>(Arguments, "basePath"); | ||||
|  | @ -31,5 +31,10 @@ char *Sonic(string type, string *outType, ArgumentMap Arguments, | |||
|   void *buf; | ||||
|   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; | ||||
| } | ||||
|  | @ -4,4 +4,4 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -14,7 +14,7 @@ void *memset16(void *m, uint16_t val, size_t count) { | |||
|   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"); | ||||
| 
 | ||||
|   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 nPages = vips_image_get_n_pages(in.get_image()); | ||||
| 
 | ||||
|   vector<VImage> img; | ||||
|   for (int i = 0; i < nPages; i += speed) { | ||||
|     VImage img_frame = in.crop(0, i * pageHeight, width, pageHeight); | ||||
|     img.push_back(img_frame); | ||||
|   VImage out; | ||||
|   if (removeFrames) { | ||||
|     vector<VImage> img; | ||||
|     for (int i = 0; i < nPages; i += speed) { | ||||
|       VImage img_frame = in.crop(0, i * pageHeight, width, pageHeight); | ||||
|       img.push_back(img_frame); | ||||
|     } | ||||
|     out = VImage::arrayjoin(img, VImage::option()->set("across", 1)); | ||||
|     out.set(VIPS_META_PAGE_HEIGHT, pageHeight); | ||||
|   } else { | ||||
|     out = in; | ||||
|   } | ||||
|   VImage out = VImage::arrayjoin(img, VImage::option()->set("across", 1)); | ||||
|   out.set(VIPS_META_PAGE_HEIGHT, pageHeight); | ||||
| 
 | ||||
|   void *buf; | ||||
|   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) { | ||||
|   bool slow = GetArgumentWithFallback<bool>(Arguments, "slow", false); | ||||
|   int speed = GetArgumentWithFallback<int>(Arguments, "speed", 2); | ||||
|  | @ -92,11 +102,8 @@ char *Speed([[maybe_unused]] string type, string *outType, char *BufferData, | |||
|     ++currentFrame; | ||||
|   } | ||||
| 
 | ||||
|   if (removeFrames) { | ||||
|     fileData = vipsRemove(BufferData, BufferLength, DataSize, speed); | ||||
|   } else { | ||||
|     *DataSize = BufferLength; | ||||
|   } | ||||
|   // TODO: this is cursed, fix it later
 | ||||
|   ArgumentMap output = vipsHandle(BufferData, BufferLength, DataSize, speed, removeFrames); | ||||
| 
 | ||||
|   return fileData; | ||||
|   return output; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -9,7 +9,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   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); | ||||
|   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; | ||||
| } | ||||
|  |  | |||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -7,7 +7,7 @@ | |||
| using namespace std; | ||||
| 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 *DataSize) { | ||||
|   VOption *options = VImage::option(); | ||||
|  | @ -48,5 +48,10 @@ char *Squish(string type, string *outType, char *BufferData, | |||
| 
 | ||||
|   *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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   VOption *options = VImage::option()->set("access", "sequential"); | ||||
| 
 | ||||
|  | @ -72,5 +72,10 @@ char *Swirl(string type, string *outType, char *BufferData, size_t BufferLength, | |||
|   void *buf; | ||||
|   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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -9,7 +9,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   Blob blob; | ||||
| 
 | ||||
|  | @ -61,5 +61,11 @@ char *Tile(string type, string *outType, char *BufferData, size_t BufferLength, | |||
| 
 | ||||
|   char *data = (char *)malloc(*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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,13 +5,18 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   if (type == "gif") { | ||||
|     *DataSize = BufferLength; | ||||
|     char *data = (char *)malloc(BufferLength); | ||||
|     memcpy(data, BufferData, BufferLength); | ||||
|     return data; | ||||
| 
 | ||||
|     ArgumentMap output; | ||||
|     output["buf"] = data; | ||||
| 
 | ||||
|     return output; | ||||
| 
 | ||||
|   } else { | ||||
|     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); | ||||
|     *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; | ||||
|   } | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   string caption = GetArgument<string>(Arguments, "caption"); | ||||
|   string caption2 = GetArgument<string>(Arguments, "caption2"); | ||||
|  | @ -97,5 +97,10 @@ char *Uncanny(string type, string *outType, char *BufferData, | |||
|       ("." + *outType).c_str(), &buf, DataSize, | ||||
|       *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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -6,7 +6,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   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) | ||||
|           : 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; | ||||
| } | ||||
|  |  | |||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -9,7 +9,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   Blob blob; | ||||
| 
 | ||||
|  | @ -54,5 +54,11 @@ char *Wall(string type, string *outType, char *BufferData, size_t BufferLength, | |||
| 
 | ||||
|   char *data = (char *)malloc(*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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -6,7 +6,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   string water = GetArgument<string>(Arguments, "water"); | ||||
|   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) | ||||
|           : 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; | ||||
| } | ||||
|  |  | |||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   string caption = GetArgument<string>(Arguments, "caption"); | ||||
|   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) | ||||
|           : 0); | ||||
| 
 | ||||
|   return (char *)buf; | ||||
|   ArgumentMap output; | ||||
|   output["buf"] = (char *)buf; | ||||
|   output["width"] = width; | ||||
|   output["height"] = pageHeight; | ||||
| 
 | ||||
|   return output; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -5,7 +5,7 @@ | |||
| using namespace std; | ||||
| 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) { | ||||
|   string basePath = GetArgument<string>(Arguments, "basePath"); | ||||
| 
 | ||||
|  | @ -43,5 +43,10 @@ char *Zamn(string type, string *outType, char *BufferData, size_t BufferLength, | |||
|   void *buf; | ||||
|   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; | ||||
| } | ||||
|  | @ -4,5 +4,5 @@ | |||
| 
 | ||||
| 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); | ||||
|  | @ -50,7 +50,9 @@ export default function run(object) { | |||
|         const result = img.image(object.cmd, objectWithFixedType); | ||||
|         const returnObject = { | ||||
|           buffer: result.data, | ||||
|           fileExtension: result.type | ||||
|           fileExtension: result.type, | ||||
|           width: result.width, | ||||
|           height: result.height | ||||
|         }; | ||||
|         resolve(returnObject); | ||||
|       } catch (e) { | ||||
|  |  | |||
|  | @ -135,7 +135,9 @@ function waitForWorker(worker) { | |||
|     worker.once("message", (data) => { | ||||
|       resolve({ | ||||
|         buffer: Buffer.from([...data.buffer]), | ||||
|         type: data.fileExtension | ||||
|         type: data.fileExtension, | ||||
|         width: data.width, | ||||
|         height: data.height | ||||
|       }); | ||||
|     }); | ||||
|     worker.once("error", reject); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue