Merge to XFA: Move zlib to third_party/
[pdfium.git] / core / src / fpdfapi / fpdf_parser / fpdf_parser_filters.cpp
index ac3f2b2..ead5e24 100644 (file)
@@ -1,14 +1,15 @@
 // 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 "../../fxcodec/fx_zlib/include/fx_zlib.h"
 #include "filters_int.h"
+
 CFX_DataFilter::CFX_DataFilter()
 {
     m_bEOF = FALSE;
@@ -29,7 +30,7 @@ void CFX_DataFilter::SetDestFilter(CFX_DataFilter* pFilter)
         m_pDestFilter = pFilter;
     }
 }
-void CFX_DataFilter::FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+void CFX_DataFilter::FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
 {
     if (m_bEOF) {
         return;
@@ -66,7 +67,7 @@ void CFX_DataFilter::ReportEOF(FX_DWORD left_input)
     m_bEOF = TRUE;
     m_SrcPos -= left_input;
 }
-CFX_DataFilter* FPDF_CreateFilter(FX_BSTR name, const CPDF_Dictionary* pParam, int width, int height)
+CFX_DataFilter* FPDF_CreateFilter(const CFX_ByteStringC& name, const CPDF_Dictionary* pParam, int width, int height)
 {
     FX_DWORD id = name.GetID();
     switch (id) {
@@ -199,7 +200,7 @@ CPDF_StreamFilter::~CPDF_StreamFilter()
     }
 }
 #define FPDF_FILTER_BUFFER_IN_SIZE     FPDF_FILTER_BUFFER_SIZE
-FX_DWORD CPDF_StreamFilter::ReadBlock(FX_LPBYTE buffer, FX_DWORD buf_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;
@@ -249,13 +250,13 @@ FX_DWORD CPDF_StreamFilter::ReadBlock(FX_LPBYTE buffer, FX_DWORD buf_size)
     }
     return read_size + ReadLeftOver(buffer, buf_size);
 }
-FX_DWORD CPDF_StreamFilter::ReadLeftOver(FX_LPBYTE buffer, FX_DWORD 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_memcpy32(buffer, m_pBuffer->GetBuffer() + m_BufOffset, read_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;
@@ -277,7 +278,7 @@ CPDF_DecryptFilter::~CPDF_DecryptFilter()
         m_pCryptoHandler->DecryptFinish(m_pContext, buf);
     }
 }
-void CPDF_DecryptFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_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);
@@ -296,7 +297,7 @@ void CPDF_DecryptFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf)
 extern "C" {
     static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)
     {
-        return FX_Alloc(FX_BYTE, items * size);
+        return FX_Alloc2D(uint8_t, items, size);
     }
     static void   my_free_func  (void* opaque, void* address)
     {
@@ -320,7 +321,7 @@ CPDF_FlateFilter::~CPDF_FlateFilter()
         FPDFAPI_FlateEnd(m_pContext);
     }
 }
-void CPDF_FlateFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+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);
@@ -348,7 +349,7 @@ CPDF_LzwFilter::CPDF_LzwFilter(FX_BOOL bEarlyChange)
     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)
+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) {
@@ -361,8 +362,8 @@ void CPDF_LzwFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_Binar
         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;
+            dest_buf.AppendByte((uint8_t)code);
+            m_LastChar = (uint8_t)code;
             if (m_OldCode != -1) {
                 AddCode(m_OldCode, m_LastChar);
             }
@@ -389,7 +390,7 @@ void CPDF_LzwFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_Binar
                 DecodeString(code);
             }
             dest_buf.AppendBlock(NULL, m_StackLen);
-            FX_LPBYTE pOutput = dest_buf.GetBuffer() + dest_buf.GetSize() - 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];
             }
@@ -406,7 +407,7 @@ void CPDF_LzwFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_Binar
         }
     }
 }
-void CPDF_LzwFilter::AddCode(FX_DWORD prefix_code, FX_BYTE append_char)
+void CPDF_LzwFilter::AddCode(FX_DWORD prefix_code, uint8_t append_char)
 {
     if (m_nCodes + m_bEarlyChange == 4094) {
         return;
@@ -431,13 +432,13 @@ void CPDF_LzwFilter::DecodeString(FX_DWORD code)
         if (m_StackLen >= sizeof(m_DecodeStack)) {
             return;
         }
-        m_DecodeStack[m_StackLen++] = (FX_BYTE)data;
+        m_DecodeStack[m_StackLen++] = (uint8_t)data;
         code = data >> 16;
     }
     if (m_StackLen >= sizeof(m_DecodeStack)) {
         return;
     }
-    m_DecodeStack[m_StackLen++] = (FX_BYTE)code;
+    m_DecodeStack[m_StackLen++] = (uint8_t)code;
 }
 CPDF_PredictorFilter::CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols)
 {
@@ -461,23 +462,23 @@ CPDF_PredictorFilter::~CPDF_PredictorFilter()
         FX_Free(m_pRefLine);
     }
 }
-static FX_BYTE PaethPredictor(int a, int b, int c)
+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 (FX_BYTE)a;
+        return (uint8_t)a;
     }
     if (pb <= pc) {
-        return (FX_BYTE)b;
+        return (uint8_t)b;
     }
-    return (FX_BYTE)c;
+    return (uint8_t)c;
 }
-static void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, int Bpp)
+static void PNG_PredictorLine(uint8_t* cur_buf, uint8_t* ref_buf, int pitch, int Bpp)
 {
-    FX_BYTE tag = cur_buf[0];
+    uint8_t tag = cur_buf[0];
     if (tag == 0) {
         return;
     }
@@ -486,10 +487,10 @@ static void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, i
         ref_buf ++;
     }
     for (int byte = 0; byte < pitch; byte ++) {
-        FX_BYTE raw_byte = cur_buf[byte];
+        uint8_t raw_byte = cur_buf[byte];
         switch (tag) {
             case 1:    {
-                    FX_BYTE left = 0;
+                    uint8_t left = 0;
                     if (byte >= Bpp) {
                         left = cur_buf[byte - Bpp];
                     }
@@ -497,7 +498,7 @@ static void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, i
                     break;
                 }
             case 2: {
-                    FX_BYTE up = 0;
+                    uint8_t up = 0;
                     if (ref_buf) {
                         up = ref_buf[byte];
                     }
@@ -505,11 +506,11 @@ static void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, i
                     break;
                 }
             case 3: {
-                    FX_BYTE left = 0;
+                    uint8_t left = 0;
                     if (byte >= Bpp) {
                         left = cur_buf[byte - Bpp];
                     }
-                    FX_BYTE up = 0;
+                    uint8_t up = 0;
                     if (ref_buf) {
                         up = ref_buf[byte];
                     }
@@ -517,15 +518,15 @@ static void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, i
                     break;
                 }
             case 4: {
-                    FX_BYTE left = 0;
+                    uint8_t left = 0;
                     if (byte >= Bpp) {
                         left = cur_buf[byte - Bpp];
                     }
-                    FX_BYTE up = 0;
+                    uint8_t up = 0;
                     if (ref_buf) {
                         up = ref_buf[byte];
                     }
-                    FX_BYTE upper_left = 0;
+                    uint8_t upper_left = 0;
                     if (byte >= Bpp && ref_buf) {
                         upper_left = ref_buf[byte - Bpp];
                     }
@@ -535,12 +536,12 @@ static void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, i
         }
     }
 }
-void CPDF_PredictorFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+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(FX_BYTE, m_Pitch);
+        m_pCurLine = FX_Alloc(uint8_t, m_Pitch);
         if (!m_bTiff) {
-            m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);
+            m_pRefLine = FX_Alloc(uint8_t, m_Pitch);
         }
     }
     while (1) {
@@ -548,7 +549,7 @@ void CPDF_PredictorFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX
         if (read_size > src_size) {
             read_size = src_size;
         }
-        FXSYS_memcpy32(m_pCurLine + m_LineInSize, src_buf, read_size);
+        FXSYS_memcpy(m_pCurLine + m_LineInSize, src_buf, read_size);
         m_LineInSize += read_size;
         if (m_LineInSize < m_Pitch) {
             break;
@@ -564,7 +565,7 @@ void CPDF_PredictorFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX
             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;
+            uint8_t* temp = m_pCurLine;
             m_pCurLine = m_pRefLine;
             m_pRefLine = temp;
         }
@@ -576,10 +577,10 @@ CPDF_Ascii85Filter::CPDF_Ascii85Filter()
     m_State = 0;
     m_CharCount = 0;
 }
-void CPDF_Ascii85Filter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+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 ++) {
-        FX_BYTE byte = src_buf[i];
+        uint8_t byte = src_buf[i];
         if (PDF_CharType[byte] == 'W') {
             continue;
         }
@@ -604,7 +605,7 @@ void CPDF_Ascii85Filter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_B
                         m_CharCount ++;
                         if (m_CharCount == 5) {
                             for (int i = 0; i < 4; i ++) {
-                                dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));
+                                dest_buf.AppendByte((uint8_t)(m_CurDWord >> (3 - i) * 8));
                             }
                             m_State = 0;
                         }
@@ -615,7 +616,7 @@ void CPDF_Ascii85Filter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_B
                                 m_CurDWord = m_CurDWord * 85 + 84;
                             }
                             for (i = 0; i < m_CharCount - 1; i ++) {
-                                dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));
+                                dest_buf.AppendByte((uint8_t)(m_CurDWord >> (3 - i) * 8));
                             }
                         }
                         m_State = 2;
@@ -635,10 +636,10 @@ CPDF_AsciiHexFilter::CPDF_AsciiHexFilter()
 {
     m_State = 0;
 }
-void CPDF_AsciiHexFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+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 ++) {
-        FX_BYTE byte = src_buf[i];
+        uint8_t byte = src_buf[i];
         if (PDF_CharType[byte] == 'W') {
             continue;
         }
@@ -670,10 +671,10 @@ 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)
+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 ++) {
-        FX_BYTE byte = src_buf[i];
+        uint8_t byte = src_buf[i];
         switch (m_State) {
             case 0:
                 if (byte < 128) {
@@ -696,7 +697,7 @@ void CPDF_RunLenFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_Bi
                 break;
             case 2:    {
                     dest_buf.AppendBlock(NULL, m_Count);
-                    FXSYS_memset8(dest_buf.GetBuffer() + dest_buf.GetSize() - m_Count, byte, m_Count);
+                    FXSYS_memset(dest_buf.GetBuffer() + dest_buf.GetSize() - m_Count, byte, m_Count);
                     m_State = 0;
                     break;
                 }
@@ -719,12 +720,12 @@ CPDF_JpegFilter::~CPDF_JpegFilter()
         CPDF_ModuleMgr::Get()->GetJpegModule()->Finish(m_pContext);
     }
 }
-void CPDF_JpegFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+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();
     }
-    FX_LPCBYTE jpeg_src_buf;
+    const uint8_t* jpeg_src_buf;
     FX_DWORD jpeg_src_size;
     CFX_BinaryBuf temp_buf;
     if (m_InputBuf.GetSize()) {
@@ -755,7 +756,7 @@ void CPDF_JpegFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_Bina
         m_Pitch = m_Width * m_nComps;
     }
     if (m_pScanline == NULL) {
-        m_pScanline = FX_Alloc(FX_BYTE, m_Pitch + 4);
+        m_pScanline = FX_Alloc(uint8_t, m_Pitch + 4);
     }
     while (1) {
         if (!CPDF_ModuleMgr::Get()->GetJpegModule()->ReadScanline(m_pContext, m_pScanline)) {
@@ -803,17 +804,17 @@ FX_BOOL CPDF_FaxFilter::Initialize(int Encoding, int bEndOfLine, int bByteAlign,
     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_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(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+void CPDF_FaxFilter::v_FilterIn(const uint8_t* src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
 {
-    FX_LPCBYTE fax_src_buf;
+    const uint8_t* fax_src_buf;
     FX_DWORD fax_src_size;
     CFX_BinaryBuf temp_buf;
     int bitpos;
@@ -839,10 +840,10 @@ 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,
+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;
@@ -851,13 +852,13 @@ void CPDF_FaxFilter::ProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bit
             return;
         }
         int start_bitpos = bitpos;
-        FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);
+        FXSYS_memset(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);
+            FXSYS_memcpy(m_pRefBuf, m_pScanlineBuf, m_Pitch);
         }
         if (m_bBlack) {
             for (int i = 0; i < m_Pitch; i ++) {
@@ -872,7 +873,7 @@ void CPDF_FaxFilter::ProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bit
         }
     }
 }
-FX_BOOL CPDF_FaxFilter::ReadLine(FX_LPCBYTE src_buf, int bitsize, int& bitpos)
+FX_BOOL CPDF_FaxFilter::ReadLine(const uint8_t* src_buf, int bitsize, int& bitpos)
 {
     if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) {
         return FALSE;