#pragma once #define White 0 #define Black 1 #define Black_byte 255 // byte of all black bits: 11111111b /* WARNING */ /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ /* !!!!!!!!!!!!!!!!!! Change Here. Redeclaration of Type. !!!!!!!!!!!!!!!! */ #define SHORT int /* this type was just a regular old C "short". */ /* In images with > 2^15 rows the 2 byte definition */ /* gave garbage output because short overflowed. */ /* Increasing all variables from 2 to 4 bytes seems */ /* to fix it. I have used the macro SHORT here to show */ /* where this change applies, so that it can be undone */ /* if desired. Some variables of type "int" existed in */ /* the code before this change, and the SHORT macro */ /* allows reversal of just the correct ones. */ /* Patrick Grother Dec 9 1994 */ /* !!!!!!!!!!!!!!!!!! Change Here. Redeclaration of Type. !!!!!!!!!!!!!!!! */ /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ #define Largest_code 2560 #define Size_of_make_up_code_increments 64 #define Max_terminating_length 63 /* longest terminating code*/ #define Number_of_different_bytes 256 #define Pixels_per_byte 8 #define Bits_per_byte 8 #define Last_bit_in_a_byte 7 /* assumes bits numbered from 0 - 7 */ #define Last_bit_mask 1 /* masks the last (low magnitude) bit */ #define Default_width_in_pixels 2560 /* default width of a scan line */ #define Default_number_of_lines 3300 /* default length of an image */ #define Invalid -1 #define Extra_positions 25 /* ensures extra room in allocations */ #define Not_done_yet 0 #define VL3 -3 /* Vertical Left 3 mode */ #define VL2 -2 /* Vertical Left 2 mode */ #define VL1 -1 /* Vertical Left 1 mode */ #define V0 0 /* Vertical mode */ #define VR1 1 /* Vertical Right 1 mode */ #define VR2 2 /* Vertical Right 2 mode */ #define VR3 3 /* Vertical Right 3 mode */ #define P 4 /* Pass mode */ #define H 5 /* Horizontal mode */ #define EOFB 6 /* End Of File Buffer */ #define No_offset 0 /* no offset during fseek() */ #define End_of_file 2 /* start at EOF during fseek() */ #define Start_of_file 0 /* start at SOF during fseek() */ /* unsigned char *calloc(); SHORT *malloc(); */ struct parameters { SHORT previous_color; /* color of last run of pixels */ SHORT index; /* indicates current position in "coding_line" */ SHORT max_pixel; /* the number of pixels in a scan line */ SHORT pixel; /* pixel number of the last changing element */ SHORT *reference_line; /* array of changing elements on reference line */ SHORT *coding_line; /* array of changing elements on coding line */ }; struct compressed_descriptor { unsigned char *data; /* pointer to compressed image */ SHORT pixels_per_line; /* the number of pixels in a scan line */ SHORT number_of_lines; /* the number of scan lines in the image */ int length_in_bytes; /* length of the compressed image in bytes */ }; struct uncompressed_descriptor { unsigned char *data; /* pointer to uncompressed image */ SHORT pixels_per_line; /* the number of pixels in a scan line */ SHORT number_of_lines; /* the number of scan lines in the image */ }; static const char write_one[Pixels_per_byte] = { (char)0x80, (char)0x40, (char)0x20, (char)0x10, (char)0x8, (char)0x4, (char)0x2, (char)0x1, }; static const char write_zero[Pixels_per_byte] = { (char)0x7F, (char)0xBF, (char)0xDF, (char)0xEF, (char)0xF7, (char)0xFB, (char)0xFD, (char)0xFE, }; static const char *white_terminating_code[64] = { "00110101", "000111", "0111", "1000", "1011", "1100", "1110", "1111", "10011", "10100", "00111", "01000", "001000", "000011", "110100", "110101", "101010", "101011", "0100111", "0001100", "0001000", "0010111", "0000011", "0000100", "0101000", "0101011", "0010011", "0100100", "0011000", "00000010", "00000011", "00011010", "00011011", "00010010", "00010011", "00010100", "00010101", "00010110", "00010111", "00101000", "00101001", "00101010", "00101011", "00101100", "00101101", "00000100", "00000101", "00001010", "00001011", "01010010", "01010011", "01010100", "01010101", "00100100", "00100101", "01011000", "01011001", "01011010", "01011011", "01001010", "01001011", "00110010", "00110011", "00110100", };/* end array of white terminating code */ static const char *black_terminating_code[64] = { "0000110111", "010", "11", "10", "011", "0011", "0010", "00011", "000101", "000100", "0000100", "0000101", "0000111", "00000100", "00000111", "000011000", "0000010111", "0000011000", "0000001000", "00001100111", "00001101000", "00001101100", "00000110111", "00000101000", "00000010111", "00000011000", "000011001010", "000011001011", "000011001100", "000011001101", "000001101000", "000001101001", "000001101010", "000001101011", "000011010010", "000011010011", "000011010100", "000011010101", "000011010110", "000011010111", "000001101100", "000001101101", "000011011010", "000011011011", "000001010100", "000001010101", "000001010110", "000001010111", "000001100100", "000001100101", "000001010010", "000001010011", "000000100100", "000000110111", "000000111000", "000000100111", "000000101000", "000001011000", "000001011001", "000000101011", "000000101100", "000001011010", "000001100110", "000001100111", }; /* end black_terminating_array */ static const char *white_make_up_code[40] = { "11011", "10010", "010111", "0110111", "00110110", "00110111", "01100100", "01100101", "01101000", "01100111", "011001100", "011001101", "011010010", "011010011", "011010100", "011010101", "011010110", "011010111", "011011000", "011011001", "011011010", "011011011", "010011000", "010011001", "010011010", "011000", "010011011", /* * from this line on, the codes are colorless and represnt runs from * 1792 pixels to 2560 pixels. In other words, the longest run length * codes have been added onto both the white make up codes and the black * make up codes. This has been done to make the procedure * "write_run_length()" easier to write and to understand. No other * procedure in the compression algorithm is affected by this merging of * different types of run length codes, and the compatibility of the * program is in no way effected. */ "00000001000", "00000001100", "00000001101", "000000010010", "000000010011", "000000010100", "000000010101", "000000010110", "000000010111", "000000011100", "000000011101", "000000011110", "000000011111", }; /* end case of white makeup code */ static const char *black_make_up_code[40] = { "0000001111", "000011001000", "000011001001", "000001011011", "000000110011", "000000110100", "000000110101", "0000001101100", "0000001101101", "0000001001010", "0000001001011", "0000001001100", "0000001001101", "0000001110010", "0000001110011", "0000001110100", "0000001110101", "0000001110110", "0000001110111", "0000001010010", "0000001010011", "0000001010100", "0000001010101", "0000001011010", "0000001011011", "0000001100100", "0000001100101", /* * from this line on, the codes are colorless and represnt runs from * 1792 pixels to 2560 pixels. In other words, the longest run length * codes have been added onto both the white make up codes and the black * make up codes. This has been done to make the procedure * "write_run_length()" easier to write and to understand. No other * procedure in the compression algorithm is affected by this merging of * different types of run length codes, and the compatibility of the * program is in no way compromised. */ "00000001000", "00000001100", "00000001101", "000000010010", "000000010011", "000000010100", "000000010101", "000000010110", "000000010111", "000000011100", "000000011101", "000000011110", "000000011111", }; /* end black makeup code */ struct byte_descriptor { SHORT pixel[9]; }; static const struct byte_descriptor table[Number_of_different_bytes] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, 5, 6, -1, -1, -1, -1, -1, -1, -1, 5, 6, 7, -1, -1, -1, -1, -1, -1, 5, 7, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, 4, 5, -1, -1, -1, -1, -1, -1, -1, 4, 5, 7, -1, -1, -1, -1, -1, -1, 4, 5, 6, 7, -1, -1, -1, -1, -1, 4, 5, 6, -1, -1, -1, -1, -1, -1, 4, 6, -1, -1, -1, -1, -1, -1, -1, 4, 6, 7, -1, -1, -1, -1, -1, -1, 4, 7, -1, -1, -1, -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, 3, 4, -1, -1, -1, -1, -1, -1, -1, 3, 4, 7, -1, -1, -1, -1, -1, -1, 3, 4, 6, 7, -1, -1, -1, -1, -1, 3, 4, 6, -1, -1, -1, -1, -1, -1, 3, 4, 5, 6, -1, -1, -1, -1, -1, 3, 4, 5, 6, 7, -1, -1, -1, -1, 3, 4, 5, 7, -1, -1, -1, -1, -1, 3, 4, 5, -1, -1, -1, -1, -1, -1, 3, 5, -1, -1, -1, -1, -1, -1, -1, 3, 5, 7, -1, -1, -1, -1, -1, -1, 3, 5, 6, 7, -1, -1, -1, -1, -1, 3, 5, 6, -1, -1, -1, -1, -1, -1, 3, 6, -1, -1, -1, -1, -1, -1, -1, 3, 6, 7, -1, -1, -1, -1, -1, -1, 3, 7, -1, -1, -1, -1, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, 2, 3, -1, -1, -1, -1, -1, -1, -1, 2, 3, 7, -1, -1, -1, -1, -1, -1, 2, 3, 6, 7, -1, -1, -1, -1, -1, 2, 3, 6, -1, -1, -1, -1, -1, -1, 2, 3, 5, 6, -1, -1, -1, -1, -1, 2, 3, 5, 6, 7, -1, -1, -1, -1, 2, 3, 5, 7, -1, -1, -1, -1, -1, 2, 3, 5, -1, -1, -1, -1, -1, -1, 2, 3, 4, 5, -1, -1, -1, -1, -1, 2, 3, 4, 5, 7, -1, -1, -1, -1, 2, 3, 4, 5, 6, 7, -1, -1, -1, 2, 3, 4, 5, 6, -1, -1, -1, -1, 2, 3, 4, 6, -1, -1, -1, -1, -1, 2, 3, 4, 6, 7, -1, -1, -1, -1, 2, 3, 4, 7, -1, -1, -1, -1, -1, 2, 3, 4, -1, -1, -1, -1, -1, -1, 2, 4, -1, -1, -1, -1, -1, -1, -1, 2, 4, 7, -1, -1, -1, -1, -1, -1, 2, 4, 6, 7, -1, -1, -1, -1, -1, 2, 4, 6, -1, -1, -1, -1, -1, -1, 2, 4, 5, 6, -1, -1, -1, -1, -1, 2, 4, 5, 6, 7, -1, -1, -1, -1, 2, 4, 5, 7, -1, -1, -1, -1, -1, 2, 4, 5, -1, -1, -1, -1, -1, -1, 2, 5, -1, -1, -1, -1, -1, -1, -1, 2, 5, 7, -1, -1, -1, -1, -1, -1, 2, 5, 6, 7, -1, -1, -1, -1, -1, 2, 5, 6, -1, -1, -1, -1, -1, -1, 2, 6, -1, -1, -1, -1, -1, -1, -1, 2, 6, 7, -1, -1, -1, -1, -1, -1, 2, 7, -1, -1, -1, -1, -1, -1, -1, 2, -1, -1, -1, -1, -1, -1, -1, -1, 1, 2, -1, -1, -1, -1, -1, -1, -1, 1, 2, 7, -1, -1, -1, -1, -1, -1, 1, 2, 6, 7, -1, -1, -1, -1, -1, 1, 2, 6, -1, -1, -1, -1, -1, -1, 1, 2, 5, 6, -1, -1, -1, -1, -1, 1, 2, 5, 6, 7, -1, -1, -1, -1, 1, 2, 5, 7, -1, -1, -1, -1, -1, 1, 2, 5, -1, -1, -1, -1, -1, -1, 1, 2, 4, 5, -1, -1, -1, -1, -1, 1, 2, 4, 5, 7, -1, -1, -1, -1, 1, 2, 4, 5, 6, 7, -1, -1, -1, 1, 2, 4, 5, 6, -1, -1, -1, -1, 1, 2, 4, 6, -1, -1, -1, -1, -1, 1, 2, 4, 6, 7, -1, -1, -1, -1, 1, 2, 4, 7, -1, -1, -1, -1, -1, 1, 2, 4, -1, -1, -1, -1, -1, -1, 1, 2, 3, 4, -1, -1, -1, -1, -1, 1, 2, 3, 4, 7, -1, -1, -1, -1, 1, 2, 3, 4, 6, 7, -1, -1, -1, 1, 2, 3, 4, 6, -1, -1, -1, -1, 1, 2, 3, 4, 5, 6, -1, -1, -1, 1, 2, 3, 4, 5, 6, 7, -1, -1, 1, 2, 3, 4, 5, 7, -1, -1, -1, 1, 2, 3, 4, 5, -1, -1, -1, -1, 1, 2, 3, 5, -1, -1, -1, -1, -1, 1, 2, 3, 5, 7, -1, -1, -1, -1, 1, 2, 3, 5, 6, 7, -1, -1, -1, 1, 2, 3, 5, 6, -1, -1, -1, -1, 1, 2, 3, 6, -1, -1, -1, -1, -1, 1, 2, 3, 6, 7, -1, -1, -1, -1, 1, 2, 3, 7, -1, -1, -1, -1, -1, 1, 2, 3, -1, -1, -1, -1, -1, -1, 1, 3, -1, -1, -1, -1, -1, -1, -1, 1, 3, 7, -1, -1, -1, -1, -1, -1, 1, 3, 6, 7, -1, -1, -1, -1, -1, 1, 3, 6, -1, -1, -1, -1, -1, -1, 1, 3, 5, 6, -1, -1, -1, -1, -1, 1, 3, 5, 6, 7, -1, -1, -1, -1, 1, 3, 5, 7, -1, -1, -1, -1, -1, 1, 3, 5, -1, -1, -1, -1, -1, -1, 1, 3, 4, 5, -1, -1, -1, -1, -1, 1, 3, 4, 5, 7, -1, -1, -1, -1, 1, 3, 4, 5, 6, 7, -1, -1, -1, 1, 3, 4, 5, 6, -1, -1, -1, -1, 1, 3, 4, 6, -1, -1, -1, -1, -1, 1, 3, 4, 6, 7, -1, -1, -1, -1, 1, 3, 4, 7, -1, -1, -1, -1, -1, 1, 3, 4, -1, -1, -1, -1, -1, -1, 1, 4, -1, -1, -1, -1, -1, -1, -1, 1, 4, 7, -1, -1, -1, -1, -1, -1, 1, 4, 6, 7, -1, -1, -1, -1, -1, 1, 4, 6, -1, -1, -1, -1, -1, -1, 1, 4, 5, 6, -1, -1, -1, -1, -1, 1, 4, 5, 6, 7, -1, -1, -1, -1, 1, 4, 5, 7, -1, -1, -1, -1, -1, 1, 4, 5, -1, -1, -1, -1, -1, -1, 1, 5, -1, -1, -1, -1, -1, -1, -1, 1, 5, 7, -1, -1, -1, -1, -1, -1, 1, 5, 6, 7, -1, -1, -1, -1, -1, 1, 5, 6, -1, -1, -1, -1, -1, -1, 1, 6, -1, -1, -1, -1, -1, -1, -1, 1, 6, 7, -1, -1, -1, -1, -1, -1, 1, 7, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 7, -1, -1, -1, -1, -1, -1, 0, 1, 6, 7, -1, -1, -1, -1, -1, 0, 1, 6, -1, -1, -1, -1, -1, -1, 0, 1, 5, 6, -1, -1, -1, -1, -1, 0, 1, 5, 6, 7, -1, -1, -1, -1, 0, 1, 5, 7, -1, -1, -1, -1, -1, 0, 1, 5, -1, -1, -1, -1, -1, -1, 0, 1, 4, 5, -1, -1, -1, -1, -1, 0, 1, 4, 5, 7, -1, -1, -1, -1, 0, 1, 4, 5, 6, 7, -1, -1, -1, 0, 1, 4, 5, 6, -1, -1, -1, -1, 0, 1, 4, 6, -1, -1, -1, -1, -1, 0, 1, 4, 6, 7, -1, -1, -1, -1, 0, 1, 4, 7, -1, -1, -1, -1, -1, 0, 1, 4, -1, -1, -1, -1, -1, -1, 0, 1, 3, 4, -1, -1, -1, -1, -1, 0, 1, 3, 4, 7, -1, -1, -1, -1, 0, 1, 3, 4, 6, 7, -1, -1, -1, 0, 1, 3, 4, 6, -1, -1, -1, -1, 0, 1, 3, 4, 5, 6, -1, -1, -1, 0, 1, 3, 4, 5, 6, 7, -1, -1, 0, 1, 3, 4, 5, 7, -1, -1, -1, 0, 1, 3, 4, 5, -1, -1, -1, -1, 0, 1, 3, 5, -1, -1, -1, -1, -1, 0, 1, 3, 5, 7, -1, -1, -1, -1, 0, 1, 3, 5, 6, 7, -1, -1, -1, 0, 1, 3, 5, 6, -1, -1, -1, -1, 0, 1, 3, 6, -1, -1, -1, -1, -1, 0, 1, 3, 6, 7, -1, -1, -1, -1, 0, 1, 3, 7, -1, -1, -1, -1, -1, 0, 1, 3, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, -1, -1, -1, -1, -1, 0, 1, 2, 3, 7, -1, -1, -1, -1, 0, 1, 2, 3, 6, 7, -1, -1, -1, 0, 1, 2, 3, 6, -1, -1, -1, -1, 0, 1, 2, 3, 5, 6, -1, -1, -1, 0, 1, 2, 3, 5, 6, 7, -1, -1, 0, 1, 2, 3, 5, 7, -1, -1, -1, 0, 1, 2, 3, 5, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, -1, -1, -1, 0, 1, 2, 3, 4, 5, 7, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, -1, 0, 1, 2, 3, 4, 5, 6, -1, -1, 0, 1, 2, 3, 4, 6, -1, -1, -1, 0, 1, 2, 3, 4, 6, 7, -1, -1, 0, 1, 2, 3, 4, 7, -1, -1, -1, 0, 1, 2, 3, 4, -1, -1, -1, -1, 0, 1, 2, 4, -1, -1, -1, -1, -1, 0, 1, 2, 4, 7, -1, -1, -1, -1, 0, 1, 2, 4, 6, 7, -1, -1, -1, 0, 1, 2, 4, 6, -1, -1, -1, -1, 0, 1, 2, 4, 5, 6, -1, -1, -1, 0, 1, 2, 4, 5, 6, 7, -1, -1, 0, 1, 2, 4, 5, 7, -1, -1, -1, 0, 1, 2, 4, 5, -1, -1, -1, -1, 0, 1, 2, 5, -1, -1, -1, -1, -1, 0, 1, 2, 5, 7, -1, -1, -1, -1, 0, 1, 2, 5, 6, 7, -1, -1, -1, 0, 1, 2, 5, 6, -1, -1, -1, -1, 0, 1, 2, 6, -1, -1, -1, -1, -1, 0, 1, 2, 6, 7, -1, -1, -1, -1, 0, 1, 2, 7, -1, -1, -1, -1, -1, 0, 1, 2, -1, -1, -1, -1, -1, -1, 0, 2, -1, -1, -1, -1, -1, -1, -1, 0, 2, 7, -1, -1, -1, -1, -1, -1, 0, 2, 6, 7, -1, -1, -1, -1, -1, 0, 2, 6, -1, -1, -1, -1, -1, -1, 0, 2, 5, 6, -1, -1, -1, -1, -1, 0, 2, 5, 6, 7, -1, -1, -1, -1, 0, 2, 5, 7, -1, -1, -1, -1, -1, 0, 2, 5, -1, -1, -1, -1, -1, -1, 0, 2, 4, 5, -1, -1, -1, -1, -1, 0, 2, 4, 5, 7, -1, -1, -1, -1, 0, 2, 4, 5, 6, 7, -1, -1, -1, 0, 2, 4, 5, 6, -1, -1, -1, -1, 0, 2, 4, 6, -1, -1, -1, -1, -1, 0, 2, 4, 6, 7, -1, -1, -1, -1, 0, 2, 4, 7, -1, -1, -1, -1, -1, 0, 2, 4, -1, -1, -1, -1, -1, -1, 0, 2, 3, 4, -1, -1, -1, -1, -1, 0, 2, 3, 4, 7, -1, -1, -1, -1, 0, 2, 3, 4, 6, 7, -1, -1, -1, 0, 2, 3, 4, 6, -1, -1, -1, -1, 0, 2, 3, 4, 5, 6, -1, -1, -1, 0, 2, 3, 4, 5, 6, 7, -1, -1, 0, 2, 3, 4, 5, 7, -1, -1, -1, 0, 2, 3, 4, 5, -1, -1, -1, -1, 0, 2, 3, 5, -1, -1, -1, -1, -1, 0, 2, 3, 5, 7, -1, -1, -1, -1, 0, 2, 3, 5, 6, 7, -1, -1, -1, 0, 2, 3, 5, 6, -1, -1, -1, -1, 0, 2, 3, 6, -1, -1, -1, -1, -1, 0, 2, 3, 6, 7, -1, -1, -1, -1, 0, 2, 3, 7, -1, -1, -1, -1, -1, 0, 2, 3, -1, -1, -1, -1, -1, -1, 0, 3, -1, -1, -1, -1, -1, -1, -1, 0, 3, 7, -1, -1, -1, -1, -1, -1, 0, 3, 6, 7, -1, -1, -1, -1, -1, 0, 3, 6, -1, -1, -1, -1, -1, -1, 0, 3, 5, 6, -1, -1, -1, -1, -1, 0, 3, 5, 6, 7, -1, -1, -1, -1, 0, 3, 5, 7, -1, -1, -1, -1, -1, 0, 3, 5, -1, -1, -1, -1, -1, -1, 0, 3, 4, 5, -1, -1, -1, -1, -1, 0, 3, 4, 5, 7, -1, -1, -1, -1, 0, 3, 4, 5, 6, 7, -1, -1, -1, 0, 3, 4, 5, 6, -1, -1, -1, -1, 0, 3, 4, 6, -1, -1, -1, -1, -1, 0, 3, 4, 6, 7, -1, -1, -1, -1, 0, 3, 4, 7, -1, -1, -1, -1, -1, 0, 3, 4, -1, -1, -1, -1, -1, -1, 0, 4, -1, -1, -1, -1, -1, -1, -1, 0, 4, 7, -1, -1, -1, -1, -1, -1, 0, 4, 6, 7, -1, -1, -1, -1, -1, 0, 4, 6, -1, -1, -1, -1, -1, -1, 0, 4, 5, 6, -1, -1, -1, -1, -1, 0, 4, 5, 6, 7, -1, -1, -1, -1, 0, 4, 5, 7, -1, -1, -1, -1, -1, 0, 4, 5, -1, -1, -1, -1, -1, -1, 0, 5, -1, -1, -1, -1, -1, -1, -1, 0, 5, 7, -1, -1, -1, -1, -1, -1, 0, 5, 6, 7, -1, -1, -1, -1, -1, 0, 5, 6, -1, -1, -1, -1, -1, -1, 0, 6, -1, -1, -1, -1, -1, -1, -1, 0, 6, 7, -1, -1, -1, -1, -1, -1, 0, 7, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, }; /* end of data for list of byte descriptors */ // Constants #define NOALLOC 0 #define ALLOC 1 class TiffG4Compression { public: TiffG4Compression(); ~TiffG4Compression(); public: int G4Compress(unsigned char *indata, int inbytes, int width, int height, unsigned char *outdata, int *outbytes); private: void control_compression(struct uncompressed_descriptor *uncompressed, struct compressed_descriptor *compressed); void read_uncompressed_file_into_memory(struct uncompressed_descriptor *uncompressed); void prepare_to_compress(struct uncompressed_descriptor* uncompressed,struct compressed_descriptor* compressed,struct parameters* params); void compress_image(struct uncompressed_descriptor* uncompressed, struct compressed_descriptor* compressed, struct parameters* params); void make_array_of_changing_elements(struct parameters *params, struct uncompressed_descriptor* uncompressed, SHORT line_number); void set_up_first_and_last_changing_elements_c(struct parameters *params); void prepare_to_compress_next_line(struct parameters *params); void set_up_first_line_c(struct parameters *params); void compress_line(struct parameters *params); void initialize_b1(struct parameters *params); void pass_mode_c(struct parameters *params); void vertical_mode_c(struct parameters *params); void horizontal_mode_c(struct parameters *params); void prepare_to_write_bits_c(struct compressed_descriptor *compressed); void write_bits_c(char *string_ptr); unsigned int flush_buffer(); void write_run_length(SHORT length, SHORT color); void process_char(unsigned char data_byte, struct parameters *params); private: const char* largest_colorless_code = { "000000011111" }; int comp_alloc_flag = ALLOC; int comp_write_init_flag; char *output_area=nullptr; int bit_place_mark; int byte_place_mark; SHORT A_0, A0_color, A_1, a2, b1, b2; };