// 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 <limits.h>

#include "core/include/fpdfapi/fpdf_module.h"
#include "core/include/fpdfapi/fpdf_parser.h"
#include "core/include/fxcodec/fx_codec.h"
#include "core/include/fxcrt/fx_ext.h"

#define _STREAM_MAX_SIZE_ 20 * 1024 * 1024

const FX_WORD PDFDocEncoding[256] = {
    0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008,
    0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011,
    0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x02d8, 0x02c7, 0x02c6,
    0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, 0x0020, 0x0021, 0x0022, 0x0023,
    0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x002c,
    0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
    0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e,
    0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
    0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050,
    0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
    0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062,
    0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b,
    0x006c, 0x006d, 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
    0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d,
    0x007e, 0x0000, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192,
    0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018,
    0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, 0x0178,
    0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, 0x20ac, 0x00a1,
    0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa,
    0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3,
    0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc,
    0x00bd, 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5,
    0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
    0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
    0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0,
    0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9,
    0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2,
    0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb,
    0x00fc, 0x00fd, 0x00fe, 0x00ff};

FX_DWORD A85Decode(const uint8_t* src_buf,
                   FX_DWORD src_size,
                   uint8_t*& dest_buf,
                   FX_DWORD& dest_size) {
  dest_size = 0;
  dest_buf = NULL;
  if (src_size == 0) {
    return 0;
  }
  FX_DWORD zcount = 0;
  FX_DWORD pos = 0;
  while (pos < src_size) {
    uint8_t ch = src_buf[pos];
    if (ch < '!' && ch != '\n' && ch != '\r' && ch != ' ' && ch != '\t') {
      break;
    }
    if (ch == 'z') {
      zcount++;
    } else if (ch > 'u') {
      break;
    }
    pos++;
  }
  if (pos == 0) {
    return 0;
  }
  if (zcount > UINT_MAX / 4) {
    return (FX_DWORD)-1;
  }
  if (zcount * 4 > UINT_MAX - (pos - zcount)) {
    return (FX_DWORD)-1;
  }
  dest_buf = FX_Alloc(uint8_t, zcount * 4 + (pos - zcount));
  int state = 0;
  uint32_t res = 0;
  pos = dest_size = 0;
  while (pos < src_size) {
    uint8_t ch = src_buf[pos++];
    if (PDFCharIsLineEnding(ch) || ch == ' ' || ch == '\t')
      continue;

    if (ch == 'z') {
      FXSYS_memset(dest_buf + dest_size, 0, 4);
      state = 0;
      res = 0;
      dest_size += 4;
    } else {
      if (ch < '!' || ch > 'u') {
        break;
      }
      res = res * 85 + ch - 33;
      state++;
      if (state == 5) {
        for (int i = 0; i < 4; i++) {
          dest_buf[dest_size++] = (uint8_t)(res >> (3 - i) * 8);
        }
        state = 0;
        res = 0;
      }
    }
  }
  if (state) {
    int i;
    for (i = state; i < 5; i++) {
      res = res * 85 + 84;
    }
    for (i = 0; i < state - 1; i++) {
      dest_buf[dest_size++] = (uint8_t)(res >> (3 - i) * 8);
    }
  }
  if (pos < src_size && src_buf[pos] == '>') {
    pos++;
  }
  return pos;
}
FX_DWORD HexDecode(const uint8_t* src_buf,
                   FX_DWORD src_size,
                   uint8_t*& dest_buf,
                   FX_DWORD& dest_size) {
  FX_DWORD i;
  for (i = 0; i < src_size; i++)
    if (src_buf[i] == '>') {
      break;
    }
  dest_buf = FX_Alloc(uint8_t, i / 2 + 1);
  dest_size = 0;
  bool bFirst = true;
  for (i = 0; i < src_size; i++) {
    uint8_t ch = src_buf[i];
    if (PDFCharIsLineEnding(ch) || ch == ' ' || ch == '\t')
      continue;

    if (ch == '>') {
      ++i;
      break;
    }
    if (!std::isxdigit(ch))
      continue;

    int digit = FXSYS_toHexDigit(ch);
    if (bFirst)
      dest_buf[dest_size] = digit * 16;
    else
      dest_buf[dest_size++] += digit;

    bFirst = !bFirst;
  }
  if (!bFirst)
    dest_size++;
  return i;
}

FX_DWORD RunLengthDecode(const uint8_t* src_buf,
                         FX_DWORD src_size,
                         uint8_t*& dest_buf,
                         FX_DWORD& dest_size) {
  FX_DWORD i = 0;
  FX_DWORD old;
  dest_size = 0;
  while (i < src_size) {
    if (src_buf[i] < 128) {
      old = dest_size;
      dest_size += src_buf[i] + 1;
      if (dest_size < old) {
        return (FX_DWORD)-1;
      }
      i += src_buf[i] + 2;
    } else if (src_buf[i] > 128) {
      old = dest_size;
      dest_size += 257 - src_buf[i];
      if (dest_size < old) {
        return (FX_DWORD)-1;
      }
      i += 2;
    } else {
      break;
    }
  }
  if (dest_size >= _STREAM_MAX_SIZE_) {
    return -1;
  }
  dest_buf = FX_Alloc(uint8_t, dest_size);
  i = 0;
  int dest_count = 0;
  while (i < src_size) {
    if (src_buf[i] < 128) {
      FX_DWORD copy_len = src_buf[i] + 1;
      FX_DWORD buf_left = src_size - i - 1;
      if (buf_left < copy_len) {
        FX_DWORD delta = copy_len - buf_left;
        copy_len = buf_left;
        FXSYS_memset(dest_buf + dest_count + copy_len, '\0', delta);
      }
      FXSYS_memcpy(dest_buf + dest_count, src_buf + i + 1, copy_len);
      dest_count += src_buf[i] + 1;
      i += src_buf[i] + 2;
    } else if (src_buf[i] > 128) {
      int fill = 0;
      if (i < src_size - 1) {
        fill = src_buf[i + 1];
      }
      FXSYS_memset(dest_buf + dest_count, fill, 257 - src_buf[i]);
      dest_count += 257 - src_buf[i];
      i += 2;
    } else {
      break;
    }
  }
  FX_DWORD ret = i + 1;
  if (ret > src_size) {
    ret = src_size;
  }
  return ret;
}
ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(
    const uint8_t* src_buf,
    FX_DWORD src_size,
    int width,
    int height,
    const CPDF_Dictionary* pParams) {
  int K = 0;
  FX_BOOL EndOfLine = FALSE;
  FX_BOOL ByteAlign = FALSE;
  FX_BOOL BlackIs1 = FALSE;
  int Columns = 1728;
  int Rows = 0;
  if (pParams) {
    K = pParams->GetInteger(FX_BSTRC("K"));
    EndOfLine = pParams->GetInteger(FX_BSTRC("EndOfLine"));
    ByteAlign = pParams->GetInteger(FX_BSTRC("EncodedByteAlign"));
    BlackIs1 = pParams->GetInteger(FX_BSTRC("BlackIs1"));
    Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1728);
    Rows = pParams->GetInteger(FX_BSTRC("Rows"));
    if (Rows > USHRT_MAX) {
      Rows = 0;
    }
    if (Columns <= 0 || Rows < 0 || Columns > USHRT_MAX || Rows > USHRT_MAX) {
      return NULL;
    }
  }
  return CPDF_ModuleMgr::Get()->GetFaxModule()->CreateDecoder(
      src_buf, src_size, width, height, K, EndOfLine, ByteAlign, BlackIs1,
      Columns, Rows);
}
static FX_BOOL CheckFlateDecodeParams(int Colors,
                                      int BitsPerComponent,
                                      int Columns) {
  if (Columns < 0) {
    return FALSE;
  }
  int check = Columns;
  if (Colors < 0 || (check > 0 && Colors > INT_MAX / check)) {
    return FALSE;
  }
  check *= Colors;
  if (BitsPerComponent < 0 ||
      (check > 0 && BitsPerComponent > INT_MAX / check)) {
    return FALSE;
  }
  check *= BitsPerComponent;
  if (check > INT_MAX - 7) {
    return FALSE;
  }
  return TRUE;
}
ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(
    const uint8_t* src_buf,
    FX_DWORD src_size,
    int width,
    int height,
    int nComps,
    int bpc,
    const CPDF_Dictionary* pParams) {
  int predictor = 0;
  int Colors = 0, BitsPerComponent = 0, Columns = 0;
  if (pParams) {
    predictor = pParams->GetInteger(FX_BSTRC("Predictor"));
    Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
    BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
    Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
    if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {
      return NULL;
    }
  }
  return CPDF_ModuleMgr::Get()->GetFlateModule()->CreateDecoder(
      src_buf, src_size, width, height, nComps, bpc, predictor, Colors,
      BitsPerComponent, Columns);
}
FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW,
                                  const uint8_t* src_buf,
                                  FX_DWORD src_size,
                                  CPDF_Dictionary* pParams,
                                  FX_DWORD estimated_size,
                                  uint8_t*& dest_buf,
                                  FX_DWORD& dest_size) {
  int predictor = 0;
  FX_BOOL bEarlyChange = TRUE;
  int Colors = 0, BitsPerComponent = 0, Columns = 0;
  if (pParams) {
    predictor = pParams->GetInteger(FX_BSTRC("Predictor"));
    bEarlyChange = pParams->GetInteger(FX_BSTRC("EarlyChange"), 1);
    Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
    BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
    Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
    if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {
      return (FX_DWORD)-1;
    }
  }
  return CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode(
      bLZW, src_buf, src_size, bEarlyChange, predictor, Colors,
      BitsPerComponent, Columns, estimated_size, dest_buf, dest_size);
}
FX_BOOL PDF_DataDecode(const uint8_t* src_buf,
                       FX_DWORD src_size,
                       const CPDF_Dictionary* pDict,
                       uint8_t*& dest_buf,
                       FX_DWORD& dest_size,
                       CFX_ByteString& ImageEncoding,
                       CPDF_Dictionary*& pImageParms,
                       FX_DWORD last_estimated_size,
                       FX_BOOL bImageAcc)

{
  CPDF_Object* pDecoder =
      pDict ? pDict->GetElementValue(FX_BSTRC("Filter")) : nullptr;
  if (!pDecoder || (!pDecoder->IsArray() && !pDecoder->IsName()))
    return FALSE;

  CPDF_Object* pParams =
      pDict ? pDict->GetElementValue(FX_BSTRC("DecodeParms")) : nullptr;
  CFX_ByteStringArray DecoderList;
  CFX_PtrArray ParamList;
  if (CPDF_Array* pDecoders = pDecoder->AsArray()) {
    CPDF_Array* pParamsArray = ToArray(pParams);
    if (!pParamsArray)
      pParams = nullptr;

    for (FX_DWORD i = 0; i < pDecoders->GetCount(); i++) {
      CFX_ByteStringC str = pDecoders->GetConstString(i);
      DecoderList.Add(str);
      ParamList.Add(pParams ? pParamsArray->GetDict(i) : nullptr);
    }
  } else {
    DecoderList.Add(pDecoder->GetConstString());
    ParamList.Add(pParams ? pParams->GetDict() : nullptr);
  }
  uint8_t* last_buf = (uint8_t*)src_buf;
  FX_DWORD last_size = src_size;
  for (int i = 0; i < DecoderList.GetSize(); i++) {
    int estimated_size =
        i == DecoderList.GetSize() - 1 ? last_estimated_size : 0;
    CFX_ByteString decoder = DecoderList[i];
    // Use ToDictionary here because we can push NULL into the ParamList.
    CPDF_Dictionary* pParam =
        ToDictionary(static_cast<CPDF_Object*>(ParamList[i]));
    uint8_t* new_buf = nullptr;
    FX_DWORD new_size = (FX_DWORD)-1;
    int offset = -1;
    if (decoder == FX_BSTRC("FlateDecode") || decoder == FX_BSTRC("Fl")) {
      if (bImageAcc && i == DecoderList.GetSize() - 1) {
        ImageEncoding = FX_BSTRC("FlateDecode");
        dest_buf = (uint8_t*)last_buf;
        dest_size = last_size;
        pImageParms = pParam;
        return TRUE;
      }
      offset = FPDFAPI_FlateOrLZWDecode(FALSE, last_buf, last_size, pParam,
                                        estimated_size, new_buf, new_size);
    } else if (decoder == FX_BSTRC("LZWDecode") || decoder == FX_BSTRC("LZW")) {
      offset = FPDFAPI_FlateOrLZWDecode(TRUE, last_buf, last_size, pParam,
                                        estimated_size, new_buf, new_size);
    } else if (decoder == FX_BSTRC("ASCII85Decode") ||
               decoder == FX_BSTRC("A85")) {
      offset = A85Decode(last_buf, last_size, new_buf, new_size);
    } else if (decoder == FX_BSTRC("ASCIIHexDecode") ||
               decoder == FX_BSTRC("AHx")) {
      offset = HexDecode(last_buf, last_size, new_buf, new_size);
    } else if (decoder == FX_BSTRC("RunLengthDecode") ||
               decoder == FX_BSTRC("RL")) {
      if (bImageAcc && i == DecoderList.GetSize() - 1) {
        ImageEncoding = FX_BSTRC("RunLengthDecode");
        dest_buf = (uint8_t*)last_buf;
        dest_size = last_size;
        pImageParms = pParam;
        return TRUE;
      }
      offset = RunLengthDecode(last_buf, last_size, new_buf, new_size);
    } else if (decoder == FX_BSTRC("Crypt")) {
      continue;
    } else {
      // If we get here, assume it's an image decoder.
      if (decoder == FX_BSTRC("DCT")) {
        decoder = "DCTDecode";
      } else if (decoder == FX_BSTRC("CCF")) {
        decoder = "CCITTFaxDecode";
      }
      ImageEncoding = decoder;
      pImageParms = pParam;
      dest_buf = (uint8_t*)last_buf;
      dest_size = last_size;
      if (CPDF_Array* pDecoders = pDecoder->AsArray())
        pDecoders->RemoveAt(i + 1, pDecoders->GetCount() - i - 1);
      return TRUE;
    }
    if (last_buf != src_buf) {
      FX_Free(last_buf);
    }
    if (offset == -1) {
      FX_Free(new_buf);
      return FALSE;
    }
    last_buf = new_buf;
    last_size = new_size;
  }
  ImageEncoding = "";
  pImageParms = nullptr;
  dest_buf = last_buf;
  dest_size = last_size;
  return TRUE;
}
CFX_WideString PDF_DecodeText(const uint8_t* src_data,
                              FX_DWORD src_len,
                              CFX_CharMap* pCharMap) {
  CFX_WideString result;
  if (src_len >= 2 && ((src_data[0] == 0xfe && src_data[1] == 0xff) ||
                       (src_data[0] == 0xff && src_data[1] == 0xfe))) {
    FX_BOOL bBE = src_data[0] == 0xfe;
    FX_DWORD max_chars = (src_len - 2) / 2;
    if (!max_chars) {
      return result;
    }
    if (src_data[0] == 0xff) {
      bBE = !src_data[2];
    }
    FX_WCHAR* dest_buf = result.GetBuffer(max_chars);
    const uint8_t* uni_str = src_data + 2;
    int dest_pos = 0;
    for (FX_DWORD i = 0; i < max_chars * 2; i += 2) {
      FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1])
                            : (uni_str[i + 1] << 8 | uni_str[i]);
      if (unicode == 0x1b) {
        i += 2;
        while (i < max_chars * 2) {
          FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1])
                                : (uni_str[i + 1] << 8 | uni_str[i]);
          i += 2;
          if (unicode == 0x1b) {
            break;
          }
        }
      } else {
        dest_buf[dest_pos++] = unicode;
      }
    }
    result.ReleaseBuffer(dest_pos);
  } else if (pCharMap == NULL) {
    FX_WCHAR* dest_buf = result.GetBuffer(src_len);
    for (FX_DWORD i = 0; i < src_len; i++) {
      dest_buf[i] = PDFDocEncoding[src_data[i]];
    }
    result.ReleaseBuffer(src_len);
  } else {
    return (*pCharMap->m_GetWideString)(
        pCharMap, CFX_ByteString((const FX_CHAR*)src_data, src_len));
  }
  return result;
}
CFX_ByteString PDF_EncodeText(const FX_WCHAR* pString,
                              int len,
                              CFX_CharMap* pCharMap) {
  if (len == -1) {
    len = FXSYS_wcslen(pString);
  }
  CFX_ByteString result;
  if (pCharMap == NULL) {
    FX_CHAR* dest_buf1 = result.GetBuffer(len);
    int i;
    for (i = 0; i < len; i++) {
      int code;
      for (code = 0; code < 256; code++)
        if (PDFDocEncoding[code] == pString[i]) {
          break;
        }
      if (code == 256) {
        break;
      }
      dest_buf1[i] = code;
    }
    result.ReleaseBuffer(i);
    if (i == len) {
      return result;
    }
  }

  if (len > INT_MAX / 2 - 1) {
    result.ReleaseBuffer(0);
    return result;
  }

  int encLen = len * 2 + 2;

  uint8_t* dest_buf2 = (uint8_t*)result.GetBuffer(encLen);
  dest_buf2[0] = 0xfe;
  dest_buf2[1] = 0xff;
  dest_buf2 += 2;
  for (int i = 0; i < len; i++) {
    *dest_buf2++ = pString[i] >> 8;
    *dest_buf2++ = (uint8_t)pString[i];
  }
  result.ReleaseBuffer(encLen);
  return result;
}
CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex) {
  CFX_ByteTextBuf result;
  int srclen = src.GetLength();
  if (bHex) {
    result.AppendChar('<');
    for (int i = 0; i < srclen; i++) {
      result.AppendChar("0123456789ABCDEF"[src[i] / 16]);
      result.AppendChar("0123456789ABCDEF"[src[i] % 16]);
    }
    result.AppendChar('>');
    return result.GetByteString();
  }
  result.AppendChar('(');
  for (int i = 0; i < srclen; i++) {
    uint8_t ch = src[i];
    if (ch == ')' || ch == '\\' || ch == '(') {
      result.AppendChar('\\');
    } else if (ch == 0x0a) {
      result << FX_BSTRC("\\n");
      continue;
    } else if (ch == 0x0d) {
      result << FX_BSTRC("\\r");
      continue;
    }
    result.AppendChar(ch);
  }
  result.AppendChar(')');
  return result.GetByteString();
}
void FlateEncode(const uint8_t* src_buf,
                 FX_DWORD src_size,
                 uint8_t*& dest_buf,
                 FX_DWORD& dest_size) {
  CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
  if (pEncoders) {
    pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size);
  }
}
void FlateEncode(const uint8_t* src_buf,
                 FX_DWORD src_size,
                 int predictor,
                 int Colors,
                 int BitsPerComponent,
                 int Columns,
                 uint8_t*& dest_buf,
                 FX_DWORD& dest_size) {
  CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
  if (pEncoders) {
    pEncoders->GetFlateModule()->Encode(src_buf, src_size, predictor, Colors,
                                        BitsPerComponent, Columns, dest_buf,
                                        dest_size);
  }
}
FX_DWORD FlateDecode(const uint8_t* src_buf,
                     FX_DWORD src_size,
                     uint8_t*& dest_buf,
                     FX_DWORD& dest_size) {
  CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
  if (pEncoders) {
    return pEncoders->GetFlateModule()->FlateOrLZWDecode(
        FALSE, src_buf, src_size, FALSE, 0, 0, 0, 0, 0, dest_buf, dest_size);
  }
  return 0;
}
