1 58 package org.krysalis.barcode.impl; 59 60 import org.krysalis.barcode.BarGroup; 61 import org.krysalis.barcode.ClassicBarcodeLogicHandler; 62 63 68 public class Code128LogicImpl { 69 70 71 public static final char FNC_1 = 0xF1; 72 73 public static final char FNC_2 = 0xF2; 74 75 public static final char FNC_3 = 0xF3; 76 77 public static final char FNC_4 = 0xF4; 78 79 private static final byte[][] CHARSET = 80 {{2, 1, 2, 2, 2, 2}, {2, 2, 2, 1, 2, 2}, 82 {2, 2, 2, 2, 2, 1}, 83 {1, 2, 1, 2, 2, 3}, 84 {1, 2, 1, 3, 2, 2}, 85 {1, 3, 1, 2, 2, 2}, 86 {1, 2, 2, 2, 1, 3}, 87 {1, 2, 2, 3, 1, 2}, 88 {1, 3, 2, 2, 1, 2}, 89 {2, 2, 1, 2, 1, 3}, 90 {2, 2, 1, 3, 1, 2}, 91 {2, 3, 1, 2, 1, 2}, 92 {1, 1, 2, 2, 3, 2}, 93 {1, 2, 2, 1, 3, 2}, 94 {1, 2, 2, 2, 3, 1}, 95 {1, 1, 3, 2, 2, 2}, 96 {1, 2, 3, 1, 2, 2}, {1, 2, 3, 2, 2, 1}, 98 {2, 2, 3, 2, 1, 1}, 99 {2, 2, 1, 1, 3, 2}, 100 {2, 2, 1, 2, 3, 1}, 101 {2, 1, 3, 2, 1, 2}, 102 {2, 2, 3, 1, 1, 2}, 103 {3, 1, 2, 1, 3, 1}, 104 {3, 1, 1, 2, 2, 2}, 105 {3, 2, 1, 1, 2, 2}, {3, 2, 1, 2, 2, 1}, {3, 1, 2, 2, 1, 2}, 108 {3, 2, 2, 1, 1, 2}, 109 {3, 2, 2, 2, 1, 1}, 110 {2, 1, 2, 1, 2, 3}, 111 {2, 1, 2, 3, 2, 1}, 112 {2, 3, 2, 1, 2, 1}, 113 {1, 1, 1, 3, 2, 3}, {1, 3, 1, 1, 2, 3}, 115 {1, 3, 1, 3, 2, 1}, 116 {1, 1, 2, 3, 1, 3}, 117 {1, 3, 2, 1, 1, 3}, 118 {1, 3, 2, 3, 1, 1}, 119 {2, 1, 1, 3, 1, 3}, 120 {2, 3, 1, 1, 1, 3}, 121 {2, 3, 1, 3, 1, 1}, 122 {1, 1, 2, 1, 3, 3}, 123 {1, 1, 2, 3, 3, 1}, 124 {1, 3, 2, 1, 3, 1}, 125 {1, 1, 3, 1, 2, 3}, 126 {1, 1, 3, 3, 2, 1}, 127 {1, 3, 3, 1, 2, 1}, 128 {3, 1, 3, 1, 2, 1}, 129 {2, 1, 1, 3, 3, 1}, 130 {2, 3, 1, 1, 3, 1}, 131 {2, 1, 3, 1, 1, 3}, 132 {2, 1, 3, 3, 1, 1}, 133 {2, 1, 3, 1, 3, 1}, 134 {3, 1, 1, 1, 2, 3}, 135 {3, 1, 1, 3, 2, 1}, 136 {3, 3, 1, 1, 2, 1}, 137 {3, 1, 2, 1, 1, 3}, 138 {3, 1, 2, 3, 1, 1}, {3, 3, 2, 1, 1, 1}, {3, 1, 4, 1, 1, 1}, 141 {2, 2, 1, 4, 1, 1}, 142 {4, 3, 1, 1, 1, 1}, 143 {1, 1, 1, 2, 2, 4}, {1, 1, 1, 4, 2, 2}, {1, 2, 1, 1, 2, 4}, {1, 2, 1, 4, 2, 1}, 147 {1, 4, 1, 1, 2, 2}, 148 {1, 4, 1, 2, 2, 1}, 149 {1, 1, 2, 2, 1, 4}, 150 {1, 1, 2, 4, 1, 2}, 151 {1, 2, 2, 1, 1, 4}, 152 {1, 2, 2, 4, 1, 1}, 153 {1, 4, 2, 1, 1, 2}, 154 {1, 4, 2, 2, 1, 1}, 155 {2, 4, 1, 2, 1, 1}, 156 {2, 2, 1, 1, 1, 4}, 157 {4, 1, 3, 1, 1, 1}, 158 {2, 4, 1, 1, 1, 2}, 159 {1, 3, 4, 1, 1, 1}, 160 {1, 1, 1, 2, 4, 2}, 161 {1, 2, 1, 1, 4, 2}, 162 {1, 2, 1, 2, 4, 1}, 163 {1, 1, 4, 2, 1, 2}, 164 {1, 2, 4, 1, 1, 2}, 165 {1, 2, 4, 2, 1, 1}, 166 {4, 1, 1, 2, 1, 2}, 167 {4, 2, 1, 1, 1, 2}, 168 {4, 2, 1, 2, 1, 1}, 169 {2, 1, 2, 1, 4, 1}, 170 {2, 1, 4, 1, 2, 1}, {4, 1, 2, 1, 2, 1}, 172 {1, 1, 1, 1, 4, 3}, 173 {1, 1, 1, 3, 4, 1}, 174 {1, 3, 1, 1, 4, 1}, {1, 1, 4, 1, 1, 3}, {1, 1, 4, 3, 1, 1}, 177 {4, 1, 1, 1, 1, 3}, 178 {4, 1, 1, 3, 1, 1}, 179 {1, 1, 3, 1, 4, 1}, 180 {1, 1, 4, 1, 3, 1}, 181 {3, 1, 1, 1, 4, 1}, 182 {4, 1, 1, 1, 3, 1}, 183 {2, 1, 1, 4, 1, 2}, {2, 1, 1, 2, 1, 4}, {2, 1, 1, 2, 3, 2}}; 187 private static final byte[] STOP = {2, 3, 3, 1, 1, 1, 2}; 189 190 195 public static boolean isValidChar(char ch) { 196 return (ch >= 0 && ch <= 127) 197 || (ch >= FNC_1 && ch <= FNC_4); 198 } 199 200 205 public static boolean isInCodeSetA(char ch) { 206 return (ch >= 0 && ch <= 95) 207 || (ch >= FNC_1 && ch <= FNC_4); 208 } 209 210 215 public static boolean isInCodeSetB(char ch) { 216 return (ch >= 32 && ch <= 127) 217 || (ch >= FNC_1 && ch <= FNC_4); 218 } 219 220 225 public static boolean canBeInCodeSetC(char ch) { 226 return (ch >= '0' && ch <= '9') || (ch == FNC_1); 227 } 228 229 235 public static String symbolCharToString(int index) { 236 switch (index) { 237 case 96: return "FNC3/96"; 238 case 97: return "FNC2/97"; 239 case 98: return "Shift/98"; 240 case 99: return "CodeC/99"; 241 case 100: return "CodeB/FNC4"; 242 case 101: return "CodeA/FNC4"; 243 case 102: return "FNC1"; 244 case 103: return "StartA"; 245 case 104: return "StartB"; 246 case 105: return "StartC"; 247 default: return "idx" + Integer.toString(index); 248 } 249 } 250 251 257 public static String toString(int[] encodedMsg) { 258 StringBuffer sb = new StringBuffer (); 259 for (int i = 0; i < encodedMsg.length; i++) { 260 if (i > 0) { 261 sb.append("|"); 262 } 263 sb.append(symbolCharToString(encodedMsg[i])); 264 } 265 return sb.toString(); 266 } 267 268 273 protected void encodeChar(ClassicBarcodeLogicHandler logic, int index) { 274 logic.startBarGroup(BarGroup.MSG_CHARACTER, symbolCharToString(index)); 275 for (byte i = 0; i < 6; i++) { 276 final int width = CHARSET[index][i]; 277 final boolean black = ((i % 2) == 0); 278 logic.addBar(black, width); 279 } 280 logic.endBarGroup(); 281 } 282 283 287 protected void encodeStop(ClassicBarcodeLogicHandler logic) { 288 logic.startBarGroup(BarGroup.STOP_CHARACTER, null); 289 for (byte i = 0; i < 7; i++) { 290 final int width = STOP[i]; 291 final boolean black = ((i % 2) == 0); 292 logic.addBar(black, width); 293 } 294 logic.endBarGroup(); 295 } 296 297 304 protected Code128Encoder getEncoder() { 305 return new DefaultCode128Encoder(); 306 } 307 308 314 public int[] createEncodedMessage(String msg) { 315 return getEncoder().encode(msg); 316 } 317 318 323 public void generateBarcodeLogic(ClassicBarcodeLogicHandler logic, String msg) { 324 logic.startBarcode(msg); 325 326 int[] encodedMsg = createEncodedMessage(msg); 327 for (int i = 0; i < encodedMsg.length; i++) { 328 encodeChar(logic, encodedMsg[i]); 329 } 330 331 int checksum = encodedMsg[0]; 333 for (int i = 1; i < encodedMsg.length; i++) { 334 checksum += i * encodedMsg[i]; 335 } 336 checksum = checksum % 103; 337 encodeChar(logic, checksum); 338 339 encodeStop(logic); 340 341 logic.endBarcode(); 342 } 343 344 } 345 | Popular Tags |