jquery-barcode.js

/*!

  • BarCode Coder Library (BCC Library)
  • BCCL Version 2.0
  • Porting : jQuery barcode plugin
  • Version : 2.2
  • Date : 2019-02-21
  • Author : DEMONTE Jean-Baptiste jbdemonte@gmail.com
  •        HOUREZ Jonathan
    
  • Web site: http://barcode-coder.com/
  • dual licence : http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html
  •              http://www.gnu.org/licenses/gpl.html
    

*/

(function ($) {

var defaultSettings = {
barWidth: 1,
barHeight: 50,
moduleSize: 5,
showHRI: true,
addQuietZone: true,
marginHRI: 5,
bgColor: “#FFFFFF”,
color: “#000000”,
fontSize: 10,
output: “css”,
posX: 0,
posY: 0
};

// * * * * * * * * * * * * * * * * * * * * * *
// std25 int25
// * * * * * * * * * * * * * * * * * * * * * *

var encodingI25 = [“NNWWN”, “WNNNW”, “NWNNW”, “WWNNN”, “NNWNW”, “WNWNN”, “NWWNN”, “NNNWW”, “WNNWN”, “NWNWN”];

function computeI25(code, crc, type) {
var i, v,
odd = true,
sum = 0;
if (!crc) {
if (code.length % 2 !== 0) {
code = “0” + code;
}
} else {
if (type === “int25” && code.length % 2 === 0) {
code = “0” + code;
}
for (i = code.length - 1; i > -1; i–) {
v = intval(code.charAt(i));
if (isNaN(v)) {
return “”;
}
sum += odd ? 3 * v : v;
odd = !odd;
}
code += ((10 - sum % 10) % 10).toString();
}
return code;
}

function getDigitI25(code, crc, type) {
var i, j, c1, c2, c, result = “”;
code = computeI25(code, crc, type);
if (type === “int25”) {
// Interleaved 2 of 5

  // start
  result += "1010";

  // digits + CRC
  for (i = 0; i < code.length / 2; i++) {
    c1 = code.charAt(2 * i);
    c2 = code.charAt(2 * i + 1);
    for (j = 0; j < 5; j++) {
      result += "1";
      if (encodingI25[c1].charAt(j) === 'W') {
        result += "1";
      }
      result += "0";
      if (encodingI25[c2].charAt(j) === 'W') {
        result += "0";
      }
    }
  }
  // stop
  result += "1101";
} else if (type === "std25") {
  // Standard 2 of 5 is a numeric-only barcode that has been in use a long time.
  // Unlike Interleaved 2 of 5, all of the information is encoded in the bars; the spaces are fixed width and are used only to separate the bars.
  // The code is self-checking and does not include a checksum.

  // start
  result += "11011010";

  // digits + CRC
  for (i = 0; i < code.length; i++) {
    c = code.charAt(i);
    for (j = 0; j < 5; j++) {
      result += "1";
      if (encodingI25[c].charAt(j) === 'W') {
        result += "11";
      }
      result += "0";
    }
  }
  // stop
  result += "11010110";
}
return result;

}

// * * * * * * * * * * * * * * * * * * * * * *
// ean
// * * * * * * * * * * * * * * * * * * * * * *

var encodingEAN = [ [“0001101”, “0100111”, “1110010”],
[“0011001”, “0110011”, “1100110”],
[“0010011”, “0011011”, “1101100”],
[“0111101”, “0100001”, “1000010”],
[“0100011”, “0011101”, “1011100”],
[“0110001”, “0111001”, “1001110”],
[“0101111”, “0000101”, “1010000”],
[“0111011”, “0010001”, “1000100”],
[“0110111”, “0001001”, “1001000”],
[“0001011”, “0010111”, “1110100”] ],
firstEAN = [“000000”, “001011”, “001101”, “001110”, “010011”, “011001”, “011100”, “010101”, “010110”, “011010”],
encodingEAN_addon2 = [“00”, “01”, “10”, “11”],
encodingEAN_addon5 = [“11000”, “10100”, “10010”, “10001”, “01100”, “00110”, “00011”, “01010”, “01001”, “00101”];

function getDigitEAN(code, type) {
// Check len (12 for ean13, 7 for ean8)
var i, x, y, addon, checksum, result, seq, part_of_addon, a_or_b, partialencoding, odd,
len = type === “ean8” ? 7 : 12,
fullcode = code;
code = code.substring(0, len);

if (!code.match(new RegExp("^[0-9]{" + len + "}$"))) {
  return "";
}
// get checksum
code = computeEAN(code, type);

// process analyse
result = "101"; // start

if (type === "ean8") {

  // process left part
  for (i = 0; i < 4; i++) {
    result += encodingEAN[intval(code.charAt(i))][0];
  }

  // center guard bars
  result += "01010";

  // process right part
  for (i = 4; i < 8; i++) {
    result += encodingEAN[intval(code.charAt(i))][2];
  }

} else { // ean13
  // extract first digit and get sequence
  seq = firstEAN[intval(code.charAt(0))];

  // process left part
  for (i = 1; i < 7; i++) {
    result += encodingEAN[intval(code.charAt(i))][intval(seq.charAt(i - 1))];
  }

  // center guard bars
  result += "01010";

  // process right part
  for (i = 7; i < 13; i++) {
    result += encodingEAN[intval(code.charAt(i))][2];
  }
} // ean13

result += "101"; // stop

// addon 13+2 / 13+5
if (type === "ean13") {
  addon = fullcode.substring(13, fullcode.length);

  if (addon.length === 2) {
    result += "0000000000";
    // checksum addon
    checksum = parseInt(addon, 10) % 4;
    // binary encoding
    for (i = 0; i < 2; i++) {
      part_of_addon = intval(addon.charAt(i));
      a_or_b = intval(encodingEAN_addon2[intval(checksum)][i]);
      partialencoding = encodingEAN[part_of_addon][a_or_b];
      result += partialencoding;
    }
  } else if (addon.length === 5) {
    result += "0000000000";
    // checksum addon
    odd = true;
    x = y = 0;
    for (i = 0; i < 5; i++) {
      if (!odd) {
        x += intval(addon.charAt(i));
      } else {
        y += intval(addon.charAt(i));
      }
      odd = !odd;
    }
    checksum = ((9 * x) + (3 * y)) % 10;
    // binary encoding
    result += "1011"; // special delimiter

    for (i = 0; i < 5; i++) {
      part_of_addon = intval(addon.charAt(i));
      a_or_b = intval(encodingEAN_addon5[intval(checksum)][i]);
      partialencoding = encodingEAN[part_of_addon][a_or_b];
      result += partialencoding;

      // 01 separator
      if (i < 4) {
        result += "01";
      }
    }
  }
}
return result;

}
function computeEAN(code, type) {
var i,
len = type === “ean13” ? 12 : 7,
addon = code.substring(13, code.length),
sum = 0,
odd = true;
code = code.substring(0, len);
for (i = code.length - 1; i > -1; i–) {
sum += (odd ? 3 : 1) * intval(code.charAt(i));
odd = !odd;
}
return code + ((10 - sum % 10) % 10).toString() + (addon ? " " + addon : “”);
}

// * * * * * * * * * * * * * * * * * * * * * *
// upc
// * * * * * * * * * * * * * * * * * * * * * *

function getDigitUPC(code) {
if (code.length < 12) {
code = “0” + code;
}
return getDigitEAN(code, “ean13”);
}

function computeUPC(code) {
if (code.length < 12) {
code = “0” + code;
}
return computeEAN(code, “ean13”).substr(1);
}

// * * * * * * * * * * * * * * * * * * * * * *
// code 11
// * * * * * * * * * * * * * * * * * * * * * *

var encodingCode11 = [ “101011”, “1101011”, “1001011”, “1100101”,
“1011011”, “1101101”, “1001101”, “1010011”,
“1101001”, “110101”, “101101”];

function getDigitCode11(code) {
var c, k, i, index, weightC, weightSumC, weightK, weightSumK,
table = “0123456789-”,
intercharacter = “0”,
// start
result = “1011001” + intercharacter;

// digits
for (i = 0; i < code.length; i++) {
  index = table.indexOf(code.charAt(i));
  if (index < 0) {
    return "";
  }
  result += encodingCode11[index] + intercharacter;
}

// checksum
weightC    = 0;
weightSumC = 0;
weightK    = 1; // start at 1 because the right-most character is "C" checksum
weightSumK = 0;

for (i = code.length - 1; i >= 0; i--) {
  weightC = weightC === 10 ? 1 : weightC + 1;
  weightK = weightK === 10 ? 1 : weightK + 1;

  index = table.indexOf(code.charAt(i));

  weightSumC += weightC * index;
  weightSumK += weightK * index;
}

c = weightSumC % 11;
weightSumK += c;
k = weightSumK % 11;

result += encodingCode11[c] + intercharacter;

if (code.length >= 10) {
  result += encodingCode11[k] + intercharacter;
}

// stop
result  += "1011001";

return result;

}

// * * * * * * * * * * * * * * * * * * * * * *
// code 39
// * * * * * * * * * * * * * * * * * * * * * *

var encodingCode39 = [“101001101101”, “110100101011”, “101100101011”, “110110010101”,
“101001101011”, “110100110101”, “101100110101”, “101001011011”,
“110100101101”, “101100101101”, “110101001011”, “101101001011”,
“110110100101”, “101011001011”, “110101100101”, “101101100101”,
“101010011011”, “110101001101”, “101101001101”, “101011001101”,
“110101010011”, “101101010011”, “110110101001”, “101011010011”,
“110101101001”, “101101101001”, “101010110011”, “110101011001”,
“101101011001”, “101011011001”, “110010101011”, “100110101011”,
“110011010101”, “100101101011”, “110010110101”, “100110110101”,
“100101011011”, “110010101101”, “100110101101”, “100100100101”,
“100100101001”, “100101001001”, “101001001001”, “100101101101”];

function getDigitCode39(code) {
var i, index,
result = “”,
table = “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*”,
intercharacter = “0”;

if (code.indexOf("*") >= 0) {
  return "";
}

// Add Start and Stop charactere : *
code = ("*" + code + "*").toUpperCase();

for (i = 0; i < code.length; i++) {
  index = table.indexOf(code.charAt(i));
  if (index < 0) {
    return "";
  }
  if (i > 0) {
    result += intercharacter;
  }
  result += encodingCode39[index];
}
return result;

}

// * * * * * * * * * * * * * * * * * * * * * *
// code 93
// * * * * * * * * * * * * * * * * * * * * * *

var encodingCode93 = [“100010100”, “101001000”, “101000100”, “101000010”,
“100101000”, “100100100”, “100100010”, “101010000”,
“100010010”, “100001010”, “110101000”, “110100100”,
“110100010”, “110010100”, “110010010”, “110001010”,
“101101000”, “101100100”, “101100010”, “100110100”,
“100011010”, “101011000”, “101001100”, “101000110”,
“100101100”, “100010110”, “110110100”, “110110010”,
“110101100”, “110100110”, “110010110”, “110011010”,
“101101100”, “101100110”, “100110110”, “100111010”,
“100101110”, “111010100”, “111010010”, “111001010”,
“101101110”, “101110110”, “110101110”, “100100110”,
“111011010”, “111010110”, “100110010”, “101011110”];

function getDigitCode93(code, crc) {
var c, k, i, index, weightC, weightSumC, weightK, weightSumK,
table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. / + /+%____*", // _ => ( /+), (%), (/) et (+)
result = “”;

if (code.indexOf('*') >= 0) {
  return "";
}

code = code.toUpperCase();

// start :  *
result  += encodingCode93[47];

// digits
for (i = 0; i < code.length; i++) {
  c = code.charAt(i);
  index = table.indexOf(c);
  if ((c === '_') || (index < 0)) {
    return "";
  }
  result += encodingCode93[index];
}

// checksum
if (crc) {
  weightC    = 0;
  weightSumC = 0;
  weightK    = 1; // start at 1 because the right-most character is "C" checksum
  weightSumK = 0;
  for (i = code.length - 1; i >= 0; i--) {
    weightC = weightC === 20 ? 1 : weightC + 1;
    weightK = weightK === 15 ? 1 : weightK + 1;

    index = table.indexOf(code.charAt(i));

    weightSumC += weightC * index;
    weightSumK += weightK * index;
  }

  c = weightSumC % 47;
  weightSumK += c;
  k = weightSumK % 47;

  result += encodingCode93[c];
  result += encodingCode93[k];
}

// stop : *
result  += encodingCode93[47];

// Terminaison bar
result  += "1";
return result;

}

// * * * * * * * * * * * * * * * * * * * * * *
// code 128
// * * * * * * * * * * * * * * * * * * * * * *

var encodingCode128 = [“11011001100”, “11001101100”, “11001100110”, “10010011000”,
“10010001100”, “10001001100”, “10011001000”, “10011000100”,
“10001100100”, “11001001000”, “11001000100”, “11000100100”,
“10110011100”, “10011011100”, “10011001110”, “10111001100”,
“10011101100”, “10011100110”, “11001110010”, “11001011100”,
“11001001110”, “11011100100”, “11001110100”, “11101101110”,
“11101001100”, “11100101100”, “11100100110”, “11101100100”,
“11100110100”, “11100110010”, “11011011000”, “11011000110”,
“11000110110”, “10100011000”, “10001011000”, “10001000110”,
“10110001000”, “10001101000”, “10001100010”, “11010001000”,
“11000101000”, “11000100010”, “10110111000”, “10110001110”,
“10001101110”, “10111011000”, “10111000110”, “10001110110”,
“11101110110”, “11010001110”, “11000101110”, “11011101000”,
“11011100010”, “11011101110”, “11101011000”, “11101000110”,
“11100010110”, “11101101000”, “11101100010”, “11100011010”,
“11101111010”, “11001000010”, “11110001010”, “10100110000”,
“10100001100”, “10010110000”, “10010000110”, “10000101100”,
“10000100110”, “10110010000”, “10110000100”, “10011010000”,
“10011000010”, “10000110100”, “10000110010”, “11000010010”,
“11001010000”, “11110111010”, “11000010100”, “10001111010”,
“10100111100”, “10010111100”, “10010011110”, “10111100100”,
“10011110100”, “10011110010”, “11110100100”, “11110010100”,
“11110010010”, “11011011110”, “11011110110”, “11110110110”,
“10101111000”, “10100011110”, “10001011110”, “10111101000”,
“10111100010”, “11110101000”, “11110100010”, “10111011110”,
“10111101110”, “11101011110”, “11110101110”, “11010000100”,
“11010010000”, “11010011100”, “11000111010”];

function getDigitCode128(code) {
  var i, c, tableCActivated, result, sum,
    tableB = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
    isum = 0,
    j = 0,
    value = 0;

  // check each characters
  for (i = 0; i < code.length; i++) {
    if (tableB.indexOf(code.charAt(i)) === -1) {
      return "";
    }
  }

  // check firsts characters : start with C table only if enough numeric
  tableCActivated = code.length > 1;
  for (i = 0; i < 3 && i < code.length; i++) {
    c = code.charAt(i);
    tableCActivated = tableCActivated && c >= '0' && c <= '9';
  }


  sum = tableCActivated ? 105 : 104;

  // start : [105] : C table or [104] : B table
  result = encodingCode128[sum];

  i = 0;
  while (i < code.length) {
    if (!tableCActivated) {
      j = 0;
      // check next character to activate C table if interresting
      while ((i + j < code.length) && (code.charAt(i + j) >= '0') && (code.charAt(i + j) <= '9')) {
        j++;
      }

      // 6 min everywhere or 4 mini at the end
      tableCActivated = (j > 5) || ((i + j - 1 === code.length) && (j > 3));

      if (tableCActivated) {
        result += encodingCode128[99]; // C table
        sum += ++isum * 99;
      }
      //         2 min for table C so need table B
    } else if ((i === code.length) || (code.charAt(i) < '0') || (code.charAt(i) > '9') || (code.charAt(i + 1) < '0') || (code.charAt(i + 1) > '9')) {
      tableCActivated = false;
      result += encodingCode128[100]; // B table
      sum += ++isum * 100;
    }

    if (tableCActivated) {
      value = intval(code.charAt(i) + code.charAt(i + 1)); // Add two characters (numeric)
      i += 2;
    } else {
      value = tableB.indexOf(code.charAt(i)); // Add one character
      i += 1;
    }
    result  += encodingCode128[value];
    sum += ++isum * value;
  }

  // Add CRC
  result  += encodingCode128[sum % 103];

  // Stop
  result += encodingCode128[106];

  // Termination bar
  result += "11";

  return result;
}

// * * * * * * * * * * * * * * * * * * * * * *
// codabar
// * * * * * * * * * * * * * * * * * * * * * *

var encodingCodabar = [“101010011”, “101011001”, “101001011”, “110010101”,
“101101001”, “110101001”, “100101011”, “100101101”,
“100110101”, “110100101”, “101001101”, “101100101”,
“1101011011”, “1101101011”, “1101101101”, “1011011011”,
“1011001001”, “1010010011”, “1001001011”, “1010011001”];

function getDigitCodabar(code) {
var i, index, result,
intercharacter = “0”,
table = “0123456789-$:/.+”;

// add start : A->D : arbitrary choose A
result = encodingCodabar[16] + intercharacter;

for (i = 0; i < code.length; i++) {
  index = table.indexOf(code.charAt(i));
  if (index < 0) {
    return "";
  }
  result += encodingCodabar[index] + intercharacter;
}

// add stop : A->D : arbitrary choose A
result += encodingCodabar[16];
return result;

}

// * * * * * * * * * * * * * * * * * * * * * *
// msi
// * * * * * * * * * * * * * * * * * * * * * *

var encodingMsi = [“100100100100”, “100100100110”, “100100110100”, “100100110110”,
“100110100100”, “100110100110”, “100110110100”, “100110110110”,
“110100100100”, “110100100110”];

function computeMsi(code, crc) {
if (typeof crc === “object”) {
if (crc.crc1 === “mod10”) {
code = computeMod10Msi(code);
} else if (crc.crc1 === “mod11”) {
code = computeMod11Msi(code);
}
if (crc.crc2 === “mod10”) {
code = computeMod10Msi(code);
} else if (crc.crc2 === “mod11”) {
code = computeMod11Msi(code);
}
} else if (typeof crc === “boolean” && crc) {
code = computeMod10Msi(code);
}
return code;
}

function computeMod10Msi(code) {
var i, s1,
toPart1 = code.length % 2,
n1 = 0,
sum = 0;
for (i = 0; i < code.length; i++) {
if (toPart1) {
n1 = 10 * n1 + intval(code.charAt(i));
} else {
sum += intval(code.charAt(i));
}
toPart1 = !toPart1;
}
s1 = (2 * n1).toString();
for (i = 0; i < s1.length; i++) {
sum += intval(s1.charAt(i));
}
return code + ((10 - sum % 10) % 10).toString();
}

function computeMod11Msi(code) {
var i, sum = 0, weight = 2;
for (i = code.length - 1; i >= 0; i–) {
sum += weight * intval(code.charAt(i));
weight = weight === 7 ? 2 : weight + 1;
}
return code + ((11 - sum % 11) % 11).toString();
}

function getDigitMsi(code) {
var i,
table = “0123456789”,
index = 0,
result = “110”; // start

code = computeMsi(code, false);

// digits
for (i = 0; i < code.length; i++) {
  index = table.indexOf(code.charAt(i));
  if (index < 0) {
    return "";
  }
  result += encodingMsi[index];
}

// stop
result += "1001";

return result;

}

// * * * * * * * * * * * * * * * * * * * * * *
// datamatrix
// * * * * * * * * * * * * * * * * * * * * * *

var getDigitDatamatrix = (function () {
var lengthRows = [ 10, 12, 14, 16, 18, 20, 22, 24, 26, // 24 squares et 6 rectangular
32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144,
8, 8, 12, 12, 16, 16],
lengthCols = [ 10, 12, 14, 16, 18, 20, 22, 24, 26, // Number of columns for the entire datamatrix
32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144,
18, 32, 26, 36, 36, 48],
dataCWCount = [ 3, 5, 8, 12, 18, 22, 30, 36, // Number of data codewords for the datamatrix
44, 62, 86, 114, 144, 174, 204, 280, 368, 456, 576, 696, 816, 1050,
1304, 1558, 5, 10, 16, 22, 32, 49],
solomonCWCount = [ 5, 7, 10, 12, 14, 18, 20, 24, 28, // Number of Reed-Solomon codewords for the datamatrix
36, 42, 48, 56, 68, 84, 112, 144, 192, 224, 272, 336, 408, 496, 620,
7, 11, 14, 18, 24, 28],
dataRegionRows = [ 8, 10, 12, 14, 16, 18, 20, 22, // Number of rows per region
24, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 18, 20, 22,
6, 6, 10, 10, 14, 14],
dataRegionCols = [ 8, 10, 12, 14, 16, 18, 20, 22, // Number of columns per region
24, 14, 16, 18, 20, 22, 24, 14, 16, 18, 20, 22, 24, 18, 20, 22,
16, 14, 24, 16, 16, 22],
regionRows = [ 1, 1, 1, 1, 1, 1, 1, 1, // Number of regions per row
1, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 6, 6, 6,
1, 1, 1, 1, 1, 1],
regionCols = [ 1, 1, 1, 1, 1, 1, 1, 1, // Number of regions per column
1, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 6, 6, 6,
1, 2, 1, 2, 2, 2],
interleavedBlocks = [1, 1, 1, 1, 1, 1, 1, 1, // Number of blocks
1, 1, 1, 1, 1, 1, 2, 2, 4, 4, 4, 4, 6, 6, 8, 8,
1, 1, 1, 1, 1, 1],
logTab = [ -255, 255, 1, 240, 2, 225, 241, 53, 3, // Table of log for the Galois field
38, 226, 133, 242, 43, 54, 210, 4, 195, 39, 114, 227, 106, 134, 28,
243, 140, 44, 23, 55, 118, 211, 234, 5, 219, 196, 96, 40, 222, 115,
103, 228, 78, 107, 125, 135, 8, 29, 162, 244, 186, 141, 180, 45, 99,
24, 49, 56, 13, 119, 153, 212, 199, 235, 91, 6, 76, 220, 217, 197,
11, 97, 184, 41, 36, 223, 253, 116, 138, 104, 193, 229, 86, 79, 171,
108, 165, 126, 145, 136, 34, 9, 74, 30, 32, 163, 84, 245, 173, 187,
204, 142, 81, 181, 190, 46, 88, 100, 159, 25, 231, 50, 207, 57, 147,
14, 67, 120, 128, 154, 248, 213, 167, 200, 63, 236, 110, 92, 176, 7,
161, 77, 124, 221, 102, 218, 95, 198, 90, 12, 152, 98, 48, 185, 179,
42, 209, 37, 132, 224, 52, 254, 239, 117, 233, 139, 22, 105, 27, 194,
113, 230, 206, 87, 158, 80, 189, 172, 203, 109, 175, 166, 62, 127,
247, 146, 66, 137, 192, 35, 252, 10, 183, 75, 216, 31, 83, 33, 73,
164, 144, 85, 170, 246, 65, 174, 61, 188, 202, 205, 157, 143, 169, 82,
72, 182, 215, 191, 251, 47, 178, 89, 151, 101, 94, 160, 123, 26, 112,
232, 21, 51, 238, 208, 131, 58, 69, 148, 18, 15, 16, 68, 17, 121, 149,
129, 19, 155, 59, 249, 70, 214, 250, 168, 71, 201, 156, 64, 60, 237,
130, 111, 20, 93, 122, 177, 150],
aLogTab = [ 1, 2, 4, 8, 16, 32, 64, 128, 45, 90, // Table of aLog for the Galois field
180, 69, 138, 57, 114, 228, 229, 231, 227, 235, 251, 219, 155, 27, 54,
108, 216, 157, 23, 46, 92, 184, 93, 186, 89, 178, 73, 146, 9, 18, 36,
72, 144, 13, 26, 52, 104, 208, 141, 55, 110, 220, 149, 7, 14, 28, 56,
112, 224, 237, 247, 195, 171, 123, 246, 193, 175, 115, 230, 225, 239,
243, 203, 187, 91, 182, 65, 130, 41, 82, 164, 101, 202, 185, 95, 190,
81, 162, 105, 210, 137, 63, 126, 252, 213, 135, 35, 70, 140, 53, 106,
212, 133, 39, 78, 156, 21, 42, 84, 168, 125, 250, 217, 159, 19, 38, 76,
152, 29, 58, 116, 232, 253, 215, 131, 43, 86, 172, 117, 234, 249, 223,
147, 11, 22, 44, 88, 176, 77, 154, 25, 50, 100, 200, 189, 87, 174, 113,
226, 233, 255, 211, 139, 59, 118, 236, 245, 199, 163, 107, 214, 129,
47, 94, 188, 85, 170, 121, 242, 201, 191, 83, 166, 97, 194, 169, 127,
254, 209, 143, 51, 102, 204, 181, 71, 142, 49, 98, 196, 165, 103, 206,
177, 79, 158, 17, 34, 68, 136, 61, 122, 244, 197, 167, 99, 198, 161,
111, 222, 145, 15, 30, 60, 120, 240, 205, 183, 67, 134, 33, 66, 132,
37, 74, 148, 5, 10, 20, 40, 80, 160, 109, 218, 153, 31, 62, 124, 248,
221, 151, 3, 6, 12, 24, 48, 96, 192, 173, 119, 238, 241, 207, 179, 75,
150, 1];

function champGaloisMult(a, b) {  // MULTIPLICATION IN GALOIS FIELD GF(2^8)
  if (!a || !b) {
    return 0;
  }
  return aLogTab[(logTab[a] + logTab[b]) % 255];
}

function champGaloisDoub(a, b) {  // THE OPERATION a * 2^b IN GALOIS FIELD GF(2^8)
  if (!a) {
    return 0;
  }
  if (!b) {
    return a;
  }
  return aLogTab[(logTab[a] + b) % 255];
}

function champGaloisSum(a, b) { // SUM IN GALOIS FIELD GF(2^8)
  return a ^ b;
}

function selectIndex(dataCodeWordsCount, rectangular) { // CHOOSE THE GOOD INDEX FOR TABLES
  var n = 0;
  if ((dataCodeWordsCount < 1 || dataCodeWordsCount > 1558) && !rectangular) {
    return -1;
  }
  if ((dataCodeWordsCount < 1 || dataCodeWordsCount > 49) && rectangular) {
    return -1;
  }
  if (rectangular) {
    n = 24;
  }

  while (dataCWCount[n] < dataCodeWordsCount) {
    n++;
  }
  return n;
}

function encodeDataCodeWordsASCII(text) {
  var i, c,
    dataCodeWords = [],
    n = 0;
  for (i = 0; i < text.length; i++) {
    c = text.charCodeAt(i);
    if (c > 127) {
      dataCodeWords[n] = 235;
      c = c - 127;
      n++;
    } else if ((c >= 48 && c <= 57) && (i + 1 < text.length) && (text.charCodeAt(i + 1) >= 48 && text.charCodeAt(i + 1) <= 57)) {
      c = ((c - 48) * 10) + ((text.charCodeAt(i + 1)) - 48);
      c += 130;
      i++;
    } else {
      c++;
    }
    dataCodeWords[n] = c;
    n++;
  }
  return dataCodeWords;
}

function addPadCW(tab, from, to) {
  var r, i;
  if (from >= to) {
    return;
  }
  tab[from] = 129;
  for (i = from + 1; i < to; i++) {
    r = ((149 * (i + 1)) % 253) + 1;
    tab[i] = (129 + r) % 254;
  }
}

function calculSolFactorTable(aSolomonCWCount) { // CALCULATE THE REED SOLOMON FACTORS
  var i, j,
    g = [];

  for (i = 0; i <= aSolomonCWCount; i++) {
    g[i] = 1;
  }

  for (i = 1; i <= aSolomonCWCount; i++) {
    for (j = i - 1; j >= 0; j--) {
      g[j] = champGaloisDoub(g[j], i);
      if (j > 0) {
        g[j] = champGaloisSum(g[j], g[j - 1]);
      }
    }
  }
  return g;
}

function addReedSolomonCW(nSolomonCW, coeffTab, nDataCW, dataTab, blocks) { // Add the Reed Solomon codewords
  var i, j, k,
    temp = 0,
    errorBlocks = nSolomonCW / blocks,
    correctionCW = [];
  for (k = 0; k < blocks; k++) {
    for (i = 0; i < errorBlocks; i++) {
      correctionCW[i] = 0;
    }

    for (i = k; i < nDataCW; i += blocks) {
      temp = champGaloisSum(dataTab[i], correctionCW[errorBlocks - 1]);
      for (j = errorBlocks - 1; j >= 0; j--) {

        correctionCW[j] = temp ? champGaloisMult(temp, coeffTab[j]) : 0;
        if (j > 0) {
          correctionCW[j] = champGaloisSum(correctionCW[j - 1], correctionCW[j]);
        }
      }
    }
    // Renversement des blocs calcules
    j = nDataCW + k;
    for (i = errorBlocks - 1; i >= 0; i--) {
      dataTab[j] = correctionCW[i];
      j += blocks;
    }
  }
  return dataTab;
}

function getBits(entier) { // Transform integer to tab of bits
  var i,
    bits = [];
  for (i = 0; i < 8; i++) {
    bits[i] = entier & (128 >> i) ? 1 : 0;
  }
  return bits;
}

function next(etape, totalRows, totalCols, codeWordsBits, datamatrix, assigned) { // Place codewords into the matrix
  var chr = 0, // Place of the 8st bit from the first character to [4][0]
    row = 4,
    col = 0;

  do {
    // Check for a special case of corner
    if ((row === totalRows) && !col) {
      patternShapeSpecial1(datamatrix, assigned, codeWordsBits[chr], totalRows, totalCols);
      chr++;
    } else if ((etape < 3) && (row === totalRows - 2) && !col && (totalCols % 4)) {
      patternShapeSpecial2(datamatrix, assigned, codeWordsBits[chr], totalRows, totalCols);
      chr++;
    } else if ((row === totalRows - 2) && !col && (totalCols % 8 === 4)) {
      patternShapeSpecial3(datamatrix, assigned, codeWordsBits[chr], totalRows, totalCols);
      chr++;
    } else if ((row === totalRows + 4) && (col === 2) && (totalCols % 8 === 0)) {
      patternShapeSpecial4(datamatrix, assigned, codeWordsBits[chr], totalRows, totalCols);
      chr++;
    }

    // Go up and right in the datamatrix
    do {
      if ((row < totalRows) && (col >= 0) && (assigned[row][col] !== 1)) {
        patternShapeStandard(datamatrix, assigned, codeWordsBits[chr], row, col, totalRows, totalCols);
        chr++;
      }
      row -= 2;
      col += 2;
    } while ((row >= 0) && (col < totalCols));
    row += 1;
    col += 3;

    // Go down and left in the datamatrix
    do {
      if ((row >= 0) && (col < totalCols) && (assigned[row][col] !== 1)) {
        patternShapeStandard(datamatrix, assigned, codeWordsBits[chr], row, col, totalRows, totalCols);
        chr++;
      }
      row += 2;
      col -= 2;
    } while ((row < totalRows) && (col >= 0));
    row += 3;
    col += 1;
  } while ((row < totalRows) || (col < totalCols));
}

function patternShapeStandard(datamatrix, assigned, bits, row, col, totalRows, totalCols) { // Place bits in the matrix (standard or special case)
  var f = placeBitInDatamatrix;
  f(datamatrix, assigned, bits[0], row - 2, col - 2, totalRows, totalCols);
  f(datamatrix, assigned, bits[1], row - 2, col - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[2], row - 1, col - 2, totalRows, totalCols);
  f(datamatrix, assigned, bits[3], row - 1, col - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[4], row - 1, col, totalRows, totalCols);
  f(datamatrix, assigned, bits[5], row, col - 2, totalRows, totalCols);
  f(datamatrix, assigned, bits[6], row, col - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[7], row,  col, totalRows, totalCols);
}

function patternShapeSpecial1(datamatrix, assigned, bits, totalRows, totalCols) {
  var f = placeBitInDatamatrix;
  f(datamatrix, assigned, bits[0], totalRows - 1,  0, totalRows, totalCols);
  f(datamatrix, assigned, bits[1], totalRows - 1,  1, totalRows, totalCols);
  f(datamatrix, assigned, bits[2], totalRows - 1,  2, totalRows, totalCols);
  f(datamatrix, assigned, bits[3], 0, totalCols - 2, totalRows, totalCols);
  f(datamatrix, assigned, bits[4], 0, totalCols - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[5], 1, totalCols - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[6], 2, totalCols - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[7], 3, totalCols - 1, totalRows, totalCols);
}

function patternShapeSpecial2(datamatrix, assigned, bits, totalRows, totalCols) {
  var f = placeBitInDatamatrix;
  f(datamatrix, assigned, bits[0], totalRows - 3,  0, totalRows, totalCols);
  f(datamatrix, assigned, bits[1], totalRows - 2,  0, totalRows, totalCols);
  f(datamatrix, assigned, bits[2], totalRows - 1,  0, totalRows, totalCols);
  f(datamatrix, assigned, bits[3], 0, totalCols - 4, totalRows, totalCols);
  f(datamatrix, assigned, bits[4], 0, totalCols - 3, totalRows, totalCols);
  f(datamatrix, assigned, bits[5], 0, totalCols - 2, totalRows, totalCols);
  f(datamatrix, assigned, bits[6], 0, totalCols - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[7], 1, totalCols - 1, totalRows, totalCols);
}

function patternShapeSpecial3(datamatrix, assigned, bits, totalRows, totalCols) {
  var f = placeBitInDatamatrix;
  f(datamatrix, assigned, bits[0], totalRows - 3,  0, totalRows, totalCols);
  f(datamatrix, assigned, bits[1], totalRows - 2,  0, totalRows, totalCols);
  f(datamatrix, assigned, bits[2], totalRows - 1,  0, totalRows, totalCols);
  f(datamatrix, assigned, bits[3], 0, totalCols - 2, totalRows, totalCols);
  f(datamatrix, assigned, bits[4], 0, totalCols - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[5], 1, totalCols - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[6], 2, totalCols - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[7], 3, totalCols - 1, totalRows, totalCols);
}

function patternShapeSpecial4(datamatrix, assigned, bits, totalRows, totalCols) {
  var f = placeBitInDatamatrix;
  f(datamatrix, assigned, bits[0], totalRows - 1,  0, totalRows, totalCols);
  f(datamatrix, assigned, bits[1], totalRows - 1, totalCols - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[2], 0, totalCols - 3, totalRows, totalCols);
  f(datamatrix, assigned, bits[3], 0, totalCols - 2, totalRows, totalCols);
  f(datamatrix, assigned, bits[4], 0, totalCols - 1, totalRows, totalCols);
  f(datamatrix, assigned, bits[5], 1, totalCols - 3, totalRows, totalCols);
  f(datamatrix, assigned, bits[6], 1, totalCols - 2, totalRows, totalCols);
  f(datamatrix, assigned, bits[7], 1, totalCols - 1, totalRows, totalCols);
}

function placeBitInDatamatrix(datamatrix, assigned, bit, row, col, totalRows, totalCols) { // Put a bit into the matrix
  if (row < 0) {
    row += totalRows;
    col += 4 - ((totalRows + 4) % 8);
  }
  if (col < 0) {
    col += totalCols;
    row += 4 - ((totalCols + 4) % 8);
  }
  if (assigned[row][col] !== 1) {
    datamatrix[row][col] = bit;
    assigned[row][col] = 1;
  }
}

function addFinderPattern(datamatrix, rowsRegion, colsRegion, rowsRegionCW, colsRegionCW) { // Add the finder pattern
  var i, j,
    totalRowsCW = (rowsRegionCW + 2) * rowsRegion,
    totalColsCW = (colsRegionCW + 2) * colsRegion,
    datamatrixTemp = [];
  datamatrixTemp[0] = [];
  for (j = 0; j < totalColsCW + 2; j++) {
    datamatrixTemp[0][j] = 0;
  }
  for (i = 0; i < totalRowsCW; i++) {
    datamatrixTemp[i + 1] = [];
    datamatrixTemp[i + 1][0] = 0;
    datamatrixTemp[i + 1][totalColsCW + 1] = 0;
    for (j = 0; j < totalColsCW; j++) {
      if (i % (rowsRegionCW + 2) === 0) {
        if (j % 2) {
          datamatrixTemp[i + 1][j + 1] = 0;
        } else {
          datamatrixTemp[i + 1][j + 1] = 1;
        }
      } else if (i % (rowsRegionCW + 2) === rowsRegionCW + 1) {
        datamatrixTemp[i + 1][j + 1] = 1;
      } else if (j % (colsRegionCW + 2) === colsRegionCW + 1) {
        if (i % 2) {
          datamatrixTemp[i + 1][j + 1] = 1;
        } else {
          datamatrixTemp[i + 1][j + 1] = 0;
        }
      } else if (j % (colsRegionCW + 2) === 0) {
        datamatrixTemp[i + 1][j + 1] = 1;
      } else {
        datamatrixTemp[i + 1][j + 1] = 0;
        datamatrixTemp[i + 1][j + 1] = datamatrix[i - 1 - (2 * (parseInt(i / (rowsRegionCW + 2), 10)))][j - 1 - (2 * (parseInt(j / (colsRegionCW + 2), 10)))];
      }
    }
  }
  datamatrixTemp[totalRowsCW + 1] = [];
  for (j = 0; j < totalColsCW + 2; j++) {
    datamatrixTemp[totalRowsCW + 1][j] = 0;
  }
  return datamatrixTemp;
}

return function (text, rectangular) {
  var i, g,
    dataCodeWords = encodeDataCodeWordsASCII(text), // Code the text in the ASCII mode
    aDataCWCount = dataCodeWords.length,
    index = selectIndex(aDataCWCount, rectangular), // Select the index for the data tables
    totalDataCWCount = dataCWCount[index], // Number of data CW
    aSolomonCWCount = solomonCWCount[index], // Number of Reed Solomon CW
    totalCWCount = totalDataCWCount + aSolomonCWCount, // Number of CW
    rowsTotal = lengthRows[index], // Size of symbol
    colsTotal = lengthCols[index],
    rowsRegion = regionRows[index], // Number of region
    colsRegion = regionCols[index],
    rowsRegionCW = dataRegionRows[index],
    colsRegionCW = dataRegionCols[index],
    rowsLengthMatrice = rowsTotal - 2 * rowsRegion, // Size of matrice data
    colsLengthMatrice = colsTotal - 2 * colsRegion,
    blocks = interleavedBlocks[index],  // Number of Reed Solomon blocks
    errorBlocks = (aSolomonCWCount / blocks),
    codeWordsBits = [], // Calculte bits from codewords
    datamatrix = [], // Put data in the matrix
    assigned = [];

  addPadCW(dataCodeWords, aDataCWCount, totalDataCWCount); // Add codewords pads

  g = calculSolFactorTable(errorBlocks); // Calculate correction coefficients

  addReedSolomonCW(aSolomonCWCount, g, totalDataCWCount, dataCodeWords, blocks); // Add Reed Solomon codewords

  for (i = 0; i < totalCWCount; i++) {
    codeWordsBits[i] = getBits(dataCodeWords[i]);
  }

  for (i = 0; i < colsLengthMatrice; i++) {
    datamatrix[i] = [];
    assigned[i] = [];
  }

  // Add the bottom-right corner if needed
  if (((rowsLengthMatrice * colsLengthMatrice) % 8) === 4) {
    datamatrix[rowsLengthMatrice - 2][colsLengthMatrice - 2] = 1;
    datamatrix[rowsLengthMatrice - 1][colsLengthMatrice - 1] = 1;
    datamatrix[rowsLengthMatrice - 1][colsLengthMatrice - 2] = 0;
    datamatrix[rowsLengthMatrice - 2][colsLengthMatrice - 1] = 0;
    assigned[rowsLengthMatrice - 2][colsLengthMatrice - 2] = 1;
    assigned[rowsLengthMatrice - 1][colsLengthMatrice - 1] = 1;
    assigned[rowsLengthMatrice - 1][colsLengthMatrice - 2] = 1;
    assigned[rowsLengthMatrice - 2][colsLengthMatrice - 1] = 1;
  }

  // Put the codewords into the matrix
  next(0, rowsLengthMatrice, colsLengthMatrice, codeWordsBits, datamatrix, assigned);

  // Add the finder pattern
  datamatrix = addFinderPattern(datamatrix, rowsRegion, colsRegion, rowsRegionCW, colsRegionCW);

  return datamatrix;
}

})();

// * * * * * * * * * * * * * * * * * * * * * *
// tools
// * * * * * * * * * * * * * * * * * * * * * *

function intval(val) {
var type = typeof val;
if (type === “string”) {
val = val.replace(/[^0-9-.]/g, “”);
val = parseInt(val * 1, 10);
return isNaN(val) || !isFinite(val) ? 0 : val;
}
return type === “number” && isFinite(val) ? Math.floor(val) : 0;
}

// lec tools - (little endian convertor tools)
// convert an int
function lecCInt(value, byteCount) {
var i,
le = “”;
for (i = 0; i < byteCount; i++) {
le += String.fromCharCode(value & 0xFF);
value = value >> 8;
}
return le;
}

// return a byte string from rgb values
function lecCRgb(r, g, b) {
return String.fromCharCode(b) + String.fromCharCode(g) + String.fromCharCode®;
}

// return a byte string from a hex string color
function lecCHexColor(hex) {
var g, r,
v = parseInt(“0x” + hex.substr(1), 16),
b = v & 0xFF;
v = v >> 8;
g = v & 0xFF;
r = v >> 8;
return (lecCRgb(r, g, b));
}

function hexToRGB(hex) {
var g, r,
v = parseInt(“0x” + hex.substr(1), 16),
b = v & 0xFF;
v = v >> 8;
g = v & 0xFF;
r = v >> 8;
return ({r: r, g: g, b: b});
}

// test if a string is a hexa string color (like #FF0000)
function isHexColor(value) {
return value.match(/#[0-91-F]/gi);
}

// encode data in base64
function base64Encode(value) {
var c1, c2, c3, b1, b2, b3, b4,
r = ‘’,
k = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=”,
i = 0;
while (i < value.length) {
c1 = value.charCodeAt(i++);
c2 = value.charCodeAt(i++);
c3 = value.charCodeAt(i++);
b1 = c1 >> 2;
b2 = ((c1 & 3) << 4) | (c2 >> 4);
b3 = ((c2 & 15) << 2) | (c3 >> 6);
b4 = c3 & 63;
if (isNaN(c2)) {
b3 = b4 = 64;
} else if (isNaN(c3)) {
b4 = 64;
}
r += k.charAt(b1) + k.charAt(b2) + k.charAt(b3) + k.charAt(b4);
}
return r;
}

// convert a bit string to an array of array of bit char
function bitStringTo2DArray(digit) {
var i,
d = [];
d[0] = [];
for (i = 0; i < digit.length; i++) {
d[0][i] = parseInt(digit.charAt(i), 10);
}
return d;
}

// clear jQuery Target
function resize($container, w) {
$container
.css(“padding”, “0”)
.css(“overflow”, “auto”)
.css(“width”, w + “px”)
.html("");
return $container;
}

// * * * * * * * * * * * * * * * * * * * * * *
// Raw Renderer functions
// * * * * * * * * * * * * * * * * * * * * * *

// bmp barcode renderer
function digitToBmpRenderer($container, settings, digit, hri, mw, mh) {
var i, y, x, k, padding, dataLen, bmp, line, object,
lines = digit.length,
columns = digit[0].length,
c0 = isHexColor(settings.bgColor) ? lecCHexColor(settings.bgColor) : lecCRgb(255, 255, 255),
c1 = isHexColor(settings.color) ? lecCHexColor(settings.color) : lecCRgb(0, 0, 0),
bar0 = “”,
bar1 = “”,
pad = “”;

// create one bar 0 and 1 of "mw" byte length
for (i = 0; i < mw; i++) {
  bar0 += c0;
  bar1 += c1;
}

padding = (4 - ((mw * columns * 3) % 4)) % 4; // Padding for 4 byte alignment ("* 3" come from "3 byte to color R, G and B")
dataLen = (mw * columns + padding) * mh * lines;

for (i = 0; i < padding; i++) {
  pad += '\0';
}

// Bitmap header
bmp = 'BM' +                        // Magic Number
  lecCInt(54 + dataLen, 4) +  // Size of Bitmap size (header size + data len)
  '\0\0\0\0' +                      // Unused
  lecCInt(54, 4) +            // The offset where the bitmap data (pixels) can be found
  lecCInt(40, 4) +            // The number of bytes in the header (from this point).
  lecCInt(mw * columns, 4) +  // width
  lecCInt(mh * lines, 4) +    // height
  lecCInt(1, 2) +             // Number of color planes being used
  lecCInt(24, 2) +            // The number of bits/pixel
  '\0\0\0\0' +                      // BI_RGB, No compression used
  lecCInt(dataLen, 4) +       // The size of the raw BMP data (after this header)
  lecCInt(2835, 4) +          // The horizontal resolution of the image (pixels/meter)
  lecCInt(2835, 4) +          // The vertical resolution of the image (pixels/meter)
  lecCInt(0, 4) +             // Number of colors in the palette
  lecCInt(0, 4);              // Means all colors are important
// Bitmap Data
for (y = lines - 1; y >= 0; y--) {
  line = "";
  for (x = 0; x < columns; x++) {
    line += digit[y][x] ? bar1 : bar0;
  }
  line += pad;
  for (k = 0; k < mh; k++) {
    bmp += line;
  }
}
// set bmp image to the container
object = document.createElement("object");
object.setAttribute("type", "image/bmp");
object.setAttribute("data", "data:image/bmp;base64," + base64Encode(bmp));
resize($container, mw * columns + padding).append(object);

}

// css barcode renderer
function digitToCssRenderer(KaTeX parse error: Can't use function '\"' in math mode at position 178: … = "<div style=\̲"̲float: left; fo…container, mw * columns).html(content);
}

// svg barcode renderer
function digitToSvgRenderer($container, settings, digit, hri, mw, mh) {
var x, y, fontSize, svg, bar1, len, current, object,
lines = digit.length,
columns = digit[0].length,
width = mw * columns,
height = mh * lines;

if (settings.showHRI) {
  fontSize = intval(settings.fontSize);
  height += intval(settings.marginHRI) + fontSize;
}

// svg header
svg = '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="' + width + '" height="' + height + '">';

// background
svg += '<rect width="' +  width + '" height="' + height + '" x="0" y="0" fill="' + settings.bgColor + '" />';

bar1 = '<rect width="&W" height="' + mh + '" x="&X" y="&Y" fill="' + settings.color + '" />';

for (y = 0; y < lines; y++) {
  len = 0;
  current = digit[y][0];
  for (x = 0; x < columns; x++) {
    if (current === digit[y][x]) {
      len++;
    } else {
      if (current) {
        svg += bar1.replace("&W", len * mw).replace("&X", (x - len) * mw).replace("&Y", y * mh);
      }
      current = digit[y][x];
      len = 1;
    }
  }
  if (len && current) {
    svg += bar1.replace("&W", len * mw).replace("&X", (columns - len) * mw).replace("&Y", y * mh);
  }
}

if (settings.showHRI) {
  svg += '<g transform="translate(' + Math.floor(width / 2) + ' 0)">';
  svg += '<text y="' + (height - Math.floor(fontSize / 2)) + '" text-anchor="middle" style="font-family: Arial; font-size: ' + fontSize + 'px;" fill="' + settings.color + '">' + hri + '</text>';
  svg += '</g>';
}
// svg footer
svg += '</svg>';

// create a dom object, flush container and add object to the container

object = document.createElement('img');
object.setAttribute('src', 'data:image/svg+xml;base64,'+ base64Encode(svg));
resize($container, width).append(object);

}

// canvas barcode renderer
function digitToCanvasRenderer($container, settings, digit, hri, xi, yi, mw, mh) {
var x, y, ctx, len, current, dim,
canvas = $container.get(0),
lines = digit.length,
columns = digit[0].length;

if (!canvas || !canvas.getContext) {
  return; // not compatible
}

ctx = canvas.getContext("2d");
ctx.lineWidth = 1;
ctx.lineCap = "butt";
ctx.fillStyle = settings.bgColor;
ctx.fillRect(xi, yi, columns * mw, lines * mh);

ctx.fillStyle = settings.color;

for (y = 0; y < lines; y++) {
  len = 0;
  current = digit[y][0];
  for (x = 0; x < columns; x++) {
    if (current === digit[y][x]) {
      len++;
    } else {
      if (current) {
        ctx.fillRect(xi + (x - len) * mw, yi + y * mh, mw * len, mh);
      }
      current = digit[y][x];
      len = 1;
    }
  }
  if (len && current) {
    ctx.fillRect(xi + (columns - len) * mw, yi + y * mh, mw * len, mh);
  }
}
if (settings.showHRI) {
  dim = ctx.measureText(hri);
  ctx.fillText(hri, xi + Math.floor((columns * mw - dim.width) / 2), yi + lines * mh + settings.fontSize + settings.marginHRI);
}

}

// * * * * * * * * * * * * * * * * * * * * * *
// Renderer
// * * * * * * * * * * * * * * * * * * * * * *

var renderer = {};

// bmp 1D barcode renderer
renderer.bmp = function (KaTeX parse error: Expected '}', got 'EOF' at end of input: …tToBmpRenderer(container, settings, bitStringTo2DArray(digit), hri, w, h);
};

// bmp 2D barcode renderer
renderer.bmp2 = function (KaTeX parse error: Expected '}', got 'EOF' at end of input: …tToBmpRenderer(container, settings, digit, hri, s, s);
};

// css 1D barcode renderer
renderer.css = function (KaTeX parse error: Expected '}', got 'EOF' at end of input: …tToCssRenderer(container, settings, bitStringTo2DArray(digit), hri, w, h);
};

// css 2D barcode renderer
renderer.css2 = function (KaTeX parse error: Expected '}', got 'EOF' at end of input: …tToCssRenderer(container, settings, digit, hri, s, s);
};

// svg 1D barcode renderer
renderer.svg = function (KaTeX parse error: Expected '}', got 'EOF' at end of input: …tToSvgRenderer(container, settings, bitStringTo2DArray(digit), hri, w, h);
};

// svg 2D barcode renderer
renderer.svg2 = function (KaTeX parse error: Expected '}', got 'EOF' at end of input: …tToSvgRenderer(container, settings, digit, hri, s, s);
};

// canvas 1D barcode renderer
renderer.canvas = function (KaTeX parse error: Expected '}', got 'EOF' at end of input: …CanvasRenderer(container, settings, bitStringTo2DArray(digit), hri, x, y, w, h);
};

// canvas 2D barcode renderer
renderer.canvas2 = function (KaTeX parse error: Expected '}', got 'EOF' at end of input: …CanvasRenderer(container, settings, digit, hri, x, y, s, s);
};

$.fn.barcode = function (data, type, settings) {
var code, crc, rect, fn,
digit = “”,
hri = “”,
b2d = false;

data = $.extend({crc: true, rect: false}, typeof data === "object" ? data : {code: data});

code  = data.code;
crc   = data.crc;
rect  = data.rect;

if (code) {
  settings = $.extend(true, defaultSettings, settings);

  switch (type) {
  case "std25":
  case "int25":
    digit = getDigitI25(code, crc, type);
    hri = getDigitI25(code, crc, type);
    break;
  case "ean8":
  case "ean13":
    digit = getDigitEAN(code, type);
    hri = computeEAN(code, type);
    break;
  case "upc":
    digit = getDigitUPC(code);
    hri = computeUPC(code);
    break;
  case "code11":
    digit = getDigitCode11(code);
    hri = code;
    break;
  case "code39":
    digit = getDigitCode39(code);
    hri = code;
    break;
  case "code93":
    digit = getDigitCode93(code, crc);
    hri = code;
    break;
  case "code128":
    digit = getDigitCode128(code);
    hri = code;
    break;
  case "codabar":
    digit = getDigitCodabar(code);
    hri = code;
    break;
  case "msi":
    digit = getDigitMsi(code);
    hri = computeMsi(code, crc);
    break;
  case "datamatrix":
    digit = getDigitDatamatrix(code, rect);
    hri = code;
    b2d = true;
    break;
  }
  if (digit.length) {
    // Quiet Zone
    if (!b2d && settings.addQuietZone) {
      digit = "0000000000" + digit + "0000000000";
    }

    fn = renderer[settings.output + (b2d ? '2' : '')];
    if (fn) {
      this.each(function () {
        fn($(this), settings, digit, hri);
      });
    }
  }
}
return this;

};

}(jQuery));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值