/***********************************************************************************
 *                                                                                 *
 *       Programa: croma 1.1    Proyecto Fin de Carrera  (c) Angel Soria 1994       *
 *                                                                                 *
 *           Superpone dos ficheros PICT teniendo en cuenta el canal Alfa          *
 *                                                                                 *
 ***********************************************************************************/
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "pict.h"		/* pict.h (c) SPD Soft */

#ifdef THINK_C
#include "console.h"		/* !! Solo para pruebas en MacIntosh !! 	*/				/* Debe definirse en el proyecto: MAC	*/
#endif				

#define MAXCAD 100		/* Longitud maxima de las cadenas +1 		*/
#define TRUE 1			/* Para poder trabajar con booleanos  		*/
#define FALSE 0			/* Para poder trabajar con booleanos  		*/
#define ALFA 0			/* Si ALFA = 0 se eliminara el canal alfa	*/

/* Nombres y extensiones de los ficheros */

#define EXTENSION_P ".pict"	/* Extension del fichero PICT resultante	*/

#define MALLOC(n,x) ((x*)malloc((n)*sizeof(x)))



/***********************************************************************************/
void error(mensaje1,mensaje2)
char *mensaje1,*mensaje2;
/***********************************************************************************/

/* Da un mensaje de error.*/
/*------------------------*/
{
	printf("\tERROR: %s%s.\n",mensaje1,mensaje2);
}



/***********************************************************************************/
/*				Programa Principal				   */
/***********************************************************************************/

main(argc,argv)
int argc;
char *argv[];
{
	Pict pict1;		/* Fichero PICT original.			*/
	Pict pict2;		/* Fichero PICT original.			*/
	Pict pict;		/* Fichero PICT resultante.			*/
 	char nomb1[MAXCAD];	/* Nombre del fichero pict1. 			*/
 	char nomb2[MAXCAD];	/* Nombre del fichero pict2. 			*/
 	char nomb[MAXCAD];	/* Nombre del fichero pict. 			*/
	U_char *pix1;		/* Puntos que forman la linea origen en curso	*/
	U_char *pix2;		/* Puntos que forman la linea origen en curso	*/
	U_char *pix;		/* Puntos que forman la linea resultante	*/
	int  lx1,ly1;		/* Tama�o de la picture1.			*/
	int  lx2,ly2;		/* Tama�o de la picture2.			*/
	int  mode1,mode2;	/* Modo de las imagenes de entrada		*/
	int  ncmp1,ncmp2;	/* Numero de componenetes de color		*/
	int  y;			/* Linea en proceso de conversion.		*/
	int  i;			/* Pixel de la linea en curso.			*/
	int  j;			/* Componente de la linea en curso.		*/
 	int  verb;		/* Si es TRUE saca comentarios en la pantalla	*/
	float porcent;		/* Porcentaje del fichero que se ha convertido	*/
	int  aux1,aux2,aux3;	/* Variables auxiliares.			*/
	int  al1,al2;		/* Variables auxiliares.			*/
	U_char	alf1,res;	/* Variables auxiliares.			*/
	int z;

#ifdef THINK_C
	argc = ccommand(&argv);
#endif	
	if ( (argc>2)&&(!strcmp("-v",*++argv)) )	
	{
		--argc;
		verb=FALSE;
	}
	else
	{
		--argv;
		verb=TRUE;
	}
	if (verb)
	{
		printf("\n###  Ejecutando croma v1.1 ###\n");
		printf("\nFuncion croma para PICT's.\n");
		printf("(c) 1993 Angel Soria.\n\n");
	}

	if (argc<4)
	{
		error("Faltan parametros.","");
		printf("\nUso: croma [-v] [fuente1 fuente2 resultado].\n\n");
		printf("Se utiliza el canal alfa de fuente1 para realizar la superposicion\n");
		printf("sobre fuente2. El resulatado tiene el canal alfa de fuente2.\n\n");
		printf("fuente1 y fuente2 deben tener el mismo tama�o de imagen.\n\n");
		printf("-v indica sin comentarios, \n");
		exit(1);
	}
	
	  	
	/* Abro el primer fichero */
	/*------------------------*/
	  	
	strcpy(nomb1,*++argv);
  
	if( (pict1=pict_open(nomb1,P_READ,0,0,0,NULL))==NULL)
	{
		error("Imposible abrir: ",nomb1);
		goto salir1;
	}
	lx1=pict_width(pict1);
	ly1=pict_height(pict1);
	mode1=pict_mode(pict1);
	ncmp1=pict_n_comp(pict1);
	al1=ncmp1-3;
	if ( (mode1==M_MONO)||(mode1==M_RGB8) )
	{
		error("Modo no soportado en:",nomb1);
		goto salir2;
	}
	
	/* Abro el segundo fichero */
	/*------------------------*/

	strcpy(nomb2,*++argv);
  
	if( (pict2=pict_open(nomb2,P_READ,0,0,0,NULL))==NULL)
	{
		error("Imposible abrir: ",nomb2);
		goto salir2;
	}
	lx2=pict_width(pict2);
	ly2=pict_height(pict2);
	mode2=pict_mode(pict2);
	ncmp2=pict_n_comp(pict2);
	al2=ncmp2-3;
	if ( (mode2==M_MONO)||(mode2==M_RGB8) )
	{
		error("Modo no soportado en:",nomb2);
		goto salir3;
	}

	/* Comparo las pict y abro la nueva */
	/*----------------------------------*/
	
	strcpy(nomb,*++argv);
	
	if ( (lx1!=lx2)||(ly1!=ly2) )
	{
		error("Las dimansiones de los PICT deben ser iguales","");
		goto salir3;
	}

	if( (pict=pict_open(nomb,P_WRITE,ly2,lx2,mode2,NULL))==NULL)
	{
		error("Imposible crear: ",nomb);
		goto salir3;
	}
	
	/* Reserva memoria */
	/*-----------------*/
	
	if( (pix1 = MALLOC(lx1*ncmp1,U_char)) == NULL)
	{
 		error("Imposible crear espacio en memoria para Datos","");
 		goto salir4;
 	}
	if( (pix2 = MALLOC(lx1*ncmp2,U_char)) == NULL)
	{
 		error("Imposible crear espacio en memoria para Datos","");
 		goto salir4;
 	}
	if( (pix = MALLOC(lx1*ncmp2,U_char)) == NULL)
	{
 		error("Imposible crear espacio en memoria para Datos","");
 		goto salir4;
 	}

	/* Bucle para generar el resultado */
	/*---------------------------------*/
	
	if (verb)
		printf("Generando \"%s\"... 00 %%  \r",nomb);	
	for(y=0; y<ly1; y++)
	{
		if ( (pict_get_line(pict1,pix1))!=lx1 )
		{
			error("Al leer del fichero:",nomb1);
			goto salir4;
		}
		if ( (pict_get_line(pict2,pix2))!=lx2 )
		{
			error("Al leer del fichero:",nomb2);
			goto salir4;
		}
		
		for(i=0; i<lx1; i++)
		{
			if (al1)		/* Componentes alfa de los puntos */
				alf1=pix1[i];
			else
				alf1=0;
			if (al2)
				pix[i]=pix2[i];
			for(j=0; j<3; j++)	/* Bucle para las componentes RGB */
			{
				aux1=pix1[i+(j+al1)*lx1];
				aux2=pix2[i+(j+al2)*lx2];
				aux3=( aux1*(0xFF-alf1) + aux2*alf1 ) / 0xFF;
				res=(U_char)aux3;
				pix[i+(j+al2)*lx2]=res;
			}
		}	 
		pict_put_line(pict,pix);
		if ((z++<30) && verb)
		{
			z=0;
			porcent=100*(y+1)/ly1;
			printf("Generando \"%s\"... %02.0f %%  \r",nomb,porcent);	
		}
	}
	if (verb)
		printf("Generando \"%s\"... 100 %%  \n",nomb);	
salir4:
	pict_close(pict);
salir3:
	pict_close(pict2);
salir2:
	pict_close(pict1);
salir1:	
	if (verb)
		printf("\n### Croma Finalizado ###\n\n");
}