19 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
20 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 |
* |
* |
22 |
* $Id: gmc.c,v 1.2 2004-03-22 22:36:24 edgomez Exp $ |
* $Id: gmc.c,v 1.4 2006-06-07 21:00:55 Skal Exp $ |
23 |
* |
* |
24 |
****************************************************************************/ |
****************************************************************************/ |
25 |
|
|
223 |
int i, j; |
int i, j; |
224 |
|
|
225 |
int32_t Offset; |
int32_t Offset; |
226 |
if (vo>=(-16*4) && vo<=H) Offset = (vo>>4)*srcstride; |
if (vo>=(-16<<4) && vo<=H) Offset = (vo>>4)*srcstride; |
227 |
else { |
else { |
228 |
if (vo>H) Offset = ( H>>4)*srcstride; |
if (vo>H) Offset = ( H>>4)*srcstride; |
229 |
else Offset =-16*srcstride; |
else Offset =-16*srcstride; |
230 |
rj = MTab[0]; |
rj = MTab[0]; |
231 |
} |
} |
232 |
if (uo>=(-16*4) && uo<=W) Offset += (uo>>4); |
if (uo>=(-16<<4) && uo<=W) Offset += (uo>>4); |
233 |
else { |
else { |
234 |
if (uo>W) Offset += (W>>4); |
if (uo>W) Offset += (W>>4); |
235 |
else Offset -= 16; |
else Offset -= 16; |
274 |
int i, j; |
int i, j; |
275 |
|
|
276 |
int32_t Offset; |
int32_t Offset; |
277 |
if (vo>=(-8*4) && vo<=H) Offset = (vo>>4)*srcstride; |
if (vo>=(-8<<4) && vo<=H) Offset = (vo>>4)*srcstride; |
278 |
else { |
else { |
279 |
if (vo>H) Offset = ( H>>4)*srcstride; |
if (vo>H) Offset = ( H>>4)*srcstride; |
280 |
else Offset =-8*srcstride; |
else Offset =-8*srcstride; |
281 |
rrj = MTab[0]; |
rrj = MTab[0]; |
282 |
} |
} |
283 |
if (uo>=(-8*4) && uo<=W) Offset += (uo>>4); |
if (uo>=(-8<<4) && uo<=W) Offset += (uo>>4); |
284 |
else { |
else { |
285 |
if (uo>W) Offset += ( W>>4); |
if (uo>W) Offset += ( W>>4); |
286 |
else Offset -= 8; |
else Offset -= 8; |
341 |
gmc->num_wp = nb_pts; |
gmc->num_wp = nb_pts; |
342 |
|
|
343 |
/* reduce the number of points, if possible */ |
/* reduce the number of points, if possible */ |
344 |
if (nb_pts<3 || (pts->duv[2].x==-pts->duv[1].y && pts->duv[2].y==pts->duv[1].x)) { |
if (nb_pts<2 || (pts->duv[2].x==0 && pts->duv[2].y==0 && pts->duv[1].x==0 && pts->duv[1].y==0 )) { |
345 |
if (nb_pts<2 || (pts->duv[1].x==0 && pts->duv[1].y==0)) { |
if (nb_pts<2 || (pts->duv[1].x==0 && pts->duv[1].y==0)) { |
346 |
if (nb_pts<1 || (pts->duv[0].x==0 && pts->duv[0].y==0)) { |
if (nb_pts<1 || (pts->duv[0].x==0 && pts->duv[0].y==0)) { |
347 |
nb_pts = 0; |
nb_pts = 0; |
350 |
} |
} |
351 |
else nb_pts = 2; |
else nb_pts = 2; |
352 |
} |
} |
|
else nb_pts = 3; |
|
353 |
|
|
354 |
/* now, nb_pts stores the actual number of points required for interpolation */ |
/* now, nb_pts stores the actual number of points required for interpolation */ |
355 |
|
|
379 |
gmc->dU[0] = 16*Ws + RDIV( 8*Ws*pts->duv[1].x, width ); /* dU/dx */ |
gmc->dU[0] = 16*Ws + RDIV( 8*Ws*pts->duv[1].x, width ); /* dU/dx */ |
380 |
gmc->dV[0] = RDIV( 8*Ws*pts->duv[1].y, width ); /* dV/dx */ |
gmc->dV[0] = RDIV( 8*Ws*pts->duv[1].y, width ); /* dV/dx */ |
381 |
|
|
|
/* disabled, because possibly buggy? */ |
|
|
|
|
|
#if 0 |
|
382 |
if (nb_pts==2) { |
if (nb_pts==2) { |
383 |
gmc->dU[1] = -gmc->dV[0]; /* -Sin */ |
gmc->dU[1] = -gmc->dV[0]; /* -Sin */ |
384 |
gmc->dV[1] = gmc->dU[0] ; /* Cos */ |
gmc->dV[1] = gmc->dU[0] ; /* Cos */ |
385 |
} |
} |
386 |
else |
else |
|
#endif |
|
387 |
{ |
{ |
388 |
const int Beta = log2bin(height-1); |
const int Beta = log2bin(height-1); |
389 |
const int Hs = 1<<Beta; |
const int Hs = 1<<Beta; |