cc [ flag... ] file... lmlib [ library... ] #include <mlib.h> mlib_status mlib_ImagePolynomialWarp_Fp(mlib_image *dst, const mlib_image *src, const mlib_d64 *xCoeffs, const mlib_d64 *yCoeffs, mlib_s32 n, mlib_d64 preShiftX, mlib_d64 preShiftY, mlib_d64 postShiftX, mlib_d64 postShiftY, mlib_d64 preScaleX, mlib_d64 preScaleY, mlib_d64 postScaleX, mlib_d64 postScaleY, mlib_filter filter, mlib_edge edge);
The mlib_ImagePolynomialWarp_Fp() function performs a polynomialbased image warp on a floatingpoint image.
The images must have the same type, and the same number of channels. The images can have 1, 2, 3, or 4 channels. The data type of the images can be MLIB_FLOAT or MLIB_DOUBLE. The source and destination images may have different sizes.
The xCoeffs and yCoeffs parameters must contain the same number of coefficients of the form (n + 1)(n + 2)/2 for some n, where n is the degree power of the polynomial. The coefficients, in order, are associated with the terms:
1, x, y, x**2, x*y, y**2, ..., x**n, x**(n1)*y, ..., x*y**(n1), y**n
and coefficients of value 0 cannot be omitted.
The image pixels are assumed to be centered at .5 coordinate points. In other words, the upperleft corner pixel of an image is located at (0.5, 0.5).
For each pixel in the destination image, its center point D is backward mapped to a point S in the source image. Then the source pixels with their centers surrounding point S are selected to do one of the interpolations specified by the filter parameter to generate the pixel value for point D.
The mapping is defined by the two bivariate polynomial functions X(x, y) and Y(x, y) that map destination (x, y) coordinates to source X and Y positions respectively.
The functions X(x, y) and Y(x, y) are:
preX = (x + preShiftX)*preScaleX preY = (y + preShiftY)*preScaleY n i warpedX = SUM {SUM {xCoeffs_ij * preX**(ij) * preY**j}} i=0 j=0 n i warpedY = SUM {SUM {yCoeffs_ij * preX**(ij) * preY**j}} i=0 j=0 X(x, y) = warpedX*postScaleX  postShiftX Y(x, y) = warpedY*postScaleY  postShiftY
The destination (x, y) coordinates are preshifted by (preShiftX, preShiftY) and prescaled by the factors preScaleX and preScaleY prior to the evaluation of the polynomial. The results of the polynomial evaluations are scaled by postScaleX and postScaleY, and then shifted by (postShiftX, postShiftY) to produce the source pixel coordinates. This process allows for better precision of the results and supports tiled images.
The function takes the following arguments:
dst
src
xCoeffs
yCoeffs
n
preShiftX
preShiftY
postShiftX
postShiftY
preScaleX
preScaleY
postScaleX
postScaleY
filter
MLIB_NEAREST MLIB_BILINEAR MLIB_BICUBIC MLIB_BICUBIC2
edge
MLIB_EDGE_DST_NO_WRITE MLIB_EDGE_SRC_PADDED
The function returns MLIB_SUCCESS if successful. Otherwise it returns MLIB_FAILURE.
See attributes(5) for descriptions of the following attributes:

mlib_ImagePolynomialWarp(3MLIB), mlib_ImagePolynomialWarpTable(3MLIB), mlib_ImagePolynomialWarpTable_Fp(3MLIB), attributes(5)