git-svn-id: https://pdfsharp.svn.codeplex.com/svn@39620 56d0cb2f-6006-4f69-a5a2-94740...
[pdfsharp:pdfsharp.git] / PDFsharp / code / PdfSharp / PdfSharp.Drawing.BarCodes / CodeDataMatrix.cs
1 #region PDFsharp - A .NET library for processing PDF\r
2 //\r
3 // Authors:\r
4 //   David Stephensen (mailto:David.Stephensen@pdfsharp.com)\r
5 //   Stefan Lange (mailto:Stefan.Lange@pdfsharp.com)\r
6 //\r
7 // Copyright (c) 2005-2009 empira Software GmbH, Cologne (Germany)\r
8 //\r
9 // http://www.pdfsharp.com\r
10 // http://sourceforge.net/projects/pdfsharp\r
11 //\r
12 // Permission is hereby granted, free of charge, to any person obtaining a\r
13 // copy of this software and associated documentation files (the "Software"),\r
14 // to deal in the Software without restriction, including without limitation\r
15 // the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
16 // and/or sell copies of the Software, and to permit persons to whom the\r
17 // Software is furnished to do so, subject to the following conditions:\r
18 //\r
19 // The above copyright notice and this permission notice shall be included\r
20 // in all copies or substantial portions of the Software.\r
21 //\r
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
23 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
24 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r
25 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
26 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
27 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \r
28 // DEALINGS IN THE SOFTWARE.\r
29 #endregion\r
30 \r
31 using System;\r
32 using System.Diagnostics;\r
33 #if GDI\r
34 using System.Drawing;\r
35 #endif\r
36 #if WPF\r
37 using System.Windows;\r
38 using System.Windows.Media;\r
39 #endif\r
40 using PdfSharp.Drawing;\r
41 \r
42 namespace PdfSharp.Drawing.BarCodes\r
43 {\r
44   /// <summary>\r
45   /// Defines the DataMatrix 2D barcode. THIS IS AN EMPIRA INTERNAL IMPLEMENTATION. THE CODE IN\r
46   /// THE OPEN SOURCE VERSION IS A FAKE.\r
47   /// </summary>\r
48   public class CodeDataMatrix : MatrixCode\r
49   {\r
50     /// <summary>\r
51     /// Initializes a new instance of CodeDataMatrix.\r
52     /// </summary>\r
53     public CodeDataMatrix()\r
54       : this("", "", 26, 26, 0, XSize.Empty)\r
55     {\r
56     }\r
57 \r
58     /// <summary>\r
59     /// Initializes a new instance of CodeDataMatrix.\r
60     /// </summary>\r
61     public CodeDataMatrix(string code, int length)\r
62       : this(code, "", length, length, 0, XSize.Empty)\r
63     {\r
64     }\r
65 \r
66     /// <summary>\r
67     /// Initializes a new instance of CodeDataMatrix.\r
68     /// </summary>\r
69     public CodeDataMatrix(string code, int length, XSize size)\r
70       : this(code, "", length, length, 0, size)\r
71     {\r
72     }\r
73 \r
74     /// <summary>\r
75     /// Initializes a new instance of CodeDataMatrix.\r
76     /// </summary>\r
77     public CodeDataMatrix(string code, DataMatrixEncoding dmEncoding, int length, XSize size)\r
78       : this(code, CreateEncoding(dmEncoding, code.Length), length, length, 0, size)\r
79     {\r
80     }\r
81 \r
82     /// <summary>\r
83     /// Initializes a new instance of CodeDataMatrix.\r
84     /// </summary>\r
85     public CodeDataMatrix(string code, int rows, int columns)\r
86       : this(code, "", rows, columns, 0, XSize.Empty)\r
87     {\r
88     }\r
89 \r
90     /// <summary>\r
91     /// Initializes a new instance of CodeDataMatrix.\r
92     /// </summary>\r
93     public CodeDataMatrix(string code, int rows, int columns, XSize size)\r
94       : this(code, "", rows, columns, 0, size)\r
95     {\r
96     }\r
97 \r
98     /// <summary>\r
99     /// Initializes a new instance of CodeDataMatrix.\r
100     /// </summary>\r
101     public CodeDataMatrix(string code, DataMatrixEncoding dmEncoding, int rows, int columns, XSize size)\r
102       : this(code, CreateEncoding(dmEncoding, code.Length), rows, columns, 0, size)\r
103     {\r
104     }\r
105 \r
106     /// <summary>\r
107     /// Initializes a new instance of CodeDataMatrix.\r
108     /// </summary>\r
109     public CodeDataMatrix(string code, int rows, int columns, int quietZone)\r
110       : this(code, "", rows, columns, quietZone, XSize.Empty)\r
111     {\r
112     }\r
113 \r
114     /// <summary>\r
115     /// Initializes a new instance of CodeDataMatrix.\r
116     /// </summary>\r
117     public CodeDataMatrix(string code, string encoding, int rows, int columns, int quietZone, XSize size)\r
118       : base(code, encoding, rows, columns, size)\r
119     {\r
120       QuietZone = quietZone;\r
121     }\r
122 \r
123     /// <summary>\r
124     /// Sets the encoding of the DataMatrix.\r
125     /// </summary>\r
126     public void SetEncoding(DataMatrixEncoding dmEncoding)\r
127     {\r
128       Encoding = CreateEncoding(dmEncoding, Text.Length);\r
129     }\r
130 \r
131     static string CreateEncoding(DataMatrixEncoding dmEncoding, int length)\r
132     {\r
133       string tempencoding = "";\r
134       switch (dmEncoding)\r
135       {\r
136         case DataMatrixEncoding.Ascii:\r
137           tempencoding = new String('a', length);\r
138           break;\r
139         case DataMatrixEncoding.C40:\r
140           tempencoding = new String('c', length);\r
141           break;\r
142         case DataMatrixEncoding.Text:\r
143           tempencoding = new String('t', length);\r
144           break;\r
145         case DataMatrixEncoding.X12:\r
146           tempencoding = new String('x', length);\r
147           break;\r
148         case DataMatrixEncoding.EDIFACT:\r
149           tempencoding = new String('e', length);\r
150           break;\r
151         case DataMatrixEncoding.Base256:\r
152           tempencoding = new String('b', length);\r
153           break;\r
154       }\r
155       return tempencoding;\r
156     }\r
157 \r
158     /// <summary>\r
159     /// Gets or sets the size of the Matrix' Quiet Zone.\r
160     /// </summary>\r
161     public int QuietZone\r
162     {\r
163       get { return this.quietZone; }\r
164       set { this.quietZone = value; }\r
165     }\r
166     int quietZone;\r
167 \r
168     /// <summary>\r
169     /// Renders the matrix code.\r
170     /// </summary>\r
171     protected internal override void Render(XGraphics gfx, XBrush brush, XPoint position)\r
172     {\r
173       XGraphicsState state = gfx.Save();\r
174 \r
175       switch (this.direction)\r
176       {\r
177         case CodeDirection.RightToLeft:\r
178           gfx.RotateAtTransform(180, position);\r
179           break;\r
180 \r
181         case CodeDirection.TopToBottom:\r
182           gfx.RotateAtTransform(90, position);\r
183           break;\r
184 \r
185         case CodeDirection.BottomToTop:\r
186           gfx.RotateAtTransform(-90, position);\r
187           break;\r
188       }\r
189 \r
190       XPoint pos = position + CodeBase.CalcDistance(this.anchor, AnchorType.TopLeft, this.size);\r
191 \r
192       if (this.matrixImage == null)\r
193         this.matrixImage = DataMatrixImage.GenerateMatrixImage(Text, Encoding, Rows, Columns);\r
194 \r
195       if (QuietZone > 0)\r
196       {\r
197         XSize sizeWithZone = new XSize(this.size.width, this.size.height);\r
198         sizeWithZone.width = sizeWithZone.width / (Columns + 2 * QuietZone) * Columns;\r
199         sizeWithZone.height = sizeWithZone.height / (Rows + 2 * QuietZone) * Rows;\r
200 \r
201         XPoint posWithZone = new XPoint(pos.X, pos.Y);\r
202         posWithZone.X += size.width / (Columns + 2 * QuietZone) * QuietZone;\r
203         posWithZone.Y += size.height / (Rows + 2 * QuietZone) * QuietZone;\r
204 \r
205         gfx.DrawRectangle(XBrushes.White, pos.x, pos.y, size.width, size.height);\r
206         gfx.DrawImage(matrixImage, posWithZone.x, posWithZone.y, sizeWithZone.width, sizeWithZone.height);\r
207       }\r
208       else\r
209         gfx.DrawImage(matrixImage, pos.x, pos.y, this.size.width, this.size.height);\r
210 \r
211       gfx.Restore(state);\r
212     }\r
213 \r
214     /// <summary>\r
215     /// Determines whether the specified string can be used as data in the DataMatrix.\r
216     /// </summary>\r
217     /// <param name="text">The code to be checked.</param>\r
218     protected override void CheckCode(string text)\r
219     {\r
220       if (text == null)\r
221         throw new ArgumentNullException("text");\r
222 \r
223       DataMatrixImage mImage = new DataMatrixImage(Text, Encoding, Rows, Columns);\r
224       mImage.Iec16022Ecc200(Columns, Rows, Encoding, Text.Length, Text, 0, 0, 0);\r
225     }\r
226   }\r
227 }\r