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/fpdf_render/render_int.h" | 7 #include "core/fpdfapi/fpdf_render/render_int.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <memory> | 10 #include <memory> |
(...skipping 20 matching lines...) Expand all Loading... |
31 unsigned int byte = pData[bitpos / 8]; | 31 unsigned int byte = pData[bitpos / 8]; |
32 if (nbits == 8) { | 32 if (nbits == 8) { |
33 return byte; | 33 return byte; |
34 } else if (nbits == 16) { | 34 } else if (nbits == 16) { |
35 return byte * 256 + pData[bitpos / 8 + 1]; | 35 return byte * 256 + pData[bitpos / 8 + 1]; |
36 } | 36 } |
37 | 37 |
38 return (byte >> (8 - nbits - (bitpos % 8))) & ((1 << nbits) - 1); | 38 return (byte >> (8 - nbits - (bitpos % 8))) & ((1 << nbits) - 1); |
39 } | 39 } |
40 | 40 |
41 FX_SAFE_DWORD CalculatePitch8(FX_DWORD bpc, FX_DWORD components, int width) { | 41 FX_SAFE_DWORD CalculatePitch8(uint32_t bpc, uint32_t components, int width) { |
42 FX_SAFE_DWORD pitch = bpc; | 42 FX_SAFE_DWORD pitch = bpc; |
43 pitch *= components; | 43 pitch *= components; |
44 pitch *= width; | 44 pitch *= width; |
45 pitch += 7; | 45 pitch += 7; |
46 pitch /= 8; | 46 pitch /= 8; |
47 return pitch; | 47 return pitch; |
48 } | 48 } |
49 | 49 |
50 FX_SAFE_DWORD CalculatePitch32(int bpp, int width) { | 50 FX_SAFE_DWORD CalculatePitch32(int bpp, int width) { |
51 FX_SAFE_DWORD pitch = bpp; | 51 FX_SAFE_DWORD pitch = bpp; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 | 140 |
141 void CPDF_DIBSource::ReleaseBitmap(CFX_DIBitmap* pBitmap) const { | 141 void CPDF_DIBSource::ReleaseBitmap(CFX_DIBitmap* pBitmap) const { |
142 if (pBitmap && pBitmap != m_pCachedBitmap.get()) { | 142 if (pBitmap && pBitmap != m_pCachedBitmap.get()) { |
143 delete pBitmap; | 143 delete pBitmap; |
144 } | 144 } |
145 } | 145 } |
146 | 146 |
147 FX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, | 147 FX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, |
148 const CPDF_Stream* pStream, | 148 const CPDF_Stream* pStream, |
149 CPDF_DIBSource** ppMask, | 149 CPDF_DIBSource** ppMask, |
150 FX_DWORD* pMatteColor, | 150 uint32_t* pMatteColor, |
151 CPDF_Dictionary* pFormResources, | 151 CPDF_Dictionary* pFormResources, |
152 CPDF_Dictionary* pPageResources, | 152 CPDF_Dictionary* pPageResources, |
153 FX_BOOL bStdCS, | 153 FX_BOOL bStdCS, |
154 FX_DWORD GroupFamily, | 154 uint32_t GroupFamily, |
155 FX_BOOL bLoadMask) { | 155 FX_BOOL bLoadMask) { |
156 if (!pStream) { | 156 if (!pStream) { |
157 return FALSE; | 157 return FALSE; |
158 } | 158 } |
159 m_pDocument = pDoc; | 159 m_pDocument = pDoc; |
160 m_pDict = pStream->GetDict(); | 160 m_pDict = pStream->GetDict(); |
161 if (!m_pDict) { | 161 if (!m_pDict) { |
162 return FALSE; | 162 return FALSE; |
163 } | 163 } |
164 m_pStream = pStream; | 164 m_pStream = pStream; |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 m_Pitch = pitch.ValueOrDie(); | 267 m_Pitch = pitch.ValueOrDie(); |
268 return 1; | 268 return 1; |
269 } | 269 } |
270 | 270 |
271 int CPDF_DIBSource::StartLoadDIBSource(CPDF_Document* pDoc, | 271 int CPDF_DIBSource::StartLoadDIBSource(CPDF_Document* pDoc, |
272 const CPDF_Stream* pStream, | 272 const CPDF_Stream* pStream, |
273 FX_BOOL bHasMask, | 273 FX_BOOL bHasMask, |
274 CPDF_Dictionary* pFormResources, | 274 CPDF_Dictionary* pFormResources, |
275 CPDF_Dictionary* pPageResources, | 275 CPDF_Dictionary* pPageResources, |
276 FX_BOOL bStdCS, | 276 FX_BOOL bStdCS, |
277 FX_DWORD GroupFamily, | 277 uint32_t GroupFamily, |
278 FX_BOOL bLoadMask) { | 278 FX_BOOL bLoadMask) { |
279 if (!pStream) { | 279 if (!pStream) { |
280 return 0; | 280 return 0; |
281 } | 281 } |
282 m_pDocument = pDoc; | 282 m_pDocument = pDoc; |
283 m_pDict = pStream->GetDict(); | 283 m_pDict = pStream->GetDict(); |
284 m_pStream = pStream; | 284 m_pStream = pStream; |
285 m_bStdCS = bStdCS; | 285 m_bStdCS = bStdCS; |
286 m_bHasMask = bHasMask; | 286 m_bHasMask = bHasMask; |
287 m_Width = m_pDict->GetIntegerBy("Width"); | 287 m_Width = m_pDict->GetIntegerBy("Width"); |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 | 473 |
474 DIB_COMP_DATA* CPDF_DIBSource::GetDecodeAndMaskArray(FX_BOOL& bDefaultDecode, | 474 DIB_COMP_DATA* CPDF_DIBSource::GetDecodeAndMaskArray(FX_BOOL& bDefaultDecode, |
475 FX_BOOL& bColorKey) { | 475 FX_BOOL& bColorKey) { |
476 if (!m_pColorSpace) { | 476 if (!m_pColorSpace) { |
477 return nullptr; | 477 return nullptr; |
478 } | 478 } |
479 DIB_COMP_DATA* pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents); | 479 DIB_COMP_DATA* pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents); |
480 int max_data = (1 << m_bpc) - 1; | 480 int max_data = (1 << m_bpc) - 1; |
481 CPDF_Array* pDecode = m_pDict->GetArrayBy("Decode"); | 481 CPDF_Array* pDecode = m_pDict->GetArrayBy("Decode"); |
482 if (pDecode) { | 482 if (pDecode) { |
483 for (FX_DWORD i = 0; i < m_nComponents; i++) { | 483 for (uint32_t i = 0; i < m_nComponents; i++) { |
484 pCompData[i].m_DecodeMin = pDecode->GetNumberAt(i * 2); | 484 pCompData[i].m_DecodeMin = pDecode->GetNumberAt(i * 2); |
485 FX_FLOAT max = pDecode->GetNumberAt(i * 2 + 1); | 485 FX_FLOAT max = pDecode->GetNumberAt(i * 2 + 1); |
486 pCompData[i].m_DecodeStep = (max - pCompData[i].m_DecodeMin) / max_data; | 486 pCompData[i].m_DecodeStep = (max - pCompData[i].m_DecodeMin) / max_data; |
487 FX_FLOAT def_value; | 487 FX_FLOAT def_value; |
488 FX_FLOAT def_min; | 488 FX_FLOAT def_min; |
489 FX_FLOAT def_max; | 489 FX_FLOAT def_max; |
490 m_pColorSpace->GetDefaultValue(i, def_value, def_min, def_max); | 490 m_pColorSpace->GetDefaultValue(i, def_value, def_min, def_max); |
491 if (m_Family == PDFCS_INDEXED) { | 491 if (m_Family == PDFCS_INDEXED) { |
492 def_max = max_data; | 492 def_max = max_data; |
493 } | 493 } |
494 if (def_min != pCompData[i].m_DecodeMin || def_max != max) { | 494 if (def_min != pCompData[i].m_DecodeMin || def_max != max) { |
495 bDefaultDecode = FALSE; | 495 bDefaultDecode = FALSE; |
496 } | 496 } |
497 } | 497 } |
498 } else { | 498 } else { |
499 for (FX_DWORD i = 0; i < m_nComponents; i++) { | 499 for (uint32_t i = 0; i < m_nComponents; i++) { |
500 FX_FLOAT def_value; | 500 FX_FLOAT def_value; |
501 m_pColorSpace->GetDefaultValue(i, def_value, pCompData[i].m_DecodeMin, | 501 m_pColorSpace->GetDefaultValue(i, def_value, pCompData[i].m_DecodeMin, |
502 pCompData[i].m_DecodeStep); | 502 pCompData[i].m_DecodeStep); |
503 if (m_Family == PDFCS_INDEXED) { | 503 if (m_Family == PDFCS_INDEXED) { |
504 pCompData[i].m_DecodeStep = max_data; | 504 pCompData[i].m_DecodeStep = max_data; |
505 } | 505 } |
506 pCompData[i].m_DecodeStep = | 506 pCompData[i].m_DecodeStep = |
507 (pCompData[i].m_DecodeStep - pCompData[i].m_DecodeMin) / max_data; | 507 (pCompData[i].m_DecodeStep - pCompData[i].m_DecodeMin) / max_data; |
508 } | 508 } |
509 } | 509 } |
510 if (!m_pDict->KeyExist("SMask")) { | 510 if (!m_pDict->KeyExist("SMask")) { |
511 CPDF_Object* pMask = m_pDict->GetElementValue("Mask"); | 511 CPDF_Object* pMask = m_pDict->GetElementValue("Mask"); |
512 if (!pMask) { | 512 if (!pMask) { |
513 return pCompData; | 513 return pCompData; |
514 } | 514 } |
515 if (CPDF_Array* pArray = pMask->AsArray()) { | 515 if (CPDF_Array* pArray = pMask->AsArray()) { |
516 if (pArray->GetCount() >= m_nComponents * 2) { | 516 if (pArray->GetCount() >= m_nComponents * 2) { |
517 for (FX_DWORD i = 0; i < m_nComponents; i++) { | 517 for (uint32_t i = 0; i < m_nComponents; i++) { |
518 int min_num = pArray->GetIntegerAt(i * 2); | 518 int min_num = pArray->GetIntegerAt(i * 2); |
519 int max_num = pArray->GetIntegerAt(i * 2 + 1); | 519 int max_num = pArray->GetIntegerAt(i * 2 + 1); |
520 pCompData[i].m_ColorKeyMin = std::max(min_num, 0); | 520 pCompData[i].m_ColorKeyMin = std::max(min_num, 0); |
521 pCompData[i].m_ColorKeyMax = std::min(max_num, max_data); | 521 pCompData[i].m_ColorKeyMax = std::min(max_num, max_data); |
522 } | 522 } |
523 } | 523 } |
524 bColorKey = TRUE; | 524 bColorKey = TRUE; |
525 } | 525 } |
526 } | 526 } |
527 return pCompData; | 527 return pCompData; |
528 } | 528 } |
529 | 529 |
530 ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder( | 530 ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder( |
531 const uint8_t* src_buf, | 531 const uint8_t* src_buf, |
532 FX_DWORD src_size, | 532 uint32_t src_size, |
533 int width, | 533 int width, |
534 int height, | 534 int height, |
535 const CPDF_Dictionary* pParams); | 535 const CPDF_Dictionary* pParams); |
536 | 536 |
537 ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( | 537 ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( |
538 const uint8_t* src_buf, | 538 const uint8_t* src_buf, |
539 FX_DWORD src_size, | 539 uint32_t src_size, |
540 int width, | 540 int width, |
541 int height, | 541 int height, |
542 int nComps, | 542 int nComps, |
543 int bpc, | 543 int bpc, |
544 const CPDF_Dictionary* pParams); | 544 const CPDF_Dictionary* pParams); |
545 | 545 |
546 int CPDF_DIBSource::CreateDecoder() { | 546 int CPDF_DIBSource::CreateDecoder() { |
547 const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); | 547 const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); |
548 if (decoder.IsEmpty()) { | 548 if (decoder.IsEmpty()) { |
549 return 1; | 549 return 1; |
550 } | 550 } |
551 if (m_bDoBpcCheck && m_bpc == 0) { | 551 if (m_bDoBpcCheck && m_bpc == 0) { |
552 return 0; | 552 return 0; |
553 } | 553 } |
554 const uint8_t* src_data = m_pStreamAcc->GetData(); | 554 const uint8_t* src_data = m_pStreamAcc->GetData(); |
555 FX_DWORD src_size = m_pStreamAcc->GetSize(); | 555 uint32_t src_size = m_pStreamAcc->GetSize(); |
556 const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam(); | 556 const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam(); |
557 if (decoder == "CCITTFaxDecode") { | 557 if (decoder == "CCITTFaxDecode") { |
558 m_pDecoder.reset(FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, | 558 m_pDecoder.reset(FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, |
559 m_Height, pParams)); | 559 m_Height, pParams)); |
560 } else if (decoder == "DCTDecode") { | 560 } else if (decoder == "DCTDecode") { |
561 m_pDecoder.reset(CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( | 561 m_pDecoder.reset(CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( |
562 src_data, src_size, m_Width, m_Height, m_nComponents, | 562 src_data, src_size, m_Width, m_Height, m_nComponents, |
563 pParams ? pParams->GetIntegerBy("ColorTransform", 1) : 1)); | 563 pParams ? pParams->GetIntegerBy("ColorTransform", 1) : 1)); |
564 if (!m_pDecoder) { | 564 if (!m_pDecoder) { |
565 FX_BOOL bTransform = FALSE; | 565 FX_BOOL bTransform = FALSE; |
566 int comps; | 566 int comps; |
567 int bpc; | 567 int bpc; |
568 ICodec_JpegModule* pJpegModule = CPDF_ModuleMgr::Get()->GetJpegModule(); | 568 ICodec_JpegModule* pJpegModule = CPDF_ModuleMgr::Get()->GetJpegModule(); |
569 if (pJpegModule->LoadInfo(src_data, src_size, m_Width, m_Height, comps, | 569 if (pJpegModule->LoadInfo(src_data, src_size, m_Width, m_Height, comps, |
570 bpc, bTransform)) { | 570 bpc, bTransform)) { |
571 if (m_nComponents != static_cast<FX_DWORD>(comps)) { | 571 if (m_nComponents != static_cast<uint32_t>(comps)) { |
572 FX_Free(m_pCompData); | 572 FX_Free(m_pCompData); |
573 m_nComponents = static_cast<FX_DWORD>(comps); | 573 m_nComponents = static_cast<uint32_t>(comps); |
574 if (m_Family == PDFCS_LAB && m_nComponents != 3) { | 574 if (m_Family == PDFCS_LAB && m_nComponents != 3) { |
575 m_pCompData = nullptr; | 575 m_pCompData = nullptr; |
576 return 0; | 576 return 0; |
577 } | 577 } |
578 m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey); | 578 m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey); |
579 if (!m_pCompData) { | 579 if (!m_pCompData) { |
580 return 0; | 580 return 0; |
581 } | 581 } |
582 } | 582 } |
583 m_bpc = bpc; | 583 m_bpc = bpc; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 ICodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule(); | 631 ICodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule(); |
632 if (!pJpxModule) | 632 if (!pJpxModule) |
633 return; | 633 return; |
634 | 634 |
635 std::unique_ptr<JpxBitMapContext> context(new JpxBitMapContext(pJpxModule)); | 635 std::unique_ptr<JpxBitMapContext> context(new JpxBitMapContext(pJpxModule)); |
636 context->set_decoder(pJpxModule->CreateDecoder( | 636 context->set_decoder(pJpxModule->CreateDecoder( |
637 m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), m_pColorSpace)); | 637 m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), m_pColorSpace)); |
638 if (!context->decoder()) | 638 if (!context->decoder()) |
639 return; | 639 return; |
640 | 640 |
641 FX_DWORD width = 0; | 641 uint32_t width = 0; |
642 FX_DWORD height = 0; | 642 uint32_t height = 0; |
643 FX_DWORD components = 0; | 643 uint32_t components = 0; |
644 pJpxModule->GetImageInfo(context->decoder(), &width, &height, &components); | 644 pJpxModule->GetImageInfo(context->decoder(), &width, &height, &components); |
645 if (static_cast<int>(width) < m_Width || static_cast<int>(height) < m_Height) | 645 if (static_cast<int>(width) < m_Width || static_cast<int>(height) < m_Height) |
646 return; | 646 return; |
647 | 647 |
648 FX_BOOL bSwapRGB = FALSE; | 648 FX_BOOL bSwapRGB = FALSE; |
649 if (m_pColorSpace) { | 649 if (m_pColorSpace) { |
650 if (components != m_pColorSpace->CountComponents()) | 650 if (components != m_pColorSpace->CountComponents()) |
651 return; | 651 return; |
652 | 652 |
653 if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) { | 653 if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) { |
(...skipping 21 matching lines...) Expand all Loading... |
675 format = FXDIB_Rgb; | 675 format = FXDIB_Rgb; |
676 } | 676 } |
677 | 677 |
678 m_pCachedBitmap.reset(new CFX_DIBitmap); | 678 m_pCachedBitmap.reset(new CFX_DIBitmap); |
679 if (!m_pCachedBitmap->Create(width, height, format)) { | 679 if (!m_pCachedBitmap->Create(width, height, format)) { |
680 m_pCachedBitmap.reset(); | 680 m_pCachedBitmap.reset(); |
681 return; | 681 return; |
682 } | 682 } |
683 m_pCachedBitmap->Clear(0xFFFFFFFF); | 683 m_pCachedBitmap->Clear(0xFFFFFFFF); |
684 std::vector<uint8_t> output_offsets(components); | 684 std::vector<uint8_t> output_offsets(components); |
685 for (FX_DWORD i = 0; i < components; ++i) | 685 for (uint32_t i = 0; i < components; ++i) |
686 output_offsets[i] = i; | 686 output_offsets[i] = i; |
687 if (bSwapRGB) { | 687 if (bSwapRGB) { |
688 output_offsets[0] = 2; | 688 output_offsets[0] = 2; |
689 output_offsets[2] = 0; | 689 output_offsets[2] = 0; |
690 } | 690 } |
691 if (!pJpxModule->Decode(context->decoder(), m_pCachedBitmap->GetBuffer(), | 691 if (!pJpxModule->Decode(context->decoder(), m_pCachedBitmap->GetBuffer(), |
692 m_pCachedBitmap->GetPitch(), output_offsets)) { | 692 m_pCachedBitmap->GetPitch(), output_offsets)) { |
693 m_pCachedBitmap.reset(); | 693 m_pCachedBitmap.reset(); |
694 return; | 694 return; |
695 } | 695 } |
696 if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED && | 696 if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED && |
697 m_bpc < 8) { | 697 m_bpc < 8) { |
698 int scale = 8 - m_bpc; | 698 int scale = 8 - m_bpc; |
699 for (FX_DWORD row = 0; row < height; ++row) { | 699 for (uint32_t row = 0; row < height; ++row) { |
700 uint8_t* scanline = | 700 uint8_t* scanline = |
701 const_cast<uint8_t*>(m_pCachedBitmap->GetScanline(row)); | 701 const_cast<uint8_t*>(m_pCachedBitmap->GetScanline(row)); |
702 for (FX_DWORD col = 0; col < width; ++col) { | 702 for (uint32_t col = 0; col < width; ++col) { |
703 *scanline = (*scanline) >> scale; | 703 *scanline = (*scanline) >> scale; |
704 ++scanline; | 704 ++scanline; |
705 } | 705 } |
706 } | 706 } |
707 } | 707 } |
708 m_bpc = 8; | 708 m_bpc = 8; |
709 } | 709 } |
710 | 710 |
711 CPDF_DIBSource* CPDF_DIBSource::LoadMask(FX_DWORD& MatteColor) { | 711 CPDF_DIBSource* CPDF_DIBSource::LoadMask(uint32_t& MatteColor) { |
712 MatteColor = 0xFFFFFFFF; | 712 MatteColor = 0xFFFFFFFF; |
713 CPDF_Stream* pSoftMask = m_pDict->GetStreamBy("SMask"); | 713 CPDF_Stream* pSoftMask = m_pDict->GetStreamBy("SMask"); |
714 if (pSoftMask) { | 714 if (pSoftMask) { |
715 CPDF_Array* pMatte = pSoftMask->GetDict()->GetArrayBy("Matte"); | 715 CPDF_Array* pMatte = pSoftMask->GetDict()->GetArrayBy("Matte"); |
716 if (pMatte && m_pColorSpace && | 716 if (pMatte && m_pColorSpace && |
717 m_pColorSpace->CountComponents() <= m_nComponents) { | 717 m_pColorSpace->CountComponents() <= m_nComponents) { |
718 std::vector<FX_FLOAT> colors(m_nComponents); | 718 std::vector<FX_FLOAT> colors(m_nComponents); |
719 for (FX_DWORD i = 0; i < m_nComponents; i++) { | 719 for (uint32_t i = 0; i < m_nComponents; i++) { |
720 colors[i] = pMatte->GetFloatAt(i); | 720 colors[i] = pMatte->GetFloatAt(i); |
721 } | 721 } |
722 FX_FLOAT R, G, B; | 722 FX_FLOAT R, G, B; |
723 m_pColorSpace->GetRGB(colors.data(), R, G, B); | 723 m_pColorSpace->GetRGB(colors.data(), R, G, B); |
724 MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), | 724 MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), |
725 FXSYS_round(B * 255)); | 725 FXSYS_round(B * 255)); |
726 } | 726 } |
727 return LoadMaskDIB(pSoftMask); | 727 return LoadMaskDIB(pSoftMask); |
728 } | 728 } |
729 | 729 |
730 if (CPDF_Stream* pStream = ToStream(m_pDict->GetElementValue("Mask"))) | 730 if (CPDF_Stream* pStream = ToStream(m_pDict->GetElementValue("Mask"))) |
731 return LoadMaskDIB(pStream); | 731 return LoadMaskDIB(pStream); |
732 | 732 |
733 return nullptr; | 733 return nullptr; |
734 } | 734 } |
735 | 735 |
736 int CPDF_DIBSource::StratLoadMask() { | 736 int CPDF_DIBSource::StratLoadMask() { |
737 m_MatteColor = 0XFFFFFFFF; | 737 m_MatteColor = 0XFFFFFFFF; |
738 m_pMaskStream = m_pDict->GetStreamBy("SMask"); | 738 m_pMaskStream = m_pDict->GetStreamBy("SMask"); |
739 if (m_pMaskStream) { | 739 if (m_pMaskStream) { |
740 CPDF_Array* pMatte = m_pMaskStream->GetDict()->GetArrayBy("Matte"); | 740 CPDF_Array* pMatte = m_pMaskStream->GetDict()->GetArrayBy("Matte"); |
741 if (pMatte && m_pColorSpace && | 741 if (pMatte && m_pColorSpace && |
742 m_pColorSpace->CountComponents() <= m_nComponents) { | 742 m_pColorSpace->CountComponents() <= m_nComponents) { |
743 FX_FLOAT R, G, B; | 743 FX_FLOAT R, G, B; |
744 std::vector<FX_FLOAT> colors(m_nComponents); | 744 std::vector<FX_FLOAT> colors(m_nComponents); |
745 for (FX_DWORD i = 0; i < m_nComponents; i++) { | 745 for (uint32_t i = 0; i < m_nComponents; i++) { |
746 colors[i] = pMatte->GetFloatAt(i); | 746 colors[i] = pMatte->GetFloatAt(i); |
747 } | 747 } |
748 m_pColorSpace->GetRGB(colors.data(), R, G, B); | 748 m_pColorSpace->GetRGB(colors.data(), R, G, B); |
749 m_MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), | 749 m_MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), |
750 FXSYS_round(B * 255)); | 750 FXSYS_round(B * 255)); |
751 } | 751 } |
752 return StartLoadMaskDIB(); | 752 return StartLoadMaskDIB(); |
753 } | 753 } |
754 | 754 |
755 m_pMaskStream = ToStream(m_pDict->GetElementValue("Mask")); | 755 m_pMaskStream = ToStream(m_pDict->GetElementValue("Mask")); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 return; | 846 return; |
847 } | 847 } |
848 if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY) && | 848 if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY) && |
849 m_bpc == 8 && m_bDefaultDecode) { | 849 m_bpc == 8 && m_bDefaultDecode) { |
850 } else { | 850 } else { |
851 int palette_count = 1 << (m_bpc * m_nComponents); | 851 int palette_count = 1 << (m_bpc * m_nComponents); |
852 CFX_FixedBufGrow<FX_FLOAT, 16> color_values(m_nComponents); | 852 CFX_FixedBufGrow<FX_FLOAT, 16> color_values(m_nComponents); |
853 FX_FLOAT* color_value = color_values; | 853 FX_FLOAT* color_value = color_values; |
854 for (int i = 0; i < palette_count; i++) { | 854 for (int i = 0; i < palette_count; i++) { |
855 int color_data = i; | 855 int color_data = i; |
856 for (FX_DWORD j = 0; j < m_nComponents; j++) { | 856 for (uint32_t j = 0; j < m_nComponents; j++) { |
857 int encoded_component = color_data % (1 << m_bpc); | 857 int encoded_component = color_data % (1 << m_bpc); |
858 color_data /= 1 << m_bpc; | 858 color_data /= 1 << m_bpc; |
859 color_value[j] = m_pCompData[j].m_DecodeMin + | 859 color_value[j] = m_pCompData[j].m_DecodeMin + |
860 m_pCompData[j].m_DecodeStep * encoded_component; | 860 m_pCompData[j].m_DecodeStep * encoded_component; |
861 } | 861 } |
862 FX_FLOAT R = 0, G = 0, B = 0; | 862 FX_FLOAT R = 0, G = 0, B = 0; |
863 if (m_nComponents == 1 && m_Family == PDFCS_ICCBASED && | 863 if (m_nComponents == 1 && m_Family == PDFCS_ICCBASED && |
864 m_pColorSpace->CountComponents() > 1) { | 864 m_pColorSpace->CountComponents() > 1) { |
865 int nComponents = m_pColorSpace->CountComponents(); | 865 int nComponents = m_pColorSpace->CountComponents(); |
866 std::vector<FX_FLOAT> temp_buf(nComponents); | 866 std::vector<FX_FLOAT> temp_buf(nComponents); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
965 return; | 965 return; |
966 } | 966 } |
967 } | 967 } |
968 CFX_FixedBufGrow<FX_FLOAT, 16> color_values1(m_nComponents); | 968 CFX_FixedBufGrow<FX_FLOAT, 16> color_values1(m_nComponents); |
969 FX_FLOAT* color_values = color_values1; | 969 FX_FLOAT* color_values = color_values1; |
970 FX_FLOAT R = 0.0f, G = 0.0f, B = 0.0f; | 970 FX_FLOAT R = 0.0f, G = 0.0f, B = 0.0f; |
971 if (m_bpc == 8) { | 971 if (m_bpc == 8) { |
972 uint64_t src_byte_pos = 0; | 972 uint64_t src_byte_pos = 0; |
973 size_t dest_byte_pos = 0; | 973 size_t dest_byte_pos = 0; |
974 for (int column = 0; column < m_Width; column++) { | 974 for (int column = 0; column < m_Width; column++) { |
975 for (FX_DWORD color = 0; color < m_nComponents; color++) { | 975 for (uint32_t color = 0; color < m_nComponents; color++) { |
976 uint8_t data = src_scan[src_byte_pos++]; | 976 uint8_t data = src_scan[src_byte_pos++]; |
977 color_values[color] = m_pCompData[color].m_DecodeMin + | 977 color_values[color] = m_pCompData[color].m_DecodeMin + |
978 m_pCompData[color].m_DecodeStep * data; | 978 m_pCompData[color].m_DecodeStep * data; |
979 } | 979 } |
980 if (TransMask()) { | 980 if (TransMask()) { |
981 FX_FLOAT k = 1.0f - color_values[3]; | 981 FX_FLOAT k = 1.0f - color_values[3]; |
982 R = (1.0f - color_values[0]) * k; | 982 R = (1.0f - color_values[0]) * k; |
983 G = (1.0f - color_values[1]) * k; | 983 G = (1.0f - color_values[1]) * k; |
984 B = (1.0f - color_values[2]) * k; | 984 B = (1.0f - color_values[2]) * k; |
985 } else { | 985 } else { |
986 m_pColorSpace->GetRGB(color_values, R, G, B); | 986 m_pColorSpace->GetRGB(color_values, R, G, B); |
987 } | 987 } |
988 R = ClampValue(R, 1.0f); | 988 R = ClampValue(R, 1.0f); |
989 G = ClampValue(G, 1.0f); | 989 G = ClampValue(G, 1.0f); |
990 B = ClampValue(B, 1.0f); | 990 B = ClampValue(B, 1.0f); |
991 dest_scan[dest_byte_pos] = static_cast<uint8_t>(B * 255); | 991 dest_scan[dest_byte_pos] = static_cast<uint8_t>(B * 255); |
992 dest_scan[dest_byte_pos + 1] = static_cast<uint8_t>(G * 255); | 992 dest_scan[dest_byte_pos + 1] = static_cast<uint8_t>(G * 255); |
993 dest_scan[dest_byte_pos + 2] = static_cast<uint8_t>(R * 255); | 993 dest_scan[dest_byte_pos + 2] = static_cast<uint8_t>(R * 255); |
994 dest_byte_pos += 3; | 994 dest_byte_pos += 3; |
995 } | 995 } |
996 } else { | 996 } else { |
997 uint64_t src_bit_pos = 0; | 997 uint64_t src_bit_pos = 0; |
998 size_t dest_byte_pos = 0; | 998 size_t dest_byte_pos = 0; |
999 for (int column = 0; column < m_Width; column++) { | 999 for (int column = 0; column < m_Width; column++) { |
1000 for (FX_DWORD color = 0; color < m_nComponents; color++) { | 1000 for (uint32_t color = 0; color < m_nComponents; color++) { |
1001 unsigned int data = GetBits8(src_scan, src_bit_pos, m_bpc); | 1001 unsigned int data = GetBits8(src_scan, src_bit_pos, m_bpc); |
1002 color_values[color] = m_pCompData[color].m_DecodeMin + | 1002 color_values[color] = m_pCompData[color].m_DecodeMin + |
1003 m_pCompData[color].m_DecodeStep * data; | 1003 m_pCompData[color].m_DecodeStep * data; |
1004 src_bit_pos += m_bpc; | 1004 src_bit_pos += m_bpc; |
1005 } | 1005 } |
1006 if (TransMask()) { | 1006 if (TransMask()) { |
1007 FX_FLOAT k = 1.0f - color_values[3]; | 1007 FX_FLOAT k = 1.0f - color_values[3]; |
1008 R = (1.0f - color_values[0]) * k; | 1008 R = (1.0f - color_values[0]) * k; |
1009 G = (1.0f - color_values[1]) * k; | 1009 G = (1.0f - color_values[1]) * k; |
1010 B = (1.0f - color_values[2]) * k; | 1010 B = (1.0f - color_values[2]) * k; |
(...skipping 15 matching lines...) Expand all Loading... |
1026 return m_pCachedBitmap ? m_pCachedBitmap->GetBuffer() : nullptr; | 1026 return m_pCachedBitmap ? m_pCachedBitmap->GetBuffer() : nullptr; |
1027 } | 1027 } |
1028 | 1028 |
1029 const uint8_t* CPDF_DIBSource::GetScanline(int line) const { | 1029 const uint8_t* CPDF_DIBSource::GetScanline(int line) const { |
1030 if (m_bpc == 0) { | 1030 if (m_bpc == 0) { |
1031 return nullptr; | 1031 return nullptr; |
1032 } | 1032 } |
1033 FX_SAFE_DWORD src_pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width); | 1033 FX_SAFE_DWORD src_pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width); |
1034 if (!src_pitch.IsValid()) | 1034 if (!src_pitch.IsValid()) |
1035 return nullptr; | 1035 return nullptr; |
1036 FX_DWORD src_pitch_value = src_pitch.ValueOrDie(); | 1036 uint32_t src_pitch_value = src_pitch.ValueOrDie(); |
1037 const uint8_t* pSrcLine = nullptr; | 1037 const uint8_t* pSrcLine = nullptr; |
1038 if (m_pCachedBitmap && src_pitch_value <= m_pCachedBitmap->GetPitch()) { | 1038 if (m_pCachedBitmap && src_pitch_value <= m_pCachedBitmap->GetPitch()) { |
1039 if (line >= m_pCachedBitmap->GetHeight()) { | 1039 if (line >= m_pCachedBitmap->GetHeight()) { |
1040 line = m_pCachedBitmap->GetHeight() - 1; | 1040 line = m_pCachedBitmap->GetHeight() - 1; |
1041 } | 1041 } |
1042 pSrcLine = m_pCachedBitmap->GetScanline(line); | 1042 pSrcLine = m_pCachedBitmap->GetScanline(line); |
1043 } else if (m_pDecoder) { | 1043 } else if (m_pDecoder) { |
1044 pSrcLine = m_pDecoder->GetScanline(line); | 1044 pSrcLine = m_pDecoder->GetScanline(line); |
1045 } else { | 1045 } else { |
1046 if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch_value) { | 1046 if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch_value) { |
1047 pSrcLine = m_pStreamAcc->GetData() + line * src_pitch_value; | 1047 pSrcLine = m_pStreamAcc->GetData() + line * src_pitch_value; |
1048 } | 1048 } |
1049 } | 1049 } |
1050 if (!pSrcLine) { | 1050 if (!pSrcLine) { |
1051 uint8_t* pLineBuf = m_pMaskedLine ? m_pMaskedLine : m_pLineBuf; | 1051 uint8_t* pLineBuf = m_pMaskedLine ? m_pMaskedLine : m_pLineBuf; |
1052 FXSYS_memset(pLineBuf, 0xFF, m_Pitch); | 1052 FXSYS_memset(pLineBuf, 0xFF, m_Pitch); |
1053 return pLineBuf; | 1053 return pLineBuf; |
1054 } | 1054 } |
1055 if (m_bpc * m_nComponents == 1) { | 1055 if (m_bpc * m_nComponents == 1) { |
1056 if (m_bImageMask && m_bDefaultDecode) { | 1056 if (m_bImageMask && m_bDefaultDecode) { |
1057 for (FX_DWORD i = 0; i < src_pitch_value; i++) { | 1057 for (uint32_t i = 0; i < src_pitch_value; i++) { |
1058 m_pLineBuf[i] = ~pSrcLine[i]; | 1058 m_pLineBuf[i] = ~pSrcLine[i]; |
1059 } | 1059 } |
1060 } else if (m_bColorKey) { | 1060 } else if (m_bColorKey) { |
1061 FX_DWORD reset_argb, set_argb; | 1061 uint32_t reset_argb, set_argb; |
1062 reset_argb = m_pPalette ? m_pPalette[0] : 0xFF000000; | 1062 reset_argb = m_pPalette ? m_pPalette[0] : 0xFF000000; |
1063 set_argb = m_pPalette ? m_pPalette[1] : 0xFFFFFFFF; | 1063 set_argb = m_pPalette ? m_pPalette[1] : 0xFFFFFFFF; |
1064 if (m_pCompData[0].m_ColorKeyMin == 0) { | 1064 if (m_pCompData[0].m_ColorKeyMin == 0) { |
1065 reset_argb = 0; | 1065 reset_argb = 0; |
1066 } | 1066 } |
1067 if (m_pCompData[0].m_ColorKeyMax == 1) { | 1067 if (m_pCompData[0].m_ColorKeyMax == 1) { |
1068 set_argb = 0; | 1068 set_argb = 0; |
1069 } | 1069 } |
1070 set_argb = FXARGB_TODIB(set_argb); | 1070 set_argb = FXARGB_TODIB(set_argb); |
1071 reset_argb = FXARGB_TODIB(reset_argb); | 1071 reset_argb = FXARGB_TODIB(reset_argb); |
1072 FX_DWORD* dest_scan = reinterpret_cast<FX_DWORD*>(m_pMaskedLine); | 1072 uint32_t* dest_scan = reinterpret_cast<uint32_t*>(m_pMaskedLine); |
1073 for (int col = 0; col < m_Width; col++) { | 1073 for (int col = 0; col < m_Width; col++) { |
1074 if (pSrcLine[col / 8] & (1 << (7 - col % 8))) { | 1074 if (pSrcLine[col / 8] & (1 << (7 - col % 8))) { |
1075 *dest_scan = set_argb; | 1075 *dest_scan = set_argb; |
1076 } else { | 1076 } else { |
1077 *dest_scan = reset_argb; | 1077 *dest_scan = reset_argb; |
1078 } | 1078 } |
1079 dest_scan++; | 1079 dest_scan++; |
1080 } | 1080 } |
1081 return m_pMaskedLine; | 1081 return m_pMaskedLine; |
1082 } else { | 1082 } else { |
1083 FXSYS_memcpy(m_pLineBuf, pSrcLine, src_pitch_value); | 1083 FXSYS_memcpy(m_pLineBuf, pSrcLine, src_pitch_value); |
1084 } | 1084 } |
1085 return m_pLineBuf; | 1085 return m_pLineBuf; |
1086 } | 1086 } |
1087 if (m_bpc * m_nComponents <= 8) { | 1087 if (m_bpc * m_nComponents <= 8) { |
1088 if (m_bpc == 8) { | 1088 if (m_bpc == 8) { |
1089 FXSYS_memcpy(m_pLineBuf, pSrcLine, src_pitch_value); | 1089 FXSYS_memcpy(m_pLineBuf, pSrcLine, src_pitch_value); |
1090 } else { | 1090 } else { |
1091 uint64_t src_bit_pos = 0; | 1091 uint64_t src_bit_pos = 0; |
1092 for (int col = 0; col < m_Width; col++) { | 1092 for (int col = 0; col < m_Width; col++) { |
1093 unsigned int color_index = 0; | 1093 unsigned int color_index = 0; |
1094 for (FX_DWORD color = 0; color < m_nComponents; color++) { | 1094 for (uint32_t color = 0; color < m_nComponents; color++) { |
1095 unsigned int data = GetBits8(pSrcLine, src_bit_pos, m_bpc); | 1095 unsigned int data = GetBits8(pSrcLine, src_bit_pos, m_bpc); |
1096 color_index |= data << (color * m_bpc); | 1096 color_index |= data << (color * m_bpc); |
1097 src_bit_pos += m_bpc; | 1097 src_bit_pos += m_bpc; |
1098 } | 1098 } |
1099 m_pLineBuf[col] = color_index; | 1099 m_pLineBuf[col] = color_index; |
1100 } | 1100 } |
1101 } | 1101 } |
1102 if (m_bColorKey) { | 1102 if (m_bColorKey) { |
1103 uint8_t* pDestPixel = m_pMaskedLine; | 1103 uint8_t* pDestPixel = m_pMaskedLine; |
1104 const uint8_t* pSrcPixel = m_pLineBuf; | 1104 const uint8_t* pSrcPixel = m_pLineBuf; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 int dest_bpp, | 1168 int dest_bpp, |
1169 int dest_width, | 1169 int dest_width, |
1170 FX_BOOL bFlipX, | 1170 FX_BOOL bFlipX, |
1171 int clip_left, | 1171 int clip_left, |
1172 int clip_width) const { | 1172 int clip_width) const { |
1173 if (line < 0 || !dest_scan || dest_bpp <= 0 || dest_width <= 0 || | 1173 if (line < 0 || !dest_scan || dest_bpp <= 0 || dest_width <= 0 || |
1174 clip_left < 0 || clip_width <= 0) { | 1174 clip_left < 0 || clip_width <= 0) { |
1175 return; | 1175 return; |
1176 } | 1176 } |
1177 | 1177 |
1178 FX_DWORD src_width = m_Width; | 1178 uint32_t src_width = m_Width; |
1179 FX_SAFE_DWORD pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width); | 1179 FX_SAFE_DWORD pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width); |
1180 if (!pitch.IsValid()) | 1180 if (!pitch.IsValid()) |
1181 return; | 1181 return; |
1182 | 1182 |
1183 const uint8_t* pSrcLine = nullptr; | 1183 const uint8_t* pSrcLine = nullptr; |
1184 if (m_pCachedBitmap) { | 1184 if (m_pCachedBitmap) { |
1185 pSrcLine = m_pCachedBitmap->GetScanline(line); | 1185 pSrcLine = m_pCachedBitmap->GetScanline(line); |
1186 } else if (m_pDecoder) { | 1186 } else if (m_pDecoder) { |
1187 pSrcLine = m_pDecoder->GetScanline(line); | 1187 pSrcLine = m_pDecoder->GetScanline(line); |
1188 } else { | 1188 } else { |
1189 FX_DWORD src_pitch = pitch.ValueOrDie(); | 1189 uint32_t src_pitch = pitch.ValueOrDie(); |
1190 pitch *= (line + 1); | 1190 pitch *= (line + 1); |
1191 if (!pitch.IsValid()) { | 1191 if (!pitch.IsValid()) { |
1192 return; | 1192 return; |
1193 } | 1193 } |
1194 | 1194 |
1195 if (m_pStreamAcc->GetSize() >= pitch.ValueOrDie()) { | 1195 if (m_pStreamAcc->GetSize() >= pitch.ValueOrDie()) { |
1196 pSrcLine = m_pStreamAcc->GetData() + line * src_pitch; | 1196 pSrcLine = m_pStreamAcc->GetData() + line * src_pitch; |
1197 } | 1197 } |
1198 } | 1198 } |
1199 int orig_Bpp = m_bpc * m_nComponents / 8; | 1199 int orig_Bpp = m_bpc * m_nComponents / 8; |
(...skipping 17 matching lines...) Expand all Loading... |
1217 DownSampleScanline8Bit(orig_Bpp, dest_Bpp, src_width, pSrcLine, dest_scan, | 1217 DownSampleScanline8Bit(orig_Bpp, dest_Bpp, src_width, pSrcLine, dest_scan, |
1218 dest_width, bFlipX, clip_left, clip_width); | 1218 dest_width, bFlipX, clip_left, clip_width); |
1219 } else { | 1219 } else { |
1220 DownSampleScanline32Bit(orig_Bpp, dest_Bpp, src_width, pSrcLine, dest_scan, | 1220 DownSampleScanline32Bit(orig_Bpp, dest_Bpp, src_width, pSrcLine, dest_scan, |
1221 dest_width, bFlipX, clip_left, clip_width); | 1221 dest_width, bFlipX, clip_left, clip_width); |
1222 } | 1222 } |
1223 } | 1223 } |
1224 | 1224 |
1225 void CPDF_DIBSource::DownSampleScanline1Bit(int orig_Bpp, | 1225 void CPDF_DIBSource::DownSampleScanline1Bit(int orig_Bpp, |
1226 int dest_Bpp, | 1226 int dest_Bpp, |
1227 FX_DWORD src_width, | 1227 uint32_t src_width, |
1228 const uint8_t* pSrcLine, | 1228 const uint8_t* pSrcLine, |
1229 uint8_t* dest_scan, | 1229 uint8_t* dest_scan, |
1230 int dest_width, | 1230 int dest_width, |
1231 FX_BOOL bFlipX, | 1231 FX_BOOL bFlipX, |
1232 int clip_left, | 1232 int clip_left, |
1233 int clip_width) const { | 1233 int clip_width) const { |
1234 FX_DWORD set_argb = (FX_DWORD)-1; | 1234 uint32_t set_argb = (uint32_t)-1; |
1235 FX_DWORD reset_argb = 0; | 1235 uint32_t reset_argb = 0; |
1236 if (m_bImageMask) { | 1236 if (m_bImageMask) { |
1237 if (m_bDefaultDecode) { | 1237 if (m_bDefaultDecode) { |
1238 set_argb = 0; | 1238 set_argb = 0; |
1239 reset_argb = (FX_DWORD)-1; | 1239 reset_argb = (uint32_t)-1; |
1240 } | 1240 } |
1241 } else if (m_bColorKey) { | 1241 } else if (m_bColorKey) { |
1242 reset_argb = m_pPalette ? m_pPalette[0] : 0xFF000000; | 1242 reset_argb = m_pPalette ? m_pPalette[0] : 0xFF000000; |
1243 set_argb = m_pPalette ? m_pPalette[1] : 0xFFFFFFFF; | 1243 set_argb = m_pPalette ? m_pPalette[1] : 0xFFFFFFFF; |
1244 if (m_pCompData[0].m_ColorKeyMin == 0) { | 1244 if (m_pCompData[0].m_ColorKeyMin == 0) { |
1245 reset_argb = 0; | 1245 reset_argb = 0; |
1246 } | 1246 } |
1247 if (m_pCompData[0].m_ColorKeyMax == 1) { | 1247 if (m_pCompData[0].m_ColorKeyMax == 1) { |
1248 set_argb = 0; | 1248 set_argb = 0; |
1249 } | 1249 } |
1250 set_argb = FXARGB_TODIB(set_argb); | 1250 set_argb = FXARGB_TODIB(set_argb); |
1251 reset_argb = FXARGB_TODIB(reset_argb); | 1251 reset_argb = FXARGB_TODIB(reset_argb); |
1252 FX_DWORD* dest_scan_dword = reinterpret_cast<FX_DWORD*>(dest_scan); | 1252 uint32_t* dest_scan_dword = reinterpret_cast<uint32_t*>(dest_scan); |
1253 for (int i = 0; i < clip_width; i++) { | 1253 for (int i = 0; i < clip_width; i++) { |
1254 FX_DWORD src_x = (clip_left + i) * src_width / dest_width; | 1254 uint32_t src_x = (clip_left + i) * src_width / dest_width; |
1255 if (bFlipX) { | 1255 if (bFlipX) { |
1256 src_x = src_width - src_x - 1; | 1256 src_x = src_width - src_x - 1; |
1257 } | 1257 } |
1258 src_x %= src_width; | 1258 src_x %= src_width; |
1259 if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) { | 1259 if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) { |
1260 dest_scan_dword[i] = set_argb; | 1260 dest_scan_dword[i] = set_argb; |
1261 } else { | 1261 } else { |
1262 dest_scan_dword[i] = reset_argb; | 1262 dest_scan_dword[i] = reset_argb; |
1263 } | 1263 } |
1264 } | 1264 } |
1265 return; | 1265 return; |
1266 } else { | 1266 } else { |
1267 if (dest_Bpp == 1) { | 1267 if (dest_Bpp == 1) { |
1268 } else if (m_pPalette) { | 1268 } else if (m_pPalette) { |
1269 reset_argb = m_pPalette[0]; | 1269 reset_argb = m_pPalette[0]; |
1270 set_argb = m_pPalette[1]; | 1270 set_argb = m_pPalette[1]; |
1271 } | 1271 } |
1272 } | 1272 } |
1273 for (int i = 0; i < clip_width; i++) { | 1273 for (int i = 0; i < clip_width; i++) { |
1274 FX_DWORD src_x = (clip_left + i) * src_width / dest_width; | 1274 uint32_t src_x = (clip_left + i) * src_width / dest_width; |
1275 if (bFlipX) { | 1275 if (bFlipX) { |
1276 src_x = src_width - src_x - 1; | 1276 src_x = src_width - src_x - 1; |
1277 } | 1277 } |
1278 src_x %= src_width; | 1278 src_x %= src_width; |
1279 int dest_pos = i * dest_Bpp; | 1279 int dest_pos = i * dest_Bpp; |
1280 if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) { | 1280 if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) { |
1281 if (dest_Bpp == 1) { | 1281 if (dest_Bpp == 1) { |
1282 dest_scan[dest_pos] = static_cast<uint8_t>(set_argb); | 1282 dest_scan[dest_pos] = static_cast<uint8_t>(set_argb); |
1283 } else if (dest_Bpp == 3) { | 1283 } else if (dest_Bpp == 3) { |
1284 dest_scan[dest_pos] = FXARGB_B(set_argb); | 1284 dest_scan[dest_pos] = FXARGB_B(set_argb); |
1285 dest_scan[dest_pos + 1] = FXARGB_G(set_argb); | 1285 dest_scan[dest_pos + 1] = FXARGB_G(set_argb); |
1286 dest_scan[dest_pos + 2] = FXARGB_R(set_argb); | 1286 dest_scan[dest_pos + 2] = FXARGB_R(set_argb); |
1287 } else { | 1287 } else { |
1288 *reinterpret_cast<FX_DWORD*>(dest_scan + dest_pos) = set_argb; | 1288 *reinterpret_cast<uint32_t*>(dest_scan + dest_pos) = set_argb; |
1289 } | 1289 } |
1290 } else { | 1290 } else { |
1291 if (dest_Bpp == 1) { | 1291 if (dest_Bpp == 1) { |
1292 dest_scan[dest_pos] = static_cast<uint8_t>(reset_argb); | 1292 dest_scan[dest_pos] = static_cast<uint8_t>(reset_argb); |
1293 } else if (dest_Bpp == 3) { | 1293 } else if (dest_Bpp == 3) { |
1294 dest_scan[dest_pos] = FXARGB_B(reset_argb); | 1294 dest_scan[dest_pos] = FXARGB_B(reset_argb); |
1295 dest_scan[dest_pos + 1] = FXARGB_G(reset_argb); | 1295 dest_scan[dest_pos + 1] = FXARGB_G(reset_argb); |
1296 dest_scan[dest_pos + 2] = FXARGB_R(reset_argb); | 1296 dest_scan[dest_pos + 2] = FXARGB_R(reset_argb); |
1297 } else { | 1297 } else { |
1298 *reinterpret_cast<FX_DWORD*>(dest_scan + dest_pos) = reset_argb; | 1298 *reinterpret_cast<uint32_t*>(dest_scan + dest_pos) = reset_argb; |
1299 } | 1299 } |
1300 } | 1300 } |
1301 } | 1301 } |
1302 } | 1302 } |
1303 | 1303 |
1304 void CPDF_DIBSource::DownSampleScanline8Bit(int orig_Bpp, | 1304 void CPDF_DIBSource::DownSampleScanline8Bit(int orig_Bpp, |
1305 int dest_Bpp, | 1305 int dest_Bpp, |
1306 FX_DWORD src_width, | 1306 uint32_t src_width, |
1307 const uint8_t* pSrcLine, | 1307 const uint8_t* pSrcLine, |
1308 uint8_t* dest_scan, | 1308 uint8_t* dest_scan, |
1309 int dest_width, | 1309 int dest_width, |
1310 FX_BOOL bFlipX, | 1310 FX_BOOL bFlipX, |
1311 int clip_left, | 1311 int clip_left, |
1312 int clip_width) const { | 1312 int clip_width) const { |
1313 if (m_bpc < 8) { | 1313 if (m_bpc < 8) { |
1314 uint64_t src_bit_pos = 0; | 1314 uint64_t src_bit_pos = 0; |
1315 for (FX_DWORD col = 0; col < src_width; col++) { | 1315 for (uint32_t col = 0; col < src_width; col++) { |
1316 unsigned int color_index = 0; | 1316 unsigned int color_index = 0; |
1317 for (FX_DWORD color = 0; color < m_nComponents; color++) { | 1317 for (uint32_t color = 0; color < m_nComponents; color++) { |
1318 unsigned int data = GetBits8(pSrcLine, src_bit_pos, m_bpc); | 1318 unsigned int data = GetBits8(pSrcLine, src_bit_pos, m_bpc); |
1319 color_index |= data << (color * m_bpc); | 1319 color_index |= data << (color * m_bpc); |
1320 src_bit_pos += m_bpc; | 1320 src_bit_pos += m_bpc; |
1321 } | 1321 } |
1322 m_pLineBuf[col] = color_index; | 1322 m_pLineBuf[col] = color_index; |
1323 } | 1323 } |
1324 pSrcLine = m_pLineBuf; | 1324 pSrcLine = m_pLineBuf; |
1325 } | 1325 } |
1326 if (m_bColorKey) { | 1326 if (m_bColorKey) { |
1327 for (int i = 0; i < clip_width; i++) { | 1327 for (int i = 0; i < clip_width; i++) { |
1328 FX_DWORD src_x = (clip_left + i) * src_width / dest_width; | 1328 uint32_t src_x = (clip_left + i) * src_width / dest_width; |
1329 if (bFlipX) { | 1329 if (bFlipX) { |
1330 src_x = src_width - src_x - 1; | 1330 src_x = src_width - src_x - 1; |
1331 } | 1331 } |
1332 src_x %= src_width; | 1332 src_x %= src_width; |
1333 uint8_t* pDestPixel = dest_scan + i * 4; | 1333 uint8_t* pDestPixel = dest_scan + i * 4; |
1334 uint8_t index = pSrcLine[src_x]; | 1334 uint8_t index = pSrcLine[src_x]; |
1335 if (m_pPalette) { | 1335 if (m_pPalette) { |
1336 *pDestPixel++ = FXARGB_B(m_pPalette[index]); | 1336 *pDestPixel++ = FXARGB_B(m_pPalette[index]); |
1337 *pDestPixel++ = FXARGB_G(m_pPalette[index]); | 1337 *pDestPixel++ = FXARGB_G(m_pPalette[index]); |
1338 *pDestPixel++ = FXARGB_R(m_pPalette[index]); | 1338 *pDestPixel++ = FXARGB_R(m_pPalette[index]); |
1339 } else { | 1339 } else { |
1340 *pDestPixel++ = index; | 1340 *pDestPixel++ = index; |
1341 *pDestPixel++ = index; | 1341 *pDestPixel++ = index; |
1342 *pDestPixel++ = index; | 1342 *pDestPixel++ = index; |
1343 } | 1343 } |
1344 *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || | 1344 *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || |
1345 index > m_pCompData[0].m_ColorKeyMax) | 1345 index > m_pCompData[0].m_ColorKeyMax) |
1346 ? 0xFF | 1346 ? 0xFF |
1347 : 0; | 1347 : 0; |
1348 } | 1348 } |
1349 return; | 1349 return; |
1350 } | 1350 } |
1351 for (int i = 0; i < clip_width; i++) { | 1351 for (int i = 0; i < clip_width; i++) { |
1352 FX_DWORD src_x = (clip_left + i) * src_width / dest_width; | 1352 uint32_t src_x = (clip_left + i) * src_width / dest_width; |
1353 if (bFlipX) { | 1353 if (bFlipX) { |
1354 src_x = src_width - src_x - 1; | 1354 src_x = src_width - src_x - 1; |
1355 } | 1355 } |
1356 src_x %= src_width; | 1356 src_x %= src_width; |
1357 uint8_t index = pSrcLine[src_x]; | 1357 uint8_t index = pSrcLine[src_x]; |
1358 if (dest_Bpp == 1) { | 1358 if (dest_Bpp == 1) { |
1359 dest_scan[i] = index; | 1359 dest_scan[i] = index; |
1360 } else { | 1360 } else { |
1361 int dest_pos = i * dest_Bpp; | 1361 int dest_pos = i * dest_Bpp; |
1362 FX_ARGB argb = m_pPalette[index]; | 1362 FX_ARGB argb = m_pPalette[index]; |
1363 dest_scan[dest_pos] = FXARGB_B(argb); | 1363 dest_scan[dest_pos] = FXARGB_B(argb); |
1364 dest_scan[dest_pos + 1] = FXARGB_G(argb); | 1364 dest_scan[dest_pos + 1] = FXARGB_G(argb); |
1365 dest_scan[dest_pos + 2] = FXARGB_R(argb); | 1365 dest_scan[dest_pos + 2] = FXARGB_R(argb); |
1366 } | 1366 } |
1367 } | 1367 } |
1368 } | 1368 } |
1369 | 1369 |
1370 void CPDF_DIBSource::DownSampleScanline32Bit(int orig_Bpp, | 1370 void CPDF_DIBSource::DownSampleScanline32Bit(int orig_Bpp, |
1371 int dest_Bpp, | 1371 int dest_Bpp, |
1372 FX_DWORD src_width, | 1372 uint32_t src_width, |
1373 const uint8_t* pSrcLine, | 1373 const uint8_t* pSrcLine, |
1374 uint8_t* dest_scan, | 1374 uint8_t* dest_scan, |
1375 int dest_width, | 1375 int dest_width, |
1376 FX_BOOL bFlipX, | 1376 FX_BOOL bFlipX, |
1377 int clip_left, | 1377 int clip_left, |
1378 int clip_width) const { | 1378 int clip_width) const { |
1379 // last_src_x used to store the last seen src_x position which should be | 1379 // last_src_x used to store the last seen src_x position which should be |
1380 // in [0, src_width). Set the initial value to be an invalid src_x value. | 1380 // in [0, src_width). Set the initial value to be an invalid src_x value. |
1381 FX_DWORD last_src_x = src_width; | 1381 uint32_t last_src_x = src_width; |
1382 FX_ARGB last_argb = FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF); | 1382 FX_ARGB last_argb = FXARGB_MAKE(0xFF, 0xFF, 0xFF, 0xFF); |
1383 FX_FLOAT unit_To8Bpc = 255.0f / ((1 << m_bpc) - 1); | 1383 FX_FLOAT unit_To8Bpc = 255.0f / ((1 << m_bpc) - 1); |
1384 for (int i = 0; i < clip_width; i++) { | 1384 for (int i = 0; i < clip_width; i++) { |
1385 int dest_x = clip_left + i; | 1385 int dest_x = clip_left + i; |
1386 FX_DWORD src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) * | 1386 uint32_t src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) * |
1387 (int64_t)src_width / dest_width; | 1387 (int64_t)src_width / dest_width; |
1388 src_x %= src_width; | 1388 src_x %= src_width; |
1389 | 1389 |
1390 uint8_t* pDestPixel = dest_scan + i * dest_Bpp; | 1390 uint8_t* pDestPixel = dest_scan + i * dest_Bpp; |
1391 FX_ARGB argb; | 1391 FX_ARGB argb; |
1392 if (src_x == last_src_x) { | 1392 if (src_x == last_src_x) { |
1393 argb = last_argb; | 1393 argb = last_argb; |
1394 } else { | 1394 } else { |
1395 CFX_FixedBufGrow<uint8_t, 128> extracted_components(m_nComponents); | 1395 CFX_FixedBufGrow<uint8_t, 128> extracted_components(m_nComponents); |
1396 const uint8_t* pSrcPixel = nullptr; | 1396 const uint8_t* pSrcPixel = nullptr; |
1397 if (m_bpc % 8 != 0) { | 1397 if (m_bpc % 8 != 0) { |
1398 // No need to check for 32-bit overflow, as |src_x| is bounded by | 1398 // No need to check for 32-bit overflow, as |src_x| is bounded by |
1399 // |src_width| and DownSampleScanline() already checked for overflow | 1399 // |src_width| and DownSampleScanline() already checked for overflow |
1400 // with the pitch calculation. | 1400 // with the pitch calculation. |
1401 size_t num_bits = src_x * m_bpc * m_nComponents; | 1401 size_t num_bits = src_x * m_bpc * m_nComponents; |
1402 uint64_t src_bit_pos = num_bits % 8; | 1402 uint64_t src_bit_pos = num_bits % 8; |
1403 pSrcPixel = pSrcLine + num_bits / 8; | 1403 pSrcPixel = pSrcLine + num_bits / 8; |
1404 for (FX_DWORD j = 0; j < m_nComponents; ++j) { | 1404 for (uint32_t j = 0; j < m_nComponents; ++j) { |
1405 extracted_components[j] = static_cast<uint8_t>( | 1405 extracted_components[j] = static_cast<uint8_t>( |
1406 GetBits8(pSrcPixel, src_bit_pos, m_bpc) * unit_To8Bpc); | 1406 GetBits8(pSrcPixel, src_bit_pos, m_bpc) * unit_To8Bpc); |
1407 src_bit_pos += m_bpc; | 1407 src_bit_pos += m_bpc; |
1408 } | 1408 } |
1409 pSrcPixel = extracted_components; | 1409 pSrcPixel = extracted_components; |
1410 } else { | 1410 } else { |
1411 pSrcPixel = pSrcLine + src_x * orig_Bpp; | 1411 pSrcPixel = pSrcLine + src_x * orig_Bpp; |
1412 if (m_bpc == 16) { | 1412 if (m_bpc == 16) { |
1413 for (FX_DWORD j = 0; j < m_nComponents; ++j) | 1413 for (uint32_t j = 0; j < m_nComponents; ++j) |
1414 extracted_components[j] = pSrcPixel[j * 2]; | 1414 extracted_components[j] = pSrcPixel[j * 2]; |
1415 pSrcPixel = extracted_components; | 1415 pSrcPixel = extracted_components; |
1416 } | 1416 } |
1417 } | 1417 } |
1418 | 1418 |
1419 if (m_pColorSpace) { | 1419 if (m_pColorSpace) { |
1420 uint8_t color[4]; | 1420 uint8_t color[4]; |
1421 const FX_BOOL bTransMask = TransMask(); | 1421 const FX_BOOL bTransMask = TransMask(); |
1422 if (m_bDefaultDecode) { | 1422 if (m_bDefaultDecode) { |
1423 m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0, | 1423 m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0, |
1424 bTransMask); | 1424 bTransMask); |
1425 } else { | 1425 } else { |
1426 for (FX_DWORD j = 0; j < m_nComponents; ++j) { | 1426 for (uint32_t j = 0; j < m_nComponents; ++j) { |
1427 FX_FLOAT component_value = | 1427 FX_FLOAT component_value = |
1428 static_cast<FX_FLOAT>(extracted_components[j]); | 1428 static_cast<FX_FLOAT>(extracted_components[j]); |
1429 int color_value = static_cast<int>( | 1429 int color_value = static_cast<int>( |
1430 (m_pCompData[j].m_DecodeMin + | 1430 (m_pCompData[j].m_DecodeMin + |
1431 m_pCompData[j].m_DecodeStep * component_value) * | 1431 m_pCompData[j].m_DecodeStep * component_value) * |
1432 255.0f + | 1432 255.0f + |
1433 0.5f); | 1433 0.5f); |
1434 extracted_components[j] = | 1434 extracted_components[j] = |
1435 color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value); | 1435 color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value); |
1436 } | 1436 } |
(...skipping 16 matching lines...) Expand all Loading... |
1453 ? 0xFF | 1453 ? 0xFF |
1454 : 0; | 1454 : 0; |
1455 } | 1455 } |
1456 argb &= 0xFFFFFF; | 1456 argb &= 0xFFFFFF; |
1457 argb |= alpha << 24; | 1457 argb |= alpha << 24; |
1458 } | 1458 } |
1459 last_src_x = src_x; | 1459 last_src_x = src_x; |
1460 last_argb = argb; | 1460 last_argb = argb; |
1461 } | 1461 } |
1462 if (dest_Bpp == 4) { | 1462 if (dest_Bpp == 4) { |
1463 *reinterpret_cast<FX_DWORD*>(pDestPixel) = FXARGB_TODIB(argb); | 1463 *reinterpret_cast<uint32_t*>(pDestPixel) = FXARGB_TODIB(argb); |
1464 } else { | 1464 } else { |
1465 *pDestPixel++ = FXARGB_B(argb); | 1465 *pDestPixel++ = FXARGB_B(argb); |
1466 *pDestPixel++ = FXARGB_G(argb); | 1466 *pDestPixel++ = FXARGB_G(argb); |
1467 *pDestPixel = FXARGB_R(argb); | 1467 *pDestPixel = FXARGB_R(argb); |
1468 } | 1468 } |
1469 } | 1469 } |
1470 } | 1470 } |
1471 | 1471 |
1472 FX_BOOL CPDF_DIBSource::TransMask() const { | 1472 FX_BOOL CPDF_DIBSource::TransMask() const { |
1473 return m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && | 1473 return m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && |
(...skipping 19 matching lines...) Expand all Loading... |
1493 m_pCache = nullptr; | 1493 m_pCache = nullptr; |
1494 m_pImage = nullptr; | 1494 m_pImage = nullptr; |
1495 } | 1495 } |
1496 | 1496 |
1497 CPDF_ImageLoaderHandle::~CPDF_ImageLoaderHandle() {} | 1497 CPDF_ImageLoaderHandle::~CPDF_ImageLoaderHandle() {} |
1498 | 1498 |
1499 FX_BOOL CPDF_ImageLoaderHandle::Start(CPDF_ImageLoader* pImageLoader, | 1499 FX_BOOL CPDF_ImageLoaderHandle::Start(CPDF_ImageLoader* pImageLoader, |
1500 const CPDF_ImageObject* pImage, | 1500 const CPDF_ImageObject* pImage, |
1501 CPDF_PageRenderCache* pCache, | 1501 CPDF_PageRenderCache* pCache, |
1502 FX_BOOL bStdCS, | 1502 FX_BOOL bStdCS, |
1503 FX_DWORD GroupFamily, | 1503 uint32_t GroupFamily, |
1504 FX_BOOL bLoadMask, | 1504 FX_BOOL bLoadMask, |
1505 CPDF_RenderStatus* pRenderStatus, | 1505 CPDF_RenderStatus* pRenderStatus, |
1506 int32_t nDownsampleWidth, | 1506 int32_t nDownsampleWidth, |
1507 int32_t nDownsampleHeight) { | 1507 int32_t nDownsampleHeight) { |
1508 m_pImageLoader = pImageLoader; | 1508 m_pImageLoader = pImageLoader; |
1509 m_pCache = pCache; | 1509 m_pCache = pCache; |
1510 m_pImage = const_cast<CPDF_ImageObject*>(pImage); | 1510 m_pImage = const_cast<CPDF_ImageObject*>(pImage); |
1511 m_nDownsampleWidth = nDownsampleWidth; | 1511 m_nDownsampleWidth = nDownsampleWidth; |
1512 m_nDownsampleHeight = nDownsampleHeight; | 1512 m_nDownsampleHeight = nDownsampleHeight; |
1513 FX_BOOL ret; | 1513 FX_BOOL ret; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1558 m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor; | 1558 m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor; |
1559 } | 1559 } |
1560 } | 1560 } |
1561 return ret; | 1561 return ret; |
1562 } | 1562 } |
1563 | 1563 |
1564 FX_BOOL CPDF_ImageLoader::Start(const CPDF_ImageObject* pImage, | 1564 FX_BOOL CPDF_ImageLoader::Start(const CPDF_ImageObject* pImage, |
1565 CPDF_PageRenderCache* pCache, | 1565 CPDF_PageRenderCache* pCache, |
1566 CPDF_ImageLoaderHandle*& LoadHandle, | 1566 CPDF_ImageLoaderHandle*& LoadHandle, |
1567 FX_BOOL bStdCS, | 1567 FX_BOOL bStdCS, |
1568 FX_DWORD GroupFamily, | 1568 uint32_t GroupFamily, |
1569 FX_BOOL bLoadMask, | 1569 FX_BOOL bLoadMask, |
1570 CPDF_RenderStatus* pRenderStatus, | 1570 CPDF_RenderStatus* pRenderStatus, |
1571 int32_t nDownsampleWidth, | 1571 int32_t nDownsampleWidth, |
1572 int32_t nDownsampleHeight) { | 1572 int32_t nDownsampleHeight) { |
1573 m_nDownsampleWidth = nDownsampleWidth; | 1573 m_nDownsampleWidth = nDownsampleWidth; |
1574 m_nDownsampleHeight = nDownsampleHeight; | 1574 m_nDownsampleHeight = nDownsampleHeight; |
1575 LoadHandle = new CPDF_ImageLoaderHandle; | 1575 LoadHandle = new CPDF_ImageLoaderHandle; |
1576 return LoadHandle->Start(this, pImage, pCache, bStdCS, GroupFamily, bLoadMask, | 1576 return LoadHandle->Start(this, pImage, pCache, bStdCS, GroupFamily, bLoadMask, |
1577 pRenderStatus, m_nDownsampleWidth, | 1577 pRenderStatus, m_nDownsampleWidth, |
1578 m_nDownsampleHeight); | 1578 m_nDownsampleHeight); |
1579 } | 1579 } |
1580 | 1580 |
1581 FX_BOOL CPDF_ImageLoader::Continue(CPDF_ImageLoaderHandle* LoadHandle, | 1581 FX_BOOL CPDF_ImageLoader::Continue(CPDF_ImageLoaderHandle* LoadHandle, |
1582 IFX_Pause* pPause) { | 1582 IFX_Pause* pPause) { |
1583 return LoadHandle->Continue(pPause); | 1583 return LoadHandle->Continue(pPause); |
1584 } | 1584 } |
1585 | 1585 |
1586 CPDF_ImageLoader::~CPDF_ImageLoader() { | 1586 CPDF_ImageLoader::~CPDF_ImageLoader() { |
1587 if (!m_bCached) { | 1587 if (!m_bCached) { |
1588 delete m_pBitmap; | 1588 delete m_pBitmap; |
1589 delete m_pMask; | 1589 delete m_pMask; |
1590 } | 1590 } |
1591 } | 1591 } |
OLD | NEW |