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 |