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 <map> | 7 #include <map> |
8 #include <list> | 8 #include <list> |
9 #include "JBig2_Context.h" | 9 #include "JBig2_Context.h" |
10 | 10 |
11 // Implement a very small least recently used (LRU) cache. It is very | 11 // Implement a very small least recently used (LRU) cache. It is very |
12 // common for a JBIG2 dictionary to span multiple pages in a PDF file, | 12 // common for a JBIG2 dictionary to span multiple pages in a PDF file, |
13 // and we do not want to decode the same dictionary over and over | 13 // and we do not want to decode the same dictionary over and over |
14 // again. We key off of the memory location of the dictionary. The | 14 // again. We key off of the memory location of the dictionary. The |
15 // list keeps track of the freshness of entries, with freshest ones | 15 // list keeps track of the freshness of entries, with freshest ones |
16 // at the front. Even a tiny cache size like 2 makes a dramatic | 16 // at the front. Even a tiny cache size like 2 makes a dramatic |
17 // difference for typical JBIG2 documents. | 17 // difference for typical JBIG2 documents. |
18 const int kSymbolDictCacheMaxSize = 2; | 18 const int kSymbolDictCacheMaxSize = 2; |
19 | 19 |
20 void OutputBitmap(CJBig2_Image* pImage) { | |
21 if (!pImage) { | |
22 return; | |
23 } | |
24 } | |
25 CJBig2_Context* CJBig2_Context::CreateContext( | 20 CJBig2_Context* CJBig2_Context::CreateContext( |
26 CJBig2_Module* pModule, | 21 CJBig2_Module* pModule, |
27 uint8_t* pGlobalData, | 22 uint8_t* pGlobalData, |
28 FX_DWORD dwGlobalLength, | 23 FX_DWORD dwGlobalLength, |
29 uint8_t* pData, | 24 uint8_t* pData, |
30 FX_DWORD dwLength, | 25 FX_DWORD dwLength, |
31 int32_t nStreamType, | 26 int32_t nStreamType, |
32 std::list<CJBig2_CachePair>* pSymbolDictCache, | 27 std::list<CJBig2_CachePair>* pSymbolDictCache, |
33 IFX_Pause* pPause) { | 28 IFX_Pause* pPause) { |
34 return new (pModule) | 29 return new (pModule) |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 m_pSegment = NULL; | 158 m_pSegment = NULL; |
164 return nRet; | 159 return nRet; |
165 } | 160 } |
166 m_pSegmentList->addItem(m_pSegment); | 161 m_pSegmentList->addItem(m_pSegment); |
167 if (m_pSegment->m_dwData_length != 0xffffffff) { | 162 if (m_pSegment->m_dwData_length != 0xffffffff) { |
168 m_dwOffset = m_dwOffset + m_pSegment->m_dwData_length; | 163 m_dwOffset = m_dwOffset + m_pSegment->m_dwData_length; |
169 m_pStream->setOffset(m_dwOffset); | 164 m_pStream->setOffset(m_dwOffset); |
170 } else { | 165 } else { |
171 m_pStream->offset(4); | 166 m_pStream->offset(4); |
172 } | 167 } |
173 OutputBitmap(m_pPage); | |
174 m_pSegment = NULL; | 168 m_pSegment = NULL; |
175 if (m_pStream->getByteLeft() > 0 && m_pPage && pPause && | 169 if (m_pStream->getByteLeft() > 0 && m_pPage && pPause && |
176 pPause->NeedToPauseNow()) { | 170 pPause->NeedToPauseNow()) { |
177 m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | 171 m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; |
178 m_PauseStep = 2; | 172 m_PauseStep = 2; |
179 return JBIG2_SUCCESS; | 173 return JBIG2_SUCCESS; |
180 } | 174 } |
181 } | 175 } |
182 } else { | 176 } else { |
183 return JBIG2_END_OF_FILE; | 177 return JBIG2_END_OF_FILE; |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH; | 290 m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
297 return JBIG2_SUCCESS; | 291 return JBIG2_SUCCESS; |
298 } | 292 } |
299 if (nRet == JBIG2_SUCCESS) { | 293 if (nRet == JBIG2_SUCCESS) { |
300 m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH; | 294 m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH; |
301 } else { | 295 } else { |
302 m_ProcessiveStatus = FXCODEC_STATUS_ERROR; | 296 m_ProcessiveStatus = FXCODEC_STATUS_ERROR; |
303 } | 297 } |
304 return nRet; | 298 return nRet; |
305 } | 299 } |
306 int32_t CJBig2_Context::getNextPage(uint8_t* pBuf, | |
307 int32_t width, | |
308 int32_t height, | |
309 int32_t stride, | |
310 IFX_Pause* pPause) { | |
311 int32_t nRet = JBIG2_ERROR_STREAM_TYPE; | |
312 m_bFirstPage = FALSE; | |
313 m_PauseStep = 0; | |
314 delete m_pPage; | |
315 JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf)); | |
316 m_bBufSpecified = TRUE; | |
317 if (m_pPage && pPause && pPause->NeedToPauseNow()) { | |
318 m_PauseStep = 1; | |
319 m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE; | |
320 return nRet; | |
321 } | |
322 return Continue(pPause); | |
323 switch (m_nStreamType) { | |
324 case JBIG2_FILE_STREAM: | |
325 nRet = decodeFile(pPause); | |
326 break; | |
327 case JBIG2_SQUENTIAL_STREAM: | |
328 nRet = decode_SquentialOrgnazation(pPause); | |
329 break; | |
330 case JBIG2_RANDOM_STREAM: | |
331 nRet = decode_RandomOrgnazation(pPause); | |
332 break; | |
333 case JBIG2_EMBED_STREAM: | |
334 nRet = decode_EmbedOrgnazation(pPause); | |
335 break; | |
336 default: | |
337 return JBIG2_ERROR_STREAM_TYPE; | |
338 } | |
339 return nRet; | |
340 } | |
341 int32_t CJBig2_Context::getFirstPage(CJBig2_Image** image, IFX_Pause* pPause) { | 300 int32_t CJBig2_Context::getFirstPage(CJBig2_Image** image, IFX_Pause* pPause) { |
342 int32_t nRet; | 301 int32_t nRet; |
343 m_bFirstPage = TRUE; | 302 m_bFirstPage = TRUE; |
344 m_PauseStep = 0; | 303 m_PauseStep = 0; |
345 if (m_pGlobalContext) { | 304 if (m_pGlobalContext) { |
346 nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause); | 305 nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause); |
347 if (nRet != JBIG2_SUCCESS) { | 306 if (nRet != JBIG2_SUCCESS) { |
348 return nRet; | 307 return nRet; |
349 } | 308 } |
350 } | 309 } |
351 m_bBufSpecified = FALSE; | 310 m_bBufSpecified = FALSE; |
352 return Continue(pPause); | 311 return Continue(pPause); |
353 } | 312 } |
354 int32_t CJBig2_Context::getNextPage(CJBig2_Image** image, IFX_Pause* pPause) { | |
355 int32_t nRet; | |
356 m_bBufSpecified = FALSE; | |
357 m_bFirstPage = FALSE; | |
358 m_PauseStep = 0; | |
359 switch (m_nStreamType) { | |
360 case JBIG2_FILE_STREAM: | |
361 nRet = decodeFile(pPause); | |
362 break; | |
363 case JBIG2_SQUENTIAL_STREAM: | |
364 nRet = decode_SquentialOrgnazation(pPause); | |
365 break; | |
366 case JBIG2_RANDOM_STREAM: | |
367 nRet = decode_RandomOrgnazation(pPause); | |
368 break; | |
369 case JBIG2_EMBED_STREAM: | |
370 nRet = decode_EmbedOrgnazation(pPause); | |
371 break; | |
372 default: | |
373 return JBIG2_ERROR_STREAM_TYPE; | |
374 } | |
375 if (nRet == JBIG2_SUCCESS) { | |
376 *image = m_pPage; | |
377 m_pPage = NULL; | |
378 return JBIG2_SUCCESS; | |
379 } | |
380 return nRet; | |
381 } | |
382 CJBig2_Segment* CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber) { | 313 CJBig2_Segment* CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber) { |
383 CJBig2_Segment* pSeg; | 314 CJBig2_Segment* pSeg; |
384 int32_t i; | 315 int32_t i; |
385 if (m_pGlobalContext) { | 316 if (m_pGlobalContext) { |
386 pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber); | 317 pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber); |
387 if (pSeg) { | 318 if (pSeg) { |
388 return pSeg; | 319 return pSeg; |
389 } | 320 } |
390 } | 321 } |
391 for (i = 0; i < m_pSegmentList->getLength(); i++) { | 322 for (i = 0; i < m_pSegmentList->getLength(); i++) { |
(...skipping 1157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1549 sizeof(JBig2ArithCtx) * dwTemp); | 1480 sizeof(JBig2ArithCtx) * dwTemp); |
1550 JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); | 1481 JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx) * dwTemp); |
1551 } | 1482 } |
1552 if (m_pArithDecoder == NULL) { | 1483 if (m_pArithDecoder == NULL) { |
1553 JBIG2_ALLOC(m_pArithDecoder, CJBig2_ArithDecoder(m_pStream)); | 1484 JBIG2_ALLOC(m_pArithDecoder, CJBig2_ArithDecoder(m_pStream)); |
1554 m_ProcessiveStatus = m_pGRD->Start_decode_Arith( | 1485 m_ProcessiveStatus = m_pGRD->Start_decode_Arith( |
1555 &pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause); | 1486 &pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause); |
1556 } else { | 1487 } else { |
1557 m_ProcessiveStatus = m_pGRD->Continue_decode(pPause); | 1488 m_ProcessiveStatus = m_pGRD->Continue_decode(pPause); |
1558 } | 1489 } |
1559 OutputBitmap(pSegment->m_Result.im); | |
1560 if (m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | 1490 if (m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
1561 if (pSegment->m_cFlags.s.type != 36) { | 1491 if (pSegment->m_cFlags.s.type != 36) { |
1562 if (!m_bBufSpecified) { | 1492 if (!m_bBufSpecified) { |
1563 JBig2PageInfo* pPageInfo = m_pPageInfoList->getLast(); | 1493 JBig2PageInfo* pPageInfo = m_pPageInfoList->getLast(); |
1564 if ((pPageInfo->m_bIsStriped == 1) && | 1494 if ((pPageInfo->m_bIsStriped == 1) && |
1565 (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { | 1495 (m_ri.y + m_ri.height > m_pPage->m_nHeight)) { |
1566 m_pPage->expand(m_ri.y + m_ri.height, | 1496 m_pPage->expand(m_ri.y + m_ri.height, |
1567 (pPageInfo->m_cFlags & 4) ? 1 : 0); | 1497 (pPageInfo->m_cFlags & 4) ? 1 : 0); |
1568 } | 1498 } |
1569 } | 1499 } |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1887 SBSYMCODES[CURTEMP].code = CURCODE; | 1817 SBSYMCODES[CURTEMP].code = CURCODE; |
1888 CURCODE = CURCODE + 1; | 1818 CURCODE = CURCODE + 1; |
1889 } | 1819 } |
1890 CURTEMP = CURTEMP + 1; | 1820 CURTEMP = CURTEMP + 1; |
1891 } | 1821 } |
1892 CURLEN = CURLEN + 1; | 1822 CURLEN = CURLEN + 1; |
1893 } | 1823 } |
1894 m_pModule->JBig2_Free(LENCOUNT); | 1824 m_pModule->JBig2_Free(LENCOUNT); |
1895 m_pModule->JBig2_Free(FIRSTCODE); | 1825 m_pModule->JBig2_Free(FIRSTCODE); |
1896 } | 1826 } |
OLD | NEW |