Add BmpModule::Status enum class.
Use it in place of int as a return type, so the return values are more
meaningful.
Change-Id: Ibbcb3a652246b1fae0ec7bb05e22df6b53b2e3e1
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/56090
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcodec/bmp/cfx_bmpdecompressor.cpp b/core/fxcodec/bmp/cfx_bmpdecompressor.cpp
index 32362da..f494b8e 100644
--- a/core/fxcodec/bmp/cfx_bmpdecompressor.cpp
+++ b/core/fxcodec/bmp/cfx_bmpdecompressor.cpp
@@ -344,7 +344,7 @@
}
}
-int32_t CFX_BmpDecompressor::DecodeImage() {
+BmpModule::Status CFX_BmpDecompressor::DecodeImage() {
if (decode_status_ == DecodeStatus::kDataPre) {
input_buffer_->Seek(0);
if (!GetDataPosition(header_offset_)) {
@@ -370,7 +370,7 @@
case kBmpRle4:
return DecodeRLE4();
default:
- return 0;
+ return BmpModule::Status::kFail;
}
}
@@ -383,12 +383,12 @@
return true;
}
-int32_t CFX_BmpDecompressor::DecodeRGB() {
+BmpModule::Status CFX_BmpDecompressor::DecodeRGB() {
std::vector<uint8_t> dest_buf(src_row_bytes_);
while (row_num_ < height_) {
size_t idx = 0;
if (!ReadData(dest_buf.data(), src_row_bytes_))
- return 2;
+ return BmpModule::Status::kContinue;
SaveDecodingStatus(DecodeStatus::kData);
switch (bit_counts_) {
@@ -422,7 +422,7 @@
green_bits += blue_bits;
red_bits += green_bits;
if (blue_bits > 8 || green_bits < 8 || red_bits < 8)
- return 2;
+ return BmpModule::Status::kContinue;
blue_bits = 8 - blue_bits;
green_bits -= 8;
red_bits -= 8;
@@ -448,25 +448,25 @@
}
for (uint8_t byte : out_row_buffer_) {
if (!ValidateColorIndex(byte))
- return 0;
+ return BmpModule::Status::kFail;
}
ReadNextScanline();
}
SaveDecodingStatus(DecodeStatus::kTail);
- return 1;
+ return BmpModule::Status::kSuccess;
}
-int32_t CFX_BmpDecompressor::DecodeRLE8() {
+BmpModule::Status CFX_BmpDecompressor::DecodeRLE8() {
uint8_t first_part;
col_num_ = 0;
while (true) {
if (!ReadData(&first_part, sizeof(first_part)))
- return 2;
+ return BmpModule::Status::kContinue;
switch (first_part) {
case kRleMarker: {
if (!ReadData(&first_part, sizeof(first_part)))
- return 2;
+ return BmpModule::Status::kContinue;
switch (first_part) {
case kRleEol: {
@@ -486,12 +486,12 @@
if (row_num_ < height_)
ReadNextScanline();
SaveDecodingStatus(DecodeStatus::kTail);
- return 1;
+ return BmpModule::Status::kSuccess;
}
case kRleDelta: {
uint8_t delta[2];
if (!ReadData(delta, sizeof(delta)))
- return 2;
+ return BmpModule::Status::kContinue;
col_num_ += delta[0];
size_t bmp_row_num__next = row_num_ + delta[1];
@@ -518,13 +518,13 @@
std::vector<uint8_t> second_part(second_part_size);
uint8_t* second_part_data = second_part.data();
if (!ReadData(second_part_data, second_part_size))
- return 2;
+ return BmpModule::Status::kContinue;
std::copy(second_part_data, second_part_data + first_part,
out_row_buffer_.begin() + col_num_);
for (size_t i = col_num_; i < col_num_ + first_part; ++i) {
if (!ValidateColorIndex(out_row_buffer_[i]))
- return 0;
+ return BmpModule::Status::kFail;
}
col_num_ += first_part;
}
@@ -540,12 +540,12 @@
uint8_t second_part;
if (!ReadData(&second_part, sizeof(second_part)))
- return 2;
+ return BmpModule::Status::kContinue;
std::fill(out_row_buffer_.begin() + col_num_,
out_row_buffer_.begin() + col_num_ + first_part, second_part);
if (!ValidateColorIndex(out_row_buffer_[col_num_]))
- return 0;
+ return BmpModule::Status::kFail;
col_num_ += first_part;
}
}
@@ -554,18 +554,18 @@
NOTREACHED();
}
-int32_t CFX_BmpDecompressor::DecodeRLE4() {
+BmpModule::Status CFX_BmpDecompressor::DecodeRLE4() {
uint8_t first_part;
col_num_ = 0;
while (true) {
if (!ReadData(&first_part, sizeof(first_part)))
- return 2;
+ return BmpModule::Status::kContinue;
switch (first_part) {
case kRleMarker: {
- if (!ReadData(&first_part, sizeof(first_part))) {
- return 2;
- }
+ if (!ReadData(&first_part, sizeof(first_part)))
+ return BmpModule::Status::kContinue;
+
switch (first_part) {
case kRleEol: {
if (row_num_ >= height_) {
@@ -584,12 +584,12 @@
if (row_num_ < height_)
ReadNextScanline();
SaveDecodingStatus(DecodeStatus::kTail);
- return 1;
+ return BmpModule::Status::kSuccess;
}
case kRleDelta: {
uint8_t delta[2];
if (!ReadData(delta, sizeof(delta)))
- return 2;
+ return BmpModule::Status::kContinue;
col_num_ += delta[0];
size_t bmp_row_num__next = row_num_ + delta[1];
@@ -623,13 +623,13 @@
std::vector<uint8_t> second_part(second_part_size);
uint8_t* second_part_data = second_part.data();
if (!ReadData(second_part_data, second_part_size))
- return 2;
+ return BmpModule::Status::kContinue;
for (uint8_t i = 0; i < first_part; i++) {
uint8_t color = (i & 0x01) ? (*second_part_data++ & 0x0F)
: (*second_part_data & 0xF0) >> 4;
if (!ValidateColorIndex(color))
- return 0;
+ return BmpModule::Status::kFail;
out_row_buffer_[col_num_++] = color;
}
@@ -655,14 +655,14 @@
}
uint8_t second_part;
if (!ReadData(&second_part, sizeof(second_part)))
- return 2;
+ return BmpModule::Status::kContinue;
for (uint8_t i = 0; i < first_part; i++) {
uint8_t second_byte = second_part;
second_byte =
i & 0x01 ? (second_byte & 0x0F) : (second_byte & 0xF0) >> 4;
if (!ValidateColorIndex(second_byte))
- return 0;
+ return BmpModule::Status::kFail;
out_row_buffer_[col_num_++] = second_byte;
}
diff --git a/core/fxcodec/bmp/cfx_bmpdecompressor.h b/core/fxcodec/bmp/cfx_bmpdecompressor.h
index eb987b2..2d25141 100644
--- a/core/fxcodec/bmp/cfx_bmpdecompressor.h
+++ b/core/fxcodec/bmp/cfx_bmpdecompressor.h
@@ -12,6 +12,7 @@
#include <vector>
#include "core/fxcodec/bmp/fx_bmp.h"
+#include "core/fxcodec/codec/bmpmodule.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/unowned_ptr.h"
@@ -24,7 +25,7 @@
~CFX_BmpDecompressor();
void Error();
- int32_t DecodeImage();
+ BmpModule::Status DecodeImage();
bool ReadHeader();
void SetInputBuffer(RetainPtr<CFX_CodecMemory> codec_memory);
FX_FILESIZE GetAvailInput() const;
@@ -55,9 +56,9 @@
bool ReadBmpPalette();
bool GetDataPosition(uint32_t cur_pos);
void ReadNextScanline();
- int32_t DecodeRGB();
- int32_t DecodeRLE8();
- int32_t DecodeRLE4();
+ BmpModule::Status DecodeRGB();
+ BmpModule::Status DecodeRLE8();
+ BmpModule::Status DecodeRLE4();
bool ReadData(uint8_t* destination, uint32_t size);
void SaveDecodingStatus(DecodeStatus status);
bool ValidateColorIndex(uint8_t val);
diff --git a/core/fxcodec/codec/bmpmodule.cpp b/core/fxcodec/codec/bmpmodule.cpp
index 26d1bfd..d052413 100644
--- a/core/fxcodec/codec/bmpmodule.cpp
+++ b/core/fxcodec/codec/bmpmodule.cpp
@@ -26,22 +26,22 @@
return pdfium::MakeUnique<CFX_BmpContext>(this, pDelegate);
}
-int32_t BmpModule::ReadHeader(Context* pContext,
- int32_t* width,
- int32_t* height,
- bool* tb_flag,
- int32_t* components,
- int32_t* pal_num,
- const std::vector<uint32_t>** palette,
- CFX_DIBAttribute* pAttribute) {
+BmpModule::Status BmpModule::ReadHeader(Context* pContext,
+ int32_t* width,
+ int32_t* height,
+ bool* tb_flag,
+ int32_t* components,
+ int32_t* pal_num,
+ const std::vector<uint32_t>** palette,
+ CFX_DIBAttribute* pAttribute) {
ASSERT(pAttribute);
auto* ctx = static_cast<CFX_BmpContext*>(pContext);
if (setjmp(*ctx->m_Bmp.jmpbuf()))
- return 0;
+ return Status::kFail;
if (!ctx->m_Bmp.ReadHeader())
- return 2;
+ return Status::kContinue;
*width = ctx->m_Bmp.width();
*height = ctx->m_Bmp.height();
@@ -52,13 +52,13 @@
pAttribute->m_wDPIUnit = FXCODEC_RESUNIT_METER;
pAttribute->m_nXDPI = ctx->m_Bmp.dpi_x();
pAttribute->m_nYDPI = ctx->m_Bmp.dpi_y();
- return 1;
+ return Status::kSuccess;
}
-int32_t BmpModule::LoadImage(Context* pContext) {
+BmpModule::Status BmpModule::LoadImage(Context* pContext) {
auto* ctx = static_cast<CFX_BmpContext*>(pContext);
if (setjmp(*ctx->m_Bmp.jmpbuf()))
- return 0;
+ return Status::kFail;
return ctx->m_Bmp.DecodeImage();
}
diff --git a/core/fxcodec/codec/bmpmodule.h b/core/fxcodec/codec/bmpmodule.h
index d96f4f5..3a8b257 100644
--- a/core/fxcodec/codec/bmpmodule.h
+++ b/core/fxcodec/codec/bmpmodule.h
@@ -25,6 +25,8 @@
const std::vector<uint8_t>& row_buf) = 0;
};
+ enum class Status : uint8_t { kFail, kSuccess, kContinue };
+
BmpModule();
~BmpModule() override;
@@ -35,15 +37,15 @@
CFX_DIBAttribute* pAttribute) override;
std::unique_ptr<Context> Start(Delegate* pDelegate);
- int32_t ReadHeader(Context* pContext,
- int32_t* width,
- int32_t* height,
- bool* tb_flag,
- int32_t* components,
- int32_t* pal_num,
- const std::vector<uint32_t>** palette,
- CFX_DIBAttribute* pAttribute);
- int32_t LoadImage(Context* pContext);
+ Status ReadHeader(Context* pContext,
+ int32_t* width,
+ int32_t* height,
+ bool* tb_flag,
+ int32_t* components,
+ int32_t* pal_num,
+ const std::vector<uint32_t>** palette,
+ CFX_DIBAttribute* pAttribute);
+ Status LoadImage(Context* pContext);
};
} // namespace fxcodec
diff --git a/core/fxcodec/codec/ccodec_progressivedecoder.cpp b/core/fxcodec/codec/ccodec_progressivedecoder.cpp
index 45d32d6..433e88a 100644
--- a/core/fxcodec/codec/ccodec_progressivedecoder.cpp
+++ b/core/fxcodec/codec/ccodec_progressivedecoder.cpp
@@ -725,21 +725,21 @@
pBmpModule->Input(pBmpContext.get(), m_pCodecMemory, nullptr);
const std::vector<uint32_t>* palette;
- int32_t readResult = pBmpModule->ReadHeader(
+ BmpModule::Status read_result = pBmpModule->ReadHeader(
pBmpContext.get(), &m_SrcWidth, &m_SrcHeight, &m_BmpIsTopBottom,
&m_SrcComponents, &m_SrcPaletteNumber, &palette, pAttribute);
- while (readResult == 2) {
+ while (read_result == BmpModule::Status::kContinue) {
FXCODEC_STATUS error_status = FXCODEC_STATUS_ERR_FORMAT;
if (!BmpReadMoreData(pBmpModule, pBmpContext.get(), error_status)) {
m_status = error_status;
return false;
}
- readResult = pBmpModule->ReadHeader(
+ read_result = pBmpModule->ReadHeader(
pBmpContext.get(), &m_SrcWidth, &m_SrcHeight, &m_BmpIsTopBottom,
&m_SrcComponents, &m_SrcPaletteNumber, &palette, pAttribute);
}
- if (readResult != 1) {
+ if (read_result != BmpModule::Status::kSuccess) {
m_status = FXCODEC_STATUS_ERR_FORMAT;
return false;
}
@@ -825,8 +825,8 @@
return m_status;
}
while (true) {
- int32_t readRes = pBmpModule->LoadImage(m_pBmpContext.get());
- while (readRes == 2) {
+ BmpModule::Status read_res = pBmpModule->LoadImage(m_pBmpContext.get());
+ while (read_res == BmpModule::Status::kContinue) {
FXCODEC_STATUS error_status = FXCODEC_STATUS_DECODE_FINISH;
if (!BmpReadMoreData(pBmpModule, m_pBmpContext.get(), error_status)) {
m_pDeviceBitmap = nullptr;
@@ -834,9 +834,9 @@
m_status = error_status;
return m_status;
}
- readRes = pBmpModule->LoadImage(m_pBmpContext.get());
+ read_res = pBmpModule->LoadImage(m_pBmpContext.get());
}
- if (readRes == 1) {
+ if (read_res == BmpModule::Status::kSuccess) {
m_pDeviceBitmap = nullptr;
m_pFile = nullptr;
m_status = FXCODEC_STATUS_DECODE_FINISH;