{
#define ChannelFeatures(channel,direction) \
{ \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].angular_second_moment[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].contrast[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].contrast[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].variance_sum_of_squares[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].inverse_difference_moment[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].sum_average[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].sum_variance[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].sum_entropy[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].entropy[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].difference_variance[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].difference_entropy[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].measure_of_correlation_1[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].measure_of_correlation_2[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].maximum_correlation_coefficient[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
}
{
if (image == (Image *) NULL)
break;
- (void) FormatLocaleString(color,MagickPathExtent,"%.15g,%.15g",
+ (void) FormatLocaleString(color,MagickPathExtent,"%.20g,%.20g",
image->chromaticity.blue_primary.x,
image->chromaticity.blue_primary.y);
s=newSVpv(color,0);
if (image == (Image *) NULL)
break;
- (void) FormatLocaleString(geometry,MagickPathExtent,"%.15gx%.15g",
+ (void) FormatLocaleString(geometry,MagickPathExtent,"%.20gx%.20g",
image->resolution.x,image->resolution.y);
s=newSVpv(geometry,0);
PUSHs(s ? sv_2mortal(s) : &sv_undef);
{
if (image == (Image *) NULL)
break;
- (void) FormatLocaleString(color,MagickPathExtent,"%.15g,%.15g",
+ (void) FormatLocaleString(color,MagickPathExtent,"%.20g,%.20g",
image->chromaticity.green_primary.x,
image->chromaticity.green_primary.y);
s=newSVpv(color,0);
{
if (image == (Image *) NULL)
break;
- (void) FormatLocaleString(color,MagickPathExtent,"%.15g,%.15g",
+ (void) FormatLocaleString(color,MagickPathExtent,"%.20g,%.20g",
image->chromaticity.red_primary.x,
image->chromaticity.red_primary.y);
s=newSVpv(color,0);
{
if (image == (Image *) NULL)
break;
- (void) FormatLocaleString(color,MagickPathExtent,"%.15g,%.15g",
+ (void) FormatLocaleString(color,MagickPathExtent,"%.20g,%.20g",
image->chromaticity.white_point.x,
image->chromaticity.white_point.y);
s=newSVpv(color,0);
if (attribute_flag[0] == 0)
{
(void) FormatLocaleString(message,MagickPathExtent,
- "%.15g,%.15g,%.15g",(double) argument_list[2].real_reference,
+ "%.20g,%.20g,%.20g",(double) argument_list[2].real_reference,
(double) argument_list[3].real_reference,
(double) argument_list[4].real_reference);
argument_list[0].string_reference=message;
geometry_info.rho=argument_list[6].real_reference;
SetImageArtifact(image,"modulate:colorspace","HWB");
}
- (void) FormatLocaleString(modulate,MagickPathExtent,"%.15g,%.15g,%.15g",
+ (void) FormatLocaleString(modulate,MagickPathExtent,"%.20g,%.20g,%.20g",
geometry_info.rho,geometry_info.sigma,geometry_info.xi);
(void) ModulateImage(image,modulate,exception);
break;
{
draw_info->geometry=AcquireString((char *) NULL);
(void) FormatLocaleString(draw_info->geometry,MagickPathExtent,
- "%.15g,%.15g",x,y);
+ "%.20g,%.20g",x,y);
}
status=GetTypeMetrics(image,draw_info,&metrics,exception);
(void) CatchImageException(image);
{
draw_info->geometry=AcquireString((char *) NULL);
(void) FormatLocaleString(draw_info->geometry,MagickPathExtent,
- "%.15g,%.15g",x,y);
+ "%.20g,%.20g",x,y);
}
status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
(void) CatchException(exception);
(void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
(double) channel_statistics[channel].depth); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].minima/scale); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].maxima/scale); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].mean/scale); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].standard_deviation/scale); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].kurtosis); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].skewness); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].entropy); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
}
count=0;
for ( ; image; image=image->next)
{
+ register size_t
+ i;
+
channel_statistics=GetImageStatistics(image,exception);
if (channel_statistics == (ChannelStatistics *) NULL)
continue;
count++;
- EXTEND(sp,35*count);
- scale=(double) QuantumRange;
- ChannelStatistics(RedChannel);
- ChannelStatistics(GreenChannel);
- ChannelStatistics(BlueChannel);
- if (image->colorspace == CMYKColorspace)
- ChannelStatistics(BlackChannel);
- if (image->alpha_trait != UndefinedPixelTrait)
- ChannelStatistics(AlphaChannel);
+ for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+ {
+ PixelChannel channel=GetPixelChannelChannel(image,i);
+ PixelTrait traits=GetPixelChannelTraits(image,channel);
+ if ((traits & UpdatePixelTrait) == 0)
+ continue;
+ EXTEND(sp,8*i*count);
+ ChannelStatistics(channel);
+ }
channel_statistics=(ChannelStatistics *)
RelinquishMagickMemory(channel_statistics);
}
{
#define ChannelFeatures(channel,direction) \
{ \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].angular_second_moment[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].contrast[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].contrast[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].variance_sum_of_squares[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].inverse_difference_moment[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].sum_average[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].sum_variance[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].sum_entropy[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].entropy[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].difference_variance[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].difference_entropy[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].measure_of_correlation_1[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].measure_of_correlation_2[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_features[channel].maximum_correlation_coefficient[direction]); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
}
{
if (image == (Image *) NULL)
break;
- (void) FormatLocaleString(color,MagickPathExtent,"%.15g,%.15g",
+ (void) FormatLocaleString(color,MagickPathExtent,"%.20g,%.20g",
image->chromaticity.blue_primary.x,
image->chromaticity.blue_primary.y);
s=newSVpv(color,0);
if (image == (Image *) NULL)
break;
- (void) FormatLocaleString(geometry,MagickPathExtent,"%.15gx%.15g",
+ (void) FormatLocaleString(geometry,MagickPathExtent,"%.20gx%.20g",
image->resolution.x,image->resolution.y);
s=newSVpv(geometry,0);
PUSHs(s ? sv_2mortal(s) : &sv_undef);
{
if (image == (Image *) NULL)
break;
- (void) FormatLocaleString(color,MagickPathExtent,"%.15g,%.15g",
+ (void) FormatLocaleString(color,MagickPathExtent,"%.20g,%.20g",
image->chromaticity.green_primary.x,
image->chromaticity.green_primary.y);
s=newSVpv(color,0);
{
if (image == (Image *) NULL)
break;
- (void) FormatLocaleString(color,MagickPathExtent,"%.15g,%.15g",
+ (void) FormatLocaleString(color,MagickPathExtent,"%.20g,%.20g",
image->chromaticity.red_primary.x,
image->chromaticity.red_primary.y);
s=newSVpv(color,0);
{
if (image == (Image *) NULL)
break;
- (void) FormatLocaleString(color,MagickPathExtent,"%.15g,%.15g",
+ (void) FormatLocaleString(color,MagickPathExtent,"%.20g,%.20g",
image->chromaticity.white_point.x,
image->chromaticity.white_point.y);
s=newSVpv(color,0);
if (attribute_flag[0] == 0)
{
(void) FormatLocaleString(message,MagickPathExtent,
- "%.15g,%.15g,%.15g",(double) argument_list[2].real_reference,
+ "%.20g,%.20g,%.20g",(double) argument_list[2].real_reference,
(double) argument_list[3].real_reference,
(double) argument_list[4].real_reference);
argument_list[0].string_reference=message;
geometry_info.rho=argument_list[6].real_reference;
SetImageArtifact(image,"modulate:colorspace","HWB");
}
- (void) FormatLocaleString(modulate,MagickPathExtent,"%.15g,%.15g,%.15g",
+ (void) FormatLocaleString(modulate,MagickPathExtent,"%.20g,%.20g,%.20g",
geometry_info.rho,geometry_info.sigma,geometry_info.xi);
(void) ModulateImage(image,modulate,exception);
break;
{
draw_info->geometry=AcquireString((char *) NULL);
(void) FormatLocaleString(draw_info->geometry,MagickPathExtent,
- "%.15g,%.15g",x,y);
+ "%.20g,%.20g",x,y);
}
status=GetTypeMetrics(image,draw_info,&metrics,exception);
(void) CatchImageException(image);
{
draw_info->geometry=AcquireString((char *) NULL);
(void) FormatLocaleString(draw_info->geometry,MagickPathExtent,
- "%.15g,%.15g",x,y);
+ "%.20g,%.20g",x,y);
}
status=GetMultilineTypeMetrics(image,draw_info,&metrics,exception);
(void) CatchException(exception);
(void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
(double) channel_statistics[channel].depth); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].minima/scale); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].maxima/scale); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].mean/scale); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].standard_deviation/scale); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].kurtosis); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].skewness); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
- (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \
+ (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \
channel_statistics[channel].entropy); \
PUSHs(sv_2mortal(newSVpv(message,0))); \
}
count=0;
for ( ; image; image=image->next)
{
+ register size_t
+ i;
+
channel_statistics=GetImageStatistics(image,exception);
if (channel_statistics == (ChannelStatistics *) NULL)
continue;
count++;
- EXTEND(sp,35*count);
- scale=(double) QuantumRange;
- ChannelStatistics(RedChannel);
- ChannelStatistics(GreenChannel);
- ChannelStatistics(BlueChannel);
- if (image->colorspace == CMYKColorspace)
- ChannelStatistics(BlackChannel);
- if (image->alpha_trait != UndefinedPixelTrait)
- ChannelStatistics(AlphaChannel);
+ for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+ {
+ PixelChannel channel=GetPixelChannelChannel(image,i);
+ PixelTrait traits=GetPixelChannelTraits(image,channel);
+ if ((traits & UpdatePixelTrait) == 0)
+ continue;
+ EXTEND(sp,8*i*count);
+ ChannelStatistics(channel);
+ }
channel_statistics=(ChannelStatistics *)
RelinquishMagickMemory(channel_statistics);
}