origami 1.2.7 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +66 -0
- data/README.md +112 -0
- data/bin/config/pdfcop.conf.yml +232 -233
- data/bin/gui/about.rb +27 -37
- data/bin/gui/config.rb +108 -117
- data/bin/gui/file.rb +416 -365
- data/bin/gui/gtkhex.rb +1138 -1153
- data/bin/gui/hexview.rb +55 -57
- data/bin/gui/imgview.rb +48 -51
- data/bin/gui/menu.rb +388 -386
- data/bin/gui/properties.rb +114 -130
- data/bin/gui/signing.rb +571 -617
- data/bin/gui/textview.rb +77 -95
- data/bin/gui/treeview.rb +382 -387
- data/bin/gui/walker.rb +227 -232
- data/bin/gui/xrefs.rb +56 -60
- data/bin/pdf2pdfa +53 -57
- data/bin/pdf2ruby +212 -228
- data/bin/pdfcop +338 -348
- data/bin/pdfdecompress +58 -65
- data/bin/pdfdecrypt +56 -60
- data/bin/pdfencrypt +75 -80
- data/bin/pdfexplode +185 -182
- data/bin/pdfextract +201 -218
- data/bin/pdfmetadata +83 -82
- data/bin/pdfsh +4 -5
- data/bin/pdfwalker +1 -2
- data/bin/shell/.irbrc +45 -82
- data/bin/shell/console.rb +105 -130
- data/bin/shell/hexdump.rb +40 -64
- data/examples/README.md +34 -0
- data/examples/attachments/attachment.rb +38 -0
- data/examples/attachments/nested_document.rb +51 -0
- data/examples/encryption/encryption.rb +28 -0
- data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
- data/examples/flash/flash.rb +37 -0
- data/{samples → examples}/flash/helloworld.swf +0 -0
- data/examples/forms/javascript.rb +54 -0
- data/examples/forms/xfa.rb +115 -0
- data/examples/javascript/hello_world.rb +22 -0
- data/examples/javascript/js_emulation.rb +54 -0
- data/examples/loop/goto.rb +32 -0
- data/examples/loop/named.rb +33 -0
- data/examples/signature/signature.rb +65 -0
- data/examples/uri/javascript.rb +56 -0
- data/examples/uri/open-uri.rb +21 -0
- data/examples/uri/submitform.rb +47 -0
- data/lib/origami.rb +29 -42
- data/lib/origami/3d.rb +350 -225
- data/lib/origami/acroform.rb +262 -288
- data/lib/origami/actions.rb +268 -288
- data/lib/origami/annotations.rb +697 -722
- data/lib/origami/array.rb +258 -184
- data/lib/origami/boolean.rb +74 -84
- data/lib/origami/catalog.rb +397 -434
- data/lib/origami/collections.rb +144 -0
- data/lib/origami/destinations.rb +233 -194
- data/lib/origami/dictionary.rb +253 -232
- data/lib/origami/encryption.rb +1274 -1243
- data/lib/origami/export.rb +232 -268
- data/lib/origami/extensions/fdf.rb +307 -220
- data/lib/origami/extensions/ppklite.rb +368 -435
- data/lib/origami/filespec.rb +197 -0
- data/lib/origami/filters.rb +301 -295
- data/lib/origami/filters/ascii.rb +177 -180
- data/lib/origami/filters/ccitt.rb +528 -535
- data/lib/origami/filters/crypt.rb +26 -35
- data/lib/origami/filters/dct.rb +46 -52
- data/lib/origami/filters/flate.rb +95 -94
- data/lib/origami/filters/jbig2.rb +49 -55
- data/lib/origami/filters/jpx.rb +38 -44
- data/lib/origami/filters/lzw.rb +189 -183
- data/lib/origami/filters/predictors.rb +221 -235
- data/lib/origami/filters/runlength.rb +103 -104
- data/lib/origami/font.rb +173 -186
- data/lib/origami/functions.rb +67 -81
- data/lib/origami/graphics.rb +25 -21
- data/lib/origami/graphics/colors.rb +178 -187
- data/lib/origami/graphics/instruction.rb +79 -85
- data/lib/origami/graphics/path.rb +142 -148
- data/lib/origami/graphics/patterns.rb +160 -167
- data/lib/origami/graphics/render.rb +43 -50
- data/lib/origami/graphics/state.rb +138 -153
- data/lib/origami/graphics/text.rb +188 -205
- data/lib/origami/graphics/xobject.rb +819 -815
- data/lib/origami/header.rb +63 -78
- data/lib/origami/javascript.rb +596 -597
- data/lib/origami/linearization.rb +285 -290
- data/lib/origami/metadata.rb +139 -148
- data/lib/origami/name.rb +112 -148
- data/lib/origami/null.rb +53 -62
- data/lib/origami/numeric.rb +162 -175
- data/lib/origami/obfuscation.rb +186 -174
- data/lib/origami/object.rb +593 -573
- data/lib/origami/outline.rb +42 -47
- data/lib/origami/outputintents.rb +73 -82
- data/lib/origami/page.rb +703 -592
- data/lib/origami/parser.rb +238 -290
- data/lib/origami/parsers/fdf.rb +41 -33
- data/lib/origami/parsers/pdf.rb +75 -95
- data/lib/origami/parsers/pdf/lazy.rb +137 -0
- data/lib/origami/parsers/pdf/linear.rb +64 -66
- data/lib/origami/parsers/ppklite.rb +34 -70
- data/lib/origami/pdf.rb +1030 -1005
- data/lib/origami/reference.rb +102 -102
- data/lib/origami/signature.rb +591 -609
- data/lib/origami/stream.rb +668 -551
- data/lib/origami/string.rb +397 -373
- data/lib/origami/template/patterns.rb +56 -0
- data/lib/origami/template/widgets.rb +151 -0
- data/lib/origami/trailer.rb +144 -158
- data/lib/origami/tree.rb +62 -0
- data/lib/origami/version.rb +23 -0
- data/lib/origami/webcapture.rb +88 -79
- data/lib/origami/xfa.rb +2863 -2882
- data/lib/origami/xreftable.rb +472 -384
- data/test/dataset/calc.pdf +85 -0
- data/test/dataset/crypto.pdf +82 -0
- data/test/dataset/empty.pdf +49 -0
- data/test/test_actions.rb +27 -0
- data/test/test_annotations.rb +90 -0
- data/test/test_pages.rb +31 -0
- data/test/test_pdf.rb +16 -0
- data/test/test_pdf_attachment.rb +34 -0
- data/test/test_pdf_create.rb +24 -0
- data/test/test_pdf_encrypt.rb +95 -0
- data/test/test_pdf_parse.rb +96 -0
- data/test/test_pdf_sign.rb +58 -0
- data/test/test_streams.rb +182 -0
- data/test/test_xrefs.rb +67 -0
- metadata +88 -58
- data/README +0 -67
- data/bin/pdf2graph +0 -121
- data/bin/pdfcocoon +0 -104
- data/lib/origami/file.rb +0 -233
- data/samples/README.txt +0 -45
- data/samples/actions/launch/calc.rb +0 -87
- data/samples/actions/launch/winparams.rb +0 -22
- data/samples/actions/loop/loopgoto.rb +0 -24
- data/samples/actions/loop/loopnamed.rb +0 -21
- data/samples/actions/named/named.rb +0 -31
- data/samples/actions/samba/smbrelay.rb +0 -26
- data/samples/actions/webbug/submitform.js +0 -26
- data/samples/actions/webbug/webbug-browser.rb +0 -68
- data/samples/actions/webbug/webbug-js.rb +0 -67
- data/samples/actions/webbug/webbug-reader.rb +0 -90
- data/samples/attachments/attach.rb +0 -40
- data/samples/attachments/attached.txt +0 -1
- data/samples/crypto/crypto.rb +0 -28
- data/samples/digsig/signed.rb +0 -46
- data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
- data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
- data/samples/exploits/exploit_customdictopen.rb +0 -55
- data/samples/exploits/getannots.rb +0 -69
- data/samples/flash/flash.rb +0 -31
- data/samples/javascript/attached.txt +0 -1
- data/samples/javascript/js.rb +0 -52
- data/templates/patterns.rb +0 -66
- data/templates/widgets.rb +0 -173
- data/templates/xdp.rb +0 -92
- data/test/ts_pdf.rb +0 -50
data/lib/origami/functions.rb
CHANGED
|
@@ -1,93 +1,79 @@
|
|
|
1
1
|
=begin
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
data/lib/origami/graphics.rb
CHANGED
|
@@ -1,28 +1,33 @@
|
|
|
1
1
|
=begin
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
4
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
98
|
-
attr_accessor :r,:g,:b
|
|
19
|
+
=end
|
|
99
20
|
|
|
100
|
-
|
|
101
|
-
@r,@g,@b = r,g,b
|
|
102
|
-
end
|
|
103
|
-
end
|
|
21
|
+
module Origami
|
|
104
22
|
|
|
105
|
-
|
|
106
|
-
attr_accessor :c,:m,:y,:k
|
|
23
|
+
module Graphics
|
|
107
24
|
|
|
108
|
-
|
|
109
|
-
@c,@m,@y,@k = c,m,y,k
|
|
25
|
+
class InvalidColorError < Error #:nodoc:
|
|
110
26
|
end
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
132
|
+
class PDF::Instruction
|
|
140
133
|
|
|
141
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
155
|
+
canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_GRAY
|
|
156
|
+
canvas.gs.nonstroking_color = [ c ]
|
|
157
|
+
end
|
|
178
158
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
166
|
+
canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_RGB
|
|
167
|
+
canvas.gs.stroking_color = color
|
|
168
|
+
end
|
|
189
169
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
177
|
+
canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_RGB
|
|
178
|
+
canvas.gs.nonstroking_color = color
|
|
179
|
+
end
|
|
200
180
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
209
|
-
|
|
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
|
|
204
|
+
end
|