Also, fixes interpolation method selection and removes a redundant
bounds test.
+//#define TEST_XY_LIMITS
//--------------------------------------------------------
//pointer to an interpolating function
//--------------------------------------------------------
//pointer to an interpolating function
-typedef int (*interpp)(unsigned char*, int, int, float, float, unsigned char*);
+typedef int (*interpp)(unsigned char*, int, int, float, float, float, unsigned char*);
//************************************
//REMAP AN IMAGE
//************************************
//REMAP AN IMAGE
x=map[2*(wo*i+j)];
y=map[2*(wo*i+j)+1];
if (x>0)
x=map[2*(wo*i+j)];
y=map[2*(wo*i+j)+1];
if (x>0)
- interp(vhs,wi,hi,x,y,&izs[wo*i+j]);
+ interp(vhs,wi,hi,x,y,1.0,&izs[wo*i+j]);
else
izs[wo*i+j]=bgc; //background fill
}
else
izs[wo*i+j]=bgc; //background fill
}
x=map[2*(wo*i+j)];
y=map[2*(wo*i+j)+1];
if (x>0)
x=map[2*(wo*i+j)];
y=map[2*(wo*i+j)+1];
if (x>0)
- interp(vhs,wi,hi,x,y,&izs[4*(wo*i+j)]);
+ interp(vhs,wi,hi,x,y,1.0,&izs[4*(wo*i+j)]);
else //background fill
{
izs[4*(wo*i+j)]=bgc;
else //background fill
{
izs[4*(wo*i+j)]=bgc;
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *v interpolirana vrednost
// *v interpolirana vrednost
-int interpNNpr_b(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpNNpr_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
//printf("u=%5.2f v=%5.2f ",x,y);
printf("u=%5.3f v=%5.3f ",x/(w-1),y/(h-1));
{
//printf("u=%5.2f v=%5.2f ",x,y);
printf("u=%5.3f v=%5.3f ",x/(w-1),y/(h-1));
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *v interpolirana vrednost
// *v interpolirana vrednost
-int interpNN_b(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpNN_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
#ifdef TEST_XY_LIMITS
if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
{
#ifdef TEST_XY_LIMITS
if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *v interpolirana vrednost
// *v interpolirana vrednost
-int interpNN_b32(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpNN_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
#ifdef TEST_XY_LIMITS
if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
#endif
v[3]= sl[(int)rintf(x)*4+(int)rintf(y)*4*w+3];
{
#ifdef TEST_XY_LIMITS
if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
#endif
v[3]= sl[(int)rintf(x)*4+(int)rintf(y)*4*w+3];
- float alpha = (float) v[3] / 255.0;
+ float alpha = (float) v[3] / 255.0 * o;
v[0]= v[0] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w] * alpha;
v[1]= v[1] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w+1] * alpha;
v[2]= v[2] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w+2] * alpha;
v[0]= v[0] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w] * alpha;
v[1]= v[1] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w+1] * alpha;
v[2]= v[2] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w+2] * alpha;
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *v interpolirana vrednost
// *v interpolirana vrednost
-int interpBL_b(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpBL_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int m,n,k,l;
float a,b;
{
int m,n,k,l;
float a,b;
//------------------------------------------------------
//bilinearna interpolacija
//za byte (char) vrednosti v packed color 32 bitnem formatu
//------------------------------------------------------
//bilinearna interpolacija
//za byte (char) vrednosti v packed color 32 bitnem formatu
-int interpBL_b32(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpBL_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int m,n,k,l,n1,l1,k1;
float a,b;
{
int m,n,k,l,n1,l1,k1;
float a,b;
a=sl[k+3]+(sl[k1+3]-sl[k+3])*(x-(float)m);
b=sl[l+3]+(sl[l1+3]-sl[n1+3])*(x-(float)m);
v[3]=a+(b-a)*(y-(float)n);
a=sl[k+3]+(sl[k1+3]-sl[k+3])*(x-(float)m);
b=sl[l+3]+(sl[l1+3]-sl[n1+3])*(x-(float)m);
v[3]=a+(b-a)*(y-(float)n);
- float alpha = (float) v[3] / 255.0;
+ float alpha = (float) v[3] / 255.0 * o;
a=sl[k]+(sl[k1]-sl[k])*(x-(float)m);
b=sl[l]+(sl[l1]-sl[n1])*(x-(float)m);
a=sl[k]+(sl[k1]-sl[k])*(x-(float)m);
b=sl[l]+(sl[l1]-sl[n1])*(x-(float)m);
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *v interpolirana vrednost
// *v interpolirana vrednost
-int interpBC_b(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpBC_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int i,j,l,m,n;
float k;
{
int i,j,l,m,n;
float k;
//------------------------------------------------------
//bikubicna interpolacija "smooth"
//za byte (char) vrednosti v packed color 32 bitnem formatu
//------------------------------------------------------
//bikubicna interpolacija "smooth"
//za byte (char) vrednosti v packed color 32 bitnem formatu
-int interpBC_b32(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpBC_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int i,j,b,l,m,n;
float k;
{
int i,j,b,l,m,n;
float k;
if (p[3]>256.0) p[3]=255.0;
v[b]= v[b] * (1.0 - alpha) + p[3] * alpha;
if (p[3]>256.0) p[3]=255.0;
v[b]= v[b] * (1.0 - alpha) + p[3] * alpha;
- if (b == 3) alpha = v[b] / 255.0;
+ if (b == 3) alpha = v[b] / 255.0 * o;
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *v interpolirana vrednost
//!!! ODKOD SUM??? (ze po eni rotaciji v interp_test !!)
//!!! v defish tega suma ni???
// *v interpolirana vrednost
//!!! ODKOD SUM??? (ze po eni rotaciji v interp_test !!)
//!!! v defish tega suma ni???
-int interpBC2_b(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpBC2_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int i,k,l,m,n;
float pp,p[4],wx[4],wy[4],xx;
{
int i,k,l,m,n;
float pp,p[4],wx[4],wy[4],xx;
//za byte (char) vrednosti v packed color 32 bitnem formatu
//!!! ODKOD SUM??? (ze po eni rotaciji v interp_test !!)
//!!! v defish tega suma ni???
//za byte (char) vrednosti v packed color 32 bitnem formatu
//!!! ODKOD SUM??? (ze po eni rotaciji v interp_test !!)
//!!! v defish tega suma ni???
-int interpBC2_b32(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpBC2_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int b,i,k,l,m,n,u;
float pp,p[4],wx[4],wy[4],xx;
{
int b,i,k,l,m,n,u;
float pp,p[4],wx[4],wy[4],xx;
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *v interpolirana vrednost
// *v interpolirana vrednost
-int interpSP4_b(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpSP4_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int i,j,m,n;
float pp,p[4],wx[4],wy[4],xx;
{
int i,j,m,n;
float pp,p[4],wx[4],wy[4],xx;
//------------------------------------------------------
//spline 4x4 interpolacija
//za byte (char) vrednosti v packed color 32 bitnem formatu
//------------------------------------------------------
//spline 4x4 interpolacija
//za byte (char) vrednosti v packed color 32 bitnem formatu
-int interpSP4_b32(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpSP4_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int i,j,m,n,b;
float pp,p[4],wx[4],wy[4],xx;
{
int i,j,m,n,b;
float pp,p[4],wx[4],wy[4],xx;
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *v interpolirana vrednost
//!!! PAZI, TOLE NE DELA CISTO PRAV ??? belina se siri
//!!! zaenkrat sem dodal fudge factor...
// *v interpolirana vrednost
//!!! PAZI, TOLE NE DELA CISTO PRAV ??? belina se siri
//!!! zaenkrat sem dodal fudge factor...
-int interpSP6_b(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpSP6_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int i,j,m,n;
float pp,p[6],wx[6],wy[6],xx;
{
int i,j,m,n;
float pp,p[6],wx[6],wy[6],xx;
//za byte (char) vrednosti v packed color 32 bitnem formatu
//!!! PAZI, TOLE NE DELA CISTO PRAV ??? belina se siri
//!!! zaenkrat sem dodal fudge factor...
//za byte (char) vrednosti v packed color 32 bitnem formatu
//!!! PAZI, TOLE NE DELA CISTO PRAV ??? belina se siri
//!!! zaenkrat sem dodal fudge factor...
-int interpSP6_b32(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpSP6_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int i,b,j,m,n;
float pp,p[6],wx[6],wy[6],xx;
{
int i,b,j,m,n;
float pp,p[6],wx[6],wy[6],xx;
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *sl vhodni array (slika)
// w,h dimenzija slike je wxh
// x,y tocka, za katero izracuna interpolirano vrednost
// *v interpolirana vrednost
// *v interpolirana vrednost
-int interpSC16_b(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpSC16_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int i,j,m,n;
float pp,p[16],wx[16],wy[16],xx,xxx,x1;
{
int i,j,m,n;
float pp,p[16],wx[16],wy[16],xx,xxx,x1;
//------------------------------------------------------
//truncated sinc "lanczos" 16x16 interpolacija
//za byte (char) vrednosti v packed color 32 bitnem formatu
//------------------------------------------------------
//truncated sinc "lanczos" 16x16 interpolacija
//za byte (char) vrednosti v packed color 32 bitnem formatu
-int interpSC16_b32(unsigned char *sl, int w, int h, float x, float y, unsigned char *v)
+int interpSC16_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v)
{
int i,j,m,b,n;
float pp,p[16],wx[16],wy[16],xx,xxx,x1;
{
int i,j,m,b,n;
float pp,p[16],wx[16],wy[16],xx,xxx,x1;
int normalised_height = mlt_properties_get_int( a_props, "normalised_height" );
double consumer_ar = mlt_properties_get_double( a_props, "consumer_aspect_ratio" );
int normalised_height = mlt_properties_get_int( a_props, "normalised_height" );
double consumer_ar = mlt_properties_get_double( a_props, "consumer_aspect_ratio" );
- const char *interps = mlt_properties_get( b_props, "rescale.interp" );
// Structures for geometry
struct mlt_geometry_item_s result;
// Structures for geometry
struct mlt_geometry_item_s result;
mlt_properties_set_int( b_props, "rescale_height", b_height );
// Suppress padding and aspect normalization.
mlt_properties_set_int( b_props, "rescale_height", b_height );
// Suppress padding and aspect normalization.
+ const char *interps = strdup( mlt_properties_get( b_props, "rescale.interp" ) );
mlt_properties_set( b_props, "rescale.interp", "none" );
if ( mlt_properties_get_double( b_props, "aspect_ratio" ) == 0.0 )
mlt_properties_set_double( b_props, "aspect_ratio", consumer_ar );
mlt_properties_set( b_props, "rescale.interp", "none" );
if ( mlt_properties_get_double( b_props, "aspect_ratio" ) == 0.0 )
mlt_properties_set_double( b_props, "aspect_ratio", consumer_ar );
get_affine( &affine, this, ( float )position );
dz = MapZ( affine.matrix, 0, 0 );
if ( ( int )abs( dz * 1000 ) < 25 )
get_affine( &affine, this, ( float )position );
dz = MapZ( affine.matrix, 0, 0 );
if ( ( int )abs( dz * 1000 ) < 25 )
// Factor scaling into the transformation based on output resolution.
if ( mlt_properties_get_int( properties, "distort" ) )
// Factor scaling into the transformation based on output resolution.
if ( mlt_properties_get_int( properties, "distort" ) )
dx = MapX( affine.matrix, x, y ) / dz + x_offset;
dy = MapY( affine.matrix, x, y ) / dz + y_offset;
if ( dx >= 0 && dx < b_width && dy >=0 && dy < b_height )
dx = MapX( affine.matrix, x, y ) / dz + x_offset;
dy = MapY( affine.matrix, x, y ) / dz + y_offset;
if ( dx >= 0 && dx < b_width && dy >=0 && dy < b_height )
- interp( b_image, b_width, b_height, dx, dy, p );
+ interp( b_image, b_width, b_height, dx, dy, result.mix/100.0, p );