/*********************************************************************************** * * * Programa: vff2PICT v2.1 (c) Angel Soria 1994 * * * * Convertidor de los ficheros .vff de SunVision al formato PICT de Macintosh * * * ***********************************************************************************/ #include #include #include #include #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 ALFA 0 /* Si ALFA = 0 se eliminara el canal alfa */ #define ELIMINA 1 /* Si ELIMINA = 1 se elimina el vff */ /* Nombres y extensiones de los ficheros */ #define EXTENSION_P ".pict" /* Extension del fichero PICT resultante */ #define EXTENSION_I ".image" /* Extension del fichero origen */ #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. */ char nomb[MAXCAD]; /* Nombre del fichero a convertir. */ /***********************************************************************************/ void salir_error(mensaje1,mensaje2) char *mensaje1,*mensaje2; /***********************************************************************************/ /* Da un mensaje de error y aborta el programa.*/ /*---------------------------------------------*/ { printf("\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 1 si hay error y: * Las dimensiones lx, y ly. * El numero de canales. * Rellena la paleta de color si es un fichero con color indexado. */ { 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(nomb,", No tiene 'ncaa'"); return(1); } do { lee_linea(aux1,aux2); if ( (!strcmp(aux1,"rank")) && (strcmp(aux2,"2;")) ) { error(nomb,", Mal rango, debe ser 2."); return(1); } if ( (!strcmp(aux1,"type")) && (strcmp(aux2,"raster;")) ) { error(nomb,", Mal tipo, debe ser raster."); return(1); } if ( (!strcmp(aux1,"format")) && (strcmp(aux2,"base;")) ) { error(nomb,", Mal formato, debe ser base."); return(1); } 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(nomb,", Faltan datos imprescindibles."); return(1); } return(0); } /***********************************************************************************/ /* Programa Principal */ /***********************************************************************************/ main(argc,argv) int argc; char *argv[]; { char resp[MAXCAD]; /* Cadena usada para lectura de datos por pant. */ char *aux_pt; 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. */ unsigned int aux; /* Variable auxiliar. */ int i,j,k,z; /* Variables auxiliares. */ float porcent; /* Porcentaje del fichero que se ha convertido */ int verb; #ifdef MAC argc = ccommand(&argv); #endif if ( (argc>1)&&(!strcmp("-v",*++argv)) ) { --argc; verb=FALSE; } else { --argv; verb=TRUE; } if (verb) { printf("\n### Ejecutando vff2PICT v2.1 ###\n"); printf("\nConvertidor de ficheros .vff a PICT.\n"); printf("(c) 1994 Angel Soria.\n\n"); } if (argc<2) { printf("\tFaltan los nombres de los ficheros a convertir.\n"); printf("\tPara convertir los ficheros: fich1, fich2, fich3 ...\n"); printf("\n use el comando: vff2pict fich1 fich2 fich3 ... .\n"); printf("\nUtilice: vff2pict -v fich1 ... , para no sacar comentarios.\n"); exit(1); } while (--argc > 0) { strcpy(nomb,*++argv); /* Abro el fichero vff */ if( (vff=fopen(nomb,"r"))==NULL) { error("Imposible abrir: ",nomb); continue; } /* Leo el formato del fichero */ if( cabecera_vff(&lx,&ly,&canales) ) continue; /* Reservo Memoria */ if( (pixels = MALLOC(lx*canales,U_char)) == NULL) salir_error("Imposible crear espacio en memoria para Datos",""); if( (buff = MALLOC(lx*canales,U_char)) == NULL) salir_error("Imposible crear espacio en memoria para Datos",""); strcpy(resp,nomb); if (NULL != (aux_pt = strstr(resp,EXTENSION_I)) ) aux_pt[0]='\0'; if (verb) printf("%s\n",resp); sprintf(resp,"%s%s",resp,EXTENSION_P); switch(canales) { case(1): /* Creo el fichero PICT en modo RGB 8 bits */ f_pict=pict_open(resp,P_WRITE,ly,lx,M_RGB8,c_map); break; case(3): /* Creo el fichero PICT en modo RGB 24 bits */ #if !ALFA case(4): /* Si se elimina el canal alfa */ #endif f_pict=pict_open(resp,P_WRITE,ly,lx,M_RGB24,c_map); break; #if ALFA case(4): /* Creo el fichero PICT en modo RGBA 32 bits */ f_pict=pict_open(resp,P_WRITE,ly,lx,M_RGBA32,c_map); break; #endif default: error(nomb,", Numero de canales incorrecto."); continue; } /* Relleno el fichero PICT */ if (verb) printf("Convirtiendo \"%s\"... 00 %% \r",nomb); z=0; for(y=0; y=0; j--) for(i=0; i0; j--) for(i=0; i