#include "MagickCore/attribute.h"
#include "MagickCore/cache.h"
#include "MagickCore/color.h"
+#include "MagickCore/color-private.h"
+#include "MagickCore/colorspace-private.h"
#include "MagickCore/compare.h"
#include "MagickCore/constitute.h"
#include "MagickCore/draw.h"
#include "MagickCore/geometry.h"
#include "MagickCore/histogram.h"
#include "MagickCore/image.h"
-#include "MagickCore/image.h"
#include "MagickCore/layer.h"
#include "MagickCore/locale-private.h"
#include "MagickCore/list.h"
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% CloneImageProperties() clones one or more image properties.
+% CloneImageProperties() clones all the image properties to another image.
%
% The format of the CloneImageProperties method is:
%
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% DefineImageProperty() associates a key/value pair with an image property.
+% DefineImageProperty() associates an assignment string of the form
+% "key=value" with per-image artifact. It is equivelent to
+% SetImageProperity().
%
% The format of the DefineImageProperty method is:
%
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% DestroyImageProperties() releases memory associated with image property
-% values.
+% DestroyImageProperties() destroys all properities and associated memory
+% attached to the given image.
%
% The format of the DestroyDefines method is:
%
%
% GetImageProperty() gets a value associated with an image property.
%
+% The returned string is a constant string in the tree and should NOT be
+% freed by the caller.
+%
% The format of the GetImageProperty method is:
%
% const char *GetImageProperty(const Image *image,const char *key,
if ((count != 0) && ((size_t) count <= length))
{
resource=(char *) NULL;
- if (~(1UL*count) >= (MaxTextExtent-1))
+ if (~((size_t) count) >= (MaxTextExtent-1))
resource=(char *) AcquireQuantumMemory((size_t) count+MaxTextExtent,
sizeof(*resource));
if (resource != (char *) NULL)
We have the resource of interest.
*/
attribute=(char *) NULL;
- if (~(1UL*count) >= (MaxTextExtent-1))
+ if (~((size_t) count) >= (MaxTextExtent-1))
attribute=(char *) AcquireQuantumMemory((size_t) count+MaxTextExtent,
sizeof(*attribute));
if (attribute != (char *) NULL)
{ 0x1001c, "exif:GPSAreaInformation" },
{ 0x1001d, "exif:GPSDateStamp" },
{ 0x1001e, "exif:GPSDifferential" },
- { 0x0000, NULL}
+ { 0x00000, (const char *) NULL }
};
const StringInfo
case EXIF_FMT_STRING:
{
value=(char *) NULL;
- if (~(1UL*number_bytes) >= 1)
+ if (~((size_t) number_bytes) >= 1)
value=(char *) AcquireQuantumMemory((size_t) number_bytes+1UL,
sizeof(*value));
if (value != (char *) NULL)
if (value != (char *) NULL)
{
char
- key[MaxTextExtent];
+ *key;
register const char
*p;
- (void) CopyMagickString(key,property,MaxTextExtent);
+ key=AcquireString(property);
+ if (level == 2)
+ (void) SubstituteString(&key,"exif:","exif:thumbnail:");
switch (all)
{
case 1:
if (p == (const char *) NULL)
(void) SetImageProperty((Image *) image,key,value,exception);
value=DestroyString(value);
+ key=DestroyString(key);
status=MagickTrue;
}
}
FxInfo
*fx_info;
- MagickRealType
+ double
alpha;
MagickStatusType
image->properties);
return(p);
}
- if (LocaleNCompare("fx:",property,3) != 0)
+ if (LocaleNCompare("fx:",property,3) != 0) /* NOT %[fx:..] !!!! */
{
p=(const char *) GetValueFromSplayTree((SplayTreeInfo *)
image->properties,property);
fx_info=AcquireFxInfo(image,property+6,exception);
status=FxEvaluateChannelExpression(fx_info,RedPixelChannel,0,0,
&alpha,exception);
- pixel.red=(MagickRealType) QuantumRange*alpha;
+ pixel.red=(double) QuantumRange*alpha;
status|=FxEvaluateChannelExpression(fx_info,GreenPixelChannel,0,0,
&alpha,exception);
- pixel.green=(MagickRealType) QuantumRange*alpha;
+ pixel.green=(double) QuantumRange*alpha;
status|=FxEvaluateChannelExpression(fx_info,BluePixelChannel,0,0,
&alpha,exception);
- pixel.blue=(MagickRealType) QuantumRange*alpha;
+ pixel.blue=(double) QuantumRange*alpha;
if (image->colorspace == CMYKColorspace)
{
status|=FxEvaluateChannelExpression(fx_info,BlackPixelChannel,0,0,
&alpha,exception);
- pixel.black=(MagickRealType) QuantumRange*alpha;
+ pixel.black=(double) QuantumRange*alpha;
}
status|=FxEvaluateChannelExpression(fx_info,AlphaPixelChannel,0,0,
&alpha,exception);
- pixel.alpha=(MagickRealType) QuantumRange*(1.0-alpha);
+ pixel.alpha=(double) QuantumRange*(1.0-alpha);
fx_info=DestroyFxInfo(fx_info);
if( IfMagickTrue(status) )
{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% GetMagickProperty() gets attributes or calculated values that is associated
-% with a fixed known property name, or single letter properity.
+% with a fixed known property name, or single letter property.
%
-% This does not return, special profile or properity expressions. Nor does it
-% return free-form properity strings, unless referenced by a single letter
-% properity name.
+% This does not return, special profile or property expressions. Nor does it
+% return free-form property strings, unless referenced by a single letter
+% property name.
%
% The returned string is stored as the image artifact 'get-property' (not as
% another property), and as such should not be freed. Later calls however
% The format of the GetMagickProperty method is:
%
% const char *GetMagickProperty(const ImageInfo *image_info,Image *image,
-% const char *properity,ExceptionInfo *exception)
+% const char *property,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
*string;
if (image != (Image *) NULL && IfMagickTrue(image->debug))
- (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
- image->filename);
-
- *value='\0'; /* formated string */
- string=(char *)NULL; /* constant string reference */
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ *value='\0'; /* formatted string */
+ string=(char *) NULL; /* constant string reference */
switch (letter)
{
-
case 'b': /* image size read in - in bytes */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
ConcatenateMagickString(value,"B",MaxTextExtent);
break;
}
- case 'c': /* image comment property */
+ case 'c': /* image comment property - empty string by default */
{
string=GetImageProperty(image,"comment",exception);
+ if (string == (const char *) NULL)
+ string="";
break;
}
case 'd': /* Directory component of filename */
case 'g': /* Image geometry, canvas and offset %Wx%H+%X+%Y */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20gx%.20g%+.20g%+.20g",
- (double) image->page.width,(double) image->page.height,
- (double) image->page.x,(double) image->page.y);
+ (double) image->page.width,(double) image->page.height,
+ (double) image->page.x,(double) image->page.y);
break;
}
case 'h': /* Image height (current) */
{
- (void) FormatLocaleString(value,MaxTextExtent,"%.20g",
- (double) (image->rows != 0 ? image->rows : image->magick_rows));
+ (void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
+ (image->rows != 0 ? image->rows : image->magick_rows));
break;
}
case 'i': /* Filename last used for image (read or write) */
}
case 'k': /* Number of unique colors */
{
- /* FUTURE: ensure this does not generate the formated comment! */
+ /*
+ FUTURE: ensure this does not generate the formatted comment!
+ */
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- GetNumberColors(image,(FILE *) NULL,exception));
+ GetNumberColors(image,(FILE *) NULL,exception));
break;
}
- case 'l': /* Image label */
+ case 'l': /* Image label property - empty string by default */
{
string=GetImageProperty(image,"label",exception);
+ if ( string == (const char *)NULL)
+ string="";
break;
}
case 'm': /* Image format (file magick) */
case 'n': /* Number of images in the list. */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- GetImageListLength(image));
+ GetImageListLength(image));
break;
}
case 'o': /* Output Filename - for delegate use only */
case 'p': /* Image index in current image list -- As 'n' OBSOLETE */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- GetImageIndexInList(image));
+ GetImageIndexInList(image));
break;
}
case 'q': /* Quantum depth of image in memory */
if (IfMagickTrue(IsImageGray(image,exception)))
colorspace=GRAYColorspace;
(void) FormatLocaleString(value,MaxTextExtent,"%s %s %s",
- CommandOptionToMnemonic(MagickClassOptions,(ssize_t)image->storage_class),
+ CommandOptionToMnemonic(MagickClassOptions,(ssize_t) image->storage_class),
CommandOptionToMnemonic(MagickColorspaceOptions,(ssize_t) colorspace),
- IfMagickTrue(image->matte)?"Matte":"");
+ image->alpha_trait == BlendPixelTrait ? "Matte" : "");
break;
}
case 's': /* Image scene number */
{
if (image_info->number_scenes != 0)
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image_info->scene);
+ image_info->scene);
else
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image->scene);
+ image->scene);
break;
}
case 't': /* Base filename without directory or extention */
case 'w': /* Image width (current) */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- (image->columns != 0 ? image->columns : image->magick_columns));
+ (image->columns != 0 ? image->columns : image->magick_columns));
break;
}
case 'x': /* Image horizontal resolution (with units) */
{
(void) FormatLocaleString(value,MaxTextExtent,"%g %s",
- image->resolution.x,CommandOptionToMnemonic(
- MagickResolutionOptions,(ssize_t)image->units));
+ image->resolution.x,CommandOptionToMnemonic(
+ MagickResolutionOptions,(ssize_t)image->units));
break;
}
case 'y': /* Image vertical resolution (with units) */
{
(void) FormatLocaleString(value,MaxTextExtent,"%g %s",
- image->resolution.y,CommandOptionToMnemonic(
- MagickResolutionOptions,(ssize_t)image->units));
+ image->resolution.y,CommandOptionToMnemonic(MagickResolutionOptions,
+ (ssize_t) image->units));
break;
}
case 'z': /* Image depth as read in */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image->depth);
+ image->depth);
break;
}
case 'A': /* Image alpha channel */
{
(void) FormatLocaleString(value,MaxTextExtent,"%s",
- CommandOptionToMnemonic(MagickBooleanOptions,(ssize_t)
- image->matte));
+ CommandOptionToMnemonic(MagickBooleanOptions,(ssize_t) image->alpha_trait));
break;
}
case 'C': /* Image compression method. */
case 'D': /* Image dispose method. */
{
(void) FormatLocaleString(value,MaxTextExtent,"%s",
- CommandOptionToMnemonic(MagickDisposeOptions,(ssize_t)
- image->dispose));
+ CommandOptionToMnemonic(MagickDisposeOptions,(ssize_t) image->dispose));
break;
}
case 'G': /* Image size as geometry = "%wx%h" */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20gx%.20g",
- (double)image->magick_columns,(double) image->magick_rows);
+ (double)image->magick_columns,(double) image->magick_rows);
break;
}
case 'H': /* layer canvas height */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image->page.height);
+ image->page.height);
break;
}
case 'M': /* Magick filename - filename given incl. coder & read mods */
}
case 'O': /* layer canvas offset with sign = "+%X+%Y" */
{
- (void) FormatLocaleString(value,MaxTextExtent,"%+ld%+ld",
- (long) image->page.x,(long) image->page.y);
+ (void) FormatLocaleString(value,MaxTextExtent,"%+ld%+ld",(long)
+ image->page.x,(long) image->page.y);
break;
}
case 'P': /* layer canvas page size = "%Wx%H" */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20gx%.20g",
- (double) image->page.width,(double) image->page.height);
+ (double) image->page.width,(double) image->page.height);
break;
}
case 'Q': /* image compression quality */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image->quality);
+ image->quality);
break;
}
case 'S': /* Image scenes ???? */
string="2147483647";
else
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image_info->scene+image_info->number_scenes);
+ image_info->scene+image_info->number_scenes);
break;
}
case 'T': /* image time delay for animations */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image->delay);
+ image->delay);
break;
}
case 'W': /* layer canvas width */
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image->page.width);
+ image->page.width);
break;
}
case 'X': /* layer canvas X offset */
{
- (void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image->page.x);
+ (void) FormatLocaleString(value,MaxTextExtent,"%+.20g",(double)
+ image->page.x);
break;
}
case 'Y': /* layer canvas Y offset */
{
- (void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image->page.y);
+ (void) FormatLocaleString(value,MaxTextExtent,"%+.20g",(double)
+ image->page.y);
break;
}
case 'Z': /* Zero filename ??? */
page=GetImageBoundingBox(image,exception);
(void) FormatLocaleString(value,MaxTextExtent,"%.20gx%.20g%+.20g%+.20g",
- (double) page.width,(double) page.height,
- (double) page.x,(double) page.y);
+ (double) page.width,(double) page.height,(double) page.x,(double)
+ page.y);
break;
}
case '#': /* Image signature */
}
if (*value != '\0')
string=value;
- if (string != (char *)NULL) {
- (void) SetImageArtifact(image, "get-properity", value);
- return(GetImageArtifact(image, "get-properity"));
- }
+ if (string != (char *) NULL)
+ {
+ (void) SetImageArtifact(image,"get-property",string);
+ return(GetImageArtifact(image,"get-property"));
+ }
return((char *)NULL);
}
*string;
assert(property[0] != '\0');
- if ( property[1] == '\0') /* single letter properity request */
- return( GetMagickPropertyLetter(image_info,image,*property,exception) );
-
- if (image != (Image *) NULL && IfMagickTrue(image->debug))
- (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
- image->filename);
-
- *value='\0'; /* formated string */
- string=(char *)NULL; /* constant string reference */
+ if (property[1] == '\0') /* single letter property request */
+ return(GetMagickPropertyLetter(image_info,image,*property,exception));
+ if ((image != (Image *) NULL) && IfMagickTrue(image->debug))
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ *value='\0'; /* formated string */
+ string=(char *) NULL; /* constant string reference */
switch (*property)
{
case 'b':
{
if (LocaleCompare("channels",property) == 0)
{
- /*
- Image channels.
- */
+ /* FUTURE: return actual image channels */
(void) FormatLocaleString(value,MaxTextExtent,"%s",
CommandOptionToMnemonic(MagickColorspaceOptions,(ssize_t)
image->colorspace));
LocaleLower(value);
- if( IfMagickTrue(image->matte) )
+ if( image->alpha_trait == BlendPixelTrait )
(void) ConcatenateMagickString(value,"a",MaxTextExtent);
break;
}
ColorspaceType
colorspace;
- /*
- Image storage class and colorspace.
- */
+ /* FUTURE: return actual colorspace - no 'gray' stuff */
colorspace=image->colorspace;
if( IfMagickTrue(IsImageGray(image,exception)) )
colorspace=GRAYColorspace;
}
case 'g':
{
+ if (LocaleCompare("gamma",property) == 0)
+ {
+ (void) FormatLocaleString(value,MaxTextExtent,"%.*g",
+ GetMagickPrecision(),image->gamma);
+ break;
+ }
if ( (image_info != (ImageInfo *) NULL) &&
(LocaleCompare("group",property) == 0) )
{
- (void) FormatLocaleString(value,MaxTextExtent,"0x%lx",
- (unsigned long) image_info->group);
+ (void) FormatLocaleString(value,MaxTextExtent,"0x%lx",(unsigned long)
+ image_info->group);
break;
}
break;
mean,
standard_deviation;
- (void) GetImageMean(image,&mean,&standard_deviation,
- exception);
+ (void) GetImageMean(image,&mean,&standard_deviation,exception);
(void) FormatLocaleString(value,MaxTextExtent,"%.*g",
GetMagickPrecision(),mean);
break;
opaque;
opaque=IsImageOpaque(image,exception);
- (void) CopyMagickString(value,IfMagickTrue(opaque)?"true":"false",
- MaxTextExtent);
+ (void) CopyMagickString(value,IfMagickTrue(opaque) ? "true" : "false",
+ MaxTextExtent);
break;
}
if (LocaleCompare("orientation",property) == 0)
image->orientation);
break;
}
- if ( (image_info != (ImageInfo *) NULL) &&
- (LocaleCompare("output",property) == 0) )
+ if ((image_info != (ImageInfo *) NULL) &&
+ (LocaleCompare("output",property) == 0))
{
(void) CopyMagickString(value,image_info->filename,MaxTextExtent);
break;
}
case 'r':
{
- /* FUTURE: Obsolete */
+ /* This matches %[fx:resolution.x] */
if (LocaleCompare("resolution.x",property) == 0)
{
(void) FormatLocaleString(value,MaxTextExtent,"%g",
image->resolution.x);
break;
}
- /* FUTURE: Obsolete */
+ /* This matches %[fx:resolution.y] */
if (LocaleCompare("resolution.y",property) == 0)
{
(void) FormatLocaleString(value,MaxTextExtent,"%g",
{
if (LocaleCompare("scene",property) == 0)
{
- if ( (image_info != (ImageInfo *) NULL) &&
- (image_info->number_scenes != 0) )
+ if ((image_info != (ImageInfo *) NULL) &&
+ (image_info->number_scenes != 0))
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image_info->scene);
+ image_info->scene);
else
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
- image->scene);
+ image->scene);
break;
}
if (LocaleCompare("scenes",property) == 0)
mean,
standard_deviation;
- (void) GetImageMean(image,&mean,&standard_deviation,
- exception);
+ (void) GetImageMean(image,&mean,&standard_deviation,exception);
(void) FormatLocaleString(value,MaxTextExtent,"%.*g",
GetMagickPrecision(),standard_deviation);
break;
}
break;
}
+ case 't':
+ {
+ if (LocaleCompare("type",property) == 0)
+ {
+ string=CommandOptionToMnemonic(MagickTypeOptions,(ssize_t)
+ GetImageType(image,exception));
+ break;
+ }
+ break;
+ }
case 'u':
{
- if ( (image_info != (ImageInfo *) NULL) &&
- (LocaleCompare("unique",property) == 0) )
+ if ((image_info != (ImageInfo *) NULL) &&
+ (LocaleCompare("unique",property) == 0))
{
string=image_info->unique;
break;
}
break;
}
- case 'x': /* ( X resolution, (with units) */
+ case 'x': /* FUTURE: Obsolete X resolution */
{
if ((LocaleCompare("xresolution",property) == 0) ||
(LocaleCompare("x-resolution",property) == 0) )
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",
- image->resolution.x);
+ image->resolution.x);
break;
}
break;
}
- case 'y': /* ( Y resolution, (with units) */
+ case 'y': /* FUTURE: Obsolete Y resolution */
{
if ((LocaleCompare("yresolution",property) == 0) ||
(LocaleCompare("y-resolution",property) == 0) )
{
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",
- image->resolution.y);
+ image->resolution.y);
break;
}
break;
}
case 'z':
{
- if ( (image_info != (ImageInfo *) NULL) &&
- (LocaleCompare("zero",property) == 0) )
+ if ((image_info != (ImageInfo *) NULL) &&
+ (LocaleCompare("zero",property) == 0))
{
string=image_info->zero;
break;
}
if (*value != '\0')
string=value;
- if (string != (char *)NULL) {
- (void) SetImageArtifact(image, "get-properity", value);
- return(GetImageArtifact(image, "get-properity"));
- }
+ if (string != (char *)NULL)
+ {
+ (void) SetImageArtifact(image,"get-property", string);
+ return(GetImageArtifact(image,"get-property"));
+ }
return((char *)NULL);
}
\f
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% GetNextImageProperty() gets the next free-form string properity name.
+% GetNextImageProperty() gets the next free-form string property name.
%
% The format of the GetNextImageProperty method is:
%
% < > & replaced by '<', '>', '&' resp.
% %% replaced by percent
%
-% %x where 'x' is a single letter, case sensitive).
-% %[type:name] where 'type' is specifically known prefix.
+% %x %[x] where 'x' is a single letter properity, case sensitive).
+% %[type:name] where 'type' a is special and known prefix.
% %[name] where 'name' is a specifically known attribute, calculated
-% value, or a per-image properity string name, or a per-image
-% 'artifact' (as generated from a global option)
+% value, or a per-image property string name, or a per-image
+% 'artifact' (as generated from a global option).
+% It may contain ':' as long as the prefix is not special.
%
-% Single letter % substitutions will only happen if the preceeding character
-% is NOT a number. But braced substitutions will always be performed. This
-% prevents typical usage of percent in 'geometry arguments' from being
-% substituted unexpectedly.
+% Single letter % substitutions will only happen if the character before the
+% percent is NOT a number. But braced substitutions will always be performed.
+% This prevents the typical usage of percent in a interpreted geometry
+% argument from being substituted when the percent is a geometry flag.
%
% If 'glob-expresions' ('*' or '?' characters) is used for 'name' it may be
% used as a search pattern to print multiple lines of "name=value\n" pairs of
% the associacted set of properities.
%
-% The returned string must be freed using DestoryString().
+% The returned string must be freed using DestoryString() by the caller.
%
% The format of the InterpretImageProperties method is:
%
if( IfMagickTrue(image->debug) )
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
- if ((embed_text == (const char *) NULL) || (*embed_text == '\0'))
+ if ((embed_text == (const char *) NULL))
return((char *) NULL);
p=embed_text;
+ if (*p == '\0')
+ return(ConstantString(""));
+
/* handle a '@' replace string from file */
if (*p == '@') {
p++;
if (*p != '-' && IfMagickFalse(IsPathAccessible(p)) ) {
(void) ThrowMagickException(exception,GetMagickModule(),
- OptionError,"UnableToAcessPath","%s",p);
+ OptionError,"UnableToAccessPath","%s",p);
return((char *) NULL);
}
return(FileToString(p,~0,exception));
q=interpret_text+strlen(interpret_text);
}
/*
- Look for percent escapes, (and handle other specials)
+ Look for the various escapes, (and handle other specials)
*/
switch (*p) {
case '\\':
}
continue; /* never reached! */
case '&':
- if (LocaleNCompare("<",p+1,4) != 0)
+ if (LocaleNCompare("<",p,4) == 0)
*q++='<', p+=3;
- else if (LocaleNCompare(">",p+1,4) != 0)
+ else if (LocaleNCompare(">",p,4) == 0)
*q++='>', p+=3;
- else if (LocaleNCompare("&",p+1,5) != 0)
+ else if (LocaleNCompare("&",p,5) == 0)
*q++='&', p+=4;
else
*q++=(*p);
*q++=(*p); /* any thing else is 'as normal' */
continue;
}
+ p++; /* advance beyond the percent */
/*
- Doubled Percent
+ Doubled Percent - or percent at end of string
*/
- if ( *(p+1) == '%' ) {
- *q++=(*p);
- p++;
- }
+ if ( *p == '\0' )
+ p--;
+ if ( *p == '%' ) {
+ *q++='%';
+ continue;
+ }
/*
- Single letter escapes
+ Single letter escapes %c
*/
- if ( *(p+1) != '[' ) {
+ if ( *p != '[' ) {
const char
*value;
/* But only if not preceeded by a number! */
if ( IfMagickTrue(number) ) {
- *q++=(*p); /* do NOT substitute the percent */
+ *q++='%'; /* do NOT substitute the percent */
+ p--; /* back up one */
continue;
}
- p++;
value=GetMagickPropertyLetter(image_info,image,*p, exception);
if (value != (char *) NULL) {
length=strlen(value);
extent+=length;
interpret_text=(char *) ResizeQuantumMemory(interpret_text,
extent+MaxTextExtent,sizeof(*interpret_text));
- if (interpret_text == (char *) NULL) {
- value=DestroyString((char *)value);
+ if (interpret_text == (char *) NULL)
return((char *)NULL);
- }
q=interpret_text+strlen(interpret_text);
}
(void) CopyMagickString(q,value,extent);
}
/*
- Braced Percent Escape
+ Braced Percent Escape %[...]
*/
{
char
depth;
/* get the string framed by the %[...] */
- p+=2; /* advance p to just inside the opening brace */
+ p++; /* advance p to just inside the opening brace */
depth=1;
if ( *p == ']' ) {
(void) ThrowMagickException(exception,GetMagickModule(),
pattern[64] = '\0';
}
(void) ThrowMagickException(exception,GetMagickModule(),
- OptionError,"UnbalancedBraces","\"%%[%s]\"",pattern);
- break; /* exit loop */
+ OptionError,"UnbalancedBraces","\"%%[%s\"",pattern);
+ interpret_text=DestroyString(interpret_text);
+ return((char *)NULL);
}
/*
- Special Properity Prefixes
+ Special Property Prefixes
such as: %[exif:...] %[fx:...] %[pixel:...]
- Otherwise a free-form properity string
+ Otherwise a free-form property string
*/
value=GetImageProperty(image,pattern,exception);
if (value != (const char *) NULL)
continue;
}
/*
- Handle properity 'glob' patterns
+ Handle property 'glob' patterns
Such as: %[*] %[user:array_??] %[filename:e*]
*/
if( IfMagickTrue(IsGlob(pattern)) )
extent+=length;
interpret_text=(char *) ResizeQuantumMemory(interpret_text,
extent+MaxTextExtent,sizeof(*interpret_text));
- if (interpret_text == (char *) NULL) {
- value=DestroyString((char *)value);
+ if (interpret_text == (char *) NULL)
return((char *)NULL);
- }
q=interpret_text+strlen(interpret_text);
}
(void) CopyMagickString(q,value,extent);
% RemoveImageProperty() removes a property from the image and returns its
% value.
%
+% In this case the ConstantString() value returned should be freed by the
+% caller when finished.
+%
% The format of the RemoveImageProperty method is:
%
% char *RemoveImageProperty(Image *image,const char *property)
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% SetImageProperty() saves teh given string value either to specific known
-% attribute or to a freeform properity string.
+% SetImageProperty() saves the given string value either to specific known
+% attribute or to a freeform property string.
%
-% Attempting to set a properity that is normally calculated will produce
+% Attempting to set a property that is normally calculated will produce
% an exception.
%
% The format of the SetImageProperty method is:
if( IfMagickTrue(image->debug) )
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ /* Create splay-tree */
if (image->properties == (void *) NULL)
image->properties=NewSplayTree(CompareSplayTreeString,
RelinquishMagickMemory,RelinquishMagickMemory);
- if ((value == (const char *) NULL) || (*value == '\0'))
+
+ /* Delete property if NULL -- empty string values are valid! */
+ if ((value == (const char *) NULL))
return(DeleteImageProperty(image,property));
status=MagickTrue;
+ /* Do not 'set' single letter properties - read only shorthand */
if (strlen(property) <= 1)
{
(void) ThrowMagickException(exception,GetMagickModule(),
OptionError,"SetReadOnlyProperty","'%s'",property);
return(MagickFalse);
}
- /* FUTURE: These should produce 'illegal settings'
- + test for binary chars in name,
- + first letter must be a alphabetic
- + special prefix
+
+ /* FUTURE: These should produce a 'illegal settings' error
+ + binary chars in property key
+ + single letter property keys (read only)
+ + known special prefixes (read only, they don't get saved!)
*/
switch (*property)
case 'B':
case 'b':
{
- if (LocaleCompare(property,"background") == 0)
+ if (LocaleCompare("background",property) == 0)
{
(void) QueryColorCompliance(value,AllCompliance,
&image->background_color,exception);
case 'C':
case 'c':
{
- if (LocaleCompare(property,"channels") == 0)
+ if (LocaleCompare("channels",property) == 0)
{
(void) ThrowMagickException(exception,GetMagickModule(),
OptionError,"SetReadOnlyProperty","'%s'",property);
status=MagickFalse;
break;
}
- if (LocaleCompare(property,"colorspace") == 0)
+ if (LocaleCompare("colorspace",property) == 0)
{
ssize_t
colorspace;
value);
if (colorspace < 0)
break;
- (void) SetImageColorspace(image,(ColorspaceType) colorspace,
- exception);
+ image->colorspace=(ColorspaceType) colorspace;
+ image->rendering_intent=UndefinedIntent;
+ image->gamma=1.000f;
+ ResetMagickMemory(&image->chromaticity,0,sizeof(image->chromaticity));
+ if (IssRGBColorspace(image->colorspace) != MagickFalse)
+ {
+ image->rendering_intent=PerceptualIntent;
+ image->gamma=1.000f/2.200f;
+ image->chromaticity.red_primary.x=0.6400f;
+ image->chromaticity.red_primary.y=0.3300f;
+ image->chromaticity.red_primary.z=0.0300f;
+ image->chromaticity.green_primary.x=0.3000f;
+ image->chromaticity.green_primary.y=0.6000f;
+ image->chromaticity.green_primary.z=0.1000f;
+ image->chromaticity.blue_primary.x=0.1500f;
+ image->chromaticity.blue_primary.y=0.0600f;
+ image->chromaticity.blue_primary.z=0.7900f;
+ image->chromaticity.white_point.x=0.3127f;
+ image->chromaticity.white_point.y=0.3290f;
+ image->chromaticity.white_point.z=0.3583f;
+ }
break;
}
- if (LocaleCompare(property,"compose") == 0)
+ if (LocaleCompare("compose",property) == 0)
{
ssize_t
compose;
image->compose=(CompositeOperator) compose;
break;
}
- if (LocaleCompare(property,"compress") == 0)
+ if (LocaleCompare("compress",property) == 0)
{
ssize_t
compression;
image->compression=(CompressionType) compression;
break;
}
- if (LocaleCompare(property,"copyright") == 0)
+ if (LocaleCompare("copyright",property) == 0)
{
(void) ThrowMagickException(exception,GetMagickModule(),
OptionError,"SetReadOnlyProperty","'%s'",property);
case 'D':
case 'd':
{
- if (LocaleCompare(property,"delay") == 0)
+ if (LocaleCompare("delay",property) == 0)
{
GeometryInfo
geometry_info;
image->ticks_per_second=(ssize_t) floor(geometry_info.sigma+0.5);
break;
}
- if (LocaleCompare(property,"density") == 0)
+ if (LocaleCompare("density",property) == 0)
{
GeometryInfo
geometry_info;
if ((flags & SigmaValue) == 0)
image->resolution.y=image->resolution.x;
}
- if (LocaleCompare(property,"depth") == 0)
+ if (LocaleCompare("depth",property) == 0)
{
image->depth=StringToUnsignedLong(value);
break;
}
- if (LocaleCompare(property,"dispose") == 0)
+ if (LocaleCompare("dispose",property) == 0)
{
ssize_t
dispose;
case 'G':
case 'g':
{
- if (LocaleCompare(property,"gravity") == 0)
+ if (LocaleCompare("gamma",property) == 0)
+ {
+ image->gamma=StringToDouble(value,(char **) NULL);
+ break;
+ }
+ if (LocaleCompare("gravity",property) == 0)
{
ssize_t
gravity;
}
case 'H':
case 'h':
- if (LocaleCompare(property,"height") == 0)
+ if (LocaleCompare("height",property) == 0)
{
(void) ThrowMagickException(exception,GetMagickModule(),
OptionError,"SetReadOnlyProperty","'%s'",property);
case 'I':
case 'i':
{
- if (LocaleCompare(property,"intent") == 0)
+ if (LocaleCompare("intent",property) == 0)
{
ssize_t
rendering_intent;
image->rendering_intent=(RenderingIntent) rendering_intent;
break;
}
- if (LocaleCompare(property,"interpolate") == 0)
+ if (LocaleCompare("interpolate",property) == 0)
{
ssize_t
interpolate;
}
case 'K':
case 'k':
- if (LocaleCompare(property,"kurtosis") == 0)
+ if (LocaleCompare("kurtosis",property) == 0)
{
(void) ThrowMagickException(exception,GetMagickModule(),
OptionError,"SetReadOnlyProperty","'%s'",property);
case 'L':
case 'l':
{
- if (LocaleCompare(property,"loop") == 0)
+ if (LocaleCompare("loop",property) == 0)
{
image->iterations=StringToUnsignedLong(value);
break;
}
case 'M':
case 'm':
- if ( (LocaleCompare(property,"magick") == 0) ||
- (LocaleCompare(property,"max") == 0) ||
- (LocaleCompare(property,"mean") == 0) ||
- (LocaleCompare(property,"min") == 0) ||
- (LocaleCompare(property,"min") == 0) )
- {
- (void) ThrowMagickException(exception,GetMagickModule(),
- OptionError,"SetReadOnlyProperty","'%s'",property);
+ if ( (LocaleCompare("magick",property) == 0) ||
+ (LocaleCompare("max",property) == 0) ||
+ (LocaleCompare("mean",property) == 0) ||
+ (LocaleCompare("min",property) == 0) ||
+ (LocaleCompare("min",property) == 0) )
+ {
+ (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
+ "SetReadOnlyProperty","'%s'",property);
status=MagickFalse;
break;
}
case 'O':
case 'o':
- if (LocaleCompare(property,"opaque") == 0)
+ if (LocaleCompare("opaque",property) == 0)
{
(void) ThrowMagickException(exception,GetMagickModule(),
OptionError,"SetReadOnlyProperty","'%s'",property);
case 'P':
case 'p':
{
- if (LocaleCompare(property,"page") == 0)
+ if (LocaleCompare("page",property) == 0)
{
char
*geometry;
geometry=DestroyString(geometry);
break;
}
- if (LocaleCompare(property,"profile") == 0)
+ if (LocaleCompare("profile",property) == 0)
{
ImageInfo
*image_info;
case 'R':
case 'r':
{
- if (LocaleCompare(property,"rendering-intent") == 0)
+ if (LocaleCompare("rendering-intent",property) == 0)
{
ssize_t
rendering_intent;
}
case 'S':
case 's':
- if ( (LocaleCompare(property,"size") == 0) ||
- (LocaleCompare(property,"skewness") == 0) ||
- (LocaleCompare(property,"scenes") == 0) ||
- (LocaleCompare(property,"standard-deviation") == 0) )
+ if ( (LocaleCompare("size",property) == 0) ||
+ (LocaleCompare("skewness",property) == 0) ||
+ (LocaleCompare("scenes",property) == 0) ||
+ (LocaleCompare("standard-deviation",property) == 0) )
{
(void) ThrowMagickException(exception,GetMagickModule(),
OptionError,"SetReadOnlyProperty","'%s'",property);
case 'T':
case 't':
{
- if (LocaleCompare(property,"tile-offset") == 0)
+ if (LocaleCompare("tile-offset",property) == 0)
{
char
*geometry;
case 'U':
case 'u':
{
- if (LocaleCompare(property,"units") == 0)
+ if (LocaleCompare("units",property) == 0)
{
ssize_t
units;
}
case 'V':
case 'v':
- if (LocaleCompare(property,"version") == 0)
+ if (LocaleCompare("version",property) == 0)
{
(void) ThrowMagickException(exception,GetMagickModule(),
OptionError,"SetReadOnlyProperty","'%s'",property);
}
case 'W':
case 'w':
- if (LocaleCompare(property,"width") == 0)
+ if (LocaleCompare("width",property) == 0)
{
(void) ThrowMagickException(exception,GetMagickModule(),
OptionError,"SetReadOnlyProperty","'%s'",property);