#region PDFsharp - A .NET library for processing PDF
//
// Authors:
// David Stephensen
// Stefan Lange
//
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
//
// http://www.pdfsharp.com
// http://sourceforge.net/projects/pdfsharp
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
#endregion
using System;
#if GDI
using System.Drawing;
#endif
#if WPF
using System.Windows;
using System.Windows.Media;
#endif
namespace PdfSharp.Drawing.BarCodes
{
///
/// Defines the DataMatrix 2D barcode. THIS IS AN EMPIRA INTERNAL IMPLEMENTATION. THE CODE IN
/// THE OPEN SOURCE VERSION IS A FAKE.
///
public class CodeDataMatrix : MatrixCode
{
///
/// Initializes a new instance of CodeDataMatrix.
///
public CodeDataMatrix()
: this("", "", 26, 26, 0, XSize.Empty)
{}
///
/// Initializes a new instance of CodeDataMatrix.
///
public CodeDataMatrix(string code, int length)
: this(code, "", length, length, 0, XSize.Empty)
{}
///
/// Initializes a new instance of CodeDataMatrix.
///
public CodeDataMatrix(string code, int length, XSize size)
: this(code, "", length, length, 0, size)
{}
///
/// Initializes a new instance of CodeDataMatrix.
///
public CodeDataMatrix(string code, DataMatrixEncoding dmEncoding, int length, XSize size)
: this(code, CreateEncoding(dmEncoding, code.Length), length, length, 0, size)
{}
///
/// Initializes a new instance of CodeDataMatrix.
///
public CodeDataMatrix(string code, int rows, int columns)
: this(code, "", rows, columns, 0, XSize.Empty)
{}
///
/// Initializes a new instance of CodeDataMatrix.
///
public CodeDataMatrix(string code, int rows, int columns, XSize size)
: this(code, "", rows, columns, 0, size)
{}
///
/// Initializes a new instance of CodeDataMatrix.
///
public CodeDataMatrix(string code, DataMatrixEncoding dmEncoding, int rows, int columns, XSize size)
: this(code, CreateEncoding(dmEncoding, code.Length), rows, columns, 0, size)
{}
///
/// Initializes a new instance of CodeDataMatrix.
///
public CodeDataMatrix(string code, int rows, int columns, int quietZone)
: this(code, "", rows, columns, quietZone, XSize.Empty)
{}
///
/// Initializes a new instance of CodeDataMatrix.
///
public CodeDataMatrix(string code, string encoding, int rows, int columns, int quietZone, XSize size)
: base(code, encoding, rows, columns, size)
{
QuietZone = quietZone;
}
///
/// Sets the encoding of the DataMatrix.
///
public void SetEncoding(DataMatrixEncoding dmEncoding)
{
Encoding = CreateEncoding(dmEncoding, Text.Length);
}
static string CreateEncoding(DataMatrixEncoding dmEncoding, int length)
{
string tempencoding = "";
switch (dmEncoding)
{
case DataMatrixEncoding.Ascii:
tempencoding = new string('a', length);
break;
case DataMatrixEncoding.C40:
tempencoding = new string('c', length);
break;
case DataMatrixEncoding.Text:
tempencoding = new string('t', length);
break;
case DataMatrixEncoding.X12:
tempencoding = new string('x', length);
break;
case DataMatrixEncoding.EDIFACT:
tempencoding = new string('e', length);
break;
case DataMatrixEncoding.Base256:
tempencoding = new string('b', length);
break;
}
return tempencoding;
}
///
/// Gets or sets the size of the Matrix' Quiet Zone.
///
public int QuietZone
{
get { return _quietZone; }
set { _quietZone = value; }
}
int _quietZone;
///
/// Renders the matrix code.
///
protected internal override void Render(XGraphics gfx, XBrush brush, XPoint position)
{
XGraphicsState state = gfx.Save();
switch (Direction)
{
case CodeDirection.RightToLeft:
gfx.RotateAtTransform(180, position);
break;
case CodeDirection.TopToBottom:
gfx.RotateAtTransform(90, position);
break;
case CodeDirection.BottomToTop:
gfx.RotateAtTransform(-90, position);
break;
}
XPoint pos = position + CalcDistance(Anchor, AnchorType.TopLeft, Size);
if (MatrixImage == null)
MatrixImage = DataMatrixImage.GenerateMatrixImage(Text, Encoding, Rows, Columns);
if (QuietZone > 0)
{
XSize sizeWithZone = new XSize(Size.Width, Size.Height);
sizeWithZone.Width = sizeWithZone.Width / (Columns + 2 * QuietZone) * Columns;
sizeWithZone.Height = sizeWithZone.Height / (Rows + 2 * QuietZone) * Rows;
XPoint posWithZone = new XPoint(pos.X, pos.Y);
posWithZone.X += Size.Width / (Columns + 2 * QuietZone) * QuietZone;
posWithZone.Y += Size.Height / (Rows + 2 * QuietZone) * QuietZone;
gfx.DrawRectangle(XBrushes.White, pos.X, pos.Y, Size.Width, Size.Height);
gfx.DrawImage(MatrixImage, posWithZone.X, posWithZone.Y, sizeWithZone.Width, sizeWithZone.Height);
}
else
gfx.DrawImage(MatrixImage, pos.X, pos.Y, Size.Width, Size.Height);
gfx.Restore(state);
}
///
/// Determines whether the specified string can be used as data in the DataMatrix.
///
/// The code to be checked.
protected override void CheckCode(string text)
{
if (text == null)
throw new ArgumentNullException("text");
DataMatrixImage mImage = new DataMatrixImage(Text, Encoding, Rows, Columns);
mImage.Iec16022Ecc200(Columns, Rows, Encoding, Text.Length, Text, 0, 0, 0);
}
}
}