source: trunk/dports/perl/p5-cam-pdf/files/patch-lib-CAM-PDF.pm @ 36407

Last change on this file since 36407 was 36407, checked in by ricci@…, 12 years ago

bump revision
add patch that improves node traversal (submitted to upstream)
change my email addr to my MP addr

File size: 3.7 KB
Line 
1--- lib/CAM/PDF.pm.orig 2007-11-28 21:42:46.000000000 -0800
2+++ lib/CAM/PDF.pm      2008-03-27 20:06:54.000000000 -0700
3@@ -566,6 +566,9 @@
4             $CAM::PDF::errstr = "Could not decipher xref row:\n" . $self->trimstr($row);
5             return;
6          }
7+               if ((0 == $1) && (0 == $2)) {
8+                       next;
9+               }
10          if ($type eq 'n')
11          {
12             $index->{$objnum} = $indexnum;
13@@ -3785,6 +3788,7 @@
14    my $otherdoc = shift;
15    my $otherkey = shift;
16    my $follow = shift;
17+   my %traversedNodes = ();
18 
19    # careful! 'undef' means something different from '0' here!
20    if (!defined $follow)
21@@ -3838,10 +3842,10 @@
22          my $newkey = $self->appendObject($otherdoc, $oldrefkey, 0);
23          $newrefkeys{$oldrefkey} = $newkey;
24       }
25-      $self->changeRefKeys($objnode, \%newrefkeys);
26+      $self->changeRefKeys($objnode, \%newrefkeys, \%traversedNodes);
27       for my $newkey (values %newrefkeys)
28       {
29-         $self->changeRefKeys($self->dereference($newkey), \%newrefkeys);
30+         $self->changeRefKeys($self->dereference($newkey), \%newrefkeys, \%traversedNodes);
31       }
32    }
33    return (%newrefkeys);
34@@ -5040,7 +5044,7 @@
35    if ($stream)
36    {
37       $stream = $self->{crypt}->encrypt($self, $stream, $objnode->{objnum}, $objnode->{gennum});
38-      $str .= "\nstream\n" . $stream . 'endstream';
39+      $str .= "\nstream\n" . $stream . '\nendstream';
40    }
41    return "obj\n$str\nendobj\n";
42 }
43@@ -5072,6 +5076,7 @@
44    my $objnode = shift;
45    my $func = shift;
46    my $funcdata = shift;
47+   my $funcResult = undef;
48 
49    my $traversed = {};
50    my @stack = ($objnode);
51@@ -5080,7 +5085,8 @@
52    while ($i < @stack)
53    {
54       my $objnode = $stack[$i++];
55-      $self->$func($objnode, $funcdata);
56+      $funcResult = undef;
57+      $funcResult = $self->$func($objnode, $funcdata);
58 
59       my $type = $objnode->{type};
60       my $val = $objnode->{value};
61@@ -5108,6 +5114,62 @@
62    return;
63 }
64 
65+sub recurseTraverse {
66+       my ($self, $deref, $objnode, $traversedRef, $func, $funcdata, $objnum) = @_;
67+       
68+       my $type;
69+       my $val;
70+       my @nodes = ();
71+       my $node = undef;
72+       my $newObjNum = undef;
73+       
74+       if ((!defined($objnode)) || (! ref $objnode )) {
75+               return;
76+       }
77+       
78+       if (defined($objnum)) {
79+               $newObjNum = $objnum;
80+       }
81+
82+       $type = $objnode->{type};
83+       $val = $objnode->{value};
84+       
85+       if (exists $objnode->{objnum}) {
86+               $newObjNum = $objnode->{objnum};
87+       }
88+       
89+       if ((defined($newObjNum)) && 
90+           (exists ($traversedRef->{$newObjNum}))) {
91+               return;
92+       } else {
93+               $self->$func($objnode, $funcdata);
94+       }
95+       
96+       if ($type eq 'dictionary') {
97+               push (@nodes, values %{$val});
98+       } elsif ($type eq 'array') {
99+               push (@nodes, @{$val});
100+       } elsif ($type eq 'object') {
101+               push (@nodes, $val);
102+       } elsif ($type eq 'reference') {
103+               if ($deref) {
104+                       push (@nodes, $self->dereference($val));
105+               } else {
106+                       return;
107+               }
108+       } 
109+
110+       for $node (@nodes) {
111+               recurseTraverse($self, $deref, $node, $traversedRef, $func, $funcdata, $newObjNum);
112+       }
113+       
114+       if (($type eq 'object')) {
115+               $traversedRef->{$newObjNum} = 1;
116+       } 
117+
118+       return;
119+}
120+
121 # decodeObject and decodeAll differ from each other like this:
122 #
123 #  decodeObject JUST decodes a single stream directly below the object
124@@ -5538,10 +5600,11 @@
125    my $self = shift;
126    my $objnode = shift;
127    my $newrefkeys = shift;
128+   my $traversedRef = shift;
129 
130    my $follow = shift || 0;   # almost always false
131 
132-   $self->traverse($follow, $objnode, \&_changeRefKeysCB, $newrefkeys);
133+   $self->recurseTraverse($follow, $objnode, $traversedRef, \&_changeRefKeysCB, $newrefkeys, 0);
134    return;
135 }
136 
137@@ -5558,9 +5621,10 @@
138       if (exists $newrefkeys->{$objnode->{value}})
139       {
140          $objnode->{value} = $newrefkeys->{$objnode->{value}};
141+         return 1;
142       }
143    }
144-   return;
145+   return 0;
146 }
147 
148 =item $doc->abbrevInlineImage($object)
Note: See TracBrowser for help on using the repository browser.