using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using FastReport.Utils;
namespace FastReport.Barcode
{
///
/// The base class for EAN barcodes.
///
public abstract class BarcodeEAN : LinearBarcodeBase
{
// Pattern for Barcode EAN Charset C
// S1 L1 S2 L2
internal static string[] tabelle_EAN_C = {
"7150", // 0
"6160", // 1
"6061", // 2
"5350", // 3
"5071", // 4
"5170", // 5
"5053", // 6
"5251", // 7
"5152", // 8
"7051" // 9
};
// Pattern for Barcode EAN Charset A
// L1 S1 L2 S2
internal static string[] tabelle_EAN_A = {
"2605", //0
"1615", //1
"1516", //2
"0805", //3
"0526", //4
"0625", //5
"0508", //6
"0706", //7
"0607", //8
"2506" //9
};
// Pattern for Barcode EAN Zeichensatz B}
//L1 S1 L2 S2
internal static string[] tabelle_EAN_B = {
"0517", // 0
"0616", // 1
"1606", // 2
"0535", // 3
"1705", // 4
"0715", // 5
"3505", // 6
"1525", // 7
"2515", // 8
"1507" // 9
};
///
/// Initializes a new instance of the class with default settings.
///
public BarcodeEAN()
{
ratioMin = 2;
ratioMax = 3;
}
}
///
/// Generates the EAN8 barcode.
///
public class BarcodeEAN8 : BarcodeEAN
{
internal override void DrawText(IGraphics g, string barData)
{
// parts of pattern: 3 + 16 + 5 + 16 + 3
float x1 = GetWidth(pattern.Substring(0, 3));
float x2 = GetWidth(pattern.Substring(0, 3 + 16 + 1));
DrawString(g, x1, x2, barData.Substring(0, 4));
x1 = GetWidth(pattern.Substring(0, 3 + 16 + 5 - 1));
x2 = GetWidth(pattern.Substring(0, 3 + 16 + 5 + 16));
DrawString(g, x1, x2, barData.Substring(4, 4));
}
internal override string GetPattern()
{
text = DoCheckSumming(text, 8);
string result = "A0A"; // Startcode
for (int i = 0; i <= 3; i++)
{
result += tabelle_EAN_A[CharToInt(text[i])];
}
result += "0A0A0"; // Center Guard Pattern
for (int i = 4; i <= 7; i++)
{
result += tabelle_EAN_C[CharToInt(text[i])];
}
result += "A0A"; // Stopcode
return result;
}
}
///
/// Generates the EAN13 barcode.
///
public class BarcodeEAN13 : BarcodeEAN
{
//Zuordung der Paraitaetsfolgen fır EAN13
private static string[,] tabelle_ParityEAN13 = {
{"A", "A", "A", "A", "A", "A"}, // 0
{"A", "A", "B", "A", "B", "B"}, // 1
{"A", "A", "B", "B", "A", "B"}, // 2
{"A", "A", "B", "B", "B", "A"}, // 3
{"A", "B", "A", "A", "B", "B"}, // 4
{"A", "B", "B", "A", "A", "B"}, // 5
{"A", "B", "B", "B", "A", "A"}, // 6
{"A", "B", "A", "B", "A", "B"}, // 7
{"A", "B", "A", "B", "B", "A"}, // 8
{"A", "B", "B", "A", "B", "A"} // 9
};
internal override void DrawText(IGraphics g, string barData)
{
DrawString(g, -8, -2, barData.Substring(0, 1));
// parts of pattern: 3 + 24 + 5 + 24 + 3
float x1 = GetWidth(pattern.Substring(0, 3));
float x2 = GetWidth(pattern.Substring(0, 3 + 24 + 1));
DrawString(g, x1, x2, barData.Substring(1, 6));
x1 = GetWidth(pattern.Substring(0, 3 + 24 + 5 - 1));
x2 = GetWidth(pattern.Substring(0, 3 + 24 + 5 + 24));
DrawString(g, x1, x2, barData.Substring(7, 6));
}
internal override string GetPattern()
{
int LK;
text = DoCheckSumming(text, 13);
string tmp = text;
LK = CharToInt(tmp[0]);
tmp = tmp.Substring(1, 12);
string result = "A0A"; // Startcode
for (int i = 0; i <= 5; i++)
{
int idx = CharToInt(tmp[i]);
switch (tabelle_ParityEAN13[LK, i])
{
case "A":
result += tabelle_EAN_A[idx];
break;
case "B":
result += tabelle_EAN_B[idx];
break;
case "C":
result += tabelle_EAN_C[idx];
break;
}
}
result += "0A0A0"; //Center Guard Pattern
for (int i = 6; i < 12; i++)
{
result += tabelle_EAN_C[CharToInt(tmp[i])];
}
result += "A0A"; // Stopcode
return result;
}
///
/// Initializes a new instance of the class with default settings.
///
public BarcodeEAN13()
{
extra1 = 8;
}
}
///
/// Generates the GS1-128 (formerly known as UCC-128 or EAN-128) barcode.
///
public class BarcodeEAN128 : Barcode128
{
///
/// Initializes a new instance of the class with default settings.
///
public BarcodeEAN128() : base()
{
}
internal override string GetPattern()
{
string snapshot = text;
if (text.StartsWith("("))
{
text = GS1Helper.ParseGS1(text);
if (string.IsNullOrEmpty(text))
{
text = "&C;&1;" + snapshot.Replace("(", "&A;").Replace(")", "").Replace(" ", "").Substring(3);
}
else
{
text = "&C;" + text;
}
}
else
text = "&C;&1;" + text.Replace("(", "&A;").Replace(")", "").Replace(" ", "");
string result = base.GetPattern();
text = snapshot;
return result;
}
}
}