libtthimage/Lib/doublesz.c

155 lines
3.3 KiB
C

/*
doublesz.c
----------------
see also: scale.c halfsize.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "../tthimage.h"
/*::------------------------------------------------------------------::*/
/*
* cette fonction alloue une _nouvelle_ image
*
* méthodes:
* 0: primitive.
* 1: semblant d'interpolation.
*
*/
Image_Desc *
Image_MakeDoubleSize(Image_Desc *image, int methode)
{
int largeur, hauteur, x, y, xx, yy;
Image_Desc *sortie;
int v1, v2, v3, v4;
largeur = image->width * 2;
hauteur = image->height * 2;
sortie = Image_alloc(largeur, hauteur, image->type);
#if DEBUG_LEVEL
fprintf(stderr, "Image double size: %d %d -> %p\n", largeur, hauteur, sortie);
#endif
if ( sortie == NULL )
{
fprintf(stderr, "Image make double size: no memory\n");
exit(5);
}
/*
* transfert de certains attributs...
*/
sortie->modified = 0;
sortie->errmsg = image->errmsg; /* XXX pointeur fou ? */
if (methode == 0)
{
for (x=0; x<image->width; x++)
{
xx = x * 2;
for (y=0; y<image->height; y++)
{
yy = y * 2;
Image_pixel_copy(image, x, y, sortie, xx, yy);
Image_pixel_copy(image, x, y, sortie, xx+1, yy);
Image_pixel_copy(image, x, y, sortie, xx, yy+1);
Image_pixel_copy(image, x, y, sortie, xx+1, yy+1);
}
}
}
else
{
for (x=0; x<image->width-1; x++)
{
xx = x * 2;
for (y=0; y<image->height-1; y++)
{
yy = y * 2;
v1 = (image->Rpix[y])[x];
v2 = (image->Rpix[y])[x+1];
v3 = (image->Rpix[y+1])[x];
v4 = (image->Rpix[y+1])[x+1];
(sortie->Rpix[yy])[xx] = v1;
(sortie->Rpix[yy])[xx+1] = (v1+v2)/2;
(sortie->Rpix[yy+1])[xx] = (v1+v3)/2;
(sortie->Rpix[yy+1])[xx+1] = (v1+v2+v3+v4)/4;
v1 = (image->Gpix[y])[x];
v2 = (image->Gpix[y])[x+1];
v3 = (image->Gpix[y+1])[x];
v4 = (image->Gpix[y+1])[x+1];
(sortie->Gpix[yy])[xx] = v1;
(sortie->Gpix[yy])[xx+1] = (v1+v2)/2;
(sortie->Gpix[yy+1])[xx] = (v1+v3)/2;
(sortie->Gpix[yy+1])[xx+1] = (v1+v2+v3+v4)/4;
v1 = (image->Bpix[y])[x];
v2 = (image->Bpix[y])[x+1];
v3 = (image->Bpix[y+1])[x];
v4 = (image->Bpix[y+1])[x+1];
(sortie->Bpix[yy])[xx] = v1;
(sortie->Bpix[yy])[xx+1] = (v1+v2)/2;
(sortie->Bpix[yy+1])[xx] = (v1+v3)/2;
(sortie->Bpix[yy+1])[xx+1] = (v1+v2+v3+v4)/4;
}
} /* finbo x */
} /* endif */
sortie->modified = 0;
return sortie;
}
/*::------------------------------------------------------------------::*/
Image_Desc *
Image_MakeDoubleSize_H(Image_Desc *image, int methode)
{
Image_Desc *sortie;
int largeur, x, y, r, g, b;
int r2, g2, b2;
#if DEBUG_LEVEL
fprintf(stderr, "*** %s is experimental. method: %d\n", __func__, methode);
#endif
largeur = image->width * 2;
fprintf(stderr, "%s ---> %d x %d\n", __func__, largeur, image->height);
sortie = Image_alloc(largeur, image->height, image->type);
if ( sortie == NULL )
{
fprintf(stderr, "Image make double size H: no memory\n");
exit(5);
}
#if DEBUG_LEVEL
Image_dump_descriptor(sortie, "double largeur");
#endif
switch (methode)
{
case 0:
for (x=0; x<image->width; x++)
{
for (y=0; y<image->height; y++)
{
Image_getRGB(image, x, y, &r, &g, &b);
Image_plotRGB(sortie, x, y, r, g, b);
Image_plotRGB(sortie, x+1, y, r, g, b);
}
}
break;
case 1:
break;
}
sortie->modified = 1;
return sortie;
}
/*::------------------------------------------------------------------::*/