Commit 685250d7d6cc285be86e2c9e628449b51e08d489

Authored by Jay Berkenbilt
1 parent 48b7de2c

Correct reversed Rectangle coordinates (fixes #363)

ChangeLog
1 1 2019-09-19 Jay Berkenbilt <ejb@ql.org>
2 2  
  3 + * When converting an array to a Rectangle, ensure that llx <= urx
  4 + and lly <= ury. This prevents flatten-annotations from flipping
  5 + fields whose coordinates are messed up in the input. Fixes #363.
  6 +
3 7 * Warn when duplicated dictionary keys are found during parsing.
4 8 The behavior remains as before: later keys override earlier ones.
5 9 However, this generates a warning now rather than being silently
... ...
libqpdf/QPDFObjectHandle.cc
... ... @@ -30,6 +30,7 @@
30 30 #include <ctype.h>
31 31 #include <limits.h>
32 32 #include <cstring>
  33 +#include <algorithm>
33 34  
34 35 class TerminateParsing
35 36 {
... ... @@ -717,10 +718,17 @@ QPDFObjectHandle::getArrayAsRectangle()
717 718 Rectangle result;
718 719 if (isRectangle())
719 720 {
720   - result = Rectangle(getArrayItem(0).getNumericValue(),
721   - getArrayItem(1).getNumericValue(),
722   - getArrayItem(2).getNumericValue(),
723   - getArrayItem(3).getNumericValue());
  721 + // Rectangle coordinates are always supposed to be llx, lly,
  722 + // urx, ury, but files have been found in the wild where
  723 + // llx > urx or lly > ury.
  724 + double i0 = getArrayItem(0).getNumericValue();
  725 + double i1 = getArrayItem(1).getNumericValue();
  726 + double i2 = getArrayItem(2).getNumericValue();
  727 + double i3 = getArrayItem(3).getNumericValue();
  728 + result = Rectangle(std::min(i0, i2),
  729 + std::min(i1, i3),
  730 + std::max(i0, i2),
  731 + std::max(i1, i3));
724 732 }
725 733 return result;
726 734 }
... ...
qpdf/qtest/qpdf/manual-appearances.pdf
... ... @@ -819,10 +819,10 @@ endobj
819 819 /Ff 4096
820 820 /P 100 0 R
821 821 /Rect [
822   - 294.149
823   - 430.251
824 822 366.951
825 823 528.249
  824 + 294.149
  825 + 430.251
826 826 ]
827 827 /Subtype /Widget
828 828 /T (Text Box 3)
... ...