Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(362)

Side by Side Diff: core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp

Issue 1172793002: Merge to XFA: Use stdint.h types throughout PDFium. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « core/src/fpdfapi/fpdf_parser/filters_int.h ('k') | core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698