// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../fx_zlib.h"
#include "../../../include/fpdfapi/fpdf_parser.h"
#include "../../../include/fxcodec/fx_codec.h"
#include "../../../include/fpdfapi/fpdf_module.h"
#include "filters_int.h"
CFX_DataFilter::CFX_DataFilter()
{
    m_bEOF = FALSE;
    m_pDestFilter = NULL;
    m_SrcPos = 0;
}
CFX_DataFilter::~CFX_DataFilter()
{
    if (m_pDestFilter) {
        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(FX_LPCBYTE 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(FX_BSTR 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 = FX_NEW CPDF_LzwFilter(pParam->GetInteger("EarlyChange", 1));
                } else {
                    pFilter = FX_NEW CPDF_FlateFilter;
                }
                if (pParam->GetInteger("Predictor", 1) > 1) {
                    CFX_DataFilter* pPredictor = FX_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 FX_NEW CPDF_AsciiHexFilter;
            }
            return FX_NEW CPDF_Ascii85Filter;
        case FXBSTR_ID('A', 'H', 'x', 0):
            return FX_NEW CPDF_AsciiHexFilter;
        case FXBSTR_ID('A', '8', '5', 0):
            return FX_NEW CPDF_Ascii85Filter;
        case FXBSTR_ID('R', 'u', 'n', 'L'):
            return FX_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 = FX_NEW CPDF_FaxFilter();
                pFilter->Initialize(Encoding, bEndOfLine, bByteAlign, bBlack, nRows, nColumns);
                return pFilter;
            }
        case FXBSTR_ID('D', 'C', 'T', 'D'):
            return FX_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 = FX_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 = FX_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()
{
    if (m_pFilter) {
        delete m_pFilter;
    }
    if (m_pBuffer) {
        delete m_pBuffer;
    }
}
#define FPDF_FILTER_BUFFER_IN_SIZE	FPDF_FILTER_BUFFER_SIZE
FX_DWORD CPDF_StreamFilter::ReadBlock(FX_LPBYTE 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 = FX_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(FX_LPBYTE buffer, FX_DWORD buf_size)
{
    FX_DWORD read_size = m_pBuffer->GetSize() - m_BufOffset;
    if (read_size > buf_size) {
        read_size = buf_size;
    }
    FXSYS_memcpy32(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(FX_LPCBYTE 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;
}
extern "C" {
    static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)
    {
        return FX_Alloc(FX_BYTE, items * size);
    }
    static void   my_free_func  (void* opaque, void* address)
    {
        FX_Free(address);
    }
    void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),
                            void (*free_func)(void*, void*));
    void FPDFAPI_FlateInput(void* context, const unsigned char* src_buf, unsigned int src_size);
    int FPDFAPI_FlateOutput(void* context, unsigned char* dest_buf, unsigned int dest_size);
    int FPDFAPI_FlateGetAvailIn(void* context);
    int FPDFAPI_FlateGetAvailOut(void* context);
    void FPDFAPI_FlateEnd(void* context);
}
CPDF_FlateFilter::CPDF_FlateFilter()
{
    m_pContext = NULL;
}
CPDF_FlateFilter::~CPDF_FlateFilter()
{
    if (m_pContext) {
        FPDFAPI_FlateEnd(m_pContext);
    }
}
void CPDF_FlateFilter::v_FilterIn(FX_LPCBYTE 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(FX_LPCBYTE 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((FX_BYTE)code);
            m_LastChar = (FX_BYTE)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);
            FX_LPBYTE 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, FX_BYTE 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++] = (FX_BYTE)data;
        code = data >> 16;
    }
    if (m_StackLen >= sizeof(m_DecodeStack)) {
        return;
    }
    m_DecodeStack[m_StackLen++] = (FX_BYTE)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 FX_BYTE 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 (FX_BYTE)a;
    }
    if (pb <= pc) {
        return (FX_BYTE)b;
    }
    return (FX_BYTE)c;
}
static void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, int Bpp)
{
    FX_BYTE tag = cur_buf[0];
    if (tag == 0) {
        return;
    }
    cur_buf ++;
    if (ref_buf) {
        ref_buf ++;
    }
    for (int byte = 0; byte < pitch; byte ++) {
        FX_BYTE raw_byte = cur_buf[byte];
        switch (tag) {
            case 1:	{
                    FX_BYTE left = 0;
                    if (byte >= Bpp) {
                        left = cur_buf[byte - Bpp];
                    }
                    cur_buf[byte] = raw_byte + left;
                    break;
                }
            case 2: {
                    FX_BYTE up = 0;
                    if (ref_buf) {
                        up = ref_buf[byte];
                    }
                    cur_buf[byte] = raw_byte + up;
                    break;
                }
            case 3: {
                    FX_BYTE left = 0;
                    if (byte >= Bpp) {
                        left = cur_buf[byte - Bpp];
                    }
                    FX_BYTE up = 0;
                    if (ref_buf) {
                        up = ref_buf[byte];
                    }
                    cur_buf[byte] = raw_byte + (up + left) / 2;
                    break;
                }
            case 4: {
                    FX_BYTE left = 0;
                    if (byte >= Bpp) {
                        left = cur_buf[byte - Bpp];
                    }
                    FX_BYTE up = 0;
                    if (ref_buf) {
                        up = ref_buf[byte];
                    }
                    FX_BYTE 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(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
{
    if (m_pCurLine == NULL) {
        m_pCurLine = FX_Alloc(FX_BYTE, m_Pitch);
        if (!m_bTiff) {
            m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);
        }
    }
    while (1) {
        FX_DWORD read_size = m_Pitch - m_LineInSize;
        if (read_size > src_size) {
            read_size = src_size;
        }
        FXSYS_memcpy32(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 ++;
            FX_LPBYTE temp = m_pCurLine;
            m_pCurLine = m_pRefLine;
            m_pRefLine = temp;
        }
        m_LineInSize = 0;
    }
}
CPDF_Ascii85Filter::CPDF_Ascii85Filter()
{
    m_State = 0;
    m_CharCount = 0;
}
extern const FX_LPCSTR _PDF_CharType;
void CPDF_Ascii85Filter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
{
    for (FX_DWORD i = 0; i < src_size; i ++) {
        FX_BYTE 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((FX_BYTE)(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((FX_BYTE)(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(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
{
    for (FX_DWORD i = 0; i < src_size; i ++) {
        FX_BYTE 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);
            }
            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(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
{
    for (FX_DWORD i = 0; i < src_size; i ++) {
        FX_BYTE 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_memset8(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(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
{
    if (m_pContext == NULL) {
        m_pContext = CPDF_ModuleMgr::Get()->GetJpegModule()->Start();
    }
    FX_LPCBYTE 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(FX_BYTE, 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(FX_BYTE, m_Pitch);
    m_pRefBuf = FX_Alloc(FX_BYTE, m_Pitch);
    FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);
    FXSYS_memset8(m_pRefBuf, 0xff, m_Pitch);
    m_iRow = 0;
    m_InputBitPos = 0;
    return TRUE;
}
void CPDF_FaxFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
{
    FX_LPCBYTE 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 FX_BYTE* src_buf, int bitsize, int& bitpos);
FX_BOOL _FaxG4GetRow(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, const FX_BYTE* ref_buf, int columns);
FX_BOOL _FaxGet1DLine(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, int columns);
void CPDF_FaxFilter::ProcessData(FX_LPCBYTE 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_memset8(m_pScanlineBuf, 0xff, m_Pitch);
        if (!ReadLine(src_buf, bitsize, bitpos)) {
            bitpos = start_bitpos;
            return;
        }
        if (m_Encoding) {
            FXSYS_memcpy32(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(FX_LPCBYTE 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 {
            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;
    }
    return TRUE;
}
