/*
* iDART: The Intelligent Dispensing of Antiretroviral Treatment
* Copyright (C) 2006 Cell-Life
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published by
* the Free Software Foundation.
*
* This program 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 version
* 2 for more details.
*
* You should have received a copy of the GNU General Public License version 2
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package org.celllife.idart.print.barcode;
/*
* Maps the characters to be encoded to their Code128 B or C representations
* Uses code from jbarcodebean, http://jbarcodebean.sourceforge.net/
*
*/
/**
*/
public class CompactCode128 {
/** Code 128 FUNCTION CODE 1 */
public static final String FNC_1 = "\u0080";
/** Code 128 FUNCTION CODE 2 */
public static final String FNC_2 = "\u0081";
/** Code 128 FUNCTION CODE 3 */
public static final String FNC_3 = "\u0082";
/** Code 128 FUNCTION CODE 4 */
public static final String FNC_4 = "\u0083";
public static final String START_A = "\u0084";
public static final String START_B = "\u0085";
public static final String START_C = "\u0086";
public static final String MODE_A = "\u0087";
public static final String MODE_B = "\u00C8";
public static final String MODE_C = "\u0089";
public static final String SHIFT = "\u008A";
public static final String STOP = "\u008B";
/**
*/
public static class CharacterCode {
/** The character that is encoded */
public String character;
/** The widths of the modules (bars and spaces) of this encoded character */
public byte[] widths;
/**
* The check digit corresponding to this character, used in checksum
* calculations
*/
public int check;
/** Constructor which fully initializes the properties of the object. * @param character String
* @param widths byte[]
* @param check int
* @param character String
* @param widths byte[]
* @param check int
*/
public CharacterCode(String character, byte[] widths, int check) {
this.character = character;
this.widths = widths;
this.check = check;
}
}
/**
* A static array of
* {@link AbstractBarcodeStrategy.CharacterCode CharacterCode} objects for
* Code 128. The {@link AbstractBarcodeStrategy#getCodes() getCodes()}
* method returns this array.
*
* The <tt>character</tt> member of the elements in this array corresponds
* to the MODE B version of the character.
*/
protected static CharacterCode[] codes = {
new CharacterCode(" ", new byte[] { 2, 1, 2, 2, 2, 2 }, 0),
new CharacterCode("!", new byte[] { 2, 2, 2, 1, 2, 2 }, 1),
new CharacterCode("\"", new byte[] { 2, 2, 2, 2, 2, 1 }, 2),
new CharacterCode("#", new byte[] { 1, 2, 1, 2, 2, 3 }, 3),
new CharacterCode("$", new byte[] { 1, 2, 1, 3, 2, 2 }, 4),
new CharacterCode("%", new byte[] { 1, 3, 1, 2, 2, 2 }, 5),
new CharacterCode("&", new byte[] { 1, 2, 2, 2, 1, 3 }, 6),
new CharacterCode("\"", new byte[] { 1, 2, 2, 3, 1, 2 }, 7),
new CharacterCode("(", new byte[] { 1, 3, 2, 2, 1, 2 }, 8),
new CharacterCode(")", new byte[] { 2, 2, 1, 2, 1, 3 }, 9),
new CharacterCode("*", new byte[] { 2, 2, 1, 3, 1, 2 }, 10),
new CharacterCode("+", new byte[] { 2, 3, 1, 2, 1, 2 }, 11),
new CharacterCode(",", new byte[] { 1, 1, 2, 2, 3, 2 }, 12),
new CharacterCode("-", new byte[] { 1, 2, 2, 1, 3, 2 }, 13),
new CharacterCode(".", new byte[] { 1, 2, 2, 2, 3, 1 }, 14),
new CharacterCode("/", new byte[] { 1, 1, 3, 2, 2, 2 }, 15),
new CharacterCode("0", new byte[] { 1, 2, 3, 1, 2, 2 }, 16),
new CharacterCode("1", new byte[] { 1, 2, 3, 2, 2, 1 }, 17),
new CharacterCode("2", new byte[] { 2, 2, 3, 2, 1, 1 }, 18),
new CharacterCode("3", new byte[] { 2, 2, 1, 1, 3, 2 }, 19),
new CharacterCode("4", new byte[] { 2, 2, 1, 2, 3, 1 }, 20),
new CharacterCode("5", new byte[] { 2, 1, 3, 2, 1, 2 }, 21),
new CharacterCode("6", new byte[] { 2, 2, 3, 1, 1, 2 }, 22),
new CharacterCode("7", new byte[] { 3, 1, 2, 1, 3, 1 }, 23),
new CharacterCode("8", new byte[] { 3, 1, 1, 2, 2, 2 }, 24),
new CharacterCode("9", new byte[] { 3, 2, 1, 1, 2, 2 }, 25),
new CharacterCode(":", new byte[] { 3, 2, 1, 2, 2, 1 }, 26),
new CharacterCode(";", new byte[] { 3, 1, 2, 2, 1, 2 }, 27),
new CharacterCode("<", new byte[] { 3, 2, 2, 1, 1, 2 }, 28),
new CharacterCode("=", new byte[] { 3, 2, 2, 2, 1, 1 }, 29),
new CharacterCode(">", new byte[] { 2, 1, 2, 1, 2, 3 }, 30),
new CharacterCode("?", new byte[] { 2, 1, 2, 3, 2, 1 }, 31),
new CharacterCode("@", new byte[] { 2, 3, 2, 1, 2, 1 }, 32),
new CharacterCode("A", new byte[] { 1, 1, 1, 3, 2, 3 }, 33),
new CharacterCode("B", new byte[] { 1, 3, 1, 1, 2, 3 }, 34),
new CharacterCode("C", new byte[] { 1, 3, 1, 3, 2, 1 }, 35),
new CharacterCode("D", new byte[] { 1, 1, 2, 3, 1, 3 }, 36),
new CharacterCode("E", new byte[] { 1, 3, 2, 1, 1, 3 }, 37),
new CharacterCode("F", new byte[] { 1, 3, 2, 3, 1, 1 }, 38),
new CharacterCode("G", new byte[] { 2, 1, 1, 3, 1, 3 }, 39),
new CharacterCode("H", new byte[] { 2, 3, 1, 1, 1, 3 }, 40),
new CharacterCode("I", new byte[] { 2, 3, 1, 3, 1, 1 }, 41),
new CharacterCode("J", new byte[] { 1, 1, 2, 1, 3, 3 }, 42),
new CharacterCode("K", new byte[] { 1, 1, 2, 3, 3, 1 }, 43),
new CharacterCode("L", new byte[] { 1, 3, 2, 1, 3, 1 }, 44),
new CharacterCode("M", new byte[] { 1, 1, 3, 1, 2, 3 }, 45),
new CharacterCode("N", new byte[] { 1, 1, 3, 3, 2, 1 }, 46),
new CharacterCode("O", new byte[] { 1, 3, 3, 1, 2, 1 }, 47),
new CharacterCode("P", new byte[] { 3, 1, 3, 1, 2, 1 }, 48),
new CharacterCode("Q", new byte[] { 2, 1, 1, 3, 3, 1 }, 49),
new CharacterCode("R", new byte[] { 2, 3, 1, 1, 3, 1 }, 50),
new CharacterCode("S", new byte[] { 2, 1, 3, 1, 1, 3 }, 51),
new CharacterCode("T", new byte[] { 2, 1, 3, 3, 1, 1 }, 52),
new CharacterCode("U", new byte[] { 2, 1, 3, 1, 3, 1 }, 53),
new CharacterCode("V", new byte[] { 3, 1, 1, 1, 2, 3 }, 54),
new CharacterCode("W", new byte[] { 3, 1, 1, 3, 2, 1 }, 55),
new CharacterCode("X", new byte[] { 3, 3, 1, 1, 2, 1 }, 56),
new CharacterCode("Y", new byte[] { 3, 1, 2, 1, 1, 3 }, 57),
new CharacterCode("Z", new byte[] { 3, 1, 2, 3, 1, 1 }, 58),
new CharacterCode("[", new byte[] { 3, 3, 2, 1, 1, 1 }, 59),
new CharacterCode("\\", new byte[] { 3, 1, 4, 1, 1, 1 }, 60),
new CharacterCode("]", new byte[] { 2, 2, 1, 4, 1, 1 }, 61),
new CharacterCode("^", new byte[] { 4, 3, 1, 1, 1, 1 }, 62),
new CharacterCode("_", new byte[] { 1, 1, 1, 2, 2, 4 }, 63),
new CharacterCode("`", new byte[] { 1, 1, 1, 4, 2, 2 }, 64),
new CharacterCode("a", new byte[] { 1, 2, 1, 1, 2, 4 }, 65),
new CharacterCode("b", new byte[] { 1, 2, 1, 4, 2, 1 }, 66),
new CharacterCode("c", new byte[] { 1, 4, 1, 1, 2, 2 }, 67),
new CharacterCode("d", new byte[] { 1, 4, 1, 2, 2, 1 }, 68),
new CharacterCode("e", new byte[] { 1, 1, 2, 2, 1, 4 }, 69),
new CharacterCode("f", new byte[] { 1, 1, 2, 4, 1, 2 }, 70),
new CharacterCode("g", new byte[] { 1, 2, 2, 1, 1, 4 }, 71),
new CharacterCode("h", new byte[] { 1, 2, 2, 4, 1, 1 }, 72),
new CharacterCode("i", new byte[] { 1, 4, 2, 1, 1, 2 }, 73),
new CharacterCode("j", new byte[] { 1, 4, 2, 2, 1, 1 }, 74),
new CharacterCode("k", new byte[] { 2, 4, 1, 2, 1, 1 }, 75),
new CharacterCode("l", new byte[] { 2, 2, 1, 1, 1, 4 }, 76),
new CharacterCode("m", new byte[] { 4, 1, 3, 1, 1, 1 }, 77),
new CharacterCode("n", new byte[] { 2, 4, 1, 1, 1, 2 }, 78),
new CharacterCode("o", new byte[] { 1, 3, 4, 1, 1, 1 }, 79),
new CharacterCode("p", new byte[] { 1, 1, 1, 2, 4, 2 }, 80),
new CharacterCode("q", new byte[] { 1, 2, 1, 1, 4, 2 }, 81),
new CharacterCode("r", new byte[] { 1, 2, 1, 2, 4, 1 }, 82),
new CharacterCode("s", new byte[] { 1, 1, 4, 2, 1, 2 }, 83),
new CharacterCode("t", new byte[] { 1, 2, 4, 1, 1, 2 }, 84),
new CharacterCode("u", new byte[] { 1, 2, 4, 2, 1, 1 }, 85),
new CharacterCode("v", new byte[] { 4, 1, 1, 2, 1, 2 }, 86),
new CharacterCode("w", new byte[] { 4, 2, 1, 1, 1, 2 }, 87),
new CharacterCode("x", new byte[] { 4, 2, 1, 2, 1, 1 }, 88),
new CharacterCode("y", new byte[] { 2, 1, 2, 1, 4, 1 }, 89),
new CharacterCode("z", new byte[] { 2, 1, 4, 1, 2, 1 }, 90),
new CharacterCode("{", new byte[] { 4, 1, 2, 1, 2, 1 }, 91),
new CharacterCode("|", new byte[] { 1, 1, 1, 1, 4, 3 }, 92),
new CharacterCode("}", new byte[] { 1, 1, 1, 3, 4, 1 }, 93),
new CharacterCode("~", new byte[] { 1, 3, 1, 1, 4, 1 }, 94),
new CharacterCode("\u007F", new byte[] { 1, 1, 4, 1, 1, 3 }, 95),
new CharacterCode(FNC_3, new byte[] { 1, 1, 4, 3, 1, 1 }, 96),
new CharacterCode(FNC_2, new byte[] { 4, 1, 1, 1, 1, 3 }, 97),
new CharacterCode(SHIFT, new byte[] { 4, 1, 1, 3, 1, 1 }, 98),
new CharacterCode(MODE_C, new byte[] { 1, 1, 3, 1, 4, 1 }, 99),
new CharacterCode(FNC_4, new byte[] { 1, 1, 4, 1, 3, 1 }, 100),
new CharacterCode(MODE_A, new byte[] { 3, 1, 1, 1, 4, 1 }, 101),
new CharacterCode(FNC_1, new byte[] { 4, 1, 1, 1, 3, 1 }, 102),
new CharacterCode(START_A, new byte[] { 2, 1, 1, 4, 1, 2 }, 103),
new CharacterCode(START_B, new byte[] { 2, 1, 1, 2, 1, 4 }, 104),
new CharacterCode(START_C, new byte[] { 2, 1, 1, 2, 3, 2 }, 105),
new CharacterCode(STOP, new byte[] { 2, 3, 3, 1, 1, 1, 2 }, 106) };
protected static CharacterCode[] codesC = {
new CharacterCode("00", new byte[] { 2, 1, 2, 2, 2, 2 }, 0),
new CharacterCode("01", new byte[] { 2, 2, 2, 1, 2, 2 }, 1),
new CharacterCode("02", new byte[] { 2, 2, 2, 2, 2, 1 }, 2),
new CharacterCode("03", new byte[] { 1, 2, 1, 2, 2, 3 }, 3),
new CharacterCode("04", new byte[] { 1, 2, 1, 3, 2, 2 }, 4),
new CharacterCode("05", new byte[] { 1, 3, 1, 2, 2, 2 }, 5),
new CharacterCode("06", new byte[] { 1, 2, 2, 2, 1, 3 }, 6),
new CharacterCode("07", new byte[] { 1, 2, 2, 3, 1, 2 }, 7),
new CharacterCode("08", new byte[] { 1, 3, 2, 2, 1, 2 }, 8),
new CharacterCode("09", new byte[] { 2, 2, 1, 2, 1, 3 }, 9),
new CharacterCode("10", new byte[] { 2, 2, 1, 3, 1, 2 }, 10),
new CharacterCode("11", new byte[] { 2, 3, 1, 2, 1, 2 }, 11),
new CharacterCode("12", new byte[] { 1, 1, 2, 2, 3, 2 }, 12),
new CharacterCode("13", new byte[] { 1, 2, 2, 1, 3, 2 }, 13),
new CharacterCode("14", new byte[] { 1, 2, 2, 2, 3, 1 }, 14),
new CharacterCode("15", new byte[] { 1, 1, 3, 2, 2, 2 }, 15),
new CharacterCode("16", new byte[] { 1, 2, 3, 1, 2, 2 }, 16),
new CharacterCode("17", new byte[] { 1, 2, 3, 2, 2, 1 }, 17),
new CharacterCode("18", new byte[] { 2, 2, 3, 2, 1, 1 }, 18),
new CharacterCode("19", new byte[] { 2, 2, 1, 1, 3, 2 }, 19),
new CharacterCode("20", new byte[] { 2, 2, 1, 2, 3, 1 }, 20),
new CharacterCode("21", new byte[] { 2, 1, 3, 2, 1, 2 }, 21),
new CharacterCode("22", new byte[] { 2, 2, 3, 1, 1, 2 }, 22),
new CharacterCode("23", new byte[] { 3, 1, 2, 1, 3, 1 }, 23),
new CharacterCode("24", new byte[] { 3, 1, 1, 2, 2, 2 }, 24),
new CharacterCode("25", new byte[] { 3, 2, 1, 1, 2, 2 }, 25),
new CharacterCode("26", new byte[] { 3, 2, 1, 2, 2, 1 }, 26),
new CharacterCode("27", new byte[] { 3, 1, 2, 2, 1, 2 }, 27),
new CharacterCode("28", new byte[] { 3, 2, 2, 1, 1, 2 }, 28),
new CharacterCode("29", new byte[] { 3, 2, 2, 2, 1, 1 }, 29),
new CharacterCode("30", new byte[] { 2, 1, 2, 1, 2, 3 }, 30),
new CharacterCode("31", new byte[] { 2, 1, 2, 3, 2, 1 }, 31),
new CharacterCode("32", new byte[] { 2, 3, 2, 1, 2, 1 }, 32),
new CharacterCode("33", new byte[] { 1, 1, 1, 3, 2, 3 }, 33),
new CharacterCode("34", new byte[] { 1, 3, 1, 1, 2, 3 }, 34),
new CharacterCode("35", new byte[] { 1, 3, 1, 3, 2, 1 }, 35),
new CharacterCode("36", new byte[] { 1, 1, 2, 3, 1, 3 }, 36),
new CharacterCode("37", new byte[] { 1, 3, 2, 1, 1, 3 }, 37),
new CharacterCode("38", new byte[] { 1, 3, 2, 3, 1, 1 }, 38),
new CharacterCode("39", new byte[] { 2, 1, 1, 3, 1, 3 }, 39),
new CharacterCode("40", new byte[] { 2, 3, 1, 1, 1, 3 }, 40),
new CharacterCode("41", new byte[] { 2, 3, 1, 3, 1, 1 }, 41),
new CharacterCode("42", new byte[] { 1, 1, 2, 1, 3, 3 }, 42),
new CharacterCode("43", new byte[] { 1, 1, 2, 3, 3, 1 }, 43),
new CharacterCode("44", new byte[] { 1, 3, 2, 1, 3, 1 }, 44),
new CharacterCode("45", new byte[] { 1, 1, 3, 1, 2, 3 }, 45),
new CharacterCode("46", new byte[] { 1, 1, 3, 3, 2, 1 }, 46),
new CharacterCode("47", new byte[] { 1, 3, 3, 1, 2, 1 }, 47),
new CharacterCode("48", new byte[] { 3, 1, 3, 1, 2, 1 }, 48),
new CharacterCode("49", new byte[] { 2, 1, 1, 3, 3, 1 }, 49),
new CharacterCode("50", new byte[] { 2, 3, 1, 1, 3, 1 }, 50),
new CharacterCode("51", new byte[] { 2, 1, 3, 1, 1, 3 }, 51),
new CharacterCode("52", new byte[] { 2, 1, 3, 3, 1, 1 }, 52),
new CharacterCode("53", new byte[] { 2, 1, 3, 1, 3, 1 }, 53),
new CharacterCode("54", new byte[] { 3, 1, 1, 1, 2, 3 }, 54),
new CharacterCode("55", new byte[] { 3, 1, 1, 3, 2, 1 }, 55),
new CharacterCode("56", new byte[] { 3, 3, 1, 1, 2, 1 }, 56),
new CharacterCode("57", new byte[] { 3, 1, 2, 1, 1, 3 }, 57),
new CharacterCode("58", new byte[] { 3, 1, 2, 3, 1, 1 }, 58),
new CharacterCode("59", new byte[] { 3, 3, 2, 1, 1, 1 }, 59),
new CharacterCode("60", new byte[] { 3, 1, 4, 1, 1, 1 }, 60),
new CharacterCode("61", new byte[] { 2, 2, 1, 4, 1, 1 }, 61),
new CharacterCode("62", new byte[] { 4, 3, 1, 1, 1, 1 }, 62),
new CharacterCode("63", new byte[] { 1, 1, 1, 2, 2, 4 }, 63),
new CharacterCode("64", new byte[] { 1, 1, 1, 4, 2, 2 }, 64),
new CharacterCode("65", new byte[] { 1, 2, 1, 1, 2, 4 }, 65),
new CharacterCode("66", new byte[] { 1, 2, 1, 4, 2, 1 }, 66),
new CharacterCode("67", new byte[] { 1, 4, 1, 1, 2, 2 }, 67),
new CharacterCode("68", new byte[] { 1, 4, 1, 2, 2, 1 }, 68),
new CharacterCode("69", new byte[] { 1, 1, 2, 2, 1, 4 }, 69),
new CharacterCode("70", new byte[] { 1, 1, 2, 4, 1, 2 }, 70),
new CharacterCode("71", new byte[] { 1, 2, 2, 1, 1, 4 }, 71),
new CharacterCode("72", new byte[] { 1, 2, 2, 4, 1, 1 }, 72),
new CharacterCode("73", new byte[] { 1, 4, 2, 1, 1, 2 }, 73),
new CharacterCode("74", new byte[] { 1, 4, 2, 2, 1, 1 }, 74),
new CharacterCode("75", new byte[] { 2, 4, 1, 2, 1, 1 }, 75),
new CharacterCode("76", new byte[] { 2, 2, 1, 1, 1, 4 }, 76),
new CharacterCode("77", new byte[] { 4, 1, 3, 1, 1, 1 }, 77),
new CharacterCode("78", new byte[] { 2, 4, 1, 1, 1, 2 }, 78),
new CharacterCode("79", new byte[] { 1, 3, 4, 1, 1, 1 }, 79),
new CharacterCode("80", new byte[] { 1, 1, 1, 2, 4, 2 }, 80),
new CharacterCode("81", new byte[] { 1, 2, 1, 1, 4, 2 }, 81),
new CharacterCode("82", new byte[] { 1, 2, 1, 2, 4, 1 }, 82),
new CharacterCode("83", new byte[] { 1, 1, 4, 2, 1, 2 }, 83),
new CharacterCode("84", new byte[] { 1, 2, 4, 1, 1, 2 }, 84),
new CharacterCode("85", new byte[] { 1, 2, 4, 2, 1, 1 }, 85),
new CharacterCode("86", new byte[] { 4, 1, 1, 2, 1, 2 }, 86),
new CharacterCode("87", new byte[] { 4, 2, 1, 1, 1, 2 }, 87),
new CharacterCode("88", new byte[] { 4, 2, 1, 2, 1, 1 }, 88),
new CharacterCode("89", new byte[] { 2, 1, 2, 1, 4, 1 }, 89),
new CharacterCode("90", new byte[] { 2, 1, 4, 1, 2, 1 }, 90),
new CharacterCode("91", new byte[] { 4, 1, 2, 1, 2, 1 }, 91),
new CharacterCode("92", new byte[] { 1, 1, 1, 1, 4, 3 }, 92),
new CharacterCode("93", new byte[] { 1, 1, 1, 3, 4, 1 }, 93),
new CharacterCode("94", new byte[] { 1, 3, 1, 1, 4, 1 }, 94),
new CharacterCode("95", new byte[] { 1, 1, 4, 1, 1, 3 }, 95),
new CharacterCode("96", new byte[] { 1, 1, 4, 3, 1, 1 }, 96),
new CharacterCode("97", new byte[] { 4, 1, 1, 1, 1, 3 }, 97),
new CharacterCode("98", new byte[] { 4, 1, 1, 3, 1, 1 }, 98),
new CharacterCode("99", new byte[] { 1, 1, 3, 1, 4, 1 }, 99),
new CharacterCode(MODE_B, new byte[] { 1, 1, 4, 1, 3, 1 }, 100),
new CharacterCode(MODE_A, new byte[] { 3, 1, 1, 1, 4, 1 }, 101),
new CharacterCode(FNC_1, new byte[] { 4, 1, 1, 1, 3, 1 }, 102),
new CharacterCode(START_A, new byte[] { 2, 1, 1, 4, 1, 2 }, 103),
new CharacterCode(START_B, new byte[] { 2, 1, 1, 2, 1, 4 }, 104),
new CharacterCode(START_C, new byte[] { 2, 1, 1, 2, 3, 2 }, 105),
new CharacterCode(STOP, new byte[] { 2, 3, 3, 1, 1, 1, 2 }, 106) };
/**
* Method get128BVal.
* @param s String
* @return CharacterCode
*/
public static CharacterCode get128BVal(String s) {
CharacterCode returnCode = new CharacterCode(null, null, 999);
for (int i = 0; i < codes.length; i++) {
if (s.equals(codes[i].character)) {
returnCode = codes[i];
break;
}
}
return returnCode;
}
/**
* Method get128CValByInt.
* @param val int
* @return CharacterCode
*/
public static CharacterCode get128CValByInt(int val) {
return codesC[val];
}
/**
* Method get128CVal.
* @param s String
* @return CharacterCode
*/
public static CharacterCode get128CVal(String s) {
CharacterCode returnCode = new CharacterCode(null, null, 999);
for (int i = 0; i < codesC.length; i++) {
if (s.equals(codesC[i].character)) {
returnCode = codesC[i];
break;
}
}
return returnCode;
}
}