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

Side by Side Diff: core/src/fxcodec/jbig2/JBig2_Context.cpp

Issue 1365903002: Fix a leak in CJBig2_Context. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: more unique_ptr, fix leak Created 5 years, 2 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 <list> 7 #include <list>
8 #include "JBig2_Context.h" 8 #include "JBig2_Context.h"
9 9
10 // Implement a very small least recently used (LRU) cache. It is very 10 // Implement a very small least recently used (LRU) cache. It is very
11 // common for a JBIG2 dictionary to span multiple pages in a PDF file, 11 // common for a JBIG2 dictionary to span multiple pages in a PDF file,
12 // and we do not want to decode the same dictionary over and over 12 // and we do not want to decode the same dictionary over and over
13 // again. We key off of the memory location of the dictionary. The 13 // again. We key off of the memory location of the dictionary. The
14 // list keeps track of the freshness of entries, with freshest ones 14 // list keeps track of the freshness of entries, with freshest ones
15 // at the front. Even a tiny cache size like 2 makes a dramatic 15 // at the front. Even a tiny cache size like 2 makes a dramatic
16 // difference for typical JBIG2 documents. 16 // difference for typical JBIG2 documents.
17 const int kSymbolDictCacheMaxSize = 2; 17 const int kSymbolDictCacheMaxSize = 2;
18 18
19 CJBig2_Context* CJBig2_Context::CreateContext( 19 CJBig2_Context* CJBig2_Context::CreateContext(
20 const uint8_t* pGlobalData, 20 const uint8_t* pGlobalData,
21 FX_DWORD dwGlobalLength, 21 FX_DWORD dwGlobalLength,
22 const uint8_t* pData, 22 const uint8_t* pData,
23 FX_DWORD dwLength, 23 FX_DWORD dwLength,
24 int32_t nStreamType,
25 std::list<CJBig2_CachePair>* pSymbolDictCache, 24 std::list<CJBig2_CachePair>* pSymbolDictCache,
26 IFX_Pause* pPause) { 25 IFX_Pause* pPause) {
27 return new CJBig2_Context(pGlobalData, dwGlobalLength, pData, dwLength, 26 return new CJBig2_Context(pGlobalData, dwGlobalLength, pData, dwLength,
28 nStreamType, pSymbolDictCache, pPause); 27 pSymbolDictCache, pPause);
29 } 28 }
29
30 void CJBig2_Context::DestroyContext(CJBig2_Context* pContext) { 30 void CJBig2_Context::DestroyContext(CJBig2_Context* pContext) {
31 delete pContext; 31 delete pContext;
32 } 32 }
33
33 CJBig2_Context::CJBig2_Context(const uint8_t* pGlobalData, 34 CJBig2_Context::CJBig2_Context(const uint8_t* pGlobalData,
34 FX_DWORD dwGlobalLength, 35 FX_DWORD dwGlobalLength,
35 const uint8_t* pData, 36 const uint8_t* pData,
36 FX_DWORD dwLength, 37 FX_DWORD dwLength,
37 int32_t nStreamType,
38 std::list<CJBig2_CachePair>* pSymbolDictCache, 38 std::list<CJBig2_CachePair>* pSymbolDictCache,
39 IFX_Pause* pPause) { 39 IFX_Pause* pPause)
40 : m_bInPage(false), m_bBufSpecified(false) {
40 if (pGlobalData && (dwGlobalLength > 0)) { 41 if (pGlobalData && (dwGlobalLength > 0)) {
41 m_pGlobalContext = 42 m_pGlobalContext = new CJBig2_Context(
42 new CJBig2_Context(NULL, 0, pGlobalData, dwGlobalLength, 43 nullptr, 0, pGlobalData, dwGlobalLength, pSymbolDictCache, pPause);
43 JBIG2_EMBED_STREAM, pSymbolDictCache, pPause);
44 } else { 44 } else {
45 m_pGlobalContext = NULL; 45 m_pGlobalContext = nullptr;
46 } 46 }
47 m_pStream = new CJBig2_BitStream(pData, dwLength); 47
48 m_nStreamType = nStreamType; 48 m_pStream.reset(new CJBig2_BitStream(pData, dwLength));
49 m_nState = JBIG2_OUT_OF_PAGE;
50 m_pPage = NULL;
51 m_bBufSpecified = FALSE;
52 m_pPause = pPause; 49 m_pPause = pPause;
53 m_nSegmentDecoded = 0; 50 m_nSegmentDecoded = 0;
54 m_PauseStep = 10; 51 m_PauseStep = 10;
55 m_pArithDecoder = NULL; 52 m_pArithDecoder = NULL;
56 m_pGRD = NULL;
57 m_gbContext = NULL; 53 m_gbContext = NULL;
58 m_dwOffset = 0; 54 m_dwOffset = 0;
59 m_ProcessingStatus = FXCODEC_STATUS_FRAME_READY; 55 m_ProcessingStatus = FXCODEC_STATUS_FRAME_READY;
60 m_pSymbolDictCache = pSymbolDictCache; 56 m_pSymbolDictCache = pSymbolDictCache;
61 } 57 }
58
62 CJBig2_Context::~CJBig2_Context() { 59 CJBig2_Context::~CJBig2_Context() {
63 delete m_pArithDecoder; 60 delete m_pArithDecoder;
64 m_pArithDecoder = NULL; 61 m_pArithDecoder = NULL;
65 delete m_pGRD;
66 m_pGRD = NULL;
67 FX_Free(m_gbContext); 62 FX_Free(m_gbContext);
68 m_gbContext = NULL; 63 m_gbContext = NULL;
69 delete m_pGlobalContext; 64 delete m_pGlobalContext;
70 m_pGlobalContext = NULL; 65 m_pGlobalContext = NULL;
71 if (m_bBufSpecified) {
72 delete m_pPage;
73 }
74 m_pPage = NULL;
75 delete m_pStream;
76 m_pStream = NULL;
77 }
78
79 int32_t CJBig2_Context::decodeFile(IFX_Pause* pPause) {
80 if (m_pStream->getByteLeft() < 8)
81 return JBIG2_ERROR_TOO_SHORT;
82
83 const uint8_t fileID[] = {0x97, 0x4A, 0x42, 0x32, 0x0D, 0x0A, 0x1A, 0x0A};
84 if (JBIG2_memcmp(m_pStream->getPointer(), fileID, 8) != 0)
85 return JBIG2_ERROR_FILE_FORMAT;
86
87 m_pStream->offset(8);
88
89 uint8_t cFlags;
90 if (m_pStream->read1Byte(&cFlags) != 0)
91 return JBIG2_ERROR_TOO_SHORT;
92
93 if (!(cFlags & 0x02)) {
94 FX_DWORD dwTemp;
95 if (m_pStream->readInteger(&dwTemp) != 0)
96 return JBIG2_ERROR_TOO_SHORT;
97
98 if (dwTemp > 0) {
99 m_PageInfoList.clear();
100 m_PageInfoList.resize(dwTemp);
101 }
102 }
103
104 if (cFlags & 0x01) {
105 m_nStreamType = JBIG2_SQUENTIAL_STREAM;
106 return decode_SquentialOrgnazation(pPause);
107 }
108
109 m_nStreamType = JBIG2_RANDOM_STREAM;
110 return decode_RandomOrgnazation_FirstPage(pPause);
111 } 66 }
112 67
113 int32_t CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause) { 68 int32_t CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause) {
114 int32_t nRet; 69 int32_t nRet;
115 if (m_pStream->getByteLeft() <= 0) 70 if (m_pStream->getByteLeft() <= 0)
116 return JBIG2_END_OF_FILE; 71 return JBIG2_END_OF_FILE;
117 72
118 while (m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) { 73 while (m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) {
119 if (!m_pSegment) { 74 if (!m_pSegment) {
120 m_pSegment.reset(new CJBig2_Segment); 75 m_pSegment.reset(new CJBig2_Segment);
(...skipping 12 matching lines...) Expand all
133 } 88 }
134 if ((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) { 89 if ((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {
135 m_pSegment.reset(); 90 m_pSegment.reset();
136 return JBIG2_SUCCESS; 91 return JBIG2_SUCCESS;
137 } 92 }
138 if (nRet != JBIG2_SUCCESS) { 93 if (nRet != JBIG2_SUCCESS) {
139 m_pSegment.reset(); 94 m_pSegment.reset();
140 return nRet; 95 return nRet;
141 } 96 }
142 if (m_pSegment->m_dwData_length != 0xffffffff) { 97 if (m_pSegment->m_dwData_length != 0xffffffff) {
143 m_dwOffset = m_dwOffset + m_pSegment->m_dwData_length; 98 m_dwOffset += m_pSegment->m_dwData_length;
144 m_pStream->setOffset(m_dwOffset); 99 m_pStream->setOffset(m_dwOffset);
145 } else { 100 } else {
146 m_pStream->offset(4); 101 m_pStream->offset(4);
147 } 102 }
148 m_SegmentList.push_back(m_pSegment.release()); 103 m_SegmentList.push_back(m_pSegment.release());
149 if (m_pStream->getByteLeft() > 0 && m_pPage && pPause && 104 if (m_pStream->getByteLeft() > 0 && m_pPage && pPause &&
150 pPause->NeedToPauseNow()) { 105 pPause->NeedToPauseNow()) {
151 m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 106 m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
152 m_PauseStep = 2; 107 m_PauseStep = 2;
153 return JBIG2_SUCCESS; 108 return JBIG2_SUCCESS;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 int32_t stride, 157 int32_t stride,
203 IFX_Pause* pPause) { 158 IFX_Pause* pPause) {
204 int32_t nRet = 0; 159 int32_t nRet = 0;
205 if (m_pGlobalContext) { 160 if (m_pGlobalContext) {
206 nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause); 161 nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);
207 if (nRet != JBIG2_SUCCESS) { 162 if (nRet != JBIG2_SUCCESS) {
208 m_ProcessingStatus = FXCODEC_STATUS_ERROR; 163 m_ProcessingStatus = FXCODEC_STATUS_ERROR;
209 return nRet; 164 return nRet;
210 } 165 }
211 } 166 }
212 m_bFirstPage = TRUE;
213 m_PauseStep = 0; 167 m_PauseStep = 0;
214 delete m_pPage; 168 m_pPage.reset(new CJBig2_Image(width, height, stride, pBuf));
215 m_pPage = new CJBig2_Image(width, height, stride, pBuf); 169 m_bBufSpecified = true;
216 m_bBufSpecified = TRUE; 170 if (pPause && pPause->NeedToPauseNow()) {
217 if (m_pPage && pPause && pPause->NeedToPauseNow()) {
218 m_PauseStep = 1; 171 m_PauseStep = 1;
219 m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; 172 m_ProcessingStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
220 return nRet; 173 return nRet;
221 } 174 }
222 int ret = Continue(pPause); 175 return Continue(pPause);
223 return ret;
224 } 176 }
225 int32_t CJBig2_Context::Continue(IFX_Pause* pPause) { 177 int32_t CJBig2_Context::Continue(IFX_Pause* pPause) {
226 m_ProcessingStatus = FXCODEC_STATUS_DECODE_READY; 178 m_ProcessingStatus = FXCODEC_STATUS_DECODE_READY;
227 int32_t nRet; 179 int32_t nRet;
228 if (m_PauseStep <= 1) { 180 if (m_PauseStep <= 1) {
229 switch (m_nStreamType) { 181 nRet = decode_EmbedOrgnazation(pPause);
230 case JBIG2_FILE_STREAM:
231 nRet = decodeFile(pPause);
232 break;
233 case JBIG2_SQUENTIAL_STREAM:
234 nRet = decode_SquentialOrgnazation(pPause);
235 break;
236 case JBIG2_RANDOM_STREAM:
237 if (m_bFirstPage) {
238 nRet = decode_RandomOrgnazation_FirstPage(pPause);
239 } else {
240 nRet = decode_RandomOrgnazation(pPause);
241 }
242 break;
243 case JBIG2_EMBED_STREAM:
244 nRet = decode_EmbedOrgnazation(pPause);
245 break;
246 default:
247 m_ProcessingStatus = FXCODEC_STATUS_ERROR;
248 return JBIG2_ERROR_STREAM_TYPE;
249 }
250 } else if (m_PauseStep == 2) { 182 } else if (m_PauseStep == 2) {
251 nRet = decode_SquentialOrgnazation(pPause); 183 nRet = decode_SquentialOrgnazation(pPause);
252 } else if (m_PauseStep == 3) { 184 } else if (m_PauseStep == 3) {
253 nRet = decode_RandomOrgnazation_FirstPage(pPause); 185 nRet = decode_RandomOrgnazation_FirstPage(pPause);
254 } else if (m_PauseStep == 4) { 186 } else if (m_PauseStep == 4) {
255 nRet = decode_RandomOrgnazation(pPause); 187 nRet = decode_RandomOrgnazation(pPause);
256 } else if (m_PauseStep == 5) { 188 } else if (m_PauseStep == 5) {
257 m_ProcessingStatus = FXCODEC_STATUS_DECODE_FINISH; 189 m_ProcessingStatus = FXCODEC_STATUS_DECODE_FINISH;
258 return JBIG2_SUCCESS; 190 return JBIG2_SUCCESS;
259 } 191 }
260 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 192 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
261 return nRet; 193 return nRet;
262 } 194 }
263 m_PauseStep = 5; 195 m_PauseStep = 5;
264 if (!m_bBufSpecified && nRet == JBIG2_SUCCESS) { 196 if (!m_bBufSpecified && nRet == JBIG2_SUCCESS) {
265 m_ProcessingStatus = FXCODEC_STATUS_DECODE_FINISH; 197 m_ProcessingStatus = FXCODEC_STATUS_DECODE_FINISH;
266 return JBIG2_SUCCESS; 198 return JBIG2_SUCCESS;
267 } 199 }
268 if (nRet == JBIG2_SUCCESS) { 200 if (nRet == JBIG2_SUCCESS) {
269 m_ProcessingStatus = FXCODEC_STATUS_DECODE_FINISH; 201 m_ProcessingStatus = FXCODEC_STATUS_DECODE_FINISH;
270 } else { 202 } else {
271 m_ProcessingStatus = FXCODEC_STATUS_ERROR; 203 m_ProcessingStatus = FXCODEC_STATUS_ERROR;
272 } 204 }
273 return nRet; 205 return nRet;
274 } 206 }
275 int32_t CJBig2_Context::getFirstPage(CJBig2_Image** image, IFX_Pause* pPause) { 207
276 int32_t nRet;
277 m_bFirstPage = TRUE;
278 m_PauseStep = 0;
279 if (m_pGlobalContext) {
280 nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);
281 if (nRet != JBIG2_SUCCESS) {
282 return nRet;
283 }
284 }
285 m_bBufSpecified = FALSE;
286 return Continue(pPause);
287 }
288 CJBig2_Segment* CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber) { 208 CJBig2_Segment* CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber) {
289 CJBig2_Segment* pSeg; 209 CJBig2_Segment* pSeg;
290 if (m_pGlobalContext) { 210 if (m_pGlobalContext) {
291 pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber); 211 pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber);
292 if (pSeg) { 212 if (pSeg) {
293 return pSeg; 213 return pSeg;
294 } 214 }
295 } 215 }
296 for (size_t i = 0; i < m_SegmentList.size(); ++i) { 216 for (size_t i = 0; i < m_SegmentList.size(); ++i) {
297 pSeg = m_SegmentList.get(i); 217 pSeg = m_SegmentList.get(i);
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 } 326 }
407 327
408 int32_t CJBig2_Context::ProcessingParseSegmentData(CJBig2_Segment* pSegment, 328 int32_t CJBig2_Context::ProcessingParseSegmentData(CJBig2_Segment* pSegment,
409 IFX_Pause* pPause) { 329 IFX_Pause* pPause) {
410 switch (pSegment->m_cFlags.s.type) { 330 switch (pSegment->m_cFlags.s.type) {
411 case 0: 331 case 0:
412 return parseSymbolDict(pSegment, pPause); 332 return parseSymbolDict(pSegment, pPause);
413 case 4: 333 case 4:
414 case 6: 334 case 6:
415 case 7: 335 case 7:
416 if (m_nState == JBIG2_OUT_OF_PAGE) 336 if (!m_bInPage)
417 return JBIG2_ERROR_FATAL; 337 return JBIG2_ERROR_FATAL;
418 return parseTextRegion(pSegment); 338 return parseTextRegion(pSegment);
419 case 16: 339 case 16:
420 return parsePatternDict(pSegment, pPause); 340 return parsePatternDict(pSegment, pPause);
421 case 20: 341 case 20:
422 case 22: 342 case 22:
423 case 23: 343 case 23:
424 if (m_nState == JBIG2_OUT_OF_PAGE) 344 if (!m_bInPage)
425 return JBIG2_ERROR_FATAL; 345 return JBIG2_ERROR_FATAL;
426 return parseHalftoneRegion(pSegment, pPause); 346 return parseHalftoneRegion(pSegment, pPause);
427 case 36: 347 case 36:
428 case 38: 348 case 38:
429 case 39: 349 case 39:
430 if (m_nState == JBIG2_OUT_OF_PAGE) 350 if (!m_bInPage)
431 return JBIG2_ERROR_FATAL; 351 return JBIG2_ERROR_FATAL;
432 return parseGenericRegion(pSegment, pPause); 352 return parseGenericRegion(pSegment, pPause);
433 case 40: 353 case 40:
434 case 42: 354 case 42:
435 case 43: 355 case 43:
436 if (m_nState == JBIG2_OUT_OF_PAGE) 356 if (!m_bInPage)
437 return JBIG2_ERROR_FATAL; 357 return JBIG2_ERROR_FATAL;
438 return parseGenericRefinementRegion(pSegment); 358 return parseGenericRefinementRegion(pSegment);
439 case 48: { 359 case 48: {
440 FX_WORD wTemp; 360 FX_WORD wTemp;
441 nonstd::unique_ptr<JBig2PageInfo> pPageInfo(new JBig2PageInfo); 361 nonstd::unique_ptr<JBig2PageInfo> pPageInfo(new JBig2PageInfo);
442 if ((m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0) || 362 if ((m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0) ||
443 (m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0) || 363 (m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0) ||
444 (m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0) || 364 (m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0) ||
445 (m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0) || 365 (m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0) ||
446 (m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0) || 366 (m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0) ||
447 (m_pStream->readShortInteger(&wTemp) != 0)) { 367 (m_pStream->readShortInteger(&wTemp) != 0)) {
448 return JBIG2_ERROR_TOO_SHORT; 368 return JBIG2_ERROR_TOO_SHORT;
449 } 369 }
450 pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? TRUE : FALSE; 370 pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? TRUE : FALSE;
451 pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff; 371 pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff;
452 bool bMaxHeight = (pPageInfo->m_dwHeight == 0xffffffff); 372 bool bMaxHeight = (pPageInfo->m_dwHeight == 0xffffffff);
453 if (bMaxHeight && pPageInfo->m_bIsStriped != TRUE) 373 if (bMaxHeight && pPageInfo->m_bIsStriped != TRUE)
454 pPageInfo->m_bIsStriped = TRUE; 374 pPageInfo->m_bIsStriped = TRUE;
455 375
456 if (!m_bBufSpecified) { 376 if (!m_bBufSpecified) {
457 delete m_pPage;
458 FX_DWORD height = 377 FX_DWORD height =
459 bMaxHeight ? pPageInfo->m_wMaxStripeSize : pPageInfo->m_dwHeight; 378 bMaxHeight ? pPageInfo->m_wMaxStripeSize : pPageInfo->m_dwHeight;
460 m_pPage = new CJBig2_Image(pPageInfo->m_dwWidth, height); 379 m_pPage.reset(new CJBig2_Image(pPageInfo->m_dwWidth, height));
461 } 380 }
462 381
463 if (!m_pPage->m_pData) { 382 if (!m_pPage->m_pData) {
464 m_ProcessingStatus = FXCODEC_STATUS_ERROR; 383 m_ProcessingStatus = FXCODEC_STATUS_ERROR;
465 return JBIG2_ERROR_TOO_SHORT; 384 return JBIG2_ERROR_TOO_SHORT;
466 } 385 }
467 386
468 m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0); 387 m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0);
469 m_PageInfoList.push_back(pPageInfo.release()); 388 m_PageInfoList.push_back(pPageInfo.release());
470 m_nState = JBIG2_IN_PAGE; 389 m_bInPage = true;
471 } break; 390 } break;
472 case 49: 391 case 49:
473 m_nState = JBIG2_OUT_OF_PAGE; 392 m_bInPage = false;
474 return JBIG2_END_OF_PAGE; 393 return JBIG2_END_OF_PAGE;
475 break; 394 break;
476 case 50: 395 case 50:
477 m_pStream->offset(pSegment->m_dwData_length); 396 m_pStream->offset(pSegment->m_dwData_length);
478 break; 397 break;
479 case 51: 398 case 51:
480 return JBIG2_END_OF_FILE; 399 return JBIG2_END_OF_FILE;
481 case 52: 400 case 52:
482 m_pStream->offset(pSegment->m_dwData_length); 401 m_pStream->offset(pSegment->m_dwData_length);
483 break; 402 break;
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 if (it->first == key) { 608 if (it->first == key) {
690 pSegment->m_Result.sd = it->second->DeepCopy(); 609 pSegment->m_Result.sd = it->second->DeepCopy();
691 m_pSymbolDictCache->push_front(*it); 610 m_pSymbolDictCache->push_front(*it);
692 m_pSymbolDictCache->erase(it); 611 m_pSymbolDictCache->erase(it);
693 cache_hit = true; 612 cache_hit = true;
694 break; 613 break;
695 } 614 }
696 } 615 }
697 if (!cache_hit) { 616 if (!cache_hit) {
698 if (pSymbolDictDecoder->SDHUFF == 0) { 617 if (pSymbolDictDecoder->SDHUFF == 0) {
699 pArithDecoder = new CJBig2_ArithDecoder(m_pStream); 618 pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
700 pSegment->m_Result.sd = 619 pSegment->m_Result.sd =
701 pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext); 620 pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext);
702 delete pArithDecoder; 621 delete pArithDecoder;
703 if (pSegment->m_Result.sd == NULL) { 622 if (pSegment->m_Result.sd == NULL) {
704 nRet = JBIG2_ERROR_FATAL; 623 nRet = JBIG2_ERROR_FATAL;
705 goto failed; 624 goto failed;
706 } 625 }
707 m_pStream->alignByte(); 626 m_pStream->alignByte();
708 m_pStream->offset(2); 627 m_pStream->offset(2);
709 } else { 628 } else {
710 pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman( 629 pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman(
711 m_pStream, gbContext, grContext, pPause); 630 m_pStream.get(), gbContext, grContext, pPause);
712 if (pSegment->m_Result.sd == NULL) { 631 if (pSegment->m_Result.sd == NULL) {
713 nRet = JBIG2_ERROR_FATAL; 632 nRet = JBIG2_ERROR_FATAL;
714 goto failed; 633 goto failed;
715 } 634 }
716 m_pStream->alignByte(); 635 m_pStream->alignByte();
717 } 636 }
718 CJBig2_SymbolDict* value = pSegment->m_Result.sd->DeepCopy(); 637 CJBig2_SymbolDict* value = pSegment->m_Result.sd->DeepCopy();
719 if (value && kSymbolDictCacheMaxSize > 0) { 638 if (value && kSymbolDictCacheMaxSize > 0) {
720 while (m_pSymbolDictCache->size() >= kSymbolDictCacheMaxSize) { 639 while (m_pSymbolDictCache->size() >= kSymbolDictCacheMaxSize) {
721 delete m_pSymbolDictCache->back().second; 640 delete m_pSymbolDictCache->back().second;
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 JBIG2_memcpy(SBSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS, 765 JBIG2_memcpy(SBSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,
847 pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*)); 766 pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));
848 dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS; 767 dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;
849 } 768 }
850 } 769 }
851 pTRD->SBSYMS = SBSYMS; 770 pTRD->SBSYMS = SBSYMS;
852 } else { 771 } else {
853 pTRD->SBSYMS = NULL; 772 pTRD->SBSYMS = NULL;
854 } 773 }
855 if (pTRD->SBHUFF == 1) { 774 if (pTRD->SBHUFF == 1) {
856 SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream, pTRD->SBNUMSYMS); 775 SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream.get(), pTRD->SBNUMSYMS);
857 if (SBSYMCODES == NULL) { 776 if (SBSYMCODES == NULL) {
858 nRet = JBIG2_ERROR_FATAL; 777 nRet = JBIG2_ERROR_FATAL;
859 goto failed; 778 goto failed;
860 } 779 }
861 m_pStream->alignByte(); 780 m_pStream->alignByte();
862 pTRD->SBSYMCODES = SBSYMCODES; 781 pTRD->SBSYMCODES = SBSYMCODES;
863 } else { 782 } else {
864 dwTemp = 0; 783 dwTemp = 0;
865 while ((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) { 784 while ((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) {
866 dwTemp++; 785 dwTemp++;
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1035 } 954 }
1036 pTRD->SBHUFFRSIZE = pSeg->m_Result.ht; 955 pTRD->SBHUFFRSIZE = pSeg->m_Result.ht;
1037 } 956 }
1038 } 957 }
1039 if (pTRD->SBREFINE == 1) { 958 if (pTRD->SBREFINE == 1) {
1040 dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13; 959 dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13;
1041 grContext = FX_Alloc(JBig2ArithCtx, dwTemp); 960 grContext = FX_Alloc(JBig2ArithCtx, dwTemp);
1042 JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp); 961 JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
1043 } 962 }
1044 if (pTRD->SBHUFF == 0) { 963 if (pTRD->SBHUFF == 0) {
1045 pArithDecoder = new CJBig2_ArithDecoder(m_pStream); 964 pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
1046 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; 965 pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
1047 pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext); 966 pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext);
1048 delete pArithDecoder; 967 delete pArithDecoder;
1049 if (pSegment->m_Result.im == NULL) { 968 if (pSegment->m_Result.im == NULL) {
1050 nRet = JBIG2_ERROR_FATAL; 969 nRet = JBIG2_ERROR_FATAL;
1051 goto failed; 970 goto failed;
1052 } 971 }
1053 m_pStream->alignByte(); 972 m_pStream->alignByte();
1054 m_pStream->offset(2); 973 m_pStream->offset(2);
1055 } else { 974 } else {
1056 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; 975 pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
1057 pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream, grContext); 976 pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream.get(), grContext);
1058 if (pSegment->m_Result.im == NULL) { 977 if (pSegment->m_Result.im == NULL) {
1059 nRet = JBIG2_ERROR_FATAL; 978 nRet = JBIG2_ERROR_FATAL;
1060 goto failed; 979 goto failed;
1061 } 980 }
1062 m_pStream->alignByte(); 981 m_pStream->alignByte();
1063 } 982 }
1064 if (pSegment->m_cFlags.s.type != 4) { 983 if (pSegment->m_cFlags.s.type != 4) {
1065 if (!m_bBufSpecified) { 984 if (!m_bBufSpecified) {
1066 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); 985 JBig2PageInfo* pPageInfo = m_PageInfoList.back();
1067 if ((pPageInfo->m_bIsStriped == 1) && 986 if ((pPageInfo->m_bIsStriped == 1) &&
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1129 goto failed; 1048 goto failed;
1130 } 1049 }
1131 pPDD->HDMMR = cFlags & 0x01; 1050 pPDD->HDMMR = cFlags & 0x01;
1132 pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03; 1051 pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03;
1133 pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER; 1052 pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER;
1134 if (pPDD->HDMMR == 0) { 1053 if (pPDD->HDMMR == 0) {
1135 dwTemp = 1054 dwTemp =
1136 pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024; 1055 pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024;
1137 gbContext = FX_Alloc(JBig2ArithCtx, dwTemp); 1056 gbContext = FX_Alloc(JBig2ArithCtx, dwTemp);
1138 JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); 1057 JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
1139 pArithDecoder = new CJBig2_ArithDecoder(m_pStream); 1058 pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
1140 pSegment->m_Result.pd = 1059 pSegment->m_Result.pd =
1141 pPDD->decode_Arith(pArithDecoder, gbContext, pPause); 1060 pPDD->decode_Arith(pArithDecoder, gbContext, pPause);
1142 delete pArithDecoder; 1061 delete pArithDecoder;
1143 if (pSegment->m_Result.pd == NULL) { 1062 if (pSegment->m_Result.pd == NULL) {
1144 FX_Free(gbContext); 1063 FX_Free(gbContext);
1145 nRet = JBIG2_ERROR_FATAL; 1064 nRet = JBIG2_ERROR_FATAL;
1146 goto failed; 1065 goto failed;
1147 } 1066 }
1148 FX_Free(gbContext); 1067 FX_Free(gbContext);
1149 m_pStream->alignByte(); 1068 m_pStream->alignByte();
1150 m_pStream->offset(2); 1069 m_pStream->offset(2);
1151 } else { 1070 } else {
1152 pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream, pPause); 1071 pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream.get(), pPause);
1153 if (pSegment->m_Result.pd == NULL) { 1072 if (pSegment->m_Result.pd == NULL) {
1154 nRet = JBIG2_ERROR_FATAL; 1073 nRet = JBIG2_ERROR_FATAL;
1155 goto failed; 1074 goto failed;
1156 } 1075 }
1157 m_pStream->alignByte(); 1076 m_pStream->alignByte();
1158 } 1077 }
1159 delete pPDD; 1078 delete pPDD;
1160 return JBIG2_SUCCESS; 1079 return JBIG2_SUCCESS;
1161 failed: 1080 failed:
1162 delete pPDD; 1081 delete pPDD;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1207 } 1126 }
1208 pHRD->HNUMPATS = pPatternDict->NUMPATS; 1127 pHRD->HNUMPATS = pPatternDict->NUMPATS;
1209 pHRD->HPATS = pPatternDict->HDPATS; 1128 pHRD->HPATS = pPatternDict->HDPATS;
1210 pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth; 1129 pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth;
1211 pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight; 1130 pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight;
1212 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; 1131 pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
1213 if (pHRD->HMMR == 0) { 1132 if (pHRD->HMMR == 0) {
1214 dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024; 1133 dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024;
1215 gbContext = FX_Alloc(JBig2ArithCtx, dwTemp); 1134 gbContext = FX_Alloc(JBig2ArithCtx, dwTemp);
1216 JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); 1135 JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
1217 pArithDecoder = new CJBig2_ArithDecoder(m_pStream); 1136 pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
1218 pSegment->m_Result.im = 1137 pSegment->m_Result.im =
1219 pHRD->decode_Arith(pArithDecoder, gbContext, pPause); 1138 pHRD->decode_Arith(pArithDecoder, gbContext, pPause);
1220 delete pArithDecoder; 1139 delete pArithDecoder;
1221 if (pSegment->m_Result.im == NULL) { 1140 if (pSegment->m_Result.im == NULL) {
1222 FX_Free(gbContext); 1141 FX_Free(gbContext);
1223 nRet = JBIG2_ERROR_FATAL; 1142 nRet = JBIG2_ERROR_FATAL;
1224 goto failed; 1143 goto failed;
1225 } 1144 }
1226 FX_Free(gbContext); 1145 FX_Free(gbContext);
1227 m_pStream->alignByte(); 1146 m_pStream->alignByte();
1228 m_pStream->offset(2); 1147 m_pStream->offset(2);
1229 } else { 1148 } else {
1230 pSegment->m_Result.im = pHRD->decode_MMR(m_pStream, pPause); 1149 pSegment->m_Result.im = pHRD->decode_MMR(m_pStream.get(), pPause);
1231 if (pSegment->m_Result.im == NULL) { 1150 if (pSegment->m_Result.im == NULL) {
1232 nRet = JBIG2_ERROR_FATAL; 1151 nRet = JBIG2_ERROR_FATAL;
1233 goto failed; 1152 goto failed;
1234 } 1153 }
1235 m_pStream->alignByte(); 1154 m_pStream->alignByte();
1236 } 1155 }
1237 if (pSegment->m_cFlags.s.type != 20) { 1156 if (pSegment->m_cFlags.s.type != 20) {
1238 if (!m_bBufSpecified) { 1157 if (!m_bBufSpecified) {
1239 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); 1158 JBig2PageInfo* pPageInfo = m_PageInfoList.back();
1240 if ((pPageInfo->m_bIsStriped == 1) && 1159 if ((pPageInfo->m_bIsStriped == 1) &&
(...skipping 11 matching lines...) Expand all
1252 failed: 1171 failed:
1253 delete pHRD; 1172 delete pHRD;
1254 return nRet; 1173 return nRet;
1255 } 1174 }
1256 1175
1257 int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment, 1176 int32_t CJBig2_Context::parseGenericRegion(CJBig2_Segment* pSegment,
1258 IFX_Pause* pPause) { 1177 IFX_Pause* pPause) {
1259 FX_DWORD dwTemp; 1178 FX_DWORD dwTemp;
1260 uint8_t cFlags; 1179 uint8_t cFlags;
1261 int32_t i, nRet; 1180 int32_t i, nRet;
1262 if (m_pGRD == NULL) { 1181 if (!m_pGRD) {
1263 m_pGRD = new CJBig2_GRDProc(); 1182 m_pGRD.reset(new CJBig2_GRDProc);
1264 if ((parseRegionInfo(&m_ri) != JBIG2_SUCCESS) || 1183 if ((parseRegionInfo(&m_ri) != JBIG2_SUCCESS) ||
1265 (m_pStream->read1Byte(&cFlags) != 0)) { 1184 (m_pStream->read1Byte(&cFlags) != 0)) {
1266 nRet = JBIG2_ERROR_TOO_SHORT; 1185 nRet = JBIG2_ERROR_TOO_SHORT;
1267 goto failed; 1186 goto failed;
1268 } 1187 }
1269 if (m_ri.height < 0 || m_ri.width < 0) { 1188 if (m_ri.height < 0 || m_ri.width < 0) {
1270 nRet = JBIG2_FAILED; 1189 nRet = JBIG2_FAILED;
1271 goto failed; 1190 goto failed;
1272 } 1191 }
1273 m_pGRD->GBW = m_ri.width; 1192 m_pGRD->GBW = m_ri.width;
(...skipping 22 matching lines...) Expand all
1296 } 1215 }
1297 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; 1216 pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
1298 if (m_pGRD->MMR == 0) { 1217 if (m_pGRD->MMR == 0) {
1299 dwTemp = 1218 dwTemp =
1300 m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024; 1219 m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024;
1301 if (m_gbContext == NULL) { 1220 if (m_gbContext == NULL) {
1302 m_gbContext = FX_Alloc(JBig2ArithCtx, dwTemp); 1221 m_gbContext = FX_Alloc(JBig2ArithCtx, dwTemp);
1303 JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); 1222 JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
1304 } 1223 }
1305 if (m_pArithDecoder == NULL) { 1224 if (m_pArithDecoder == NULL) {
1306 m_pArithDecoder = new CJBig2_ArithDecoder(m_pStream); 1225 m_pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
1307 m_ProcessingStatus = m_pGRD->Start_decode_Arith( 1226 m_ProcessingStatus = m_pGRD->Start_decode_Arith(
1308 &pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause); 1227 &pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause);
1309 } else { 1228 } else {
1310 m_ProcessingStatus = m_pGRD->Continue_decode(pPause); 1229 m_ProcessingStatus = m_pGRD->Continue_decode(pPause);
1311 } 1230 }
1312 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 1231 if (m_ProcessingStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
1313 if (pSegment->m_cFlags.s.type != 36) { 1232 if (pSegment->m_cFlags.s.type != 36) {
1314 if (!m_bBufSpecified) { 1233 if (!m_bBufSpecified) {
1315 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); 1234 JBig2PageInfo* pPageInfo = m_PageInfoList.back();
1316 if ((pPageInfo->m_bIsStriped == 1) && 1235 if ((pPageInfo->m_bIsStriped == 1) &&
(...skipping 17 matching lines...) Expand all
1334 m_gbContext = NULL; 1253 m_gbContext = NULL;
1335 m_ProcessingStatus = FXCODEC_STATUS_ERROR; 1254 m_ProcessingStatus = FXCODEC_STATUS_ERROR;
1336 goto failed; 1255 goto failed;
1337 } 1256 }
1338 FX_Free(m_gbContext); 1257 FX_Free(m_gbContext);
1339 m_gbContext = NULL; 1258 m_gbContext = NULL;
1340 m_pStream->alignByte(); 1259 m_pStream->alignByte();
1341 m_pStream->offset(2); 1260 m_pStream->offset(2);
1342 } 1261 }
1343 } else { 1262 } else {
1344 FXCODEC_STATUS status = 1263 FXCODEC_STATUS status = m_pGRD->Start_decode_MMR(&pSegment->m_Result.im,
1345 m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, m_pStream, pPause); 1264 m_pStream.get(), pPause);
1346 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) { 1265 while (status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
1347 m_pGRD->Continue_decode(pPause); 1266 m_pGRD->Continue_decode(pPause);
1348 } 1267 }
1349 if (pSegment->m_Result.im == NULL) { 1268 if (pSegment->m_Result.im == NULL) {
1350 nRet = JBIG2_ERROR_FATAL; 1269 nRet = JBIG2_ERROR_FATAL;
1351 goto failed; 1270 goto failed;
1352 } 1271 }
1353 m_pStream->alignByte(); 1272 m_pStream->alignByte();
1354 } 1273 }
1355 if (pSegment->m_cFlags.s.type != 36) { 1274 if (pSegment->m_cFlags.s.type != 36) {
1356 if (!m_bBufSpecified) { 1275 if (!m_bBufSpecified) {
1357 JBig2PageInfo* pPageInfo = m_PageInfoList.back(); 1276 JBig2PageInfo* pPageInfo = m_PageInfoList.back();
1358 if ((pPageInfo->m_bIsStriped == 1) && 1277 if ((pPageInfo->m_bIsStriped == 1) &&
1359 (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { 1278 (m_ri.y + m_ri.height > m_pPage->m_nHeight)) {
1360 m_pPage->expand(m_ri.y + m_ri.height, 1279 m_pPage->expand(m_ri.y + m_ri.height,
1361 (pPageInfo->m_cFlags & 4) ? 1 : 0); 1280 (pPageInfo->m_cFlags & 4) ? 1 : 0);
1362 } 1281 }
1363 } 1282 }
1364 FX_RECT Rect = m_pGRD->GetReplaceRect(); 1283 FX_RECT Rect = m_pGRD->GetReplaceRect();
1365 m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, 1284 m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top,
1366 pSegment->m_Result.im, 1285 pSegment->m_Result.im,
1367 (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect); 1286 (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);
1368 delete pSegment->m_Result.im; 1287 delete pSegment->m_Result.im;
1369 pSegment->m_Result.im = NULL; 1288 pSegment->m_Result.im = NULL;
1370 } 1289 }
1371 delete m_pGRD; 1290 m_pGRD.reset();
1372 m_pGRD = NULL;
1373 return JBIG2_SUCCESS; 1291 return JBIG2_SUCCESS;
1374 failed: 1292 failed:
1375 delete m_pGRD; 1293 m_pGRD.reset();
1376 m_pGRD = NULL;
1377 return nRet; 1294 return nRet;
1378 } 1295 }
1379 1296
1380 int32_t CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment* pSegment) { 1297 int32_t CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment* pSegment) {
1381 FX_DWORD dwTemp; 1298 FX_DWORD dwTemp;
1382 JBig2RegionInfo ri; 1299 JBig2RegionInfo ri;
1383 CJBig2_Segment* pSeg; 1300 CJBig2_Segment* pSeg;
1384 int32_t i, nRet; 1301 int32_t i, nRet;
1385 uint8_t cFlags; 1302 uint8_t cFlags;
1386 JBig2ArithCtx* grContext; 1303 JBig2ArithCtx* grContext;
(...skipping 28 matching lines...) Expand all
1415 (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) { 1332 (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) {
1416 break; 1333 break;
1417 } 1334 }
1418 } 1335 }
1419 if (i >= pSegment->m_nReferred_to_segment_count) { 1336 if (i >= pSegment->m_nReferred_to_segment_count) {
1420 nRet = JBIG2_ERROR_FATAL; 1337 nRet = JBIG2_ERROR_FATAL;
1421 goto failed; 1338 goto failed;
1422 } 1339 }
1423 pGRRD->GRREFERENCE = pSeg->m_Result.im; 1340 pGRRD->GRREFERENCE = pSeg->m_Result.im;
1424 } else { 1341 } else {
1425 pGRRD->GRREFERENCE = m_pPage; 1342 pGRRD->GRREFERENCE = m_pPage.get();
1426 } 1343 }
1427 pGRRD->GRREFERENCEDX = 0; 1344 pGRRD->GRREFERENCEDX = 0;
1428 pGRRD->GRREFERENCEDY = 0; 1345 pGRRD->GRREFERENCEDY = 0;
1429 dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13; 1346 dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13;
1430 grContext = FX_Alloc(JBig2ArithCtx, dwTemp); 1347 grContext = FX_Alloc(JBig2ArithCtx, dwTemp);
1431 JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp); 1348 JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx) * dwTemp);
1432 pArithDecoder = new CJBig2_ArithDecoder(m_pStream); 1349 pArithDecoder = new CJBig2_ArithDecoder(m_pStream.get());
1433 pSegment->m_nResultType = JBIG2_IMAGE_POINTER; 1350 pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
1434 pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext); 1351 pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext);
1435 delete pArithDecoder; 1352 delete pArithDecoder;
1436 if (pSegment->m_Result.im == NULL) { 1353 if (pSegment->m_Result.im == NULL) {
1437 FX_Free(grContext); 1354 FX_Free(grContext);
1438 nRet = JBIG2_ERROR_FATAL; 1355 nRet = JBIG2_ERROR_FATAL;
1439 goto failed; 1356 goto failed;
1440 } 1357 }
1441 FX_Free(grContext); 1358 FX_Free(grContext);
1442 m_pStream->alignByte(); 1359 m_pStream->alignByte();
(...skipping 12 matching lines...) Expand all
1455 pSegment->m_Result.im = NULL; 1372 pSegment->m_Result.im = NULL;
1456 } 1373 }
1457 delete pGRRD; 1374 delete pGRRD;
1458 return JBIG2_SUCCESS; 1375 return JBIG2_SUCCESS;
1459 failed: 1376 failed:
1460 delete pGRRD; 1377 delete pGRRD;
1461 return nRet; 1378 return nRet;
1462 } 1379 }
1463 int32_t CJBig2_Context::parseTable(CJBig2_Segment* pSegment) { 1380 int32_t CJBig2_Context::parseTable(CJBig2_Segment* pSegment) {
1464 pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER; 1381 pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER;
1465 pSegment->m_Result.ht = new CJBig2_HuffmanTable(m_pStream); 1382 pSegment->m_Result.ht = new CJBig2_HuffmanTable(m_pStream.get());
1466 if (!pSegment->m_Result.ht->isOK()) { 1383 if (!pSegment->m_Result.ht->isOK()) {
1467 delete pSegment->m_Result.ht; 1384 delete pSegment->m_Result.ht;
1468 pSegment->m_Result.ht = NULL; 1385 pSegment->m_Result.ht = NULL;
1469 return JBIG2_ERROR_FATAL; 1386 return JBIG2_ERROR_FATAL;
1470 } 1387 }
1471 m_pStream->alignByte(); 1388 m_pStream->alignByte();
1472 return JBIG2_SUCCESS; 1389 return JBIG2_SUCCESS;
1473 } 1390 }
1474 int32_t CJBig2_Context::parseRegionInfo(JBig2RegionInfo* pRI) { 1391 int32_t CJBig2_Context::parseRegionInfo(JBig2RegionInfo* pRI) {
1475 if ((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0) || 1392 if ((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0) ||
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1626 SBSYMCODES[CURTEMP].code = CURCODE; 1543 SBSYMCODES[CURTEMP].code = CURCODE;
1627 CURCODE = CURCODE + 1; 1544 CURCODE = CURCODE + 1;
1628 } 1545 }
1629 CURTEMP = CURTEMP + 1; 1546 CURTEMP = CURTEMP + 1;
1630 } 1547 }
1631 CURLEN = CURLEN + 1; 1548 CURLEN = CURLEN + 1;
1632 } 1549 }
1633 FX_Free(LENCOUNT); 1550 FX_Free(LENCOUNT);
1634 FX_Free(FIRSTCODE); 1551 FX_Free(FIRSTCODE);
1635 } 1552 }
OLDNEW
« core/src/fxcodec/jbig2/JBig2_Context.h ('K') | « core/src/fxcodec/jbig2/JBig2_Context.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698