Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
lzw_decompressor.h
Go to the documentation of this file.
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 <stddef.h>
11#include <stdint.h>
12
13#include <array>
14#include <memory>
15
16#include "core/fxcodec/gif/cfx_gif.h"
17#include "core/fxcrt/compiler_specific.h"
18#include "core/fxcrt/data_vector.h"
19#include "core/fxcrt/span.h"
20
21namespace fxcodec {
22
24 public:
31
32 struct CodeEntry {
33 uint16_t prefix;
34 uint8_t suffix;
35 };
36
37 // Returns nullptr on error
38 static std::unique_ptr<LZWDecompressor> Create(uint8_t color_exp,
39 uint8_t code_exp);
41
42 void SetSource(pdfium::span<const uint8_t> src_buf) {
43 avail_input_ = src_buf;
44 }
45 UNSAFE_BUFFER_USAGE Status Decode(uint8_t* dest_buf, uint32_t* dest_size);
46
47 // Used by unittests, should not be called in production code.
48 size_t ExtractDataForTest(pdfium::span<uint8_t> dest_buf) {
49 return ExtractData(dest_buf);
50 }
51
52 DataVector<uint8_t>* DecompressedForTest() { return &decompressed_; }
53 size_t* DecompressedNextForTest() { return &decompressed_next_; }
54
55 private:
56 // Use Create() instead.
57 LZWDecompressor(uint8_t color_exp, uint8_t code_exp);
58
59 void ClearTable();
60 void AddCode(uint16_t prefix_code, uint8_t append_char);
61 bool DecodeString(uint16_t code);
62 size_t ExtractData(pdfium::span<uint8_t> dest_buf);
63
64 const uint8_t code_size_;
65 uint8_t code_size_cur_ = 0;
66 const uint16_t code_color_end_;
67 const uint16_t code_clear_;
68 const uint16_t code_end_;
69 uint16_t code_next_ = 0;
70 uint8_t code_first_ = 0;
71 DataVector<uint8_t> decompressed_;
72 size_t decompressed_next_ = 0;
73 uint16_t code_old_ = 0;
74 pdfium::span<const uint8_t> avail_input_;
75 uint8_t bits_left_ = 0;
76 uint32_t code_store_ = 0;
77 std::array<CodeEntry, GIF_MAX_LZW_CODE> code_table_;
78};
79
80} // namespace fxcodec
81
83
84#endif // CORE_FXCODEC_GIF_LZW_DECOMPRESSOR_H_
#define GIF_SIG_EXTENSION
Definition cfx_gif.h:20
#define GIF_BLOCK_GCE
Definition cfx_gif.h:23
#define GIF_D_STATUS_TAIL
Definition cfx_gif.h:30
#define GIF_D_STATUS_EXT
Definition cfx_gif.h:31
#define GIF_D_STATUS_EXT_UNE
Definition cfx_gif.h:35
#define GIF_SIG_TRAILER
Definition cfx_gif.h:22
#define GIF_D_STATUS_EXT_GCE
Definition cfx_gif.h:33
#define GIF_SIG_IMAGE
Definition cfx_gif.h:21
#define GIF_D_STATUS_EXT_CE
Definition cfx_gif.h:32
#define GIF_D_STATUS_SIG
Definition cfx_gif.h:29
#define GIF_D_STATUS_IMG_INFO
Definition cfx_gif.h:36
#define GIF_MAX_LZW_CODE
Definition cfx_gif.h:28
#define GIF_BLOCK_PTE
Definition cfx_gif.h:24
#define GIF_MAX_LZW_EXP
Definition cfx_gif.h:27
#define GIF_BLOCK_TERMINAL
Definition cfx_gif.h:26
#define GIF_BLOCK_CE
Definition cfx_gif.h:25
#define GIF_D_STATUS_IMG_DATA
Definition cfx_gif.h:37
#define GIF_D_STATUS_EXT_PTE
Definition cfx_gif.h:34
CFX_GifContext(GifDecoder::Delegate *delegate)
std::unique_ptr< CFX_GifGraphicControlExtension > graphic_control_extension_
GifDecoder::Status GetFrame()
void SetInputBuffer(RetainPtr< CFX_CodecMemory > codec_memory)
GifDecoder::Status LoadFrame(size_t frame_num)
RetainPtr< CFX_CodecMemory > input_buffer_
size_t GetFrameNum() const
std::unique_ptr< LZWDecompressor > lzw_decompressor_
bool GetRecordPosition(uint32_t cur_pos, int32_t left, int32_t top, int32_t width, int32_t height, pdfium::span< CFX_GifPalette > pal, int32_t trans_index, bool interlace)
uint32_t GetAvailInput() const
void ReadScanline(int32_t row_num, pdfium::span< uint8_t > row_buf)
std::vector< std::unique_ptr< CFX_GifImage > > images_
std::vector< CFX_GifPalette > global_palette_
bool ReadAllOrNone(pdfium::span< uint8_t > dest)
GifDecoder::Status ReadHeader()
GifDecoder::Status ReadLogicalScreenDescriptor()
UnownedPtr< GifDecoder::Delegate > const delegate_
GifDecoder::Status ReadGifSignature()
virtual uint32_t GifCurrentPosition() const =0
virtual bool GifInputRecordPositionBuf(uint32_t rcd_pos, const FX_RECT &img_rc, pdfium::span< CFX_GifPalette > pal_ptr, int32_t trans_index, bool interlace)=0
virtual void GifReadScanline(int32_t row_num, pdfium::span< uint8_t > row_buf)=0
static FX_FILESIZE GetAvailInput(ProgressiveDecoderIface::Context *context)
static bool Input(ProgressiveDecoderIface::Context *context, RetainPtr< CFX_CodecMemory > codec_memory)
static std::unique_ptr< ProgressiveDecoderIface::Context > StartDecode(Delegate *pDelegate)
GifDecoder & operator=(const GifDecoder &)=delete
static Status LoadFrame(ProgressiveDecoderIface::Context *context, size_t frame_num)
static std::pair< Status, size_t > LoadFrameInfo(ProgressiveDecoderIface::Context *context)
static Status ReadHeader(ProgressiveDecoderIface::Context *context, int *width, int *height, pdfium::span< CFX_GifPalette > *pal_pp, int *bg_index)
GifDecoder(const GifDecoder &)=delete
DataVector< uint8_t > * DecompressedForTest()
size_t ExtractDataForTest(pdfium::span< uint8_t > dest_buf)
static std::unique_ptr< LZWDecompressor > Create(uint8_t color_exp, uint8_t code_exp)
UNSAFE_BUFFER_USAGE Status Decode(uint8_t *dest_buf, uint32_t *dest_size)
void SetSource(pdfium::span< const uint8_t > src_buf)
#define UNSAFE_BUFFER_USAGE
#define UNSAFE_TODO(...)
#define FX_FILESIZE
Definition fx_types.h:19
fxcodec::GifDecoder GifDecoder
Definition gif_decoder.h:66
fxcodec::LZWDecompressor LZWDecompressor
uint16_t FromLE16(uint16_t x)
Definition byteorder.h:56
uint8_t global_pal
Definition cfx_gif.h:44
uint8_t color_resolution
Definition cfx_gif.h:43
uint8_t sort_flag
Definition cfx_gif.h:42
uint8_t pal_bits
Definition cfx_gif.h:41
uint16_t height
Definition cfx_gif.h:71
uint16_t top
Definition cfx_gif.h:69
uint16_t left
Definition cfx_gif.h:68
uint16_t width
Definition cfx_gif.h:70
CFX_GifLocalFlags local_flags
Definition cfx_gif.h:72
uint8_t code_exp
Definition cfx_gif.h:123
CFX_GifImageInfo image_info
Definition cfx_gif.h:121
uint8_t local_palette_exp
Definition cfx_gif.h:122
int32_t row_num
Definition cfx_gif.h:125
uint8_t local_pal
Definition cfx_gif.h:52
uint8_t interlace
Definition cfx_gif.h:51
uint8_t pal_bits
Definition cfx_gif.h:48
CFX_GifGlobalFlags global_flags
Definition cfx_gif.h:62