From 9e12f14814722c0c0d46d4968f636b5e1a72a1e7 Mon Sep 17 00:00:00 2001 From: Artem Strygin Date: Wed, 27 Jun 2018 17:52:40 +0000 Subject: Implement CPDF_CrossRefTable Change-Id: I5ac61ab323adb5eec2de8660064fff95ee877b5e Reviewed-on: https://pdfium-review.googlesource.com/35432 Reviewed-by: dsinclair Commit-Queue: Art Snake --- core/fpdfapi/parser/cpdf_cross_ref_table.h | 68 ++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 core/fpdfapi/parser/cpdf_cross_ref_table.h (limited to 'core/fpdfapi/parser/cpdf_cross_ref_table.h') diff --git a/core/fpdfapi/parser/cpdf_cross_ref_table.h b/core/fpdfapi/parser/cpdf_cross_ref_table.h new file mode 100644 index 0000000000..ade1b336b2 --- /dev/null +++ b/core/fpdfapi/parser/cpdf_cross_ref_table.h @@ -0,0 +1,68 @@ +// Copyright 2018 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CORE_FPDFAPI_PARSER_CPDF_CROSS_REF_TABLE_H_ +#define CORE_FPDFAPI_PARSER_CPDF_CROSS_REF_TABLE_H_ + +#include +#include + +#include "core/fxcrt/fx_system.h" + +class CPDF_Dictionary; + +class CPDF_CrossRefTable { + public: + enum class ObjectType : uint8_t { + kFree = 0x00, + kNormal = 0x01, + kNotCompressed = kNormal, + kCompressed = 0x02, + kObjStream = 0xFF, + kNull = kObjStream, + }; + + struct ObjectInfo { + ObjectInfo() : pos(0), type(ObjectType::kFree), gennum(0) {} + // if type is ObjectType::kCompressed the archive_obj_num should be used. + // if type is ObjectType::kNotCompressed the pos should be used. + // In other cases its are unused. + union { + FX_FILESIZE pos; + uint32_t archive_obj_num; + }; + ObjectType type; + uint16_t gennum; + }; + + CPDF_CrossRefTable(); + explicit CPDF_CrossRefTable(std::unique_ptr trailer); + ~CPDF_CrossRefTable(); + + void AddCompressed(uint32_t obj_num, uint32_t archive_obj_num); + void AddNormal(uint32_t obj_num, uint16_t gen_num, FX_FILESIZE pos); + void SetFree(uint32_t obj_num); + + const CPDF_Dictionary* trailer() const { return trailer_.get(); } + void SetTrailer(std::unique_ptr trailer); + + const ObjectInfo* GetObjectInfo(uint32_t obj_num) const; + + const std::map& objects_info() const { + return objects_info_; + } + + void Update(std::unique_ptr new_cross_ref); + + void ShrinkObjectMap(uint32_t objnum); + + private: + void UpdateInfo(std::map&& new_objects_info); + void UpdateTrailer(std::unique_ptr new_trailer); + + std::unique_ptr trailer_; + std::map objects_info_; +}; + +#endif // CORE_FPDFAPI_PARSER_CPDF_CROSS_REF_TABLE_H_ -- cgit v1.2.3