Chromium Code Reviews| Index: core/fxcodec/codec/fx_codec_fax.cpp |
| diff --git a/core/fxcodec/codec/fx_codec_fax.cpp b/core/fxcodec/codec/fx_codec_fax.cpp |
| index 11c42ade28f6618a8750caf2443837c4e83f9112..9b4d18fd265c4afce5ffdc90d9922052df03307e 100644 |
| --- a/core/fxcodec/codec/fx_codec_fax.cpp |
| +++ b/core/fxcodec/codec/fx_codec_fax.cpp |
| @@ -4,6 +4,9 @@ |
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| +#include <algorithm> |
| +#include <vector> |
| + |
| #include "core/fxcodec/codec/codec_int.h" |
| #include "core/fxcodec/include/fx_codec.h" |
| @@ -39,103 +42,92 @@ const uint8_t ZeroLeadPos[256] = { |
| // Limit of image dimension, an arbitrary large number. |
| const int kMaxImageDimension = 0x01FFFF; |
| -int FindBit(const uint8_t* data_buf, int max_pos, int start_pos, int bit) { |
| +int FindBit(const std::vector<uint8_t>& data_buf, |
| + int max_pos, |
| + int start_pos, |
| + int bit) { |
| ASSERT(start_pos >= 0); |
| - if (start_pos >= max_pos) { |
| + if (start_pos >= max_pos) |
| return max_pos; |
| - } |
| + |
| const uint8_t* leading_pos = bit ? OneLeadPos : ZeroLeadPos; |
| if (start_pos % 8) { |
| uint8_t data = data_buf[start_pos / 8]; |
| - if (bit) { |
| + if (bit) |
| data &= 0xff >> (start_pos % 8); |
| - } else { |
| + else |
| data |= 0xff << (8 - start_pos % 8); |
| - } |
| - if (leading_pos[data] < 8) { |
| + |
| + if (leading_pos[data] < 8) |
| return start_pos / 8 * 8 + leading_pos[data]; |
| - } |
| + |
| start_pos += 7; |
| } |
| uint8_t skip = bit ? 0x00 : 0xff; |
| int byte_pos = start_pos / 8; |
| int max_byte = (max_pos + 7) / 8; |
| while (byte_pos < max_byte) { |
| - if (data_buf[byte_pos] != skip) { |
| + if (data_buf[byte_pos] != skip) |
| break; |
| - } |
| - byte_pos++; |
| + |
| + ++byte_pos; |
| } |
| - if (byte_pos == max_byte) { |
| + if (byte_pos == max_byte) |
| return max_pos; |
| - } |
| - int pos = leading_pos[data_buf[byte_pos]] + byte_pos * 8; |
| - if (pos > max_pos) { |
| - pos = max_pos; |
| - } |
| - return pos; |
| + |
| + return std::min(leading_pos[data_buf[byte_pos]] + byte_pos * 8, max_pos); |
| } |
| -void FaxG4FindB1B2(const uint8_t* ref_buf, |
| +void FaxG4FindB1B2(const std::vector<uint8_t>& ref_buf, |
| int columns, |
| int a0, |
| bool a0color, |
| - int& b1, |
| - int& b2) { |
| + int* b1, |
| + int* b2) { |
| uint8_t first_bit = |
| (a0 < 0) ? 1 : ((ref_buf[a0 / 8] & (1 << (7 - a0 % 8))) != 0); |
| - b1 = FindBit(ref_buf, columns, a0 + 1, !first_bit); |
| - if (b1 >= columns) { |
| - b1 = b2 = columns; |
| + *b1 = FindBit(ref_buf, columns, a0 + 1, !first_bit); |
| + if (*b1 >= columns) { |
| + *b1 = *b2 = columns; |
| return; |
| } |
| if (first_bit == !a0color) { |
| - b1 = FindBit(ref_buf, columns, b1 + 1, first_bit); |
| + *b1 = FindBit(ref_buf, columns, *b1 + 1, first_bit); |
| first_bit = !first_bit; |
| } |
| - if (b1 >= columns) { |
| - b1 = b2 = columns; |
| + if (*b1 >= columns) { |
| + *b1 = *b2 = columns; |
| return; |
| } |
| - b2 = FindBit(ref_buf, columns, b1 + 1, first_bit); |
| + *b2 = FindBit(ref_buf, columns, *b1 + 1, first_bit); |
| } |
| void FaxFillBits(uint8_t* dest_buf, int columns, int startpos, int endpos) { |
| - if (startpos < 0) { |
| - startpos = 0; |
| - } |
| - if (endpos < 0) { |
| - endpos = 0; |
| - } |
| - if (endpos >= columns) { |
| - endpos = columns; |
| - } |
| - if (startpos >= endpos) { |
| + startpos = std::max(startpos, 0); |
| + endpos = std::min(std::max(endpos, 0), columns); |
| + if (startpos >= endpos) |
| return; |
| - } |
| + |
| int first_byte = startpos / 8; |
| int last_byte = (endpos - 1) / 8; |
| if (first_byte == last_byte) { |
| - for (int i = startpos % 8; i <= (endpos - 1) % 8; i++) { |
| + for (int i = startpos % 8; i <= (endpos - 1) % 8; ++i) |
| dest_buf[first_byte] -= 1 << (7 - i); |
| - } |
| return; |
| } |
| - int i; |
| - for (i = startpos % 8; i < 8; i++) { |
| + |
| + for (int i = startpos % 8; i < 8; ++i) |
| dest_buf[first_byte] -= 1 << (7 - i); |
| - } |
| - for (i = 0; i <= (endpos - 1) % 8; i++) { |
| + for (int i = 0; i <= (endpos - 1) % 8; ++i) |
| dest_buf[last_byte] -= 1 << (7 - i); |
| - } |
| - if (last_byte > first_byte + 1) { |
| + |
| + if (last_byte > first_byte + 1) |
| FXSYS_memset(dest_buf + first_byte + 1, 0, last_byte - first_byte - 1); |
| - } |
| } |
| -#define NEXTBIT \ |
| - src_buf[bitpos / 8] & (1 << (7 - bitpos % 8)); \ |
| - bitpos++; |
| +#define NEXTBIT() \ |
| + src_buf[*bitpos / 8] & (1 << (7 - *bitpos % 8)); \ |
| + ++(*bitpos); |
| const uint8_t FaxBlackRunIns[] = { |
| 0, 2, 0x02, 3, 0, 0x03, |
| @@ -254,23 +246,23 @@ const uint8_t FaxWhiteRunIns[] = { |
| int FaxGetRun(const uint8_t* ins_array, |
| const uint8_t* src_buf, |
| - int& bitpos, |
| + int* bitpos, |
| int bitsize) { |
| uint32_t code = 0; |
| int ins_off = 0; |
| while (1) { |
| uint8_t ins = ins_array[ins_off++]; |
| - if (ins == 0xff) { |
| + if (ins == 0xff) |
| return -1; |
| - } |
| - if (bitpos >= bitsize) { |
| + |
| + if (*bitpos >= bitsize) |
| return -1; |
| - } |
| + |
| code <<= 1; |
| - if (src_buf[bitpos / 8] & (1 << (7 - bitpos % 8))) { |
| - code++; |
| - } |
| - bitpos++; |
| + if (src_buf[*bitpos / 8] & (1 << (7 - *bitpos % 8))) |
| + ++code; |
| + |
| + ++(*bitpos); |
| int next_off = ins_off + ins * 3; |
| for (; ins_off < next_off; ins_off += 3) { |
| if (ins_array[ins_off] == code) { |
| @@ -282,34 +274,34 @@ int FaxGetRun(const uint8_t* ins_array, |
| FX_BOOL FaxG4GetRow(const uint8_t* src_buf, |
| int bitsize, |
| - int& bitpos, |
| + int* bitpos, |
| uint8_t* dest_buf, |
| - const uint8_t* ref_buf, |
| + const std::vector<uint8_t>& ref_buf, |
| int columns) { |
| int a0 = -1; |
| bool a0color = true; |
| while (1) { |
| - if (bitpos >= bitsize) { |
| + if (*bitpos >= bitsize) |
| return FALSE; |
| - } |
| - int a1, a2, b1, b2; |
| - FaxG4FindB1B2(ref_buf, columns, a0, a0color, b1, b2); |
| - FX_BOOL bit = NEXTBIT; |
| + |
| + int a1; |
| + int a2; |
| + int b1; |
| + int b2; |
| + FaxG4FindB1B2(ref_buf, columns, a0, a0color, &b1, &b2); |
| + FX_BOOL bit = NEXTBIT(); |
| int v_delta = 0; |
| - if (bit) { |
| - } else { |
| - if (bitpos >= bitsize) { |
| + if (!bit) { |
| + if (*bitpos >= bitsize) |
| return FALSE; |
| - } |
| - FX_BOOL bit1 = NEXTBIT; |
| - if (bitpos >= bitsize) { |
| + |
| + FX_BOOL bit1 = NEXTBIT(); |
| + if (*bitpos >= bitsize) |
| return FALSE; |
| - } |
| - FX_BOOL bit2 = NEXTBIT; |
| - if (bit1 && bit2) { |
| - v_delta = 1; |
| - } else if (bit1) { |
| - v_delta = -1; |
| + |
| + FX_BOOL bit2 = NEXTBIT(); |
| + if (bit1) { |
| + v_delta = bit2 ? 1 : -1; |
| } else if (bit2) { |
| int run_len1 = 0; |
| while (1) { |
| @@ -320,13 +312,13 @@ FX_BOOL FaxG4GetRow(const uint8_t* src_buf, |
| break; |
| } |
| } |
| - if (a0 < 0) { |
| - run_len1++; |
| - } |
| + if (a0 < 0) |
| + ++run_len1; |
| + |
| a1 = a0 + run_len1; |
| - if (!a0color) { |
| + if (!a0color) |
| FaxFillBits(dest_buf, columns, a0, a1); |
| - } |
| + |
| int run_len2 = 0; |
| while (1) { |
| int run = FaxGetRun(a0color ? FaxBlackRunIns : FaxWhiteRunIns, |
| @@ -337,111 +329,104 @@ FX_BOOL FaxG4GetRow(const uint8_t* src_buf, |
| } |
| } |
| a2 = a1 + run_len2; |
| - if (a0color) { |
| + if (a0color) |
| FaxFillBits(dest_buf, columns, a1, a2); |
| - } |
| + |
| a0 = a2; |
| - if (a0 < columns) { |
| + if (a0 < columns) |
| continue; |
| - } |
| + |
| return TRUE; |
| } else { |
| - if (bitpos >= bitsize) { |
| + if (*bitpos >= bitsize) |
| return FALSE; |
| - } |
| - bit = NEXTBIT; |
| + |
| + bit = NEXTBIT(); |
| if (bit) { |
| - if (!a0color) { |
| + if (!a0color) |
| FaxFillBits(dest_buf, columns, a0, b2); |
| - } |
| - if (b2 >= columns) { |
| + |
| + if (b2 >= columns) |
| return TRUE; |
| - } |
| + |
| a0 = b2; |
| continue; |
| - } else { |
| - if (bitpos >= bitsize) { |
| + } |
| + |
| + if (*bitpos >= bitsize) |
| + return FALSE; |
| + |
| + FX_BOOL next_bit1 = NEXTBIT(); |
| + if (*bitpos >= bitsize) |
| + return FALSE; |
| + |
| + FX_BOOL next_bit2 = NEXTBIT(); |
| + if (next_bit1) { |
| + v_delta = next_bit2 ? 2 : -2; |
| + } else if (next_bit2) { |
| + if (*bitpos >= bitsize) |
| return FALSE; |
| - } |
| - FX_BOOL next_bit1 = NEXTBIT; |
| - if (bitpos >= bitsize) { |
| + |
| + bit = NEXTBIT(); |
| + v_delta = bit ? 3 : -3; |
| + } else { |
| + if (*bitpos >= bitsize) |
| return FALSE; |
| + |
| + bit = NEXTBIT(); |
| + if (bit) { |
| + *bitpos += 3; |
| + continue; |
| } |
| - FX_BOOL next_bit2 = NEXTBIT; |
| - if (next_bit1 && next_bit2) { |
| - v_delta = 2; |
| - } else if (next_bit1) { |
| - v_delta = -2; |
| - } else if (next_bit2) { |
| - if (bitpos >= bitsize) { |
| - return FALSE; |
| - } |
| - bit = NEXTBIT; |
| - if (bit) { |
| - v_delta = 3; |
| - } else { |
| - v_delta = -3; |
| - } |
| - } else { |
| - if (bitpos >= bitsize) { |
| - return FALSE; |
| - } |
| - bit = NEXTBIT; |
| - if (bit) { |
| - bitpos += 3; |
| - continue; |
| - } else { |
| - bitpos += 5; |
| - return TRUE; |
| - } |
| - } |
| + *bitpos += 5; |
| + return TRUE; |
| } |
| } |
| } |
| a1 = b1 + v_delta; |
| - if (!a0color) { |
| + if (!a0color) |
| FaxFillBits(dest_buf, columns, a0, a1); |
| - } |
| - if (a1 >= columns) { |
| + |
| + if (a1 >= columns) |
| return TRUE; |
| - } |
| + |
| a0 = a1; |
| a0color = !a0color; |
| } |
| } |
| -FX_BOOL FaxSkipEOL(const uint8_t* src_buf, int bitsize, int& bitpos) { |
| - int startbit = bitpos; |
| - while (bitpos < bitsize) { |
| - int bit = NEXTBIT; |
| - if (bit) { |
| - if (bitpos - startbit <= 11) { |
| - bitpos = startbit; |
| - } |
| - return TRUE; |
| - } |
| +FX_BOOL FaxSkipEOL(const uint8_t* src_buf, int bitsize, int* bitpos) { |
| + int startbit = *bitpos; |
| + while (*bitpos < bitsize) { |
| + int bit = NEXTBIT(); |
| + if (!bit) |
| + continue; |
| + |
| + if (*bitpos - startbit <= 11) |
| + *bitpos = startbit; |
| + return TRUE; |
| } |
| return FALSE; |
| } |
| FX_BOOL FaxGet1DLine(const uint8_t* src_buf, |
| int bitsize, |
| - int& bitpos, |
| - uint8_t* dest_buf, |
| + int* bitpos, |
| + std::vector<uint8_t>* dest_buf, |
| int columns) { |
| bool color = true; |
| int startpos = 0; |
| while (1) { |
| - if (bitpos >= bitsize) { |
| + if (*bitpos >= bitsize) |
| return FALSE; |
| - } |
| + |
| int run_len = 0; |
| while (1) { |
| int run = FaxGetRun(color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, |
| bitpos, bitsize); |
| if (run < 0) { |
| - while (bitpos < bitsize) { |
| - int bit = NEXTBIT; |
| + while (*bitpos < bitsize) { |
| + int bit = NEXTBIT(); |
| if (bit) { |
| return TRUE; |
| } |
| @@ -453,13 +438,13 @@ FX_BOOL FaxGet1DLine(const uint8_t* src_buf, |
| break; |
| } |
| } |
| - if (!color) { |
| - FaxFillBits(dest_buf, columns, startpos, startpos + run_len); |
| - } |
| + if (!color) |
| + FaxFillBits(dest_buf->data(), columns, startpos, startpos + run_len); |
| + |
| startpos += run_len; |
| - if (startpos >= columns) { |
| + if (startpos >= columns) |
| break; |
| - } |
| + |
| color = !color; |
| } |
| return TRUE; |
| @@ -473,125 +458,109 @@ class CCodec_FaxDecoder : public CCodec_ScanlineDecoder { |
| uint32_t src_size, |
| int width, |
| int height, |
| + uint32_t pitch, |
| int K, |
| - FX_BOOL EndOfLine, |
| - FX_BOOL EncodedByteAlign, |
| - FX_BOOL BlackIs1, |
| - int Columns, |
| - int Rows); |
| + bool EndOfLine, |
| + bool EncodedByteAlign, |
| + bool BlackIs1); |
| ~CCodec_FaxDecoder() override; |
| - |
| // CCodec_ScanlineDecoder |
| FX_BOOL v_Rewind() override; |
| uint8_t* v_GetNextLine() override; |
| uint32_t GetSrcOffset() override; |
| - int m_Encoding, m_bEndOfLine, m_bByteAlign, m_bBlack; |
| - int bitpos; |
| - const uint8_t* m_pSrcBuf; |
| - uint32_t m_SrcSize; |
| - uint8_t* m_pScanlineBuf; |
| - uint8_t* m_pRefBuf; |
| + private: |
| + const int m_Encoding; |
| + int m_bitpos; |
| + bool m_bByteAlign; |
| + const bool m_bEndOfLine; |
| + const bool m_bBlack; |
| + const uint32_t m_SrcSize; |
| + const uint8_t* const m_pSrcBuf; |
| + std::vector<uint8_t> m_ScanlineBuf; |
| + std::vector<uint8_t> m_RefBuf; |
| }; |
| CCodec_FaxDecoder::CCodec_FaxDecoder(const uint8_t* src_buf, |
| uint32_t src_size, |
| int width, |
| int height, |
| + uint32_t pitch, |
| int K, |
| - FX_BOOL EndOfLine, |
| - FX_BOOL EncodedByteAlign, |
| - FX_BOOL BlackIs1, |
| - int Columns, |
| - int Rows) { |
| - m_Encoding = K; |
| - m_bEndOfLine = EndOfLine; |
| - m_bByteAlign = EncodedByteAlign; |
| - m_bBlack = BlackIs1; |
| - m_OrigWidth = Columns; |
| - m_OrigHeight = Rows; |
| - if (m_OrigWidth == 0) |
| - m_OrigWidth = width; |
| - if (m_OrigHeight == 0) |
| - m_OrigHeight = height; |
| - // Should not overflow. Checked by CCodec_FaxDecoder::CreateDecoder. |
| - m_Pitch = (static_cast<uint32_t>(m_OrigWidth) + 31) / 32 * 4; |
| - m_OutputWidth = m_OrigWidth; |
| - m_OutputHeight = m_OrigHeight; |
| - m_pScanlineBuf = FX_Alloc(uint8_t, m_Pitch); |
| - m_pRefBuf = FX_Alloc(uint8_t, m_Pitch); |
| - m_pSrcBuf = src_buf; |
| - m_SrcSize = src_size; |
| - m_nComps = 1; |
| - m_bpc = 1; |
| -} |
| + bool EndOfLine, |
| + bool EncodedByteAlign, |
| + bool BlackIs1) |
| + : CCodec_ScanlineDecoder(width, height, width, height, 1, 1, pitch), |
| + m_Encoding(K), |
| + m_bitpos(0), |
| + m_bByteAlign(EncodedByteAlign), |
| + m_bEndOfLine(EndOfLine), |
| + m_bBlack(BlackIs1), |
| + m_SrcSize(src_size), |
| + m_pSrcBuf(src_buf), |
| + m_ScanlineBuf(pitch), |
| + m_RefBuf(pitch) {} |
| -CCodec_FaxDecoder::~CCodec_FaxDecoder() { |
| - FX_Free(m_pScanlineBuf); |
| - FX_Free(m_pRefBuf); |
| -} |
| +CCodec_FaxDecoder::~CCodec_FaxDecoder() {} |
| FX_BOOL CCodec_FaxDecoder::v_Rewind() { |
| - FXSYS_memset(m_pRefBuf, 0xff, m_Pitch); |
| - bitpos = 0; |
| + FXSYS_memset(m_RefBuf.data(), 0xff, m_RefBuf.size()); |
| + m_bitpos = 0; |
| return TRUE; |
| } |
| + |
| uint8_t* CCodec_FaxDecoder::v_GetNextLine() { |
| int bitsize = m_SrcSize * 8; |
| - FaxSkipEOL(m_pSrcBuf, bitsize, bitpos); |
| - if (bitpos >= bitsize) { |
| + FaxSkipEOL(m_pSrcBuf, bitsize, &m_bitpos); |
| + if (m_bitpos >= bitsize) |
| return nullptr; |
| - } |
| - FXSYS_memset(m_pScanlineBuf, 0xff, m_Pitch); |
| + |
| + FXSYS_memset(m_ScanlineBuf.data(), 0xff, m_ScanlineBuf.size()); |
| if (m_Encoding < 0) { |
| - FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, |
| + FaxG4GetRow(m_pSrcBuf, bitsize, &m_bitpos, m_ScanlineBuf.data(), m_RefBuf, |
| m_OrigWidth); |
| - FXSYS_memcpy(m_pRefBuf, m_pScanlineBuf, m_Pitch); |
| + m_RefBuf = m_ScanlineBuf; |
| } else if (m_Encoding == 0) { |
| - FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth); |
| + FaxGet1DLine(m_pSrcBuf, bitsize, &m_bitpos, &m_ScanlineBuf, m_OrigWidth); |
| } else { |
| - FX_BOOL bNext1D = m_pSrcBuf[bitpos / 8] & (1 << (7 - bitpos % 8)); |
| - bitpos++; |
| + FX_BOOL bNext1D = m_pSrcBuf[m_bitpos / 8] & (1 << (7 - m_bitpos % 8)); |
| + ++m_bitpos; |
| if (bNext1D) { |
| - FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth); |
| + FaxGet1DLine(m_pSrcBuf, bitsize, &m_bitpos, &m_ScanlineBuf, m_OrigWidth); |
| } else { |
| - FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, |
| + FaxG4GetRow(m_pSrcBuf, bitsize, &m_bitpos, m_ScanlineBuf.data(), m_RefBuf, |
| m_OrigWidth); |
| } |
| - FXSYS_memcpy(m_pRefBuf, m_pScanlineBuf, m_Pitch); |
| - } |
| - if (m_bEndOfLine) { |
| - FaxSkipEOL(m_pSrcBuf, bitsize, bitpos); |
| + m_RefBuf = m_ScanlineBuf; |
| } |
| - if (m_bByteAlign && bitpos < bitsize) { |
| - int bitpos0 = bitpos; |
| - int bitpos1 = (bitpos + 7) / 8 * 8; |
| + if (m_bEndOfLine) |
| + FaxSkipEOL(m_pSrcBuf, bitsize, &m_bitpos); |
| + |
| + if (m_bByteAlign && m_bitpos < bitsize) { |
| + int bitpos0 = m_bitpos; |
| + int bitpos1 = (m_bitpos + 7) / 8 * 8; |
| while (m_bByteAlign && bitpos0 < bitpos1) { |
| int bit = m_pSrcBuf[bitpos0 / 8] & (1 << (7 - bitpos0 % 8)); |
| if (bit != 0) { |
| - m_bByteAlign = FALSE; |
| + m_bByteAlign = false; |
| } else { |
| - bitpos0++; |
| + ++bitpos0; |
| } |
| } |
| - if (m_bByteAlign) { |
| - bitpos = bitpos1; |
| - } |
| + if (m_bByteAlign) |
| + m_bitpos = bitpos1; |
| } |
| if (m_bBlack) { |
| - for (uint32_t i = 0; i < m_Pitch; i++) { |
| - m_pScanlineBuf[i] = ~m_pScanlineBuf[i]; |
| + for (uint32_t i = 0; i < m_Pitch; ++i) { |
| + m_ScanlineBuf[i] = ~m_ScanlineBuf[i]; |
| } |
| } |
| - return m_pScanlineBuf; |
| + return m_ScanlineBuf.data(); |
| } |
| + |
| uint32_t CCodec_FaxDecoder::GetSrcOffset() { |
| - uint32_t ret = (bitpos + 7) / 8; |
| - if (ret > m_SrcSize) { |
| - ret = m_SrcSize; |
| - } |
| - return ret; |
| + return std::min(static_cast<uint32_t>((m_bitpos + 7) / 8), m_SrcSize); |
| } |
| void FaxG4Decode(const uint8_t* src_buf, |
| @@ -601,40 +570,43 @@ void FaxG4Decode(const uint8_t* src_buf, |
| int width, |
| int height, |
| int pitch) { |
| - if (pitch == 0) { |
| + if (pitch == 0) |
| pitch = (width + 7) / 8; |
| - } |
| - uint8_t* ref_buf = FX_Alloc(uint8_t, pitch); |
| - FXSYS_memset(ref_buf, 0xff, pitch); |
| + |
| + std::vector<uint8_t> ref_buf(pitch, 0xff); |
| int bitpos = *pbitpos; |
| for (int iRow = 0; iRow < height; iRow++) { |
| uint8_t* line_buf = dest_buf + iRow * pitch; |
| FXSYS_memset(line_buf, 0xff, pitch); |
| - FaxG4GetRow(src_buf, src_size << 3, bitpos, line_buf, ref_buf, width); |
| - FXSYS_memcpy(ref_buf, line_buf, pitch); |
| + FaxG4GetRow(src_buf, src_size << 3, &bitpos, line_buf, ref_buf, width); |
| + FXSYS_memcpy(ref_buf.data(), line_buf, pitch); |
| } |
| - FX_Free(ref_buf); |
| *pbitpos = bitpos; |
| } |
| -CCodec_ScanlineDecoder* CCodec_FaxModule::CreateDecoder( |
| - const uint8_t* src_buf, |
| - uint32_t src_size, |
| - int width, |
| - int height, |
| - int K, |
| - FX_BOOL EndOfLine, |
| - FX_BOOL EncodedByteAlign, |
| - FX_BOOL BlackIs1, |
| - int Columns, |
| - int Rows) { |
| +CCodec_ScanlineDecoder* CCodec_FaxModule::CreateDecoder(const uint8_t* src_buf, |
| + uint32_t src_size, |
| + int width, |
| + int height, |
| + int K, |
| + bool EndOfLine, |
| + bool EncodedByteAlign, |
| + bool BlackIs1, |
| + int Columns, |
| + int Rows) { |
| + int actual_width = Columns ? Columns : width; |
| + int actual_height = Rows ? Rows : height; |
| + |
| // Reject invalid values. |
| - if (width <= 0 || height < 0 || Columns < 0 || Rows < 0) |
| + if (actual_width <= 0 || actual_height <= 0) |
| return nullptr; |
| + |
| // Reject unreasonable large input. |
| - if (width > kMaxImageDimension || height > kMaxImageDimension || |
| - Columns > kMaxImageDimension || Rows > kMaxImageDimension) |
| + if (actual_width > kMaxImageDimension || actual_height > kMaxImageDimension) |
| return nullptr; |
| - return new CCodec_FaxDecoder(src_buf, src_size, width, height, K, EndOfLine, |
| - EncodedByteAlign, BlackIs1, Columns, Rows); |
| + |
| + // Should not overflow. Checked by CCodec_FaxDecoder::CreateDecoder. |
|
kcwu
2016/09/24 03:00:57
Delete this comment.
My mistake, what I meant to s
Lei Zhang
2016/09/26 22:50:59
Done.
|
| + uint32_t pitch = (static_cast<uint32_t>(actual_width) + 31) / 32 * 4; |
| + return new CCodec_FaxDecoder(src_buf, src_size, actual_width, actual_height, |
| + pitch, K, EndOfLine, EncodedByteAlign, BlackIs1); |
| } |