1 /* 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3 % % 4 % % 5 % % 6 % M M AAA GGGG IIIII CCCC K K % 7 % MM MM A A G I C K K % 8 % M M M AAAAA G GGG I C KKK % 9 % M M A A G G I C K K % 10 % M M A A GGGG IIIII CCCC K K % 11 % % 12 % % 13 % Perform "Magick" on Images via the Command Line Interface % 14 % % 15 % Dragon Computing % 16 % Anthony Thyssen % 17 % January 2012 % 18 % % 19 % % 20 % Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization % 21 % dedicated to making software imaging solutions freely available. % 22 % % 23 % You may not use this file except in compliance with the License. You may % 24 % obtain a copy of the License at % 25 % % 26 % http://www.imagemagick.org/script/license.php % 27 % % 28 % Unless required by applicable law or agreed to in writing, software % 29 % distributed under the License is distributed on an "AS IS" BASIS, % 30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 31 % See the License for the specific language governing permissions and % 32 % limitations under the License. % 33 % % 34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 35 % 36 % Read CLI arguments, script files, and pipelines, to provide options that 37 % manipulate images from many different formats. 38 % 39 */ 40 41 /* 42 Include declarations. 43 */ 44 #include "MagickWand/studio.h" 45 #include "MagickWand/MagickWand.h" 46 47 /* 48 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 49 % % 50 % % 51 % % 52 % M a i n % 53 % % 54 % % 55 % % 56 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 57 % 58 % 59 */ 60 MagickMain(int argc,char ** argv)61 static int MagickMain(int argc,char **argv) 62 { 63 #define MagickCommandSize(name,use_metadata,command) \ 64 { (name), sizeof(name)-1, (use_metadata), (command) } 65 66 typedef struct _CommandInfo 67 { 68 const char 69 *client_name; 70 71 size_t 72 extent; 73 74 MagickBooleanType 75 use_metadata; 76 77 MagickCommand 78 command; 79 } CommandInfo; 80 81 const CommandInfo 82 MagickCommands[] = 83 { 84 MagickCommandSize("magick", MagickFalse, MagickImageCommand), 85 MagickCommandSize("convert", MagickFalse, ConvertImageCommand), 86 MagickCommandSize("composite", MagickFalse, CompositeImageCommand), 87 MagickCommandSize("identify", MagickTrue, IdentifyImageCommand), 88 MagickCommandSize("animate", MagickFalse, AnimateImageCommand), 89 MagickCommandSize("compare", MagickTrue, CompareImagesCommand), 90 MagickCommandSize("conjure", MagickFalse, ConjureImageCommand), 91 MagickCommandSize("display", MagickFalse, DisplayImageCommand), 92 MagickCommandSize("import", MagickFalse, ImportImageCommand), 93 MagickCommandSize("mogrify", MagickFalse, MogrifyImageCommand), 94 MagickCommandSize("montage", MagickFalse, MontageImageCommand), 95 MagickCommandSize("stream", MagickFalse, StreamImageCommand) 96 }; 97 98 char 99 client_name[MagickPathExtent], 100 *metadata; 101 102 ExceptionInfo 103 *exception; 104 105 ImageInfo 106 *image_info; 107 108 int 109 exit_code, 110 offset; 111 112 MagickBooleanType 113 status; 114 115 register ssize_t 116 i; 117 118 MagickCoreGenesis(*argv,MagickTrue); 119 exception=AcquireExceptionInfo(); 120 image_info=AcquireImageInfo(); 121 GetPathComponent(argv[0],TailPath,client_name); 122 for (i=0; i < (ssize_t) (sizeof(MagickCommands)/sizeof(MagickCommands[0])); i++) 123 { 124 offset=LocaleNCompare(MagickCommands[i].client_name,client_name, 125 MagickCommands[i].extent); 126 if (offset == 0) 127 break; 128 } 129 i%=(sizeof(MagickCommands)/sizeof(MagickCommands[0])); 130 if ((i == 0) && (argc > 1)) 131 { 132 for (i=1; i < (ssize_t) (sizeof(MagickCommands)/sizeof(MagickCommands[0])); i++) 133 { 134 offset=LocaleCompare(MagickCommands[i].client_name,argv[1]); 135 if (offset == 0) 136 { 137 argc--; 138 argv++; 139 break; 140 } 141 } 142 i%=(sizeof(MagickCommands)/sizeof(MagickCommands[0])); 143 } 144 metadata=(char *) NULL; 145 status=MagickCommandGenesis(image_info,MagickCommands[i].command,argc,argv, 146 MagickCommands[i].use_metadata ? &metadata : (char **) NULL,exception); 147 if (metadata != (char *) NULL) 148 { 149 (void) fputs(metadata,stdout); 150 metadata=DestroyString(metadata); 151 } 152 if (MagickCommands[i].command != CompareImagesCommand) 153 exit_code=status != MagickFalse ? 0 : 1; 154 else 155 { 156 if (status == MagickFalse) 157 exit_code=2; 158 else 159 { 160 const char 161 *option; 162 163 option=GetImageOption(image_info,"compare:dissimilar"); 164 exit_code=IsStringTrue(option) ? 1 : 0; 165 } 166 } 167 image_info=DestroyImageInfo(image_info); 168 exception=DestroyExceptionInfo(exception); 169 MagickCoreTerminus(); 170 return(exit_code); 171 } 172 173 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) main(int argc,char ** argv)174 int main(int argc,char **argv) 175 { 176 return(MagickMain(argc,argv)); 177 } 178 #else wmain(int argc,wchar_t * argv[])179 int wmain(int argc,wchar_t *argv[]) 180 { 181 char 182 **utf8; 183 184 int 185 status; 186 187 register int 188 i; 189 190 utf8=NTArgvToUTF8(argc,argv); 191 status=MagickMain(argc,utf8); 192 for (i=0; i < argc; i++) 193 utf8[i]=DestroyString(utf8[i]); 194 utf8=(char **) RelinquishMagickMemory(utf8); 195 return(status); 196 } 197 #endif 198