git-svn-id: https://pdfsharp.svn.codeplex.com/svn@39620 56d0cb2f-6006-4f69-a5a2-94740...
[pdfsharp:pdfsharp.git] / PDFsharp / code / PdfSharp / PdfSharp.Drawing.BarCodes / ThickThinBarcodeRenderer.cs
1 //\r
2 // PDFsharp - A library for processing PDF\r
3 //\r
4 // Authors:\r
5 //   Klaus Potzesny (mailto:Klaus.Potzesny@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 //\r
11 // Permission is hereby granted, free of charge, to any person obtaining\r
12 // a copy of this software and associated documentation files (the\r
13 // "Software"), to deal in the Software without restriction, including\r
14 // without limitation the rights to use, copy, modify, merge, publish,\r
15 // distribute, sublicense, and/or sell copies of the Software, and to\r
16 // permit persons to whom the Software is furnished to do so, subject to\r
17 // the following conditions:\r
18 // \r
19 // The above copyright notice and this permission notice shall be\r
20 // included in all copies or substantial portions of the Software.\r
21 // \r
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
29 \r
30 using System;\r
31 using System.Diagnostics;\r
32 using PdfSharp.Drawing;\r
33 \r
34 namespace PdfSharp.Drawing.BarCodes\r
35 {\r
36   /// <summary>\r
37   /// Internal base class for several bar code types.\r
38   /// </summary>\r
39   public abstract class ThickThinBarCode : BarCode  // TODO: The name is not optimal\r
40   {\r
41     /// <summary>\r
42     /// Initializes a new instance of the <see cref="ThickThinBarCode"/> class.\r
43     /// </summary>\r
44     public ThickThinBarCode(string code, XSize size, CodeDirection direction)\r
45       : base(code, size, direction)\r
46     {\r
47     }\r
48 \r
49     internal override void InitRendering(BarCodeRenderInfo info)\r
50     {\r
51       base.InitRendering(info);\r
52       CalcThinBarWidth(info);\r
53       info.BarHeight = Size.Height;\r
54       // HACK in ThickThinBarCode\r
55       if (this.textLocation != TextLocation.None)\r
56         info.BarHeight *= 4.0 / 5;\r
57 \r
58 #if DEBUG_\r
59       XColor back = XColors.LightSalmon;\r
60       back.A = 0.3;\r
61       XSolidBrush brush = new XSolidBrush(back);\r
62       info.Gfx.DrawRectangle(brush, new XRect(info.Center - this.size / 2, this.size));\r
63 #endif\r
64       switch (this.direction)\r
65       {\r
66         case CodeDirection.RightToLeft:\r
67           info.Gfx.RotateAtTransform(180, info.Position);\r
68           break;\r
69 \r
70         case CodeDirection.TopToBottom:\r
71           info.Gfx.RotateAtTransform(90, info.Position);\r
72           break;\r
73 \r
74         case CodeDirection.BottomToTop:\r
75           info.Gfx.RotateAtTransform(-90, info.Position);\r
76           break;\r
77       }\r
78     }\r
79 \r
80     /// <summary>\r
81     /// Gets or sets the ration between thick an thin lines. Must be between 2 and 3.\r
82     /// Optimal and also default value is 2.6.\r
83     /// </summary>\r
84     public override double WideNarrowRatio\r
85     {\r
86       get { return this.wideNarrowRatio; }\r
87       set\r
88       {\r
89         if (value > 3 || value < 2)\r
90           throw new ArgumentOutOfRangeException("value", BcgSR.Invalid2of5Relation);\r
91         this.wideNarrowRatio = value;\r
92       }\r
93     }\r
94     internal double wideNarrowRatio = 2.6;\r
95 \r
96     /// <summary>\r
97     /// Renders a thick or thin line for the bar code.\r
98     /// </summary>\r
99     /// <param name="info"></param>\r
100     /// <param name="isThick">Determines whether a thick or a thin line is about to be rendered.</param>\r
101     internal void RenderBar(BarCodeRenderInfo info, bool isThick)\r
102     {\r
103       double barWidth = GetBarWidth(info, isThick);\r
104       double height = Size.Height;\r
105       if (TextLocation != TextLocation.None)\r
106         height *= 4.0 / 5;\r
107       XRect rect = new XRect(info.CurrPos.X, info.CurrPos.Y, barWidth, height);\r
108       info.Gfx.DrawRectangle(info.Brush, rect);\r
109       info.CurrPos.X += barWidth;\r
110     }\r
111 \r
112     /// <summary>\r
113     /// Renders a thick or thin gap for the bar code.\r
114     /// </summary>\r
115     /// <param name="info"></param>\r
116     /// <param name="isThick">Determines whether a thick or a thin gap is about to be rendered.</param>\r
117     internal void RenderGap(BarCodeRenderInfo info, bool isThick)\r
118     {\r
119       info.CurrPos.X += GetBarWidth(info, isThick);\r
120     }\r
121 \r
122     /// <summary>\r
123     /// Renders a thick bar before or behind the code.\r
124     /// </summary>\r
125     internal void RenderTurboBit(BarCodeRenderInfo info, bool startBit)\r
126     {\r
127       if (startBit)\r
128         info.CurrPos.X -= 0.5 + GetBarWidth(info, true);\r
129       else\r
130         info.CurrPos.X += 0.5; //GetBarWidth(info, true);\r
131 \r
132       RenderBar(info, true);\r
133 \r
134       if (startBit)\r
135         info.CurrPos.X += 0.5; //GetBarWidth(info, true);\r
136     }\r
137 \r
138     internal void RenderText(BarCodeRenderInfo info)\r
139     {\r
140       if (info.Font == null)\r
141         info.Font = new XFont("Courier New", Size.Height / 6);\r
142       XPoint center = info.Position + CodeBase.CalcDistance(this.anchor, AnchorType.TopLeft, this.size);\r
143       //center.Y += info.Font.Size;\r
144       info.Gfx.DrawString(this.text, info.Font, info.Brush, new XRect(center, Size), XStringFormats.BottomCenter);\r
145     }\r
146 \r
147     /// <summary>\r
148     /// Gets the width of a thick or a thin line (or gap). CalcLineWidth must have been called before.\r
149     /// </summary>\r
150     /// <param name="info"></param>\r
151     /// <param name="isThick">Determines whether a thick line's with shall be returned.</param>\r
152     internal double GetBarWidth(BarCodeRenderInfo info, bool isThick)\r
153     {\r
154       if (isThick)\r
155         return info.ThinBarWidth * this.wideNarrowRatio;\r
156       else\r
157         return info.ThinBarWidth;\r
158     }\r
159 \r
160     internal abstract void CalcThinBarWidth(BarCodeRenderInfo info);\r
161   }\r
162 }\r