/***********************************************************************************
 *                                                                                 *
 *       Programa: black2alfa v2.1                      (c) Angel Soria 1994       *
 *                                                                                 *
 *       Crea un canal alfa de una imagen PICT tomando el color negro transparente *
 *                                                                                 *
 ***********************************************************************************/
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <pict.h>		/* pict.h (c) SPD Soft */

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

#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 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 1.			*/
	Pict pict;		/* Fichero PICT resultante.			*/
 	char nomb1[MAXCAD];	/* Nombre del fichero pict1. 			*/
 	char nomb[MAXCAD];	/* Nombre del fichero pict. 			*/
	U_char *pix1;		/* Puntos que forman la linea origen en curso1	*/
	U_char *pix;		/* Puntos que forman la linea resultante	*/
	int  lx1,ly1;		/* Tama–o de la picture1.			*/
	int  mode1;		/* Modo de las imagenes de entrada		*/
	int  ncmp1;		/* Numero de componenetes de color		*/
	int  y;			/* Linea en proceso.				*/
	int  i;			/* Pixel de la linea en curso.			*/
	int  j;			/* Componente de la linea en curso.		*/
 	int  verb,black;	/* Mode						*/
 	float black_f;
	float aux_f;		/* Porcentaje del fichero que se ha tratado	*/
	int  aux1,aux2,aux3;	/* Variables auxiliares.			*/
	int  al1,aux4;		/* Variables auxiliares.			*/
	U_char	res;		/* Variables auxiliares.			*/


#ifdef MAC
	argc = ccommand(&argv);
#endif	
	verb=TRUE;
	black=0;
	if ( (argc>2) && (!strcmp(*++argv,"-v")))
	{
		--argc;
		verb=FALSE;
	}
	else
		--argv;

	if ( (argc>2) && (!strncmp(*++argv,"-b", 2)))
	{
		--argc;
		sscanf(*argv,"-b%i",&black);
		black_f = (float)black / 100.0;
	}
	else
		--argv;

	if (verb)
	{
		printf("\n###  Ejecutando black2alfa v2.1 ###\n");
		printf("\nCreaci—n de canal alfa para PICT«s.\n");
		printf("(c) 1994 Angel Soria.\n\n");
		if (black!=0)
			printf("  Alfa hasta el %i%% de Brillo.\n\n",black);
		
	}

	if (argc<3)
	{
		error("Faltan parametros.","");
		printf("\nUso: black2alfa [-v -bnnn] [fuente resultado].\n\n");
		printf("Se crea el canal alfa de resultado usando el brillo\n");
		printf("de la imagen fuente para calcular el alfa.\n\n");
		printf("fuente debe estar en formato RGB.\n\n");
		printf("-v indica sin comentarios, \n");
		printf("-bnnn especifica en nnn de 0 a 100 el valor de brillo \n");
		printf("por debajo del cual se toman transparencias.\n");
		exit(1);
	}
	
	  	
	/* Abro el 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 la nueva */
	/*---------------*/
	
	strcpy(nomb,*++argv);
	
	if( (pict=pict_open(nomb,P_WRITE,ly1,lx1,M_RGBA32,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( (pix = MALLOC(lx1*4,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);
	aux4=0;
	for(y=0; y<ly1; y++)
	{
		if ( (pict_get_line(pict1,pix1))!=lx1 )
		{
			error("Al leer del fichero:",nomb1);
			goto salir4;
		}
		
		for(i=0; i<lx1; i++)
		{
			aux1=pix1[i+(0+al1)*lx1];
			aux2=pix1[i+(1+al1)*lx1];
			aux3=pix1[i+(2+al1)*lx1];
			if (black==0)
			{
				if ( (aux1==0) && (aux2==0) && (aux3==0) )
					pix[i] = 0xFF; /* transp */
				else
					pix[i] = 0;
			}
			else
			{  /* M—dulo del color */
				aux_f=(float)aux1*aux1+(float)aux2*aux2+(float)aux3*aux3;
				aux_f = sqrt( aux_f / 3.0 );
				if (aux_f < black)
				{
					pix[i] = (1.0 - aux_f / black) * 0xFF;
				}
				else
					pix[i] = 0;
			
			}
			
			for(j=0; j<3; j++)	/* Copia las componentes RGB */
			
				pix[i+(j+1)*lx1]=pix1[i+(j+al1)*lx1];
			
		}	 
		pict_put_line(pict,pix);
		if ( (aux4++>30) && verb )
		{
			aux4=0;
			aux_f=100.0*(y+1.0)/ly1;
			printf("Generando \"%s\"... %02.0f %%  \r",nomb,aux_f);	
		}
	}
	if (verb)
		printf("Generando \"%s\"... 100 %%  \n",nomb);	
salir4:
	pict_close(pict);
salir3:
salir2:
	pict_close(pict1);
salir1:	
	if (verb)
		printf("\n### black2alfa Finalizado ###\n\n");
}