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 <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
668 image->comps[0].prec = 16; | 668 image->comps[0].prec = 16; |
669 image->comps[1].prec = 16; | 669 image->comps[1].prec = 16; |
670 image->comps[2].prec = 16; | 670 image->comps[2].prec = 16; |
671 return; | 671 return; |
672 } | 672 } |
673 } | 673 } |
674 class CJPX_Decoder { | 674 class CJPX_Decoder { |
675 public: | 675 public: |
676 explicit CJPX_Decoder(CPDF_ColorSpace* cs); | 676 explicit CJPX_Decoder(CPDF_ColorSpace* cs); |
677 ~CJPX_Decoder(); | 677 ~CJPX_Decoder(); |
678 FX_BOOL Init(const unsigned char* src_data, FX_DWORD src_size); | 678 FX_BOOL Init(const unsigned char* src_data, uint32_t src_size); |
679 void GetInfo(FX_DWORD* width, FX_DWORD* height, FX_DWORD* components); | 679 void GetInfo(uint32_t* width, uint32_t* height, uint32_t* components); |
680 bool Decode(uint8_t* dest_buf, | 680 bool Decode(uint8_t* dest_buf, |
681 int pitch, | 681 int pitch, |
682 const std::vector<uint8_t>& offsets); | 682 const std::vector<uint8_t>& offsets); |
683 | 683 |
684 private: | 684 private: |
685 const uint8_t* m_SrcData; | 685 const uint8_t* m_SrcData; |
686 FX_DWORD m_SrcSize; | 686 uint32_t m_SrcSize; |
687 opj_image_t* image; | 687 opj_image_t* image; |
688 opj_codec_t* l_codec; | 688 opj_codec_t* l_codec; |
689 opj_stream_t* l_stream; | 689 opj_stream_t* l_stream; |
690 const CPDF_ColorSpace* const m_ColorSpace; | 690 const CPDF_ColorSpace* const m_ColorSpace; |
691 }; | 691 }; |
692 | 692 |
693 CJPX_Decoder::CJPX_Decoder(CPDF_ColorSpace* cs) | 693 CJPX_Decoder::CJPX_Decoder(CPDF_ColorSpace* cs) |
694 : image(nullptr), l_codec(nullptr), l_stream(nullptr), m_ColorSpace(cs) {} | 694 : image(nullptr), l_codec(nullptr), l_stream(nullptr), m_ColorSpace(cs) {} |
695 | 695 |
696 CJPX_Decoder::~CJPX_Decoder() { | 696 CJPX_Decoder::~CJPX_Decoder() { |
697 if (l_codec) { | 697 if (l_codec) { |
698 opj_destroy_codec(l_codec); | 698 opj_destroy_codec(l_codec); |
699 } | 699 } |
700 if (l_stream) { | 700 if (l_stream) { |
701 opj_stream_destroy(l_stream); | 701 opj_stream_destroy(l_stream); |
702 } | 702 } |
703 if (image) { | 703 if (image) { |
704 opj_image_destroy(image); | 704 opj_image_destroy(image); |
705 } | 705 } |
706 } | 706 } |
707 | 707 |
708 FX_BOOL CJPX_Decoder::Init(const unsigned char* src_data, FX_DWORD src_size) { | 708 FX_BOOL CJPX_Decoder::Init(const unsigned char* src_data, uint32_t src_size) { |
709 static const unsigned char szJP2Header[] = { | 709 static const unsigned char szJP2Header[] = { |
710 0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a}; | 710 0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a}; |
711 if (!src_data || src_size < sizeof(szJP2Header)) | 711 if (!src_data || src_size < sizeof(szJP2Header)) |
712 return FALSE; | 712 return FALSE; |
713 | 713 |
714 image = NULL; | 714 image = NULL; |
715 m_SrcData = src_data; | 715 m_SrcData = src_data; |
716 m_SrcSize = src_size; | 716 m_SrcSize = src_size; |
717 DecodeData srcData(const_cast<unsigned char*>(src_data), src_size); | 717 DecodeData srcData(const_cast<unsigned char*>(src_data), src_size); |
718 l_stream = fx_opj_stream_create_memory_stream(&srcData, | 718 l_stream = fx_opj_stream_create_memory_stream(&srcData, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 FX_Free(image->icc_profile_buf); | 781 FX_Free(image->icc_profile_buf); |
782 image->icc_profile_buf = NULL; | 782 image->icc_profile_buf = NULL; |
783 image->icc_profile_len = 0; | 783 image->icc_profile_len = 0; |
784 } | 784 } |
785 if (!image) { | 785 if (!image) { |
786 return FALSE; | 786 return FALSE; |
787 } | 787 } |
788 return TRUE; | 788 return TRUE; |
789 } | 789 } |
790 | 790 |
791 void CJPX_Decoder::GetInfo(FX_DWORD* width, | 791 void CJPX_Decoder::GetInfo(uint32_t* width, |
792 FX_DWORD* height, | 792 uint32_t* height, |
793 FX_DWORD* components) { | 793 uint32_t* components) { |
794 *width = (FX_DWORD)image->x1; | 794 *width = (uint32_t)image->x1; |
795 *height = (FX_DWORD)image->y1; | 795 *height = (uint32_t)image->y1; |
796 *components = (FX_DWORD)image->numcomps; | 796 *components = (uint32_t)image->numcomps; |
797 } | 797 } |
798 | 798 |
799 bool CJPX_Decoder::Decode(uint8_t* dest_buf, | 799 bool CJPX_Decoder::Decode(uint8_t* dest_buf, |
800 int pitch, | 800 int pitch, |
801 const std::vector<uint8_t>& offsets) { | 801 const std::vector<uint8_t>& offsets) { |
802 if (image->comps[0].w != image->x1 || image->comps[0].h != image->y1) | 802 if (image->comps[0].w != image->x1 || image->comps[0].h != image->y1) |
803 return false; | 803 return false; |
804 | 804 |
805 if (pitch<(int)(image->comps[0].w * 8 * image->numcomps + 31)>> 5 << 2) | 805 if (pitch<(int)(image->comps[0].w * 8 * image->numcomps + 31)>> 5 << 2) |
806 return false; | 806 return false; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 } | 867 } |
868 } | 868 } |
869 } | 869 } |
870 return true; | 870 return true; |
871 } | 871 } |
872 | 872 |
873 CCodec_JpxModule::CCodec_JpxModule() {} | 873 CCodec_JpxModule::CCodec_JpxModule() {} |
874 CCodec_JpxModule::~CCodec_JpxModule() {} | 874 CCodec_JpxModule::~CCodec_JpxModule() {} |
875 | 875 |
876 CJPX_Decoder* CCodec_JpxModule::CreateDecoder(const uint8_t* src_buf, | 876 CJPX_Decoder* CCodec_JpxModule::CreateDecoder(const uint8_t* src_buf, |
877 FX_DWORD src_size, | 877 uint32_t src_size, |
878 CPDF_ColorSpace* cs) { | 878 CPDF_ColorSpace* cs) { |
879 std::unique_ptr<CJPX_Decoder> decoder(new CJPX_Decoder(cs)); | 879 std::unique_ptr<CJPX_Decoder> decoder(new CJPX_Decoder(cs)); |
880 return decoder->Init(src_buf, src_size) ? decoder.release() : nullptr; | 880 return decoder->Init(src_buf, src_size) ? decoder.release() : nullptr; |
881 } | 881 } |
882 | 882 |
883 void CCodec_JpxModule::GetImageInfo(CJPX_Decoder* pDecoder, | 883 void CCodec_JpxModule::GetImageInfo(CJPX_Decoder* pDecoder, |
884 FX_DWORD* width, | 884 uint32_t* width, |
885 FX_DWORD* height, | 885 uint32_t* height, |
886 FX_DWORD* components) { | 886 uint32_t* components) { |
887 pDecoder->GetInfo(width, height, components); | 887 pDecoder->GetInfo(width, height, components); |
888 } | 888 } |
889 | 889 |
890 bool CCodec_JpxModule::Decode(CJPX_Decoder* pDecoder, | 890 bool CCodec_JpxModule::Decode(CJPX_Decoder* pDecoder, |
891 uint8_t* dest_data, | 891 uint8_t* dest_data, |
892 int pitch, | 892 int pitch, |
893 const std::vector<uint8_t>& offsets) { | 893 const std::vector<uint8_t>& offsets) { |
894 return pDecoder->Decode(dest_data, pitch, offsets); | 894 return pDecoder->Decode(dest_data, pitch, offsets); |
895 } | 895 } |
896 | 896 |
897 void CCodec_JpxModule::DestroyDecoder(CJPX_Decoder* pDecoder) { | 897 void CCodec_JpxModule::DestroyDecoder(CJPX_Decoder* pDecoder) { |
898 delete pDecoder; | 898 delete pDecoder; |
899 } | 899 } |
OLD | NEW |