summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_dictionary.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fpdfapi/parser/cpdf_dictionary.cpp')
-rw-r--r--core/fpdfapi/parser/cpdf_dictionary.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp
index d4e4080d31..7d84083829 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.cpp
+++ b/core/fpdfapi/parser/cpdf_dictionary.cpp
@@ -16,6 +16,7 @@
#include "core/fpdfapi/parser/cpdf_reference.h"
#include "core/fpdfapi/parser/cpdf_stream.h"
#include "core/fpdfapi/parser/cpdf_string.h"
+#include "core/fpdfapi/parser/fpdf_parser_decode.h"
#include "third_party/base/logging.h"
#include "third_party/base/stl_util.h"
@@ -237,3 +238,41 @@ void CPDF_Dictionary::SetMatrixFor(const CFX_ByteString& key,
CFX_ByteString CPDF_Dictionary::MaybeIntern(const CFX_ByteString& str) {
return m_pPool ? m_pPool->Intern(str) : str;
}
+
+bool CPDF_Dictionary::WriteTo(CFX_FileBufferArchive* archive,
+ FX_FILESIZE* offset) const {
+ if (archive->AppendString("<<") < 0)
+ return false;
+ *offset += 2;
+
+ for (const auto& it : *this) {
+ const CFX_ByteString& key = it.first;
+ CPDF_Object* pValue = it.second.get();
+ if (archive->AppendString("/") < 0)
+ return false;
+
+ int32_t len = archive->AppendString(PDF_NameEncode(key).AsStringC());
+ if (len < 0)
+ return false;
+ *offset += len + 1;
+
+ if (!pValue->IsInline()) {
+ if (archive->AppendString(" ") < 0)
+ return false;
+
+ len = archive->AppendDWord(pValue->GetObjNum());
+ if (len < 0)
+ return false;
+ if (archive->AppendString(" 0 R") < 0)
+ return false;
+ *offset += len + 5;
+ } else {
+ if (!pValue->WriteTo(archive, offset))
+ return false;
+ }
+ }
+ if (archive->AppendString(">>") < 0)
+ return false;
+ *offset += 2;
+ return true;
+}