Sat, 22 Feb 2003 10:02:06 +0000
Generate G4 tables from strings of ones and zeros.
eric@71 | 1 | /* |
eric@71 | 2 | * t2p: Create a PDF file from the contents of one or more TIFF |
eric@71 | 3 | * bilevel image files. The images in the resulting PDF file |
eric@71 | 4 | * will be compressed using ITU-T T.6 (G4) fax encoding. |
eric@71 | 5 | * |
eric@71 | 6 | * G4 table generator |
eric@71 | 7 | * $Id: g4_table_gen.c,v 1.1 2003/02/22 02:02:06 eric Exp $ |
eric@71 | 8 | * Copyright 2001, 2002, 2003 Eric Smith <eric@brouhaha.com> |
eric@71 | 9 | * |
eric@71 | 10 | * This program is free software; you can redistribute it and/or modify |
eric@71 | 11 | * it under the terms of the GNU General Public License version 2 as |
eric@71 | 12 | * published by the Free Software Foundation. Note that permission is |
eric@71 | 13 | * not granted to redistribute this program under the terms of any |
eric@71 | 14 | * other version of the General Public License. |
eric@71 | 15 | * |
eric@71 | 16 | * This program is distributed in the hope that it will be useful, |
eric@71 | 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
eric@71 | 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
eric@71 | 19 | * GNU General Public License for more details. |
eric@71 | 20 | * |
eric@71 | 21 | * You should have received a copy of the GNU General Public License |
eric@71 | 22 | * along with this program; if not, write to the Free Software |
eric@71 | 23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA |
eric@71 | 24 | */ |
eric@71 | 25 | |
eric@71 | 26 | |
eric@71 | 27 | #include <stdbool.h> |
eric@71 | 28 | #include <stdint.h> |
eric@71 | 29 | #include <stdio.h> |
eric@71 | 30 | #include <stdlib.h> |
eric@71 | 31 | #include <string.h> |
eric@71 | 32 | |
eric@71 | 33 | |
eric@71 | 34 | void emit_code (int indent, char *code, int last, bool comment, int cval) |
eric@71 | 35 | { |
eric@71 | 36 | int i; |
eric@71 | 37 | int count = 0; |
eric@71 | 38 | uint32_t val = 0; |
eric@71 | 39 | |
eric@71 | 40 | printf ("%*s{ ", indent, ""); |
eric@71 | 41 | |
eric@71 | 42 | printf ("%d, ", strlen (code)); |
eric@71 | 43 | |
eric@71 | 44 | for (i = 0; i < strlen (code); i++) |
eric@71 | 45 | switch (code [i]) |
eric@71 | 46 | { |
eric@71 | 47 | case '0': val = (val << 1); count++; break; |
eric@71 | 48 | case '1': val = (val << 1) + 1; count++; break; |
eric@71 | 49 | case ' ': break; |
eric@71 | 50 | default: |
eric@71 | 51 | fprintf (stderr, "internal error\n"); |
eric@71 | 52 | exit (2); |
eric@71 | 53 | } |
eric@71 | 54 | |
eric@71 | 55 | printf ("0x%0*x", (count + 3)/4, val); |
eric@71 | 56 | |
eric@71 | 57 | printf (" }"); |
eric@71 | 58 | if (! last) |
eric@71 | 59 | printf (","); |
eric@71 | 60 | if (comment) |
eric@71 | 61 | printf (" /* %d */", cval); |
eric@71 | 62 | printf ("\n"); |
eric@71 | 63 | } |
eric@71 | 64 | |
eric@71 | 65 | |
eric@71 | 66 | char *long_makeup_code [12] = |
eric@71 | 67 | { |
eric@71 | 68 | /* 1792 */ "00000001000", |
eric@71 | 69 | /* 1856 */ "00000001100", |
eric@71 | 70 | /* 1920 */ "00000001101", |
eric@71 | 71 | /* 1984 */ "000000010010", |
eric@71 | 72 | /* 2048 */ "000000010011", |
eric@71 | 73 | /* 2112 */ "000000010100", |
eric@71 | 74 | /* 2176 */ "000000010101", |
eric@71 | 75 | /* 2240 */ "000000010110", |
eric@71 | 76 | /* 2304 */ "000000010111", |
eric@71 | 77 | /* 2368 */ "000000011100", |
eric@71 | 78 | /* 2432 */ "000000011101", |
eric@71 | 79 | /* 2496 */ "000000011110" |
eric@71 | 80 | /* 2560 "000000011111" hard-coded, doesn't need to be in table */ |
eric@71 | 81 | }; |
eric@71 | 82 | |
eric@71 | 83 | |
eric@71 | 84 | void print_long_makeup_code (void) |
eric@71 | 85 | { |
eric@71 | 86 | int i; |
eric@71 | 87 | |
eric@71 | 88 | printf ("static g4_bits g4_long_makeup_code [12] =\n"); |
eric@71 | 89 | printf (" {\n"); |
eric@71 | 90 | for (i = 0; i < 12; i++) |
eric@71 | 91 | emit_code (4, long_makeup_code [i], i == 11, 1, i * 64 + 1792); |
eric@71 | 92 | printf (" };\n"); |
eric@71 | 93 | } |
eric@71 | 94 | |
eric@71 | 95 | |
eric@71 | 96 | char *makeup_code [64][2] = |
eric@71 | 97 | { |
eric@71 | 98 | { /* 64 */ "11011", "0000001111" }, |
eric@71 | 99 | { /* 128 */ "10010", "000011001000" }, |
eric@71 | 100 | { /* 192 */ "010111", "000011001001" }, |
eric@71 | 101 | { /* 256 */ "0110111", "000001011011" }, |
eric@71 | 102 | { /* 320 */ "00110110", "000000110011" }, |
eric@71 | 103 | { /* 384 */ "00110111", "000000110100" }, |
eric@71 | 104 | { /* 448 */ "01100100", "000000110101" }, |
eric@71 | 105 | { /* 512 */ "01100101", "0000001101100" }, |
eric@71 | 106 | { /* 576 */ "01101000", "0000001101101" }, |
eric@71 | 107 | { /* 640 */ "01100111", "0000001001010" }, |
eric@71 | 108 | { /* 704 */ "011001100", "0000001001011" }, |
eric@71 | 109 | { /* 768 */ "011001101", "0000001001100" }, |
eric@71 | 110 | { /* 832 */ "011010010", "0000001001101" }, |
eric@71 | 111 | { /* 896 */ "011010011", "0000001110010" }, |
eric@71 | 112 | { /* 960 */ "011010100", "0000001110011" }, |
eric@71 | 113 | { /* 1024 */ "011010101", "0000001110100" }, |
eric@71 | 114 | { /* 1088 */ "011010110", "0000001110101" }, |
eric@71 | 115 | { /* 1152 */ "011010111", "0000001110110" }, |
eric@71 | 116 | { /* 1216 */ "011011000", "0000001110111" }, |
eric@71 | 117 | { /* 1280 */ "011011001", "0000001010010" }, |
eric@71 | 118 | { /* 1344 */ "011011010", "0000001010011" }, |
eric@71 | 119 | { /* 1408 */ "011011011", "0000001010100" }, |
eric@71 | 120 | { /* 1472 */ "010011000", "0000001010101" }, |
eric@71 | 121 | { /* 1536 */ "010011001", "0000001011010" }, |
eric@71 | 122 | { /* 1600 */ "010011010", "0000001011011" }, |
eric@71 | 123 | { /* 1664 */ "011000", "0000001100100" }, |
eric@71 | 124 | { /* 1728 */ "010011011", "0000001100101" } |
eric@71 | 125 | }; |
eric@71 | 126 | |
eric@71 | 127 | |
eric@71 | 128 | void print_makeup_code (void) |
eric@71 | 129 | { |
eric@71 | 130 | int i; |
eric@71 | 131 | |
eric@71 | 132 | printf ("static g4_bits g4_makeup_code [2] [27] =\n"); |
eric@71 | 133 | printf (" {\n"); |
eric@71 | 134 | printf (" {\n"); |
eric@71 | 135 | printf (" /* white */\n"); |
eric@71 | 136 | for (i = 0; i <= 26; i++) |
eric@71 | 137 | emit_code (6, makeup_code [i][0], i == 26, 1, (i + 1) * 64); |
eric@71 | 138 | printf (" },\n"); |
eric@71 | 139 | printf (" {\n"); |
eric@71 | 140 | printf (" /* black */\n"); |
eric@71 | 141 | for (i = 0; i <= 26; i++) |
eric@71 | 142 | emit_code (6, makeup_code [i][1], i == 26, 1, (i + 1) * 64); |
eric@71 | 143 | printf (" }\n"); |
eric@71 | 144 | printf (" };\n"); |
eric@71 | 145 | } |
eric@71 | 146 | |
eric@71 | 147 | |
eric@71 | 148 | char *h_code [64][2] = |
eric@71 | 149 | { |
eric@71 | 150 | { /* 0 */ "00110101", "0000110111" }, |
eric@71 | 151 | { /* 1 */ "000111", "010" }, |
eric@71 | 152 | { /* 2 */ "0111", "11" }, |
eric@71 | 153 | { /* 3 */ "1000", "10" }, |
eric@71 | 154 | { /* 4 */ "1011", "011" }, |
eric@71 | 155 | { /* 5 */ "1100", "0011" }, |
eric@71 | 156 | { /* 6 */ "1110", "0010" }, |
eric@71 | 157 | { /* 7 */ "1111", "00011" }, |
eric@71 | 158 | { /* 8 */ "10011", "000101" }, |
eric@71 | 159 | { /* 9 */ "10100", "000100" }, |
eric@71 | 160 | { /* 10 */ "00111", "0000100" }, |
eric@71 | 161 | { /* 11 */ "01000", "0000101" }, |
eric@71 | 162 | { /* 12 */ "001000", "0000111" }, |
eric@71 | 163 | { /* 13 */ "000011", "00000100" }, |
eric@71 | 164 | { /* 14 */ "110100", "00000111" }, |
eric@71 | 165 | { /* 15 */ "110101", "000011000" }, |
eric@71 | 166 | { /* 16 */ "101010", "0000010111" }, |
eric@71 | 167 | { /* 17 */ "101011", "0000011000" }, |
eric@71 | 168 | { /* 18 */ "0100111", "0000001000" }, |
eric@71 | 169 | { /* 19 */ "0001100", "00001100111" }, |
eric@71 | 170 | { /* 20 */ "0001000", "00001101000" }, |
eric@71 | 171 | { /* 21 */ "0010111", "00001101100" }, |
eric@71 | 172 | { /* 22 */ "0000011", "00000110111" }, |
eric@71 | 173 | { /* 23 */ "0000100", "00000101000" }, |
eric@71 | 174 | { /* 24 */ "0101000", "00000010111" }, |
eric@71 | 175 | { /* 25 */ "0101011", "00000011000" }, |
eric@71 | 176 | { /* 26 */ "0010011", "000011001010" }, |
eric@71 | 177 | { /* 27 */ "0100100", "000011001011" }, |
eric@71 | 178 | { /* 28 */ "0011000", "000011001100" }, |
eric@71 | 179 | { /* 29 */ "00000010", "000011001101" }, |
eric@71 | 180 | { /* 30 */ "00000011", "000001101000" }, |
eric@71 | 181 | { /* 31 */ "00011010", "000001101001" }, |
eric@71 | 182 | { /* 32 */ "00011011", "000001101010" }, |
eric@71 | 183 | { /* 33 */ "00010010", "000001101011" }, |
eric@71 | 184 | { /* 34 */ "00010011", "000011010010" }, |
eric@71 | 185 | { /* 35 */ "00010100", "000011010011" }, |
eric@71 | 186 | { /* 36 */ "00010101", "000011010100" }, |
eric@71 | 187 | { /* 37 */ "00010110", "000011010101" }, |
eric@71 | 188 | { /* 38 */ "00010111", "000011010110" }, |
eric@71 | 189 | { /* 39 */ "00101000", "000011010111" }, |
eric@71 | 190 | { /* 40 */ "00101001", "000001101100" }, |
eric@71 | 191 | { /* 41 */ "00101010", "000001101101" }, |
eric@71 | 192 | { /* 42 */ "00101011", "000011011010" }, |
eric@71 | 193 | { /* 43 */ "00101100", "000011011011" }, |
eric@71 | 194 | { /* 44 */ "00101101", "000001010100" }, |
eric@71 | 195 | { /* 45 */ "00000100", "000001010101" }, |
eric@71 | 196 | { /* 46 */ "00000101", "000001010110" }, |
eric@71 | 197 | { /* 47 */ "00001010", "000001010111" }, |
eric@71 | 198 | { /* 48 */ "00001011", "000001100100" }, |
eric@71 | 199 | { /* 49 */ "01010010", "000001100101" }, |
eric@71 | 200 | { /* 50 */ "01010011", "000001010010" }, |
eric@71 | 201 | { /* 51 */ "01010100", "000001010011" }, |
eric@71 | 202 | { /* 52 */ "01010101", "000000100100" }, |
eric@71 | 203 | { /* 53 */ "00100100", "000000110111" }, |
eric@71 | 204 | { /* 54 */ "00100101", "000000111000" }, |
eric@71 | 205 | { /* 55 */ "01011000", "000000100111" }, |
eric@71 | 206 | { /* 56 */ "01011001", "000000101000" }, |
eric@71 | 207 | { /* 57 */ "01011010", "000001011000" }, |
eric@71 | 208 | { /* 58 */ "01011011", "000001011001" }, |
eric@71 | 209 | { /* 59 */ "01001010", "000000101011" }, |
eric@71 | 210 | { /* 60 */ "01001011", "000000101100" }, |
eric@71 | 211 | { /* 61 */ "00110010", "000001011010" }, |
eric@71 | 212 | { /* 62 */ "00110011", "000001100110" }, |
eric@71 | 213 | { /* 63 */ "00110100", "000001100111" } |
eric@71 | 214 | }; |
eric@71 | 215 | |
eric@71 | 216 | |
eric@71 | 217 | void print_h_code (void) |
eric@71 | 218 | { |
eric@71 | 219 | int i; |
eric@71 | 220 | |
eric@71 | 221 | printf ("static g4_bits g4_h_code [2] [64] =\n"); |
eric@71 | 222 | printf (" {\n"); |
eric@71 | 223 | printf (" {\n"); |
eric@71 | 224 | printf (" /* white */\n"); |
eric@71 | 225 | for (i = 0; i <= 63; i++) |
eric@71 | 226 | emit_code (6, h_code [i][0], i == 63, 1, i); |
eric@71 | 227 | printf (" },\n"); |
eric@71 | 228 | printf (" {\n"); |
eric@71 | 229 | printf (" /* black */\n"); |
eric@71 | 230 | for (i = 0; i <= 63; i++) |
eric@71 | 231 | emit_code (6, h_code [i][1], i == 63, 1, i); |
eric@71 | 232 | printf (" }\n"); |
eric@71 | 233 | printf (" };\n"); |
eric@71 | 234 | } |
eric@71 | 235 | |
eric@71 | 236 | |
eric@71 | 237 | char *v_code [7] = |
eric@71 | 238 | { |
eric@71 | 239 | /* -3 */ "0000010", |
eric@71 | 240 | /* -2 */ "000010", |
eric@71 | 241 | /* -1 */ "010", |
eric@71 | 242 | /* 0 */ "1", |
eric@71 | 243 | /* 1 */ "011", |
eric@71 | 244 | /* 2 */ "000011", |
eric@71 | 245 | /* 3 */ "0000011" |
eric@71 | 246 | }; |
eric@71 | 247 | |
eric@71 | 248 | |
eric@71 | 249 | void print_v_code (void) |
eric@71 | 250 | { |
eric@71 | 251 | int i; |
eric@71 | 252 | |
eric@71 | 253 | printf ("static g4_bits g4_vert_code [7] =\n"); |
eric@71 | 254 | printf (" {\n"); |
eric@71 | 255 | for (i = 0; i <= 6; i++) |
eric@71 | 256 | emit_code (4, v_code [i], i == 6, 1, i - 3); |
eric@71 | 257 | printf (" };\n"); |
eric@71 | 258 | } |
eric@71 | 259 | |
eric@71 | 260 | |
eric@71 | 261 | int main (int argc, char *argv []) |
eric@71 | 262 | { |
eric@71 | 263 | printf ("/* This file is automatically generated; do not edit */\n"); |
eric@71 | 264 | printf ("\n"); |
eric@71 | 265 | printf ("typedef struct\n"); |
eric@71 | 266 | printf ("{\n"); |
eric@71 | 267 | printf (" uint32_t count;\n"); |
eric@71 | 268 | printf (" uint32_t bits;\n"); |
eric@71 | 269 | printf ("} g4_bits;\n"); |
eric@71 | 270 | printf ("\n"); |
eric@71 | 271 | |
eric@71 | 272 | print_long_makeup_code (); |
eric@71 | 273 | printf ("\n"); |
eric@71 | 274 | |
eric@71 | 275 | print_makeup_code (); |
eric@71 | 276 | printf ("\n"); |
eric@71 | 277 | |
eric@71 | 278 | print_h_code (); |
eric@71 | 279 | printf ("\n"); |
eric@71 | 280 | |
eric@71 | 281 | print_v_code (); |
eric@71 | 282 | |
eric@71 | 283 | exit (0); |
eric@71 | 284 | } |