origami 1.2.7 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +112 -0
  4. data/bin/config/pdfcop.conf.yml +232 -233
  5. data/bin/gui/about.rb +27 -37
  6. data/bin/gui/config.rb +108 -117
  7. data/bin/gui/file.rb +416 -365
  8. data/bin/gui/gtkhex.rb +1138 -1153
  9. data/bin/gui/hexview.rb +55 -57
  10. data/bin/gui/imgview.rb +48 -51
  11. data/bin/gui/menu.rb +388 -386
  12. data/bin/gui/properties.rb +114 -130
  13. data/bin/gui/signing.rb +571 -617
  14. data/bin/gui/textview.rb +77 -95
  15. data/bin/gui/treeview.rb +382 -387
  16. data/bin/gui/walker.rb +227 -232
  17. data/bin/gui/xrefs.rb +56 -60
  18. data/bin/pdf2pdfa +53 -57
  19. data/bin/pdf2ruby +212 -228
  20. data/bin/pdfcop +338 -348
  21. data/bin/pdfdecompress +58 -65
  22. data/bin/pdfdecrypt +56 -60
  23. data/bin/pdfencrypt +75 -80
  24. data/bin/pdfexplode +185 -182
  25. data/bin/pdfextract +201 -218
  26. data/bin/pdfmetadata +83 -82
  27. data/bin/pdfsh +4 -5
  28. data/bin/pdfwalker +1 -2
  29. data/bin/shell/.irbrc +45 -82
  30. data/bin/shell/console.rb +105 -130
  31. data/bin/shell/hexdump.rb +40 -64
  32. data/examples/README.md +34 -0
  33. data/examples/attachments/attachment.rb +38 -0
  34. data/examples/attachments/nested_document.rb +51 -0
  35. data/examples/encryption/encryption.rb +28 -0
  36. data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
  37. data/examples/flash/flash.rb +37 -0
  38. data/{samples → examples}/flash/helloworld.swf +0 -0
  39. data/examples/forms/javascript.rb +54 -0
  40. data/examples/forms/xfa.rb +115 -0
  41. data/examples/javascript/hello_world.rb +22 -0
  42. data/examples/javascript/js_emulation.rb +54 -0
  43. data/examples/loop/goto.rb +32 -0
  44. data/examples/loop/named.rb +33 -0
  45. data/examples/signature/signature.rb +65 -0
  46. data/examples/uri/javascript.rb +56 -0
  47. data/examples/uri/open-uri.rb +21 -0
  48. data/examples/uri/submitform.rb +47 -0
  49. data/lib/origami.rb +29 -42
  50. data/lib/origami/3d.rb +350 -225
  51. data/lib/origami/acroform.rb +262 -288
  52. data/lib/origami/actions.rb +268 -288
  53. data/lib/origami/annotations.rb +697 -722
  54. data/lib/origami/array.rb +258 -184
  55. data/lib/origami/boolean.rb +74 -84
  56. data/lib/origami/catalog.rb +397 -434
  57. data/lib/origami/collections.rb +144 -0
  58. data/lib/origami/destinations.rb +233 -194
  59. data/lib/origami/dictionary.rb +253 -232
  60. data/lib/origami/encryption.rb +1274 -1243
  61. data/lib/origami/export.rb +232 -268
  62. data/lib/origami/extensions/fdf.rb +307 -220
  63. data/lib/origami/extensions/ppklite.rb +368 -435
  64. data/lib/origami/filespec.rb +197 -0
  65. data/lib/origami/filters.rb +301 -295
  66. data/lib/origami/filters/ascii.rb +177 -180
  67. data/lib/origami/filters/ccitt.rb +528 -535
  68. data/lib/origami/filters/crypt.rb +26 -35
  69. data/lib/origami/filters/dct.rb +46 -52
  70. data/lib/origami/filters/flate.rb +95 -94
  71. data/lib/origami/filters/jbig2.rb +49 -55
  72. data/lib/origami/filters/jpx.rb +38 -44
  73. data/lib/origami/filters/lzw.rb +189 -183
  74. data/lib/origami/filters/predictors.rb +221 -235
  75. data/lib/origami/filters/runlength.rb +103 -104
  76. data/lib/origami/font.rb +173 -186
  77. data/lib/origami/functions.rb +67 -81
  78. data/lib/origami/graphics.rb +25 -21
  79. data/lib/origami/graphics/colors.rb +178 -187
  80. data/lib/origami/graphics/instruction.rb +79 -85
  81. data/lib/origami/graphics/path.rb +142 -148
  82. data/lib/origami/graphics/patterns.rb +160 -167
  83. data/lib/origami/graphics/render.rb +43 -50
  84. data/lib/origami/graphics/state.rb +138 -153
  85. data/lib/origami/graphics/text.rb +188 -205
  86. data/lib/origami/graphics/xobject.rb +819 -815
  87. data/lib/origami/header.rb +63 -78
  88. data/lib/origami/javascript.rb +596 -597
  89. data/lib/origami/linearization.rb +285 -290
  90. data/lib/origami/metadata.rb +139 -148
  91. data/lib/origami/name.rb +112 -148
  92. data/lib/origami/null.rb +53 -62
  93. data/lib/origami/numeric.rb +162 -175
  94. data/lib/origami/obfuscation.rb +186 -174
  95. data/lib/origami/object.rb +593 -573
  96. data/lib/origami/outline.rb +42 -47
  97. data/lib/origami/outputintents.rb +73 -82
  98. data/lib/origami/page.rb +703 -592
  99. data/lib/origami/parser.rb +238 -290
  100. data/lib/origami/parsers/fdf.rb +41 -33
  101. data/lib/origami/parsers/pdf.rb +75 -95
  102. data/lib/origami/parsers/pdf/lazy.rb +137 -0
  103. data/lib/origami/parsers/pdf/linear.rb +64 -66
  104. data/lib/origami/parsers/ppklite.rb +34 -70
  105. data/lib/origami/pdf.rb +1030 -1005
  106. data/lib/origami/reference.rb +102 -102
  107. data/lib/origami/signature.rb +591 -609
  108. data/lib/origami/stream.rb +668 -551
  109. data/lib/origami/string.rb +397 -373
  110. data/lib/origami/template/patterns.rb +56 -0
  111. data/lib/origami/template/widgets.rb +151 -0
  112. data/lib/origami/trailer.rb +144 -158
  113. data/lib/origami/tree.rb +62 -0
  114. data/lib/origami/version.rb +23 -0
  115. data/lib/origami/webcapture.rb +88 -79
  116. data/lib/origami/xfa.rb +2863 -2882
  117. data/lib/origami/xreftable.rb +472 -384
  118. data/test/dataset/calc.pdf +85 -0
  119. data/test/dataset/crypto.pdf +82 -0
  120. data/test/dataset/empty.pdf +49 -0
  121. data/test/test_actions.rb +27 -0
  122. data/test/test_annotations.rb +90 -0
  123. data/test/test_pages.rb +31 -0
  124. data/test/test_pdf.rb +16 -0
  125. data/test/test_pdf_attachment.rb +34 -0
  126. data/test/test_pdf_create.rb +24 -0
  127. data/test/test_pdf_encrypt.rb +95 -0
  128. data/test/test_pdf_parse.rb +96 -0
  129. data/test/test_pdf_sign.rb +58 -0
  130. data/test/test_streams.rb +182 -0
  131. data/test/test_xrefs.rb +67 -0
  132. metadata +88 -58
  133. data/README +0 -67
  134. data/bin/pdf2graph +0 -121
  135. data/bin/pdfcocoon +0 -104
  136. data/lib/origami/file.rb +0 -233
  137. data/samples/README.txt +0 -45
  138. data/samples/actions/launch/calc.rb +0 -87
  139. data/samples/actions/launch/winparams.rb +0 -22
  140. data/samples/actions/loop/loopgoto.rb +0 -24
  141. data/samples/actions/loop/loopnamed.rb +0 -21
  142. data/samples/actions/named/named.rb +0 -31
  143. data/samples/actions/samba/smbrelay.rb +0 -26
  144. data/samples/actions/webbug/submitform.js +0 -26
  145. data/samples/actions/webbug/webbug-browser.rb +0 -68
  146. data/samples/actions/webbug/webbug-js.rb +0 -67
  147. data/samples/actions/webbug/webbug-reader.rb +0 -90
  148. data/samples/attachments/attach.rb +0 -40
  149. data/samples/attachments/attached.txt +0 -1
  150. data/samples/crypto/crypto.rb +0 -28
  151. data/samples/digsig/signed.rb +0 -46
  152. data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
  153. data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
  154. data/samples/exploits/exploit_customdictopen.rb +0 -55
  155. data/samples/exploits/getannots.rb +0 -69
  156. data/samples/flash/flash.rb +0 -31
  157. data/samples/javascript/attached.txt +0 -1
  158. data/samples/javascript/js.rb +0 -52
  159. data/templates/patterns.rb +0 -66
  160. data/templates/widgets.rb +0 -173
  161. data/templates/xdp.rb +0 -92
  162. data/test/ts_pdf.rb +0 -50
@@ -1,93 +1,79 @@
1
1
  =begin
2
2
 
3
- = File
4
- functions.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
3
+ This file is part of Origami, PDF manipulation framework for Ruby
4
+ Copyright (C) 2016 Guillaume Delugré.
23
5
 
24
- =end
25
-
26
-
27
- module Origami
28
-
29
- module Function
30
-
31
- module Type
32
- SAMPLED = 0
33
- EXPONENTIAL = 2
34
- STITCHING = 3
35
- POSTSCRIPT = 4
36
- end
37
-
38
- def self.included(receiver)
39
- receiver.field :FunctionType, :Type => Integer, :Required => true
40
- receiver.field :Domain, :Type => Array, :Required => true
41
- receiver.field :Range, :Type => Array
42
- end
43
-
44
- class Sampled < Stream
6
+ Origami is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU Lesser General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
45
10
 
46
- include Function
47
-
48
- field :FunctionType, :Type => Integer, :Default => Type::SAMPLED, :Version => "1.3", :Required => true
49
- field :Range, :Type => Array, :Required => true
50
- field :Size, :Type => Array, :Required => true
51
- field :BitsPerSample, :Type => Integer, :Required => true
52
- field :Order, :Type => Integer, :Default => 1
53
- field :Encode, :Type => Array
54
- field :Decode, :Type => Array
55
-
56
- end
11
+ Origami is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU Lesser General Public License for more details.
57
15
 
58
- class Exponential < Dictionary
59
-
60
- include StandardObject
61
- include Function
16
+ You should have received a copy of the GNU Lesser General Public License
17
+ along with Origami. If not, see <http://www.gnu.org/licenses/>.
62
18
 
63
- field :FunctionType, :Type => Integer, :Default => Type::EXPONENTIAL, :Version => "1.3", :Required => true
64
- field :C0, :Type => Array, :Default => [ 0.0 ]
65
- field :C1, :Type => Array, :Default => [ 1.0 ]
66
- field :N, :Type => Number, :Required => true
67
-
68
- end
69
-
70
- class Stitching < Dictionary
71
-
72
- include StandardObject
73
- include Function
74
-
75
- field :FunctionType, :Type => Integer, :Default => Type::STITCHING, :Version => "1.3", :Required => true
76
- field :Functions, :Type => Array, :Required => true
77
- field :Bounds, :Type => Array, :Required => true
78
- field :Encode, :Type => Array, :Required => true
79
-
80
- end
81
-
82
- class PostScript < Stream
19
+ =end
83
20
 
84
- include Function
85
21
 
86
- field :FunctionType, :Type => Integer, :Default => Type::POSTSCRIPT, :Version => "1.3", :Required => true
87
- field :Range, :Type => Array, :Required => true
22
+ module Origami
88
23
 
24
+ module Function
25
+
26
+ module Type
27
+ SAMPLED = 0
28
+ EXPONENTIAL = 2
29
+ STITCHING = 3
30
+ POSTSCRIPT = 4
31
+ end
32
+
33
+ def self.included(receiver)
34
+ receiver.field :FunctionType, :Type => Integer, :Required => true
35
+ receiver.field :Domain, :Type => Array.of(Number), :Required => true
36
+ receiver.field :Range, :Type => Array.of(Number)
37
+ end
38
+
39
+ class Sampled < Stream
40
+ include Function
41
+
42
+ field :FunctionType, :Type => Integer, :Default => Type::SAMPLED, :Version => "1.3", :Required => true
43
+ field :Range, :Type => Array.of(Number), :Required => true
44
+ field :Size, :Type => Array.of(Integer), :Required => true
45
+ field :BitsPerSample, :Type => Integer, :Required => true
46
+ field :Order, :Type => Integer, :Default => 1
47
+ field :Encode, :Type => Array.of(Number)
48
+ field :Decode, :Type => Array.of(Number)
49
+ end
50
+
51
+ class Exponential < Dictionary
52
+ include StandardObject
53
+ include Function
54
+
55
+ field :FunctionType, :Type => Integer, :Default => Type::EXPONENTIAL, :Version => "1.3", :Required => true
56
+ field :C0, :Type => Array.of(Number), :Default => [ 0.0 ]
57
+ field :C1, :Type => Array.of(Number), :Default => [ 1.0 ]
58
+ field :N, :Type => Number, :Required => true
59
+ end
60
+
61
+ class Stitching < Dictionary
62
+ include StandardObject
63
+ include Function
64
+
65
+ field :FunctionType, :Type => Integer, :Default => Type::STITCHING, :Version => "1.3", :Required => true
66
+ field :Functions, :Type => Array, :Required => true
67
+ field :Bounds, :Type => Array.of(Number), :Required => true
68
+ field :Encode, :Type => Array.of(Number), :Required => true
69
+ end
70
+
71
+ class PostScript < Stream
72
+ include Function
73
+
74
+ field :FunctionType, :Type => Integer, :Default => Type::POSTSCRIPT, :Version => "1.3", :Required => true
75
+ field :Range, :Type => Array.of(Number), :Required => true
76
+ end
89
77
  end
90
78
 
91
- end
92
-
93
79
  end
@@ -1,28 +1,33 @@
1
1
  =begin
2
2
 
3
- = File
4
- graphics.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
3
+ This file is part of Origami, PDF manipulation framework for Ruby
4
+ Copyright (C) 2016 Guillaume Delugré.
5
+
6
+ Origami is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU Lesser General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ Origami is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU Lesser General Public License for more details.
15
+
16
+ You should have received a copy of the GNU Lesser General Public License
17
+ along with Origami. If not, see <http://www.gnu.org/licenses/>.
23
18
 
24
19
  =end
25
20
 
21
+ module Origami
22
+
23
+ module Graphics
24
+ #
25
+ # Common graphics Exception class for errors.
26
+ #
27
+ class Error < Origami::Error; end
28
+ end
29
+ end
30
+
26
31
  require 'origami/graphics/instruction'
27
32
  require 'origami/graphics/colors'
28
33
  require 'origami/graphics/path'
@@ -31,4 +36,3 @@ require 'origami/graphics/patterns'
31
36
  require 'origami/graphics/text'
32
37
  require 'origami/graphics/state'
33
38
  require 'origami/graphics/render'
34
-
@@ -1,213 +1,204 @@
1
1
  =begin
2
2
 
3
- = File
4
- graphics/colors.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
3
+ This file is part of Origami, PDF manipulation framework for Ruby
4
+ Copyright (C) 2016 Guillaume Delugré.
23
5
 
24
- =end
25
-
26
- begin
27
- require 'color'
28
- rescue LoadError
29
- end
6
+ Origami is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU Lesser General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
30
10
 
31
- module Origami
11
+ Origami is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU Lesser General Public License for more details.
32
15
 
33
- module Graphics
34
-
35
- class InvalidColorError < Exception; end
36
- module Color
37
-
38
- module Intent
39
- ABSOLUTE = :AbsoluteColorimetric
40
- RELATIVE = :RelativeColorimetric
41
- SATURATION = :Saturation
42
- PERCEPTUAL = :Perceptual
43
- end
44
-
45
- module BlendMode
46
- NORMAL = :Normal
47
- COMPATIBLE = :Compatible
48
- MULTIPLY = :Multiply
49
- SCREEN = :Screen
50
- OVERLAY = :Overlay
51
- DARKEN = :Darken
52
- LIGHTEN = :Lighten
53
- COLORDODGE = :ColorDodge
54
- COLORBURN = :ColorBurn
55
- HARDLIGHT = :HardLight
56
- SOFTLIGHt = :SoftLight
57
- DIFFERENCE = :Difference
58
- EXCLUSION = :Exclusion
59
- end
60
-
61
- module Space
62
- DEVICE_GRAY = :DeviceGray
63
- DEVICE_RGB = :DeviceRGB
64
- DEVICE_CMYK = :DeviceCMYK
65
- end
66
-
67
- def self.cmyk_to_rgb(c, m, y, k)
68
- r = 1 - (( c * ( 1 - k ) + k ))
69
- g = 1 - (( m * ( 1 - k ) + k ))
70
- b = 1 - (( y * ( 1 - k ) + k ))
71
-
72
- [ r, g, b ]
73
- end
74
-
75
- def self.gray_to_rgb(g)
76
- [ g, g, g ]
77
- end
78
-
79
- #
80
- # Class representing an embedded ICC Profile stream.
81
- #
82
- class ICCProfile < Stream
83
- field :N, :Type => Integer, :Required => true, :Version => '1.3'
84
- field :Alternate, :Type => [ Name, Array ]
85
- field :Range, :Type => Array
86
- field :Metadata, :Type => Stream, :Version => '1.4'
87
- end
88
-
89
- class GrayScale
90
- attr_accessor :g
91
-
92
- def initialize(g)
93
- @g = g
94
- end
95
- end
16
+ You should have received a copy of the GNU Lesser General Public License
17
+ along with Origami. If not, see <http://www.gnu.org/licenses/>.
96
18
 
97
- class RGB
98
- attr_accessor :r,:g,:b
19
+ =end
99
20
 
100
- def initialize(r,g,b)
101
- @r,@g,@b = r,g,b
102
- end
103
- end
21
+ module Origami
104
22
 
105
- class CMYK
106
- attr_accessor :c,:m,:y,:k
23
+ module Graphics
107
24
 
108
- def initialize(c,m,y,k)
109
- @c,@m,@y,@k = c,m,y,k
25
+ class InvalidColorError < Error #:nodoc:
110
26
  end
111
- end
112
-
113
- def Color.to_a(color)
114
- return color if color.is_a?(::Array)
115
-
116
- if (color.respond_to? :r and color.respond_to? :g and color.respond_to? :b)
117
- r = (color.respond_to?(:r) ? color.r : color[0]).to_f / 255
118
- g = (color.respond_to?(:g) ? color.g : color[1]).to_f / 255
119
- b = (color.respond_to?(:b) ? color.b : color[2]).to_f / 255
120
- return [r, g, b]
121
-
122
- elsif (color.respond_to? :c and color.respond_to? :m and color.respond_to? :y and color.respond_to? :k)
123
- c = (color.respond_to?(:c) ? color.c : color[0]).to_f
124
- m = (color.respond_to?(:m) ? color.m : color[1]).to_f
125
- y = (color.respond_to?(:y) ? color.y : color[2]).to_f
126
- k = (color.respond_to?(:k) ? color.k : color[3]).to_f
127
- return [c,m,y,k]
128
-
129
- elsif color.respond_to?:g or (0.0..1.0) === color
130
- g = color.respond_to?(:g) ? color.g : color
131
- return [ g ]
132
-
133
- else
134
- raise TypeError, "Invalid color : #{color}"
27
+
28
+ module Color
29
+
30
+ module Intent
31
+ ABSOLUTE = :AbsoluteColorimetric
32
+ RELATIVE = :RelativeColorimetric
33
+ SATURATION = :Saturation
34
+ PERCEPTUAL = :Perceptual
35
+ end
36
+
37
+ module BlendMode
38
+ NORMAL = :Normal
39
+ COMPATIBLE = :Compatible
40
+ MULTIPLY = :Multiply
41
+ SCREEN = :Screen
42
+ OVERLAY = :Overlay
43
+ DARKEN = :Darken
44
+ LIGHTEN = :Lighten
45
+ COLORDODGE = :ColorDodge
46
+ COLORBURN = :ColorBurn
47
+ HARDLIGHT = :HardLight
48
+ SOFTLIGHt = :SoftLight
49
+ DIFFERENCE = :Difference
50
+ EXCLUSION = :Exclusion
51
+ end
52
+
53
+ module Space
54
+ DEVICE_GRAY = :DeviceGray
55
+ DEVICE_RGB = :DeviceRGB
56
+ DEVICE_CMYK = :DeviceCMYK
57
+ end
58
+
59
+ def self.cmyk_to_rgb(c, m, y, k)
60
+ r = 1 - (( c * ( 1 - k ) + k ))
61
+ g = 1 - (( m * ( 1 - k ) + k ))
62
+ b = 1 - (( y * ( 1 - k ) + k ))
63
+
64
+ [ r, g, b ]
65
+ end
66
+
67
+ def self.gray_to_rgb(g)
68
+ [ g, g, g ]
69
+ end
70
+
71
+ #
72
+ # Class representing an embedded ICC Profile stream.
73
+ #
74
+ class ICCProfile < Stream
75
+ field :N, :Type => Integer, :Required => true, :Version => '1.3'
76
+ field :Alternate, :Type => [ Name, Array ]
77
+ field :Range, :Type => Array
78
+ field :Metadata, :Type => Stream, :Version => '1.4'
79
+ end
80
+
81
+ class GrayScale
82
+ attr_accessor :g
83
+
84
+ def initialize(g)
85
+ @g = g
86
+ end
87
+ end
88
+
89
+ class RGB
90
+ attr_accessor :r,:g,:b
91
+
92
+ def initialize(r,g,b)
93
+ @r,@g,@b = r,g,b
94
+ end
95
+ end
96
+
97
+ class CMYK
98
+ attr_accessor :c,:m,:y,:k
99
+
100
+ def initialize(c,m,y,k)
101
+ @c,@m,@y,@k = c,m,y,k
102
+ end
103
+ end
104
+
105
+ def Color.to_a(color)
106
+ return color if color.is_a?(::Array)
107
+
108
+ if (color.respond_to? :r and color.respond_to? :g and color.respond_to? :b)
109
+ r = (color.respond_to?(:r) ? color.r : color[0]).to_f / 255
110
+ g = (color.respond_to?(:g) ? color.g : color[1]).to_f / 255
111
+ b = (color.respond_to?(:b) ? color.b : color[2]).to_f / 255
112
+ return [r, g, b]
113
+
114
+ elsif (color.respond_to? :c and color.respond_to? :m and color.respond_to? :y and color.respond_to? :k)
115
+ c = (color.respond_to?(:c) ? color.c : color[0]).to_f
116
+ m = (color.respond_to?(:m) ? color.m : color[1]).to_f
117
+ y = (color.respond_to?(:y) ? color.y : color[2]).to_f
118
+ k = (color.respond_to?(:k) ? color.k : color[3]).to_f
119
+ return [c,m,y,k]
120
+
121
+ elsif color.respond_to?:g or (0.0..1.0) === color
122
+ g = color.respond_to?(:g) ? color.g : color
123
+ return [ g ]
124
+
125
+ else
126
+ raise TypeError, "Invalid color : #{color}"
127
+ end
128
+ end
135
129
  end
136
- end
137
130
  end
138
131
 
139
- end
132
+ class PDF::Instruction
140
133
 
141
- class PDF::Instruction
134
+ insn 'CS', Name do |canvas, cs| canvas.gs.stroking_colorspace = cs end
135
+ insn 'cs', Name do |canvas, cs| canvas.gs.nonstroking_colorspace = cs end
136
+ insn 'SC', '*' do |canvas, *c| canvas.gs.stroking_color = c end
137
+ insn 'sc', '*' do |canvas, *c| canvas.gs.nonstroking_color = c end
142
138
 
143
- insn 'CS', Name do |canvas, cs| canvas.gs.stroking_colorspace = cs end
144
- insn 'cs', Name do |canvas, cs| canvas.gs.nonstroking_colorspace = cs end
145
- insn 'SC', '*' do |canvas, *c| canvas.gs.stroking_color = c end
146
- insn 'sc', '*' do |canvas, *c| canvas.gs.nonstroking_color = c end
147
-
148
- insn 'G', Real do |canvas, c|
149
- unless (0..1).include? c
150
- raise Graphics::InvalidColorError,
151
- "Not a valid color for DeviceGray: #{c}"
152
- end
139
+ insn 'G', Real do |canvas, c|
140
+ unless (0..1).include? c
141
+ raise Graphics::InvalidColorError,
142
+ "Not a valid color for DeviceGray: #{c}"
143
+ end
153
144
 
154
- canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_GRAY
155
- canvas.gs.stroking_color = [ c ]
156
- end
157
-
158
- insn 'g', Real do |canvas, c|
159
- unless (0..1).include? c
160
- raise Graphics::InvalidColorError,
161
- "Not a valid color for DeviceGray: #{c}"
162
- end
163
-
164
- canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_GRAY
165
- canvas.gs.nonstroking_color = [ c ]
166
- end
145
+ canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_GRAY
146
+ canvas.gs.stroking_color = [ c ]
147
+ end
167
148
 
168
- insn 'RG', Real, Real, Real do |canvas, r,g,b|
169
- c = [ r, g, b ]
170
- unless c.all? {|b| (0..1).include? b}
171
- raise Graphics::InvalidColorError,
172
- "Not a valid color for DeviceRGB: #{c.inspect}"
173
- end
149
+ insn 'g', Real do |canvas, c|
150
+ unless (0..1).include? c
151
+ raise Graphics::InvalidColorError,
152
+ "Not a valid color for DeviceGray: #{c}"
153
+ end
174
154
 
175
- canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_RGB
176
- canvas.gs.stroking_color = c
177
- end
155
+ canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_GRAY
156
+ canvas.gs.nonstroking_color = [ c ]
157
+ end
178
158
 
179
- insn 'rg', Real, Real, Real do |canvas, r,g,b|
180
- c = [ r, g, b ]
181
- unless c.all? {|b| (0..1).include? b}
182
- raise Graphics::InvalidColorError,
183
- "Not a valid color for DeviceRGB: #{c.inspect}"
184
- end
159
+ insn 'RG', Real, Real, Real do |canvas, r,g,b|
160
+ color = [ r, g, b ]
161
+ unless color.all? {|comp| (0..1).include? comp}
162
+ raise Graphics::InvalidColorError,
163
+ "Not a valid color for DeviceRGB: #{color.inspect}"
164
+ end
185
165
 
186
- canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_RGB
187
- canvas.gs.nonstroking_color = c
188
- end
166
+ canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_RGB
167
+ canvas.gs.stroking_color = color
168
+ end
189
169
 
190
- insn 'K', Real, Real, Real, Real do |canvas, c,m,y,k|
191
- c = [ c, m, y, k ]
192
- unless c.all? {|b| (0..1).include? b}
193
- raise Graphics::InvalidColorError,
194
- "Not a valid color for DeviceCMYK: #{c.inspect}"
195
- end
170
+ insn 'rg', Real, Real, Real do |canvas, r,g,b|
171
+ color = [ r, g, b ]
172
+ unless color.all? {|comp| (0..1).include? comp}
173
+ raise Graphics::InvalidColorError,
174
+ "Not a valid color for DeviceRGB: #{color.inspect}"
175
+ end
196
176
 
197
- canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_CMYK
198
- canvas.gs.stroking_color = c
199
- end
177
+ canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_RGB
178
+ canvas.gs.nonstroking_color = color
179
+ end
200
180
 
201
- insn 'k', Real, Real, Real, Real do |canvas, c,m,y,k|
202
- c = [ c, m, y, k ]
203
- unless c.all? {|b| (0..1).include? b}
204
- raise Graphics::InvalidColorError,
205
- "Not a valid color for DeviceCMYK: #{c.inspect}"
206
- end
181
+ insn 'K', Real, Real, Real, Real do |canvas, c,m,y,k|
182
+ color = [ c, m, y, k ]
183
+ unless color.all? {|comp| (0..1).include? comp}
184
+ raise Graphics::InvalidColorError,
185
+ "Not a valid color for DeviceCMYK: #{color.inspect}"
186
+ end
207
187
 
208
- canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_CMYK
209
- canvas.gs.nonstroking_color = c
188
+ canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_CMYK
189
+ canvas.gs.stroking_color = color
190
+ end
191
+
192
+ insn 'k', Real, Real, Real, Real do |canvas, c,m,y,k|
193
+ color = [ c, m, y, k ]
194
+ unless color.all? {|comp| (0..1).include? comp}
195
+ raise Graphics::InvalidColorError,
196
+ "Not a valid color for DeviceCMYK: #{color.inspect}"
197
+ end
198
+
199
+ canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_CMYK
200
+ canvas.gs.nonstroking_color = color
201
+ end
210
202
  end
211
- end
212
203
 
213
- end # module Origami
204
+ end