1
#region PDFsharp - A .NET library for processing PDF
4
// Klaus Potzesny (mailto:Klaus.Potzesny@pdfsharp.com)
6
// Copyright (c) 2005-2008 empira Software GmbH, Cologne (Germany)
8
// http://www.pdfsharp.com
9
// http://sourceforge.net/projects/pdfsharp
11
// Permission is hereby granted, free of charge, to any person obtaining a
12
// copy of this software and associated documentation files (the "Software"),
13
// to deal in the Software without restriction, including without limitation
14
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
15
// and/or sell copies of the Software, and to permit persons to whom the
16
// Software is furnished to do so, subject to the following conditions:
18
// The above copyright notice and this permission notice shall be included
19
// in all copies or substantial portions of the Software.
21
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27
// DEALINGS IN THE SOFTWARE.
31
using System.Diagnostics;
33
namespace PdfSharp.Drawing.BarCodes
38
public class Code3of9Standard : ThickThinBarCode
41
/// Initializes a new instance of Standard3of9.
43
public Code3of9Standard()
44
: base("", XSize.Empty, CodeDirection.LeftToRight)
49
/// Initializes a new instance of Standard3of9.
51
public Code3of9Standard(string code)
52
: base(code, XSize.Empty, CodeDirection.LeftToRight)
57
/// Initializes a new instance of Standard3of9.
59
public Code3of9Standard(string code, XSize size)
60
: base(code, size, CodeDirection.LeftToRight)
65
/// Initializes a new instance of Standard3of9.
67
public Code3of9Standard(string code, XSize size, CodeDirection direction)
68
: base(code, size, direction)
73
/// Returns an array of size 9 that represents the thick (true) and thin (false) lines and spaces
74
/// representing the specified digit.
76
/// <param name="ch">The character to represent.</param>
77
private static bool[] ThickThinLines(char ch)
79
return Lines["0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*".IndexOf(ch)];
81
static bool[][] Lines = new bool[][]
84
new bool[] {false, false, false, true, true, false, true, false, false},
86
new bool[] {true, false, false, true, false, false, false, false, true},
88
new bool[] {false, false, true, true, false, false, false, false, true},
90
new bool[] {true, false, true, true, false, false, false, false, false},
92
new bool[] {false, false, false, true, true, false, false, false, true},
94
new bool[] {true, false, false, true, true, false, false, false, false},
96
new bool[] {false, false, true, true, true, false, false, false, false},
98
new bool[] {false, false, false, true, false, false, true, false, true},
100
new bool[] {true, false, false, true, false, false, true, false, false},
102
new bool[] {false, false, true, true, false, false, true, false, false},
104
new bool[] {true, false, false, false, false, true, false, false, true},
106
new bool[] {false, false, true, false, false, true, false, false, true},
108
new bool[] {true, false, true, false, false, true, false, false, false},
110
new bool[] {false, false, false, false, true, true, false, false, true},
112
new bool[] {true, false, false, false, true, true, false, false, false},
114
new bool[] {false, false, true, false, true, true, false, false, false},
116
new bool[] {false, false, false, false, false, true, true, false, true},
118
new bool[] {true, false, false, false, false, true, true, false, false},
120
new bool[] {false, false, true, false, false, true, true, false, false},
122
new bool[] {false, false, false, false, true, true, true, false, false},
124
new bool[] {true, false, false, false, false, false, false, true, true},
126
new bool[] {false, false, true, false, false, false, false, true, true},
128
new bool[] {true, false, true, false, false, false, false, true, false},
130
new bool[] {false, false, false, false, true, false, false, true, true},
132
new bool[] {true, false, false, false, true, false, false, true, false},
134
new bool[] {false, false, true, false, true, false, false, true, false},
136
new bool[] {false, false, false, false, false, false, true, true, true},
138
new bool[] {true, false, false, false, false, false, true, true, false},
140
new bool[] {false, false, true, false, false, false, true, true, false},
142
new bool[] {false, false, false, false, true, false, true, true, false},
144
new bool[] {true, true, false, false, false, false, false, false, true},
146
new bool[] {false, true, true, false, false, false, false, false, true},
148
new bool[] {true, true, true, false, false, false, false, false, false},
150
new bool[] {false, true, false, false, true, false, false, false, true},
152
new bool[] {true, true, false, false, true, false, false, false, false},
154
new bool[] {false, true, true, false, true, false, false, false, false},
156
new bool[] {false, true, false, false, false, false, true, false, true},
158
new bool[] {true, true, false, false, false, false, true, false, false},
160
new bool[] {false, true, true, false, false, false, true, false, false},
162
new bool[] {false, true, false, true, false, true, false, false, false},
164
new bool[] {false, true, false, true, false, false, false, true, false},
166
new bool[] {false, true, false, false, false, true, false, true, false},
168
new bool[] {false, false, false, true, false, true, false, true, false},
170
new bool[] {false, true, false, false, true, false, true, false, false},
175
/// Calculates the thick and thin line widths,
176
/// taking into acount the required rendering size.
178
internal override void CalcThinBarWidth(BarCodeRenderInfo info)
181
* The total width is the sum of the following parts:
182
* Starting lines = 3 * thick + 7 * thin
184
* Code Representation = (3 * thick + 7 * thin) * code.Length
186
* Stopping lines = 3 * thick + 6 * thin
188
* with r = relation ( = thick / thin), this results in
190
* Total width = (13 + 6 * r + (3 * r + 7) * code.Length) * thin
192
double thinLineAmount = 13 + 6 * this.wideNarrowRatio + (3 * this.wideNarrowRatio + 7) * this.text.Length;
193
info.ThinBarWidth = this.Size.Width / thinLineAmount;
197
/// Checks the code to be convertible into an standard 3 of 9 bar code.
199
/// <param name="text">The code to be checked.</param>
200
protected override void CheckCode(string text)
203
throw new ArgumentNullException("text");
205
if (text.Length == 0)
206
throw new ArgumentException(BcgSR.Invalid3Of9Code(text));
208
foreach (char ch in text)
210
if ("0123456789ABCDEFGHIJKLMNOP'QRSTUVWXYZ-. $/+%*".IndexOf(ch) < 0)
211
throw new ArgumentException(BcgSR.Invalid3Of9Code(text));
216
/// Renders the bar code.
218
protected internal override void Render(XGraphics gfx, XBrush brush, XFont font, XPoint position)
220
XGraphicsState state = gfx.Save();
222
BarCodeRenderInfo info = new BarCodeRenderInfo(gfx, brush, font, position);
224
info.CurrPosInString = 0;
225
//info.CurrPos = info.Center - this.size / 2;
226
info.CurrPos = position - CodeBase.CalcDistance(AnchorType.TopLeft, this.anchor, this.size);
229
RenderTurboBit(info, true);
231
while (info.CurrPosInString < this.text.Length)
233
RenderNextChar(info);
234
RenderGap(info, false);
238
RenderTurboBit(info, false);
239
if (TextLocation != TextLocation.None)
245
private void RenderNextChar(BarCodeRenderInfo info)
247
RenderChar(info, this.text[info.CurrPosInString]);
248
++info.CurrPosInString;
251
private void RenderChar(BarCodeRenderInfo info, char ch)
253
bool[] thickThinLines = ThickThinLines(ch);
257
RenderBar(info, thickThinLines[idx]);
259
RenderGap(info, thickThinLines[idx + 1]);
264
private void RenderStart(BarCodeRenderInfo info)
266
RenderChar(info, '*');
267
RenderGap(info, false);
270
private void RenderStop(BarCodeRenderInfo info)
272
RenderChar(info, '*');