[Libreoffice-commits] core.git: vcl/source
Miklos Vajna
vmiklos at collabora.co.uk
Tue Mar 28 12:49:45 UTC 2017
vcl/source/filter/ipdf/pdfdocument.cxx | 8 ++++++--
vcl/source/gdi/pdfwriter_impl.cxx | 4 ++++
2 files changed, 10 insertions(+), 2 deletions(-)
New commits:
commit 3ea5e3401e567bfe956817fd5abd17530da664f5
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Tue Mar 28 12:10:03 2017 +0200
tdf#106693 vcl PDF export, norefxobj: copy nested arrays correctly
When copying an array we're only interested in the start/end position of
the outermost array, otherwise only part of the array is copied.
Change-Id: I9f5cb5e3ed395142fd82db34e1153ddfdf9f0eb3
Reviewed-on: https://gerrit.libreoffice.org/35797
Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
Tested-by: Jenkins <ci at libreoffice.org>
diff --git a/vcl/source/filter/ipdf/pdfdocument.cxx b/vcl/source/filter/ipdf/pdfdocument.cxx
index 1a85c4f3fd5e..1c132353e0a6 100644
--- a/vcl/source/filter/ipdf/pdfdocument.cxx
+++ b/vcl/source/filter/ipdf/pdfdocument.cxx
@@ -876,6 +876,8 @@ bool PDFDocument::Tokenize(SvStream& rStream, TokenizeMode eMode, std::vector< s
bool bInStartXRef = false;
// Dictionary depth, so we know when we're outside any dictionaries.
int nDictionaryDepth = 0;
+ // Array depth, only the offset/length of the toplevel array is tracked.
+ int nArrayDepth = 0;
// Last seen array token that's outside any dictionaries.
PDFArrayElement* pArray = nullptr;
while (true)
@@ -939,7 +941,7 @@ bool PDFDocument::Tokenize(SvStream& rStream, TokenizeMode eMode, std::vector< s
{
auto pArr = new PDFArrayElement();
rElements.push_back(std::unique_ptr<PDFElement>(pArr));
- if (nDictionaryDepth == 0)
+ if (nDictionaryDepth == 0 && nArrayDepth == 0)
{
// The array is attached directly, inform the object.
pArray = pArr;
@@ -949,6 +951,7 @@ bool PDFDocument::Tokenize(SvStream& rStream, TokenizeMode eMode, std::vector< s
pObject->SetArrayOffset(rStream.Tell());
}
}
+ ++nArrayDepth;
rStream.SeekRel(-1);
if (!rElements.back()->Read(rStream))
{
@@ -962,7 +965,8 @@ bool PDFDocument::Tokenize(SvStream& rStream, TokenizeMode eMode, std::vector< s
rElements.push_back(std::unique_ptr<PDFElement>(new PDFEndArrayElement()));
pArray = nullptr;
rStream.SeekRel(-1);
- if (nDictionaryDepth == 0)
+ --nArrayDepth;
+ if (nDictionaryDepth == 0 && nArrayDepth == 0)
{
if (pObject)
{
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index 7d435e404837..000e2875d95b 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -11067,6 +11067,8 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit)
return;
}
+ OString sColorSpaces = copyExternalResources(*pPage, "ColorSpace");
+ OString sExtGStates = copyExternalResources(*pPage, "ExtGState");
OString sFonts = copyExternalResources(*pPage, "Font");
OString sXObjects = copyExternalResources(*pPage, "XObject");
@@ -11089,6 +11091,8 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit)
aLine.append("<< /Type /XObject");
aLine.append(" /Subtype /Form");
aLine.append(" /Resources <<");
+ aLine.append(sColorSpaces);
+ aLine.append(sExtGStates);
aLine.append(sFonts);
aLine.append(sXObjects);
aLine.append(">>");
More information about the Libreoffice-commits
mailing list