Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Side by Side Diff: core/src/fxcodec/codec/fx_codec_flate.cpp

Issue 1143663008: Merge to XFA: Remove FX_Alloc() null checks now that it can't return NULL. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Rebased. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/src/fxcodec/codec/fx_codec_fax.cpp ('k') | core/src/fxcodec/codec/fx_codec_icc.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "../../../../third_party/base/nonstd_unique_ptr.h"
8 #include "../../../include/fxcodec/fx_codec.h" 8 #include "../../../include/fxcodec/fx_codec.h"
9 #include "../../fx_zlib.h" 9 #include "../../fx_zlib.h"
10 #include "codec_int.h" 10 #include "codec_int.h"
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 } 576 }
577 TIFF_PredictLine(scan_line, row_size, BitsPerComponent, Colors, Columns) ; 577 TIFF_PredictLine(scan_line, row_size, BitsPerComponent, Colors, Columns) ;
578 } 578 }
579 return TRUE; 579 return TRUE;
580 } 580 }
581 class CCodec_FlateScanlineDecoder : public CCodec_ScanlineDecoder 581 class CCodec_FlateScanlineDecoder : public CCodec_ScanlineDecoder
582 { 582 {
583 public: 583 public:
584 CCodec_FlateScanlineDecoder(); 584 CCodec_FlateScanlineDecoder();
585 ~CCodec_FlateScanlineDecoder(); 585 ~CCodec_FlateScanlineDecoder();
586 FX_BOOL» » Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc, 586 void Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, in t nComps, int bpc,
587 int predictor, int Colors, int BitsPerComponent, int Colu mns); 587 int predictor, int Colors, int BitsPerComponent, int Columns);
588 virtual void Destroy() 588 virtual void Destroy()
589 { 589 {
590 delete this; 590 delete this;
591 } 591 }
592 virtual void v_DownScale(int dest_width, int dest_height) {} 592 virtual void v_DownScale(int dest_width, int dest_height) {}
593 virtual FX_BOOL v_Rewind(); 593 virtual FX_BOOL v_Rewind();
594 virtual FX_LPBYTE v_GetNextLine(); 594 virtual FX_LPBYTE v_GetNextLine();
595 virtual FX_DWORD GetSrcOffset(); 595 virtual FX_DWORD GetSrcOffset();
596 void* m_pFlate; 596 void* m_pFlate;
597 FX_LPCBYTE m_SrcBuf; 597 FX_LPCBYTE m_SrcBuf;
(...skipping 25 matching lines...) Expand all
623 if (m_pPredictBuffer) { 623 if (m_pPredictBuffer) {
624 FX_Free(m_pPredictBuffer); 624 FX_Free(m_pPredictBuffer);
625 } 625 }
626 if (m_pPredictRaw) { 626 if (m_pPredictRaw) {
627 FX_Free(m_pPredictRaw); 627 FX_Free(m_pPredictRaw);
628 } 628 }
629 if (m_pFlate) { 629 if (m_pFlate) {
630 FPDFAPI_FlateEnd(m_pFlate); 630 FPDFAPI_FlateEnd(m_pFlate);
631 } 631 }
632 } 632 }
633 FX_BOOL CCodec_FlateScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_siz e, int width, int height, 633 void CCodec_FlateScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
634 int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, in t Columns) 634 int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, in t Columns)
635 { 635 {
636 m_SrcBuf = src_buf; 636 m_SrcBuf = src_buf;
637 m_SrcSize = src_size; 637 m_SrcSize = src_size;
638 m_OutputWidth = m_OrigWidth = width; 638 m_OutputWidth = m_OrigWidth = width;
639 m_OutputHeight = m_OrigHeight = height; 639 m_OutputHeight = m_OrigHeight = height;
640 m_nComps = nComps; 640 m_nComps = nComps;
641 m_bpc = bpc; 641 m_bpc = bpc;
642 m_bColorTransformed = FALSE; 642 m_bColorTransformed = FALSE;
643 m_Pitch = (width * nComps * bpc + 7) / 8; 643 m_Pitch = (width * nComps * bpc + 7) / 8;
644 m_pScanline = FX_Alloc(FX_BYTE, m_Pitch); 644 m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);
645 if (m_pScanline == NULL) {
646 return FALSE;
647 }
648 m_Predictor = 0; 645 m_Predictor = 0;
649 if (predictor) { 646 if (predictor) {
650 if (predictor >= 10) { 647 if (predictor >= 10) {
651 m_Predictor = 2; 648 m_Predictor = 2;
652 } else if (predictor == 2) { 649 } else if (predictor == 2) {
653 m_Predictor = 1; 650 m_Predictor = 1;
654 } 651 }
655 if (m_Predictor) { 652 if (m_Predictor) {
656 if (BitsPerComponent * Colors * Columns == 0) { 653 if (BitsPerComponent * Colors * Columns == 0) {
657 BitsPerComponent = m_bpc; 654 BitsPerComponent = m_bpc;
658 Colors = m_nComps; 655 Colors = m_nComps;
659 Columns = m_OrigWidth; 656 Columns = m_OrigWidth;
660 } 657 }
661 m_Colors = Colors; 658 m_Colors = Colors;
662 m_BitsPerComponent = BitsPerComponent; 659 m_BitsPerComponent = BitsPerComponent;
663 m_Columns = Columns; 660 m_Columns = Columns;
664 m_PredictPitch = (m_BitsPerComponent * m_Colors * m_Columns + 7) / 8 ; 661 m_PredictPitch = (m_BitsPerComponent * m_Colors * m_Columns + 7) / 8 ;
665 m_pLastLine = FX_Alloc(FX_BYTE, m_PredictPitch); 662 m_pLastLine = FX_Alloc(FX_BYTE, m_PredictPitch);
666 if (m_pLastLine == NULL) {
667 return FALSE;
668 }
669 m_pPredictRaw = FX_Alloc(FX_BYTE, m_PredictPitch + 1); 663 m_pPredictRaw = FX_Alloc(FX_BYTE, m_PredictPitch + 1);
670 if (m_pPredictRaw == NULL) {
671 return FALSE;
672 }
673 m_pPredictBuffer = FX_Alloc(FX_BYTE, m_PredictPitch); 664 m_pPredictBuffer = FX_Alloc(FX_BYTE, m_PredictPitch);
674 if (m_pPredictBuffer == NULL) {
675 return FALSE;
676 }
677 } 665 }
678 } 666 }
679 return TRUE;
680 } 667 }
681 FX_BOOL CCodec_FlateScanlineDecoder::v_Rewind() 668 FX_BOOL CCodec_FlateScanlineDecoder::v_Rewind()
682 { 669 {
683 if (m_pFlate) { 670 if (m_pFlate) {
684 FPDFAPI_FlateEnd(m_pFlate); 671 FPDFAPI_FlateEnd(m_pFlate);
685 } 672 }
686 m_pFlate = FPDFAPI_FlateInit(my_alloc_func, my_free_func); 673 m_pFlate = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
687 if (m_pFlate == NULL) { 674 if (m_pFlate == NULL) {
688 return FALSE; 675 return FALSE;
689 } 676 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 if (guess_size > kMaxInitialAllocSize) { 732 if (guess_size > kMaxInitialAllocSize) {
746 guess_size = kMaxInitialAllocSize; 733 guess_size = kMaxInitialAllocSize;
747 alloc_step = kMaxInitialAllocSize; 734 alloc_step = kMaxInitialAllocSize;
748 } 735 }
749 FX_DWORD buf_size = guess_size; 736 FX_DWORD buf_size = guess_size;
750 FX_DWORD last_buf_size = buf_size; 737 FX_DWORD last_buf_size = buf_size;
751 void* context = nullptr; 738 void* context = nullptr;
752 739
753 FX_LPBYTE guess_buf = FX_Alloc(FX_BYTE, guess_size + 1); 740 FX_LPBYTE guess_buf = FX_Alloc(FX_BYTE, guess_size + 1);
754 FX_LPBYTE cur_buf = guess_buf; 741 FX_LPBYTE cur_buf = guess_buf;
755 if (!guess_buf)
756 goto fail;
757 guess_buf[guess_size] = '\0'; 742 guess_buf[guess_size] = '\0';
758 context = FPDFAPI_FlateInit(my_alloc_func, my_free_func); 743 context = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
759 if (!context) 744 if (!context)
760 goto fail; 745 goto fail;
761 FPDFAPI_FlateInput(context, src_buf, src_size); 746 FPDFAPI_FlateInput(context, src_buf, src_size);
762 if (useOldImpl) { 747 if (useOldImpl) {
763 while (1) { 748 while (1) {
764 FX_INT32 ret = FPDFAPI_FlateOutput(context, cur_buf, buf_size); 749 FX_INT32 ret = FPDFAPI_FlateOutput(context, cur_buf, buf_size);
765 if (ret != Z_OK) 750 if (ret != Z_OK)
766 break; 751 break;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 } 787 }
803 if (avail_buf_size != 0) { 788 if (avail_buf_size != 0) {
804 last_buf_size = buf_size - avail_buf_size; 789 last_buf_size = buf_size - avail_buf_size;
805 result_tmp_bufs.Add(cur_buf); 790 result_tmp_bufs.Add(cur_buf);
806 break; 791 break;
807 } 792 }
808 793
809 // |avail_buf_size| == 0 case. 794 // |avail_buf_size| == 0 case.
810 result_tmp_bufs.Add(cur_buf); 795 result_tmp_bufs.Add(cur_buf);
811 cur_buf = FX_Alloc(FX_BYTE, buf_size + 1); 796 cur_buf = FX_Alloc(FX_BYTE, buf_size + 1);
812 if (!cur_buf) {
813 for (FX_INT32 i = 0; i < result_tmp_bufs.GetSize(); i++) {
814 FX_Free(result_tmp_bufs[i]);
815 }
816 goto fail;
817 }
818 cur_buf[buf_size] = '\0'; 797 cur_buf[buf_size] = '\0';
819 } 798 }
820 dest_size = FPDFAPI_FlateGetTotalOut(context); 799 dest_size = FPDFAPI_FlateGetTotalOut(context);
821 offset = FPDFAPI_FlateGetTotalIn(context); 800 offset = FPDFAPI_FlateGetTotalIn(context);
822 if (result_tmp_bufs.GetSize() == 1) { 801 if (result_tmp_bufs.GetSize() == 1) {
823 dest_buf = result_tmp_bufs[0]; 802 dest_buf = result_tmp_bufs[0];
824 } else { 803 } else {
825 FX_LPBYTE result_buf = FX_Alloc(FX_BYTE, dest_size); 804 FX_LPBYTE result_buf = FX_Alloc(FX_BYTE, dest_size);
826 if (!result_buf) {
827 for (FX_INT32 i = 0; i < result_tmp_bufs.GetSize(); i++) {
828 FX_Free(result_tmp_bufs[i]);
829 }
830 goto fail;
831 }
832 FX_DWORD result_pos = 0; 805 FX_DWORD result_pos = 0;
833 for (FX_INT32 i = 0; i < result_tmp_bufs.GetSize(); i++) { 806 for (FX_INT32 i = 0; i < result_tmp_bufs.GetSize(); i++) {
834 FX_LPBYTE tmp_buf = result_tmp_bufs[i]; 807 FX_LPBYTE tmp_buf = result_tmp_bufs[i];
835 FX_DWORD tmp_buf_size = buf_size; 808 FX_DWORD tmp_buf_size = buf_size;
836 if (i == result_tmp_bufs.GetSize() - 1) { 809 if (i == result_tmp_bufs.GetSize() - 1) {
837 tmp_buf_size = last_buf_size; 810 tmp_buf_size = last_buf_size;
838 } 811 }
839 FXSYS_memcpy32(result_buf + result_pos, tmp_buf, tmp_buf_size); 812 FXSYS_memcpy32(result_buf + result_pos, tmp_buf, tmp_buf_size);
840 result_pos += tmp_buf_size; 813 result_pos += tmp_buf_size;
841 FX_Free(result_tmp_bufs[i]); 814 FX_Free(result_tmp_bufs[i]);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
880 offset = src_size; 853 offset = src_size;
881 int err = decoder->Decode(NULL, dest_size, src_buf, offset, 854 int err = decoder->Decode(NULL, dest_size, src_buf, offset,
882 bEarlyChange); 855 bEarlyChange);
883 if (err || dest_size == 0 || dest_size + 1 < dest_size) { 856 if (err || dest_size == 0 || dest_size + 1 < dest_size) {
884 return -1; 857 return -1;
885 } 858 }
886 } 859 }
887 { 860 {
888 nonstd::unique_ptr<CLZWDecoder> decoder(new CLZWDecoder); 861 nonstd::unique_ptr<CLZWDecoder> decoder(new CLZWDecoder);
889 dest_buf = FX_Alloc( FX_BYTE, dest_size + 1); 862 dest_buf = FX_Alloc( FX_BYTE, dest_size + 1);
890 if (dest_buf == NULL) {
891 return -1;
892 }
893 dest_buf[dest_size] = '\0'; 863 dest_buf[dest_size] = '\0';
894 decoder->Decode(dest_buf, dest_size, src_buf, offset, bEarlyChange); 864 decoder->Decode(dest_buf, dest_size, src_buf, offset, bEarlyChange);
895 } 865 }
896 } else { 866 } else {
897 FlateUncompress(src_buf, src_size, estimated_size, dest_buf, dest_size, offset); 867 FlateUncompress(src_buf, src_size, estimated_size, dest_buf, dest_size, offset);
898 } 868 }
899 if (predictor_type == 0) { 869 if (predictor_type == 0) {
900 return offset; 870 return offset;
901 } 871 }
902 FX_BOOL ret = TRUE; 872 FX_BOOL ret = TRUE;
903 if (predictor_type == 2) { 873 if (predictor_type == 2) {
904 ret = PNG_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, 874 ret = PNG_Predictor(dest_buf, dest_size, Colors, BitsPerComponent,
905 Columns); 875 Columns);
906 } else if (predictor_type == 1) { 876 } else if (predictor_type == 1) {
907 ret = TIFF_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, 877 ret = TIFF_Predictor(dest_buf, dest_size, Colors, BitsPerComponent,
908 Columns); 878 Columns);
909 } 879 }
910 return ret ? offset : -1; 880 return ret ? offset : -1;
911 } 881 }
912 FX_BOOL CCodec_FlateModule::Encode(const FX_BYTE* src_buf, FX_DWORD src_size, 882 FX_BOOL CCodec_FlateModule::Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
913 int predictor, int Colors, int BitsPerCompone nt, int Columns, 883 int predictor, int Colors, int BitsPerCompone nt, int Columns,
914 FX_LPBYTE& dest_buf, FX_DWORD& dest_size) 884 FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
915 { 885 {
916 if (predictor != 2 && predictor < 10) { 886 if (predictor != 2 && predictor < 10) {
917 return Encode(src_buf, src_size, dest_buf, dest_size); 887 return Encode(src_buf, src_size, dest_buf, dest_size);
918 } 888 }
919 FX_LPBYTE pSrcBuf = NULL; 889 FX_LPBYTE pSrcBuf = NULL;
920 pSrcBuf = FX_Alloc(FX_BYTE, src_size); 890 pSrcBuf = FX_Alloc(FX_BYTE, src_size);
921 if (pSrcBuf == NULL) {
922 return FALSE;
923 }
924 FXSYS_memcpy32(pSrcBuf, src_buf, src_size); 891 FXSYS_memcpy32(pSrcBuf, src_buf, src_size);
925 FX_BOOL ret = TRUE; 892 FX_BOOL ret = TRUE;
926 if (predictor == 2) { 893 if (predictor == 2) {
927 ret = TIFF_PredictorEncode(pSrcBuf, src_size, Colors, BitsPerComponent, 894 ret = TIFF_PredictorEncode(pSrcBuf, src_size, Colors, BitsPerComponent,
928 Columns); 895 Columns);
929 } else if (predictor >= 10) { 896 } else if (predictor >= 10) {
930 ret = PNG_PredictorEncode(pSrcBuf, src_size, predictor, Colors, 897 ret = PNG_PredictorEncode(pSrcBuf, src_size, predictor, Colors,
931 BitsPerComponent, Columns); 898 BitsPerComponent, Columns);
932 } 899 }
933 if (ret) 900 if (ret)
934 ret = Encode(pSrcBuf, src_size, dest_buf, dest_size); 901 ret = Encode(pSrcBuf, src_size, dest_buf, dest_size);
935 FX_Free(pSrcBuf); 902 FX_Free(pSrcBuf);
936 return ret; 903 return ret;
937 } 904 }
938 FX_BOOL CCodec_FlateModule::Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPB YTE& dest_buf, FX_DWORD& dest_size) 905 FX_BOOL CCodec_FlateModule::Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPB YTE& dest_buf, FX_DWORD& dest_size)
939 { 906 {
940 dest_size = src_size + src_size / 1000 + 12; 907 dest_size = src_size + src_size / 1000 + 12;
941 dest_buf = FX_Alloc( FX_BYTE, dest_size); 908 dest_buf = FX_Alloc( FX_BYTE, dest_size);
942 if (dest_buf == NULL) {
943 return FALSE;
944 }
945 unsigned long temp_size = dest_size; 909 unsigned long temp_size = dest_size;
946 FPDFAPI_FlateCompress(dest_buf, &temp_size, src_buf, src_size); 910 FPDFAPI_FlateCompress(dest_buf, &temp_size, src_buf, src_size);
947 dest_size = (FX_DWORD)temp_size; 911 dest_size = (FX_DWORD)temp_size;
948 return TRUE; 912 return TRUE;
949 } 913 }
OLDNEW
« no previous file with comments | « core/src/fxcodec/codec/fx_codec_fax.cpp ('k') | core/src/fxcodec/codec/fx_codec_icc.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698