summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2017-03-27 14:21:53 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2017-03-27 13:31:42 +0000
commit06d073695c764744d308c74f80c40a317255fc05 (patch)
tree70f4d2ff3adbc62edffab604242d05c024a53dc4 /vcl
parent71c56d9e74d579471924ec8ecd506743a57fbe2e (diff)
vcl PDF export, norefxobj: improve ref handling in dicts
When copying objects referenced from the page stream support references in any item value, not just for one single item key. Also move the dictionary entry generator code to PDFWriterImpl::copyExternalResources(), so other keys can be copied without code duplication. Change-Id: I4004e82014cec915c66a8a9d3aed2155fa2452ef Reviewed-on: https://gerrit.libreoffice.org/35755 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/gdi/pdfwriter_impl.cxx35
-rw-r--r--vcl/source/gdi/pdfwriter_impl.hxx4
2 files changed, 20 insertions, 19 deletions
diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx
index 6d6e7eec9993..eb9d00cac010 100644
--- a/vcl/source/gdi/pdfwriter_impl.cxx
+++ b/vcl/source/gdi/pdfwriter_impl.cxx
@@ -10866,11 +10866,9 @@ sal_Int32 PDFWriterImpl::copyExternalResource(SvMemoryStream& rDocBuffer, filter
// Complex case: can't copy the dictionary byte array as is, as it contains a reference.
bool bDone = false;
const std::map<OString, filter::PDFElement*>& rItems = rObject.GetDictionaryItems();
- OString aReferenceName("ColorSpace");
- auto it = rItems.find(aReferenceName);
- if (it != rItems.end())
+ for (const auto& rItem : rItems)
{
- auto pReference = dynamic_cast<filter::PDFReferenceElement*>(it->second);
+ auto pReference = dynamic_cast<filter::PDFReferenceElement*>(rItem.second);
if (pReference)
{
filter::PDFObjectElement* pReferenced = pReference->LookupObject();
@@ -10880,8 +10878,8 @@ sal_Int32 PDFWriterImpl::copyExternalResource(SvMemoryStream& rDocBuffer, filter
sal_Int32 nRef = copyExternalResource(rDocBuffer, *pReferenced);
sal_uInt64 nDictStart = rObject.GetDictionaryOffset();
- sal_uInt64 nReferenceStart = pDictionary->GetKeyOffset(aReferenceName) + aReferenceName.getLength();
- sal_uInt64 nReferenceEnd = pDictionary->GetKeyOffset(aReferenceName) + pDictionary->GetKeyValueLength(aReferenceName);
+ sal_uInt64 nReferenceStart = pDictionary->GetKeyOffset(rItem.first) + rItem.first.getLength();
+ sal_uInt64 nReferenceEnd = pDictionary->GetKeyOffset(rItem.first) + pDictionary->GetKeyValueLength(rItem.first);
sal_uInt64 nDictEnd = nDictStart + rObject.GetDictionaryLength();
// Dict start -> reference start.
aLine.append(static_cast<const sal_Char*>(rDocBuffer.GetData()) + nDictStart, nReferenceStart - nDictStart);
@@ -10893,6 +10891,7 @@ sal_Int32 PDFWriterImpl::copyExternalResource(SvMemoryStream& rDocBuffer, filter
aLine.append(static_cast<const sal_Char*>(rDocBuffer.GetData()) + nReferenceEnd, nDictEnd - nReferenceEnd);
bDone = true;
+ break;
}
}
}
@@ -10968,7 +10967,7 @@ sal_Int32 PDFWriterImpl::copyExternalResource(SvMemoryStream& rDocBuffer, filter
return nObject;
}
-std::map<OString, sal_Int32> PDFWriterImpl::copyExternalResources(filter::PDFObjectElement& rPage, const OString& rKind)
+OString PDFWriterImpl::copyExternalResources(filter::PDFObjectElement& rPage, const OString& rKind)
{
// A name - object ID map, IDs as they appear in our output, not the
// original ones.
@@ -10977,11 +10976,11 @@ std::map<OString, sal_Int32> PDFWriterImpl::copyExternalResources(filter::PDFObj
// Get the rKind subset of the resource dictionary.
auto pResources = dynamic_cast<filter::PDFDictionaryElement*>(rPage.Lookup("Resources"));
if (!pResources)
- return aRet;
+ return OString();
auto pDictionary = dynamic_cast<filter::PDFDictionaryElement*>(pResources->LookupElement(rKind));
if (!pDictionary)
- return aRet;
+ return OString();
SvMemoryStream& rDocBuffer = rPage.GetDocument().GetEditBuffer();
@@ -11002,7 +11001,15 @@ std::map<OString, sal_Int32> PDFWriterImpl::copyExternalResources(filter::PDFObj
aRet[rItem.first] = nObject;
}
- return aRet;
+ // Build the dictionary entry string.
+ OString sRet = "/" + rKind + "<<";
+ for (const auto& rPair : aRet)
+ {
+ sRet += "/" + rPair.first + " " + OString::number(rPair.second) + " 0 R";
+ }
+ sRet += ">>";
+
+ return sRet;
}
void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit)
@@ -11050,13 +11057,7 @@ void PDFWriterImpl::writeReferenceXObject(ReferenceXObjectEmit& rEmit)
return;
}
- std::map<OString, sal_Int32> aXObjects = copyExternalResources(*pPage, "XObject");
- OString sXObjects = "/XObject<<";
- for (const auto& rPair : aXObjects)
- {
- sXObjects += "/" + rPair.first + " " + OString::number(rPair.second) + " 0 R";
- }
- sXObjects += ">>";
+ OString sXObjects = copyExternalResources(*pPage, "XObject");
filter::PDFObjectElement* pPageContents = pPage->LookupObject("Contents");
if (!pPageContents)
diff --git a/vcl/source/gdi/pdfwriter_impl.hxx b/vcl/source/gdi/pdfwriter_impl.hxx
index 47956ce72022..57d125270caf 100644
--- a/vcl/source/gdi/pdfwriter_impl.hxx
+++ b/vcl/source/gdi/pdfwriter_impl.hxx
@@ -853,8 +853,8 @@ i12626
/// Writes the form XObject proxy for the image.
void writeReferenceXObject(ReferenceXObjectEmit& rEmit);
/// Copies resources of a given kind from an external page to the output,
- /// returning what has beeen copied (name) and where (object ID).
- std::map<OString, sal_Int32> copyExternalResources(filter::PDFObjectElement& rPage, const OString& rKind);
+ /// returning what has to be included in the new resource dictionary.
+ OString copyExternalResources(filter::PDFObjectElement& rPage, const OString& rKind);
/// Copies a single resource from an external document, returns the new
/// object ID in our document.
sal_Int32 copyExternalResource(SvMemoryStream& rDocBuffer, filter::PDFObjectElement& rObject);