using System;
using System.Text;
using System.Drawing;
using FastReport.Utils;
namespace FastReport.Barcode
{
///
/// Generates the UPC E0 barcode.
///
public class BarcodeUPC_E0 : BarcodeEAN
{
// UPC E Parity Pattern Table , Number System 0
internal static string[,] tabelle_UPC_E0 = {
{"E", "E", "E", "o", "o", "o" }, // 0
{"E", "E", "o", "E", "o", "o" }, // 1
{"E", "E", "o", "o", "E", "o" }, // 2
{"E", "E", "o", "o", "o", "E" }, // 3
{"E", "o", "E", "E", "o", "o" }, // 4
{"E", "o", "o", "E", "E", "o" }, // 5
{"E", "o", "o", "o", "E", "E" }, // 6
{"E", "o", "E", "o", "E", "o" }, // 7
{"E", "o", "E", "o", "o", "E" }, // 8
{"E", "o", "o", "E", "o", "E" } // 9
};
internal override void DrawText(IGraphics g, string barData)
{
DrawString(g, -8, -2, "0", true);
// parts of pattern: 3 + 24 + 6
float x1 = GetWidth(pattern.Substring(0, 3));
float x2 = GetWidth(pattern.Substring(0, 3 + 24));
DrawString(g, x1, x2, barData.Substring(0, 6));
x1 = GetWidth(pattern) + 1;
x2 = x1 + 7;
DrawString(g, x1, x2, barData.Substring(6, 1), true);
}
internal override string GetPattern()
{
text = DoCheckSumming(text, 7);
int c = CharToInt(text[6]);
// Startcode
string result = "A0A";
for (int i = 0; i <= 5; i++)
{
if (tabelle_UPC_E0[c, i] == "E")
{
for (int j = 0; j <= 3; j++)
result += tabelle_EAN_C[CharToInt(text[i])][3 - j];
}
else
result += tabelle_EAN_A[CharToInt(text[i])];
}
// Stopcode
result += "0A0A0A";
return result;
}
///
/// Initializes a new instance of the class with default settings.
///
public BarcodeUPC_E0()
{
extra1 = 8;
extra2 = 8;
}
}
///
/// Generates the UPC E1 barcode.
///
public class BarcodeUPC_E1 : BarcodeUPC_E0
{
internal override string GetPattern()
{
text = DoCheckSumming(text, 7);
int c = CharToInt(text[6]);
// Startcode
string result = "A0A";
for (int i = 0; i <= 5; i++)
{
if (tabelle_UPC_E0[c, i] == "E")
result += tabelle_EAN_A[CharToInt(text[i])];
else
{
for (int j = 0; j <= 3; j++)
result += tabelle_EAN_C[CharToInt(text[i])][3 - j];
}
}
// Stopcode
result += "0A0A0A";
return result;
}
}
///
/// Generates the UPC A barcode.
///
public class BarcodeUPC_A : BarcodeUPC_E0
{
internal override void DrawText(IGraphics g, string barData)
{
DrawString(g, -8, -2, barData.Substring(0, 1), true);
// parts of pattern: 7 + 20 + 5 + 20 + 7
float x1 = GetWidth(pattern.Substring(0, 7));
float x2 = GetWidth(pattern.Substring(0, 7 + 20));
DrawString(g, x1, x2, barData.Substring(1, 5));
x1 = GetWidth(pattern.Substring(0, 7 + 20 + 5));
x2 = GetWidth(pattern.Substring(0, 7 + 20 + 5 + 20));
DrawString(g, x1, x2, barData.Substring(6, 5));
x1 = GetWidth(pattern) + 1;
x2 = x1 + 7;
DrawString(g, x1, x2, barData.Substring(11, 1), true);
}
internal override string GetPattern()
{
text = DoCheckSumming(text, 12);
//Startcode
string result = "A0A";
for (int i = 0; i <= 5; i++)
{
string code = tabelle_EAN_A[CharToInt(text[i])];
result += i == 0 ? MakeLong(code) : code;
}
//Trennzeichen
result += "0A0A0";
for (int i = 6; i <= 11; i++)
{
string code = tabelle_EAN_C[CharToInt(text[i])];
result += i == 11 ? MakeLong(code) : code;
}
//Stopcode
return result + "A0A";
}
}
///
/// Generates the 2-digit supplement barcode.
///
public class BarcodeSupplement2 : BarcodeUPC_E0
{
internal string getSupp(string Nr)
{
int sum = 0;
string tmp = Nr.Substring(0, Nr.Length - 1);
int fak = tmp.Length;
for (int i = 0; i < tmp.Length; i++)
{
sum += int.Parse(tmp[i].ToString()) * ((fak % 2) == 0 ? 9 : 3);
fak--;
}
sum = ((sum % 10) % 10) % 10;
return tmp + sum.ToString();
}
internal override void DrawText(IGraphics g, string barData)
{
DrawString(g, 0, drawArea.Width, barData);
}
internal override string GetPattern()
{
text = SetLen(2);
int i32 = int.Parse(text);
string mS;
switch (i32 % 4)
{
case 0:
mS = "oo";
break;
case 1:
mS = "oE";
break;
case 2:
mS = "Eo";
break;
case 3:
mS = "EE";
break;
default:
mS = "";
break;
}
string tmp = getSupp(text + "0");
string result = "506"; // Startcode
for (int i = 0; i <= 1; i++)
{
if (mS[i] == 'E')
{
for (int j = 0; j <= 3; j++)
result += tabelle_EAN_C[CharToInt(tmp[i])][3 - j];
}
else
result += tabelle_EAN_A[CharToInt(tmp[i])];
if (i < 1)
result += "05"; // character delineator
}
return result;
}
///
/// Initializes a new instance of the class with default settings.
///
public BarcodeSupplement2()
{
textUp = true;
extra1 = 0;
extra2 = 0;
}
}
///
/// Generates the 5-digit supplement barcode.
///
internal class BarcodeSupplement5 : BarcodeSupplement2
{
internal override string GetPattern()
{
text = SetLen(5);
string tmp = getSupp(text + "0");
char c = tmp[5];
string result = "506"; // Startcode
for (int i = 0; i <= 4; i++)
{
if (tabelle_UPC_E0[CharToInt(c), 1 + i] == "E")
{
for (int j = 0; j <= 3; j++)
result += tabelle_EAN_C[CharToInt(tmp[i])][3 - j];
}
else
result += tabelle_EAN_A[CharToInt(tmp[i])];
if (i < 4)
result += "05"; // character delineator
}
return result;
}
}
}