43#include "magick/studio.h"
44#include "magick/artifact.h"
45#include "magick/color-private.h"
46#include "magick/cache.h"
47#include "magick/draw.h"
48#include "magick/exception-private.h"
49#include "magick/gem.h"
50#include "magick/image.h"
51#include "magick/image-private.h"
52#include "magick/log.h"
53#include "magick/magick.h"
54#include "magick/memory_.h"
55#include "magick/pixel.h"
56#include "magick/pixel-private.h"
57#include "magick/quantum.h"
58#include "magick/random_.h"
59#include "magick/resample.h"
60#include "magick/resize.h"
61#include "magick/resize-private.h"
62#include "magick/resource_.h"
63#include "magick/transform.h"
64#include "magick/signature-private.h"
65#include "magick/token.h"
66#include "magick/utility.h"
67#include "magick/option.h"
80#define DEBUG_ELLIPSE 0
81#define DEBUG_HIT_MISS 0
82#define DEBUG_NO_PIXEL_HIT 0
85#define WLUT_WIDTH 1024
109 InterpolatePixelMethod
130 Vlimit, Ulimit, Uwidth, slope;
135 filter_lut[WLUT_WIDTH];
212 assert(image != (
Image *) NULL);
213 assert(image->signature == MagickCoreSignature);
215 assert(exception->signature == MagickCoreSignature);
216 if (IsEventLogging() != MagickFalse)
217 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
220 sizeof(*resample_filter));
222 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
223 (void) memset(resample_filter,0,
sizeof(*resample_filter));
225 resample_filter->exception=exception;
226 resample_filter->image=ReferenceImage((
Image *) image);
227 resample_filter->view=AcquireVirtualCacheView(resample_filter->image,exception);
229 resample_filter->debug=IsEventLogging();
230 resample_filter->signature=MagickCoreSignature;
232 resample_filter->image_area=(ssize_t) (image->columns*image->rows);
233 resample_filter->average_defined = MagickFalse;
236 SetResampleFilter(resample_filter, image->filter, image->blur);
237 (void) SetResampleFilterInterpolateMethod(resample_filter,
239 (void) SetResampleFilterVirtualPixelMethod(resample_filter,
240 GetImageVirtualPixelMethod(image));
242 return(resample_filter);
273 assert(resample_filter->signature == MagickCoreSignature);
274 assert(resample_filter->image != (
Image *) NULL);
275 if (IsEventLogging() != MagickFalse)
276 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
277 resample_filter->image->filename);
278 resample_filter->view=DestroyCacheView(resample_filter->view);
279 resample_filter->image=DestroyImage(resample_filter->image);
281 resample_filter->filter_def=DestroyResizeFilter(resample_filter->filter_def);
283 resample_filter->signature=(~MagickCoreSignature);
284 resample_filter=(
ResampleFilter *) RelinquishMagickMemory(resample_filter);
285 return(resample_filter);
319MagickExport MagickBooleanType ResamplePixelColor(
326 ssize_t u,v, v1, v2, uw, hit;
329 double divisor_c,divisor_m;
332 const IndexPacket *indexes;
334 assert(resample_filter->signature == MagickCoreSignature);
338 if ( resample_filter->do_interpolate ) {
339 status=InterpolateMagickPixelPacket(resample_filter->image,
340 resample_filter->view,resample_filter->interpolate,u0,v0,pixel,
341 resample_filter->exception);
346 (void) FormatLocaleFile(stderr,
"u0=%lf; v0=%lf;\n", u0, v0);
359 switch ( resample_filter->virtual_pixel ) {
360 case BackgroundVirtualPixelMethod:
361 case ConstantVirtualPixelMethod:
362 case TransparentVirtualPixelMethod:
363 case BlackVirtualPixelMethod:
364 case GrayVirtualPixelMethod:
365 case WhiteVirtualPixelMethod:
366 case MaskVirtualPixelMethod:
367 if ( resample_filter->limit_reached
368 || u0 + resample_filter->Ulimit < 0.0
369 || u0 - resample_filter->Ulimit > (
double) resample_filter->image->columns-1.0
370 || v0 + resample_filter->Vlimit < 0.0
371 || v0 - resample_filter->Vlimit > (
double) resample_filter->image->rows-1.0
376 case UndefinedVirtualPixelMethod:
377 case EdgeVirtualPixelMethod:
378 if ( ( u0 + resample_filter->Ulimit < 0.0 && v0 + resample_filter->Vlimit < 0.0 )
379 || ( u0 + resample_filter->Ulimit < 0.0
380 && v0 - resample_filter->Vlimit > (
double) resample_filter->image->rows-1.0 )
381 || ( u0 - resample_filter->Ulimit > (
double) resample_filter->image->columns-1.0
382 && v0 + resample_filter->Vlimit < 0.0 )
383 || ( u0 - resample_filter->Ulimit > (
double) resample_filter->image->columns-1.0
384 && v0 - resample_filter->Vlimit > (
double) resample_filter->image->rows-1.0 )
388 case HorizontalTileVirtualPixelMethod:
389 if ( v0 + resample_filter->Vlimit < 0.0
390 || v0 - resample_filter->Vlimit > (
double) resample_filter->image->rows-1.0
394 case VerticalTileVirtualPixelMethod:
395 if ( u0 + resample_filter->Ulimit < 0.0
396 || u0 - resample_filter->Ulimit > (
double) resample_filter->image->columns-1.0
400 case DitherVirtualPixelMethod:
401 if ( ( u0 + resample_filter->Ulimit < -32.0 && v0 + resample_filter->Vlimit < -32.0 )
402 || ( u0 + resample_filter->Ulimit < -32.0
403 && v0 - resample_filter->Vlimit > (
double) resample_filter->image->rows+31.0 )
404 || ( u0 - resample_filter->Ulimit > (
double) resample_filter->image->columns+31.0
405 && v0 + resample_filter->Vlimit < -32.0 )
406 || ( u0 - resample_filter->Ulimit > (
double) resample_filter->image->columns+31.0
407 && v0 - resample_filter->Vlimit > (
double) resample_filter->image->rows+31.0 )
411 case TileVirtualPixelMethod:
412 case MirrorVirtualPixelMethod:
413 case RandomVirtualPixelMethod:
414 case HorizontalTileEdgeVirtualPixelMethod:
415 case VerticalTileEdgeVirtualPixelMethod:
416 case CheckerTileVirtualPixelMethod:
426 status=InterpolateMagickPixelPacket(resample_filter->image,
427 resample_filter->view,IntegerInterpolatePixel,u0,v0,pixel,
428 resample_filter->exception);
435 if ( resample_filter->limit_reached ) {
436 switch ( resample_filter->virtual_pixel ) {
445 case UndefinedVirtualPixelMethod:
446 case EdgeVirtualPixelMethod:
447 case DitherVirtualPixelMethod:
448 case HorizontalTileEdgeVirtualPixelMethod:
449 case VerticalTileEdgeVirtualPixelMethod:
456 status=InterpolateMagickPixelPacket(resample_filter->image,
457 resample_filter->view,AverageInterpolatePixel,u0,v0,pixel,
458 resample_filter->exception);
460 case HorizontalTileVirtualPixelMethod:
461 case VerticalTileVirtualPixelMethod:
463 status=InterpolateMagickPixelPacket(resample_filter->image,
464 resample_filter->view,IntegerInterpolatePixel,-1.0,-1.0,pixel,
465 resample_filter->exception);
467 case TileVirtualPixelMethod:
468 case MirrorVirtualPixelMethod:
469 case RandomVirtualPixelMethod:
470 case CheckerTileVirtualPixelMethod:
473 if ( resample_filter->average_defined == MagickFalse ) {
481 &resample_filter->average_pixel);
482 resample_filter->average_defined=MagickTrue;
485 average_image=ResizeImage(resample_filter->image,1,1,BoxFilter,1.0,
486 resample_filter->exception);
487 if (average_image == (
Image *) NULL)
489 *pixel=resample_filter->average_pixel;
492 average_view=AcquireVirtualCacheView(average_image,
493 &average_image->exception);
494 pixels=(
PixelPacket *)GetCacheViewVirtualPixels(average_view,0,0,1,1,
495 resample_filter->exception);
497 average_view=DestroyCacheView(average_view);
498 average_image=DestroyImage(average_image);
499 *pixel=resample_filter->average_pixel;
502 indexes=(IndexPacket *) GetCacheViewAuthenticIndexQueue(average_view);
503 SetMagickPixelPacket(resample_filter->image,pixels,indexes,
504 &(resample_filter->average_pixel));
505 average_view=DestroyCacheView(average_view);
506 average_image=DestroyImage(average_image);
508 if ( resample_filter->virtual_pixel == CheckerTileVirtualPixelMethod )
514 weight = QuantumScale*((MagickRealType) QuantumRange-
515 (MagickRealType) resample_filter->average_pixel.opacity);
516 resample_filter->average_pixel.red *= weight;
517 resample_filter->average_pixel.green *= weight;
518 resample_filter->average_pixel.blue *= weight;
522 weight = QuantumScale*((MagickRealType) QuantumRange-
524 resample_filter->image->background_color.opacity);
525 resample_filter->average_pixel.red += weight*(MagickRealType)
526 resample_filter->image->background_color.red;
527 resample_filter->average_pixel.green += weight*(MagickRealType)
528 resample_filter->image->background_color.green;
529 resample_filter->average_pixel.blue += weight*(MagickRealType)
530 resample_filter->image->background_color.blue;
531 resample_filter->average_pixel.opacity += (MagickRealType)
532 resample_filter->image->background_color.opacity;
536 resample_filter->average_pixel.red /= divisor_c;
537 resample_filter->average_pixel.green /= divisor_c;
538 resample_filter->average_pixel.blue /= divisor_c;
539 resample_filter->average_pixel.opacity /= 2;
543 *pixel=resample_filter->average_pixel;
555 pixel->red = pixel->green = pixel->blue = 0.0;
556 if (pixel->matte != MagickFalse) pixel->opacity = 0.0;
557 if (pixel->colorspace == CMYKColorspace) pixel->index = 0.0;
563 v1 = (ssize_t)ceil(v0 - resample_filter->Vlimit);
564 v2 = (ssize_t)floor(v0 + resample_filter->Vlimit);
567 u1 = u0 + (v1-v0)*resample_filter->slope - resample_filter->Uwidth;
568 uw = (ssize_t)(2.0*resample_filter->Uwidth)+1;
571 (void) FormatLocaleFile(stderr,
"v1=%ld; v2=%ld\n", (
long)v1, (
long)v2);
572 (void) FormatLocaleFile(stderr,
"u1=%ld; uw=%ld\n", (
long)u1, (
long)uw);
574# define DEBUG_HIT_MISS 0
581 DDQ = 2*resample_filter->A;
582 for( v=v1; v<=v2; v++ ) {
585 (void) FormatLocaleFile(stderr,
"# scan line from pixel %ld, %ld\n", (
long)uu, (
long)v);
587 u = (ssize_t)ceil(u1);
588 u1 += resample_filter->slope;
596 Q = (resample_filter->A*U + resample_filter->B*V)*U + resample_filter->C*V*V;
597 DQ = resample_filter->A*(2.0*U+1) + resample_filter->B*V;
600 pixels=GetCacheViewVirtualPixels(resample_filter->view,u,v,(
size_t) uw,
601 1,resample_filter->exception);
604 indexes=GetCacheViewVirtualIndexQueue(resample_filter->view);
607 for( u=0; u<uw; u++ ) {
611 if (((
int) Q >= 0) && ((
int) Q < WLUT_WIDTH)) {
612 weight = resample_filter->filter_lut[(int) Q];
615 if ((Q >= 0.0) && (Q < resample_filter->F)) {
616 weight = GetResizeFilterWeight(resample_filter->filter_def,
620 if (pixel->matte != MagickFalse)
621 pixel->opacity += weight*(MagickRealType) pixels->opacity;
624 if (pixel->matte != MagickFalse)
625 weight *= QuantumScale*((MagickRealType)(QuantumRange-pixels->opacity));
626 pixel->red += weight*(MagickRealType) pixels->red;
627 pixel->green += weight*(MagickRealType) pixels->green;
628 pixel->blue += weight*(MagickRealType) pixels->blue;
629 if (pixel->colorspace == CMYKColorspace)
630 pixel->index += weight*(MagickRealType) (*indexes);
636 (void) FormatLocaleFile(stderr,
"set arrow from %lf,%lf to %lf,%lf nohead ls 3\n",
637 (
long)uu-.1,(
double)v-.1,(
long)uu+.1,(
long)v+.1);
638 (void) FormatLocaleFile(stderr,
"set arrow from %lf,%lf to %lf,%lf nohead ls 3\n",
639 (
long)uu+.1,(
double)v-.1,(
long)uu-.1,(
long)v+.1);
641 (void) FormatLocaleFile(stderr,
"set arrow from %lf,%lf to %lf,%lf nohead ls 1\n",
642 (
long)uu-.1,(
double)v-.1,(
long)uu+.1,(
long)v+.1);
643 (void) FormatLocaleFile(stderr,
"set arrow from %lf,%lf to %lf,%lf nohead ls 1\n",
644 (
long)uu+.1,(
double)v-.1,(
long)uu-.1,(
long)v+.1);
657 (void) FormatLocaleFile(stderr,
"Hit=%ld; Total=%ld;\n", (
long)hit, (
long)uw*(v2-v1) );
663 if ( hit == 0 || divisor_m <= MagickEpsilon || divisor_c <= MagickEpsilon ) {
666#if DEBUG_NO_PIXEL_HIT
667 pixel->opacity = pixel->red = pixel->green = pixel->blue = 0;
668 pixel->red = QuantumRange;
670 status=InterpolateMagickPixelPacket(resample_filter->image,
671 resample_filter->view,resample_filter->interpolate,u0,v0,pixel,
672 resample_filter->exception);
680 divisor_m = 1.0/divisor_m;
681 if (pixel->matte != MagickFalse)
682 pixel->opacity = (MagickRealType) ClampToQuantum(divisor_m*pixel->opacity);
683 divisor_c = 1.0/divisor_c;
684 pixel->red = (MagickRealType) ClampToQuantum(divisor_c*pixel->red);
685 pixel->green = (MagickRealType) ClampToQuantum(divisor_c*pixel->green);
686 pixel->blue = (MagickRealType) ClampToQuantum(divisor_c*pixel->blue);
687 if (pixel->colorspace == CMYKColorspace)
688 pixel->index = (MagickRealType) ClampToQuantum(divisor_c*pixel->index);
722static inline void ClampUpAxes(
const double dux,
728 double *major_unit_x,
729 double *major_unit_y,
730 double *minor_unit_x,
731 double *minor_unit_y)
895 const double a = dux;
896 const double b = duy;
897 const double c = dvx;
898 const double d = dvy;
903 const double aa = a*a;
904 const double bb = b*b;
905 const double cc = c*c;
906 const double dd = d*d;
910 const double n11 = aa+bb;
911 const double n12 = a*c+b*d;
912 const double n21 = n12;
913 const double n22 = cc+dd;
914 const double det = a*d-b*c;
915 const double twice_det = det+det;
916 const double frobenius_squared = n11+n22;
917 const double discriminant =
918 (frobenius_squared+twice_det)*(frobenius_squared-twice_det);
924 const double sqrt_discriminant =
925 sqrt(discriminant > 0.0 ? discriminant : 0.0);
936 const double s1s1 = 0.5*(frobenius_squared+sqrt_discriminant);
942 const double s2s2 = 0.5*(frobenius_squared-sqrt_discriminant);
943 const double s1s1minusn11 = s1s1-n11;
944 const double s1s1minusn22 = s1s1-n22;
952 const double s1s1minusn11_squared = s1s1minusn11*s1s1minusn11;
953 const double s1s1minusn22_squared = s1s1minusn22*s1s1minusn22;
963 const double temp_u11 =
964 ( (s1s1minusn11_squared>=s1s1minusn22_squared) ? n12 : s1s1minusn22 );
965 const double temp_u21 =
966 ( (s1s1minusn11_squared>=s1s1minusn22_squared) ? s1s1minusn11 : n21 );
967 const double norm = sqrt(temp_u11*temp_u11+temp_u21*temp_u21);
972 const double u11 = ( (norm>0.0) ? temp_u11/norm : 1.0 );
973 const double u21 = ( (norm>0.0) ? temp_u21/norm : 0.0 );
977 *major_mag = ( (s1s1<=1.0) ? 1.0 : sqrt(s1s1) );
978 *minor_mag = ( (s2s2<=1.0) ? 1.0 : sqrt(s2s2) );
984 *minor_unit_x = -u21;
1051MagickExport
void ScaleResampleFilter(
ResampleFilter *resample_filter,
1052 const double dux,
const double duy,
const double dvx,
const double dvy)
1057 assert(resample_filter->signature == MagickCoreSignature);
1059 resample_filter->limit_reached = MagickFalse;
1062 if ( resample_filter->filter == PointFilter )
1066 (void) FormatLocaleFile(stderr,
"# -----\n" );
1067 (void) FormatLocaleFile(stderr,
"dux=%lf; dvx=%lf; duy=%lf; dvy=%lf;\n",
1068 dux, dvx, duy, dvy);
1092 ClampUpAxes(dux,dvx,duy,dvy, &major_mag, &minor_mag,
1093 &major_x, &major_y, &minor_x, &minor_y);
1094 major_x *= major_mag; major_y *= major_mag;
1095 minor_x *= minor_mag; minor_y *= minor_mag;
1097 (void) FormatLocaleFile(stderr,
"major_x=%lf; major_y=%lf; minor_x=%lf; minor_y=%lf;\n",
1098 major_x, major_y, minor_x, minor_y);
1100 A = major_y*major_y+minor_y*minor_y;
1101 B = -2.0*(major_x*major_y+minor_x*minor_y);
1102 C = major_x*major_x+minor_x*minor_x;
1103 F = major_mag*minor_mag;
1107 A = dvx*dvx+dvy*dvy;
1108 B = -2.0*(dux*dvx+duy*dvy);
1109 C = dux*dux+duy*duy;
1110 F = dux*dvy-duy*dvx;
1129 A = dvx*dvx+dvy*dvy+1;
1130 B = -2.0*(dux*dvx+duy*dvy);
1131 C = dux*dux+duy*duy+1;
1136 (void) FormatLocaleFile(stderr,
"A=%lf; B=%lf; C=%lf; F=%lf\n", A,B,C,F);
1144 {
double alpha, beta, gamma, Major, Minor;
1145 double Eccentricity, Ellipse_Area, Ellipse_Angle;
1149 gamma = sqrt(beta*beta + B*B );
1151 if ( alpha - gamma <= MagickEpsilon )
1152 Major= MagickMaximumValue;
1154 Major= sqrt(2*F/(alpha - gamma));
1155 Minor = sqrt(2*F/(alpha + gamma));
1157 (void) FormatLocaleFile(stderr,
"# Major=%lf; Minor=%lf\n", Major, Minor );
1160 Eccentricity = Major/Minor;
1161 Ellipse_Area = MagickPI*Major*Minor;
1162 Ellipse_Angle = atan2(B, A-C);
1164 (void) FormatLocaleFile(stderr,
"# Angle=%lf Area=%lf\n",
1165 (
double) RadiansToDegrees(Ellipse_Angle), Ellipse_Area);
1176 if ( (4*A*C - B*B) > MagickMaximumValue ) {
1177 resample_filter->limit_reached = MagickTrue;
1185 F *= resample_filter->support;
1186 F *= resample_filter->support;
1189 resample_filter->Ulimit = sqrt(C*F/(A*C-0.25*B*B));
1190 resample_filter->Vlimit = sqrt(A*F/(A*C-0.25*B*B));
1193 resample_filter->Uwidth = sqrt(F/A);
1194 resample_filter->slope = -B/(2.0*A);
1197 (void) FormatLocaleFile(stderr,
"Ulimit=%lf; Vlimit=%lf; UWidth=%lf; Slope=%lf;\n",
1198 resample_filter->Ulimit, resample_filter->Vlimit,
1199 resample_filter->Uwidth, resample_filter->slope );
1206 if ( (resample_filter->Uwidth * resample_filter->Vlimit)
1207 > (4.0*resample_filter->image_area)) {
1208 resample_filter->limit_reached = MagickTrue;
1216 scale=(double) WLUT_WIDTH*PerceptibleReciprocal(F);
1219 scale=resample_filter->F*PerceptibleReciprocal(F);
1221 resample_filter->A = A*scale;
1222 resample_filter->B = B*scale;
1223 resample_filter->C = C*scale;
1256MagickExport
void SetResampleFilter(
ResampleFilter *resample_filter,
1257 const FilterTypes filter,
const double blur)
1263 assert(resample_filter->signature == MagickCoreSignature);
1265 resample_filter->do_interpolate = MagickFalse;
1266 resample_filter->filter = filter;
1269 if ( filter == UndefinedFilter )
1270 resample_filter->filter = RobidouxFilter;
1272 if ( resample_filter->filter == PointFilter ) {
1273 resample_filter->do_interpolate = MagickTrue;
1277 resize_filter = AcquireResizeFilter(resample_filter->image,
1278 resample_filter->filter,blur,MagickTrue,resample_filter->exception);
1280 (void) ThrowMagickException(resample_filter->exception,GetMagickModule(),
1281 ModuleError,
"UnableToSetFilteringValue",
1282 "Fall back to Interpolated 'Point' filter");
1283 resample_filter->filter = PointFilter;
1284 resample_filter->do_interpolate = MagickTrue;
1292 resample_filter->support = GetResizeFilterSupport(resize_filter);
1294 resample_filter->support = 2.0;
1305 r_scale = resample_filter->support*sqrt(1.0/(
double)WLUT_WIDTH);
1306 for(Q=0; Q<WLUT_WIDTH; Q++)
1307 resample_filter->filter_lut[Q] = (
double)
1308 GetResizeFilterWeight(resize_filter,sqrt((
double)Q)*r_scale);
1311 resize_filter = DestroyResizeFilter(resize_filter);
1315 resample_filter->filter_def = resize_filter;
1316 resample_filter->F = resample_filter->support*resample_filter->support;
1324 ScaleResampleFilter(resample_filter, 1.0, 0.0, 0.0, 1.0);
1340 r_scale = -2.77258872223978123767/(WLUT_WIDTH*blur*blur);
1341 for(Q=0; Q<WLUT_WIDTH; Q++)
1342 resample_filter->filter_lut[Q] = exp((
double)Q*r_scale);
1343 resample_filter->support = WLUT_WIDTH;
1347#if defined(MAGICKCORE_OPENMP_SUPPORT)
1351 if (IsMagickTrue(GetImageArtifact(resample_filter->image,
1352 "resample:verbose")) )
1365 printf(
"# Resampling Filter LUT (%d values) for '%s' filter\n",
1366 WLUT_WIDTH, CommandOptionToMnemonic(MagickFilterOptions,
1367 resample_filter->filter) );
1369 printf(
"# Note: values in table are using a squared radius lookup.\n");
1370 printf(
"# As such its distribution is not uniform.\n");
1372 printf(
"# The X value is the support distance for the Y weight\n");
1373 printf(
"# so you can use gnuplot to plot this cylindrical filter\n");
1374 printf(
"# plot [0:2][-.2:1] \"lut.dat\" with lines\n");
1378 r_scale = resample_filter->support*sqrt(1.0/(
double)WLUT_WIDTH);
1379 for(Q=0; Q<WLUT_WIDTH; Q++)
1380 printf(
"%8.*g %.*g\n",
1381 GetMagickPrecision(),sqrt((
double)Q)*r_scale,
1382 GetMagickPrecision(),resample_filter->filter_lut[Q] );
1419MagickExport MagickBooleanType SetResampleFilterInterpolateMethod(
1420 ResampleFilter *resample_filter,
const InterpolatePixelMethod method)
1423 assert(resample_filter->signature == MagickCoreSignature);
1424 assert(resample_filter->image != (
Image *) NULL);
1425 if (IsEventLogging() != MagickFalse)
1426 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
1427 resample_filter->image->filename);
1428 resample_filter->interpolate=method;
1458MagickExport MagickBooleanType SetResampleFilterVirtualPixelMethod(
1462 assert(resample_filter->signature == MagickCoreSignature);
1463 assert(resample_filter->image != (
Image *) NULL);
1464 if (IsEventLogging() != MagickFalse)
1465 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
1466 resample_filter->image->filename);
1467 resample_filter->virtual_pixel=method;
1468 if (method != UndefinedVirtualPixelMethod)
1469 (void) SetCacheViewVirtualPixelMethod(resample_filter->view,method);