/* flounder - copyright 2002 Edward J. Vigmond This file is part of flounder. flounder is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. flounder is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with flounder; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include "IGBheader.h" using namespace std; /* -------------- Bits de statut pour Header_Read et Header_Write ------ */ #define MOT_CLEF_INV 2 #define GRANDEUR_INV 4 /* * Types de trames */ #define MIN_TRAME 0 #define C8 0 #define C4 1 #define HEX 2 #define HEXEDGES 3 #define HEXBRIDGES 4 #define HEXLINES 5 #define HEX2 6 #define MAX_TRAME 6 #define NTRAMES 7 #define LF 0x0A #define FF 0x0C #define CR 0x0D /*---------------------------------------------------------------------------*\ y x-> 1 2 3 4 5 | v X|X|X|X|X|X 1 -o-o-o-o-o- X|X|X|X|X|X 2 -o-o-o-o-o- \|/ X|X|X|X|X|X C8: -o- 3 -o-o-o-o-o- /|\ X|X|X|X|X|X 4 -o-o-o-o-o- X|X|X|X|X|X 5 -o-o-o-o-o- X|X|X|X|X|X \*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*\ y x-> 1 2 3 4 5 | v | | | | | 1 -o-o-o-o-o- | | | | | 2 -o-o-o-o-o- | | | | | | C4: -o- 3 -o-o-o-o-o- | | | | | | 4 -o-o-o-o-o- | | | | | 5 -o-o-o-o-o- | | | | | \*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*\ y x-> 1 2 3 4 5 1 2 3 4 5 | v 1 2 3 4 5 \|\|\|\|\| \ / \ / \ / \ / \ / 1 -o-o-o-o-o- -o---o---o---o---o--- \| /|/|/|/|/|/ / \ / \ / \ / \ / \ / y impair -o- 2 -o-o-o-o-o- ---o---o---o---o---o- /| \|\|\|\|\|\ \ / \ / \ / \ / \ / \ HEX: 3 -o-o-o-o-o- -o---o---o---o---o--- |/ /|/|/|/|/|/ / \ / \ / \ / \ / \ / y pair -o- 4 -o-o-o-o-o- ---o---o---o---o---o- |\ \|\|\|\|\|\ \ / \ / \ / \ / \ / \ 5 -o-o-o-o-o- -o---o---o---o---o--- /|/|/|/|/| / \ / \ / \ / \ / \ \*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*\ x x-> 1 2 3 4 5 1 2 3 4 5 6 impair pair 1 2 3 4 5 y 1 2 3 4 5 | \| v 1 2 3 4 5 y%4==1 -o- -o- /| \| \| \| \ / . \ / . \ / . 1 -o-o-o-o-o- -o---o---o---o---o---o | / /| /| /| / \ . / \ . / \ . y%4==2 o o 2 o o o o o o o o o o | / |/ |/ |/ . \ / . \ / . \ HEXEDGES: 3 -o-o-o-o-o- -o---o---o---o---o---o |/ |\ |\ |\ . / \ . / \ . / y%4==3 -o- -o- 4 o o o o o o o o o o |\ \| \| \| \ / . \ / . \ / . 5 -o-o-o-o-o- -o---o---o---o---o---o | \ /| /| /| / \ . / \ . / \ . y%4==0 o o 6 o o o o o o o o o o | \ |/ |/ | . \ / . \ / . \ \*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*\ x x-> 1 2 3 4 5 1 2 3 4 5 6 impair pair 1 2 3 4 5 y 1 2 3 4 5 | v y%4==1 o -o- 1 2 3 4 5 . . . 1 o -o- o -o- o o -o- o -o- o -o . . . | / | / | / | \ . . / \ . . / \ . y%4==2 o o 2 o o o o o o o o o o | / | / | / | . \ / . . \ / . . \ . . . HEXBRIDGES: 3 o -o- o -o- o -o- o -o- o -o- o . . . | \ | \ | . / \ . . / \ . . / y%4==3 o -o- 4 o o o o o o o o o o | \ | \ | / . . \ / . . \ / . . . . 5 o -o- o -o- o o -o- o -o- o -o . . . | \ | / | / | \ . . / \ . . / \ . y%4==0 o o 6 o o o o o o o o o o | \ | / | / | . \ / . . \ / . . \ \*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*\ x x-> 1 2 3 4 5 1 2 3 4 5 6 impair pair 1 2 3 4 5 y 1 2 3 4 5 | \| v 1 2 3 4 5 y%4==1 o o /| \| \| \./ \./ \./ 1 o o o o o o o o o o o / | /| /| / /.\ /.\ /.\ y%4==2 -o- -o- 2 -o-o-o-o-o- ---o---o---o---o---o--- / | / |/ |/ \./ \./ \./ HEXLINES: 3 o o o o o o o o o o o |/ |\ |\ /.\ /.\ /.\ y%4==3 o o 4 -o-o-o-o-o- ---o---o---o---o---o--- |\ \| \| \./ \./ \./ 5 o o o o oo o o o o o o \ | /| /| / /.\ /.\ /.\ y%4==0 -o- -o- 6 -o-o-o-o-o- ---o---o---o---o---o--- \ | / |/ |/ / \./ \./ \*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*\ x-> 1 2 3 4 5 1 2 3 4 5 6 y 1 2 3 4 5 | v 1 2 3 4 5 \| 1 2 3 4 5 y%4==1 -o- /| \|\|\|\|\| \ / \ / \ / \ / \ / 1 -o-o-o-o-o- -o---o---o---o---o---o |/ /|/|/|/|/| / \ / \ / \ / \ / \ / y%4==2 -o- 2 -o-o-o-o-o- ---o---o---o---o---o- /| /|/|/|/|/|/ \ / \ / \ / \ / \ / \ HEX2: 3 -o-o-o-o-o- -o---o---o---o---o---o |/ \|\|\|\|\| / \ / \ / \ / \ / \ / y%4==3 -o- 4 -o-o-o-o-o- ---o---o---o---o---o- |\ \|\|\|\|\| \ / \ / \ / \ / \ / \ 5 -o-o-o-o-o- -o---o---o---o---o---o \| /|/|/|/|/| / \ / \ / \ / \ / \ / y%4==0 -o- 6 -o-o-o-o-o- ---o---o---o---o---o- |\ /|/|/|/|/| / \ / \ / \ / \ / \ \*---------------------------------------------------------------------------*/ /* -------------- Definitions pour conv_date --------------------------- */ #define FRANCAIS 0 #define ANGLAIS 1 #define NUMERIQUE 2 #ifndef IGB_DATE #define IGB_DATE 0 #endif /* -------------- Constantes diverses ---------------------------------- */ #define MAXL 80 /* Longueur maximale d'une ligne d'entete */ #define N_MAX_ITEMS 30 /* Nombre maximal d'items optionnels */ #define L_MAX_ITEM 49 /* Longueur maximale pour un item optionnel */ #ifndef VRAI #define VRAI 1 #endif #ifndef FAUX #define FAUX 0 #endif int my_fputs( FILE *, char * ); int Header_Quiet = 0; char Header_Message[256]; char *Header_Type[] = { "", "byte", "char", "short", "long", "float", "double", "complex", "double_complex", "rgba", "structure", "pointer", "list","int","uint" }; unsigned short Data_Size[] = { 0, sizeof(Byte), sizeof(char), sizeof(short), sizeof(long), sizeof(float), sizeof(double), 0, 0, 0, 0, sizeof(void *), 0, sizeof(int), sizeof(UInt) }; long unsigned Header_Systeme_No[] = { UNIX, SYSTEM_V, IRIS, IRIS_3000, IRIS_4D, BSD, ULTRIX, XENIX, SUNOS, SUN, SUN2, SUN3, SUN4, SUN386, SOLARIS, SPARC, SOLARISPC, IRIX, IRIX3, IRIX4, IRIX5, IRIX6, VMS, DOS, DOS3, DOS4, DOS4, DOS5, OS2, WINNT, WINNTINTEL, WINNTMIPS, WINNTALPHA, WINNTPOWER, PC_LINUX, IGB_BIG_ENDIAN, IGB_LITTLE_ENDIAN }; char *Header_Systeme[] = { "unix", "system_v", "iris", "iris_3000", "iris_4d", "bsd", "ultrix", "xenix", "sunos", "sun", "sun2", "sun3", "sun4", "sun386", "solaris", "sparc", "solarispc", "irix", "irix3", "irix4", "irix5", "irix6", "vms", "dos", "dos3", "dos4", "dos5", "dos6", "os2", "winnt", "winntintel", "winntmips", "winntalpha", "winntpower", "linux", "big_endian", "little_endian" }; IGBheader::IGBheader( gzFile in ) { file = in; v_x = v_y = v_type = 0 ; v_systeme = IGB_SYSTEME; v_comp = v_lut = v_num = v_bin = 0 ; v_trame = C8 ; v_z = v_t = 1 ; v_epais = 0.0 ; v_inc_x = v_inc_y = v_inc_z = v_inc_t = 1.0 ; v_org_x = v_org_y = v_org_z = 1; v_org_t = 0.0 ; v_fac_x = v_fac_y = v_fac_z = v_fac_t = 1.0 ; v_vect_z = NULL ; v_unites_x[0] = v_unites_x[40] = '\000' ; v_unites_y[0] = v_unites_y[40] = '\000' ; v_unites_z[0] = v_unites_z[40] = '\000' ; v_unites_t[0] = v_unites_t[40] = '\000' ; v_unites[0] = v_unites[40] = '\000' ; v_facteur = 1.0 ; v_zero = 0.0 ; v_aut_name[0] = v_aut_name[40] = '\000' ; v_struct_desc[0] = v_struct_desc[40] = '\000' ; v_comment = (char **) malloc( NALLOC*sizeof(char *) ) ; v_comment[0] = NULL ; v_transparent = NULL; gzipping = true; bool_x = bool_y = bool_type = FAUX; bool_z = bool_t = FAUX; bool_taille = FAUX; bool_systeme = FAUX; bool_num = FAUX; bool_bin = FAUX; bool_trame = FAUX; bool_lut = FAUX; bool_comp = FAUX; bool_epais = FAUX; bool_org_x = bool_org_y = bool_org_z = bool_org_t = FAUX; bool_inc_x = bool_inc_y = bool_inc_z = bool_inc_t = FAUX; bool_dim_x = bool_dim_y = bool_dim_z = bool_dim_t = FAUX; bool_fac_x = bool_fac_y = bool_fac_z = bool_fac_t = FAUX; bool_vect_z = FAUX; bool_unites_x = bool_unites_y = bool_unites_z = bool_unites_t = FAUX; bool_unites = FAUX; bool_facteur = bool_zero = FAUX; bool_aut_name = FAUX; bool_comment = FAUX; bool_transparent = FAUX; } IGBheader::~IGBheader() { } // set output for gzipped output void IGBheader::fileptr( gzFile fp ) { file = fp; gzipping = true; } // set output for normal unziped output void IGBheader::fileptr( FILE* fp ) { file = fp; gzipping = false; } int IGBheader::write() { int statut = 1; if (getenv("HEADER_QUIET")) Header_Quiet = VRAI; if (file==NULL) { if (!Header_Quiet) cerr<< "\nERREUR: descripteur de fichier nul\n"; sprintf(Header_Message, "\nERREUR: descripteur de fichier nul\n"); return(0) ; } if (v_typeIGB_MAX_TYPE) { if (!Header_Quiet) cerr<< "\nHeader_Write: type inconnu: "<< v_type; sprintf(Header_Message, "\nHeader_Write: type inconnu: %d\n", v_type); return (0); } char *type = Header_Type[v_type]; if (v_type==IGB_STRUCTURE && v_taille<1) { if (!Header_Quiet) cerr << "\nHeader_Write: taille invalide:" << v_taille << endl; sprintf(Header_Message, "\nHeader_Write: taille invalide: %d\n", v_taille); return (0); } if (v_trameMAX_TRAME) { if (!Header_Quiet) fprintf(stderr, "\nHeader_Write: trame inconnue: %d\n", v_trame); sprintf(Header_Message, "\nHeader_Write: trame inconnue: %d\n", v_trame); return (0); } char* systeme; int i; for ( i=0;i0) { n_lig_sup = 1 + (n_car_sup-1)/72; } else { n_lig_sup = 0; } int n_car_dl = 1 + (n_car_sup-1)%72; /* Ecrit les commentaires */ if (bool_comment) { comment = v_comment; while (*comment != NULL) { n_car = gzprintf(file, "#%.80s\r\n", *comment++); if (n_car==0) { if (!Header_Quiet) { fprintf(stderr, "\nHeader_Write: Erreur a l'ecriture \n"); perror("\n *** "); fprintf(stderr, "\n"); } sprintf(Header_Message, "\nHeader_Write: Erreur a l'ecriture \n"); return (0); } } } /* Complete l'entete a un multiple de 1024 caracteres */ for (i=0;i<70;i++) ligne[i] = ' '; ligne[70] = '\r'; ligne[71] = '\n'; ligne[72] = '\000'; for (i=0;i2) ligne[n_car_dl-3] = '\r'; if (n_car_dl>1) ligne[n_car_dl-2] = '\n'; ligne[n_car_dl-1] = FF; ligne[n_car_dl] = '\000'; if (puts_fcn( (void *)file, ligne )==-1) { if (!Header_Quiet) { fprintf(stderr, "\nHeader_Write: Erreur a l'ecriture \n"); perror("\n *** "); fprintf(stderr, "\n"); } sprintf(Header_Message, "\nHeader_Write: Erreur a l'ecriture \n"); return (0); } if (n_car_total>1024) { if (!Header_Quiet) fprintf(stderr, "\nHeader_Write ATTENTION: etiquette de grandeur non-standard \n"); sprintf(Header_Message, "\nHeader_Write ATTENTION: etiquette de grandeur non-standard \n"); statut |= GRANDEUR_INV; } else { sprintf(Header_Message, "\nHeader_Write: Entete transcrite sans problemes\n"); } /* if (bool_vect_z) { if (v_vect_z==NULL) { if (!Header_Quiet) fprintf(stderr,"\nERREUR: vect_z nul\n"); sprintf(Header_Message, "\nERREUR: vect_z nul\n"); return(0) ; } gzwrite(file, v_vect_z, sizeof(float)*v_z); } */ return (statut); } int IGBheader::read() { int go=VRAI, nosup=VRAI; int in, com=0; char str[MAXL+1]; int statut=1; /* --- pour toutes les lignes de l'entete (def=8) ou jusqu'a un -- */ for ( int s=8; (s>0 || nosup) && go; s-- ) { /* --- lit la ligne dans le fichier --- */ int i = 0 ; while(1) { /* --- (ligne trop longue) --> erreur --- */ if ( i >= 80 ) { if (!Header_Quiet) fprintf(stderr, "\nERREUR ligne trop longue (>80) dans l'entete !\n" ) ; sprintf(Header_Message, "\nERREUR ligne trop longue (>80) dans l'entete !\n" ) ; return( 0 ) ; } /* --- lit le caractere suivant --- */ in = gzgetc( file ) ; /* --- (EOF dans l'entete) --> erreur --- */ if ( in == -1 ) { if (!Header_Quiet) fprintf(stderr, "\nERREUR Fin de fichier dans l'entete !\n" ) ; sprintf(Header_Message, "\nERREUR Fin de fichier dans l'entete !\n" ) ; return( 0 ) ; } /* --- FF --> termine le header --- */ else if ( in == FF ) { str[i] = '\000' ; go = FAUX ; break ; } /* --- CR et LF --> termine la ligne --- */ else if ( in == CR ) { str[i] = '\000' ; } else if ( in == LF ) { str[i] = '\000' ; break ; } /* --- (0x20 < caractere > 0x7E) si non --> erreur --- */ else if ( in && ! isprint(in) ) { if (!Header_Quiet) fprintf(stderr, "\nERREUR caract. non imprim. 0x%.2X dans l'entete\n", in ); sprintf(Header_Message, "\nERREUR caract. non imprim. 0x%.2X dans l'entete !\n", in ); return( 0 ) ; } else { str[i++] = (char) in ; } } /* --- ----- ----- ----- sauve les commentaires ----- ----- --- */ for ( char* pt_1=str; *pt_1; pt_1++ ) { /* --- '*' ou '#' = commentaires ------> dans comment --- */ if ( *pt_1 == '*' || *pt_1 == '#') { if ( *(pt_1+1) ) { v_comment[com] = (char *)malloc( strlen(pt_1+1) + 1 ) ; strcpy( v_comment[com++], pt_1+1 ) ; if (com%NALLOC == 0) v_comment = (char **) realloc(v_comment, (com+NALLOC)*sizeof(char *)); v_comment[com] = NULL ; bool_comment = VRAI; } *pt_1 = '\000' ; break ; } /* --- convertit majuscule un minuscules --- */ if (isupper(*pt_1)) *pt_1 = tolower( *pt_1 ) ; } /* --- ----- ----- ----- analyse la ligne ----- ----- ----- --- */ for ( char *pt_1=strtok(str," ,;\t"); pt_1; pt_1=strtok(NULL," ,;\t") ) { /* --- separe la chaine de caract. --- */ /* --- pt_1 pointe au key_word ---- */ /* --- pt_2 pointe a la donne ---- */ char *pt_2; for ( pt_2 = pt_1; *pt_2 != ':'; pt_2 ++ ) if ( ! *pt_2 ) { if (!Header_Quiet) fprintf(stderr, "\nERREUR de syntaxe dans l'entete (%s)\n", pt_1); sprintf(Header_Message, "\nERREUR de syntaxe dans l'entete (%s)\n", pt_1); return( 0 ) ; } *pt_2++ = '\000' ; /* --- recherche le mot-clef --- */ if ( ! strcmp( pt_1, "x" ) ) { v_x = atoi( pt_2 ) ; bool_x = VRAI; } else if ( ! strcmp( pt_1, "y" ) ) { v_y = atoi( pt_2 ) ; bool_y = VRAI; } else if ( ! strcmp( pt_1, "z" ) ) { v_z = atoi( pt_2 ) ; bool_z = VRAI; } else if ( ! strcmp( pt_1, "t" ) ) { v_t = atoi( pt_2 ) ; bool_t = VRAI; /* Pour compatibilite avec les vielles images */ } else if ( ! strcmp( pt_1, "sup" ) ) { s += atoi( pt_2 ) ; nosup = FAUX; } else if ( ! strcmp( pt_1, "type" ) ) { if ( ! strcmp( pt_2, "byte" ) ) { v_type = IGB_BYTE ; } else if ( ! strcmp( pt_2, "char" ) ) { v_type = IGB_CHAR ; } else if ( ! strcmp( pt_2, "short" ) ) { v_type = IGB_SHORT ; } else if ( ! strcmp( pt_2, "long" ) ) { v_type = IGB_LONG ; } else if ( ! strcmp( pt_2, "float" ) ) { v_type = IGB_FLOAT ; } else if ( ! strcmp( pt_2, "double" ) ) { v_type = IGB_DOUBLE ; } else if ( ! strcmp( pt_2, "complex" ) ) { v_type = IGB_COMPLEX ; } else if ( ! strcmp( pt_2, "double_complex" ) ) { v_type = IGB_D_COMPLEX ; } else if ( ! strcmp( pt_2, "rgba" ) ) { v_type = IGB_RGBA ; } else if ( ! strcmp( pt_2, "structure" ) ) { v_type = IGB_STRUCTURE ; } else if ( ! strcmp( pt_2, "int" ) ) { v_type = IGB_INT; } else if ( ! strcmp( pt_2, "uint" ) ) { v_type = IGB_UINT; } bool_type = VRAI; } else if ( ! strcmp( pt_1, "taille" ) ) { v_taille = atoi( pt_2 ) ; bool_taille = VRAI; } else if ( ! strcmp( pt_1, "systeme" ) ) { v_systeme = INCONNU; for (i=0;i