| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "../../../include/fpdfapi/fpdf_parser.h" | 7 #include "../../../include/fpdfapi/fpdf_parser.h" |
| 8 #include "../../../include/fpdfapi/fpdf_module.h" | 8 #include "../../../include/fpdfapi/fpdf_module.h" |
| 9 #include "../../../include/fxcodec/fx_codec.h" | 9 #include "../../../include/fxcodec/fx_codec.h" |
| 10 #include <limits.h> | 10 #include <limits.h> |
| 11 #define _STREAM_MAX_SIZE_ 20 * 1024 * 1024 | 11 #define _STREAM_MAX_SIZE_ 20 * 1024 * 1024 |
| 12 FX_DWORD _A85Decode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_b
uf, FX_DWORD& dest_size) | 12 FX_DWORD _A85Decode(const uint8_t* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_b
uf, FX_DWORD& dest_size) |
| 13 { | 13 { |
| 14 dest_size = 0; | 14 dest_size = 0; |
| 15 dest_buf = NULL; | 15 dest_buf = NULL; |
| 16 if (src_size == 0) { | 16 if (src_size == 0) { |
| 17 return 0; | 17 return 0; |
| 18 } | 18 } |
| 19 FX_DWORD zcount = 0; | 19 FX_DWORD zcount = 0; |
| 20 FX_DWORD pos = 0; | 20 FX_DWORD pos = 0; |
| 21 while (pos < src_size) { | 21 while (pos < src_size) { |
| 22 FX_BYTE ch = src_buf[pos]; | 22 uint8_t ch = src_buf[pos]; |
| 23 if (ch < '!' && ch != '\n' && ch != '\r' && ch != ' ' && ch != '\t') { | 23 if (ch < '!' && ch != '\n' && ch != '\r' && ch != ' ' && ch != '\t') { |
| 24 break; | 24 break; |
| 25 } | 25 } |
| 26 if (ch == 'z') { | 26 if (ch == 'z') { |
| 27 zcount ++; | 27 zcount ++; |
| 28 } else if (ch > 'u') { | 28 } else if (ch > 'u') { |
| 29 break; | 29 break; |
| 30 } | 30 } |
| 31 pos ++; | 31 pos ++; |
| 32 } | 32 } |
| 33 if (pos == 0) { | 33 if (pos == 0) { |
| 34 return 0; | 34 return 0; |
| 35 } | 35 } |
| 36 if (zcount > UINT_MAX / 4) { | 36 if (zcount > UINT_MAX / 4) { |
| 37 return (FX_DWORD) - 1; | 37 return (FX_DWORD) - 1; |
| 38 } | 38 } |
| 39 if (zcount * 4 > UINT_MAX - (pos - zcount)) { | 39 if (zcount * 4 > UINT_MAX - (pos - zcount)) { |
| 40 return (FX_DWORD) - 1; | 40 return (FX_DWORD) - 1; |
| 41 } | 41 } |
| 42 dest_buf = FX_Alloc(FX_BYTE, zcount * 4 + (pos - zcount)); | 42 dest_buf = FX_Alloc(uint8_t, zcount * 4 + (pos - zcount)); |
| 43 int state = 0; | 43 int state = 0; |
| 44 FX_UINT32 res = 0; | 44 uint32_t res = 0; |
| 45 pos = dest_size = 0; | 45 pos = dest_size = 0; |
| 46 while (pos < src_size) { | 46 while (pos < src_size) { |
| 47 FX_BYTE ch = src_buf[pos++]; | 47 uint8_t ch = src_buf[pos++]; |
| 48 if (ch == '\n' || ch == '\r' || ch == ' ' || ch == '\t') { | 48 if (ch == '\n' || ch == '\r' || ch == ' ' || ch == '\t') { |
| 49 continue; | 49 continue; |
| 50 } | 50 } |
| 51 if (ch == 'z') { | 51 if (ch == 'z') { |
| 52 FXSYS_memset32(dest_buf + dest_size, 0, 4); | 52 FXSYS_memset32(dest_buf + dest_size, 0, 4); |
| 53 state = 0; | 53 state = 0; |
| 54 res = 0; | 54 res = 0; |
| 55 dest_size += 4; | 55 dest_size += 4; |
| 56 } else { | 56 } else { |
| 57 if (ch < '!' || ch > 'u') { | 57 if (ch < '!' || ch > 'u') { |
| 58 break; | 58 break; |
| 59 } | 59 } |
| 60 res = res * 85 + ch - 33; | 60 res = res * 85 + ch - 33; |
| 61 state ++; | 61 state ++; |
| 62 if (state == 5) { | 62 if (state == 5) { |
| 63 for (int i = 0; i < 4; i ++) { | 63 for (int i = 0; i < 4; i ++) { |
| 64 dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8); | 64 dest_buf[dest_size++] = (uint8_t)(res >> (3 - i) * 8); |
| 65 } | 65 } |
| 66 state = 0; | 66 state = 0; |
| 67 res = 0; | 67 res = 0; |
| 68 } | 68 } |
| 69 } | 69 } |
| 70 } | 70 } |
| 71 if (state) { | 71 if (state) { |
| 72 int i; | 72 int i; |
| 73 for (i = state; i < 5; i ++) { | 73 for (i = state; i < 5; i ++) { |
| 74 res = res * 85 + 84; | 74 res = res * 85 + 84; |
| 75 } | 75 } |
| 76 for (i = 0; i < state - 1; i ++) { | 76 for (i = 0; i < state - 1; i ++) { |
| 77 dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8); | 77 dest_buf[dest_size++] = (uint8_t)(res >> (3 - i) * 8); |
| 78 } | 78 } |
| 79 } | 79 } |
| 80 if (pos < src_size && src_buf[pos] == '>') { | 80 if (pos < src_size && src_buf[pos] == '>') { |
| 81 pos ++; | 81 pos ++; |
| 82 } | 82 } |
| 83 return pos; | 83 return pos; |
| 84 } | 84 } |
| 85 FX_DWORD _HexDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_b
uf, FX_DWORD& dest_size) | 85 FX_DWORD _HexDecode(const uint8_t* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_b
uf, FX_DWORD& dest_size) |
| 86 { | 86 { |
| 87 FX_DWORD i; | 87 FX_DWORD i; |
| 88 for (i = 0; i < src_size; i ++) | 88 for (i = 0; i < src_size; i ++) |
| 89 if (src_buf[i] == '>') { | 89 if (src_buf[i] == '>') { |
| 90 break; | 90 break; |
| 91 } | 91 } |
| 92 dest_buf = FX_Alloc( FX_BYTE, i / 2 + 1); | 92 dest_buf = FX_Alloc( uint8_t, i / 2 + 1); |
| 93 dest_size = 0; | 93 dest_size = 0; |
| 94 FX_BOOL bFirstDigit = TRUE; | 94 FX_BOOL bFirstDigit = TRUE; |
| 95 for (i = 0; i < src_size; i ++) { | 95 for (i = 0; i < src_size; i ++) { |
| 96 FX_BYTE ch = src_buf[i]; | 96 uint8_t ch = src_buf[i]; |
| 97 if (ch == ' ' || ch == '\n' || ch == '\t' || ch == '\r') { | 97 if (ch == ' ' || ch == '\n' || ch == '\t' || ch == '\r') { |
| 98 continue; | 98 continue; |
| 99 } | 99 } |
| 100 int digit; | 100 int digit; |
| 101 if (ch <= '9' && ch >= '0') { | 101 if (ch <= '9' && ch >= '0') { |
| 102 digit = ch - '0'; | 102 digit = ch - '0'; |
| 103 } else if (ch <= 'f' && ch >= 'a') { | 103 } else if (ch <= 'f' && ch >= 'a') { |
| 104 digit = ch - 'a' + 10; | 104 digit = ch - 'a' + 10; |
| 105 } else if (ch <= 'F' && ch >= 'A') { | 105 } else if (ch <= 'F' && ch >= 'A') { |
| 106 digit = ch - 'A' + 10; | 106 digit = ch - 'A' + 10; |
| 107 } else if (ch == '>') { | 107 } else if (ch == '>') { |
| 108 i ++; | 108 i ++; |
| 109 break; | 109 break; |
| 110 } else { | 110 } else { |
| 111 continue; | 111 continue; |
| 112 } | 112 } |
| 113 if (bFirstDigit) { | 113 if (bFirstDigit) { |
| 114 dest_buf[dest_size] = digit * 16; | 114 dest_buf[dest_size] = digit * 16; |
| 115 } else { | 115 } else { |
| 116 dest_buf[dest_size ++] += digit; | 116 dest_buf[dest_size ++] += digit; |
| 117 } | 117 } |
| 118 bFirstDigit = !bFirstDigit; | 118 bFirstDigit = !bFirstDigit; |
| 119 } | 119 } |
| 120 if (!bFirstDigit) { | 120 if (!bFirstDigit) { |
| 121 dest_size ++; | 121 dest_size ++; |
| 122 } | 122 } |
| 123 return i; | 123 return i; |
| 124 } | 124 } |
| 125 FX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& d
est_buf, FX_DWORD& dest_size) | 125 FX_DWORD RunLengthDecode(const uint8_t* src_buf, FX_DWORD src_size, FX_LPBYTE& d
est_buf, FX_DWORD& dest_size) |
| 126 { | 126 { |
| 127 FX_DWORD i = 0; | 127 FX_DWORD i = 0; |
| 128 FX_DWORD old; | 128 FX_DWORD old; |
| 129 dest_size = 0; | 129 dest_size = 0; |
| 130 while (i < src_size) { | 130 while (i < src_size) { |
| 131 if (src_buf[i] < 128) { | 131 if (src_buf[i] < 128) { |
| 132 old = dest_size; | 132 old = dest_size; |
| 133 dest_size += src_buf[i] + 1; | 133 dest_size += src_buf[i] + 1; |
| 134 if (dest_size < old) { | 134 if (dest_size < old) { |
| 135 return (FX_DWORD) - 1; | 135 return (FX_DWORD) - 1; |
| 136 } | 136 } |
| 137 i += src_buf[i] + 2; | 137 i += src_buf[i] + 2; |
| 138 } else if (src_buf[i] > 128) { | 138 } else if (src_buf[i] > 128) { |
| 139 old = dest_size; | 139 old = dest_size; |
| 140 dest_size += 257 - src_buf[i]; | 140 dest_size += 257 - src_buf[i]; |
| 141 if (dest_size < old) { | 141 if (dest_size < old) { |
| 142 return (FX_DWORD) - 1; | 142 return (FX_DWORD) - 1; |
| 143 } | 143 } |
| 144 i += 2; | 144 i += 2; |
| 145 } else { | 145 } else { |
| 146 break; | 146 break; |
| 147 } | 147 } |
| 148 } | 148 } |
| 149 if (dest_size >= _STREAM_MAX_SIZE_) { | 149 if (dest_size >= _STREAM_MAX_SIZE_) { |
| 150 return -1; | 150 return -1; |
| 151 } | 151 } |
| 152 dest_buf = FX_Alloc( FX_BYTE, dest_size); | 152 dest_buf = FX_Alloc( uint8_t, dest_size); |
| 153 i = 0; | 153 i = 0; |
| 154 int dest_count = 0; | 154 int dest_count = 0; |
| 155 while (i < src_size) { | 155 while (i < src_size) { |
| 156 if (src_buf[i] < 128) { | 156 if (src_buf[i] < 128) { |
| 157 FX_DWORD copy_len = src_buf[i] + 1; | 157 FX_DWORD copy_len = src_buf[i] + 1; |
| 158 FX_DWORD buf_left = src_size - i - 1; | 158 FX_DWORD buf_left = src_size - i - 1; |
| 159 if (buf_left < copy_len) { | 159 if (buf_left < copy_len) { |
| 160 FX_DWORD delta = copy_len - buf_left; | 160 FX_DWORD delta = copy_len - buf_left; |
| 161 copy_len = buf_left; | 161 copy_len = buf_left; |
| 162 FXSYS_memset8(dest_buf + dest_count + copy_len, '\0', delta); | 162 FXSYS_memset8(dest_buf + dest_count + copy_len, '\0', delta); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1); | 238 Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1); |
| 239 BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8); | 239 BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8); |
| 240 Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1); | 240 Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1); |
| 241 if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) { | 241 if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) { |
| 242 return NULL; | 242 return NULL; |
| 243 } | 243 } |
| 244 } | 244 } |
| 245 return CPDF_ModuleMgr::Get()->GetFlateModule()->CreateDecoder(src_buf, src_s
ize, width, height, | 245 return CPDF_ModuleMgr::Get()->GetFlateModule()->CreateDecoder(src_buf, src_s
ize, width, height, |
| 246 nComps, bpc, predictor, Colors, BitsPerComponent, Columns); | 246 nComps, bpc, predictor, Colors, BitsPerComponent, Columns); |
| 247 } | 247 } |
| 248 FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD
src_size, CPDF_Dictionary* pParams, | 248 FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const uint8_t* src_buf, FX_DWORD
src_size, CPDF_Dictionary* pParams, |
| 249 FX_DWORD estimated_size, FX_LPBYTE& dest_buf,
FX_DWORD& dest_size) | 249 FX_DWORD estimated_size, FX_LPBYTE& dest_buf,
FX_DWORD& dest_size) |
| 250 { | 250 { |
| 251 int predictor = 0; | 251 int predictor = 0; |
| 252 FX_BOOL bEarlyChange = TRUE; | 252 FX_BOOL bEarlyChange = TRUE; |
| 253 int Colors = 0, BitsPerComponent = 0, Columns = 0; | 253 int Colors = 0, BitsPerComponent = 0, Columns = 0; |
| 254 if (pParams) { | 254 if (pParams) { |
| 255 predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"
)); | 255 predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"
)); |
| 256 bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyCh
ange"), 1); | 256 bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyCh
ange"), 1); |
| 257 Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1); | 257 Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1); |
| 258 BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8); | 258 BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8); |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 } | 461 } |
| 462 | 462 |
| 463 int encLen = len * 2 + 2; | 463 int encLen = len * 2 + 2; |
| 464 | 464 |
| 465 FX_LPBYTE dest_buf2 = (FX_LPBYTE)result.GetBuffer(encLen); | 465 FX_LPBYTE dest_buf2 = (FX_LPBYTE)result.GetBuffer(encLen); |
| 466 dest_buf2[0] = 0xfe; | 466 dest_buf2[0] = 0xfe; |
| 467 dest_buf2[1] = 0xff; | 467 dest_buf2[1] = 0xff; |
| 468 dest_buf2 += 2; | 468 dest_buf2 += 2; |
| 469 for (int i = 0; i < len; i ++) { | 469 for (int i = 0; i < len; i ++) { |
| 470 *dest_buf2++ = pString[i] >> 8; | 470 *dest_buf2++ = pString[i] >> 8; |
| 471 *dest_buf2++ = (FX_BYTE)pString[i]; | 471 *dest_buf2++ = (uint8_t)pString[i]; |
| 472 } | 472 } |
| 473 result.ReleaseBuffer(encLen); | 473 result.ReleaseBuffer(encLen); |
| 474 return result; | 474 return result; |
| 475 } | 475 } |
| 476 CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex) | 476 CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex) |
| 477 { | 477 { |
| 478 CFX_ByteTextBuf result; | 478 CFX_ByteTextBuf result; |
| 479 int srclen = src.GetLength(); | 479 int srclen = src.GetLength(); |
| 480 if (bHex) { | 480 if (bHex) { |
| 481 result.AppendChar('<'); | 481 result.AppendChar('<'); |
| 482 for (int i = 0; i < srclen; i ++) { | 482 for (int i = 0; i < srclen; i ++) { |
| 483 result.AppendChar("0123456789ABCDEF"[src[i] / 16]); | 483 result.AppendChar("0123456789ABCDEF"[src[i] / 16]); |
| 484 result.AppendChar("0123456789ABCDEF"[src[i] % 16]); | 484 result.AppendChar("0123456789ABCDEF"[src[i] % 16]); |
| 485 } | 485 } |
| 486 result.AppendChar('>'); | 486 result.AppendChar('>'); |
| 487 return result.GetByteString(); | 487 return result.GetByteString(); |
| 488 } | 488 } |
| 489 result.AppendChar('('); | 489 result.AppendChar('('); |
| 490 for (int i = 0; i < srclen; i ++) { | 490 for (int i = 0; i < srclen; i ++) { |
| 491 FX_BYTE ch = src[i]; | 491 uint8_t ch = src[i]; |
| 492 if (ch == ')' || ch == '\\' || ch == '(') { | 492 if (ch == ')' || ch == '\\' || ch == '(') { |
| 493 result.AppendChar('\\'); | 493 result.AppendChar('\\'); |
| 494 } else if (ch == 0x0a) { | 494 } else if (ch == 0x0a) { |
| 495 result << FX_BSTRC("\\n"); | 495 result << FX_BSTRC("\\n"); |
| 496 continue; | 496 continue; |
| 497 } else if (ch == 0x0d) { | 497 } else if (ch == 0x0d) { |
| 498 result << FX_BSTRC("\\r"); | 498 result << FX_BSTRC("\\r"); |
| 499 continue; | 499 continue; |
| 500 } | 500 } |
| 501 result.AppendChar(ch); | 501 result.AppendChar(ch); |
| 502 } | 502 } |
| 503 result.AppendChar(')'); | 503 result.AppendChar(')'); |
| 504 return result.GetByteString(); | 504 return result.GetByteString(); |
| 505 } | 505 } |
| 506 void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
FX_DWORD& dest_size) | 506 void FlateEncode(const uint8_t* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
FX_DWORD& dest_size) |
| 507 { | 507 { |
| 508 CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule(); | 508 CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule(); |
| 509 if (pEncoders) { | 509 if (pEncoders) { |
| 510 pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_si
ze); | 510 pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_si
ze); |
| 511 } | 511 } |
| 512 } | 512 } |
| 513 void FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Color
s, int BitsPerComponent, int Columns, | 513 void FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Color
s, int BitsPerComponent, int Columns, |
| 514 FX_LPBYTE& dest_buf, FX_DWORD& dest_size) | 514 FX_LPBYTE& dest_buf, FX_DWORD& dest_size) |
| 515 { | 515 { |
| 516 CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule(); | 516 CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule(); |
| 517 if (pEncoders) { | 517 if (pEncoders) { |
| 518 pEncoders->GetFlateModule()->Encode(src_buf, src_size, predictor, Colors
, BitsPerComponent, Columns, dest_buf, dest_size); | 518 pEncoders->GetFlateModule()->Encode(src_buf, src_size, predictor, Colors
, BitsPerComponent, Columns, dest_buf, dest_size); |
| 519 } | 519 } |
| 520 } | 520 } |
| 521 FX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_
buf, FX_DWORD& dest_size) | 521 FX_DWORD FlateDecode(const uint8_t* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_
buf, FX_DWORD& dest_size) |
| 522 { | 522 { |
| 523 CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule(); | 523 CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule(); |
| 524 if (pEncoders) { | 524 if (pEncoders) { |
| 525 return pEncoders->GetFlateModule()->FlateOrLZWDecode(FALSE, src_buf, src
_size, FALSE, 0, 0, 0, 0, 0, dest_buf, dest_size); | 525 return pEncoders->GetFlateModule()->FlateOrLZWDecode(FALSE, src_buf, src
_size, FALSE, 0, 0, 0, 0, 0, dest_buf, dest_size); |
| 526 } | 526 } |
| 527 return 0; | 527 return 0; |
| 528 } | 528 } |
| OLD | NEW |