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/filters/jpx.rb
CHANGED
|
@@ -1,53 +1,47 @@
|
|
|
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
|
|
|
26
21
|
module Origami
|
|
27
22
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
23
|
+
module Filter
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# Class representing a Filter used to encode and decode data with JPX compression algorithm.
|
|
27
|
+
#
|
|
28
|
+
class JPX
|
|
29
|
+
include Filter
|
|
30
|
+
|
|
31
|
+
#
|
|
32
|
+
# Not supported.
|
|
33
|
+
#
|
|
34
|
+
def encode(stream)
|
|
35
|
+
raise NotImplementedError.new("#{self.class} is not yet supported", input_data: stream)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Not supported.
|
|
40
|
+
#
|
|
41
|
+
def decode(stream)
|
|
42
|
+
raise NotImplementedError.new("#{self.class} is not yet supported", input_data: stream)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
50
45
|
|
|
51
|
-
|
|
46
|
+
end
|
|
52
47
|
end
|
|
53
|
-
|
data/lib/origami/filters/lzw.rb
CHANGED
|
@@ -1,25 +1,20 @@
|
|
|
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
|
|
|
@@ -27,176 +22,187 @@ require 'origami/filters/predictors'
|
|
|
27
22
|
|
|
28
23
|
module Origami
|
|
29
24
|
|
|
30
|
-
|
|
25
|
+
module Filter
|
|
31
26
|
|
|
32
|
-
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
#
|
|
36
|
-
# Class representing a filter used to encode and decode data with LZW compression algorithm.
|
|
37
|
-
#
|
|
38
|
-
class LZW
|
|
39
|
-
|
|
40
|
-
include Filter
|
|
41
|
-
|
|
42
|
-
class DecodeParms < Dictionary
|
|
43
|
-
include StandardObject
|
|
44
|
-
|
|
45
|
-
field :Predictor, :Type => Integer, :Default => 1
|
|
46
|
-
field :Colors, :Type => Integer, :Default => 1
|
|
47
|
-
field :BitsPerComponent, :Type => Integer, :Default => 8
|
|
48
|
-
field :Columns, :Type => Integer, :Default => 1
|
|
49
|
-
field :EarlyChange, :Type => Integer, :Default => 1
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
EOD = 257 #:nodoc:
|
|
53
|
-
CLEARTABLE = 256 #:nodoc:
|
|
54
|
-
|
|
55
|
-
#
|
|
56
|
-
# Creates a new LZW Filter.
|
|
57
|
-
# _parameters_:: A hash of filter options (ignored).
|
|
58
|
-
#
|
|
59
|
-
def initialize(parameters = {})
|
|
60
|
-
super(DecodeParms.new(parameters))
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
#
|
|
64
|
-
# Encodes given data using LZW compression method.
|
|
65
|
-
# _stream_:: The data to encode.
|
|
66
|
-
#
|
|
67
|
-
def encode(string)
|
|
68
|
-
if @params.Predictor.is_a?(Integer)
|
|
69
|
-
colors = @params.Colors.is_a?(Integer) ? @params.Colors.to_i : 1
|
|
70
|
-
bpc = @params.BitsPerComponent.is_a?(Integer) ? @params.BitsPerComponent.to_i : 8
|
|
71
|
-
columns = @params.Columns.is_a?(Integer) ? @params.Columns.to_i : 1
|
|
72
|
-
|
|
73
|
-
string = Predictor.do_pre_prediction(string, @params.Predictor.to_i, colors, bpc, columns)
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
codesize = 9
|
|
77
|
-
result = Utils::BitWriter.new
|
|
78
|
-
result.write(CLEARTABLE, codesize)
|
|
79
|
-
table = clear({})
|
|
80
|
-
|
|
81
|
-
s = ''
|
|
82
|
-
string.each_byte do |byte|
|
|
83
|
-
char = byte.chr
|
|
84
|
-
|
|
85
|
-
case table.size
|
|
86
|
-
when 512 then codesize = 10
|
|
87
|
-
when 1024 then codesize = 11
|
|
88
|
-
when 2048 then codesize = 12
|
|
89
|
-
when 4096
|
|
90
|
-
result.write(CLEARTABLE, codesize)
|
|
91
|
-
codesize = 9
|
|
92
|
-
clear table
|
|
93
|
-
redo
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it = s + char
|
|
97
|
-
if table.has_key?(it)
|
|
98
|
-
s = it
|
|
99
|
-
else
|
|
100
|
-
result.write(table[s], codesize)
|
|
101
|
-
table[it] = table.size
|
|
102
|
-
s = char
|
|
103
|
-
end
|
|
27
|
+
class InvalidLZWDataError < DecodeError #:nodoc:
|
|
104
28
|
end
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
# Class representing a filter used to encode and decode data with LZW compression algorithm.
|
|
32
|
+
#
|
|
33
|
+
class LZW
|
|
34
|
+
include Filter
|
|
35
|
+
|
|
36
|
+
class DecodeParms < Dictionary
|
|
37
|
+
include StandardObject
|
|
38
|
+
|
|
39
|
+
field :Predictor, :Type => Integer, :Default => 1
|
|
40
|
+
field :Colors, :Type => Integer, :Default => 1
|
|
41
|
+
field :BitsPerComponent, :Type => Integer, :Default => 8
|
|
42
|
+
field :Columns, :Type => Integer, :Default => 1
|
|
43
|
+
field :EarlyChange, :Type => Integer, :Default => 1
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
EOD = 257 #:nodoc:
|
|
47
|
+
CLEARTABLE = 256 #:nodoc:
|
|
48
|
+
|
|
49
|
+
#
|
|
50
|
+
# Creates a new LZW Filter.
|
|
51
|
+
# _parameters_:: A hash of filter options (ignored).
|
|
52
|
+
#
|
|
53
|
+
def initialize(parameters = {})
|
|
54
|
+
super(DecodeParms.new(parameters))
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
#
|
|
58
|
+
# Encodes given data using LZW compression method.
|
|
59
|
+
# _stream_:: The data to encode.
|
|
60
|
+
#
|
|
61
|
+
def encode(string)
|
|
62
|
+
if @params.Predictor.is_a?(Integer)
|
|
63
|
+
colors = @params.Colors.is_a?(Integer) ? @params.Colors.to_i : 1
|
|
64
|
+
bpc = @params.BitsPerComponent.is_a?(Integer) ? @params.BitsPerComponent.to_i : 8
|
|
65
|
+
columns = @params.Columns.is_a?(Integer) ? @params.Columns.to_i : 1
|
|
66
|
+
|
|
67
|
+
string = Predictor.do_pre_prediction(string,
|
|
68
|
+
predictor: @params.Predictor.to_i,
|
|
69
|
+
colors: colors,
|
|
70
|
+
bpc: bpc,
|
|
71
|
+
columns: columns)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
codesize = 9
|
|
75
|
+
result = Utils::BitWriter.new
|
|
76
|
+
result.write(CLEARTABLE, codesize)
|
|
77
|
+
table = clear({})
|
|
78
|
+
|
|
79
|
+
s = ''
|
|
80
|
+
string.each_byte do |byte|
|
|
81
|
+
char = byte.chr
|
|
82
|
+
|
|
83
|
+
case table.size
|
|
84
|
+
when 512 then codesize = 10
|
|
85
|
+
when 1024 then codesize = 11
|
|
86
|
+
when 2048 then codesize = 12
|
|
87
|
+
when 4096
|
|
88
|
+
result.write(CLEARTABLE, codesize)
|
|
89
|
+
codesize = 9
|
|
90
|
+
clear table
|
|
91
|
+
redo
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it = s + char
|
|
95
|
+
if table.has_key?(it)
|
|
96
|
+
s = it
|
|
97
|
+
else
|
|
98
|
+
result.write(table[s], codesize)
|
|
99
|
+
table[it] = table.size
|
|
100
|
+
s = char
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
result.write(table[s], codesize)
|
|
105
|
+
result.write(EOD, codesize)
|
|
106
|
+
|
|
107
|
+
result.final.to_s
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
#
|
|
111
|
+
# Decodes given data using LZW compression method.
|
|
112
|
+
# _stream_:: The data to decode.
|
|
113
|
+
#
|
|
114
|
+
def decode(string)
|
|
115
|
+
result = "".b
|
|
116
|
+
bstring = Utils::BitReader.new(string)
|
|
117
|
+
codesize = 9
|
|
118
|
+
table = clear(Hash.new)
|
|
119
|
+
prevbyte = nil
|
|
120
|
+
|
|
121
|
+
until bstring.eod? do
|
|
122
|
+
byte = bstring.read(codesize)
|
|
123
|
+
|
|
124
|
+
case table.size
|
|
125
|
+
when 510 then codesize = 10
|
|
126
|
+
when 1022 then codesize = 11
|
|
127
|
+
when 2046 then codesize = 12
|
|
128
|
+
when 4095
|
|
129
|
+
if byte != CLEARTABLE
|
|
130
|
+
raise InvalidLZWDataError.new(
|
|
131
|
+
"LZW table is full and no clear flag was set (codeword #{byte.to_s(2).rjust(codesize,'0')} at bit #{bstring.pos - codesize}/#{bstring.size})",
|
|
132
|
+
input_data: string,
|
|
133
|
+
decoded_data: result
|
|
134
|
+
)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
if byte == CLEARTABLE
|
|
139
|
+
codesize = 9
|
|
140
|
+
clear table
|
|
141
|
+
prevbyte = nil
|
|
142
|
+
redo
|
|
143
|
+
elsif byte == EOD
|
|
144
|
+
break
|
|
145
|
+
else
|
|
146
|
+
if prevbyte.nil?
|
|
147
|
+
raise InvalidLZWDataError.new(
|
|
148
|
+
"No entry for codeword #{byte.to_s(2).rjust(codesize,'0')}.",
|
|
149
|
+
input_data: string,
|
|
150
|
+
decoded_data: result
|
|
151
|
+
) unless table.value?(byte)
|
|
152
|
+
|
|
153
|
+
prevbyte = byte
|
|
154
|
+
result << table.key(byte)
|
|
155
|
+
redo
|
|
156
|
+
else
|
|
157
|
+
raise InvalidLZWDataError.new(
|
|
158
|
+
"No entry for codeword #{prevbyte.to_s(2).rjust(codesize,'0')}.",
|
|
159
|
+
input_data: string,
|
|
160
|
+
decoded_data: result
|
|
161
|
+
) unless table.value?(prevbyte)
|
|
162
|
+
|
|
163
|
+
if table.value?(byte)
|
|
164
|
+
entry = table.key(byte)
|
|
165
|
+
else
|
|
166
|
+
entry = table.key(prevbyte)
|
|
167
|
+
entry += entry[0,1]
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
result << entry
|
|
171
|
+
table[table.key(prevbyte) + entry[0,1]] = table.size
|
|
172
|
+
prevbyte = byte
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
if @params.Predictor.is_a?(Integer)
|
|
178
|
+
colors = @params.Colors.is_a?(Integer) ? @params.Colors.to_i : 1
|
|
179
|
+
bpc = @params.BitsPerComponent.is_a?(Integer) ? @params.BitsPerComponent.to_i : 8
|
|
180
|
+
columns = @params.Columns.is_a?(Integer) ? @params.Columns.to_i : 1
|
|
181
|
+
|
|
182
|
+
result = Predictor.do_post_prediction(result,
|
|
183
|
+
predictor: @params.Predictor.to_i,
|
|
184
|
+
colors: colors,
|
|
185
|
+
bpc: bpc,
|
|
186
|
+
columns: columns)
|
|
187
|
+
end
|
|
188
|
+
|
|
157
189
|
result
|
|
158
|
-
) unless table.key(prevbyte)
|
|
159
|
-
|
|
160
|
-
if table.has_value?(byte)
|
|
161
|
-
entry = table.key(byte)
|
|
162
|
-
else
|
|
163
|
-
entry = table.key(prevbyte)
|
|
164
|
-
entry += entry[0,1]
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
result << entry
|
|
168
|
-
table[table.key(prevbyte) + entry[0,1]] = table.size
|
|
169
|
-
prevbyte = byte
|
|
170
190
|
end
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
if @params.Predictor.is_a?(Integer)
|
|
175
|
-
colors = @params.Colors.is_a?(Integer) ? @params.Colors.to_i : 1
|
|
176
|
-
bpc = @params.BitsPerComponent.is_a?(Integer) ? @params.BitsPerComponent.to_i : 8
|
|
177
|
-
columns = @params.Columns.is_a?(Integer) ? @params.Columns.to_i : 1
|
|
178
191
|
|
|
179
|
-
|
|
180
|
-
|
|
192
|
+
private
|
|
193
|
+
|
|
194
|
+
def clear(table) #:nodoc:
|
|
195
|
+
table.clear
|
|
196
|
+
256.times do |i|
|
|
197
|
+
table[i.chr] = i
|
|
198
|
+
end
|
|
181
199
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
private
|
|
200
|
+
table[CLEARTABLE] = CLEARTABLE
|
|
201
|
+
table[EOD] = EOD
|
|
186
202
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
256.times do |i|
|
|
190
|
-
table[i.chr] = i
|
|
203
|
+
table
|
|
204
|
+
end
|
|
191
205
|
end
|
|
192
|
-
|
|
193
|
-
table[CLEARTABLE] = CLEARTABLE
|
|
194
|
-
table[EOD] = EOD
|
|
195
|
-
|
|
196
|
-
table
|
|
197
|
-
end
|
|
198
|
-
|
|
206
|
+
|
|
199
207
|
end
|
|
200
|
-
end
|
|
201
208
|
end
|
|
202
|
-
|