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

Side by Side Diff: core/fpdfapi/fpdf_parser/cpdf_hint_tables.cpp

Issue 1832173003: Remove FX_DWORD from core/ and delete definition (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 8 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 2016 PDFium Authors. All rights reserved. 1 // Copyright 2016 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 "core/fpdfapi/fpdf_parser/cpdf_hint_tables.h" 7 #include "core/fpdfapi/fpdf_parser/cpdf_hint_tables.h"
8 8
9 #include "core/fpdfapi/fpdf_parser/cpdf_data_avail.h" 9 #include "core/fpdfapi/fpdf_parser/cpdf_data_avail.h"
10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
(...skipping 12 matching lines...) Expand all
23 23
24 } // namespace 24 } // namespace
25 25
26 CPDF_HintTables::~CPDF_HintTables() { 26 CPDF_HintTables::~CPDF_HintTables() {
27 m_dwDeltaNObjsArray.RemoveAll(); 27 m_dwDeltaNObjsArray.RemoveAll();
28 m_dwNSharedObjsArray.RemoveAll(); 28 m_dwNSharedObjsArray.RemoveAll();
29 m_dwSharedObjNumArray.RemoveAll(); 29 m_dwSharedObjNumArray.RemoveAll();
30 m_dwIdentifierArray.RemoveAll(); 30 m_dwIdentifierArray.RemoveAll();
31 } 31 }
32 32
33 FX_DWORD CPDF_HintTables::GetItemLength( 33 uint32_t CPDF_HintTables::GetItemLength(
34 int index, 34 int index,
35 const std::vector<FX_FILESIZE>& szArray) { 35 const std::vector<FX_FILESIZE>& szArray) {
36 if (index < 0 || szArray.size() < 2 || 36 if (index < 0 || szArray.size() < 2 ||
37 static_cast<size_t>(index) > szArray.size() - 2 || 37 static_cast<size_t>(index) > szArray.size() - 2 ||
38 szArray[index] > szArray[index + 1]) { 38 szArray[index] > szArray[index + 1]) {
39 return 0; 39 return 0;
40 } 40 }
41 return szArray[index + 1] - szArray[index]; 41 return szArray[index + 1] - szArray[index];
42 } 42 }
43 43
44 FX_BOOL CPDF_HintTables::ReadPageHintTable(CFX_BitStream* hStream) { 44 FX_BOOL CPDF_HintTables::ReadPageHintTable(CFX_BitStream* hStream) {
45 if (!hStream || hStream->IsEOF()) 45 if (!hStream || hStream->IsEOF())
46 return FALSE; 46 return FALSE;
47 47
48 int nStreamOffset = ReadPrimaryHintStreamOffset(); 48 int nStreamOffset = ReadPrimaryHintStreamOffset();
49 int nStreamLen = ReadPrimaryHintStreamLength(); 49 int nStreamLen = ReadPrimaryHintStreamLength();
50 if (nStreamOffset < 0 || nStreamLen < 1) 50 if (nStreamOffset < 0 || nStreamLen < 1)
51 return FALSE; 51 return FALSE;
52 52
53 const FX_DWORD kHeaderSize = 288; 53 const uint32_t kHeaderSize = 288;
54 if (hStream->BitsRemaining() < kHeaderSize) 54 if (hStream->BitsRemaining() < kHeaderSize)
55 return FALSE; 55 return FALSE;
56 56
57 // Item 1: The least number of objects in a page. 57 // Item 1: The least number of objects in a page.
58 FX_DWORD dwObjLeastNum = hStream->GetBits(32); 58 uint32_t dwObjLeastNum = hStream->GetBits(32);
59 59
60 // Item 2: The location of the first page's page object. 60 // Item 2: The location of the first page's page object.
61 FX_DWORD dwFirstObjLoc = hStream->GetBits(32); 61 uint32_t dwFirstObjLoc = hStream->GetBits(32);
62 if (dwFirstObjLoc > nStreamOffset) { 62 if (dwFirstObjLoc > nStreamOffset) {
63 FX_SAFE_DWORD safeLoc = pdfium::base::checked_cast<FX_DWORD>(nStreamLen); 63 FX_SAFE_DWORD safeLoc = pdfium::base::checked_cast<uint32_t>(nStreamLen);
64 safeLoc += dwFirstObjLoc; 64 safeLoc += dwFirstObjLoc;
65 if (!safeLoc.IsValid()) 65 if (!safeLoc.IsValid())
66 return FALSE; 66 return FALSE;
67 m_szFirstPageObjOffset = 67 m_szFirstPageObjOffset =
68 pdfium::base::checked_cast<FX_FILESIZE>(safeLoc.ValueOrDie()); 68 pdfium::base::checked_cast<FX_FILESIZE>(safeLoc.ValueOrDie());
69 } else { 69 } else {
70 m_szFirstPageObjOffset = 70 m_szFirstPageObjOffset =
71 pdfium::base::checked_cast<FX_FILESIZE>(dwFirstObjLoc); 71 pdfium::base::checked_cast<FX_FILESIZE>(dwFirstObjLoc);
72 } 72 }
73 73
74 // Item 3: The number of bits needed to represent the difference 74 // Item 3: The number of bits needed to represent the difference
75 // between the greatest and least number of objects in a page. 75 // between the greatest and least number of objects in a page.
76 FX_DWORD dwDeltaObjectsBits = hStream->GetBits(16); 76 uint32_t dwDeltaObjectsBits = hStream->GetBits(16);
77 77
78 // Item 4: The least length of a page in bytes. 78 // Item 4: The least length of a page in bytes.
79 FX_DWORD dwPageLeastLen = hStream->GetBits(32); 79 uint32_t dwPageLeastLen = hStream->GetBits(32);
80 80
81 // Item 5: The number of bits needed to represent the difference 81 // Item 5: The number of bits needed to represent the difference
82 // between the greatest and least length of a page, in bytes. 82 // between the greatest and least length of a page, in bytes.
83 FX_DWORD dwDeltaPageLenBits = hStream->GetBits(16); 83 uint32_t dwDeltaPageLenBits = hStream->GetBits(16);
84 84
85 // Skip Item 6, 7, 8, 9 total 96 bits. 85 // Skip Item 6, 7, 8, 9 total 96 bits.
86 hStream->SkipBits(96); 86 hStream->SkipBits(96);
87 87
88 // Item 10: The number of bits needed to represent the greatest 88 // Item 10: The number of bits needed to represent the greatest
89 // number of shared object references. 89 // number of shared object references.
90 FX_DWORD dwSharedObjBits = hStream->GetBits(16); 90 uint32_t dwSharedObjBits = hStream->GetBits(16);
91 91
92 // Item 11: The number of bits needed to represent the numerically 92 // Item 11: The number of bits needed to represent the numerically
93 // greatest shared object identifier used by the pages. 93 // greatest shared object identifier used by the pages.
94 FX_DWORD dwSharedIdBits = hStream->GetBits(16); 94 uint32_t dwSharedIdBits = hStream->GetBits(16);
95 95
96 // Item 12: The number of bits needed to represent the numerator of 96 // Item 12: The number of bits needed to represent the numerator of
97 // the fractional position for each shared object reference. For each 97 // the fractional position for each shared object reference. For each
98 // shared object referenced from a page, there is an indication of 98 // shared object referenced from a page, there is an indication of
99 // where in the page's content stream the object is first referenced. 99 // where in the page's content stream the object is first referenced.
100 FX_DWORD dwSharedNumeratorBits = hStream->GetBits(16); 100 uint32_t dwSharedNumeratorBits = hStream->GetBits(16);
101 101
102 // Item 13: Skip Item 13 which has 16 bits. 102 // Item 13: Skip Item 13 which has 16 bits.
103 hStream->SkipBits(16); 103 hStream->SkipBits(16);
104 104
105 CPDF_Object* pPageNum = m_pLinearizedDict->GetElementValue("N"); 105 CPDF_Object* pPageNum = m_pLinearizedDict->GetElementValue("N");
106 int nPages = pPageNum ? pPageNum->GetInteger() : 0; 106 int nPages = pPageNum ? pPageNum->GetInteger() : 0;
107 if (nPages < 1) 107 if (nPages < 1)
108 return FALSE; 108 return FALSE;
109 109
110 FX_SAFE_DWORD required_bits = dwDeltaObjectsBits; 110 FX_SAFE_DWORD required_bits = dwDeltaObjectsBits;
111 required_bits *= pdfium::base::checked_cast<FX_DWORD>(nPages); 111 required_bits *= pdfium::base::checked_cast<uint32_t>(nPages);
112 if (!CanReadFromBitStream(hStream, required_bits)) 112 if (!CanReadFromBitStream(hStream, required_bits))
113 return FALSE; 113 return FALSE;
114 114
115 for (int i = 0; i < nPages; ++i) { 115 for (int i = 0; i < nPages; ++i) {
116 FX_SAFE_DWORD safeDeltaObj = hStream->GetBits(dwDeltaObjectsBits); 116 FX_SAFE_DWORD safeDeltaObj = hStream->GetBits(dwDeltaObjectsBits);
117 safeDeltaObj += dwObjLeastNum; 117 safeDeltaObj += dwObjLeastNum;
118 if (!safeDeltaObj.IsValid()) 118 if (!safeDeltaObj.IsValid())
119 return FALSE; 119 return FALSE;
120 m_dwDeltaNObjsArray.Add(safeDeltaObj.ValueOrDie()); 120 m_dwDeltaNObjsArray.Add(safeDeltaObj.ValueOrDie());
121 } 121 }
122 hStream->ByteAlign(); 122 hStream->ByteAlign();
123 123
124 required_bits = dwDeltaPageLenBits; 124 required_bits = dwDeltaPageLenBits;
125 required_bits *= pdfium::base::checked_cast<FX_DWORD>(nPages); 125 required_bits *= pdfium::base::checked_cast<uint32_t>(nPages);
126 if (!CanReadFromBitStream(hStream, required_bits)) 126 if (!CanReadFromBitStream(hStream, required_bits))
127 return FALSE; 127 return FALSE;
128 128
129 CFX_ArrayTemplate<FX_DWORD> dwPageLenArray; 129 CFX_ArrayTemplate<uint32_t> dwPageLenArray;
130 for (int i = 0; i < nPages; ++i) { 130 for (int i = 0; i < nPages; ++i) {
131 FX_SAFE_DWORD safePageLen = hStream->GetBits(dwDeltaPageLenBits); 131 FX_SAFE_DWORD safePageLen = hStream->GetBits(dwDeltaPageLenBits);
132 safePageLen += dwPageLeastLen; 132 safePageLen += dwPageLeastLen;
133 if (!safePageLen.IsValid()) 133 if (!safePageLen.IsValid())
134 return FALSE; 134 return FALSE;
135 dwPageLenArray.Add(safePageLen.ValueOrDie()); 135 dwPageLenArray.Add(safePageLen.ValueOrDie());
136 } 136 }
137 137
138 CPDF_Object* pOffsetE = m_pLinearizedDict->GetElementValue("E"); 138 CPDF_Object* pOffsetE = m_pLinearizedDict->GetElementValue("E");
139 int nOffsetE = pOffsetE ? pOffsetE->GetInteger() : -1; 139 int nOffsetE = pOffsetE ? pOffsetE->GetInteger() : -1;
(...skipping 23 matching lines...) Expand all
163 } 163 }
164 164
165 if (nPages > 0) { 165 if (nPages > 0) {
166 m_szPageOffsetArray.push_back(m_szPageOffsetArray[nPages - 1] + 166 m_szPageOffsetArray.push_back(m_szPageOffsetArray[nPages - 1] +
167 dwPageLenArray[nPages - 1]); 167 dwPageLenArray[nPages - 1]);
168 } 168 }
169 hStream->ByteAlign(); 169 hStream->ByteAlign();
170 170
171 // Number of shared objects. 171 // Number of shared objects.
172 required_bits = dwSharedObjBits; 172 required_bits = dwSharedObjBits;
173 required_bits *= pdfium::base::checked_cast<FX_DWORD>(nPages); 173 required_bits *= pdfium::base::checked_cast<uint32_t>(nPages);
174 if (!CanReadFromBitStream(hStream, required_bits)) 174 if (!CanReadFromBitStream(hStream, required_bits))
175 return FALSE; 175 return FALSE;
176 176
177 for (int i = 0; i < nPages; i++) 177 for (int i = 0; i < nPages; i++)
178 m_dwNSharedObjsArray.Add(hStream->GetBits(dwSharedObjBits)); 178 m_dwNSharedObjsArray.Add(hStream->GetBits(dwSharedObjBits));
179 hStream->ByteAlign(); 179 hStream->ByteAlign();
180 180
181 // Array of identifiers, size = nshared_objects. 181 // Array of identifiers, size = nshared_objects.
182 for (int i = 0; i < nPages; i++) { 182 for (int i = 0; i < nPages; i++) {
183 required_bits = dwSharedIdBits; 183 required_bits = dwSharedIdBits;
184 required_bits *= m_dwNSharedObjsArray[i]; 184 required_bits *= m_dwNSharedObjsArray[i];
185 if (!CanReadFromBitStream(hStream, required_bits)) 185 if (!CanReadFromBitStream(hStream, required_bits))
186 return FALSE; 186 return FALSE;
187 187
188 for (int j = 0; j < m_dwNSharedObjsArray[i]; j++) 188 for (int j = 0; j < m_dwNSharedObjsArray[i]; j++)
189 m_dwIdentifierArray.Add(hStream->GetBits(dwSharedIdBits)); 189 m_dwIdentifierArray.Add(hStream->GetBits(dwSharedIdBits));
190 } 190 }
191 hStream->ByteAlign(); 191 hStream->ByteAlign();
192 192
193 for (int i = 0; i < nPages; i++) { 193 for (int i = 0; i < nPages; i++) {
194 FX_SAFE_DWORD safeSize = m_dwNSharedObjsArray[i]; 194 FX_SAFE_DWORD safeSize = m_dwNSharedObjsArray[i];
195 safeSize *= dwSharedNumeratorBits; 195 safeSize *= dwSharedNumeratorBits;
196 if (!CanReadFromBitStream(hStream, safeSize)) 196 if (!CanReadFromBitStream(hStream, safeSize))
197 return FALSE; 197 return FALSE;
198 198
199 hStream->SkipBits(safeSize.ValueOrDie()); 199 hStream->SkipBits(safeSize.ValueOrDie());
200 } 200 }
201 hStream->ByteAlign(); 201 hStream->ByteAlign();
202 202
203 FX_SAFE_DWORD safeTotalPageLen = pdfium::base::checked_cast<FX_DWORD>(nPages); 203 FX_SAFE_DWORD safeTotalPageLen = pdfium::base::checked_cast<uint32_t>(nPages);
204 safeTotalPageLen *= dwDeltaPageLenBits; 204 safeTotalPageLen *= dwDeltaPageLenBits;
205 if (!CanReadFromBitStream(hStream, safeTotalPageLen)) 205 if (!CanReadFromBitStream(hStream, safeTotalPageLen))
206 return FALSE; 206 return FALSE;
207 207
208 hStream->SkipBits(safeTotalPageLen.ValueOrDie()); 208 hStream->SkipBits(safeTotalPageLen.ValueOrDie());
209 hStream->ByteAlign(); 209 hStream->ByteAlign();
210 return TRUE; 210 return TRUE;
211 } 211 }
212 212
213 FX_BOOL CPDF_HintTables::ReadSharedObjHintTable(CFX_BitStream* hStream, 213 FX_BOOL CPDF_HintTables::ReadSharedObjHintTable(CFX_BitStream* hStream,
214 FX_DWORD offset) { 214 uint32_t offset) {
215 if (!hStream || hStream->IsEOF()) 215 if (!hStream || hStream->IsEOF())
216 return FALSE; 216 return FALSE;
217 217
218 int nStreamOffset = ReadPrimaryHintStreamOffset(); 218 int nStreamOffset = ReadPrimaryHintStreamOffset();
219 int nStreamLen = ReadPrimaryHintStreamLength(); 219 int nStreamLen = ReadPrimaryHintStreamLength();
220 if (nStreamOffset < 0 || nStreamLen < 1) 220 if (nStreamOffset < 0 || nStreamLen < 1)
221 return FALSE; 221 return FALSE;
222 222
223 FX_SAFE_DWORD bit_offset = offset; 223 FX_SAFE_DWORD bit_offset = offset;
224 bit_offset *= 8; 224 bit_offset *= 8;
225 if (!bit_offset.IsValid() || hStream->GetPos() > bit_offset.ValueOrDie()) 225 if (!bit_offset.IsValid() || hStream->GetPos() > bit_offset.ValueOrDie())
226 return FALSE; 226 return FALSE;
227 hStream->SkipBits(bit_offset.ValueOrDie() - hStream->GetPos()); 227 hStream->SkipBits(bit_offset.ValueOrDie() - hStream->GetPos());
228 228
229 const FX_DWORD kHeaderSize = 192; 229 const uint32_t kHeaderSize = 192;
230 if (hStream->BitsRemaining() < kHeaderSize) 230 if (hStream->BitsRemaining() < kHeaderSize)
231 return FALSE; 231 return FALSE;
232 232
233 // Item 1: The object number of the first object in the shared objects 233 // Item 1: The object number of the first object in the shared objects
234 // section. 234 // section.
235 FX_DWORD dwFirstSharedObjNum = hStream->GetBits(32); 235 uint32_t dwFirstSharedObjNum = hStream->GetBits(32);
236 236
237 // Item 2: The location of the first object in the shared objects section. 237 // Item 2: The location of the first object in the shared objects section.
238 FX_DWORD dwFirstSharedObjLoc = hStream->GetBits(32); 238 uint32_t dwFirstSharedObjLoc = hStream->GetBits(32);
239 if (dwFirstSharedObjLoc > nStreamOffset) 239 if (dwFirstSharedObjLoc > nStreamOffset)
240 dwFirstSharedObjLoc += nStreamLen; 240 dwFirstSharedObjLoc += nStreamLen;
241 241
242 // Item 3: The number of shared object entries for the first page. 242 // Item 3: The number of shared object entries for the first page.
243 m_nFirstPageSharedObjs = hStream->GetBits(32); 243 m_nFirstPageSharedObjs = hStream->GetBits(32);
244 244
245 // Item 4: The number of shared object entries for the shared objects 245 // Item 4: The number of shared object entries for the shared objects
246 // section, including the number of shared object entries for the first page. 246 // section, including the number of shared object entries for the first page.
247 FX_DWORD dwSharedObjTotal = hStream->GetBits(32); 247 uint32_t dwSharedObjTotal = hStream->GetBits(32);
248 248
249 // Item 5: The number of bits needed to represent the greatest number of 249 // Item 5: The number of bits needed to represent the greatest number of
250 // objects in a shared object group. Skipped. 250 // objects in a shared object group. Skipped.
251 hStream->SkipBits(16); 251 hStream->SkipBits(16);
252 252
253 // Item 6: The least length of a shared object group in bytes. 253 // Item 6: The least length of a shared object group in bytes.
254 FX_DWORD dwGroupLeastLen = hStream->GetBits(32); 254 uint32_t dwGroupLeastLen = hStream->GetBits(32);
255 255
256 // Item 7: The number of bits needed to represent the difference between the 256 // Item 7: The number of bits needed to represent the difference between the
257 // greatest and least length of a shared object group, in bytes. 257 // greatest and least length of a shared object group, in bytes.
258 FX_DWORD dwDeltaGroupLen = hStream->GetBits(16); 258 uint32_t dwDeltaGroupLen = hStream->GetBits(16);
259 CPDF_Object* pFirstPageObj = m_pLinearizedDict->GetElementValue("O"); 259 CPDF_Object* pFirstPageObj = m_pLinearizedDict->GetElementValue("O");
260 int nFirstPageObjNum = pFirstPageObj ? pFirstPageObj->GetInteger() : -1; 260 int nFirstPageObjNum = pFirstPageObj ? pFirstPageObj->GetInteger() : -1;
261 if (nFirstPageObjNum < 0) 261 if (nFirstPageObjNum < 0)
262 return FALSE; 262 return FALSE;
263 263
264 FX_DWORD dwPrevObjLen = 0; 264 uint32_t dwPrevObjLen = 0;
265 FX_DWORD dwCurObjLen = 0; 265 uint32_t dwCurObjLen = 0;
266 FX_SAFE_DWORD required_bits = dwSharedObjTotal; 266 FX_SAFE_DWORD required_bits = dwSharedObjTotal;
267 required_bits *= dwDeltaGroupLen; 267 required_bits *= dwDeltaGroupLen;
268 if (!CanReadFromBitStream(hStream, required_bits)) 268 if (!CanReadFromBitStream(hStream, required_bits))
269 return FALSE; 269 return FALSE;
270 270
271 for (FX_DWORD i = 0; i < dwSharedObjTotal; ++i) { 271 for (uint32_t i = 0; i < dwSharedObjTotal; ++i) {
272 dwPrevObjLen = dwCurObjLen; 272 dwPrevObjLen = dwCurObjLen;
273 FX_SAFE_DWORD safeObjLen = hStream->GetBits(dwDeltaGroupLen); 273 FX_SAFE_DWORD safeObjLen = hStream->GetBits(dwDeltaGroupLen);
274 safeObjLen += dwGroupLeastLen; 274 safeObjLen += dwGroupLeastLen;
275 if (!safeObjLen.IsValid()) 275 if (!safeObjLen.IsValid())
276 return FALSE; 276 return FALSE;
277 277
278 dwCurObjLen = safeObjLen.ValueOrDie(); 278 dwCurObjLen = safeObjLen.ValueOrDie();
279 if (i < m_nFirstPageSharedObjs) { 279 if (i < m_nFirstPageSharedObjs) {
280 m_dwSharedObjNumArray.Add(nFirstPageObjNum + i); 280 m_dwSharedObjNumArray.Add(nFirstPageObjNum + i);
281 if (i == 0) 281 if (i == 0)
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 return FALSE; 317 return FALSE;
318 318
319 hStream->SkipBits(dwSharedObjTotal); 319 hStream->SkipBits(dwSharedObjTotal);
320 hStream->ByteAlign(); 320 hStream->ByteAlign();
321 return TRUE; 321 return TRUE;
322 } 322 }
323 323
324 FX_BOOL CPDF_HintTables::GetPagePos(int index, 324 FX_BOOL CPDF_HintTables::GetPagePos(int index,
325 FX_FILESIZE& szPageStartPos, 325 FX_FILESIZE& szPageStartPos,
326 FX_FILESIZE& szPageLength, 326 FX_FILESIZE& szPageLength,
327 FX_DWORD& dwObjNum) { 327 uint32_t& dwObjNum) {
328 if (!m_pLinearizedDict) 328 if (!m_pLinearizedDict)
329 return FALSE; 329 return FALSE;
330 330
331 szPageStartPos = m_szPageOffsetArray[index]; 331 szPageStartPos = m_szPageOffsetArray[index];
332 szPageLength = GetItemLength(index, m_szPageOffsetArray); 332 szPageLength = GetItemLength(index, m_szPageOffsetArray);
333 333
334 CPDF_Object* pFirstPageNum = m_pLinearizedDict->GetElementValue("P"); 334 CPDF_Object* pFirstPageNum = m_pLinearizedDict->GetElementValue("P");
335 int nFirstPageNum = pFirstPageNum ? pFirstPageNum->GetInteger() : 0; 335 int nFirstPageNum = pFirstPageNum ? pFirstPageNum->GetInteger() : 0;
336 336
337 CPDF_Object* pFirstPageObjNum = m_pLinearizedDict->GetElementValue("O"); 337 CPDF_Object* pFirstPageObjNum = m_pLinearizedDict->GetElementValue("O");
(...skipping 20 matching lines...) Expand all
358 int index, 358 int index,
359 IPDF_DataAvail::DownloadHints* pHints) { 359 IPDF_DataAvail::DownloadHints* pHints) {
360 if (!m_pLinearizedDict || !pHints) 360 if (!m_pLinearizedDict || !pHints)
361 return IPDF_DataAvail::DataError; 361 return IPDF_DataAvail::DataError;
362 362
363 CPDF_Object* pFirstAvailPage = m_pLinearizedDict->GetElementValue("P"); 363 CPDF_Object* pFirstAvailPage = m_pLinearizedDict->GetElementValue("P");
364 int nFirstAvailPage = pFirstAvailPage ? pFirstAvailPage->GetInteger() : 0; 364 int nFirstAvailPage = pFirstAvailPage ? pFirstAvailPage->GetInteger() : 0;
365 if (index == nFirstAvailPage) 365 if (index == nFirstAvailPage)
366 return IPDF_DataAvail::DataAvailable; 366 return IPDF_DataAvail::DataAvailable;
367 367
368 FX_DWORD dwLength = GetItemLength(index, m_szPageOffsetArray); 368 uint32_t dwLength = GetItemLength(index, m_szPageOffsetArray);
369 // If two pages have the same offset, it should be treated as an error. 369 // If two pages have the same offset, it should be treated as an error.
370 if (!dwLength) 370 if (!dwLength)
371 return IPDF_DataAvail::DataError; 371 return IPDF_DataAvail::DataError;
372 372
373 if (!m_pDataAvail->IsDataAvail(m_szPageOffsetArray[index], dwLength, pHints)) 373 if (!m_pDataAvail->IsDataAvail(m_szPageOffsetArray[index], dwLength, pHints))
374 return IPDF_DataAvail::DataNotAvailable; 374 return IPDF_DataAvail::DataNotAvailable;
375 375
376 // Download data of shared objects in the page. 376 // Download data of shared objects in the page.
377 FX_DWORD offset = 0; 377 uint32_t offset = 0;
378 for (int i = 0; i < index; ++i) 378 for (int i = 0; i < index; ++i)
379 offset += m_dwNSharedObjsArray[i]; 379 offset += m_dwNSharedObjsArray[i];
380 380
381 CPDF_Object* pFirstPageObj = m_pLinearizedDict->GetElementValue("O"); 381 CPDF_Object* pFirstPageObj = m_pLinearizedDict->GetElementValue("O");
382 int nFirstPageObjNum = pFirstPageObj ? pFirstPageObj->GetInteger() : -1; 382 int nFirstPageObjNum = pFirstPageObj ? pFirstPageObj->GetInteger() : -1;
383 if (nFirstPageObjNum < 0) 383 if (nFirstPageObjNum < 0)
384 return IPDF_DataAvail::DataError; 384 return IPDF_DataAvail::DataError;
385 385
386 FX_DWORD dwIndex = 0; 386 uint32_t dwIndex = 0;
387 FX_DWORD dwObjNum = 0; 387 uint32_t dwObjNum = 0;
388 for (int j = 0; j < m_dwNSharedObjsArray[index]; ++j) { 388 for (int j = 0; j < m_dwNSharedObjsArray[index]; ++j) {
389 dwIndex = m_dwIdentifierArray[offset + j]; 389 dwIndex = m_dwIdentifierArray[offset + j];
390 if (dwIndex >= m_dwSharedObjNumArray.GetSize()) 390 if (dwIndex >= m_dwSharedObjNumArray.GetSize())
391 return IPDF_DataAvail::DataNotAvailable; 391 return IPDF_DataAvail::DataNotAvailable;
392 392
393 dwObjNum = m_dwSharedObjNumArray[dwIndex]; 393 dwObjNum = m_dwSharedObjNumArray[dwIndex];
394 if (dwObjNum >= nFirstPageObjNum && 394 if (dwObjNum >= nFirstPageObjNum &&
395 dwObjNum < nFirstPageObjNum + m_nFirstPageSharedObjs) { 395 dwObjNum < nFirstPageObjNum + m_nFirstPageSharedObjs) {
396 continue; 396 continue;
397 } 397 }
(...skipping 17 matching lines...) Expand all
415 415
416 CPDF_Dictionary* pDict = pHintStream->GetDict(); 416 CPDF_Dictionary* pDict = pHintStream->GetDict();
417 CPDF_Object* pOffset = pDict ? pDict->GetElement("S") : nullptr; 417 CPDF_Object* pOffset = pDict ? pDict->GetElement("S") : nullptr;
418 if (!pOffset || !pOffset->IsNumber()) 418 if (!pOffset || !pOffset->IsNumber())
419 return FALSE; 419 return FALSE;
420 420
421 int shared_hint_table_offset = pOffset->GetInteger(); 421 int shared_hint_table_offset = pOffset->GetInteger();
422 CPDF_StreamAcc acc; 422 CPDF_StreamAcc acc;
423 acc.LoadAllData(pHintStream); 423 acc.LoadAllData(pHintStream);
424 424
425 FX_DWORD size = acc.GetSize(); 425 uint32_t size = acc.GetSize();
426 // The header section of page offset hint table is 36 bytes. 426 // The header section of page offset hint table is 36 bytes.
427 // The header section of shared object hint table is 24 bytes. 427 // The header section of shared object hint table is 24 bytes.
428 // Hint table has at least 60 bytes. 428 // Hint table has at least 60 bytes.
429 const FX_DWORD MIN_STREAM_LEN = 60; 429 const uint32_t MIN_STREAM_LEN = 60;
430 if (size < MIN_STREAM_LEN || shared_hint_table_offset <= 0 || 430 if (size < MIN_STREAM_LEN || shared_hint_table_offset <= 0 ||
431 size < shared_hint_table_offset) { 431 size < shared_hint_table_offset) {
432 return FALSE; 432 return FALSE;
433 } 433 }
434 434
435 CFX_BitStream bs; 435 CFX_BitStream bs;
436 bs.Init(acc.GetData(), size); 436 bs.Init(acc.GetData(), size);
437 return ReadPageHintTable(&bs) && 437 return ReadPageHintTable(&bs) &&
438 ReadSharedObjHintTable(&bs, pdfium::base::checked_cast<FX_DWORD>( 438 ReadSharedObjHintTable(&bs, pdfium::base::checked_cast<uint32_t>(
439 shared_hint_table_offset)); 439 shared_hint_table_offset));
440 } 440 }
441 441
442 int CPDF_HintTables::ReadPrimaryHintStreamOffset() const { 442 int CPDF_HintTables::ReadPrimaryHintStreamOffset() const {
443 if (!m_pLinearizedDict) 443 if (!m_pLinearizedDict)
444 return -1; 444 return -1;
445 445
446 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H"); 446 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H");
447 if (!pRange) 447 if (!pRange)
448 return -1; 448 return -1;
(...skipping 12 matching lines...) Expand all
461 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H"); 461 CPDF_Array* pRange = m_pLinearizedDict->GetArrayBy("H");
462 if (!pRange) 462 if (!pRange)
463 return -1; 463 return -1;
464 464
465 CPDF_Object* pStreamLen = pRange->GetElementValue(1); 465 CPDF_Object* pStreamLen = pRange->GetElementValue(1);
466 if (!pStreamLen) 466 if (!pStreamLen)
467 return -1; 467 return -1;
468 468
469 return pStreamLen->GetInteger(); 469 return pStreamLen->GetInteger();
470 } 470 }
OLDNEW
« no previous file with comments | « core/fpdfapi/fpdf_parser/cpdf_hint_tables.h ('k') | core/fpdfapi/fpdf_parser/cpdf_indirect_object_holder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698