5#include "core/fpdfapi/parser/cpdf_cross_ref_table.h"
9#include "core/fpdfapi/parser/cpdf_dictionary.h"
10#include "core/fpdfapi/parser/cpdf_parser.h"
11#include "core/fxcrt/check_op.h"
12#include "core/fxcrt/containers/contains.h"
16 std::unique_ptr<CPDF_CrossRefTable> current,
17 std::unique_ptr<CPDF_CrossRefTable> top) {
24 current->Update(
std::move(top));
31 uint32_t trailer_object_number)
33 trailer_object_number_(trailer_object_number) {}
38 uint32_t archive_obj_num,
39 uint32_t archive_obj_index) {
43 auto& info = objects_info_[obj_num];
48 if (info.is_object_stream_flag) {
53 info.archive.obj_num = archive_obj_num;
54 info.archive.obj_index = archive_obj_index;
57 objects_info_[archive_obj_num].is_object_stream_flag =
true;
62 bool is_object_stream,
66 auto& info = objects_info_[obj_num];
67 if (info.gennum > gen_num)
71 info.is_object_stream_flag |= is_object_stream;
72 info.gennum = gen_num;
79 auto& info = objects_info_[obj_num];
81 info.gennum = gen_num;
86 uint32_t trailer_object_number) {
87 trailer_ = std::move(trailer);
88 trailer_object_number_ = trailer_object_number;
92 uint32_t obj_num)
const {
93 const auto it = objects_info_.find(obj_num);
94 return it != objects_info_.end() ? &it->second :
nullptr;
98 std::unique_ptr<CPDF_CrossRefTable> new_cross_ref) {
99 UpdateInfo(std::move(new_cross_ref->objects_info_));
100 UpdateTrailer(
std::move(new_cross_ref->trailer_));
105 objects_info_.clear();
109 objects_info_.erase(objects_info_.lower_bound(size), objects_info_.end());
111 if (!pdfium::Contains(objects_info_, size - 1)) {
112 objects_info_[size - 1].pos = 0;
117 std::map<uint32_t, ObjectInfo> new_objects_info) {
118 if (new_objects_info.empty()) {
122 if (objects_info_.empty()) {
123 objects_info_ = std::move(new_objects_info);
127 auto cur_it = objects_info_.begin();
128 auto new_it = new_objects_info.begin();
129 while (cur_it != objects_info_.end() && new_it != new_objects_info.end()) {
130 if (cur_it->first == new_it->first) {
133 cur_it->second.is_object_stream_flag) {
134 new_it->second.is_object_stream_flag =
true;
138 }
else if (cur_it->first < new_it->first) {
139 new_objects_info.insert(new_it, *cur_it);
142 new_it = new_objects_info.lower_bound(cur_it->first);
145 for (; cur_it != objects_info_.end(); ++cur_it) {
146 new_objects_info.insert(new_objects_info.end(), *cur_it);
148 objects_info_ = std::move(new_objects_info);
156 trailer_ = std::move(new_trailer);
160 new_trailer->SetFor(
"XRefStm", trailer_->RemoveFor(
"XRefStm"));
161 new_trailer->SetFor(
"Prev", trailer_->RemoveFor(
"Prev"));
163 for (
const auto& key : new_trailer->GetKeys())
164 trailer_->SetFor(key, new_trailer->RemoveFor(key.AsStringView()));
const ObjectInfo * GetObjectInfo(uint32_t obj_num) const
CPDF_CrossRefTable(RetainPtr< CPDF_Dictionary > trailer, uint32_t trailer_object_number)
void SetFree(uint32_t obj_num, uint16_t gen_num)
void Update(std::unique_ptr< CPDF_CrossRefTable > new_cross_ref)
void AddCompressed(uint32_t obj_num, uint32_t archive_obj_num, uint32_t archive_obj_index)
void AddNormal(uint32_t obj_num, uint16_t gen_num, bool is_object_stream, FX_FILESIZE pos)
void SetTrailer(RetainPtr< CPDF_Dictionary > trailer, uint32_t trailer_object_number)
void SetObjectMapSize(uint32_t size)
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
static constexpr uint32_t kMaxObjectNumber