/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % P i n g I m a g e s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % PingImages() pings one or more images and returns them as an image list. % % The format of the PingImage method is: % % Image *PingImages(const ImageInfo *image_info,ExceptionInfo *exception) % % A description of each parameter follows: % % o image_info: the image info. % % o exception: return any errors or warnings in this structure. % */ MagickExport Image *PingImages(const ImageInfo *image_info, ExceptionInfo *exception) { char filename[MaxTextExtent]; Image *image, *images; ImageInfo *read_info; /* Ping image list from a file. */ assert(image_info != (ImageInfo *) NULL); assert(image_info->signature == MagickSignature); if (image_info->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", image_info->filename); assert(exception != (ExceptionInfo *) NULL); (void) InterpretImageFilename(image_info,(Image *) NULL,image_info->filename, (int) image_info->scene,filename,exception); if (LocaleCompare(filename,image_info->filename) != 0) { ExceptionInfo *sans; ssize_t extent, scene; /* Images of the form image-%d.png[1-5]. */ read_info=CloneImageInfo(image_info); sans=AcquireExceptionInfo(); (void) SetImageInfo(read_info,0,sans); sans=DestroyExceptionInfo(sans); (void) CopyMagickString(filename,read_info->filename,MaxTextExtent); images=NewImageList(); extent=(ssize_t) (read_info->scene+read_info->number_scenes); for (scene=(ssize_t) read_info->scene; scene < (ssize_t) extent; scene++) { (void) InterpretImageFilename(image_info,(Image *) NULL,filename,(int) scene,read_info->filename,exception); image=PingImage(read_info,exception); if (image == (Image *) NULL) continue; AppendImageToList(&images,image); } read_info=DestroyImageInfo(read_info); return(images); } return(PingImage(image_info,exception)); }
/* This has severe issues. See: * * http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=20017 */ int vips__magick_read_header( const char *filename, VipsImage *im ) { Read *read; #ifdef DEBUG printf( "magick2vips: vips__magick_read_header: %s\n", filename ); #endif /*DEBUG*/ if( !(read = read_new( filename, im )) ) return( -1 ); read->image = PingImage( read->image_info, &read->exception ); if( !read->image ) { vips_error( "magick2vips", _( "unable to ping file " "\"%s\"\nlibMagick error: %s %s" ), filename, read->exception.reason, read->exception.description ); return( -1 ); } if( parse_header( read ) ) return( -1 ); if( im->Xsize <= 0 || im->Ysize <= 0 ) { vips_error( "magick2vips", "%s", _( "bad image size" ) ); return( -1 ); } return( 0 ); }
static int magick2vips_header( const char *filename, IMAGE *im ) { Read *read; if( !(read = read_new( filename, im )) ) return( -1 ); read->image = PingImage( read->image_info, &read->exception ); if( !read->image ) { im_error( "im_magick2vips", _( "unable to ping file " "\"%s\"\nlibMagick error: %s %s" ), filename, read->exception.reason, read->exception.description ); return( -1 ); } if( parse_header( read ) ) return( -1 ); if( im->Xsize <= 0 || im->Ysize <= 0 ) { im_error( "im_magick2vips", "%s", _( "bad image size" ) ); return( -1 ); } return( 0 ); }
bool ScImgDataLoader_GMagick::preloadAlphaChannel(const QString& fn, int /*page*/, int res, bool& hasAlpha) { initGraphicsMagick(); initialize(); hasAlpha = false; if (!QFile::exists(fn)) return false; ExceptionInfo exception; GetExceptionInfo(&exception); ImageInfo *image_info = CloneImageInfo(0); strcpy(image_info->filename, fn.toUtf8().data()); image_info->units = PixelsPerInchResolution; Image *image = PingImage(image_info, &exception); if (exception.severity != UndefinedException) CatchException(&exception); if (!image) { qCritical() << "Failed to read image" << fn; return false; } hasAlpha = image->matte; if (!hasAlpha) return true; return loadPicture(fn, 0, 0, false); }
/* This has severe issues. See: * * http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=20017 */ int vips__magick_read_header( const char *filename, VipsImage *im, gboolean all_frames, const char *density, int page ) { Read *read; #ifdef DEBUG printf( "vips__magick_read_header: %s\n", filename ); #endif /*DEBUG*/ if( !(read = read_new( filename, im, all_frames, density, page )) ) return( -1 ); #ifdef DEBUG printf( "vips__magick_read_header: pinging image ...\n" ); #endif /*DEBUG*/ read->image = PingImage( read->image_info, &read->exception ); if( !read->image ) { vips_error( "magick2vips", _( "unable to ping file " "\"%s\"\nlibMagick error: %s %s" ), filename, read->exception.reason, read->exception.description ); return( -1 ); } if( parse_header( read ) ) return( -1 ); if( im->Xsize <= 0 || im->Ysize <= 0 ) { vips_error( "magick2vips", "%s", _( "bad image size" ) ); return( -1 ); } /* Just a header read: we can free the read early and save an fd. */ read_free( read ); return( 0 ); }
WandExport MagickBooleanType IdentifyImageCommand(ImageInfo *image_info, int argc,char **argv,char **metadata,ExceptionInfo *exception) { #define DestroyIdentify() \ { \ for ( ; k >= 0; k--) \ image_stack[k]=DestroyImageList(image_stack[k]); \ for (i=0; i < (long) argc; i++) \ argv[i]=DestroyString(argv[i]); \ argv=(char **) RelinquishMagickMemory(argv); \ } #define ThrowIdentifyException(asperity,tag,option) \ { \ if (exception->severity == UndefinedException) \ (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag, \ "`%s'",option); \ DestroyIdentify(); \ return(MagickFalse); \ } #define ThrowIdentifyInvalidArgumentException(option,argument) \ { \ (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ "InvalidArgument","`%s': %s",argument,option); \ DestroyIdentify(); \ return(MagickFalse); \ } const char *format, *option; Image *image_stack[MaxImageStackDepth+1]; long j, k; MagickBooleanType fire, pend; MagickStatusType status; register long i; unsigned long count; /* Set defaults. */ assert(image_info != (ImageInfo *) NULL); assert(image_info->signature == MagickSignature); if (image_info->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); assert(exception != (ExceptionInfo *) NULL); if (argc < 2) IdentifyUsage(); count=0; format=NULL; j=1; k=0; image_stack[k]=NewImageList(); option=(char *) NULL; pend=MagickFalse; status=MagickTrue; /* Identify an image. */ ReadCommandlLine(argc,&argv); status=ExpandFilenames(&argc,&argv); if (status == MagickFalse) { char *message; message=GetExceptionMessage(errno); ThrowIdentifyException(ResourceLimitError,"MemoryAllocationFailed", message); message=DestroyString(message); } for (i=1; i < (long) argc; i++) { option=argv[i]; if (LocaleCompare(option,"(") == 0) { if (k == MaxImageStackDepth) ThrowIdentifyException(OptionError,"ParenthesisNestedTooDeeply", option); MogrifyImageStack(image_stack[k],MagickTrue,pend); k++; image_stack[k]=NewImageList(); continue; } if (LocaleCompare(option,")") == 0) { if (k == 0) ThrowIdentifyException(OptionError,"UnableToParseExpression",option); if (image_stack[k] != (Image *) NULL) { MogrifyImageStack(image_stack[k],MagickTrue,MagickTrue); AppendImageToList(&image_stack[k-1],image_stack[k]); } k--; continue; } if (IsMagickOption(option) == MagickFalse) { char *filename; Image *image; ImageInfo *identify_info; /* Read input image. */ MogrifyImageStack(image_stack[k],MagickFalse,pend); identify_info=CloneImageInfo(image_info); identify_info->verbose=MagickFalse; filename=argv[i]; if ((LocaleCompare(filename,"--") == 0) && (i < (argc-1))) filename=argv[++i]; (void) CopyMagickString(identify_info->filename,filename,MaxTextExtent); if (identify_info->ping == MagickFalse) image=ReadImage(identify_info,exception); else image=PingImage(identify_info,exception); identify_info=DestroyImageInfo(identify_info); status&=(image != (Image *) NULL) && (exception->severity < ErrorException); if (image == (Image *) NULL) continue; AppendImageToList(&image_stack[k],image); MogrifyImageStack(image_stack[k],MagickFalse,MagickTrue); image=image_stack[k]; for ( ; image != (Image *) NULL; image=GetNextImageInList(image)) { if (image->scene == 0) image->scene=count++; if (format == (char *) NULL) { (void) IdentifyImage(image,stdout,image_info->verbose); continue; } if (metadata != (char **) NULL) { char *text; text=InterpretImageProperties(image_info,image,format); if (text == (char *) NULL) { char *message; message=GetExceptionMessage(errno); ThrowIdentifyException(ResourceLimitError, "MemoryAllocationFailed",message); message=DestroyString(message); } (void) ConcatenateString(&(*metadata),text); text=DestroyString(text); if (LocaleCompare(format,"%n") == 0) break; } } image_stack[k]=DestroyImageList(image_stack[k]); continue; } pend=image_stack[k] != (Image *) NULL ? MagickTrue : MagickFalse; switch (*(option+1)) { case 'a': { if (LocaleCompare("alpha",option+1) == 0) { long type; if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); type=ParseMagickOption(MagickAlphaOptions,MagickFalse,argv[i]); if (type < 0) ThrowIdentifyException(OptionError,"UnrecognizedAlphaChannelType", argv[i]); break; } if (LocaleCompare("antialias",option+1) == 0) break; if (LocaleCompare("authenticate",option+1) == 0) { if (*option == '+') break; i++; if (i == (long) (argc-1)) ThrowIdentifyException(OptionError,"MissingArgument",option); break; } ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'c': { if (LocaleCompare("cache",option+1) == 0) { if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); if (IsGeometry(argv[i]) == MagickFalse) ThrowIdentifyInvalidArgumentException(option,argv[i]); break; } if (LocaleCompare("channel",option+1) == 0) { long channel; if (*option == '+') break; i++; if (i == (long) (argc-1)) ThrowIdentifyException(OptionError,"MissingArgument",option); channel=ParseChannelOption(argv[i]); if (channel < 0) ThrowIdentifyException(OptionError,"UnrecognizedChannelType", argv[i]); break; } if (LocaleCompare("colorspace",option+1) == 0) { long colorspace; if (*option == '+') break; i++; if (i == (long) (argc-1)) ThrowIdentifyException(OptionError,"MissingArgument",option); colorspace=ParseMagickOption(MagickColorspaceOptions, MagickFalse,argv[i]); if (colorspace < 0) ThrowIdentifyException(OptionError,"UnrecognizedColorspace", argv[i]); break; } if (LocaleCompare("crop",option+1) == 0) { if (*option == '+') break; i++; if (i == (long) (argc-1)) ThrowIdentifyException(OptionError,"MissingArgument",option); if (IsGeometry(argv[i]) == MagickFalse) ThrowIdentifyInvalidArgumentException(option,argv[i]); image_info->ping=MagickFalse; break; } ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'd': { if (LocaleCompare("debug",option+1) == 0) { long event; if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); event=ParseMagickOption(MagickLogEventOptions,MagickFalse,argv[i]); if (event < 0) ThrowIdentifyException(OptionError,"UnrecognizedEventType", argv[i]); (void) SetLogEventMask(argv[i]); break; } if (LocaleCompare("define",option+1) == 0) { i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); if (*option == '+') { const char *define; define=GetImageOption(image_info,argv[i]); if (define == (const char *) NULL) ThrowIdentifyException(OptionError,"NoSuchOption",argv[i]); break; } break; } if (LocaleCompare("density",option+1) == 0) { if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); if (IsGeometry(argv[i]) == MagickFalse) ThrowIdentifyInvalidArgumentException(option,argv[i]); break; } if (LocaleCompare("depth",option+1) == 0) { if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); if (IsGeometry(argv[i]) == MagickFalse) ThrowIdentifyInvalidArgumentException(option,argv[i]); break; } ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'f': { if (LocaleCompare("format",option+1) == 0) { format=(char *) NULL; if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); format=argv[i]; break; } if (LocaleCompare("fuzz",option+1) == 0) { if (*option == '+') break; i++; if (i == (long) (argc-1)) ThrowIdentifyException(OptionError,"MissingArgument",option); if (IsGeometry(argv[i]) == MagickFalse) ThrowIdentifyInvalidArgumentException(option,argv[i]); break; } ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'g': { if (LocaleCompare("gamma",option+1) == 0) { i++; if (i == (long) (argc-1)) ThrowIdentifyException(OptionError,"MissingArgument",option); if (IsGeometry(argv[i]) == MagickFalse) ThrowIdentifyInvalidArgumentException(option,argv[i]); break; } ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'h': { if ((LocaleCompare("help",option+1) == 0) || (LocaleCompare("-help",option+1) == 0)) IdentifyUsage(); ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'i': { if (LocaleCompare("interlace",option+1) == 0) { long interlace; if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); interlace=ParseMagickOption(MagickInterlaceOptions,MagickFalse, argv[i]); if (interlace < 0) ThrowIdentifyException(OptionError, "UnrecognizedInterlaceType",argv[i]); break; } if (LocaleCompare("interpolate",option+1) == 0) { long interpolate; if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); interpolate=ParseMagickOption(MagickInterpolateOptions,MagickFalse, argv[i]); if (interpolate < 0) ThrowIdentifyException(OptionError, "UnrecognizedInterpolateMethod",argv[i]); break; } ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'l': { if (LocaleCompare("limit",option+1) == 0) { long resource; if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); resource=ParseMagickOption(MagickResourceOptions,MagickFalse, argv[i]); if (resource < 0) ThrowIdentifyException(OptionError,"UnrecognizedResourceType", argv[i]); i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); if ((LocaleCompare("unlimited",argv[i]) != 0) && (IsGeometry(argv[i]) == MagickFalse)) ThrowIdentifyInvalidArgumentException(option,argv[i]); break; } if (LocaleCompare("list",option+1) == 0) { long list; if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); list=ParseMagickOption(MagickListOptions,MagickFalse,argv[i]); if (list < 0) ThrowIdentifyException(OptionError,"UnrecognizedListType", argv[i]); (void) MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) argv+j,exception); DestroyIdentify(); return(MagickTrue); } if (LocaleCompare("log",option+1) == 0) { if (*option == '+') break; i++; if ((i == (long) argc) || (strchr(argv[i],'%') == (char *) NULL)) ThrowIdentifyException(OptionError,"MissingArgument",option); break; } ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'm': { if (LocaleCompare("matte",option+1) == 0) break; if (LocaleCompare("monitor",option+1) == 0) break; ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'p': { if (LocaleCompare("ping",option+1) == 0) break; ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'q': { if (LocaleCompare("quiet",option+1) == 0) break; ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'r': { if (LocaleCompare("regard-warnings",option+1) == 0) break; ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 's': { if (LocaleCompare("sampling-factor",option+1) == 0) { if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); if (IsGeometry(argv[i]) == MagickFalse) ThrowIdentifyInvalidArgumentException(option,argv[i]); break; } if (LocaleCompare("seed",option+1) == 0) { unsigned long seed; if (*option == '+') { seed=(unsigned long) time((time_t *) NULL); SeedRandomReservoir(seed); break; } i++; if (i == (long) (argc-1)) ThrowIdentifyException(OptionError,"MissingArgument",option); if (IsGeometry(argv[i]) == MagickFalse) ThrowIdentifyInvalidArgumentException(option,argv[i]); seed=(unsigned long) atol(argv[i]); SeedRandomReservoir(seed); break; } if (LocaleCompare("set",option+1) == 0) { i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); break; } if (LocaleCompare("size",option+1) == 0) { if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); if (IsGeometry(argv[i]) == MagickFalse) ThrowIdentifyInvalidArgumentException(option,argv[i]); break; } if (LocaleCompare("strip",option+1) == 0) break; if (LocaleCompare("support",option+1) == 0) { if (*option == '+') break; i++; if (i == (long) argc) ThrowIdentifyException(OptionError,"MissingArgument",option); if (IsGeometry(argv[i]) == MagickFalse) ThrowIdentifyInvalidArgumentException(option,argv[i]); break; } ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'u': { if (LocaleCompare("units",option+1) == 0) { long units; if (*option == '+') break; i++; if (i == (long) (argc-1)) ThrowIdentifyException(OptionError,"MissingArgument",option); units=ParseMagickOption(MagickResolutionOptions,MagickFalse, argv[i]); if (units < 0) ThrowIdentifyException(OptionError,"UnrecognizedUnitsType", argv[i]); break; } ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case 'v': { if (LocaleCompare("verbose",option+1) == 0) break; if ((LocaleCompare("version",option+1) == 0) || (LocaleCompare("-version",option+1) == 0)) { (void) fprintf(stdout,"Version: %s\n", GetMagickVersion((unsigned long *) NULL)); (void) fprintf(stdout,"Copyright: %s\n\n",GetMagickCopyright()); break; } if (LocaleCompare("virtual-pixel",option+1) == 0) { long method; if (*option == '+') break; i++; if (i == (long) (argc-1)) ThrowIdentifyException(OptionError,"MissingArgument",option); method=ParseMagickOption(MagickVirtualPixelOptions,MagickFalse, argv[i]); if (method < 0) ThrowIdentifyException(OptionError, "UnrecognizedVirtualPixelMethod",argv[i]); break; } ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } case '?': break; default: ThrowIdentifyException(OptionError,"UnrecognizedOption",option) } fire=(MagickBooleanType) ParseMagickOption(MagickMogrifyOptions, MagickFalse,option+1); if (fire == MagickTrue) MogrifyImageStack(image_stack[k],MagickTrue,MagickTrue); } if (k != 0) ThrowIdentifyException(OptionError,"UnbalancedParenthesis",argv[i]); if (i != argc) ThrowIdentifyException(OptionError,"MissingAnImageFilename",argv[i]); DestroyIdentify(); return(status != 0 ? MagickTrue : MagickFalse); }
/*---------------------------------------------------------- * int_imfinfo: * interface for imfinfo function. * should provide type=imfinfo(name) at Scilab level * $Revision: 1.3 $ $Date: 2009-04-14 14:02:45 $ *----------------------------------------------------------*/ SipExport int int_imfinfo(char *fname) { /* Interface variables */ int mC, nC, lC, /* for name input arg */ mV, nV, lV, /* for "verbose" optional input arg */ mL=12, nL=1, lL, /* for list output arg */ mS=1, nS=12, mFileName, nFileName=1, mFileSize=1, nFileSize=1, mFormat, nFormat=1, mWidth=1, nWidth=1, mHeight=1, nHeight=1, mDepth=1, nDepth=1, mStorageType, nStorageType=1, mNumberOfColors=1, nNumberOfColors=1, mResolutionUnit, nResolutionUnit=1, mXResolution=1, nXResolution=1, mYResolution=1, nYResolution=1, pos, minlhs=1, maxlhs=1, minrhs=1, maxrhs=2, i; unsigned long int *lWidth, *lHeight, *lDepth, *lNumberOfColors, *lFileSize, fsize; char *lFileName, *lStorageType, *lFormat, *lResolutionUnit, *arg2; double *lXResolution, *lYResolution; static char *Str[]= { "type", "FileName", "FileSize", "Format", "Width", "Height", "Depth", "StorageType", "NumberOfColors", "ResolutionUnit", "XResolution", "YResolution" }; /* ImageMagick variables */ ExceptionInfo exception; Image *image; ImageInfo *image_info; CheckRhs(minrhs, maxrhs); CheckLhs(minlhs, maxlhs); /* Get name (#1) and "verbose" optional arg (#2)*/ GetRhsVar(1, "c", &mC, &nC, &lC); if (Rhs == 2) { GetRhsVar(2, "c", &mV, &nV, &lV); arg2 = (char *)calloc(strlen(cstk(lV))+1, sizeof(char)); if (!arg2) sip_error("unable to alloc memory"); strcpy(arg2,cstk(lV)); } InitializeMagick(NULL); GetExceptionInfo(&exception); image_info=CloneImageInfo((ImageInfo *) NULL); (void) strcpy(image_info->filename,cstk(lC)); image = PingImage(image_info, &exception); if (image == (Image *) NULL) { /* clean up */ if (Rhs==2) free(arg2); if(exception.reason != NULL) { char errmsg[50]; for (i=0; i<49; i++) errmsg[i]=' '; errmsg[49]='\0'; strncpy(errmsg,GetLocaleExceptionMessage(exception.severity,exception.reason),50); DestroyImageInfo(image_info); DestroyExceptionInfo(&exception); DestroyMagick(); sip_error(errmsg); } DestroyImageInfo(image_info); DestroyExceptionInfo(&exception); DestroyMagick(); sip_error("unknown reason"); } pos =1; CreateVar(1, "t", &mL, &nL, &lL); CreateListVarFromPtr(1,pos++,"S", &mS, &nS, Str); lFileName = image->filename; mFileName = strlen(image->filename); CreateListVarFromPtr(1,pos++,"c", &mFileName, &nFileName, &lFileName); fsize = SizeBlob(image); lFileSize = &fsize; CreateListVarFromPtr(1,pos++,"i", &mFileSize, &nFileSize, &lFileSize); lFormat = image->magick; mFormat = strlen(image->magick); CreateListVarFromPtr(1,pos++,"c", &mFormat, &nFormat, &lFormat); lWidth = &(image->columns); CreateListVarFromPtr(1,pos++,"i", &mWidth, &nWidth, &lWidth); lHeight = &(image->rows); CreateListVarFromPtr(1,pos++,"i", &mHeight, &nHeight, &lHeight); lDepth = &(image->depth); CreateListVarFromPtr(1,pos++,"i", &mDepth, &nDepth, &lDepth); lStorageType = (image->storage_class == DirectClass)? "truecolor":"indexed"; mStorageType = strlen(lStorageType); CreateListVarFromPtr(1,pos++,"c", &mStorageType, &nStorageType, &lStorageType); lNumberOfColors = &(image->colors); CreateListVarFromPtr(1,pos++,"i", &mNumberOfColors, \ &nNumberOfColors, &lNumberOfColors); /* lComments = image->comments; mComments = strlen(image->comments); CreateListVarFromPtr(1,pos++,"c", &mComments, &nComments, &lComments); */ lResolutionUnit = (image->units == PixelsPerInchResolution)?"inch":"centimeter"; mResolutionUnit = strlen(lResolutionUnit); CreateListVarFromPtr(1,pos++,"c", &mResolutionUnit, \ &nResolutionUnit, &lResolutionUnit); lXResolution = &(image->x_resolution); CreateListVarFromPtr(1,pos++,"i", &mXResolution, &nXResolution, &lXResolution); lYResolution = &(image->y_resolution); CreateListVarFromPtr(1,pos++,"i", &mYResolution, &nYResolution, &lYResolution); if (Rhs==2) { if (strcmp(arg2,"verbose") != 0) sip_error("invalid 2nd argument"); sciprint(" FileName: %s\n\r", image->filename); sciprint(" FileSize: %d\n\r", fsize); sciprint(" Format: %s\n\r", image->magick); sciprint(" Width: %d\n\r", image->columns); sciprint(" Height: %d\n\r", image->rows); sciprint(" Depth: %d\n\r", image->depth); sciprint(" StorageType: %s\n\r", lStorageType); sciprint(" NumberOfColors: %d\n\r", image->colors); sciprint(" ResolutionUnit: %s\n\r", lResolutionUnit); sciprint(" XResolution: %f\n\r", image->x_resolution); sciprint(" YResolution: %f\n\r", image->y_resolution); free(arg2); } /* Terminate Imagemagick */ DestroyImageInfo(image_info); DestroyImage(image); DestroyExceptionInfo(&exception); DestroyMagick(); /* Return variables */ LhsVar(1) = 1; return true; }
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % P a r s e G e o m e t r y % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % ParseGeometry() parses a geometry specification and returns the sigma, % rho, xi, and psi values. It also returns flags that indicates which % of the four values (sigma, rho, xi, psi) were located in the string, and % whether the xi or pi values are negative. In addition, there are flags to % report any meta characters (%, !, <, or >). % % The format of the ParseGeometry method is: % % unsigned int ParseGeometry(const char *geometry, % GeometryInfo *geometry_info) % % A description of each parameter follows: % % o geometry: The geometry. % % o geometry_info: returns the parsed width/height/x/y in this structure. % % */ WandExport unsigned int ParseGeometry(const char *geometry, GeometryInfo *geometry_info) { char *p, pedantic_geometry[MaxTextExtent], *q; unsigned int flags; double double_val; /* Remove whitespaces meta characters from geometry specification. */ assert(geometry_info != (GeometryInfo *) NULL); flags=NoValue; if ((geometry == (char *) NULL) || (*geometry == '\0')) return(flags); if (strlcpy(pedantic_geometry,geometry,sizeof(pedantic_geometry)) >= sizeof(pedantic_geometry)) return(flags); for (p=pedantic_geometry; *p != '\0'; ) { if (isspace((int) (*p))) { (void) strcpy(p,p+1); continue; } switch (*p) { case '%': { flags|=PercentValue; (void) strcpy(p,p+1); break; } case '!': { flags|=AspectValue; (void) strcpy(p,p+1); break; } case '<': { flags|=LessValue; (void) strcpy(p,p+1); break; } case '>': { flags|=GreaterValue; (void) strcpy(p,p+1); break; } case '@': { flags|=AreaValue; (void) strcpy(p,p+1); break; } case '-': case '.': case '+': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'x': case 'X': case ',': case '/': { p++; break; } default: { ExceptionInfo exception; Image *image; ImageInfo *image_info; /* See if we can grab geometry from an image. */ GetExceptionInfo(&exception); image_info=CloneImageInfo((ImageInfo *) NULL); (void) strlcpy(image_info->filename,geometry,sizeof(image_info->filename)); image=PingImage(image_info,&exception); if (image != (Image *) NULL) { geometry_info->rho=image->columns; geometry_info->sigma=image->rows; flags|=RhoValue | SigmaValue; DestroyImage(image); } DestroyImageInfo(image_info); DestroyExceptionInfo(&exception); return(flags); } } } /* Parse rho, sigma, xi, and psi. */ p=pedantic_geometry; if (*p == '\0') return(flags); q=p; double_val=strtod(p,&q); (void) double_val; if ((*q == 'x') || (*q == 'X') || (*q == '/') || (*q == ',') || (*q =='\0')) { /* Parse rho. */ q=p; if (LocaleNCompare(p,"0x",2) == 0) geometry_info->rho=strtol(p,&p,10); else geometry_info->rho=strtod(p,&p); if (p != q) flags|=RhoValue; } if ((*p == 'x') || (*p == 'X') || (*p == '/') || (*p == ',')) { /* Parse sigma. */ p++; q=p; geometry_info->sigma=strtod(p,&p); if (p != q) flags|=SigmaValue; } if ((*p == '+') || (*p == '-') || (*p == ',') || (*p == '/')) { /* Parse xi value. */ if ((*p == ',') || (*p == '/')) p++; q=p; geometry_info->xi=strtod(p,&p); if (p != q) { flags|=XiValue; if (*q == '-') flags|=XiNegative; } if ((*p == '+') || (*p == '-') || (*p == ',') || (*p == '/')) { /* Parse psi value. */ if ((*p == ',') || (*p == '/')) p++; q=p; geometry_info->psi=strtod(p,&p); if (p != q) { flags|=PsiValue; if (*q == '-') flags|=PsiNegative; } } } return(flags); }