git-svn-id: https://pdfsharp.svn.codeplex.com/svn@39620 56d0cb2f-6006-4f69-a5a2-94740...
[pdfsharp:pdfsharp.git] / PDFsharp / code / PdfSharp / PdfSharp.Pdf.Filters / Filter.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 PdfSharp.Internal;\r
33 using PdfSharp.Pdf.IO;\r
34 using PdfSharp.Pdf.Internal;\r
35 \r
36 namespace PdfSharp.Pdf.Filters\r
37 {\r
38   /// <summary>\r
39   /// Reserved for future extension.\r
40   /// </summary>\r
41   public class FilterParms\r
42   {\r
43     // not yet used\r
44   }\r
45 \r
46   /// <summary>\r
47   /// Base class for all stream filters\r
48   /// </summary>\r
49   public abstract class Filter\r
50   {\r
51     /// <summary>\r
52     /// When implemented in a derived class encodes the specified data.\r
53     /// </summary>\r
54     public abstract byte[] Encode(byte[] data);\r
55 \r
56     /// <summary>\r
57     /// Encodes a raw string.\r
58     /// </summary>\r
59     public virtual byte[] Encode(string rawString)\r
60     {\r
61       byte[] bytes = PdfEncoders.RawEncoding.GetBytes(rawString);\r
62       bytes = Encode(bytes);\r
63       return bytes;\r
64     }\r
65 \r
66     /// <summary>\r
67     /// When implemented in a derived class decodes the specified data.\r
68     /// </summary>\r
69     public abstract byte[] Decode(byte[] data, FilterParms parms);\r
70 \r
71     /// <summary>\r
72     /// Decodes the specified data.\r
73     /// </summary>\r
74     public byte[] Decode(byte[] data)\r
75     {\r
76       return Decode(data, null);\r
77     }\r
78 \r
79     /// <summary>\r
80     /// Decodes to a raw string.\r
81     /// </summary>\r
82     public virtual string DecodeToString(byte[] data, FilterParms parms)\r
83     {\r
84       byte[] bytes = Decode(data, parms);\r
85       string text = PdfEncoders.RawEncoding.GetString(bytes, 0, bytes.Length);\r
86       return text;\r
87     }\r
88 \r
89     /// <summary>\r
90     /// Decodes to a raw string.\r
91     /// </summary>\r
92     public string DecodeToString(byte[] data)\r
93     {\r
94       return DecodeToString(data, null);\r
95     }\r
96 \r
97     /// <summary>\r
98     /// Removes all white spaces from the data. The function assumes that the bytes are characters.\r
99     /// </summary>\r
100     protected byte[] RemoveWhiteSpace(byte[] data)\r
101     {\r
102       int count = data.Length;\r
103       int j = 0;\r
104       for (int i = 0; i < count; i++, j++)\r
105       {\r
106         switch (data[i])\r
107         {\r
108           case (byte)Chars.NUL:  // 0 Null\r
109           case (byte)Chars.HT:   // 9 Tab\r
110           case (byte)Chars.LF:   // 10 Line feed\r
111           case (byte)Chars.FF:   // 12 Form feed\r
112           case (byte)Chars.CR:   // 13 Carriage return\r
113           case (byte)Chars.SP:   // 32 Space\r
114             j--;\r
115             break;\r
116 \r
117           default:\r
118             if (i != j)\r
119               data[j] = data[i];\r
120             break;\r
121         }\r
122         if (j < count)\r
123         {\r
124           byte[] temp = data;\r
125           data = new byte[j];\r
126           for (int idx = 0; idx < j; idx++)\r
127             data[idx] = temp[idx];\r
128         }\r
129       }\r
130       return data;\r
131     }\r
132   }\r
133 }\r