/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % M M AAA GGGG IIIII CCCC K K % % MM MM A A G I C K K % % M M M AAAAA G GGG I C KKK % % M M A A G G I C K K % % M M A A GGGG IIIII CCCC K K % % % % % % Perform "Magick" on Images via the Command Line Interface % % % % Dragon Computing % % Anthony Thyssen % % January 2012 % % % % % % Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % % dedicated to making software imaging solutions freely available. % % % % You may not use this file except in compliance with the License. You may % % obtain a copy of the License at % % % % https://imagemagick.org/script/license.php % % % % Unless required by applicable law or agreed to in writing, software % % distributed under the License is distributed on an "AS IS" BASIS, % % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % % See the License for the specific language governing permissions and % % limitations under the License. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Read CLI arguments, script files, and pipelines, to provide options that % manipulate images from many different formats. % */ /* Include declarations. */ #include "MagickWand/studio.h" #include "MagickWand/MagickWand.h" /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % M a i n % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % */ static int MagickMain(int argc,char **argv) { #define MagickCommandSize(name,use_metadata,command) \ { (name), sizeof(name)-1, (use_metadata), (command) } typedef struct _CommandInfo { const char *client_name; size_t extent; MagickBooleanType use_metadata; MagickCommand command; } CommandInfo; const CommandInfo MagickCommands[] = { MagickCommandSize("magick", MagickFalse, MagickImageCommand), MagickCommandSize("convert", MagickFalse, ConvertImageCommand), MagickCommandSize("composite", MagickFalse, CompositeImageCommand), MagickCommandSize("identify", MagickTrue, IdentifyImageCommand), MagickCommandSize("animate", MagickFalse, AnimateImageCommand), MagickCommandSize("compare", MagickTrue, CompareImagesCommand), MagickCommandSize("conjure", MagickFalse, ConjureImageCommand), MagickCommandSize("display", MagickFalse, DisplayImageCommand), MagickCommandSize("import", MagickFalse, ImportImageCommand), MagickCommandSize("mogrify", MagickFalse, MogrifyImageCommand), MagickCommandSize("montage", MagickFalse, MontageImageCommand), MagickCommandSize("stream", MagickFalse, StreamImageCommand) }; char client_name[MagickPathExtent], *metadata; ExceptionInfo *exception; ImageInfo *image_info; int exit_code, offset; MagickBooleanType status; ssize_t i; size_t number_commands; MagickCoreGenesis(*argv,MagickTrue); exception=AcquireExceptionInfo(); image_info=AcquireImageInfo(); GetPathComponent(argv[0],TailPath,client_name); number_commands=sizeof(MagickCommands)/sizeof(MagickCommands[0]); for (i=0; i < (ssize_t) number_commands; i++) { offset=LocaleNCompare(MagickCommands[i].client_name,client_name, MagickCommands[i].extent); if (offset == 0) break; } i%=(number_commands); if ((i == 0) && (argc > 1)) { for (i=1; i < (ssize_t) number_commands; i++) { offset=LocaleCompare(MagickCommands[i].client_name,argv[1]); if (offset == 0) { argc--; argv++; break; } } i%=number_commands; } metadata=(char *) NULL; status=MagickCommandGenesis(image_info,MagickCommands[i].command,argc,argv, MagickCommands[i].use_metadata ? &metadata : (char **) NULL,exception); if (metadata != (char *) NULL) { (void) fputs(metadata,stdout); metadata=DestroyString(metadata); } if (MagickCommands[i].command != CompareImagesCommand) exit_code=status != MagickFalse ? 0 : 1; else { if (status == MagickFalse) exit_code=2; else { const char *option; option=GetImageOption(image_info,"compare:dissimilar"); exit_code=IsStringTrue(option) ? 1 : 0; } } image_info=DestroyImageInfo(image_info); exception=DestroyExceptionInfo(exception); MagickCoreTerminus(); return(exit_code); } #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) int main(int argc,char **argv) { return(MagickMain(argc,argv)); } #else int wmain(int argc,wchar_t *argv[]) { char **utf8; int status; int i; utf8=NTArgvToUTF8(argc,argv); status=MagickMain(argc,utf8); for (i=0; i < argc; i++) utf8[i]=DestroyString(utf8[i]); utf8=(char **) RelinquishMagickMemory(utf8); return(status); } #endif