/*********************************************************************************** * * * Programa: frames2PICT Proyecto Fin de Carrera (c) Angel Soria 1993 * * * * Convertidor de los ficheros .vff que produce SunVoxel a formato PICT * * Los ficheros se van convirtiendo, conforme se van generando por el Script * * y se van enviando a la unidad correspondiente, para su almacenamiento. * * * ***********************************************************************************/ #include #include #include #include "pict.h" /* pict.h (c) SPD Soft */ /* PARAMETROS DE COMPILACION */ #define ALFA 0 /* Si ALFA = 1 Se mantendra el canal alfa */ #define GUARDAR 1 /* Si GUARDAR = 1 Se ejecutara PROCESO */ #define ELIMINA 1 /* Si ELIMINA = 1 se eliminaran los .vff */ /* Declaraciones */ #define PROCESO "guardar" /* Proceso a lanzar si GUARDAR =1 */ #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 */ /* Nombres y extensiones de los ficheros */ #define NOMB_IMAGEN "Imagen." /* Nombre de las imagenes */ #define EXTENSION_P "" /* Extension del fichero PICT */ #define EXTENSION_I ".image" /* Extension de las imagenes vff */ #define MALLOC(n,x) ((x*)malloc((n)*sizeof(x))) /* Variables Globales */ /*--------------------*/ FILE *vff; /* Fichero vff procedente de SunVision. */ Pict f_pict; /* Fichero PICT de salida. */ U_char c_map[256][3]; /* Paleta de color en ficheros que la tengan. */ /***********************************************************************************/ void salir_error(mensaje1,mensaje2) char *mensaje1,*mensaje2; /***********************************************************************************/ /* Da un mensaje de error y aborta el programa.*/ /*---------------------------------------------*/ { fprintf(stderr,"\tERROR: %s%s.\n",mensaje1,mensaje2); exit(1); } /***********************************************************************************/ void error(mensaje1,mensaje2) char *mensaje1,*mensaje2; /***********************************************************************************/ /* Da un mensaje de error.*/ /*------------------------*/ { printf("\tERROR: %s%s.\n",mensaje1,mensaje2); } /***************************************************************************/ unsigned char Hex2Dec (cadena) char *cadena; /***************************************************************************/ /* Convierte una cadena de dos caracteres en hexadecimal a su valor decimal. */ { unsigned char dec=0; /* Valor decimal */ int i; /* variable auxiliar */ for (i=0;i<2; i++) cadena[i]=toupper(cadena[i]); if (cadena[1]>='A') dec=cadena[1]-'A'+10; else dec=cadena[1]-'0'; if (cadena[0]>='A') dec=dec+(cadena[0]-'A'+10)*16; else dec=dec+(cadena[0]-'0')*16; return(dec); } /***************************************************************************/ int lee_linea (comando,valor) char *comando; char *valor; /***************************************************************************/ /* Lee una linea terminada en '\n' o '\r' del fichero vff. Retorna true si ha sido correcto. */ { char aux[MAXCAD]; /* Variable auxiliar */ int i; /* Variable auxiliar */ if ( fgets(aux,MAXCAD-1,vff)==NULL ) return(FALSE); for (i=0; (aux[i]!='\0')&&(aux[i]!='\n')&&(aux[i]!='\r'); i++); aux[i]='\0'; /* Elimino \n o \r */ strcpy(comando,aux); /* Separo Comando y Valor */ if (strchr(aux,'=')!=NULL) { *strchr(comando,'=')='\0'; strcpy(valor,&(strchr(aux,'=')[1])); } return(TRUE); } /***********************************************************************************/ int cabecera_vff(lx,ly,canales) int *lx,*ly,*canales; /***********************************************************************************/ /* Lee la cabecera del fichero vff, la interpreta y devuelve: * Las dimensiones lx, y ly. * El numero de canales. * Rellena la paleta de color si es un fichero con color indexado. * Retorna 0 si no tiene exito. */ { char aux1[MAXCAD],aux2[MAXCAD]; /* Strings auxiliares */ char buffer[MAXCAD+10]; /* String auxiliar */ int x; /* Variable auxiliar */ *lx=0; /* Inicializo variables */ *ly=0; *canales=0; lee_linea(aux1,aux2); if ( strcmp(aux1,"ncaa") ) { error("El fichero no tiene 'ncaa'",""); return(0); } do { lee_linea(aux1,aux2); if ( (!strcmp(aux1,"rank")) && (strcmp(aux2,"2;")) ) { error("Fichero vff: ","Mal rango, debe ser 2."); return(0); } if ( (!strcmp(aux1,"type")) && (strcmp(aux2,"raster;")) ) { error("Fichero vff: ","Mal tipo, debe ser raster."); return(0); } if ( (!strcmp(aux1,"format")) && (strcmp(aux2,"base;")) ) { error("Fichero vff: ","Mal formato, debe ser base."); return(0); } if ( !strcmp(aux1,"size") ) { sscanf(aux2,"%i %i",lx,ly); /* Tama–o. */ continue; } if ( !strcmp(aux1,"bands") ) { sscanf(aux2,"%i",canales); /* n¼ de canales. */ continue; } /* No chequeo bits, solo puede ser 8 */ /* No cheque ColorMapSize, solo puede ser 256 */ if ( !strcmp(aux1,"colormap") ) /* Especifica paleta de color */ { strcpy(buffer,aux2); x=0; do { do { strncpy(aux1,buffer,2); /* Relleno la paleta de color */ aux1[2]='\0'; c_map[x][2]=Hex2Dec(aux1); /*B*/ strncpy(aux1,&(buffer[2]),2); aux1[2]='\0'; c_map[x][1]=Hex2Dec(aux1); /*G*/ strncpy(aux1,&(buffer[4]),2); aux1[2]='\0'; c_map[x][0]=Hex2Dec(aux1); /*R*/ strcpy(aux1,&(buffer[7])); /* Me coloco en el siguiente */ strcpy(buffer,aux1); x++; } while (strlen(buffer)>7); if (x!=256) /* Si no he terminado, cargo mas datos */ { lee_linea(aux1,aux2); strcat(buffer,aux1); } } while (x<256); } } while (aux1[0]!='\f'); if ( (*canales==0)||(*lx==0)||(*ly==0) ) { error("Fichero vff: ","Faltan datos imprescindibles."); return(0); } return(1); } /***********************************************************************************/ /* Programa Principal */ /***********************************************************************************/ main() { char resp[MAXCAD]; /* Cadena usada para lectura de datos por pant. */ char nombvff[MAXCAD]; /* Nombre del fichero .vff original. */ char nombpict[MAXCAD]; /* Nombre completo del fichero .pict nuevo. */ U_char *pixels; /* Puntos que forman la linea que se convierte */ U_char *buff; /* Buffer auxiliar para invertir los canales */ int lx,ly; /* Tama–o de la picture. */ int canales; /* Numero de canales del fichero de entrada. */ int y; /* Linea en proceso de conversion. */ int ind; /* Numero del fichero vff en curso. */ int img_i; /* Numero de la imagen inicial. */ int num_i; /* Numero de la imagen final. */ long int longit; /* Longitud de lo grabado en formato pict */ unsigned int aux; /* Variable auxiliar. */ int i,j,k; /* Variables auxiliares. */ fprintf(stderr,"\n### Ejecutando frames2PICT ###\n"); fprintf(stderr,"\nConvertidor automatico de ficheros vff a PICT.\n"); fprintf(stderr,"(c) 1993 Angel Soria.\n\n"); /* Parametros de la Imagen */ /*-------------------------*/ do { fprintf(stderr,"Numero de la primera imagen ? "); fscanf(stdin,"%i",&img_i); fprintf(stderr,"\n"); fflush(stdin); } while (img_i<1); do { fprintf(stderr,"Numero de la ultima imagen ? "); fscanf(stdin,"%i",&num_i); fprintf(stderr,"\n"); fflush(stdin); } while (num_i=0; j--) for(i=0; i0; j--) for(i=0; i