| 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 "../../../../third_party/base/nonstd_unique_ptr.h" |
| 7 #include "../../../include/fpdfapi/fpdf_module.h" | 8 #include "../../../include/fpdfapi/fpdf_module.h" |
| 8 #include "../../../include/fpdfapi/fpdf_pageobj.h" | 9 #include "../../../include/fpdfapi/fpdf_pageobj.h" |
| 9 #include "../../../include/fpdfapi/fpdf_render.h" | 10 #include "../../../include/fpdfapi/fpdf_render.h" |
| 10 #include "../../../include/fxcodec/fx_codec.h" | 11 #include "../../../include/fxcodec/fx_codec.h" |
| 11 #include "../../../include/fxcrt/fx_safe_types.h" | 12 #include "../../../include/fxcrt/fx_safe_types.h" |
| 12 #include "../../../include/fxge/fx_ge.h" | 13 #include "../../../include/fxge/fx_ge.h" |
| 13 #include "../fpdf_page/pageint.h" | 14 #include "../fpdf_page/pageint.h" |
| 14 #include "render_int.h" | 15 #include "render_int.h" |
| 15 | 16 |
| 16 namespace { | 17 namespace { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 | 49 |
| 49 FX_SAFE_DWORD CalculatePitch32(int bpp, int width) | 50 FX_SAFE_DWORD CalculatePitch32(int bpp, int width) |
| 50 { | 51 { |
| 51 FX_SAFE_DWORD pitch = bpp; | 52 FX_SAFE_DWORD pitch = bpp; |
| 52 pitch *= width; | 53 pitch *= width; |
| 53 pitch += 31; | 54 pitch += 31; |
| 54 pitch /= 8; | 55 pitch /= 8; |
| 55 return pitch; | 56 return pitch; |
| 56 } | 57 } |
| 57 | 58 |
| 59 // Wrapper class to hold objects allocated in CPDF_DIBSource::LoadJpxBitmap(), |
| 60 // because nonstd::unique_ptr does not support custom deleters yet. |
| 61 class JpxBitMapContext |
| 62 { |
| 63 public: |
| 64 explicit JpxBitMapContext(ICodec_JpxModule* jpx_module) |
| 65 : jpx_module_(jpx_module), |
| 66 ctx_(nullptr), |
| 67 output_offsets_(nullptr) {} |
| 68 |
| 69 ~JpxBitMapContext() { |
| 70 FX_Free(output_offsets_); |
| 71 jpx_module_->DestroyDecoder(ctx_); |
| 72 } |
| 73 |
| 74 // Takes ownership of |ctx|. |
| 75 void set_context(void* ctx) { |
| 76 ctx_ = ctx; |
| 77 } |
| 78 |
| 79 void* context() { |
| 80 return ctx_; |
| 81 } |
| 82 |
| 83 // Takes ownership of |output_offsets|. |
| 84 void set_output_offsets(unsigned char* output_offsets) { |
| 85 output_offsets_ = output_offsets; |
| 86 } |
| 87 |
| 88 unsigned char* output_offsets() { |
| 89 return output_offsets_; |
| 90 } |
| 91 |
| 92 private: |
| 93 ICodec_JpxModule* jpx_module_; // Weak pointer. |
| 94 void* ctx_; // Decoder context, owned. |
| 95 unsigned char* output_offsets_; // Output offsets for decoding, owned. |
| 96 |
| 97 // Disallow evil constructors |
| 98 JpxBitMapContext(const JpxBitMapContext&); |
| 99 void operator=(const JpxBitMapContext&); |
| 100 }; |
| 101 |
| 58 } // namespace | 102 } // namespace |
| 59 | 103 |
| 60 CFX_DIBSource* CPDF_Image::LoadDIBSource(CFX_DIBSource** ppMask, FX_DWORD* pMatt
eColor, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask) const | 104 CFX_DIBSource* CPDF_Image::LoadDIBSource(CFX_DIBSource** ppMask, FX_DWORD* pMatt
eColor, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask) const |
| 61 { | 105 { |
| 62 CPDF_DIBSource* pSource = new CPDF_DIBSource; | 106 CPDF_DIBSource* pSource = new CPDF_DIBSource; |
| 63 if (pSource->Load(m_pDocument, m_pStream, (CPDF_DIBSource**)ppMask, pMatteCo
lor, NULL, NULL, bStdCS, GroupFamily, bLoadMask)) { | 107 if (pSource->Load(m_pDocument, m_pStream, (CPDF_DIBSource**)ppMask, pMatteCo
lor, NULL, NULL, bStdCS, GroupFamily, bLoadMask)) { |
| 64 return pSource; | 108 return pSource; |
| 65 } | 109 } |
| 66 delete pSource; | 110 delete pSource; |
| 67 return NULL; | 111 return NULL; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 m_bpp = 0; | 161 m_bpp = 0; |
| 118 m_Width = m_Height = 0; | 162 m_Width = m_Height = 0; |
| 119 m_pColorSpace = NULL; | 163 m_pColorSpace = NULL; |
| 120 m_bDefaultDecode = TRUE; | 164 m_bDefaultDecode = TRUE; |
| 121 m_bImageMask = FALSE; | 165 m_bImageMask = FALSE; |
| 122 m_bDoBpcCheck = TRUE; | 166 m_bDoBpcCheck = TRUE; |
| 123 m_pPalette = NULL; | 167 m_pPalette = NULL; |
| 124 m_pCompData = NULL; | 168 m_pCompData = NULL; |
| 125 m_bColorKey = FALSE; | 169 m_bColorKey = FALSE; |
| 126 m_pMaskedLine = m_pLineBuf = NULL; | 170 m_pMaskedLine = m_pLineBuf = NULL; |
| 127 m_pCachedBitmap = NULL; | |
| 128 m_pDecoder = NULL; | 171 m_pDecoder = NULL; |
| 129 m_nComponents = 0; | 172 m_nComponents = 0; |
| 130 m_bpc = 0; | 173 m_bpc = 0; |
| 131 m_bLoadMask = FALSE; | 174 m_bLoadMask = FALSE; |
| 132 m_Family = 0; | 175 m_Family = 0; |
| 133 m_pMask = NULL; | 176 m_pMask = NULL; |
| 134 m_MatteColor = 0; | 177 m_MatteColor = 0; |
| 135 m_pJbig2Context = NULL; | 178 m_pJbig2Context = NULL; |
| 136 m_pGlobalStream = NULL; | 179 m_pGlobalStream = NULL; |
| 137 m_bStdCS = FALSE; | 180 m_bStdCS = FALSE; |
| 138 m_pMaskStream = NULL; | 181 m_pMaskStream = NULL; |
| 139 m_Status = 0; | 182 m_Status = 0; |
| 140 m_bHasMask = FALSE; | 183 m_bHasMask = FALSE; |
| 141 } | 184 } |
| 142 CPDF_DIBSource::~CPDF_DIBSource() | 185 CPDF_DIBSource::~CPDF_DIBSource() |
| 143 { | 186 { |
| 144 delete m_pStreamAcc; | 187 delete m_pStreamAcc; |
| 145 if (m_pMaskedLine) { | 188 if (m_pMaskedLine) { |
| 146 FX_Free(m_pMaskedLine); | 189 FX_Free(m_pMaskedLine); |
| 147 } | 190 } |
| 148 if (m_pLineBuf) { | 191 if (m_pLineBuf) { |
| 149 FX_Free(m_pLineBuf); | 192 FX_Free(m_pLineBuf); |
| 150 } | 193 } |
| 151 delete m_pCachedBitmap; | 194 m_pCachedBitmap.reset(); |
| 152 delete m_pDecoder; | 195 delete m_pDecoder; |
| 153 if (m_pCompData) { | 196 if (m_pCompData) { |
| 154 FX_Free(m_pCompData); | 197 FX_Free(m_pCompData); |
| 155 } | 198 } |
| 156 CPDF_ColorSpace* pCS = m_pColorSpace; | 199 CPDF_ColorSpace* pCS = m_pColorSpace; |
| 157 if (pCS && m_pDocument) { | 200 if (pCS && m_pDocument) { |
| 158 m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); | 201 m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); |
| 159 } | 202 } |
| 160 if (m_pJbig2Context) { | 203 if (m_pJbig2Context) { |
| 161 ICodec_Jbig2Module* pJbig2Module = CPDF_ModuleMgr::Get()->GetJbig2Module
(); | 204 ICodec_Jbig2Module* pJbig2Module = CPDF_ModuleMgr::Get()->GetJbig2Module
(); |
| 162 pJbig2Module->DestroyJbig2Context(m_pJbig2Context); | 205 pJbig2Module->DestroyJbig2Context(m_pJbig2Context); |
| 163 } | 206 } |
| 164 delete m_pGlobalStream; | 207 delete m_pGlobalStream; |
| 165 } | 208 } |
| 166 CFX_DIBitmap* CPDF_DIBSource::GetBitmap() const | 209 CFX_DIBitmap* CPDF_DIBSource::GetBitmap() const |
| 167 { | 210 { |
| 168 if (m_pCachedBitmap) { | 211 return m_pCachedBitmap ? m_pCachedBitmap.get() : Clone(); |
| 169 return m_pCachedBitmap; | |
| 170 } | |
| 171 return Clone(); | |
| 172 } | 212 } |
| 173 void CPDF_DIBSource::ReleaseBitmap(CFX_DIBitmap* pBitmap) const | 213 void CPDF_DIBSource::ReleaseBitmap(CFX_DIBitmap* pBitmap) const |
| 174 { | 214 { |
| 175 if (pBitmap && pBitmap != m_pCachedBitmap) { | 215 if (pBitmap && pBitmap != m_pCachedBitmap) { |
| 176 delete pBitmap; | 216 delete pBitmap; |
| 177 } | 217 } |
| 178 } | 218 } |
| 179 FX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream, CP
DF_DIBSource** ppMask, | 219 FX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream, CP
DF_DIBSource** ppMask, |
| 180 FX_DWORD* pMatteColor, CPDF_Dictionary* pFormResour
ces, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_B
OOL bLoadMask) | 220 FX_DWORD* pMatteColor, CPDF_Dictionary* pFormResour
ces, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_B
OOL bLoadMask) |
| 181 { | 221 { |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream
(FX_BSTRC("JBIG2Globals")); | 408 CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream
(FX_BSTRC("JBIG2Globals")); |
| 369 if (pGlobals) { | 409 if (pGlobals) { |
| 370 m_pGlobalStream = new CPDF_StreamAcc; | 410 m_pGlobalStream = new CPDF_StreamAcc; |
| 371 m_pGlobalStream->LoadAllData(pGlobals, FALSE); | 411 m_pGlobalStream->LoadAllData(pGlobals, FALSE); |
| 372 } | 412 } |
| 373 } | 413 } |
| 374 ret = pJbig2Module->StartDecode(m_pJbig2Context, m_Width, m_Height,
m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), | 414 ret = pJbig2Module->StartDecode(m_pJbig2Context, m_Width, m_Height,
m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), |
| 375 m_pGlobalStream ? m_pGlobalStream->G
etData() : NULL, m_pGlobalStream ? m_pGlobalStream->GetSize() : 0, m_pCachedBitm
ap->GetBuffer(), | 415 m_pGlobalStream ? m_pGlobalStream->G
etData() : NULL, m_pGlobalStream ? m_pGlobalStream->GetSize() : 0, m_pCachedBitm
ap->GetBuffer(), |
| 376 m_pCachedBitmap->GetPitch(), pPause)
; | 416 m_pCachedBitmap->GetPitch(), pPause)
; |
| 377 if (ret < 0) { | 417 if (ret < 0) { |
| 378 delete m_pCachedBitmap; | 418 m_pCachedBitmap.reset(); |
| 379 m_pCachedBitmap = NULL; | |
| 380 delete m_pGlobalStream; | 419 delete m_pGlobalStream; |
| 381 m_pGlobalStream = NULL; | 420 m_pGlobalStream = NULL; |
| 382 pJbig2Module->DestroyJbig2Context(m_pJbig2Context); | 421 pJbig2Module->DestroyJbig2Context(m_pJbig2Context); |
| 383 m_pJbig2Context = NULL; | 422 m_pJbig2Context = NULL; |
| 384 return 0; | 423 return 0; |
| 385 } | 424 } |
| 386 if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | 425 if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
| 387 return 2; | 426 return 2; |
| 388 } | 427 } |
| 389 int ret1 = 1; | 428 int ret1 = 1; |
| 390 if (m_bHasMask) { | 429 if (m_bHasMask) { |
| 391 ret1 = ContinueLoadMaskDIB(pPause); | 430 ret1 = ContinueLoadMaskDIB(pPause); |
| 392 m_Status = 2; | 431 m_Status = 2; |
| 393 } | 432 } |
| 394 if (ret1 == 2) { | 433 if (ret1 == 2) { |
| 395 return ret1; | 434 return ret1; |
| 396 } | 435 } |
| 397 if (m_pColorSpace && m_bStdCS) { | 436 if (m_pColorSpace && m_bStdCS) { |
| 398 m_pColorSpace->EnableStdConversion(FALSE); | 437 m_pColorSpace->EnableStdConversion(FALSE); |
| 399 } | 438 } |
| 400 return ret1; | 439 return ret1; |
| 401 } | 440 } |
| 402 FXCODEC_STATUS ret = pJbig2Module->ContinueDecode(m_pJbig2Context, pPaus
e); | 441 FXCODEC_STATUS ret = pJbig2Module->ContinueDecode(m_pJbig2Context, pPaus
e); |
| 403 if (ret < 0) { | 442 if (ret < 0) { |
| 404 delete m_pCachedBitmap; | 443 m_pCachedBitmap.reset(); |
| 405 m_pCachedBitmap = NULL; | |
| 406 delete m_pGlobalStream; | 444 delete m_pGlobalStream; |
| 407 m_pGlobalStream = NULL; | 445 m_pGlobalStream = NULL; |
| 408 pJbig2Module->DestroyJbig2Context(m_pJbig2Context); | 446 pJbig2Module->DestroyJbig2Context(m_pJbig2Context); |
| 409 m_pJbig2Context = NULL; | 447 m_pJbig2Context = NULL; |
| 410 return 0; | 448 return 0; |
| 411 } | 449 } |
| 412 if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) { | 450 if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) { |
| 413 return 2; | 451 return 2; |
| 414 } | 452 } |
| 415 int ret1 = 1; | 453 int ret1 = 1; |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 586 } | 624 } |
| 587 m_bpc = bpc; | 625 m_bpc = bpc; |
| 588 m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecod
er(src_data, src_size, m_Width, m_Height, | 626 m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecod
er(src_data, src_size, m_Width, m_Height, |
| 589 m_nComponents, bTransform); | 627 m_nComponents, bTransform); |
| 590 } | 628 } |
| 591 } | 629 } |
| 592 } else if (decoder == FX_BSTRC("FlateDecode")) { | 630 } else if (decoder == FX_BSTRC("FlateDecode")) { |
| 593 m_pDecoder = FPDFAPI_CreateFlateDecoder(src_data, src_size, m_Width, m_H
eight, m_nComponents, m_bpc, pParams); | 631 m_pDecoder = FPDFAPI_CreateFlateDecoder(src_data, src_size, m_Width, m_H
eight, m_nComponents, m_bpc, pParams); |
| 594 } else if (decoder == FX_BSTRC("JPXDecode")) { | 632 } else if (decoder == FX_BSTRC("JPXDecode")) { |
| 595 LoadJpxBitmap(); | 633 LoadJpxBitmap(); |
| 596 return m_pCachedBitmap != NULL ? 1 : 0; | 634 return m_pCachedBitmap ? 1 : 0; |
| 597 } else if (decoder == FX_BSTRC("JBIG2Decode")) { | 635 } else if (decoder == FX_BSTRC("JBIG2Decode")) { |
| 598 m_pCachedBitmap = new CFX_DIBitmap; | 636 m_pCachedBitmap.reset(new CFX_DIBitmap); |
| 599 if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bp
pMask : FXDIB_1bppRgb)) { | 637 if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bp
pMask : FXDIB_1bppRgb)) { |
| 600 delete m_pCachedBitmap; | 638 m_pCachedBitmap.reset(); |
| 601 m_pCachedBitmap = NULL; | |
| 602 return 0; | 639 return 0; |
| 603 } | 640 } |
| 604 m_Status = 1; | 641 m_Status = 1; |
| 605 return 2; | 642 return 2; |
| 606 } else if (decoder == FX_BSTRC("RunLengthDecode")) { | 643 } else if (decoder == FX_BSTRC("RunLengthDecode")) { |
| 607 m_pDecoder = CPDF_ModuleMgr::Get()->GetCodecModule()->GetBasicModule()->
CreateRunLengthDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_b
pc); | 644 m_pDecoder = CPDF_ModuleMgr::Get()->GetCodecModule()->GetBasicModule()->
CreateRunLengthDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_b
pc); |
| 608 } | 645 } |
| 609 if (!m_pDecoder) | 646 if (!m_pDecoder) |
| 610 return 0; | 647 return 0; |
| 611 | 648 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 622 return 0; | 659 return 0; |
| 623 } | 660 } |
| 624 if (provided_pitch.ValueOrDie() < requested_pitch.ValueOrDie()) { | 661 if (provided_pitch.ValueOrDie() < requested_pitch.ValueOrDie()) { |
| 625 return 0; | 662 return 0; |
| 626 } | 663 } |
| 627 return 1; | 664 return 1; |
| 628 } | 665 } |
| 629 void CPDF_DIBSource::LoadJpxBitmap() | 666 void CPDF_DIBSource::LoadJpxBitmap() |
| 630 { | 667 { |
| 631 ICodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule(); | 668 ICodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule(); |
| 632 if (pJpxModule == NULL) { | 669 if (!pJpxModule) |
| 633 return; | 670 return; |
| 634 } | 671 |
| 635 FX_LPVOID ctx = pJpxModule->CreateDecoder(m_pStreamAcc->GetData(), m_pStream
Acc->GetSize(), m_pColorSpace != NULL); | 672 nonstd::unique_ptr<JpxBitMapContext> context( |
| 636 if (ctx == NULL) { | 673 new JpxBitMapContext(pJpxModule)); |
| 674 context->set_context(pJpxModule->CreateDecoder(m_pStreamAcc->GetData(), |
| 675 m_pStreamAcc->GetSize(), |
| 676 m_pColorSpace != nullptr)); |
| 677 if (!context->context()) |
| 637 return; | 678 return; |
| 638 } | 679 |
| 639 FX_DWORD width = 0, height = 0, codestream_nComps = 0, image_nComps = 0; | 680 FX_DWORD width = 0; |
| 640 pJpxModule->GetImageInfo(ctx, width, height, codestream_nComps, image_nComps
); | 681 FX_DWORD height = 0; |
| 641 if ((int)width < m_Width || (int)height < m_Height) { | 682 FX_DWORD codestream_nComps = 0; |
| 642 pJpxModule->DestroyDecoder(ctx); | 683 FX_DWORD image_nComps = 0; |
| 684 pJpxModule->GetImageInfo(context->context(), width, height, |
| 685 codestream_nComps, image_nComps); |
| 686 if ((int)width < m_Width || (int)height < m_Height) |
| 643 return; | 687 return; |
| 644 } | 688 |
| 645 int output_nComps; | 689 int output_nComps; |
| 646 FX_BOOL bTranslateColor, bSwapRGB = FALSE; | 690 FX_BOOL bTranslateColor; |
| 691 FX_BOOL bSwapRGB = FALSE; |
| 647 if (m_pColorSpace) { | 692 if (m_pColorSpace) { |
| 648 if (codestream_nComps != (FX_DWORD)m_pColorSpace->CountComponents()) { | 693 if (codestream_nComps != (FX_DWORD)m_pColorSpace->CountComponents()) |
| 649 return; | 694 return; |
| 650 } | |
| 651 output_nComps = codestream_nComps; | 695 output_nComps = codestream_nComps; |
| 652 bTranslateColor = FALSE; | 696 bTranslateColor = FALSE; |
| 653 if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) { | 697 if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) { |
| 654 bSwapRGB = TRUE; | 698 bSwapRGB = TRUE; |
| 655 m_pColorSpace = NULL; | 699 m_pColorSpace = nullptr; |
| 656 } | 700 } |
| 657 } else { | 701 } else { |
| 658 bTranslateColor = TRUE; | 702 bTranslateColor = TRUE; |
| 659 if (image_nComps) { | 703 if (image_nComps) { |
| 660 output_nComps = image_nComps; | 704 output_nComps = image_nComps; |
| 661 } else { | 705 } else { |
| 662 output_nComps = codestream_nComps; | 706 output_nComps = codestream_nComps; |
| 663 } | 707 } |
| 664 if (output_nComps == 3) { | 708 if (output_nComps == 3) { |
| 665 bSwapRGB = TRUE; | 709 bSwapRGB = TRUE; |
| 666 } else if (output_nComps == 4) { | 710 } else if (output_nComps == 4) { |
| 667 m_pColorSpace = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK); | 711 m_pColorSpace = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK); |
| 668 bTranslateColor = FALSE; | 712 bTranslateColor = FALSE; |
| 669 } | 713 } |
| 670 m_nComponents = output_nComps; | 714 m_nComponents = output_nComps; |
| 671 } | 715 } |
| 672 FXDIB_Format format; | 716 FXDIB_Format format; |
| 673 if (output_nComps == 1) { | 717 if (output_nComps == 1) { |
| 674 format = FXDIB_8bppRgb; | 718 format = FXDIB_8bppRgb; |
| 675 } else if (output_nComps <= 3) { | 719 } else if (output_nComps <= 3) { |
| 676 format = FXDIB_Rgb; | 720 format = FXDIB_Rgb; |
| 677 } else if (output_nComps == 4) { | 721 } else if (output_nComps == 4) { |
| 678 format = FXDIB_Rgb32; | 722 format = FXDIB_Rgb32; |
| 679 } else { | 723 } else { |
| 680 width = (width * output_nComps + 2) / 3; | 724 width = (width * output_nComps + 2) / 3; |
| 681 format = FXDIB_Rgb; | 725 format = FXDIB_Rgb; |
| 682 } | 726 } |
| 683 m_pCachedBitmap = new CFX_DIBitmap; | 727 m_pCachedBitmap.reset(new CFX_DIBitmap); |
| 684 if (!m_pCachedBitmap->Create(width, height, format)) { | 728 if (!m_pCachedBitmap->Create(width, height, format)) { |
| 685 delete m_pCachedBitmap; | 729 m_pCachedBitmap.reset(); |
| 686 m_pCachedBitmap = NULL; | |
| 687 return; | 730 return; |
| 688 } | 731 } |
| 689 m_pCachedBitmap->Clear(0xFFFFFFFF); | 732 m_pCachedBitmap->Clear(0xFFFFFFFF); |
| 690 FX_LPBYTE output_offsets = FX_Alloc(FX_BYTE, output_nComps); | 733 context->set_output_offsets(FX_Alloc(unsigned char, output_nComps)); |
| 691 for (int i = 0; i < output_nComps; i ++) { | 734 for (int i = 0; i < output_nComps; ++i) |
| 692 output_offsets[i] = i; | 735 context->output_offsets()[i] = i; |
| 736 if (bSwapRGB) { |
| 737 context->output_offsets()[0] = 2; |
| 738 context->output_offsets()[2] = 0; |
| 693 } | 739 } |
| 694 if (bSwapRGB) { | 740 if (!pJpxModule->Decode(context->context(), |
| 695 output_offsets[0] = 2; | 741 m_pCachedBitmap->GetBuffer(), |
| 696 output_offsets[2] = 0; | 742 m_pCachedBitmap->GetPitch(), |
| 697 } | 743 bTranslateColor, |
| 698 if (!pJpxModule->Decode(ctx, m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->
GetPitch(), bTranslateColor, output_offsets)) { | 744 context->output_offsets())) { |
| 699 delete m_pCachedBitmap; | 745 m_pCachedBitmap.reset(); |
| 700 m_pCachedBitmap = NULL; | |
| 701 return; | 746 return; |
| 702 } | 747 } |
| 703 FX_Free(output_offsets); | 748 if (m_pColorSpace && |
| 704 pJpxModule->DestroyDecoder(ctx); | 749 m_pColorSpace->GetFamily() == PDFCS_INDEXED && |
| 705 if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED && m_bpc <
8) { | 750 m_bpc < 8) { |
| 706 int scale = 8 - m_bpc; | 751 int scale = 8 - m_bpc; |
| 707 for (FX_DWORD row = 0; row < height; row ++) { | 752 for (FX_DWORD row = 0; row < height; ++row) { |
| 708 FX_LPBYTE scanline = (FX_LPBYTE)m_pCachedBitmap->GetScanline(row); | 753 FX_LPBYTE scanline = (FX_LPBYTE)m_pCachedBitmap->GetScanline(row); |
| 709 for (FX_DWORD col = 0; col < width; col ++) { | 754 for (FX_DWORD col = 0; col < width; ++col) { |
| 710 *scanline = (*scanline) >> scale; | 755 *scanline = (*scanline) >> scale; |
| 711 scanline++; | 756 ++scanline; |
| 712 } | 757 } |
| 713 } | 758 } |
| 714 } | 759 } |
| 715 m_bpc = 8; | 760 m_bpc = 8; |
| 716 } | 761 } |
| 717 CPDF_DIBSource* CPDF_DIBSource::LoadMask(FX_DWORD& MatteColor) | 762 CPDF_DIBSource* CPDF_DIBSource::LoadMask(FX_DWORD& MatteColor) |
| 718 { | 763 { |
| 719 MatteColor = 0xffffffff; | 764 MatteColor = 0xffffffff; |
| 720 CPDF_Stream* pSoftMask = m_pDict->GetStream(FX_BSTRC("SMask")); | 765 CPDF_Stream* pSoftMask = m_pDict->GetStream(FX_BSTRC("SMask")); |
| 721 if (pSoftMask) { | 766 if (pSoftMask) { |
| (...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1504 { | 1549 { |
| 1505 return ((CPDF_ProgressiveImageLoaderHandle*)LoadHandle)->Continue(pPause); | 1550 return ((CPDF_ProgressiveImageLoaderHandle*)LoadHandle)->Continue(pPause); |
| 1506 } | 1551 } |
| 1507 CPDF_ImageLoader::~CPDF_ImageLoader() | 1552 CPDF_ImageLoader::~CPDF_ImageLoader() |
| 1508 { | 1553 { |
| 1509 if (!m_bCached) { | 1554 if (!m_bCached) { |
| 1510 delete m_pBitmap; | 1555 delete m_pBitmap; |
| 1511 delete m_pMask; | 1556 delete m_pMask; |
| 1512 } | 1557 } |
| 1513 } | 1558 } |
| OLD | NEW |