poppler/PDFDoc.cc | 6 +++--- poppler/Stream.h | 6 ++---- poppler/XRef.cc | 38 ++++++++++++++++++++++++++++---------- poppler/XRef.h | 17 +++++++++++++++-- 4 files changed, 48 insertions(+), 19 deletions(-)
New commits: commit 8640933a3aa7dbafa21765d029e97b4bba76716c Author: Fabio D'Urso <[email protected]> Date: Thu Apr 25 19:18:30 2013 +0200 Fix printf format specifiers (Goffset is a long long, not a int) diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index 9cfbc7a..c78d5ca 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -27,7 +27,7 @@ // Copyright (C) 2010 Srinivas Adicherla <[email protected]> // Copyright (C) 2010 Philip Lorenz <[email protected]> // Copyright (C) 2011-2013 Thomas Freitag <[email protected]> -// Copyright (C) 2012 Fabio D'Urso <[email protected]> +// Copyright (C) 2012, 2013 Fabio D'Urso <[email protected]> // Copyright (C) 2013 Adrian Johnson <[email protected]> // Copyright (C) 2013 Adam Reichold <[email protected]> // @@ -1355,7 +1355,7 @@ void PDFDoc::writeXRefTableTrailer(Dict *trailerDict, XRef *uxref, GBool writeAl outStr->printf( "trailer\r\n"); writeDictionnary(trailerDict, outStr, xRef, 0, NULL, cryptRC4, 0, 0, 0); outStr->printf( "\r\nstartxref\r\n"); - outStr->printf( "%i\r\n", uxrefOffset); + outStr->printf( "%lli\r\n", uxrefOffset); outStr->printf( "%%%%EOF\r\n"); } @@ -1376,7 +1376,7 @@ void PDFDoc::writeXRefStreamTrailer (Dict *trailerDict, XRef *uxref, Ref *uxrefS obj1.free(); outStr->printf( "startxref\r\n"); - outStr->printf( "%i\r\n", uxrefOffset); + outStr->printf( "%lli\r\n", uxrefOffset); outStr->printf( "%%%%EOF\r\n"); } commit f8e8805bbce3e94b16b77fece0072645c66f6a31 Author: Fabio D'Urso <[email protected]> Date: Thu Apr 25 19:06:09 2013 +0200 Re-enable commented-out printf-format attribute on OutStream::printf The answer to the question "2,3 because the first arg is class instance ?" is yes. It's documented behavior: Since non-static C++ methods have an implicit this argument, the arguments of such methods should be counted from two, not one. from http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gcc/Function-Attributes.html diff --git a/poppler/Stream.h b/poppler/Stream.h index aa58e8c..9b40fd1 100644 --- a/poppler/Stream.h +++ b/poppler/Stream.h @@ -21,7 +21,7 @@ // Copyright (C) 2010 Hib Eris <[email protected]> // Copyright (C) 2011, 2012 William Bader <[email protected]> // Copyright (C) 2012, 2013 Thomas Freitag <[email protected]> -// Copyright (C) 2012 Fabio D'Urso <[email protected]> +// Copyright (C) 2012, 2013 Fabio D'Urso <[email protected]> // Copyright (C) 2013 Adrian Johnson <[email protected]> // Copyright (C) 2013 Peter Breitenlohner <[email protected]> // Copyright (C) 2013 Adam Reichold <[email protected]> @@ -266,9 +266,7 @@ public: // Put a char in the stream virtual void put (char c) = 0; - //FIXME - // Printf-like function 2,3 because the first arg is class instance ? - virtual void printf (const char *format, ...) = 0 ; //__attribute__((format(printf, 2,3))) = 0; + virtual void printf (const char *format, ...) GCC_PRINTF_FORMAT(2,3) = 0; private: int ref; // reference count commit 013b2b247268f9b8dcd8e0461580e0bbcf7554c1 Author: Fabio D'Urso <[email protected]> Date: Thu Apr 25 17:58:25 2013 +0200 XRef stream writing: Write 32-bit offsets when possible For compatibility reasons: some pdf readers don't support 64-bit offsets yet (for example, poppler 0.22 doesn't) diff --git a/poppler/XRef.cc b/poppler/XRef.cc index 9df4801..85f8a6f 100644 --- a/poppler/XRef.cc +++ b/poppler/XRef.cc @@ -21,7 +21,7 @@ // Copyright (C) 2009, 2010 Ilya Gorenbein <[email protected]> // Copyright (C) 2010 Hib Eris <[email protected]> // Copyright (C) 2012, 2013 Thomas Freitag <[email protected]> -// Copyright (C) 2012 Fabio D'Urso <[email protected]> +// Copyright (C) 2012, 2013 Fabio D'Urso <[email protected]> // Copyright (C) 2013 Adrian Johnson <[email protected]> // Copyright (C) 2013 Pino Toscano <[email protected]> // @@ -1461,9 +1461,10 @@ void XRef::writeTableToFile(OutStream* outStr, GBool writeAllEntries) { writeXRef(&writer, writeAllEntries); } -XRef::XRefStreamWriter::XRefStreamWriter(Object *indexA, GooString *stmBufA) { +XRef::XRefStreamWriter::XRefStreamWriter(Object *indexA, GooString *stmBufA, int offsetSizeA) { index = indexA; stmBuf = stmBufA; + offsetSize = offsetSizeA; } void XRef::XRefStreamWriter::startSection(int first, int count) { @@ -1473,17 +1474,28 @@ void XRef::XRefStreamWriter::startSection(int first, int count) { } void XRef::XRefStreamWriter::writeEntry(Goffset offset, int gen, XRefEntryType type) { + const int entryTotalSize = 1 + offsetSize + 2; /* type + offset + gen */ char data[16]; - int i; data[0] = (type==xrefEntryFree) ? 0 : 1; - for (i = sizeof(Goffset); i > 0; i--) { + for (int i = offsetSize; i > 0; i--) { data[i] = offset & 0xff; offset >>= 8; } - i = sizeof(Goffset) + 1; - data[i] = (gen >> 8) & 0xff; - data[i+1] = gen & 0xff; - stmBuf->append(data, i+2); + data[offsetSize + 1] = (gen >> 8) & 0xff; + data[offsetSize + 2] = gen & 0xff; + stmBuf->append(data, entryTotalSize); +} + +XRef::XRefPreScanWriter::XRefPreScanWriter() { + hasOffsetsBeyond4GB = gFalse; +} + +void XRef::XRefPreScanWriter::startSection(int first, int count) { +} + +void XRef::XRefPreScanWriter::writeEntry(Goffset offset, int gen, XRefEntryType type) { + if (offset >= 0x100000000ll) + hasOffsetsBeyond4GB = gTrue; } void XRef::writeStreamToBuffer(GooString *stmBuf, Dict *xrefDict, XRef *xref) { @@ -1491,7 +1503,13 @@ void XRef::writeStreamToBuffer(GooString *stmBuf, Dict *xrefDict, XRef *xref) { index.initArray(xref); stmBuf->clear(); - XRefStreamWriter writer(&index, stmBuf); + // First pass: determine whether all offsets fit in 4 bytes or not + XRefPreScanWriter prescan; + writeXRef(&prescan, gFalse); + const int offsetSize = prescan.hasOffsetsBeyond4GB ? sizeof(Goffset) : 4; + + // Second pass: actually write the xref stream + XRefStreamWriter writer(&index, stmBuf, offsetSize); writeXRef(&writer, gFalse); Object obj1, obj2; @@ -1499,7 +1517,7 @@ void XRef::writeStreamToBuffer(GooString *stmBuf, Dict *xrefDict, XRef *xref) { xrefDict->set("Index", &index); obj2.initArray(xref); obj2.arrayAdd( obj1.initInt(1) ); - obj2.arrayAdd( obj1.initInt(sizeof(Goffset)) ); + obj2.arrayAdd( obj1.initInt(offsetSize) ); obj2.arrayAdd( obj1.initInt(2) ); xrefDict->set("W", &obj2); } diff --git a/poppler/XRef.h b/poppler/XRef.h index c9f17c2..70065d8 100644 --- a/poppler/XRef.h +++ b/poppler/XRef.h @@ -20,7 +20,7 @@ // Copyright (C) 2010 Ilya Gorenbein <[email protected]> // Copyright (C) 2010 Hib Eris <[email protected]> // Copyright (C) 2012, 2013 Thomas Freitag <[email protected]> -// Copyright (C) 2012 Fabio D'Urso <[email protected]> +// Copyright (C) 2012, 2013 Fabio D'Urso <[email protected]> // Copyright (C) 2013 Adrian Johnson <[email protected]> // // To see a description of the changes please see the Changelog file that @@ -243,6 +243,7 @@ private: virtual ~XRefWriter() {}; }; + // XRefWriter subclass that writes a XRef table class XRefTableWriter: public XRefWriter { public: XRefTableWriter(OutStream* outStrA); @@ -252,14 +253,26 @@ private: OutStream* outStr; }; + // XRefWriter subclass that writes a XRef stream class XRefStreamWriter: public XRefWriter { public: - XRefStreamWriter(Object *index, GooString *stmBuf); + XRefStreamWriter(Object *index, GooString *stmBuf, int offsetSize); void startSection(int first, int count); void writeEntry(Goffset offset, int gen, XRefEntryType type); private: Object *index; GooString *stmBuf; + int offsetSize; + }; + + // Dummy XRefWriter subclass that only checks if all offsets fit in 4 bytes + class XRefPreScanWriter: public XRefWriter { + public: + XRefPreScanWriter(); + void startSection(int first, int count); + void writeEntry(Goffset offset, int gen, XRefEntryType type); + + GBool hasOffsetsBeyond4GB; }; void writeXRef(XRefWriter *writer, GBool writeAllEntries); _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
