/*----------------------------------------------------------------------*/ /* Copyright (c) 1988-1989 */ /* by CompuServe Inc., Tucson, AZ. All Rights Reserved */ /* CNVHUF.H can be copied and distributed freely for any */ /* non-commercial purposes. CNVHUF.H can only be incorporated */ /* into commercial software with the permission of CompuServe Inc. */ /*----------------------------------------------------------------------*/ /* Header file CNVHUF.H */ /* Global type definitions for Group 3 FAX work and TIF files */ #define WHITE (0) #define BLACK (1) #define LONGEST_LINE (2432) /* Longest line we expect */ #define LONGEST_RLE (1266) /* Most run lengths for longest_line */ #define FAX_line_width (1728) /* Longest line expected from FAX */ #define FAX_page_length (4000) #define FAX_min_line (24) /* Minimum bits per line (20m sec rule) */ typedef int colors; /* The two modes are these */ /* Structures in a TIF file as used by GAMMAfax */ typedef struct ifd_tag_record /* Format of tag field(s) */ { int IFD_tag, /* TIF tag describing rest of element */ IFD_type; /* Type of data referred to by IFD_tag */ long int IFD_length; /* Length of data referred to */ union { short int short_pair[2]; /* 4 bytes are used for either 2 shorts */ long int long_one; /* Or one long value */ long int offset; /* Or pointer to later in the file */ } params; } IFD_tag_body; typedef struct ifd_header_record /* Format of Image File Directory */ { short int IFD_ele_cnt; IFD_tag_body IFD_tag_element[20]; /* IFD_ele_cnt number of these */ char IFD_ptr_params[100]; /* Room for params after directory */ } IFD_header; typedef struct tif_file_header_record /* Format of TIF header */ { char TIF_sign[4]; /* Signature */ long int IFD_offset; /* Offset to first IFD */ } TIF_header; /* Standard TAG_tag's (TT's) and contents: */ /* The following their data in line: */ #define TT_width (256) /* Image width follows */ #define TT_width_type (3) /* uses short integers */ #define TT_width_cnt (1L) /* uses only one parameter */ #define TT_length (257) /* Image length */ #define TT_length_type (3) /* uses short integers */ #define TT_length_cnt (1L) /* uses only one parameter */ #define TT_PixBits (258) /* Bits per pixel */ #define TT_PixBits_type (3) /* uses short integers */ #define TT_PixBits_cnt (1L) /* uses only one parameter */ #define TT_PixBits_par (1) /* Standard value for B/W */ #define TT_Cmprs (259) /* Compression method */ #define TT_Cmprs_type (3) /* uses short integers */ #define TT_Cmprs_cnt (1L) /* uses only one parameter */ #define TT_Cmprs_par (3) /* Standard value for Group3 */ #define TT_Revrs (262) /* Color reversal */ #define TT_Revrs_type (3) /* uses short integers */ #define TT_Revrs_cnt (1L) /* uses only one parameter */ #define TT_Revrs_par (0) /* Standard value for black on white */ #define TT_MSBend (266) /* True if MSB is last */ #define TT_MSBend_type (3) /* uses short integers */ #define TT_MSBend_cnt (1L) /* uses only one parameter */ #define TT_MSBend_par (1) /* Standard value for FAX */ #define TT_Orient (274) /* True if top left is (0,0) */ #define TT_Orient_type (3) /* uses short integers */ #define TT_Orient_cnt (1L) /* uses only one parameter */ #define TT_Orient_par (1) /* Standard value for FAX */ #define TT_Samps (277) /* Number of samples per pixel */ #define TT_Samps_type (3) /* uses short integers */ #define TT_Samps_cnt (1L) /* uses only one parameter */ #define TT_Samps_par (1) /* Standard value for FAX */ #define TT_Grp3Opt (292) /* Encoding scheme within group III */ #define TT_Grp3Opt_type (4) /* Uses long integers */ #define TT_Grp3Opt_cnt (1L) /* uses only one parameter */ #define TT_Grp3Opt_par (0) /* Standard value for Huffman */ #define TT_Resol (296) /* Resolution unit (none, inch, cm ) */ #define TT_Resol_type (3) /* uses short integers */ #define TT_Resol_cnt (1L) /* uses only one parameter */ #define TT_Resol_par (2) /* Standard value for FAX density */ #define TT_PagNum (297) /* This page, Total pages */ #define TT_PagNum_type (3) /* uses short integers */ #define TT_PagNum_cnt (2L) /* uses two parameters */ #define TT_PagNum_par1 (1) /* Standard values for first page */ #define TT_PagNum_par2 (1) /* of only one page */ /* The following use pointers to their data: */ /* The pointers are integer byte numbers that the data starts on in the file */ #define TT_Title (270) /* Title generated by FAX */ #define TT_Title_type (2) /* Uses text */ #define TT_Image (273) /* Image generated by FAX */ #define TT_Image_type (3) /* Integers */ #define TT_X_dense (282) /* X_dense generated by FAX */ #define TT_X_dense_cnt (1L) /* Only one parameter */ #define TT_X_dense_type (5) /* Rational fraction */ #define TT_X_dense_par1 (204) /* 204 dots per */ #define TT_X_dense_par2 (1) /* 1 inch */ #define TT_Y_dense (283) /* Y_dense generated by FAX */ #define TT_Y_dense_cnt (1L) /* Only one parameter */ #define TT_Y_dense_type (5) /* Rational fraction */ #define TT_Y_dense_par1 (196) /* 196 dots per */ #define TT_Y_dense_par2 (1) /* 1 inch */ /* Other fields: */ #define TIF_sign_par "II*\000" /* Text at beginning of TIF file */ #define TIF_msc_1 ((8,0)) /* Additional data there */ typedef int INTER_ARR1[LONGEST_RLE]; /* Highest number of runs in a line */ typedef struct rle_line_record { int line_length, /* Total pixels on line */ rle_count, /* Total run-lengths here */ rle_pointer; /* Current entry in rle_list */ colors rle_color; /* Color of current run */ int rle_start_column, /* Starting column of rle_pointer */ current_column; /* Current pixel position */ INTER_ARR1 rle_list; } rle_line; typedef int node_label; /* Used for last 4 bits of code */ typedef struct huffman_node_record { /* There is one record per 8 bit possibility */ unsigned char bits_consumed; /* Significant bits in this entry */ int run_length; /* (if over 8 insert 0 here */ } huffman_node; typedef huffman_node table_1st_bits[256][2], table_end_bits[16]; typedef struct huffman_code_record { /* There is one record for each array entry */ unsigned char code_bits; /* Length of following code */ short int code_value; /* The code itself */ } huffman_code; typedef char file_name_string[(20)+1]; /* Declare globals */ extern int scan_lines;