git-svn-id: https://pdfsharp.svn.codeplex.com/svn@39620 56d0cb2f-6006-4f69-a5a2-94740...
[pdfsharp:pdfsharp.git] / PDFsharp / code / PdfSharp / PdfSharp.Pdf.Advanced / PdfExtGState.cs
1 #region PDFsharp - A .NET library for processing PDF\r
2 //\r
3 // Authors:\r
4 //   Stefan Lange (mailto:Stefan.Lange@pdfsharp.com)\r
5 //\r
6 // Copyright (c) 2005-2009 empira Software GmbH, Cologne (Germany)\r
7 //\r
8 // http://www.pdfsharp.com\r
9 // http://sourceforge.net/projects/pdfsharp\r
10 //\r
11 // Permission is hereby granted, free of charge, to any person obtaining a\r
12 // copy of this software and associated documentation files (the "Software"),\r
13 // to deal in the Software without restriction, including without limitation\r
14 // the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
15 // and/or sell copies of the Software, and to permit persons to whom the\r
16 // Software is furnished to do so, subject to the following conditions:\r
17 //\r
18 // The above copyright notice and this permission notice shall be included\r
19 // in all copies or substantial portions of the Software.\r
20 //\r
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r
24 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
26 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \r
27 // DEALINGS IN THE SOFTWARE.\r
28 #endregion\r
29 \r
30 using System;\r
31 using System.Diagnostics;\r
32 using System.Collections;\r
33 using System.Text;\r
34 using System.IO;\r
35 #if GDI\r
36 using System.Drawing;\r
37 using System.Drawing.Imaging;\r
38 #endif\r
39 #if WPF\r
40 using System.Windows.Media;\r
41 #endif\r
42 using PdfSharp.Drawing;\r
43 using PdfSharp.Fonts.OpenType;\r
44 using PdfSharp.Internal;\r
45 \r
46 namespace PdfSharp.Pdf.Advanced\r
47 {\r
48   /// <summary>\r
49   /// Represents an extended graphics state object.\r
50   /// </summary>\r
51   public sealed class PdfExtGState : PdfDictionary\r
52   {\r
53     /// <summary>\r
54     /// Initializes a new instance of the <see cref="PdfExtGState"/> class.\r
55     /// </summary>\r
56     /// <param name="document">The document.</param>\r
57     public PdfExtGState(PdfDocument document)\r
58       : base(document)\r
59     {\r
60       Elements.SetName(Keys.Type, "/ExtGState");\r
61 \r
62 #if true_\r
63   //AIS false\r
64   //BM /Normal\r
65   //ca 1\r
66   //CA 1\r
67   //op false\r
68   //OP false\r
69   //OPM 1\r
70   //SA true\r
71   //SMask /None\r
72   //Type /ExtGState\r
73 \r
74       Elements.SetValue(Keys.AIS, new PdfBoolean(false)); // The alpha source\r
75       Elements.SetName("/BM", "Normal");\r
76       Elements.SetValue(Keys.op, new PdfBoolean(false));\r
77       Elements.SetValue(Keys.OP, new PdfBoolean(false));\r
78       Elements.SetValue(Keys.OPM, new PdfInteger(1));\r
79       Elements.SetValue("/SA", new PdfBoolean(true));\r
80       Elements.SetName("/SMask", "None");\r
81 #endif\r
82     }\r
83 \r
84     internal void SetDefault1()\r
85     {\r
86       //<<\r
87       //  /AIS false\r
88       //  /BM /Normal\r
89       //  /ca 1\r
90       //  /CA 1\r
91       //  /op false\r
92       //  /OP false\r
93       //  /OPM 1\r
94       //  /SA true\r
95       //  /SMask /None\r
96       //  /Type /ExtGState\r
97       //>>\r
98       Elements.SetBoolean(PdfExtGState.Keys.AIS, false);\r
99       Elements.SetName(PdfExtGState.Keys.BM, "/Normal");\r
100       StrokeAlpha = 1;\r
101       NonStrokeAlpha = 1;\r
102       Elements.SetBoolean(PdfExtGState.Keys.op, false);\r
103       Elements.SetBoolean(PdfExtGState.Keys.OP, false);\r
104       Elements.SetBoolean(PdfExtGState.Keys.SA, true);\r
105       Elements.SetName(PdfExtGState.Keys.SMask, "/None");\r
106     }\r
107 \r
108     /// <summary>\r
109     /// ...for shading patterns\r
110     /// </summary>\r
111     internal void SetDefault2()\r
112     {\r
113       //<<\r
114       //  /AIS false\r
115       //  /BM /Normal\r
116       //  /ca 1\r
117       //  /CA 1\r
118       //  /op true\r
119       //  /OP true\r
120       //  /OPM 1\r
121       //  /SA true\r
122       //  /SMask /None\r
123       //  /Type /ExtGState\r
124       //>>\r
125       Elements.SetBoolean(PdfExtGState.Keys.AIS, false);\r
126       Elements.SetName(PdfExtGState.Keys.BM, "/Normal");\r
127       StrokeAlpha = 1;\r
128       NonStrokeAlpha = 1;\r
129       Elements.SetBoolean(PdfExtGState.Keys.op, true);\r
130       Elements.SetBoolean(PdfExtGState.Keys.OP, true);\r
131       Elements.SetInteger(PdfExtGState.Keys.OPM, 1);\r
132       Elements.SetBoolean(PdfExtGState.Keys.SA, true);\r
133       Elements.SetName(PdfExtGState.Keys.SMask, "/None");\r
134     }\r
135 \r
136     /// <summary>\r
137     /// Sets the alpha value for stroking operations.\r
138     /// </summary>\r
139     public double StrokeAlpha\r
140     {\r
141       set { Elements.SetReal(Keys.CA, value); }\r
142     }\r
143 \r
144     /// <summary>\r
145     /// Sets the alpha value for nonstroking operations.\r
146     /// </summary>\r
147     public double NonStrokeAlpha\r
148     {\r
149       set { Elements.SetReal(Keys.ca, value); }\r
150     }\r
151 \r
152     /// <summary>\r
153     /// Sets a soft mask object.\r
154     /// </summary>\r
155     public PdfSoftMask SoftMask\r
156     {\r
157       set { Elements.SetReference(Keys.SMask, value); }\r
158     }\r
159 \r
160     /// <summary>\r
161     /// Common keys for all streams.\r
162     /// </summary>\r
163     internal sealed class Keys : KeysBase\r
164     {\r
165       /// <summary>\r
166       /// (Optional) The type of PDF object that this dictionary describes;\r
167       /// must be ExtGState for a graphics state parameter dictionary.\r
168       /// </summary>\r
169       [KeyInfo(KeyType.Name | KeyType.Optional)]\r
170       public const string Type = "/Type";\r
171 \r
172       /// <summary>\r
173       /// (Optional; PDF 1.3) The line width (see \93Line Width\94 on page 185).\r
174       /// </summary>\r
175       [KeyInfo(KeyType.Real | KeyType.Optional)]\r
176       public const string LW = "/LW";\r
177 \r
178       /// <summary>\r
179       /// (Optional; PDF 1.3) The line cap style.\r
180       /// </summary>\r
181       [KeyInfo(KeyType.Integer | KeyType.Optional)]\r
182       public const string LC = "/LC";\r
183 \r
184       /// <summary>\r
185       /// (Optional; PDF 1.3) The line join style.\r
186       /// </summary>\r
187       [KeyInfo(KeyType.Integer | KeyType.Optional)]\r
188       public const string LJ = "/LJ";\r
189 \r
190       /// <summary>\r
191       /// (Optional; PDF 1.3) The miter limit.\r
192       /// </summary>\r
193       [KeyInfo(KeyType.Real | KeyType.Optional)]\r
194       public const string ML = "/ML";\r
195 \r
196       /// <summary>\r
197       /// (Optional; PDF 1.3) The line dash pattern, expressed as an array of the form\r
198       /// [dashArray dashPhase], where dashArray is itself an array and dashPhase is an integer.\r
199       /// </summary>\r
200       [KeyInfo(KeyType.Array | KeyType.Optional)]\r
201       public const string D = "/D";\r
202 \r
203       /// <summary>\r
204       /// (Optional; PDF 1.3) The name of the rendering intent.\r
205       /// </summary>\r
206       [KeyInfo(KeyType.Name | KeyType.Optional)]\r
207       public const string RI = "/RI";\r
208 \r
209       /// <summary>\r
210       /// (Optional) A flag specifying whether to apply overprint. In PDF 1.2 and earlier,\r
211       /// there is a single overprint parameter that applies to all painting operations.\r
212       /// Beginning with PDF 1.3, there are two separate overprint parameters: one for stroking \r
213       /// and one for all other painting operations. Specifying an OP entry sets both parameters\r
214       /// unless there is also an op entry in the same graphics state parameter dictionary, in\r
215       /// which case the OP entry sets only the overprint parameter for stroking.\r
216       /// </summary>\r
217       [KeyInfo(KeyType.Boolean | KeyType.Optional)]\r
218       public const string OP = "/OP";\r
219 \r
220       /// <summary>\r
221       /// (Optional; PDF 1.3) A flag specifying whether to apply overprint for painting operations\r
222       /// other than stroking. If this entry is absent, the OP entry, if any, sets this parameter.\r
223       /// </summary>\r
224       [KeyInfo(KeyType.Boolean | KeyType.Optional)]\r
225       public const string op = "/op";\r
226 \r
227       /// <summary>\r
228       /// (Optional; PDF 1.3) The overprint mode.\r
229       /// </summary>\r
230       [KeyInfo(KeyType.Integer | KeyType.Optional)]\r
231       public const string OPM = "/OPM";\r
232 \r
233       /// <summary>\r
234       /// (Optional; PDF 1.3) An array of the form [font size], where font is an indirect\r
235       ///  reference to a font dictionary and size is a number expressed in text space units.\r
236       ///  These two objects correspond to the operands of the Tf operator; however,\r
237       ///  the first operand is an indirect object reference instead of a resource name.\r
238       /// </summary>\r
239       [KeyInfo(KeyType.Array | KeyType.Optional)]\r
240       public const string Font = "/Font";\r
241 \r
242       /// <summary>\r
243       /// (Optional) The black-generation function, which maps the interval [0.0 1.0]\r
244       /// to the interval [0.0 1.0].\r
245       /// </summary>\r
246       [KeyInfo(KeyType.Function | KeyType.Optional)]\r
247       public const string BG = "/BG";\r
248 \r
249       /// <summary>\r
250       /// (Optional; PDF 1.3) Same as BG except that the value may also be the name Default,\r
251       /// denoting the black-generation function that was in effect at the start of the page.\r
252       /// If both BG and BG2 are present in the same graphics state parameter dictionary, \r
253       /// BG2 takes precedence.\r
254       /// </summary>\r
255       [KeyInfo(KeyType.FunctionOrName | KeyType.Optional)]\r
256       public const string BG2 = "/BG2";\r
257 \r
258       /// <summary>\r
259       /// (Optional) The undercolor-removal function, which maps the interval\r
260       /// [0.0 1.0] to the interval [-1.0 1.0].\r
261       /// </summary>\r
262       [KeyInfo(KeyType.Function | KeyType.Optional)]\r
263       public const string UCR = "/UCR";\r
264 \r
265       /// <summary>\r
266       /// (Optional; PDF 1.3) Same as UCR except that the value may also be the name Default,\r
267       /// denoting the undercolor-removal function that was in effect at the start of the page.\r
268       /// If both UCR and UCR2 are present in the same graphics state parameter dictionary, \r
269       /// UCR2 takes precedence.\r
270       /// </summary>\r
271       [KeyInfo(KeyType.FunctionOrName | KeyType.Optional)]\r
272       public const string UCR2 = "/UCR2";\r
273 \r
274       //TR  function, array, or name\r
275       //TR2 function, array, or name\r
276       //HT  dictionary, stream, or name\r
277       //FL  number\r
278       //SM  number\r
279 \r
280       /// <summary>\r
281       /// (Optional) A flag specifying whether to apply automatic stroke adjustment.\r
282       /// </summary>\r
283       [KeyInfo(KeyType.Boolean | KeyType.Optional)]\r
284       public const string SA = "/SA";\r
285 \r
286       /// <summary>\r
287       /// (Optional; PDF 1.4) The current blend mode to be used in the transparent imaging model.\r
288       /// </summary>\r
289       [KeyInfo(KeyType.NameOrArray | KeyType.Optional)]\r
290       public const string BM = "/BM";\r
291 \r
292       /// <summary>\r
293       /// (Optional; PDF 1.4) The current soft mask, specifying the mask shape or\r
294       /// mask opacity values to be used in the transparent imaging model.\r
295       /// </summary>\r
296       [KeyInfo(KeyType.NameOrDictionary | KeyType.Optional)]\r
297       public const string SMask = "/SMask";\r
298 \r
299       /// <summary>\r
300       /// (Optional; PDF 1.4) The current stroking alpha constant, specifying the constant \r
301       /// shape or constant opacity value to be used for stroking operations in the transparent\r
302       /// imaging model.\r
303       /// </summary>\r
304       [KeyInfo(KeyType.Real | KeyType.Optional)]\r
305       public const string CA = "/CA";\r
306 \r
307       /// <summary>\r
308       /// (Optional; PDF 1.4) Same as CA, but for nonstroking operations.\r
309       /// </summary>\r
310       [KeyInfo(KeyType.Real | KeyType.Optional)]\r
311       public const string ca = "/ca";\r
312 \r
313       /// <summary>\r
314       /// (Optional; PDF 1.4) The alpha source flag (\93alpha is shape\94), specifying whether \r
315       /// the current soft mask and alpha constant are to be interpreted as shape values (true)\r
316       /// or opacity values (false).\r
317       /// </summary>\r
318       [KeyInfo(KeyType.Boolean | KeyType.Optional)]\r
319       public const string AIS = "/AIS";\r
320 \r
321       /// <summary>\r
322       /// (Optional; PDF 1.4) The text knockout flag, which determines the behavior of \r
323       /// overlapping glyphs within a text object in the transparent imaging model.\r
324       /// </summary>\r
325       [KeyInfo(KeyType.Boolean | KeyType.Optional)]\r
326       public const string TK = "/TK";\r
327 \r
328       /// <summary>\r
329       /// Gets the KeysMeta for these keys.\r
330       /// </summary>\r
331       internal static DictionaryMeta Meta\r
332       {\r
333         get\r
334         {\r
335           if (Keys.meta == null)\r
336             Keys.meta = CreateMeta(typeof(Keys));\r
337           return Keys.meta;\r
338         }\r
339       }\r
340       static DictionaryMeta meta;\r
341     }\r
342 \r
343     /// <summary>\r
344     /// Gets the KeysMeta of this dictionary type.\r
345     /// </summary>\r
346     internal override DictionaryMeta Meta\r
347     {\r
348       get { return Keys.Meta; }\r
349     }\r
350   }\r
351 }\r