/*********************************************************************************** * * * Programa: croma 1.1 Proyecto Fin de Carrera (c) Angel Soria 1994 * * * * Superpone dos ficheros PICT teniendo en cuenta el canal Alfa * * * ***********************************************************************************/ #include #include #include #include #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