X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=PerlMagick%2FMagick.xs;h=a5a889a95ec9b003da9fd86b6c4ca91c9f3ea683;hb=0f5df816b3e2ca1dd4dec9c01539739a2df73e98;hp=b2fb4b5abd537bcc4134a8de69667872f92612a7;hpb=3ca633e98c4b3171ccdb0fd3d6d8f536346376a3;p=imagemagick diff --git a/PerlMagick/Magick.xs b/PerlMagick/Magick.xs index b2fb4b5ab..a5a889a95 100644 --- a/PerlMagick/Magick.xs +++ b/PerlMagick/Magick.xs @@ -23,7 +23,7 @@ % February 1997 % % % % % -% Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization % +% Copyright 1999-2017 ImageMagick Studio LLC, a non-profit organization % % dedicated to making software imaging solutions freely available. % % % % You may not use this file except in compliance with the License. You may % @@ -531,8 +531,6 @@ static struct { "Morphology", { {"kernel", StringReference}, {"channel", MagickChannelOptions}, {"method", MagickMorphologyOptions}, {"iterations", IntegerReference} } }, - { "Sans", { {"matrix", ArrayReference} } }, - { "Color", { {"color", StringReference} } }, { "Mode", { {"geometry", StringReference}, {"width", IntegerReference},{"height", IntegerReference}, {"channel", MagickChannelOptions} } }, @@ -561,6 +559,12 @@ static struct {"x", IntegerReference}, {"y", IntegerReference}, {"gravity", MagickGravityOptions}, {"offset", StringReference}, {"dx", IntegerReference}, {"dy", IntegerReference} } }, + { "Color", { {"color", StringReference} } }, + { "WaveletDenoise", { {"geometry", StringReference}, + {"threshold", RealReference}, {"softness", RealReference}, + {"channel", MagickChannelOptions} } }, + { "Colorspace", { {"colorspace", MagickColorspaceOptions} } }, + { "AutoThreshold", { {"method", MagickAutoThresholdOptions} } }, }; static SplayTreeInfo @@ -1180,7 +1184,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'B': @@ -1222,7 +1229,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'C': @@ -1297,8 +1307,7 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, break; } for ( ; image; image=image->next) - (void) TransformImageColorspace(image,(ColorspaceType) sp, - exception); + (void) SetImageColorspace(image,(ColorspaceType) sp,exception); break; } if (LocaleCompare(attribute,"comment") == 0) @@ -1328,7 +1337,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'D': @@ -1431,7 +1443,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'E': @@ -1464,7 +1479,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'F': @@ -1534,7 +1552,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'G': @@ -1578,7 +1599,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'I': @@ -1645,7 +1669,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'L': @@ -1664,7 +1691,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'M': @@ -1673,10 +1703,11 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (LocaleCompare(attribute,"magick") == 0) { if (info) - (void) FormatLocaleString(info->image_info->filename,MagickPathExtent, - "%s:",SvPV(sval,na)); + (void) FormatLocaleString(info->image_info->filename, + MagickPathExtent,"%s:",SvPV(sval,na)); for ( ; image; image=image->next) - (void) CopyMagickString(image->magick,SvPV(sval,na),MagickPathExtent); + (void) CopyMagickString(image->magick,SvPV(sval,na), + MagickPathExtent); break; } if (LocaleCompare(attribute,"map-limit") == 0) @@ -1758,7 +1789,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'O': @@ -1789,7 +1823,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'P': @@ -1873,24 +1910,13 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, } break; } - if (LocaleCompare(attribute,"preview") == 0) - { - sp=SvPOK(sval) ? ParseCommandOption(MagickPreviewOptions,MagickFalse, - SvPV(sval,na)) : SvIV(sval); - if (sp < 0) - { - ThrowPerlException(exception,OptionError,"UnrecognizedType", - SvPV(sval,na)); - break; - } - if (info) - info->image_info->preview_type=(PreviewType) sp; - break; - } if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'Q': @@ -1907,7 +1933,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'R': @@ -1995,7 +2024,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'S': @@ -2045,7 +2077,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'T': @@ -2124,7 +2159,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'U': @@ -2178,7 +2216,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'V': @@ -2215,7 +2256,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } case 'W': @@ -2249,7 +2293,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } default: @@ -2257,7 +2304,10 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (info) SetImageOption(info->image_info,attribute,SvPV(sval,na)); for ( ; image; image=image->next) - SetImageProperty(image,attribute,SvPV(sval,na),exception); + { + (void) SetImageProperty(image,attribute,SvPV(sval,na),exception); + (void) SetImageArtifact(image,attribute,SvPV(sval,na)); + } break; } } @@ -4087,46 +4137,46 @@ Features(ref,...) { #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))); \ } @@ -4213,20 +4263,24 @@ Features(ref,...) count=0; for ( ; image; image=image->next) { + register ssize_t + j; + channel_features=GetImageFeatures(image,distance,exception); if (channel_features == (ChannelFeatures *) NULL) continue; count++; - EXTEND(sp,280*count); - for (i=0; i < 4; i++) + for (j=0; j < 4; j++) { - ChannelFeatures(RedChannel,i); - ChannelFeatures(GreenChannel,i); - ChannelFeatures(BlueChannel,i); - if (image->colorspace == CMYKColorspace) - ChannelFeatures(BlackChannel,i); - if (image->alpha_trait != UndefinedPixelTrait) - ChannelFeatures(AlphaChannel,i); + for (i=0; i < (ssize_t) GetPixelChannels(image); i++) + { + PixelChannel channel=GetPixelChannelChannel(image,i); + PixelTrait traits=GetPixelChannelTraits(image,channel); + if (traits == UndefinedPixelTrait) + continue; + EXTEND(sp,14*(i+1)*count); + ChannelFeatures(channel,j); + } } channel_features=(ChannelFeatures *) RelinquishMagickMemory(channel_features); @@ -4716,7 +4770,7 @@ Get(ref,...) { 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); @@ -4909,7 +4963,7 @@ Get(ref,...) 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); @@ -5101,7 +5155,7 @@ Get(ref,...) { 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); @@ -5492,15 +5546,6 @@ Get(ref,...) PUSHs(s ? sv_2mortal(s) : &sv_undef); continue; } - if (LocaleCompare(attribute,"preview") == 0) - { - s=newSViv(info->image_info->preview_type); - (void) sv_setpv(s,CommandOptionToMnemonic(MagickPreviewOptions, - info->image_info->preview_type)); - SvIOK_on(s); - PUSHs(s ? sv_2mortal(s) : &sv_undef); - continue; - } ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", attribute); break; @@ -5544,7 +5589,7 @@ Get(ref,...) { 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); @@ -5741,7 +5786,7 @@ Get(ref,...) { 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); @@ -7577,10 +7622,18 @@ Mogrify(ref,...) MeanShiftImage = 280 Kuwahara = 281 KuwaharaImage = 282 - ConnectedComponent = 283 - ConnectedComponentImage = 284 + ConnectedComponents = 283 + ConnectedComponentsImage = 284 CopyPixels = 285 CopyImagePixels = 286 + Color = 287 + ColorImage = 288 + WaveletDenoise = 289 + WaveletDenoiseImage= 290 + Colorspace = 291 + ColorspaceImage = 292 + AutoThreshold = 293 + AutoThresholdImage = 294 MogrifyRegion = 666 PPCODE: { @@ -9096,7 +9149,7 @@ Mogrify(ref,...) 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; @@ -9204,7 +9257,7 @@ Mogrify(ref,...) 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; @@ -11254,7 +11307,7 @@ Mogrify(ref,...) (void) SetImageChannelMask(image,channel_mask); break; } - case 142: /* ConnectedComponent */ + case 142: /* ConnectedComponents */ { size_t connectivity; @@ -11308,6 +11361,67 @@ Mogrify(ref,...) exception); break; } + case 144: /* Color */ + { + PixelInfo + color; + + (void) QueryColorCompliance("none",AllCompliance,&color,exception); + if (attribute_flag[0] != 0) + (void) QueryColorCompliance(argument_list[0].string_reference, + AllCompliance,&color,exception); + (void) SetImageColor(image,&color,exception); + break; + } + case 145: /* WaveletDenoise */ + { + if (attribute_flag[0] != 0) + { + flags=ParseGeometry(argument_list[0].string_reference, + &geometry_info); + if ((flags & PercentValue) != 0) + { + geometry_info.rho=QuantumRange*geometry_info.rho/100.0; + geometry_info.sigma=QuantumRange*geometry_info.sigma/100.0; + } + if ((flags & SigmaValue) == 0) + geometry_info.sigma=0.0; + } + if (attribute_flag[1] != 0) + geometry_info.rho=argument_list[1].real_reference; + if (attribute_flag[2] != 0) + geometry_info.sigma=argument_list[2].real_reference; + if (attribute_flag[3] != 0) + channel=(ChannelType) argument_list[3].integer_reference; + channel_mask=SetImageChannelMask(image,channel); + image=WaveletDenoiseImage(image,geometry_info.rho,geometry_info.sigma, + exception); + if (image != (Image *) NULL) + (void) SetImageChannelMask(image,channel_mask); + break; + } + case 146: /* Colorspace */ + { + ColorspaceType + colorspace; + + colorspace=sRGBColorspace; + if (attribute_flag[0] != 0) + colorspace=(ColorspaceType) argument_list[0].integer_reference; + (void) TransformImageColorspace(image,colorspace,exception); + break; + } + case 147: /* AutoThreshold */ + { + AutoThresholdMethod + method; + + method=UndefinedThresholdMethod; + if (attribute_flag[0] != 0) + method=(AutoThresholdMethod) argument_list[0].integer_reference; + (void) AutoThresholdImage(image,method,exception); + break; + } } if (next != (Image *) NULL) (void) CatchImageException(next); @@ -12946,7 +13060,7 @@ QueryFontMetrics(ref,...) { 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); @@ -13319,7 +13433,7 @@ QueryMultilineFontMetrics(ref,...) { 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); @@ -14265,25 +14379,25 @@ Statistics(ref,...) (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \ (double) channel_statistics[channel].depth); \ PUSHs(sv_2mortal(newSVpv(message,0))); \ - (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \ - channel_statistics[channel].minima/scale); \ + (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \ + channel_statistics[channel].minima/QuantumRange); \ PUSHs(sv_2mortal(newSVpv(message,0))); \ - (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \ - channel_statistics[channel].maxima/scale); \ + (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \ + channel_statistics[channel].maxima/QuantumRange); \ PUSHs(sv_2mortal(newSVpv(message,0))); \ - (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \ - channel_statistics[channel].mean/scale); \ + (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \ + channel_statistics[channel].mean/QuantumRange); \ PUSHs(sv_2mortal(newSVpv(message,0))); \ - (void) FormatLocaleString(message,MagickPathExtent,"%.15g", \ - channel_statistics[channel].standard_deviation/scale); \ + (void) FormatLocaleString(message,MagickPathExtent,"%.20g", \ + channel_statistics[channel].standard_deviation/QuantumRange); \ 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))); \ } @@ -14297,9 +14411,6 @@ Statistics(ref,...) ChannelStatistics *channel_statistics; - double - scale; - ExceptionInfo *exception; @@ -14340,19 +14451,24 @@ Statistics(ref,...) 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 == UndefinedPixelTrait) + continue; + EXTEND(sp,8*(i+1)*count); + ChannelStatistics(channel); + } + EXTEND(sp,8*(i+1)*count); + ChannelStatistics(CompositePixelChannel); channel_statistics=(ChannelStatistics *) RelinquishMagickMemory(channel_statistics); } @@ -14435,154 +14551,6 @@ SyncAuthenticPixels(ref,...) # # # # # # -# T r a n s f o r m # -# # -# # -# # -############################################################################### -# -# -void -Transform(ref,...) - Image::Magick ref=NO_INIT - ALIAS: - TransformImage = 1 - transform = 2 - transformimage = 3 - PPCODE: - { - AV - *av; - - char - *attribute, - *crop_geometry, - *geometry; - - ExceptionInfo - *exception; - - HV - *hv; - - Image - *clone, - *image; - - register ssize_t - i; - - struct PackageInfo - *info; - - SV - *av_reference, - *perl_exception, - *reference, - *rv, - *sv; - - PERL_UNUSED_VAR(ref); - PERL_UNUSED_VAR(ix); - exception=AcquireExceptionInfo(); - perl_exception=newSVpv("",0); - sv=NULL; - av=NULL; - attribute=NULL; - if (sv_isobject(ST(0)) == 0) - { - ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType", - PackageName); - goto PerlException; - } - reference=SvRV(ST(0)); - hv=SvSTASH(reference); - av=newAV(); - av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv)); - SvREFCNT_dec(av); - image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception); - if (image == (Image *) NULL) - { - ThrowPerlException(exception,OptionError,"NoImagesDefined", - PackageName); - goto PerlException; - } - info=GetPackageInfo(aTHX_ (void *) av,info,exception); - /* - Get attribute. - */ - crop_geometry=(char *) NULL; - geometry=(char *) NULL; - for (i=2; i < items; i+=2) - { - attribute=(char *) SvPV(ST(i-1),na); - switch (*attribute) - { - case 'c': - case 'C': - { - if (LocaleCompare(attribute,"crop") == 0) - { - crop_geometry=SvPV(ST(i),na); - break; - } - ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", - attribute); - break; - } - case 'g': - case 'G': - { - if (LocaleCompare(attribute,"geometry") == 0) - { - geometry=SvPV(ST(i),na); - break; - } - ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", - attribute); - break; - } - default: - { - ThrowPerlException(exception,OptionError,"UnrecognizedAttribute", - attribute); - break; - } - } - } - for ( ; image; image=image->next) - { - clone=CloneImage(image,0,0,MagickTrue,exception); - if (clone == (Image *) NULL) - goto PerlException; - TransformImage(&clone,crop_geometry,geometry,exception); - for ( ; clone; clone=clone->next) - { - AddImageToRegistry(sv,clone); - rv=newRV(sv); - av_push(av,sv_bless(rv,hv)); - SvREFCNT_dec(sv); - } - } - exception=DestroyExceptionInfo(exception); - ST(0)=av_reference; - SvREFCNT_dec(perl_exception); /* can't return warning messages */ - XSRETURN(1); - - PerlException: - InheritPerlException(exception,perl_exception); - exception=DestroyExceptionInfo(exception); - sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0); - SvPOK_on(perl_exception); - ST(0)=sv_2mortal(perl_exception); - XSRETURN(1); - } - -# -############################################################################### -# # -# # -# # # W r i t e # # # # #