libtthimage/Lib/warp2.c

122 lines
2.7 KiB
C

/*
warp2.c
---------------
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "../tthimage.h"
/*::------------------------------------------------------------------::*/
/*
* Bon, ça marche avec des déplacements positifs, mais pour
* revenir en arrière, on fait comment ?
*/
int
Image_shift_xy(Image_Desc *src, Image_Desc *dst, int ox, int oy)
{
int x, y;
int x2, y2, foo;
#if DEBUG_LEVEL
fprintf(stderr, "*** %s: work in progress...\n", __func__);
fprintf(stderr, "src=%p dst=%p ox=%d oy=%d\n", src, dst, ox, oy);
#endif
if ( src == dst )
{
fprintf(stderr, "Image shift xy: can't overwrite, sorry\n");
return IMG_OVERWRITE;
}
if ( (foo=Image_compare_desc(src, dst)) )
{
fprintf(stderr, "%s: images are differents %d\n", __func__, foo);
return foo;
}
if ( (ox<0) || (ox>=src->width) )
{
fprintf(stderr, "Image shift xy: param ox %d out of range\n", ox);
return INVALID_PARAM;
}
if ( (oy<0) || (oy>=src->height) )
{
fprintf(stderr, "Image shift xy: param oy %d out of range\n", oy);
return INVALID_PARAM;
}
for (y=0; y<dst->height; y++)
{
y2 = (y+oy) % src->height;
for (x=0; x<dst->width; x++)
{
x2 = (x+ox) % src->width;
Image_pixel_copy(src, x, y, dst, x2, y2);
}
}
return FUNC_IS_BETA; /* et elle coredumpe ? */
}
/*::------------------------------------------------------------------::*/
/* OPTIMIZED FOR SPEED */
int Image_shift_x(Image_Desc *src, Image_Desc *dst, int ox)
{
unsigned char *buffer;
int foo, line;
#if DEBUG_LEVEL
fprintf(stderr, "*** %s : work in progress...\n", __func__);
fprintf(stderr, "%p -> sX(%d) -> %p\n", src, ox, dst);
#endif
if ( (foo=Image_compare_desc(src, dst)) )
{
fprintf(stderr, "%s: images are differents %d\n", __func__, foo);
return foo;
}
if (NULL==(buffer=malloc(src->width))) {
fprintf(stderr, "%s: malloc(%d) fail.\n", __func__, src->width);
#if MUST_ABORT
abort();
#endif
exit(1);
}
for (line=0; line<src->width; line++) {
/* do something here */
}
free(buffer);
return FULL_NUCKED;
}
/*::------------------------------------------------------------------::*/
/* OPTIMIZED FOR SPEED */
int Image_shift_y(Image_Desc *src, Image_Desc *dst, int oy)
{
int foo;
#if DEBUG_LEVEL
fprintf(stderr, "*** %s : work in progress...\n", __func__);
fprintf(stderr, "%p -> sY(%d) -> %p\n", src, oy, dst);
#endif
if ( (foo=Image_compare_desc(src, dst)) )
{
fprintf(stderr, "%s: images are differents %d\n", __func__, foo);
return foo;
}
return FULL_NUCKED;
}
/*::------------------------------------------------------------------::*/
/*
* voir aussi les modules scale.c et warp[0|1|3].c
*/
/*::------------------------------------------------------------------::*/