@@ -22,20 +22,20 @@ __kernel void warpPerspective(__global const uchar * src,
22
22
W = W != 0.0f ? INTER_TAB_SIZE / W : 0.0f ;
23
23
int X = rint (X0 * W ), Y = rint (Y0 * W );
24
24
25
- short sx = convert_short_sat (X >> INTER_BITS );
26
- short sy = convert_short_sat (Y >> INTER_BITS );
25
+ int sx = convert_short_sat (X >> INTER_BITS );
26
+ int sy = convert_short_sat (Y >> INTER_BITS );
27
+
28
+ short sx_clamp = clamp (sx , 0 , src_cols - 1 );
29
+ short sx_p1_clamp = clamp (sx + 1 , 0 , src_cols - 1 );
30
+ short sy_clamp = clamp (sy , 0 , src_rows - 1 );
31
+ short sy_p1_clamp = clamp (sy + 1 , 0 , src_rows - 1 );
32
+ int v0 = convert_int (src [mad24 (sy_clamp , src_row_stride , src_offset + sx_clamp * src_px_stride )]);
33
+ int v1 = convert_int (src [mad24 (sy_clamp , src_row_stride , src_offset + sx_p1_clamp * src_px_stride )]);
34
+ int v2 = convert_int (src [mad24 (sy_p1_clamp , src_row_stride , src_offset + sx_clamp * src_px_stride )]);
35
+ int v3 = convert_int (src [mad24 (sy_p1_clamp , src_row_stride , src_offset + sx_p1_clamp * src_px_stride )]);
36
+
27
37
short ay = (short )(Y & (INTER_TAB_SIZE - 1 ));
28
38
short ax = (short )(X & (INTER_TAB_SIZE - 1 ));
29
-
30
- int v0 = (sx >= 0 && sx < src_cols && sy >= 0 && sy < src_rows ) ?
31
- convert_int (src [mad24 (sy , src_row_stride , src_offset + sx * src_px_stride )]) : 0 ;
32
- int v1 = (sx + 1 >= 0 && sx + 1 < src_cols && sy >= 0 && sy < src_rows ) ?
33
- convert_int (src [mad24 (sy , src_row_stride , src_offset + (sx + 1 )* src_px_stride )]) : 0 ;
34
- int v2 = (sx >= 0 && sx < src_cols && sy + 1 >= 0 && sy + 1 < src_rows ) ?
35
- convert_int (src [mad24 (sy + 1 , src_row_stride , src_offset + sx * src_px_stride )]) : 0 ;
36
- int v3 = (sx + 1 >= 0 && sx + 1 < src_cols && sy + 1 >= 0 && sy + 1 < src_rows ) ?
37
- convert_int (src [mad24 (sy + 1 , src_row_stride , src_offset + (sx + 1 )* src_px_stride )]) : 0 ;
38
-
39
39
float taby = 1.f /INTER_TAB_SIZE * ay ;
40
40
float tabx = 1.f /INTER_TAB_SIZE * ax ;
41
41
0 commit comments