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