#endif
#define DegreesToRadians(x) (MagickPI*(x)/180.0)
#define EndOf(array) (&array[NumberOf(array)])
+#define MagickPI 3.14159265358979323846264338327950288419716939937510
#define MaxArguments 33
#ifndef na
#define na PL_na
{"channel", MagickChannelOptions} } },
{ "WhiteThreshold", { {"threshold", StringReference},
{"channel", MagickChannelOptions} } },
- { "RadialBlur", { {"geometry", StringReference}, {"angle", RealReference},
- {"channel", MagickChannelOptions} } },
+ { "RotationalBlur", { {"geometry", StringReference},
+ {"angle", RealReference}, {"channel", MagickChannelOptions} } },
{ "Thumbnail", { {"geometry", StringReference}, {"width", IntegerReference},
{"height", IntegerReference} } },
{ "Strip", },
{ "Poly", { {"terms", ArrayReference},
{"channel", MagickChannelOptions} } },
{ "Grayscale", { {"method", MagickNoiseOptions} } },
+ { "CannyEdge", { {"geometry", StringReference},
+ {"radius", RealReference}, {"sigma", RealReference},
+ {"lower-percent", RealReference}, {"upper-percent", RealReference} } },
};
static SplayTreeInfo
#
void
Animate(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
AnimateImage = 1
animate = 2
#
void
Append(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
AppendImage = 1
append = 2
#
void
Average(ref)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
AverageImage = 1
average = 2
#
void
BlobToImage(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
BlobToImage = 1
blobtoimage = 2
#
void
ChannelFx(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
ChannelFxImage = 1
channelfx = 2
#
void
Clone(ref)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
CopyImage = 1
copy = 2
#
void
Coalesce(ref)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
CoalesceImage = 1
coalesce = 2
#
void
Compare(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
CompareImages = 1
compare = 2
# #
# #
# #
+# C o m p l e x I m a g e s #
+# #
+# #
+# #
+###############################################################################
+#
+#
+void
+ComplexImages(ref)
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
+ ALIAS:
+ ComplexImages = 1
+ compleximages = 2
+ PPCODE:
+ {
+ AV
+ *av;
+
+ char
+ *attribute,
+ *p;
+
+ ComplexOperator
+ op;
+
+ ExceptionInfo
+ *exception;
+
+ HV
+ *hv;
+
+ Image
+ *image;
+
+ register ssize_t
+ i;
+
+ struct PackageInfo
+ *info;
+
+ SV
+ *perl_exception,
+ *reference,
+ *rv,
+ *sv;
+
+ PERL_UNUSED_VAR(ref);
+ PERL_UNUSED_VAR(ix);
+ exception=AcquireExceptionInfo();
+ perl_exception=newSVpv("",0);
+ sv=NULL;
+ if (sv_isobject(ST(0)) == 0)
+ {
+ ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
+ PackageName);
+ goto PerlException;
+ }
+ reference=SvRV(ST(0));
+ hv=SvSTASH(reference);
+ image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
+ if (image == (Image *) NULL)
+ {
+ ThrowPerlException(exception,OptionError,"NoImagesDefined",
+ PackageName);
+ goto PerlException;
+ }
+ op=UndefinedComplexOperator;
+ if (items == 2)
+ {
+ ssize_t
+ in;
+
+ in=ParseCommandOption(MagickComplexOptions,MagickFalse,(char *)
+ SvPV(ST(1),na));
+ if (in < 0)
+ {
+ ThrowPerlException(exception,OptionError,"UnrecognizedType",
+ SvPV(ST(1),na));
+ return;
+ }
+ op=(ComplexOperator) in;
+ }
+ else
+ for (i=2; i < items; i+=2)
+ {
+ attribute=(char *) SvPV(ST(i-1),na);
+ switch (*attribute)
+ {
+ case 'O':
+ case 'o':
+ {
+ if (LocaleCompare(attribute,"operator") == 0)
+ {
+ ssize_t
+ in;
+
+ in=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption(
+ MagickComplexOptions,MagickFalse,SvPV(ST(i),na));
+ if (in < 0)
+ {
+ ThrowPerlException(exception,OptionError,"UnrecognizedType",
+ SvPV(ST(i),na));
+ return;
+ }
+ op=(ComplexOperator) in;
+ break;
+ }
+ ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
+ attribute);
+ break;
+ }
+ default:
+ {
+ ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
+ attribute);
+ break;
+ }
+ }
+ }
+ image=ComplexImages(image,op,exception);
+ if (image == (Image *) NULL)
+ goto PerlException;
+ /*
+ Create blessed Perl array for the returned image.
+ */
+ av=newAV();
+ ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv));
+ SvREFCNT_dec(av);
+ AddImageToRegistry(sv,image);
+ rv=newRV(sv);
+ av_push(av,sv_bless(rv,hv));
+ SvREFCNT_dec(sv);
+ info=GetPackageInfo(aTHX_ (void *) av,info,exception);
+ (void) FormatLocaleString(info->image_info->filename,MaxTextExtent,
+ "complex-%.*s",(int) (MaxTextExtent-9),
+ ((p=strrchr(image->filename,'/')) ? p+1 : image->filename));
+ (void) CopyMagickString(image->filename,info->image_info->filename,
+ MaxTextExtent);
+ SetImageInfo(info->image_info,0,exception);
+ exception=DestroyExceptionInfo(exception);
+ SvREFCNT_dec(perl_exception);
+ 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);
+ }
+\f
+#
+###############################################################################
+# #
+# #
+# #
# C o m p a r e L a y e r s #
# #
# #
#
void
CompareLayers(ref)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
CompareImagesLayers = 1
comparelayers = 2
#
void
DESTROY(ref)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
PPCODE:
{
SV
#
void
Display(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
DisplayImage = 1
display = 2
#
void
EvaluateImages(ref)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
EvaluateImages = 1
evaluateimages = 2
#
void
Features(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
FeaturesImage = 1
features = 2
#
void
Flatten(ref)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
FlattenImage = 1
flatten = 2
#
void
Fx(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
FxImage = 1
fx = 2
#
void
Get(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
GetAttributes = 1
GetAttribute = 2
#
void
Histogram(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
HistogramImage = 1
histogram = 2
#
void
GetPixel(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
getpixel = 1
getPixel = 2
#
void
GetPixels(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
getpixels = 1
getPixels = 2
#
void
ImageToBlob(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
ImageToBlob = 1
imagetoblob = 2
#
void
Layers(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
Layers = 1
layers = 2
#
SV *
MagickToMime(ref,name)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
char *name
ALIAS:
magicktomime = 1
#
void
Mogrify(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
Comment = 1
CommentImage = 2
BlackThresholdImage= 160
WhiteThreshold = 161
WhiteThresholdImage= 162
- RadialBlur = 163
- RadialBlurImage = 164
+ RotationalBlur = 163
+ RotationalBlurImage= 164
Thumbnail = 165
ThumbnailImage = 166
Strip = 167
PolyImage = 274
Grayscale = 275
GrayscaleImage = 276
+ CannyEdge = 278
+ CannyEdgeImage = 279
MogrifyRegion = 666
PPCODE:
{
quantize_info->dither_method=(DitherMethod)
argument_list[3].integer_reference;
if (attribute_flag[4] != 0)
- quantize_info->measure_error=argument_list[4].integer_reference !=
- 0 ? MagickTrue : MagickFalse;
- if (attribute_flag[5] != 0)
- (void) QueryColorCompliance(argument_list[5].string_reference,
- AllCompliance,&image->transparent_color,exception);
- if (attribute_flag[5] && argument_list[5].integer_reference)
- {
- (void) QuantizeImages(quantize_info,image,exception);
- goto PerlException;
- }
+ quantize_info->measure_error=
+ argument_list[4].integer_reference != 0 ? MagickTrue : MagickFalse;
if (attribute_flag[6] != 0)
+ (void) QueryColorCompliance(argument_list[6].string_reference,
+ AllCompliance,&image->transparent_color,exception);
+ if (attribute_flag[7] != 0)
quantize_info->dither_method=(DitherMethod)
- argument_list[6].integer_reference;
- if ((image->storage_class == DirectClass) ||
- (image->colors > quantize_info->number_colors) ||
- (quantize_info->colorspace == GRAYColorspace))
- (void) QuantizeImage(quantize_info,image,exception);
+ argument_list[7].integer_reference;
+ if (attribute_flag[5] && argument_list[5].integer_reference)
+ (void) QuantizeImages(quantize_info,image,exception);
else
- CompressImageColormap(image,exception);
+ if ((image->storage_class == DirectClass) ||
+ (image->colors > quantize_info->number_colors) ||
+ (quantize_info->colorspace == GRAYColorspace))
+ (void) QuantizeImage(quantize_info,image,exception);
+ else
+ CompressImageColormap(image,exception);
quantize_info=DestroyQuantizeInfo(quantize_info);
break;
}
(void) SetImageChannelMask(image,channel_mask);
break;
}
- case 82: /* RadialBlur */
+ case 82: /* RotationalBlur */
{
if (attribute_flag[0] != 0)
{
if (attribute_flag[2] != 0)
channel=(ChannelType) argument_list[2].integer_reference;
channel_mask=SetImageChannelMask(image,channel);
- image=RadialBlurImage(image,geometry_info.rho,exception);
+ image=RotationalBlurImage(image,geometry_info.rho,exception);
if (image != (Image *) NULL)
(void) SetImageChannelMask(image,channel_mask);
break;
(void) GrayscaleImage(image,method,exception);
break;
}
+ case 138: /* Canny */
+ {
+ if (attribute_flag[0] != 0)
+ {
+ flags=ParseGeometry(argument_list[0].string_reference,
+ &geometry_info);
+ if ((flags & SigmaValue) == 0)
+ geometry_info.sigma=1.0;
+ if ((flags & XiValue) == 0)
+ geometry_info.xi=0.35;
+ if ((flags & PsiValue) == 0)
+ geometry_info.psi=0.75;
+ }
+ 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)
+ geometry_info.xi=argument_list[3].real_reference;
+ if (attribute_flag[4] != 0)
+ geometry_info.psi=argument_list[4].real_reference;
+ if (attribute_flag[5] != 0)
+ channel=(ChannelType) argument_list[5].integer_reference;
+ channel_mask=SetImageChannelMask(image,channel);
+ image=CannyEdgeImage(image,geometry_info.rho,geometry_info.sigma,
+ geometry_info.xi,geometry_info.psi,exception);
+ if (image != (Image *) NULL)
+ (void) SetImageChannelMask(image,channel_mask);
+ break;
+ }
}
if (next != (Image *) NULL)
(void) CatchImageException(next);
#
void
Montage(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
MontageImage = 1
montage = 2
#
void
Morph(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
MorphImage = 1
morph = 2
#
void
Mosaic(ref)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
MosaicImage = 1
mosaic = 2
#
void
Ping(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
PingImage = 1
ping = 2
#
void
Preview(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
PreviewImage = 1
preview = 2
#
void
QueryColor(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
querycolor = 1
PPCODE:
#
void
QueryColorname(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
querycolorname = 1
PPCODE:
#
void
QueryFont(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
queryfont = 1
PPCODE:
#
void
QueryFontMetrics(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
queryfontmetrics = 1
PPCODE:
#
void
QueryMultilineFontMetrics(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
querymultilinefontmetrics = 1
PPCODE:
#
void
QueryFormat(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
queryformat = 1
PPCODE:
#
void
QueryOption(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
queryoption = 1
PPCODE:
#
void
Read(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
ReadImage = 1
read = 2
#
void
Remote(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
RemoteCommand = 1
remote = 2
#
void
Set(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
SetAttributes = 1
SetAttribute = 2
#
void
SetPixel(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
setpixel = 1
setPixel = 2
#
void
Smush(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
SmushImage = 1
smush = 2
#
void
Statistics(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
StatisticsImage = 1
statistics = 2
#
void
Transform(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
TransformImage = 1
transform = 2
#
void
Write(ref,...)
- Image::Magick::@MAGICK_ABI_SUFFIX@ ref=NO_INIT
+ Image::Magick::@MAGICK_ABI_SUFFIX@ ref = NO_INIT
ALIAS:
WriteImage = 1
write = 2