#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"
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% 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) /* NOT fx: !!!! */
+ 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) )
{
case 'c': /* image comment property - empty string by default */
{
string=GetImageProperty(image,"comment",exception);
- if ( string == (const char *)NULL)
+ if (string == (const char *) NULL)
string="";
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 formatted comment! */
+ /*
+ FUTURE: ensure this does not generate the formatted comment!
+ */
(void) FormatLocaleString(value,MaxTextExtent,"%.20g",(double)
GetNumberColors(image,(FILE *) NULL,exception));
break;
(void) FormatLocaleString(value,MaxTextExtent,"%s %s %s",
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 */
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. */
string=value;
if (string != (char *) NULL)
{
- (void) SetImageArtifact(image, "get-property", string);
- return(GetImageArtifact(image, "get-property"));
+ (void) SetImageArtifact(image,"get-property",string);
+ return(GetImageArtifact(image,"get-property"));
}
return((char *)NULL);
}
CommandOptionToMnemonic(MagickColorspaceOptions,(ssize_t)
image->colorspace));
LocaleLower(value);
- if( IfMagickTrue(image->matte) )
+ if( image->alpha_trait == BlendPixelTrait )
(void) ConcatenateMagickString(value,"a",MaxTextExtent);
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)
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;
% < > & 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 property string name, or a per-image
-% 'artifact' (as generated from a global option)
+% '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:
%
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 '\\':
}
/*
- Single letter escapes
+ Single letter escapes %c
*/
if ( *p != '[' ) {
const char
}
/*
- Braced Percent Escape
+ Braced Percent Escape %[...]
*/
{
char
% 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)
return(MagickFalse);
}
- /* FUTURE: These should produce 'illegal settings'
- + binary chars in p[roperty key
+ /* FUTURE: These should produce a 'illegal settings' error
+ + binary chars in property key
+ single letter property keys (read only)
- + known special prefix (read only, they don't get saved!)
+ + known special prefixes (read only, they don't get saved!)
*/
switch (*property)
(LocaleCompare("min",property) == 0) ||
(LocaleCompare("min",property) == 0) )
{
- (void) ThrowMagickException(exception,GetMagickModule(),
- OptionError,"SetReadOnlyProperty","'%s'",property);
+ (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
+ "SetReadOnlyProperty","'%s'",property);
status=MagickFalse;
break;
}