From 9d8ec5a6e37e8d1d4d4edca9040de234e2d4728f Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 4 Aug 2015 13:00:21 -0700 Subject: XFA: clang-format all pdfium code. No behavior change. Generated by: find . -name '*.cpp' -o -name '*.h' | \ grep -E -v 'third_party|thirdparties|lpng_v163|tiff_v403' | \ xargs ../../buildtools/mac/clang-format -i Then manually merged https://codereview.chromium.org/1269223002/ See thread "tabs vs spaces" on pdfium@googlegroups.com for discussion. BUG=none --- .../fpdfapi/fpdf_parser/fpdf_parser_filters.cpp | 1754 ++++++++++---------- 1 file changed, 892 insertions(+), 862 deletions(-) (limited to 'core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp') diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp index fed4546fab..8cb432029c 100644 --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp @@ -12,888 +12,918 @@ extern "C" { -static void* my_alloc_func(void* opaque, unsigned int items, unsigned int size) -{ - return FX_Alloc2D(uint8_t, items, size); +static void* my_alloc_func(void* opaque, + unsigned int items, + unsigned int size) { + return FX_Alloc2D(uint8_t, items, size); } -static void my_free_func(void* opaque, void* address) -{ - FX_Free(address); +static void my_free_func(void* opaque, void* address) { + FX_Free(address); } } // extern "C" -CFX_DataFilter::CFX_DataFilter() -{ - m_bEOF = FALSE; - m_pDestFilter = NULL; - m_SrcPos = 0; -} -CFX_DataFilter::~CFX_DataFilter() -{ - delete m_pDestFilter; -} -void CFX_DataFilter::SetDestFilter(CFX_DataFilter* pFilter) -{ - if (m_pDestFilter) { - m_pDestFilter->SetDestFilter(pFilter); - } else { - m_pDestFilter = pFilter; - } -} -void CFX_DataFilter::FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) -{ - if (m_bEOF) { - return; - } - m_SrcPos += src_size; - if (m_pDestFilter) { - CFX_BinaryBuf temp_buf; - temp_buf.EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE); - v_FilterIn(src_buf, src_size, temp_buf); - m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf); - } else { - v_FilterIn(src_buf, src_size, dest_buf); - } -} -void CFX_DataFilter::FilterFinish(CFX_BinaryBuf& dest_buf) -{ - if (m_pDestFilter) { - CFX_BinaryBuf temp_buf; - v_FilterFinish(temp_buf); - if (temp_buf.GetSize()) { - m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf); - } - m_pDestFilter->FilterFinish(dest_buf); - } else { - v_FilterFinish(dest_buf); - } - m_bEOF = TRUE; -} -void CFX_DataFilter::ReportEOF(FX_DWORD left_input) -{ - if (m_bEOF) { - return; - } - m_bEOF = TRUE; - m_SrcPos -= left_input; -} -CFX_DataFilter* FPDF_CreateFilter(const CFX_ByteStringC& name, const CPDF_Dictionary* pParam, int width, int height) -{ - FX_DWORD id = name.GetID(); - switch (id) { - case FXBSTR_ID('F', 'l', 'a', 't'): - case FXBSTR_ID('F', 'l', 0, 0): - case FXBSTR_ID('L', 'Z', 'W', 'D'): - case FXBSTR_ID('L', 'Z', 'W', 0): { - CFX_DataFilter* pFilter; - if (id == FXBSTR_ID('L', 'Z', 'W', 'D') || id == FXBSTR_ID('L', 'Z', 'W', 0)) { - pFilter = new CPDF_LzwFilter(pParam ? pParam->GetInteger("EarlyChange", 1) : 1); - } else { - pFilter = new CPDF_FlateFilter; - } - if ((pParam ? pParam->GetInteger("Predictor", 1) : 1) > 1) { - CFX_DataFilter* pPredictor = new CPDF_PredictorFilter(pParam->GetInteger(FX_BSTRC("Predictor"), 1), - pParam->GetInteger(FX_BSTRC("Colors"), 1), pParam->GetInteger(FX_BSTRC("BitsPerComponent"), 8), - pParam->GetInteger(FX_BSTRC("Columns"), 1)); - pFilter->SetDestFilter(pPredictor); - } - return pFilter; - } - case FXBSTR_ID('A', 'S', 'C', 'I'): - if (name == "ASCIIHexDecode") { - return new CPDF_AsciiHexFilter; - } - return new CPDF_Ascii85Filter; - case FXBSTR_ID('A', 'H', 'x', 0): - return new CPDF_AsciiHexFilter; - case FXBSTR_ID('A', '8', '5', 0): - return new CPDF_Ascii85Filter; - case FXBSTR_ID('R', 'u', 'n', 'L'): - return new CPDF_RunLenFilter; - case FXBSTR_ID('C', 'C', 'I', 'T'): { - int Encoding = 0; - int bEndOfLine = FALSE; - int bByteAlign = FALSE; - int bBlack = FALSE; - int nRows = 0; - int nColumns = 1728; - if (pParam) { - Encoding = pParam->GetInteger(FX_BSTRC("K")); - bEndOfLine = pParam->GetInteger(FX_BSTRC("EndOfLine")); - bByteAlign = pParam->GetInteger(FX_BSTRC("EncodedByteAlign")); - bBlack = pParam->GetInteger(FX_BSTRC("BlackIs1")); - nColumns = pParam->GetInteger(FX_BSTRC("Columns"), 1728); - nRows = pParam->GetInteger(FX_BSTRC("Rows")); - } - if (nColumns == 0) { - nColumns = width; - } - if (nRows == 0) { - nRows = height; - } - CPDF_FaxFilter* pFilter = new CPDF_FaxFilter(); - pFilter->Initialize(Encoding, bEndOfLine, bByteAlign, bBlack, nRows, nColumns); - return pFilter; - } - case FXBSTR_ID('D', 'C', 'T', 'D'): - return new CPDF_JpegFilter; - default: - return NULL; - } -} -CFX_DataFilter* _FPDF_CreateFilterFromDict(CPDF_Dictionary* pDict) -{ - CPDF_Object* pDecoder = pDict->GetElementValue("Filter"); - if (pDecoder == NULL) { - return NULL; - } - CFX_DataFilter* pFirstFilter = NULL; - int width = pDict->GetInteger(FX_BSTRC("Width")), height = pDict->GetInteger(FX_BSTRC("Height")); - CPDF_Object* pParams = pDict->GetElementValue("DecodeParms"); - if (pDecoder->GetType() == PDFOBJ_ARRAY) { - if (pParams && pParams->GetType() != PDFOBJ_ARRAY) { - pParams = NULL; - } - for (FX_DWORD i = 0; i < ((CPDF_Array*)pDecoder)->GetCount(); i ++) { - CFX_ByteString name = ((CPDF_Array*)pDecoder)->GetString(i); - CPDF_Dictionary* pParam = NULL; - if (pParams) { - pParam = ((CPDF_Array*)pParams)->GetDict(i); - } - CFX_DataFilter* pDestFilter = FPDF_CreateFilter(name, pParam, width, height); - if (pDestFilter) { - if (pFirstFilter == NULL) { - pFirstFilter = pDestFilter; - } else { - pFirstFilter->SetDestFilter(pDestFilter); - } - } - } - } else { - if (pParams && pParams->GetType() != PDFOBJ_DICTIONARY) { - pParams = NULL; - } - pFirstFilter = FPDF_CreateFilter(pDecoder->GetString(), (CPDF_Dictionary*)pParams, width, height); - } - return pFirstFilter; -} -CPDF_StreamFilter* CPDF_Stream::GetStreamFilter(FX_BOOL bRaw) const -{ - CFX_DataFilter* pFirstFilter = NULL; - if (m_pCryptoHandler) { - pFirstFilter = new CPDF_DecryptFilter(m_pCryptoHandler, m_ObjNum, m_GenNum); - } - if (!bRaw) { - CFX_DataFilter* pFilter = _FPDF_CreateFilterFromDict(m_pDict); - if (pFilter) { - if (pFirstFilter == NULL) { - pFirstFilter = pFilter; - } else { - pFirstFilter->SetDestFilter(pFilter); - } - } - } - CPDF_StreamFilter* pStreamFilter = new CPDF_StreamFilter; - pStreamFilter->m_pStream = this; - pStreamFilter->m_pFilter = pFirstFilter; - pStreamFilter->m_pBuffer = NULL; - pStreamFilter->m_SrcOffset = 0; - return pStreamFilter; -} -CPDF_StreamFilter::~CPDF_StreamFilter() -{ - delete m_pFilter; - delete m_pBuffer; -} -#define FPDF_FILTER_BUFFER_IN_SIZE FPDF_FILTER_BUFFER_SIZE -FX_DWORD CPDF_StreamFilter::ReadBlock(uint8_t* buffer, FX_DWORD buf_size) -{ - if (m_pFilter == NULL) { - FX_DWORD read_size = m_pStream->GetRawSize() - m_SrcOffset; - if (read_size == 0) { - return 0; - } - if (read_size > buf_size) { - read_size = buf_size; - } - m_pStream->ReadRawData(m_SrcOffset, buffer, read_size); - m_SrcOffset += read_size; - return read_size; - } - FX_DWORD read_size = 0; - if (m_pBuffer) { - read_size = ReadLeftOver(buffer, buf_size); - if (read_size == buf_size) { - return read_size; - } - buffer += read_size; - buf_size -= read_size; - } - ASSERT(m_pBuffer == NULL); - if (m_pFilter->IsEOF()) { - return read_size; - } - m_pBuffer = new CFX_BinaryBuf; - m_pBuffer->EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE); - m_BufOffset = 0; - while (1) { - int src_size = m_pStream->GetRawSize() - m_SrcOffset; - if (src_size == 0) { - m_pFilter->FilterFinish(*m_pBuffer); - break; - } - if (src_size > FPDF_FILTER_BUFFER_IN_SIZE) { - src_size = FPDF_FILTER_BUFFER_IN_SIZE; - } - if (!m_pStream->ReadRawData(m_SrcOffset, m_SrcBuffer, src_size)) { - return 0; - } - m_SrcOffset += src_size; - m_pFilter->FilterIn(m_SrcBuffer, src_size, *m_pBuffer); - if (m_pBuffer->GetSize() >= (int)buf_size) { - break; - } +CFX_DataFilter::CFX_DataFilter() { + m_bEOF = FALSE; + m_pDestFilter = NULL; + m_SrcPos = 0; +} +CFX_DataFilter::~CFX_DataFilter() { + delete m_pDestFilter; +} +void CFX_DataFilter::SetDestFilter(CFX_DataFilter* pFilter) { + if (m_pDestFilter) { + m_pDestFilter->SetDestFilter(pFilter); + } else { + m_pDestFilter = pFilter; + } +} +void CFX_DataFilter::FilterIn(const uint8_t* src_buf, + FX_DWORD src_size, + CFX_BinaryBuf& dest_buf) { + if (m_bEOF) { + return; + } + m_SrcPos += src_size; + if (m_pDestFilter) { + CFX_BinaryBuf temp_buf; + temp_buf.EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE); + v_FilterIn(src_buf, src_size, temp_buf); + m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf); + } else { + v_FilterIn(src_buf, src_size, dest_buf); + } +} +void CFX_DataFilter::FilterFinish(CFX_BinaryBuf& dest_buf) { + if (m_pDestFilter) { + CFX_BinaryBuf temp_buf; + v_FilterFinish(temp_buf); + if (temp_buf.GetSize()) { + m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), + dest_buf); + } + m_pDestFilter->FilterFinish(dest_buf); + } else { + v_FilterFinish(dest_buf); + } + m_bEOF = TRUE; +} +void CFX_DataFilter::ReportEOF(FX_DWORD left_input) { + if (m_bEOF) { + return; + } + m_bEOF = TRUE; + m_SrcPos -= left_input; +} +CFX_DataFilter* FPDF_CreateFilter(const CFX_ByteStringC& name, + const CPDF_Dictionary* pParam, + int width, + int height) { + FX_DWORD id = name.GetID(); + switch (id) { + case FXBSTR_ID('F', 'l', 'a', 't'): + case FXBSTR_ID('F', 'l', 0, 0): + case FXBSTR_ID('L', 'Z', 'W', 'D'): + case FXBSTR_ID('L', 'Z', 'W', 0): { + CFX_DataFilter* pFilter; + if (id == FXBSTR_ID('L', 'Z', 'W', 'D') || + id == FXBSTR_ID('L', 'Z', 'W', 0)) { + pFilter = new CPDF_LzwFilter( + pParam ? pParam->GetInteger("EarlyChange", 1) : 1); + } else { + pFilter = new CPDF_FlateFilter; + } + if ((pParam ? pParam->GetInteger("Predictor", 1) : 1) > 1) { + CFX_DataFilter* pPredictor = new CPDF_PredictorFilter( + pParam->GetInteger(FX_BSTRC("Predictor"), 1), + pParam->GetInteger(FX_BSTRC("Colors"), 1), + pParam->GetInteger(FX_BSTRC("BitsPerComponent"), 8), + pParam->GetInteger(FX_BSTRC("Columns"), 1)); + pFilter->SetDestFilter(pPredictor); + } + return pFilter; + } + case FXBSTR_ID('A', 'S', 'C', 'I'): + if (name == "ASCIIHexDecode") { + return new CPDF_AsciiHexFilter; + } + return new CPDF_Ascii85Filter; + case FXBSTR_ID('A', 'H', 'x', 0): + return new CPDF_AsciiHexFilter; + case FXBSTR_ID('A', '8', '5', 0): + return new CPDF_Ascii85Filter; + case FXBSTR_ID('R', 'u', 'n', 'L'): + return new CPDF_RunLenFilter; + case FXBSTR_ID('C', 'C', 'I', 'T'): { + int Encoding = 0; + int bEndOfLine = FALSE; + int bByteAlign = FALSE; + int bBlack = FALSE; + int nRows = 0; + int nColumns = 1728; + if (pParam) { + Encoding = pParam->GetInteger(FX_BSTRC("K")); + bEndOfLine = pParam->GetInteger(FX_BSTRC("EndOfLine")); + bByteAlign = pParam->GetInteger(FX_BSTRC("EncodedByteAlign")); + bBlack = pParam->GetInteger(FX_BSTRC("BlackIs1")); + nColumns = pParam->GetInteger(FX_BSTRC("Columns"), 1728); + nRows = pParam->GetInteger(FX_BSTRC("Rows")); + } + if (nColumns == 0) { + nColumns = width; + } + if (nRows == 0) { + nRows = height; + } + CPDF_FaxFilter* pFilter = new CPDF_FaxFilter(); + pFilter->Initialize(Encoding, bEndOfLine, bByteAlign, bBlack, nRows, + nColumns); + return pFilter; + } + case FXBSTR_ID('D', 'C', 'T', 'D'): + return new CPDF_JpegFilter; + default: + return NULL; + } +} +CFX_DataFilter* _FPDF_CreateFilterFromDict(CPDF_Dictionary* pDict) { + CPDF_Object* pDecoder = pDict->GetElementValue("Filter"); + if (pDecoder == NULL) { + return NULL; + } + CFX_DataFilter* pFirstFilter = NULL; + int width = pDict->GetInteger(FX_BSTRC("Width")), + height = pDict->GetInteger(FX_BSTRC("Height")); + CPDF_Object* pParams = pDict->GetElementValue("DecodeParms"); + if (pDecoder->GetType() == PDFOBJ_ARRAY) { + if (pParams && pParams->GetType() != PDFOBJ_ARRAY) { + pParams = NULL; + } + for (FX_DWORD i = 0; i < ((CPDF_Array*)pDecoder)->GetCount(); i++) { + CFX_ByteString name = ((CPDF_Array*)pDecoder)->GetString(i); + CPDF_Dictionary* pParam = NULL; + if (pParams) { + pParam = ((CPDF_Array*)pParams)->GetDict(i); + } + CFX_DataFilter* pDestFilter = + FPDF_CreateFilter(name, pParam, width, height); + if (pDestFilter) { + if (pFirstFilter == NULL) { + pFirstFilter = pDestFilter; + } else { + pFirstFilter->SetDestFilter(pDestFilter); + } + } + } + } else { + if (pParams && pParams->GetType() != PDFOBJ_DICTIONARY) { + pParams = NULL; + } + pFirstFilter = FPDF_CreateFilter(pDecoder->GetString(), + (CPDF_Dictionary*)pParams, width, height); + } + return pFirstFilter; +} +CPDF_StreamFilter* CPDF_Stream::GetStreamFilter(FX_BOOL bRaw) const { + CFX_DataFilter* pFirstFilter = NULL; + if (m_pCryptoHandler) { + pFirstFilter = new CPDF_DecryptFilter(m_pCryptoHandler, m_ObjNum, m_GenNum); + } + if (!bRaw) { + CFX_DataFilter* pFilter = _FPDF_CreateFilterFromDict(m_pDict); + if (pFilter) { + if (pFirstFilter == NULL) { + pFirstFilter = pFilter; + } else { + pFirstFilter->SetDestFilter(pFilter); + } + } + } + CPDF_StreamFilter* pStreamFilter = new CPDF_StreamFilter; + pStreamFilter->m_pStream = this; + pStreamFilter->m_pFilter = pFirstFilter; + pStreamFilter->m_pBuffer = NULL; + pStreamFilter->m_SrcOffset = 0; + return pStreamFilter; +} +CPDF_StreamFilter::~CPDF_StreamFilter() { + delete m_pFilter; + delete m_pBuffer; +} +#define FPDF_FILTER_BUFFER_IN_SIZE FPDF_FILTER_BUFFER_SIZE +FX_DWORD CPDF_StreamFilter::ReadBlock(uint8_t* buffer, FX_DWORD buf_size) { + if (m_pFilter == NULL) { + FX_DWORD read_size = m_pStream->GetRawSize() - m_SrcOffset; + if (read_size == 0) { + return 0; } - return read_size + ReadLeftOver(buffer, buf_size); -} -FX_DWORD CPDF_StreamFilter::ReadLeftOver(uint8_t* buffer, FX_DWORD buf_size) -{ - FX_DWORD read_size = m_pBuffer->GetSize() - m_BufOffset; if (read_size > buf_size) { - read_size = buf_size; - } - FXSYS_memcpy(buffer, m_pBuffer->GetBuffer() + m_BufOffset, read_size); - m_BufOffset += read_size; - if (m_BufOffset == (FX_DWORD)m_pBuffer->GetSize()) { - delete m_pBuffer; - m_pBuffer = NULL; + read_size = buf_size; } + m_pStream->ReadRawData(m_SrcOffset, buffer, read_size); + m_SrcOffset += read_size; return read_size; -} -CPDF_DecryptFilter::CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, FX_DWORD objnum, FX_DWORD gennum) -{ - m_pCryptoHandler = pCryptoHandler; - m_pContext = NULL; - m_ObjNum = objnum; - m_GenNum = gennum; -} -CPDF_DecryptFilter::~CPDF_DecryptFilter() -{ - CFX_BinaryBuf buf; - if (m_pContext) { - m_pCryptoHandler->DecryptFinish(m_pContext, buf); - } -} -void CPDF_DecryptFilter::v_FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) -{ - if (m_pContext == NULL) { - m_pContext = m_pCryptoHandler->DecryptStart(m_ObjNum, m_GenNum); - } - m_pCryptoHandler->DecryptStream(m_pContext, src_buf, src_size, dest_buf); -} -void CPDF_DecryptFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf) -{ - m_bEOF = TRUE; - if (m_pContext == NULL) { + } + FX_DWORD read_size = 0; + if (m_pBuffer) { + read_size = ReadLeftOver(buffer, buf_size); + if (read_size == buf_size) { + return read_size; + } + buffer += read_size; + buf_size -= read_size; + } + ASSERT(m_pBuffer == NULL); + if (m_pFilter->IsEOF()) { + return read_size; + } + m_pBuffer = new CFX_BinaryBuf; + m_pBuffer->EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE); + m_BufOffset = 0; + while (1) { + int src_size = m_pStream->GetRawSize() - m_SrcOffset; + if (src_size == 0) { + m_pFilter->FilterFinish(*m_pBuffer); + break; + } + if (src_size > FPDF_FILTER_BUFFER_IN_SIZE) { + src_size = FPDF_FILTER_BUFFER_IN_SIZE; + } + if (!m_pStream->ReadRawData(m_SrcOffset, m_SrcBuffer, src_size)) { + return 0; + } + m_SrcOffset += src_size; + m_pFilter->FilterIn(m_SrcBuffer, src_size, *m_pBuffer); + if (m_pBuffer->GetSize() >= (int)buf_size) { + break; + } + } + return read_size + ReadLeftOver(buffer, buf_size); +} +FX_DWORD CPDF_StreamFilter::ReadLeftOver(uint8_t* buffer, FX_DWORD buf_size) { + FX_DWORD read_size = m_pBuffer->GetSize() - m_BufOffset; + if (read_size > buf_size) { + read_size = buf_size; + } + FXSYS_memcpy(buffer, m_pBuffer->GetBuffer() + m_BufOffset, read_size); + m_BufOffset += read_size; + if (m_BufOffset == (FX_DWORD)m_pBuffer->GetSize()) { + delete m_pBuffer; + m_pBuffer = NULL; + } + return read_size; +} +CPDF_DecryptFilter::CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, + FX_DWORD objnum, + FX_DWORD gennum) { + m_pCryptoHandler = pCryptoHandler; + m_pContext = NULL; + m_ObjNum = objnum; + m_GenNum = gennum; +} +CPDF_DecryptFilter::~CPDF_DecryptFilter() { + CFX_BinaryBuf buf; + if (m_pContext) { + m_pCryptoHandler->DecryptFinish(m_pContext, buf); + } +} +void CPDF_DecryptFilter::v_FilterIn(const uint8_t* src_buf, + FX_DWORD src_size, + CFX_BinaryBuf& dest_buf) { + if (m_pContext == NULL) { + m_pContext = m_pCryptoHandler->DecryptStart(m_ObjNum, m_GenNum); + } + m_pCryptoHandler->DecryptStream(m_pContext, src_buf, src_size, dest_buf); +} +void CPDF_DecryptFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf) { + m_bEOF = TRUE; + if (m_pContext == NULL) { + return; + } + m_pCryptoHandler->DecryptFinish(m_pContext, dest_buf); + m_pContext = NULL; +} +CPDF_FlateFilter::CPDF_FlateFilter() { + m_pContext = NULL; +} +CPDF_FlateFilter::~CPDF_FlateFilter() { + if (m_pContext) { + FPDFAPI_FlateEnd(m_pContext); + } +} +void CPDF_FlateFilter::v_FilterIn(const uint8_t* src_buf, + FX_DWORD src_size, + CFX_BinaryBuf& dest_buf) { + if (m_pContext == NULL) { + m_pContext = FPDFAPI_FlateInit(my_alloc_func, my_free_func); + } + FPDFAPI_FlateInput(m_pContext, src_buf, src_size); + while (1) { + int ret = + FPDFAPI_FlateOutput(m_pContext, m_DestBuffer, FPDF_FILTER_BUFFER_SIZE); + int out_size = + FPDF_FILTER_BUFFER_SIZE - FPDFAPI_FlateGetAvailOut(m_pContext); + dest_buf.AppendBlock(m_DestBuffer, out_size); + if (ret == Z_BUF_ERROR) { + break; + } + if (ret != Z_OK) { + ReportEOF(FPDFAPI_FlateGetAvailIn(m_pContext)); + break; + } + } +} +CPDF_LzwFilter::CPDF_LzwFilter(FX_BOOL bEarlyChange) { + m_bEarlyChange = bEarlyChange ? 1 : 0; + m_CodeLen = 9; + m_nCodes = 0; + m_nLeftBits = 0; + m_LeftBits = 0; + m_OldCode = (FX_DWORD)-1; +} +void CPDF_LzwFilter::v_FilterIn(const uint8_t* src_buf, + FX_DWORD src_size, + CFX_BinaryBuf& dest_buf) { + for (FX_DWORD i = 0; i < src_size; i++) { + if (m_nLeftBits + 8 < m_CodeLen) { + m_nLeftBits += 8; + m_LeftBits = (m_LeftBits << 8) | src_buf[i]; + continue; + } + FX_DWORD new_bits = m_CodeLen - m_nLeftBits; + FX_DWORD code = (m_LeftBits << new_bits) | (src_buf[i] >> (8 - new_bits)); + m_nLeftBits = 8 - new_bits; + m_LeftBits = src_buf[i] % (1 << m_nLeftBits); + if (code < 256) { + dest_buf.AppendByte((uint8_t)code); + m_LastChar = (uint8_t)code; + if (m_OldCode != -1) { + AddCode(m_OldCode, m_LastChar); + } + m_OldCode = code; + } else if (code == 256) { + m_CodeLen = 9; + m_nCodes = 0; + m_OldCode = (FX_DWORD)-1; + } else if (code == 257) { + ReportEOF(src_size - i - 1); + return; + } else { + if (m_OldCode == -1) { + ReportEOF(src_size - i - 1); return; - } - m_pCryptoHandler->DecryptFinish(m_pContext, dest_buf); - m_pContext = NULL; -} -CPDF_FlateFilter::CPDF_FlateFilter() -{ - m_pContext = NULL; -} -CPDF_FlateFilter::~CPDF_FlateFilter() -{ - if (m_pContext) { - FPDFAPI_FlateEnd(m_pContext); - } -} -void CPDF_FlateFilter::v_FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) -{ - if (m_pContext == NULL) { - m_pContext = FPDFAPI_FlateInit(my_alloc_func, my_free_func); - } - FPDFAPI_FlateInput(m_pContext, src_buf, src_size); - while (1) { - int ret = FPDFAPI_FlateOutput(m_pContext, m_DestBuffer, FPDF_FILTER_BUFFER_SIZE); - int out_size = FPDF_FILTER_BUFFER_SIZE - FPDFAPI_FlateGetAvailOut(m_pContext); - dest_buf.AppendBlock(m_DestBuffer, out_size); - if (ret == Z_BUF_ERROR) { - break; - } - if (ret != Z_OK) { - ReportEOF(FPDFAPI_FlateGetAvailIn(m_pContext)); - break; - } - } -} -CPDF_LzwFilter::CPDF_LzwFilter(FX_BOOL bEarlyChange) -{ - m_bEarlyChange = bEarlyChange ? 1 : 0; - m_CodeLen = 9; - m_nCodes = 0; - m_nLeftBits = 0; - m_LeftBits = 0; - m_OldCode = (FX_DWORD) - 1; -} -void CPDF_LzwFilter::v_FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) -{ - for (FX_DWORD i = 0; i < src_size; i ++) { - if (m_nLeftBits + 8 < m_CodeLen) { - m_nLeftBits += 8; - m_LeftBits = (m_LeftBits << 8) | src_buf[i]; - continue; - } - FX_DWORD new_bits = m_CodeLen - m_nLeftBits; - FX_DWORD code = (m_LeftBits << new_bits) | (src_buf[i] >> (8 - new_bits)); - m_nLeftBits = 8 - new_bits; - m_LeftBits = src_buf[i] % (1 << m_nLeftBits); - if (code < 256) { - dest_buf.AppendByte((uint8_t)code); - m_LastChar = (uint8_t)code; - if (m_OldCode != -1) { - AddCode(m_OldCode, m_LastChar); - } - m_OldCode = code; - } else if (code == 256) { - m_CodeLen = 9; - m_nCodes = 0; - m_OldCode = (FX_DWORD) - 1; - } else if (code == 257) { - ReportEOF(src_size - i - 1); - return; - } else { - if (m_OldCode == -1) { - ReportEOF(src_size - i - 1); - return; - } - m_StackLen = 0; - if (code >= m_nCodes + 258) { - if (m_StackLen < sizeof(m_DecodeStack)) { - m_DecodeStack[m_StackLen++] = m_LastChar; - } - DecodeString(m_OldCode); - } else { - DecodeString(code); - } - dest_buf.AppendBlock(NULL, m_StackLen); - uint8_t* pOutput = dest_buf.GetBuffer() + dest_buf.GetSize() - m_StackLen; - for (FX_DWORD cc = 0; cc < m_StackLen; cc ++) { - pOutput[cc] = m_DecodeStack[m_StackLen - cc - 1]; - } - m_LastChar = m_DecodeStack[m_StackLen - 1]; - if (m_OldCode < 256) { - AddCode(m_OldCode, m_LastChar); - } else if (m_OldCode - 258 >= m_nCodes) { - ReportEOF(src_size - i - 1); - return; - } else { - AddCode(m_OldCode, m_LastChar); - } - m_OldCode = code; - } - } -} -void CPDF_LzwFilter::AddCode(FX_DWORD prefix_code, uint8_t append_char) -{ - if (m_nCodes + m_bEarlyChange == 4094) { + } + m_StackLen = 0; + if (code >= m_nCodes + 258) { + if (m_StackLen < sizeof(m_DecodeStack)) { + m_DecodeStack[m_StackLen++] = m_LastChar; + } + DecodeString(m_OldCode); + } else { + DecodeString(code); + } + dest_buf.AppendBlock(NULL, m_StackLen); + uint8_t* pOutput = dest_buf.GetBuffer() + dest_buf.GetSize() - m_StackLen; + for (FX_DWORD cc = 0; cc < m_StackLen; cc++) { + pOutput[cc] = m_DecodeStack[m_StackLen - cc - 1]; + } + m_LastChar = m_DecodeStack[m_StackLen - 1]; + if (m_OldCode < 256) { + AddCode(m_OldCode, m_LastChar); + } else if (m_OldCode - 258 >= m_nCodes) { + ReportEOF(src_size - i - 1); return; - } - m_CodeArray[m_nCodes ++] = (prefix_code << 16) | append_char; - if (m_nCodes + m_bEarlyChange == 512 - 258) { - m_CodeLen = 10; - } else if (m_nCodes + m_bEarlyChange == 1024 - 258) { - m_CodeLen = 11; - } else if (m_nCodes + m_bEarlyChange == 2048 - 258) { - m_CodeLen = 12; - } -} -void CPDF_LzwFilter::DecodeString(FX_DWORD code) -{ - while (1) { - int index = code - 258; - if (index < 0 || index >= (int)m_nCodes) { - break; - } - FX_DWORD data = m_CodeArray[index]; - if (m_StackLen >= sizeof(m_DecodeStack)) { - return; - } - m_DecodeStack[m_StackLen++] = (uint8_t)data; - code = data >> 16; - } + } else { + AddCode(m_OldCode, m_LastChar); + } + m_OldCode = code; + } + } +} +void CPDF_LzwFilter::AddCode(FX_DWORD prefix_code, uint8_t append_char) { + if (m_nCodes + m_bEarlyChange == 4094) { + return; + } + m_CodeArray[m_nCodes++] = (prefix_code << 16) | append_char; + if (m_nCodes + m_bEarlyChange == 512 - 258) { + m_CodeLen = 10; + } else if (m_nCodes + m_bEarlyChange == 1024 - 258) { + m_CodeLen = 11; + } else if (m_nCodes + m_bEarlyChange == 2048 - 258) { + m_CodeLen = 12; + } +} +void CPDF_LzwFilter::DecodeString(FX_DWORD code) { + while (1) { + int index = code - 258; + if (index < 0 || index >= (int)m_nCodes) { + break; + } + FX_DWORD data = m_CodeArray[index]; if (m_StackLen >= sizeof(m_DecodeStack)) { - return; - } - m_DecodeStack[m_StackLen++] = (uint8_t)code; -} -CPDF_PredictorFilter::CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols) -{ - m_bTiff = predictor < 10; - m_pRefLine = NULL; - m_pCurLine = NULL; - m_iLine = 0; - m_LineInSize = 0; - m_Bpp = (colors * bpc + 7) / 8; - m_Pitch = (colors * bpc * cols + 7) / 8; + return; + } + m_DecodeStack[m_StackLen++] = (uint8_t)data; + code = data >> 16; + } + if (m_StackLen >= sizeof(m_DecodeStack)) { + return; + } + m_DecodeStack[m_StackLen++] = (uint8_t)code; +} +CPDF_PredictorFilter::CPDF_PredictorFilter(int predictor, + int colors, + int bpc, + int cols) { + m_bTiff = predictor < 10; + m_pRefLine = NULL; + m_pCurLine = NULL; + m_iLine = 0; + m_LineInSize = 0; + m_Bpp = (colors * bpc + 7) / 8; + m_Pitch = (colors * bpc * cols + 7) / 8; + if (!m_bTiff) { + m_Pitch++; + } +} +CPDF_PredictorFilter::~CPDF_PredictorFilter() { + if (m_pCurLine) { + FX_Free(m_pCurLine); + } + if (m_pRefLine) { + FX_Free(m_pRefLine); + } +} +static uint8_t PaethPredictor(int a, int b, int c) { + int p = a + b - c; + int pa = FXSYS_abs(p - a); + int pb = FXSYS_abs(p - b); + int pc = FXSYS_abs(p - c); + if (pa <= pb && pa <= pc) { + return (uint8_t)a; + } + if (pb <= pc) { + return (uint8_t)b; + } + return (uint8_t)c; +} +static void PNG_PredictorLine(uint8_t* cur_buf, + uint8_t* ref_buf, + int pitch, + int Bpp) { + uint8_t tag = cur_buf[0]; + if (tag == 0) { + return; + } + cur_buf++; + if (ref_buf) { + ref_buf++; + } + for (int byte = 0; byte < pitch; byte++) { + uint8_t raw_byte = cur_buf[byte]; + switch (tag) { + case 1: { + uint8_t left = 0; + if (byte >= Bpp) { + left = cur_buf[byte - Bpp]; + } + cur_buf[byte] = raw_byte + left; + break; + } + case 2: { + uint8_t up = 0; + if (ref_buf) { + up = ref_buf[byte]; + } + cur_buf[byte] = raw_byte + up; + break; + } + case 3: { + uint8_t left = 0; + if (byte >= Bpp) { + left = cur_buf[byte - Bpp]; + } + uint8_t up = 0; + if (ref_buf) { + up = ref_buf[byte]; + } + cur_buf[byte] = raw_byte + (up + left) / 2; + break; + } + case 4: { + uint8_t left = 0; + if (byte >= Bpp) { + left = cur_buf[byte - Bpp]; + } + uint8_t up = 0; + if (ref_buf) { + up = ref_buf[byte]; + } + uint8_t upper_left = 0; + if (byte >= Bpp && ref_buf) { + upper_left = ref_buf[byte - Bpp]; + } + cur_buf[byte] = raw_byte + PaethPredictor(left, up, upper_left); + break; + } + } + } +} +void CPDF_PredictorFilter::v_FilterIn(const uint8_t* src_buf, + FX_DWORD src_size, + CFX_BinaryBuf& dest_buf) { + if (m_pCurLine == NULL) { + m_pCurLine = FX_Alloc(uint8_t, m_Pitch); if (!m_bTiff) { - m_Pitch ++; - } -} -CPDF_PredictorFilter::~CPDF_PredictorFilter() -{ - if (m_pCurLine) { - FX_Free(m_pCurLine); - } - if (m_pRefLine) { - FX_Free(m_pRefLine); - } -} -static uint8_t PaethPredictor(int a, int b, int c) -{ - int p = a + b - c; - int pa = FXSYS_abs(p - a); - int pb = FXSYS_abs(p - b); - int pc = FXSYS_abs(p - c); - if (pa <= pb && pa <= pc) { - return (uint8_t)a; - } - if (pb <= pc) { - return (uint8_t)b; - } - return (uint8_t)c; -} -static void PNG_PredictorLine(uint8_t* cur_buf, uint8_t* ref_buf, int pitch, int Bpp) -{ - uint8_t tag = cur_buf[0]; - if (tag == 0) { - return; - } - cur_buf ++; - if (ref_buf) { - ref_buf ++; - } - for (int byte = 0; byte < pitch; byte ++) { - uint8_t raw_byte = cur_buf[byte]; - switch (tag) { - case 1: { - uint8_t left = 0; - if (byte >= Bpp) { - left = cur_buf[byte - Bpp]; - } - cur_buf[byte] = raw_byte + left; - break; - } - case 2: { - uint8_t up = 0; - if (ref_buf) { - up = ref_buf[byte]; - } - cur_buf[byte] = raw_byte + up; - break; - } - case 3: { - uint8_t left = 0; - if (byte >= Bpp) { - left = cur_buf[byte - Bpp]; - } - uint8_t up = 0; - if (ref_buf) { - up = ref_buf[byte]; - } - cur_buf[byte] = raw_byte + (up + left) / 2; - break; - } - case 4: { - uint8_t left = 0; - if (byte >= Bpp) { - left = cur_buf[byte - Bpp]; - } - uint8_t up = 0; - if (ref_buf) { - up = ref_buf[byte]; - } - uint8_t upper_left = 0; - if (byte >= Bpp && ref_buf) { - upper_left = ref_buf[byte - Bpp]; - } - cur_buf[byte] = raw_byte + PaethPredictor(left, up, upper_left); - break; - } - } - } -} -void CPDF_PredictorFilter::v_FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) -{ - if (m_pCurLine == NULL) { - m_pCurLine = FX_Alloc(uint8_t, m_Pitch); - if (!m_bTiff) { - m_pRefLine = FX_Alloc(uint8_t, m_Pitch); - } + m_pRefLine = FX_Alloc(uint8_t, m_Pitch); + } + } + while (1) { + FX_DWORD read_size = m_Pitch - m_LineInSize; + if (read_size > src_size) { + read_size = src_size; + } + FXSYS_memcpy(m_pCurLine + m_LineInSize, src_buf, read_size); + m_LineInSize += read_size; + if (m_LineInSize < m_Pitch) { + break; + } + src_buf += read_size; + src_size -= read_size; + if (m_bTiff) { + for (FX_DWORD byte = m_Bpp; byte < m_Pitch; byte++) { + m_pCurLine[byte] += m_pCurLine[byte - m_Bpp]; + } + dest_buf.AppendBlock(m_pCurLine, m_Pitch); + } else { + PNG_PredictorLine(m_pCurLine, m_iLine ? m_pRefLine : NULL, m_Pitch - 1, + m_Bpp); + dest_buf.AppendBlock(m_pCurLine + 1, m_Pitch - 1); + m_iLine++; + uint8_t* temp = m_pCurLine; + m_pCurLine = m_pRefLine; + m_pRefLine = temp; } - while (1) { - FX_DWORD read_size = m_Pitch - m_LineInSize; - if (read_size > src_size) { - read_size = src_size; - } - FXSYS_memcpy(m_pCurLine + m_LineInSize, src_buf, read_size); - m_LineInSize += read_size; - if (m_LineInSize < m_Pitch) { - break; - } - src_buf += read_size; - src_size -= read_size; - if (m_bTiff) { - for (FX_DWORD byte = m_Bpp; byte < m_Pitch; byte ++) { - m_pCurLine[byte] += m_pCurLine[byte - m_Bpp]; + m_LineInSize = 0; + } +} +CPDF_Ascii85Filter::CPDF_Ascii85Filter() { + m_State = 0; + m_CharCount = 0; +} +void CPDF_Ascii85Filter::v_FilterIn(const uint8_t* src_buf, + FX_DWORD src_size, + CFX_BinaryBuf& dest_buf) { + for (FX_DWORD i = 0; i < src_size; i++) { + uint8_t byte = src_buf[i]; + if (PDF_CharType[byte] == 'W') { + continue; + } + switch (m_State) { + case 0: + if (byte >= '!' && byte <= 'u') { + int digit = byte - '!'; + m_CurDWord = digit; + m_CharCount = 1; + m_State = 1; + } else if (byte == 'z') { + int zero = 0; + dest_buf.AppendBlock(&zero, 4); + } else if (byte == '~') { + m_State = 2; + } + break; + case 1: { + if (byte >= '!' && byte <= 'u') { + int digit = byte - '!'; + m_CurDWord = m_CurDWord * 85 + digit; + m_CharCount++; + if (m_CharCount == 5) { + for (int i = 0; i < 4; i++) { + dest_buf.AppendByte((uint8_t)(m_CurDWord >> (3 - i) * 8)); } - dest_buf.AppendBlock(m_pCurLine, m_Pitch); - } else { - PNG_PredictorLine(m_pCurLine, m_iLine ? m_pRefLine : NULL, m_Pitch - 1, m_Bpp); - dest_buf.AppendBlock(m_pCurLine + 1, m_Pitch - 1); - m_iLine ++; - uint8_t* temp = m_pCurLine; - m_pCurLine = m_pRefLine; - m_pRefLine = temp; - } - m_LineInSize = 0; - } -} -CPDF_Ascii85Filter::CPDF_Ascii85Filter() -{ - m_State = 0; - m_CharCount = 0; -} -void CPDF_Ascii85Filter::v_FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) -{ - for (FX_DWORD i = 0; i < src_size; i ++) { - uint8_t byte = src_buf[i]; - if (PDF_CharType[byte] == 'W') { - continue; - } - switch (m_State) { - case 0: - if (byte >= '!' && byte <= 'u') { - int digit = byte - '!'; - m_CurDWord = digit; - m_CharCount = 1; - m_State = 1; - } else if (byte == 'z') { - int zero = 0; - dest_buf.AppendBlock(&zero, 4); - } else if (byte == '~') { - m_State = 2; - } - break; - case 1: { - if (byte >= '!' && byte <= 'u') { - int digit = byte - '!'; - m_CurDWord = m_CurDWord * 85 + digit; - m_CharCount ++; - if (m_CharCount == 5) { - for (int i = 0; i < 4; i ++) { - dest_buf.AppendByte((uint8_t)(m_CurDWord >> (3 - i) * 8)); - } - m_State = 0; - } - } else if (byte == '~') { - if (m_CharCount > 1) { - int i; - for (i = m_CharCount; i < 5; i ++) { - m_CurDWord = m_CurDWord * 85 + 84; - } - for (i = 0; i < m_CharCount - 1; i ++) { - dest_buf.AppendByte((uint8_t)(m_CurDWord >> (3 - i) * 8)); - } - } - m_State = 2; - } - break; - } - case 2: - if (byte == '>') { - ReportEOF(src_size - i - 1); - return; - } - break; - } - } -} -CPDF_AsciiHexFilter::CPDF_AsciiHexFilter() -{ - m_State = 0; -} -void CPDF_AsciiHexFilter::v_FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) -{ - for (FX_DWORD i = 0; i < src_size; i ++) { - uint8_t byte = src_buf[i]; - if (PDF_CharType[byte] == 'W') { - continue; - } - int digit; - if (byte >= '0' && byte <= '9') { - digit = byte - '0'; - } else if (byte >= 'a' && byte <= 'f') { - digit = byte - 'a' + 10; - } else if (byte >= 'A' && byte <= 'F') { - digit = byte - 'A' + 10; - } else { - if (m_State) { - dest_buf.AppendByte(m_FirstDigit * 16); + m_State = 0; + } + } else if (byte == '~') { + if (m_CharCount > 1) { + int i; + for (i = m_CharCount; i < 5; i++) { + m_CurDWord = m_CurDWord * 85 + 84; } - ReportEOF(src_size - i - 1); - return; - } - if (m_State == 0) { - m_FirstDigit = digit; - m_State ++; - } else { - dest_buf.AppendByte(m_FirstDigit * 16 + digit); - m_State --; - } - } -} -CPDF_RunLenFilter::CPDF_RunLenFilter() -{ - m_State = 0; - m_Count = 0; -} -void CPDF_RunLenFilter::v_FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) -{ - for (FX_DWORD i = 0; i < src_size; i ++) { - uint8_t byte = src_buf[i]; - switch (m_State) { - case 0: - if (byte < 128) { - m_State = 1; - m_Count = byte + 1; - } else if (byte == 128) { - ReportEOF(src_size - i - 1); - return; - } else { - m_State = 2; - m_Count = 257 - byte; - } - break; - case 1: - dest_buf.AppendByte(byte); - m_Count --; - if (m_Count == 0) { - m_State = 0; - } - break; - case 2: { - dest_buf.AppendBlock(NULL, m_Count); - FXSYS_memset(dest_buf.GetBuffer() + dest_buf.GetSize() - m_Count, byte, m_Count); - m_State = 0; - break; - } - } - } -} -CPDF_JpegFilter::CPDF_JpegFilter() -{ - m_pContext = NULL; - m_bGotHeader = FALSE; - m_pScanline = NULL; - m_iLine = 0; -} -CPDF_JpegFilter::~CPDF_JpegFilter() -{ - if (m_pScanline) { - FX_Free(m_pScanline); - } - if (m_pContext) { - CPDF_ModuleMgr::Get()->GetJpegModule()->Finish(m_pContext); - } -} -void CPDF_JpegFilter::v_FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) -{ - if (m_pContext == NULL) { - m_pContext = CPDF_ModuleMgr::Get()->GetJpegModule()->Start(); - } - const uint8_t* jpeg_src_buf; - FX_DWORD jpeg_src_size; - CFX_BinaryBuf temp_buf; - if (m_InputBuf.GetSize()) { - temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size); - temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize()); - m_InputBuf.Clear(); - temp_buf.AppendBlock(src_buf, src_size); - jpeg_src_buf = temp_buf.GetBuffer(); - jpeg_src_size = temp_buf.GetSize(); + for (i = 0; i < m_CharCount - 1; i++) { + dest_buf.AppendByte((uint8_t)(m_CurDWord >> (3 - i) * 8)); + } + } + m_State = 2; + } + break; + } + case 2: + if (byte == '>') { + ReportEOF(src_size - i - 1); + return; + } + break; + } + } +} +CPDF_AsciiHexFilter::CPDF_AsciiHexFilter() { + m_State = 0; +} +void CPDF_AsciiHexFilter::v_FilterIn(const uint8_t* src_buf, + FX_DWORD src_size, + CFX_BinaryBuf& dest_buf) { + for (FX_DWORD i = 0; i < src_size; i++) { + uint8_t byte = src_buf[i]; + if (PDF_CharType[byte] == 'W') { + continue; + } + int digit; + if (byte >= '0' && byte <= '9') { + digit = byte - '0'; + } else if (byte >= 'a' && byte <= 'f') { + digit = byte - 'a' + 10; + } else if (byte >= 'A' && byte <= 'F') { + digit = byte - 'A' + 10; } else { - jpeg_src_buf = src_buf; - jpeg_src_size = src_size; - } - CPDF_ModuleMgr::Get()->GetJpegModule()->Input(m_pContext, jpeg_src_buf, jpeg_src_size); - if (!m_bGotHeader) { - int ret = CPDF_ModuleMgr::Get()->GetJpegModule()->ReadHeader(m_pContext, &m_Width, &m_Height, &m_nComps); - int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext); - if (ret == 1) { - ReportEOF(left_size); - return; - } - if (ret == 2) { - m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size); - return; - } - CPDF_ModuleMgr::Get()->GetJpegModule()->StartScanline(m_pContext, 1); - m_bGotHeader = TRUE; - m_Pitch = m_Width * m_nComps; - } - if (m_pScanline == NULL) { - m_pScanline = FX_Alloc(uint8_t, m_Pitch + 4); - } - while (1) { - if (!CPDF_ModuleMgr::Get()->GetJpegModule()->ReadScanline(m_pContext, m_pScanline)) { - int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext); - m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size); - break; - } - dest_buf.AppendBlock(m_pScanline, m_Pitch); - m_iLine ++; - if (m_iLine == m_Height) { - ReportEOF(CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext)); - return; - } - } -} -CPDF_FaxFilter::CPDF_FaxFilter() -{ - m_Encoding = 0; - m_bEndOfLine = FALSE; - m_bByteAlign = FALSE; - m_bBlack = FALSE; - m_nRows = 0; - m_nColumns = 0; - m_Pitch = 0; - m_pScanlineBuf = NULL; - m_pRefBuf = NULL; - m_iRow = 0; - m_InputBitPos = 0; -} -CPDF_FaxFilter::~CPDF_FaxFilter() -{ - if (m_pScanlineBuf) { - FX_Free(m_pScanlineBuf); - } - if (m_pRefBuf) { - FX_Free(m_pRefBuf); - } -} -FX_BOOL CPDF_FaxFilter::Initialize(int Encoding, int bEndOfLine, int bByteAlign, int bBlack, int nRows, int nColumns) -{ - m_Encoding = Encoding; - m_bEndOfLine = bEndOfLine; - m_bByteAlign = bByteAlign; - m_bBlack = bBlack; - m_nRows = nRows; - m_nColumns = nColumns; - m_Pitch = (m_nColumns + 7) / 8; - m_pScanlineBuf = FX_Alloc(uint8_t, m_Pitch); - m_pRefBuf = FX_Alloc(uint8_t, m_Pitch); - FXSYS_memset(m_pScanlineBuf, 0xff, m_Pitch); - FXSYS_memset(m_pRefBuf, 0xff, m_Pitch); - m_iRow = 0; - m_InputBitPos = 0; - return TRUE; -} -void CPDF_FaxFilter::v_FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) -{ - const uint8_t* fax_src_buf; - FX_DWORD fax_src_size; - CFX_BinaryBuf temp_buf; - int bitpos; - if (m_InputBuf.GetSize()) { - temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size); - temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize()); - m_InputBuf.Clear(); - temp_buf.AppendBlock(src_buf, src_size); - fax_src_buf = temp_buf.GetBuffer(); - fax_src_size = temp_buf.GetSize(); - bitpos = m_InputBitPos; + if (m_State) { + dest_buf.AppendByte(m_FirstDigit * 16); + } + ReportEOF(src_size - i - 1); + return; + } + if (m_State == 0) { + m_FirstDigit = digit; + m_State++; } else { - fax_src_buf = src_buf; - fax_src_size = src_size; - bitpos = 0; - } - ProcessData(fax_src_buf, fax_src_size, bitpos, FALSE, dest_buf); - int left_bits = fax_src_size * 8 - bitpos; - m_InputBuf.AppendBlock(fax_src_buf + bitpos / 8, (left_bits + 7) / 8); - m_InputBitPos = bitpos % 8; -} -void CPDF_FaxFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf) -{ - ProcessData(m_InputBuf.GetBuffer(), m_InputBuf.GetSize(), m_InputBitPos, TRUE, dest_buf); + dest_buf.AppendByte(m_FirstDigit * 16 + digit); + m_State--; + } + } +} +CPDF_RunLenFilter::CPDF_RunLenFilter() { + m_State = 0; + m_Count = 0; +} +void CPDF_RunLenFilter::v_FilterIn(const uint8_t* src_buf, + FX_DWORD src_size, + CFX_BinaryBuf& dest_buf) { + for (FX_DWORD i = 0; i < src_size; i++) { + uint8_t byte = src_buf[i]; + switch (m_State) { + case 0: + if (byte < 128) { + m_State = 1; + m_Count = byte + 1; + } else if (byte == 128) { + ReportEOF(src_size - i - 1); + return; + } else { + m_State = 2; + m_Count = 257 - byte; + } + break; + case 1: + dest_buf.AppendByte(byte); + m_Count--; + if (m_Count == 0) { + m_State = 0; + } + break; + case 2: { + dest_buf.AppendBlock(NULL, m_Count); + FXSYS_memset(dest_buf.GetBuffer() + dest_buf.GetSize() - m_Count, byte, + m_Count); + m_State = 0; + break; + } + } + } +} +CPDF_JpegFilter::CPDF_JpegFilter() { + m_pContext = NULL; + m_bGotHeader = FALSE; + m_pScanline = NULL; + m_iLine = 0; +} +CPDF_JpegFilter::~CPDF_JpegFilter() { + if (m_pScanline) { + FX_Free(m_pScanline); + } + if (m_pContext) { + CPDF_ModuleMgr::Get()->GetJpegModule()->Finish(m_pContext); + } +} +void CPDF_JpegFilter::v_FilterIn(const uint8_t* src_buf, + FX_DWORD src_size, + CFX_BinaryBuf& dest_buf) { + if (m_pContext == NULL) { + m_pContext = CPDF_ModuleMgr::Get()->GetJpegModule()->Start(); + } + const uint8_t* jpeg_src_buf; + FX_DWORD jpeg_src_size; + CFX_BinaryBuf temp_buf; + if (m_InputBuf.GetSize()) { + temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size); + temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize()); + m_InputBuf.Clear(); + temp_buf.AppendBlock(src_buf, src_size); + jpeg_src_buf = temp_buf.GetBuffer(); + jpeg_src_size = temp_buf.GetSize(); + } else { + jpeg_src_buf = src_buf; + jpeg_src_size = src_size; + } + CPDF_ModuleMgr::Get()->GetJpegModule()->Input(m_pContext, jpeg_src_buf, + jpeg_src_size); + if (!m_bGotHeader) { + int ret = CPDF_ModuleMgr::Get()->GetJpegModule()->ReadHeader( + m_pContext, &m_Width, &m_Height, &m_nComps); + int left_size = + CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext); + if (ret == 1) { + ReportEOF(left_size); + return; + } + if (ret == 2) { + m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, + left_size); + return; + } + CPDF_ModuleMgr::Get()->GetJpegModule()->StartScanline(m_pContext, 1); + m_bGotHeader = TRUE; + m_Pitch = m_Width * m_nComps; + } + if (m_pScanline == NULL) { + m_pScanline = FX_Alloc(uint8_t, m_Pitch + 4); + } + while (1) { + if (!CPDF_ModuleMgr::Get()->GetJpegModule()->ReadScanline(m_pContext, + m_pScanline)) { + int left_size = + CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext); + m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, + left_size); + break; + } + dest_buf.AppendBlock(m_pScanline, m_Pitch); + m_iLine++; + if (m_iLine == m_Height) { + ReportEOF( + CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext)); + return; + } + } +} +CPDF_FaxFilter::CPDF_FaxFilter() { + m_Encoding = 0; + m_bEndOfLine = FALSE; + m_bByteAlign = FALSE; + m_bBlack = FALSE; + m_nRows = 0; + m_nColumns = 0; + m_Pitch = 0; + m_pScanlineBuf = NULL; + m_pRefBuf = NULL; + m_iRow = 0; + m_InputBitPos = 0; +} +CPDF_FaxFilter::~CPDF_FaxFilter() { + if (m_pScanlineBuf) { + FX_Free(m_pScanlineBuf); + } + if (m_pRefBuf) { + FX_Free(m_pRefBuf); + } +} +FX_BOOL CPDF_FaxFilter::Initialize(int Encoding, + int bEndOfLine, + int bByteAlign, + int bBlack, + int nRows, + int nColumns) { + m_Encoding = Encoding; + m_bEndOfLine = bEndOfLine; + m_bByteAlign = bByteAlign; + m_bBlack = bBlack; + m_nRows = nRows; + m_nColumns = nColumns; + m_Pitch = (m_nColumns + 7) / 8; + m_pScanlineBuf = FX_Alloc(uint8_t, m_Pitch); + m_pRefBuf = FX_Alloc(uint8_t, m_Pitch); + FXSYS_memset(m_pScanlineBuf, 0xff, m_Pitch); + FXSYS_memset(m_pRefBuf, 0xff, m_Pitch); + m_iRow = 0; + m_InputBitPos = 0; + return TRUE; +} +void CPDF_FaxFilter::v_FilterIn(const uint8_t* src_buf, + FX_DWORD src_size, + CFX_BinaryBuf& dest_buf) { + const uint8_t* fax_src_buf; + FX_DWORD fax_src_size; + CFX_BinaryBuf temp_buf; + int bitpos; + if (m_InputBuf.GetSize()) { + temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size); + temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize()); + m_InputBuf.Clear(); + temp_buf.AppendBlock(src_buf, src_size); + fax_src_buf = temp_buf.GetBuffer(); + fax_src_size = temp_buf.GetSize(); + bitpos = m_InputBitPos; + } else { + fax_src_buf = src_buf; + fax_src_size = src_size; + bitpos = 0; + } + ProcessData(fax_src_buf, fax_src_size, bitpos, FALSE, dest_buf); + int left_bits = fax_src_size * 8 - bitpos; + m_InputBuf.AppendBlock(fax_src_buf + bitpos / 8, (left_bits + 7) / 8); + m_InputBitPos = bitpos % 8; +} +void CPDF_FaxFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf) { + ProcessData(m_InputBuf.GetBuffer(), m_InputBuf.GetSize(), m_InputBitPos, TRUE, + dest_buf); } FX_BOOL _FaxSkipEOL(const uint8_t* src_buf, int bitsize, int& bitpos); -FX_BOOL _FaxG4GetRow(const uint8_t* src_buf, int bitsize, int& bitpos, uint8_t* dest_buf, const uint8_t* ref_buf, int columns); -FX_BOOL _FaxGet1DLine(const uint8_t* src_buf, int bitsize, int& bitpos, uint8_t* dest_buf, int columns); -void CPDF_FaxFilter::ProcessData(const uint8_t* src_buf, FX_DWORD src_size, int& bitpos, FX_BOOL bFinish, - CFX_BinaryBuf& dest_buf) -{ - int bitsize = src_size * 8; - while (1) { - if ((bitsize < bitpos + 256) && !bFinish) { - return; - } - int start_bitpos = bitpos; - FXSYS_memset(m_pScanlineBuf, 0xff, m_Pitch); - if (!ReadLine(src_buf, bitsize, bitpos)) { - bitpos = start_bitpos; - return; - } - if (m_Encoding) { - FXSYS_memcpy(m_pRefBuf, m_pScanlineBuf, m_Pitch); - } - if (m_bBlack) { - for (int i = 0; i < m_Pitch; i ++) { - m_pScanlineBuf[i] = ~m_pScanlineBuf[i]; - } - } - dest_buf.AppendBlock(m_pScanlineBuf, m_Pitch); - m_iRow ++; - if (m_iRow == m_nRows) { - ReportEOF(src_size - (bitpos + 7) / 8); - return; - } - } -} -FX_BOOL CPDF_FaxFilter::ReadLine(const uint8_t* src_buf, int bitsize, int& bitpos) -{ - if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) { - return FALSE; - } - FX_BOOL ret; - if (m_Encoding < 0) { - ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns); - } else if (m_Encoding == 0) { - ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns); +FX_BOOL _FaxG4GetRow(const uint8_t* src_buf, + int bitsize, + int& bitpos, + uint8_t* dest_buf, + const uint8_t* ref_buf, + int columns); +FX_BOOL _FaxGet1DLine(const uint8_t* src_buf, + int bitsize, + int& bitpos, + uint8_t* dest_buf, + int columns); +void CPDF_FaxFilter::ProcessData(const uint8_t* src_buf, + FX_DWORD src_size, + int& bitpos, + FX_BOOL bFinish, + CFX_BinaryBuf& dest_buf) { + int bitsize = src_size * 8; + while (1) { + if ((bitsize < bitpos + 256) && !bFinish) { + return; + } + int start_bitpos = bitpos; + FXSYS_memset(m_pScanlineBuf, 0xff, m_Pitch); + if (!ReadLine(src_buf, bitsize, bitpos)) { + bitpos = start_bitpos; + return; + } + if (m_Encoding) { + FXSYS_memcpy(m_pRefBuf, m_pScanlineBuf, m_Pitch); + } + if (m_bBlack) { + for (int i = 0; i < m_Pitch; i++) { + m_pScanlineBuf[i] = ~m_pScanlineBuf[i]; + } + } + dest_buf.AppendBlock(m_pScanlineBuf, m_Pitch); + m_iRow++; + if (m_iRow == m_nRows) { + ReportEOF(src_size - (bitpos + 7) / 8); + return; + } + } +} +FX_BOOL CPDF_FaxFilter::ReadLine(const uint8_t* src_buf, + int bitsize, + int& bitpos) { + if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) { + return FALSE; + } + FX_BOOL ret; + if (m_Encoding < 0) { + ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, + m_nColumns); + } else if (m_Encoding == 0) { + ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns); + } else { + if (bitpos == bitsize) { + return FALSE; + } + FX_BOOL bNext1D = src_buf[bitpos / 8] & (1 << (7 - bitpos % 8)); + bitpos++; + if (bNext1D) { + ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns); } else { - if (bitpos == bitsize) { - return FALSE; - } - FX_BOOL bNext1D = src_buf[bitpos / 8] & (1 << (7 - bitpos % 8)); - bitpos ++; - if (bNext1D) { - ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns); - } else { - ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns); - } - } - if (!ret) { - return FALSE; - } - if (m_bEndOfLine) - if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) { - return FALSE; - } - if (m_bByteAlign) { - bitpos = (bitpos + 7) / 8 * 8; + ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, + m_nColumns); + } + } + if (!ret) { + return FALSE; + } + if (m_bEndOfLine) + if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) { + return FALSE; } - return TRUE; + if (m_bByteAlign) { + bitpos = (bitpos + 7) / 8 * 8; + } + return TRUE; } -- cgit v1.2.3