You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

224 lines
13 KiB

using System;
using System.Collections.Generic;
namespace Barcoded
{
/// <summary>
/// Interleaved 2 of 5 barcode encoder.
/// </summary>
internal class Interleaved2Of5Encoder : LinearEncoder
{
private Dictionary<string, LinearPattern> _patternDictionary;
private readonly bool _useCheckDigit;
public Interleaved2Of5Encoder(Symbology symbology) : base(symbology)
{
switch (Symbology)
{
case Symbology.I2of5:
// Interleaved 2 of 5
_useCheckDigit = false;
Description = "Interleaved 2 of 5";
break;
case Symbology.I2of5C:
// Interleaved 2 of 5 with check digit
_useCheckDigit = true;
Description = "Interleaved 2 of 5 With Check Digit";
break;
default:
// Interleaved 2 of 5 with check digit
_useCheckDigit = true;
Description = "Interleaved 2 of 5 With Check Digit";
break;
}
}
internal override ILinearValidator BarcodeValidator { get; } = new Interleaved2Of5Validator();
protected override void Encode(string barcodeValue)
{
LoadSymbologyPattern();
// Add check digit to barcode value.
if (_useCheckDigit)
{
int checkDigit = LinearHelpers.GetUpcCheckDigit(barcodeValue);
barcodeValue += checkDigit;
EncodedValue = barcodeValue;
}
EncodedValue = barcodeValue;
ZplEncode = EncodedValue;
for (int encodePosition = 0; encodePosition <= barcodeValue.Length - 1; encodePosition += 2)
{
// Check if first or last character in barcode and insert start/stop symbol
if (encodePosition == 0)
{
LinearEncoding.Add("*", 1, _patternDictionary["START"]);
}
string digitPair = barcodeValue.Substring(encodePosition, 2);
LinearEncoding.Add(digitPair, 0, _patternDictionary[digitPair]);
if (encodePosition == barcodeValue.Length - 2)
{
LinearEncoding.Add("*", 1, _patternDictionary["STOP"]);
}
}
SetMinXDimension();
SetMinBarcodeHeight();
}
/// <summary>
/// Increases the barcode Xdimension to minimum required by symbology, if currently set lower
/// </summary>
internal override void SetMinXDimension()
{
int xdimensionOriginal = XDimension;
int minXdimension = (int)Math.Ceiling(Dpi * 0.0075);
XDimension = Math.Max(XDimension, minXdimension);
// Set flag to show xdimension was adjusted
if (xdimensionOriginal != XDimension)
{
XDimensionChanged = true;
}
}
/// <summary>
/// Increases the barcode height to minimum required by symbology, if currently set lower
/// </summary>
internal override void SetMinBarcodeHeight()
{
int barcodeHeightOriginal = BarcodeHeight;
int minBarcodeHeight = (int)Math.Ceiling(Math.Max(LinearEncoding.MinimumWidth * XDimension * 0.15, Dpi * 0.25));
BarcodeHeight = Math.Max(BarcodeHeight, minBarcodeHeight);
// Set flag to show barcode height was adjusted
if (barcodeHeightOriginal != BarcodeHeight)
{
BarcodeHeightChanged = true;
}
}
private void LoadSymbologyPattern()
{
if (_patternDictionary != null)
{
return;
}
_patternDictionary = new Dictionary<string, LinearPattern>
{
{"00", new LinearPattern("NNNNWWWWNN", ModuleType.Bar, WideBarRatio)},
{"01", new LinearPattern("NWNNWNWNNW", ModuleType.Bar, WideBarRatio)},
{"02", new LinearPattern("NNNWWNWNNW", ModuleType.Bar, WideBarRatio)},
{"03", new LinearPattern("NWNWWNWNNN", ModuleType.Bar, WideBarRatio)},
{"04", new LinearPattern("NNNNWWWNNW", ModuleType.Bar, WideBarRatio)},
{"05", new LinearPattern("NWNNWWWNNN", ModuleType.Bar, WideBarRatio)},
{"06", new LinearPattern("NNNWWWWNNN", ModuleType.Bar, WideBarRatio)},
{"07", new LinearPattern("NNNNWNWWNW", ModuleType.Bar, WideBarRatio)},
{"08", new LinearPattern("NWNNWNWWNN", ModuleType.Bar, WideBarRatio)},
{"09", new LinearPattern("NNNWWNWWNN", ModuleType.Bar, WideBarRatio)},
{"10", new LinearPattern("WNNNNWNWWN", ModuleType.Bar, WideBarRatio)},
{"11", new LinearPattern("WWNNNNNNWW", ModuleType.Bar, WideBarRatio)},
{"12", new LinearPattern("WNNWNNNNWW", ModuleType.Bar, WideBarRatio)},
{"13", new LinearPattern("WWNWNNNNWN", ModuleType.Bar, WideBarRatio)},
{"14", new LinearPattern("WNNNNWNNWW", ModuleType.Bar, WideBarRatio)},
{"15", new LinearPattern("WWNNNWNNWN", ModuleType.Bar, WideBarRatio)},
{"16", new LinearPattern("WNNWNWNNWN", ModuleType.Bar, WideBarRatio)},
{"17", new LinearPattern("WNNNNNNWWW", ModuleType.Bar, WideBarRatio)},
{"18", new LinearPattern("WWNNNNNWWN", ModuleType.Bar, WideBarRatio)},
{"19", new LinearPattern("WNNWNNNWWN", ModuleType.Bar, WideBarRatio)},
{"20", new LinearPattern("NNWNNWNWWN", ModuleType.Bar, WideBarRatio)},
{"21", new LinearPattern("NWWNNNNNWW", ModuleType.Bar, WideBarRatio)},
{"22", new LinearPattern("NNWWNNNNWW", ModuleType.Bar, WideBarRatio)},
{"23", new LinearPattern("NWWWNNNNWN", ModuleType.Bar, WideBarRatio)},
{"24", new LinearPattern("NNWNNWNNWW", ModuleType.Bar, WideBarRatio)},
{"25", new LinearPattern("NWWNNWNNWN", ModuleType.Bar, WideBarRatio)},
{"26", new LinearPattern("NNWWNWNNWN", ModuleType.Bar, WideBarRatio)},
{"27", new LinearPattern("NNWNNNNWWW", ModuleType.Bar, WideBarRatio)},
{"28", new LinearPattern("NWWNNNNWWN", ModuleType.Bar, WideBarRatio)},
{"29", new LinearPattern("NNWWNNNWWN", ModuleType.Bar, WideBarRatio)},
{"30", new LinearPattern("WNWNNWNWNN", ModuleType.Bar, WideBarRatio)},
{"31", new LinearPattern("WWWNNNNNNW", ModuleType.Bar, WideBarRatio)},
{"32", new LinearPattern("WNWWNNNNNW", ModuleType.Bar, WideBarRatio)},
{"33", new LinearPattern("WWWWNNNNNN", ModuleType.Bar, WideBarRatio)},
{"34", new LinearPattern("WNWNNWNNNW", ModuleType.Bar, WideBarRatio)},
{"35", new LinearPattern("WWWNNWNNNN", ModuleType.Bar, WideBarRatio)},
{"36", new LinearPattern("WNWWNWNNNN", ModuleType.Bar, WideBarRatio)},
{"37", new LinearPattern("WNWNNNNWNW", ModuleType.Bar, WideBarRatio)},
{"38", new LinearPattern("WWWNNNNWNN", ModuleType.Bar, WideBarRatio)},
{"39", new LinearPattern("WNWWNNNWNN", ModuleType.Bar, WideBarRatio)},
{"40", new LinearPattern("NNNNWWNWWN", ModuleType.Bar, WideBarRatio)},
{"41", new LinearPattern("NWNNWNNNWW", ModuleType.Bar, WideBarRatio)},
{"42", new LinearPattern("NNNWWNNNWW", ModuleType.Bar, WideBarRatio)},
{"43", new LinearPattern("NWNWWNNNWN", ModuleType.Bar, WideBarRatio)},
{"44", new LinearPattern("NNNNWWNNWW", ModuleType.Bar, WideBarRatio)},
{"45", new LinearPattern("NWNNWWNNWN", ModuleType.Bar, WideBarRatio)},
{"46", new LinearPattern("NNNWWWNNWN", ModuleType.Bar, WideBarRatio)},
{"47", new LinearPattern("NNNNWNNWWW", ModuleType.Bar, WideBarRatio)},
{"48", new LinearPattern("NWNNWNNWWN", ModuleType.Bar, WideBarRatio)},
{"49", new LinearPattern("NNNWWNNWWN", ModuleType.Bar, WideBarRatio)},
{"50", new LinearPattern("WNNNWWNWNN", ModuleType.Bar, WideBarRatio)},
{"51", new LinearPattern("WWNNWNNNNW", ModuleType.Bar, WideBarRatio)},
{"52", new LinearPattern("WNNWWNNNNW", ModuleType.Bar, WideBarRatio)},
{"53", new LinearPattern("WWNWWNNNNN", ModuleType.Bar, WideBarRatio)},
{"54", new LinearPattern("WNNNWWNNNW", ModuleType.Bar, WideBarRatio)},
{"55", new LinearPattern("WWNNWWNNNN", ModuleType.Bar, WideBarRatio)},
{"56", new LinearPattern("WNNWWWNNNN", ModuleType.Bar, WideBarRatio)},
{"57", new LinearPattern("WNNNWNNWNW", ModuleType.Bar, WideBarRatio)},
{"58", new LinearPattern("WWNNWNNWNN", ModuleType.Bar, WideBarRatio)},
{"59", new LinearPattern("WNNWWNNWNN", ModuleType.Bar, WideBarRatio)},
{"60", new LinearPattern("NNWNWWNWNN", ModuleType.Bar, WideBarRatio)},
{"61", new LinearPattern("NWWNWNNNNW", ModuleType.Bar, WideBarRatio)},
{"62", new LinearPattern("NNWWWNNNNW", ModuleType.Bar, WideBarRatio)},
{"63", new LinearPattern("NWWWWNNNNN", ModuleType.Bar, WideBarRatio)},
{"64", new LinearPattern("NNWNWWNNNW", ModuleType.Bar, WideBarRatio)},
{"65", new LinearPattern("NWWNWWNNNN", ModuleType.Bar, WideBarRatio)},
{"66", new LinearPattern("NNWWWWNNNN", ModuleType.Bar, WideBarRatio)},
{"67", new LinearPattern("NNWNWNNWNW", ModuleType.Bar, WideBarRatio)},
{"68", new LinearPattern("NWWNWNNWNN", ModuleType.Bar, WideBarRatio)},
{"69", new LinearPattern("NNWWWNNWNN", ModuleType.Bar, WideBarRatio)},
{"70", new LinearPattern("NNNNNWWWWN", ModuleType.Bar, WideBarRatio)},
{"71", new LinearPattern("NWNNNNWNWW", ModuleType.Bar, WideBarRatio)},
{"72", new LinearPattern("NNNWNNWNWW", ModuleType.Bar, WideBarRatio)},
{"73", new LinearPattern("NWNWNNWNWN", ModuleType.Bar, WideBarRatio)},
{"74", new LinearPattern("NNNNNWWNWW", ModuleType.Bar, WideBarRatio)},
{"75", new LinearPattern("NWNNNWWNWN", ModuleType.Bar, WideBarRatio)},
{"76", new LinearPattern("NNNWNWWNWN", ModuleType.Bar, WideBarRatio)},
{"77", new LinearPattern("NNNNNNWWWW", ModuleType.Bar, WideBarRatio)},
{"78", new LinearPattern("NWNNNNWWWN", ModuleType.Bar, WideBarRatio)},
{"79", new LinearPattern("NNNWNNWWWN", ModuleType.Bar, WideBarRatio)},
{"80", new LinearPattern("WNNNNWWWNN", ModuleType.Bar, WideBarRatio)},
{"81", new LinearPattern("WWNNNNWNNW", ModuleType.Bar, WideBarRatio)},
{"82", new LinearPattern("WNNWNNWNNW", ModuleType.Bar, WideBarRatio)},
{"83", new LinearPattern("WWNWNNWNNN", ModuleType.Bar, WideBarRatio)},
{"84", new LinearPattern("WNNNNWWNNW", ModuleType.Bar, WideBarRatio)},
{"85", new LinearPattern("WWNNNWWNNN", ModuleType.Bar, WideBarRatio)},
{"86", new LinearPattern("WNNWNWWNNN", ModuleType.Bar, WideBarRatio)},
{"87", new LinearPattern("WNNNNNWWNW", ModuleType.Bar, WideBarRatio)},
{"88", new LinearPattern("WWNNNNWWNN", ModuleType.Bar, WideBarRatio)},
{"89", new LinearPattern("WNNWNNWWNN", ModuleType.Bar, WideBarRatio)},
{"90", new LinearPattern("NNWNNWWWNN", ModuleType.Bar, WideBarRatio)},
{"91", new LinearPattern("NWWNNNWNNW", ModuleType.Bar, WideBarRatio)},
{"92", new LinearPattern("NNWWNNWNNW", ModuleType.Bar, WideBarRatio)},
{"93", new LinearPattern("NWWWNNWNNN", ModuleType.Bar, WideBarRatio)},
{"94", new LinearPattern("NNWNNWWNNW", ModuleType.Bar, WideBarRatio)},
{"95", new LinearPattern("NWWNNWWNNN", ModuleType.Bar, WideBarRatio)},
{"96", new LinearPattern("NNWWNWWNNN", ModuleType.Bar, WideBarRatio)},
{"97", new LinearPattern("NNWNNNWWNW", ModuleType.Bar, WideBarRatio)},
{"98", new LinearPattern("NWWNNNWWNN", ModuleType.Bar, WideBarRatio)},
{"99", new LinearPattern("NNWWNNWWNN", ModuleType.Bar, WideBarRatio)},
{"START", new LinearPattern("NNNN", ModuleType.Bar, WideBarRatio)},
{"STOP", new LinearPattern("WNN", ModuleType.Bar, WideBarRatio)}
};
}
}
}