| 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 "core/fpdfapi/render/render_int.h" | 7 #include "core/fpdfapi/render/render_int.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "core/fpdfapi/cpdf_modulemgr.h" | 13 #include "core/fpdfapi/cpdf_modulemgr.h" |
| 14 #include "core/fpdfapi/page/cpdf_docpagedata.h" | 14 #include "core/fpdfapi/page/cpdf_docpagedata.h" |
| 15 #include "core/fpdfapi/page/cpdf_image.h" | 15 #include "core/fpdfapi/page/cpdf_image.h" |
| 16 #include "core/fpdfapi/page/cpdf_imageobject.h" | 16 #include "core/fpdfapi/page/cpdf_imageobject.h" |
| 17 #include "core/fpdfapi/parser/cpdf_array.h" | 17 #include "core/fpdfapi/parser/cpdf_array.h" |
| 18 #include "core/fpdfapi/parser/cpdf_dictionary.h" | 18 #include "core/fpdfapi/parser/cpdf_dictionary.h" |
| 19 #include "core/fpdfapi/parser/cpdf_document.h" | 19 #include "core/fpdfapi/parser/cpdf_document.h" |
| 20 #include "core/fpdfapi/parser/fpdf_parser_decode.h" | 20 #include "core/fpdfapi/parser/fpdf_parser_decode.h" |
| 21 #include "core/fpdfapi/render/cpdf_pagerendercache.h" | 21 #include "core/fpdfapi/render/cpdf_pagerendercache.h" |
| 22 #include "core/fpdfapi/render/cpdf_renderstatus.h" | 22 #include "core/fpdfapi/render/cpdf_renderstatus.h" |
| 23 #include "core/fxcodec/fx_codec.h" | 23 #include "core/fxcodec/fx_codec.h" |
| 24 #include "core/fxcrt/fx_safe_types.h" | 24 #include "core/fxcrt/fx_safe_types.h" |
| 25 #include "third_party/base/ptr_util.h" |
| 25 | 26 |
| 26 namespace { | 27 namespace { |
| 27 | 28 |
| 28 unsigned int GetBits8(const uint8_t* pData, uint64_t bitpos, size_t nbits) { | 29 unsigned int GetBits8(const uint8_t* pData, uint64_t bitpos, size_t nbits) { |
| 29 ASSERT(nbits == 1 || nbits == 2 || nbits == 4 || nbits == 8 || nbits == 16); | 30 ASSERT(nbits == 1 || nbits == 2 || nbits == 4 || nbits == 8 || nbits == 16); |
| 30 ASSERT((bitpos & (nbits - 1)) == 0); | 31 ASSERT((bitpos & (nbits - 1)) == 0); |
| 31 unsigned int byte = pData[bitpos / 8]; | 32 unsigned int byte = pData[bitpos / 8]; |
| 32 if (nbits == 8) | 33 if (nbits == 8) |
| 33 return byte; | 34 return byte; |
| 34 | 35 |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 return false; | 165 return false; |
| 165 } | 166 } |
| 166 if (m_bDoBpcCheck && (m_bpc == 0 || m_nComponents == 0)) { | 167 if (m_bDoBpcCheck && (m_bpc == 0 || m_nComponents == 0)) { |
| 167 return false; | 168 return false; |
| 168 } | 169 } |
| 169 FX_SAFE_UINT32 src_size = | 170 FX_SAFE_UINT32 src_size = |
| 170 CalculatePitch8(m_bpc, m_nComponents, m_Width) * m_Height; | 171 CalculatePitch8(m_bpc, m_nComponents, m_Width) * m_Height; |
| 171 if (!src_size.IsValid()) { | 172 if (!src_size.IsValid()) { |
| 172 return false; | 173 return false; |
| 173 } | 174 } |
| 174 m_pStreamAcc.reset(new CPDF_StreamAcc); | 175 m_pStreamAcc = pdfium::MakeUnique<CPDF_StreamAcc>(); |
| 175 m_pStreamAcc->LoadAllData(pStream, false, src_size.ValueOrDie(), true); | 176 m_pStreamAcc->LoadAllData(pStream, false, src_size.ValueOrDie(), true); |
| 176 if (m_pStreamAcc->GetSize() == 0 || !m_pStreamAcc->GetData()) { | 177 if (m_pStreamAcc->GetSize() == 0 || !m_pStreamAcc->GetData()) { |
| 177 return false; | 178 return false; |
| 178 } | 179 } |
| 179 if (!CreateDecoder()) { | 180 if (!CreateDecoder()) { |
| 180 return false; | 181 return false; |
| 181 } | 182 } |
| 182 if (m_bImageMask) { | 183 if (m_bImageMask) { |
| 183 m_bpp = 1; | 184 m_bpp = 1; |
| 184 m_bpc = 1; | 185 m_bpc = 1; |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 return 0; | 287 return 0; |
| 287 } | 288 } |
| 288 if (m_bDoBpcCheck && (m_bpc == 0 || m_nComponents == 0)) { | 289 if (m_bDoBpcCheck && (m_bpc == 0 || m_nComponents == 0)) { |
| 289 return 0; | 290 return 0; |
| 290 } | 291 } |
| 291 FX_SAFE_UINT32 src_size = | 292 FX_SAFE_UINT32 src_size = |
| 292 CalculatePitch8(m_bpc, m_nComponents, m_Width) * m_Height; | 293 CalculatePitch8(m_bpc, m_nComponents, m_Width) * m_Height; |
| 293 if (!src_size.IsValid()) { | 294 if (!src_size.IsValid()) { |
| 294 return 0; | 295 return 0; |
| 295 } | 296 } |
| 296 m_pStreamAcc.reset(new CPDF_StreamAcc); | 297 m_pStreamAcc = pdfium::MakeUnique<CPDF_StreamAcc>(); |
| 297 m_pStreamAcc->LoadAllData(pStream, false, src_size.ValueOrDie(), true); | 298 m_pStreamAcc->LoadAllData(pStream, false, src_size.ValueOrDie(), true); |
| 298 if (m_pStreamAcc->GetSize() == 0 || !m_pStreamAcc->GetData()) { | 299 if (m_pStreamAcc->GetSize() == 0 || !m_pStreamAcc->GetData()) { |
| 299 return 0; | 300 return 0; |
| 300 } | 301 } |
| 301 int ret = CreateDecoder(); | 302 int ret = CreateDecoder(); |
| 302 if (!ret) | 303 if (!ret) |
| 303 return ret; | 304 return ret; |
| 304 | 305 |
| 305 if (ret != 1) { | 306 if (ret != 1) { |
| 306 if (!ContinueToLoadMask()) { | 307 if (!ContinueToLoadMask()) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 328 | 329 |
| 329 int CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause) { | 330 int CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause) { |
| 330 FXCODEC_STATUS ret; | 331 FXCODEC_STATUS ret; |
| 331 if (m_Status == 1) { | 332 if (m_Status == 1) { |
| 332 const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); | 333 const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); |
| 333 if (decoder == "JPXDecode") { | 334 if (decoder == "JPXDecode") { |
| 334 return 0; | 335 return 0; |
| 335 } | 336 } |
| 336 CCodec_Jbig2Module* pJbig2Module = CPDF_ModuleMgr::Get()->GetJbig2Module(); | 337 CCodec_Jbig2Module* pJbig2Module = CPDF_ModuleMgr::Get()->GetJbig2Module(); |
| 337 if (!m_pJbig2Context) { | 338 if (!m_pJbig2Context) { |
| 338 m_pJbig2Context.reset(new CCodec_Jbig2Context()); | 339 m_pJbig2Context = pdfium::MakeUnique<CCodec_Jbig2Context>(); |
| 339 if (m_pStreamAcc->GetImageParam()) { | 340 if (m_pStreamAcc->GetImageParam()) { |
| 340 CPDF_Stream* pGlobals = | 341 CPDF_Stream* pGlobals = |
| 341 m_pStreamAcc->GetImageParam()->GetStreamFor("JBIG2Globals"); | 342 m_pStreamAcc->GetImageParam()->GetStreamFor("JBIG2Globals"); |
| 342 if (pGlobals) { | 343 if (pGlobals) { |
| 343 m_pGlobalStream.reset(new CPDF_StreamAcc); | 344 m_pGlobalStream = pdfium::MakeUnique<CPDF_StreamAcc>(); |
| 344 m_pGlobalStream->LoadAllData(pGlobals, false); | 345 m_pGlobalStream->LoadAllData(pGlobals, false); |
| 345 } | 346 } |
| 346 } | 347 } |
| 347 ret = pJbig2Module->StartDecode( | 348 ret = pJbig2Module->StartDecode( |
| 348 m_pJbig2Context.get(), m_pDocument->CodecContext(), m_Width, m_Height, | 349 m_pJbig2Context.get(), m_pDocument->CodecContext(), m_Width, m_Height, |
| 349 m_pStreamAcc.get(), m_pGlobalStream.get(), | 350 m_pStreamAcc.get(), m_pGlobalStream.get(), |
| 350 m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), pPause); | 351 m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), pPause); |
| 351 if (ret < 0) { | 352 if (ret < 0) { |
| 352 m_pCachedBitmap.reset(); | 353 m_pCachedBitmap.reset(); |
| 353 m_pGlobalStream.reset(); | 354 m_pGlobalStream.reset(); |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 format = FXDIB_8bppRgb; | 670 format = FXDIB_8bppRgb; |
| 670 } else if (components <= 3) { | 671 } else if (components <= 3) { |
| 671 format = FXDIB_Rgb; | 672 format = FXDIB_Rgb; |
| 672 } else if (components == 4) { | 673 } else if (components == 4) { |
| 673 format = FXDIB_Rgb32; | 674 format = FXDIB_Rgb32; |
| 674 } else { | 675 } else { |
| 675 width = (width * components + 2) / 3; | 676 width = (width * components + 2) / 3; |
| 676 format = FXDIB_Rgb; | 677 format = FXDIB_Rgb; |
| 677 } | 678 } |
| 678 | 679 |
| 679 m_pCachedBitmap.reset(new CFX_DIBitmap); | 680 m_pCachedBitmap = pdfium::MakeUnique<CFX_DIBitmap>(); |
| 680 if (!m_pCachedBitmap->Create(width, height, format)) { | 681 if (!m_pCachedBitmap->Create(width, height, format)) { |
| 681 m_pCachedBitmap.reset(); | 682 m_pCachedBitmap.reset(); |
| 682 return; | 683 return; |
| 683 } | 684 } |
| 684 m_pCachedBitmap->Clear(0xFFFFFFFF); | 685 m_pCachedBitmap->Clear(0xFFFFFFFF); |
| 685 std::vector<uint8_t> output_offsets(components); | 686 std::vector<uint8_t> output_offsets(components); |
| 686 for (uint32_t i = 0; i < components; ++i) | 687 for (uint32_t i = 0; i < components; ++i) |
| 687 output_offsets[i] = i; | 688 output_offsets[i] = i; |
| 688 if (bSwapRGB) { | 689 if (bSwapRGB) { |
| 689 output_offsets[0] = 2; | 690 output_offsets[0] = 2; |
| (...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1470 *pDestPixel++ = FXARGB_G(argb); | 1471 *pDestPixel++ = FXARGB_G(argb); |
| 1471 *pDestPixel = FXARGB_R(argb); | 1472 *pDestPixel = FXARGB_R(argb); |
| 1472 } | 1473 } |
| 1473 } | 1474 } |
| 1474 } | 1475 } |
| 1475 | 1476 |
| 1476 bool CPDF_DIBSource::TransMask() const { | 1477 bool CPDF_DIBSource::TransMask() const { |
| 1477 return m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && | 1478 return m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && |
| 1478 m_Family == PDFCS_DEVICECMYK; | 1479 m_Family == PDFCS_DEVICECMYK; |
| 1479 } | 1480 } |
| OLD | NEW |