1 // Copyright 2017 The PDFium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #ifndef CORE_FXCODEC_GIF_LZW_DECOMPRESSOR_H_ 8 #define CORE_FXCODEC_GIF_LZW_DECOMPRESSOR_H_ 9 10 #include <stdint.h> 11 12 #include <memory> 13 14 #include "core/fxcodec/gif/cfx_gif.h" 15 #include "core/fxcrt/data_vector.h" 16 17 namespace fxcodec { 18 19 class LZWDecompressor { 20 public: 21 enum class Status { 22 kError, 23 kSuccess, 24 kUnfinished, 25 kInsufficientDestSize, 26 }; 27 28 struct CodeEntry { 29 uint16_t prefix; 30 uint8_t suffix; 31 }; 32 33 // Returns nullptr on error 34 static std::unique_ptr<LZWDecompressor> Create(uint8_t color_exp, 35 uint8_t code_exp); 36 ~LZWDecompressor(); 37 38 void SetSource(const uint8_t* src_buf, uint32_t src_size); 39 Status Decode(uint8_t* dest_buf, uint32_t* dest_size); 40 41 // Used by unittests, should not be called in production code. ExtractDataForTest(uint8_t * dest_buf,uint32_t dest_size)42 uint32_t ExtractDataForTest(uint8_t* dest_buf, uint32_t dest_size) { 43 return ExtractData(dest_buf, dest_size); 44 } 45 DecompressedForTest()46 DataVector<uint8_t>* DecompressedForTest() { return &decompressed_; } DecompressedNextForTest()47 size_t* DecompressedNextForTest() { return &decompressed_next_; } 48 49 private: 50 // Use Create() instead. 51 LZWDecompressor(uint8_t color_exp, uint8_t code_exp); 52 53 void ClearTable(); 54 void AddCode(uint16_t prefix_code, uint8_t append_char); 55 bool DecodeString(uint16_t code); 56 uint32_t ExtractData(uint8_t* dest_buf, uint32_t dest_size); 57 58 const uint8_t code_size_; 59 uint8_t code_size_cur_ = 0; 60 const uint16_t code_color_end_; 61 const uint16_t code_clear_; 62 const uint16_t code_end_; 63 uint16_t code_next_ = 0; 64 uint8_t code_first_ = 0; 65 DataVector<uint8_t> decompressed_; 66 size_t decompressed_next_ = 0; 67 uint16_t code_old_ = 0; 68 const uint8_t* next_in_ = nullptr; 69 uint32_t avail_in_ = 0; 70 uint8_t bits_left_ = 0; 71 uint32_t code_store_ = 0; 72 CodeEntry code_table_[GIF_MAX_LZW_CODE]; 73 }; 74 75 } // namespace fxcodec 76 77 using LZWDecompressor = fxcodec::LZWDecompressor; 78 79 #endif // CORE_FXCODEC_GIF_LZW_DECOMPRESSOR_H_ 80