xref: /aosp_15_r20/external/pdfium/core/fxcodec/bmp/cfx_bmpdecompressor.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 // Copyright 2018 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_BMP_CFX_BMPDECOMPRESSOR_H_
8 #define CORE_FXCODEC_BMP_CFX_BMPDECOMPRESSOR_H_
9 
10 #include <stdint.h>
11 
12 #include <vector>
13 
14 #include "core/fxcodec/bmp/bmp_decoder.h"
15 #include "core/fxcodec/bmp/fx_bmp.h"
16 #include "core/fxcrt/data_vector.h"
17 #include "core/fxcrt/retain_ptr.h"
18 #include "core/fxcrt/unowned_ptr.h"
19 #include "third_party/base/containers/span.h"
20 
21 class CFX_CodecMemory;
22 
23 namespace fxcodec {
24 
25 class CFX_BmpContext;
26 
27 class CFX_BmpDecompressor {
28  public:
29   explicit CFX_BmpDecompressor(const CFX_BmpContext* context);
30   ~CFX_BmpDecompressor();
31 
32   BmpDecoder::Status DecodeImage();
33   BmpDecoder::Status ReadHeader();
34   void SetInputBuffer(RetainPtr<CFX_CodecMemory> codec_memory);
35   FX_FILESIZE GetAvailInput() const;
36 
palette()37   const std::vector<uint32_t>* palette() const { return &palette_; }
width()38   uint32_t width() const { return width_; }
height()39   uint32_t height() const { return height_; }
components()40   int32_t components() const { return components_; }
img_tb_flag()41   bool img_tb_flag() const { return img_tb_flag_; }
pal_num()42   int32_t pal_num() const { return pal_num_; }
dpi_x()43   int32_t dpi_x() const { return dpi_x_; }
dpi_y()44   int32_t dpi_y() const { return dpi_y_; }
45 
46  private:
47   enum class DecodeStatus : uint8_t {
48     kHeader,
49     kPal,
50     kDataPre,
51     kData,
52     kTail,
53   };
54 
55   enum class PalType : bool { kNew, kOld };
56 
57   BmpDecoder::Status ReadBmpHeader();
58   BmpDecoder::Status ReadBmpHeaderIfh();
59   BmpDecoder::Status ReadBmpHeaderDimensions();
60   BmpDecoder::Status ReadBmpBitfields();
61   BmpDecoder::Status ReadBmpPalette();
62   bool GetDataPosition(uint32_t cur_pos);
63   void ReadNextScanline();
64   BmpDecoder::Status DecodeRGB();
65   BmpDecoder::Status DecodeRLE8();
66   BmpDecoder::Status DecodeRLE4();
67   bool ReadAllOrNone(pdfium::span<uint8_t> buf);
68   void SaveDecodingStatus(DecodeStatus status);
69   bool ValidateColorIndex(uint8_t val) const;
70   bool ValidateFlag() const;
71   bool SetHeight(int32_t signed_height);
PaletteChannelCount()72   int PaletteChannelCount() const { return pal_type_ == PalType::kNew ? 4 : 3; }
73 
74   UnownedPtr<const CFX_BmpContext> const context_;
75   DataVector<uint8_t> out_row_buffer_;
76   std::vector<uint32_t> palette_;
77   uint32_t header_offset_ = 0;
78   uint32_t width_ = 0;
79   uint32_t height_ = 0;
80   uint32_t compress_flag_ = 0;
81   int32_t components_ = 0;
82   size_t src_row_bytes_ = 0;
83   size_t out_row_bytes_ = 0;
84   bool img_tb_flag_ = false;
85   uint16_t bit_counts_ = 0;
86   uint32_t color_used_ = 0;
87   int32_t pal_num_ = 0;
88   PalType pal_type_ = PalType::kNew;
89   uint32_t data_offset_ = 0;
90   uint32_t data_size_ = 0;
91   uint32_t img_ifh_size_ = 0;
92   uint32_t row_num_ = 0;
93   uint32_t col_num_ = 0;
94   int32_t dpi_x_ = 0;
95   int32_t dpi_y_ = 0;
96   uint32_t mask_red_ = 0;
97   uint32_t mask_green_ = 0;
98   uint32_t mask_blue_ = 0;
99   DecodeStatus decode_status_ = DecodeStatus::kHeader;
100   RetainPtr<CFX_CodecMemory> input_buffer_;
101 };
102 
103 }  // namespace fxcodec
104 
105 #endif  // CORE_FXCODEC_BMP_CFX_BMPDECOMPRESSOR_H_
106