| Index: 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 fed4546fab7efc93d50ea7d9806729d7a7a3cae0..8cb432029c9dad6f4fd59d2dddfd29419c52561f 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;
|
| }
|
|
|