Make CFX_BmpDecompressor members private.
Add the appropriate accessors to make the code build. Give access to an
std::vector by pointer so the caller can avoid copying the content of
the vector.
Change-Id: I5b8e368170259c857141aa677843138308d7565a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/56011
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcodec/bmp/cfx_bmpcontext.cpp b/core/fxcodec/bmp/cfx_bmpcontext.cpp
index d90bfc3..596d117 100644
--- a/core/fxcodec/bmp/cfx_bmpcontext.cpp
+++ b/core/fxcodec/bmp/cfx_bmpcontext.cpp
@@ -8,6 +8,6 @@
CFX_BmpContext::CFX_BmpContext(BmpModule* pModule,
BmpModule::Delegate* pDelegate)
- : m_pModule(pModule), m_pDelegate(pDelegate) {}
+ : m_Bmp(this), m_pModule(pModule), m_pDelegate(pDelegate) {}
-CFX_BmpContext::~CFX_BmpContext() {}
+CFX_BmpContext::~CFX_BmpContext() = default;
diff --git a/core/fxcodec/bmp/cfx_bmpdecompressor.cpp b/core/fxcodec/bmp/cfx_bmpdecompressor.cpp
index 9d1010a..2bff458 100644
--- a/core/fxcodec/bmp/cfx_bmpdecompressor.cpp
+++ b/core/fxcodec/bmp/cfx_bmpdecompressor.cpp
@@ -34,7 +34,8 @@
} // namespace
-CFX_BmpDecompressor::CFX_BmpDecompressor() = default;
+CFX_BmpDecompressor::CFX_BmpDecompressor(CFX_BmpContext* context)
+ : context_(context) {}
CFX_BmpDecompressor::~CFX_BmpDecompressor() = default;
diff --git a/core/fxcodec/bmp/cfx_bmpdecompressor.h b/core/fxcodec/bmp/cfx_bmpdecompressor.h
index 61bda4a..574a831 100644
--- a/core/fxcodec/bmp/cfx_bmpdecompressor.h
+++ b/core/fxcodec/bmp/cfx_bmpdecompressor.h
@@ -20,7 +20,7 @@
class CFX_BmpDecompressor {
public:
- CFX_BmpDecompressor();
+ explicit CFX_BmpDecompressor(CFX_BmpContext* context);
~CFX_BmpDecompressor();
void Error();
@@ -29,8 +29,30 @@
void SetInputBuffer(RetainPtr<CFX_CodecMemory> codec_memory);
FX_FILESIZE GetAvailInput() const;
+ jmp_buf* jmpbuf() { return &jmpbuf_; }
+ const std::vector<uint32_t>* palette() const { return &palette_; }
+ uint32_t width() const { return width_; }
+ uint32_t height() const { return height_; }
+ int32_t components() const { return components_; }
+ bool img_tb_flag() const { return img_tb_flag_; }
+ int32_t pal_num() const { return pal_num_; }
+ int32_t dpi_x() const { return dpi_x_; }
+ int32_t dpi_y() const { return dpi_y_; }
+
+ private:
+ bool GetDataPosition(uint32_t cur_pos);
+ void ReadScanline(uint32_t row_num, const std::vector<uint8_t>& row_buf);
+ int32_t DecodeRGB();
+ int32_t DecodeRLE8();
+ int32_t DecodeRLE4();
+ bool ReadData(uint8_t* destination, uint32_t size);
+ void SaveDecodingStatus(int32_t status);
+ bool ValidateColorIndex(uint8_t val);
+ bool ValidateFlag() const;
+ void SetHeight(int32_t signed_height);
+
jmp_buf jmpbuf_;
- UnownedPtr<CFX_BmpContext> context_;
+ UnownedPtr<CFX_BmpContext> const context_;
std::vector<uint8_t> out_row_buffer_;
std::vector<uint32_t> palette_;
uint32_t header_offset_ = 0;
@@ -55,19 +77,6 @@
uint32_t mask_green_ = 0;
uint32_t mask_blue_ = 0;
int32_t decode_status_ = BMP_D_STATUS_HEADER;
-
- private:
- bool GetDataPosition(uint32_t cur_pos);
- void ReadScanline(uint32_t row_num, const std::vector<uint8_t>& row_buf);
- int32_t DecodeRGB();
- int32_t DecodeRLE8();
- int32_t DecodeRLE4();
- bool ReadData(uint8_t* destination, uint32_t size);
- void SaveDecodingStatus(int32_t status);
- bool ValidateColorIndex(uint8_t val);
- bool ValidateFlag() const;
- void SetHeight(int32_t signed_height);
-
RetainPtr<CFX_CodecMemory> input_buffer_;
};
diff --git a/core/fxcodec/codec/bmpmodule.cpp b/core/fxcodec/codec/bmpmodule.cpp
index 495285c..3ad8f0f 100644
--- a/core/fxcodec/codec/bmpmodule.cpp
+++ b/core/fxcodec/codec/bmpmodule.cpp
@@ -23,9 +23,7 @@
std::unique_ptr<CodecModuleIface::Context> BmpModule::Start(
Delegate* pDelegate) {
- auto p = pdfium::MakeUnique<CFX_BmpContext>(this, pDelegate);
- p->m_Bmp.context_ = p.get();
- return p;
+ return pdfium::MakeUnique<CFX_BmpContext>(this, pDelegate);
}
int32_t BmpModule::ReadHeader(Context* pContext,
@@ -34,33 +32,33 @@
bool* tb_flag,
int32_t* components,
int32_t* pal_num,
- std::vector<uint32_t>* palette,
+ const std::vector<uint32_t>** palette,
CFX_DIBAttribute* pAttribute) {
ASSERT(pAttribute);
auto* ctx = static_cast<CFX_BmpContext*>(pContext);
- if (setjmp(ctx->m_Bmp.jmpbuf_))
+ if (setjmp(*ctx->m_Bmp.jmpbuf()))
return 0;
int32_t ret = ctx->m_Bmp.ReadHeader();
if (ret != 1)
return ret;
- *width = ctx->m_Bmp.width_;
- *height = ctx->m_Bmp.height_;
- *tb_flag = ctx->m_Bmp.img_tb_flag_;
- *components = ctx->m_Bmp.components_;
- *pal_num = ctx->m_Bmp.pal_num_;
- *palette = ctx->m_Bmp.palette_;
+ *width = ctx->m_Bmp.width();
+ *height = ctx->m_Bmp.height();
+ *tb_flag = ctx->m_Bmp.img_tb_flag();
+ *components = ctx->m_Bmp.components();
+ *pal_num = ctx->m_Bmp.pal_num();
+ *palette = ctx->m_Bmp.palette();
pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_METER;
- pAttribute->m_nXDPI = ctx->m_Bmp.dpi_x_;
- pAttribute->m_nYDPI = ctx->m_Bmp.dpi_y_;
+ pAttribute->m_nXDPI = ctx->m_Bmp.dpi_x();
+ pAttribute->m_nYDPI = ctx->m_Bmp.dpi_y();
return 1;
}
int32_t BmpModule::LoadImage(Context* pContext) {
auto* ctx = static_cast<CFX_BmpContext*>(pContext);
- if (setjmp(ctx->m_Bmp.jmpbuf_))
+ if (setjmp(*ctx->m_Bmp.jmpbuf()))
return 0;
return ctx->m_Bmp.DecodeImage();
diff --git a/core/fxcodec/codec/bmpmodule.h b/core/fxcodec/codec/bmpmodule.h
index 70a1de9..d96f4f5 100644
--- a/core/fxcodec/codec/bmpmodule.h
+++ b/core/fxcodec/codec/bmpmodule.h
@@ -41,7 +41,7 @@
bool* tb_flag,
int32_t* components,
int32_t* pal_num,
- std::vector<uint32_t>* palette,
+ const std::vector<uint32_t>** palette,
CFX_DIBAttribute* pAttribute);
int32_t LoadImage(Context* pContext);
};
diff --git a/core/fxcodec/codec/ccodec_progressivedecoder.cpp b/core/fxcodec/codec/ccodec_progressivedecoder.cpp
index 9413a95..45d32d6 100644
--- a/core/fxcodec/codec/ccodec_progressivedecoder.cpp
+++ b/core/fxcodec/codec/ccodec_progressivedecoder.cpp
@@ -724,7 +724,7 @@
pBmpModule->Start(this);
pBmpModule->Input(pBmpContext.get(), m_pCodecMemory, nullptr);
- std::vector<uint32_t> palette;
+ const std::vector<uint32_t>* palette;
int32_t readResult = pBmpModule->ReadHeader(
pBmpContext.get(), &m_SrcWidth, &m_SrcHeight, &m_BmpIsTopBottom,
&m_SrcComponents, &m_SrcPaletteNumber, &palette, pAttribute);
@@ -784,7 +784,7 @@
m_pBmpContext = std::move(pBmpContext);
if (m_SrcPaletteNumber) {
m_pSrcPalette.reset(FX_Alloc(FX_ARGB, m_SrcPaletteNumber));
- memcpy(m_pSrcPalette.get(), palette.data(),
+ memcpy(m_pSrcPalette.get(), palette->data(),
m_SrcPaletteNumber * sizeof(FX_ARGB));
} else {
m_pSrcPalette.reset();