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

Side by Side Diff: core/fpdfapi/fpdf_render/fpdf_render_image.cpp

Issue 1973913002: Clean up CFX_ImageTransformer. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: address comments Created 4 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
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 "core/fpdfapi/fpdf_render/render_int.h" 7 #include "core/fpdfapi/fpdf_render/render_int.h"
8 8
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 681 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask); 692 bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);
693 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); 693 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());
694 if (m_BitmapAlpha < 255) { 694 if (m_BitmapAlpha < 255) {
695 bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha); 695 bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha);
696 } 696 }
697 } 697 }
698 m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, 698 m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left,
699 rect.top, m_BlendType); 699 rect.top, m_BlendType);
700 return FALSE; 700 return FALSE;
701 } 701 }
702
702 FX_BOOL CPDF_ImageRenderer::StartDIBSource() { 703 FX_BOOL CPDF_ImageRenderer::StartDIBSource() {
703 if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) { 704 if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) {
704 int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() * 705 int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() *
705 m_pDIBSource->GetHeight(); 706 m_pDIBSource->GetHeight();
706 if (image_size > FPDF_HUGE_IMAGE_SIZE && 707 if (image_size > FPDF_HUGE_IMAGE_SIZE &&
707 !(m_Flags & RENDER_FORCE_HALFTONE)) { 708 !(m_Flags & RENDER_FORCE_HALFTONE)) {
708 m_Flags |= RENDER_FORCE_DOWNSAMPLE; 709 m_Flags |= RENDER_FORCE_DOWNSAMPLE;
709 } 710 }
710 } 711 }
711 if (m_pRenderStatus->m_pDevice->StartDIBits( 712 if (m_pRenderStatus->m_pDevice->StartDIBits(
712 m_pDIBSource, m_BitmapAlpha, m_FillArgb, &m_ImageMatrix, m_Flags, 713 m_pDIBSource, m_BitmapAlpha, m_FillArgb, &m_ImageMatrix, m_Flags,
713 m_DeviceHandle, 0, NULL, m_BlendType)) { 714 m_DeviceHandle, 0, nullptr, m_BlendType)) {
714 if (m_DeviceHandle) { 715 if (m_DeviceHandle) {
715 m_Status = 3; 716 m_Status = 3;
716 return TRUE; 717 return TRUE;
717 } 718 }
718 return FALSE; 719 return FALSE;
719 } 720 }
720 CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); 721 CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
721 FX_RECT image_rect = image_rect_f.GetOutterRect(); 722 FX_RECT image_rect = image_rect_f.GetOutterRect();
722 int dest_width = image_rect.Width(); 723 int dest_width = image_rect.Width();
723 int dest_height = image_rect.Height(); 724 int dest_height = image_rect.Height();
724 if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) || 725 if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) ||
725 (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0)) { 726 (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0)) {
726 if (m_pRenderStatus->m_bPrint && 727 if (m_pRenderStatus->m_bPrint &&
727 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 728 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
728 m_Result = FALSE; 729 m_Result = FALSE;
729 return FALSE; 730 return FALSE;
730 } 731 }
731 FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); 732 FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();
732 clip_box.Intersect(image_rect); 733 clip_box.Intersect(image_rect);
733 m_Status = 2; 734 m_Status = 2;
734 m_pTransformer = new CFX_ImageTransformer; 735 m_pTransformer = new CFX_ImageTransformer(m_pDIBSource, &m_ImageMatrix,
735 m_pTransformer->Start(m_pDIBSource, &m_ImageMatrix, m_Flags, &clip_box); 736 m_Flags, &clip_box);
737 m_pTransformer->Start();
736 return TRUE; 738 return TRUE;
737 } 739 }
738 if (m_ImageMatrix.a < 0) { 740 if (m_ImageMatrix.a < 0)
739 dest_width = -dest_width; 741 dest_width = -dest_width;
740 } 742
741 if (m_ImageMatrix.d > 0) { 743 if (m_ImageMatrix.d > 0)
742 dest_height = -dest_height; 744 dest_height = -dest_height;
743 } 745
744 int dest_left, dest_top; 746 int dest_left = dest_width > 0 ? image_rect.left : image_rect.right;
745 dest_left = dest_width > 0 ? image_rect.left : image_rect.right; 747 int dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom;
746 dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom;
747 if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) { 748 if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) {
748 if (m_pRenderStatus->m_pDevice->StretchDIBits( 749 if (m_pRenderStatus->m_pDevice->StretchDIBits(
749 m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_Flags, 750 m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_Flags,
750 NULL, m_BlendType)) { 751 nullptr, m_BlendType)) {
751 return FALSE; 752 return FALSE;
752 } 753 }
753 } 754 }
754 if (m_pDIBSource->IsAlphaMask()) { 755 if (m_pDIBSource->IsAlphaMask()) {
755 if (m_BitmapAlpha != 255) { 756 if (m_BitmapAlpha != 255)
756 m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); 757 m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
757 }
758 if (m_pRenderStatus->m_pDevice->StretchBitMask( 758 if (m_pRenderStatus->m_pDevice->StretchBitMask(
759 m_pDIBSource, dest_left, dest_top, dest_width, dest_height, 759 m_pDIBSource, dest_left, dest_top, dest_width, dest_height,
760 m_FillArgb, m_Flags)) { 760 m_FillArgb, m_Flags)) {
761 return FALSE; 761 return FALSE;
762 } 762 }
763 } 763 }
764 if (m_pRenderStatus->m_bPrint && 764 if (m_pRenderStatus->m_bPrint &&
765 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 765 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
766 m_Result = FALSE; 766 m_Result = FALSE;
767 return TRUE; 767 return TRUE;
768 } 768 }
769
769 FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); 770 FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();
770 FX_RECT dest_rect = clip_box; 771 FX_RECT dest_rect = clip_box;
771 dest_rect.Intersect(image_rect); 772 dest_rect.Intersect(image_rect);
772 FX_RECT dest_clip( 773 FX_RECT dest_clip(
773 dest_rect.left - image_rect.left, dest_rect.top - image_rect.top, 774 dest_rect.left - image_rect.left, dest_rect.top - image_rect.top,
774 dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top); 775 dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top);
775 std::unique_ptr<CFX_DIBitmap> pStretched( 776 std::unique_ptr<CFX_DIBitmap> pStretched(
776 m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip)); 777 m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip));
777 if (pStretched) { 778 if (pStretched) {
778 m_pRenderStatus->CompositeDIBitmap(pStretched.get(), dest_rect.left, 779 m_pRenderStatus->CompositeDIBitmap(pStretched.get(), dest_rect.left,
779 dest_rect.top, m_FillArgb, m_BitmapAlpha, 780 dest_rect.top, m_FillArgb, m_BitmapAlpha,
780 m_BlendType, FALSE); 781 m_BlendType, FALSE);
781 } 782 }
782 return FALSE; 783 return FALSE;
783 } 784 }
785
784 FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha() { 786 FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha() {
785 if (m_pDIBSource->IsOpaqueImage()) { 787 if (m_pDIBSource->IsOpaqueImage()) {
786 CFX_PathData path; 788 CFX_PathData path;
787 path.AppendRect(0, 0, 1, 1); 789 path.AppendRect(0, 0, 1, 1);
788 path.Transform(&m_ImageMatrix); 790 path.Transform(&m_ImageMatrix);
789 uint32_t fill_color = 791 uint32_t fill_color =
790 ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha); 792 ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha);
791 m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0, 793 m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0,
792 FXFILL_WINDING); 794 FXFILL_WINDING);
793 } else { 795 } else {
(...skipping 23 matching lines...) Expand all
817 m_pRenderStatus->m_pDevice->StretchBitMask( 819 m_pRenderStatus->m_pDevice->StretchBitMask(
818 pAlphaMask, left, top, dest_width, dest_height, 820 pAlphaMask, left, top, dest_width, dest_height,
819 ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha)); 821 ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));
820 } 822 }
821 if (m_pDIBSource != pAlphaMask) { 823 if (m_pDIBSource != pAlphaMask) {
822 delete pAlphaMask; 824 delete pAlphaMask;
823 } 825 }
824 } 826 }
825 return FALSE; 827 return FALSE;
826 } 828 }
829
827 FX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause) { 830 FX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause) {
828 if (m_Status == 2) { 831 if (m_Status == 2) {
829 if (m_pTransformer->Continue(pPause)) { 832 if (m_pTransformer->Continue(pPause))
830 return TRUE; 833 return TRUE;
834
835 std::unique_ptr<CFX_DIBitmap> pBitmap(m_pTransformer->DetachBitmap());
836 if (!pBitmap)
837 return FALSE;
838
839 if (pBitmap->IsAlphaMask()) {
840 if (m_BitmapAlpha != 255)
841 m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
842 m_Result = m_pRenderStatus->m_pDevice->SetBitMask(
843 pBitmap.get(), m_pTransformer->result().left,
844 m_pTransformer->result().top, m_FillArgb);
845 } else {
846 if (m_BitmapAlpha != 255)
847 pBitmap->MultiplyAlpha(m_BitmapAlpha);
848 m_Result = m_pRenderStatus->m_pDevice->SetDIBits(
849 pBitmap.get(), m_pTransformer->result().left,
850 m_pTransformer->result().top, m_BlendType);
831 } 851 }
832 CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();
833 if (!pBitmap) {
834 return FALSE;
835 }
836 if (pBitmap->IsAlphaMask()) {
837 if (m_BitmapAlpha != 255) {
838 m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
839 }
840 m_Result = m_pRenderStatus->m_pDevice->SetBitMask(
841 pBitmap, m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,
842 m_FillArgb);
843 } else {
844 if (m_BitmapAlpha != 255) {
845 pBitmap->MultiplyAlpha(m_BitmapAlpha);
846 }
847 m_Result = m_pRenderStatus->m_pDevice->SetDIBits(
848 pBitmap, m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,
849 m_BlendType);
850 }
851 delete pBitmap;
852 return FALSE; 852 return FALSE;
853 } 853 }
854 if (m_Status == 3) { 854 if (m_Status == 3)
855 return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause); 855 return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause);
856 } 856
857 if (m_Status == 4) { 857 if (m_Status == 4) {
858 if (m_Loader.Continue(m_LoadHandle, pPause)) { 858 if (m_Loader.Continue(m_LoadHandle, pPause))
859 return TRUE; 859 return TRUE;
860 } 860
861 if (StartRenderDIBSource()) { 861 if (StartRenderDIBSource())
862 return Continue(pPause); 862 return Continue(pPause);
863 }
864 } 863 }
865 return FALSE; 864 return FALSE;
866 } 865 }
866
867 CCodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( 867 CCodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(
868 const uint8_t* src_buf, 868 const uint8_t* src_buf,
869 uint32_t src_size, 869 uint32_t src_size,
870 int width, 870 int width,
871 int height, 871 int height,
872 int nComps, 872 int nComps,
873 int bpc, 873 int bpc,
874 const CPDF_Dictionary* pParams); 874 const CPDF_Dictionary* pParams);
875 CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict, 875 CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict,
876 FX_RECT* pClipRect, 876 FX_RECT* pClipRect,
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
996 } else if (pFunc) { 996 } else if (pFunc) {
997 int size = dest_pitch * height; 997 int size = dest_pitch * height;
998 for (int i = 0; i < size; i++) { 998 for (int i = 0; i < size; i++) {
999 dest_buf[i] = transfers[src_buf[i]]; 999 dest_buf[i] = transfers[src_buf[i]];
1000 } 1000 }
1001 } else { 1001 } else {
1002 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height); 1002 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height);
1003 } 1003 }
1004 return pMask.release(); 1004 return pMask.release();
1005 } 1005 }
OLDNEW
« no previous file with comments | « core/fpdfapi/fpdf_font/cpdf_type3font.cpp ('k') | core/fpdfapi/fpdf_render/fpdf_render_text.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698