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/span.h" 19 #include "core/fxcrt/unowned_ptr.h" 20 #include "core/fxge/dib/fx_dib.h" 21 22 class CFX_CodecMemory; 23 24 namespace fxcodec { 25 26 class CFX_BmpContext; 27 28 class CFX_BmpDecompressor { 29 public: 30 explicit CFX_BmpDecompressor(const CFX_BmpContext* context); 31 ~CFX_BmpDecompressor(); 32 33 BmpDecoder::Status DecodeImage(); 34 BmpDecoder::Status ReadHeader(); 35 void SetInputBuffer(RetainPtr<CFX_CodecMemory> codec_memory); 36 FX_FILESIZE GetAvailInput() const; 37 palette()38 pdfium::span<const FX_ARGB> palette() const { return palette_; } width()39 uint32_t width() const { return width_; } height()40 uint32_t height() const { return height_; } components()41 int32_t components() const { return components_; } img_tb_flag()42 bool img_tb_flag() const { return img_tb_flag_; } 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<FX_ARGB> 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 PalType pal_type_ = PalType::kNew; 88 uint32_t data_offset_ = 0; 89 uint32_t data_size_ = 0; 90 uint32_t img_ifh_size_ = 0; 91 uint32_t row_num_ = 0; 92 uint32_t col_num_ = 0; 93 int32_t dpi_x_ = 0; 94 int32_t dpi_y_ = 0; 95 uint32_t mask_red_ = 0; 96 uint32_t mask_green_ = 0; 97 uint32_t mask_blue_ = 0; 98 DecodeStatus decode_status_ = DecodeStatus::kHeader; 99 RetainPtr<CFX_CodecMemory> input_buffer_; 100 }; 101 102 } // namespace fxcodec 103 104 #endif // CORE_FXCODEC_BMP_CFX_BMPDECOMPRESSOR_H_ 105