• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 PDFium Authors. All rights reserved.
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_CFX_LZWDECOMPRESSOR_H_
8 #define CORE_FXCODEC_GIF_CFX_LZWDECOMPRESSOR_H_
9 
10 #include <memory>
11 #include <vector>
12 
13 #include "core/fxcodec/gif/cfx_gif.h"
14 
15 class CFX_LZWDecompressor {
16  public:
17   typedef struct {
18     uint16_t prefix;
19     uint8_t suffix;
20   } CodeEntry;
21 
22   // Returns nullptr on error
23   static std::unique_ptr<CFX_LZWDecompressor> Create(uint8_t color_exp,
24                                                      uint8_t code_exp);
25   ~CFX_LZWDecompressor();
26 
27   CFX_GifDecodeStatus Decode(uint8_t* src_buf,
28                              uint32_t src_size,
29                              uint8_t* des_buf,
30                              uint32_t* des_size);
31 
32   // Used by unittests, should not be called in production code.
ExtractDataForTest(uint8_t * des_buf,uint32_t des_size)33   uint32_t ExtractDataForTest(uint8_t* des_buf, uint32_t des_size) {
34     return ExtractData(des_buf, des_size);
35   }
36 
DecompressedForTest()37   std::vector<uint8_t>* DecompressedForTest() { return &decompressed_; }
38 
DecompressedNextForTest()39   size_t* DecompressedNextForTest() { return &decompressed_next_; }
40 
41  private:
42   CFX_LZWDecompressor(uint8_t color_exp, uint8_t code_exp);
43   void ClearTable();
44   void AddCode(uint16_t prefix_code, uint8_t append_char);
45   bool DecodeString(uint16_t code);
46   uint32_t ExtractData(uint8_t* des_buf, uint32_t des_size);
47 
48   uint8_t code_size_;
49   uint8_t code_size_cur_;
50   uint16_t code_color_end_;
51   uint16_t code_clear_;
52   uint16_t code_end_;
53   uint16_t code_next_;
54   uint8_t code_first_;
55   std::vector<uint8_t> decompressed_;
56   size_t decompressed_next_;
57   CodeEntry code_table_[GIF_MAX_LZW_CODE];
58   uint16_t code_old_;
59   uint8_t* next_in_;
60   uint32_t avail_in_;
61   uint8_t bits_left_;
62   uint32_t code_store_;
63 };
64 
65 #endif  // CORE_FXCODEC_GIF_CFX_LZWDECOMPRESSOR_H_
66