- dst = dest + cy + 1;
- for(x_dest = x_min; x_dest < x_max; x_dest++, dst+=4)
- {
- v[0] = mt[0][0] * x_dest + mt[1][0] * y_dest + dr1;
- v[1] = mt[0][1] * x_dest + mt[1][1] * y_dest + dr2;
- v[2] = mt[0][2] * x_dest + mt[1][2] * y_dest + dr3;
-
- v[0] = v[0] >> 8; v[2] = v[2] >> 8;
-
- x_src = dist_e * PV_atan2( v[0], v[2] ) / NATAN ;
- y_src = dist_e * PV_atan2( v[1], utils_sqrt2 ( abs(v[2]), abs(v[0]) ) ) / NATAN ;
-
- dx = x_src & 255; dy = y_src & 255; // fraction
-
- x_src = (x_src >> 8) + sw2;
- y_src = (y_src >> 8) + sh2;
-
-
- if( y_src >= 0 && y_src < miy && x_src >= 0 && x_src < mix ) // all interpolation pixels inside image
- // (most pixels)
- {
- sry = src + y_src * BytesPerLine + x_src * 4;
- rgb[0] = sry;
- rgb[1] = sry + BytesPerLine;
- }
- else // edge pixels
- {
- int x_copy = x_src;
-
- rgb[0] = cdata;
- if( y_src < 0 )
- sry = src;
- else if( y_src > miy )
- sry = src + miy * BytesPerLine;
- else
- sry = src + y_src * BytesPerLine;
-
- if( x_src < 0 ) x_src = mix;
- if( x_src > mix) x_src = 0;
- *(long*)rgb[0] = *(long*)(sry + x_src*4);
-
- x_src = x_copy+1;
- if( x_src < 0 ) x_src = mix;
- if( x_src > mix) x_src = 0;
- *(long*)(rgb[0]+4) = *(long*)(sry + x_src*4);
-
-
-
- rgb[1] = cdata+8;
- y_src+=1;
- if( y_src < 0 )
- sry = src;
- else if( y_src > miy )
- sry = src + miy * BytesPerLine;
- else
- sry = src + y_src * BytesPerLine;
- x_src = x_copy;
- if( x_src < 0 ) x_src = mix;
- if( x_src > mix) x_src = 0;
- *(long*)rgb[1] = *(long*)(sry + x_src*4);
- x_src = x_copy+1;
- if( x_src < 0 ) x_src = mix;
- if( x_src > mix) x_src = 0;
- *(long*)(rgb[1]+4) = *(long*)(sry + x_src*4);
-
-
- }
- bil( dst, rgb, dx, dy );
- }
+ double x_src_fp;
+ double y_src_fp;
+
+ v[0] = mt[0][0] * x_dest + mt[1][0] * y_dest + dr1;
+ v[1] = mt[0][1] * x_dest + mt[1][1] * y_dest + dr2;
+ v[2] = mt[0][2] * x_dest + mt[1][2] * y_dest + dr3;
+
+ v[0] = v[0] >> 8; v[2] = v[2] >> 8;
+ v[1] = v[1] >> 8;
+
+ x_src_fp = dist_e * atan2 (v[0], v[2]);
+ y_src_fp = dist_e * atan2 (v[1], sqrt (v[2] * v[2] + v[0] * v[0]));
+
+ copy_pixel (TrPtr->dest, TrPtr->src,
+ dest_width_left + x_dest, dest_height_top + y_dest,
+ src_width_left + x_src_fp, src_height_top + y_src_fp,
+ NNEIGHBOUR);