| 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 "xfa/fxfa/xfa_ffwidget.h" | 7 #include "xfa/fxfa/xfa_ffwidget.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "core/fpdfapi/page/cpdf_pageobjectholder.h" | 13 #include "core/fpdfapi/page/cpdf_pageobjectholder.h" |
| 14 #include "core/fxcodec/codec/ccodec_progressivedecoder.h" | 14 #include "core/fxcodec/codec/ccodec_progressivedecoder.h" |
| 15 #include "core/fxcodec/fx_codec.h" | 15 #include "core/fxcodec/fx_codec.h" |
| 16 #include "core/fxcrt/cfx_maybe_owned.h" |
| 16 #include "core/fxge/cfx_gemodule.h" | 17 #include "core/fxge/cfx_gemodule.h" |
| 17 #include "core/fxge/cfx_pathdata.h" | 18 #include "core/fxge/cfx_pathdata.h" |
| 18 #include "core/fxge/cfx_renderdevice.h" | 19 #include "core/fxge/cfx_renderdevice.h" |
| 19 #include "xfa/fwl/core/fwl_widgethit.h" | 20 #include "xfa/fwl/core/fwl_widgethit.h" |
| 20 #include "xfa/fxfa/app/xfa_textlayout.h" | 21 #include "xfa/fxfa/app/xfa_textlayout.h" |
| 21 #include "xfa/fxfa/cxfa_eventparam.h" | 22 #include "xfa/fxfa/cxfa_eventparam.h" |
| 22 #include "xfa/fxfa/fxfa_widget.h" | 23 #include "xfa/fxfa/fxfa_widget.h" |
| 23 #include "xfa/fxfa/parser/cxfa_corner.h" | 24 #include "xfa/fxfa/parser/cxfa_corner.h" |
| 24 #include "xfa/fxfa/xfa_ffapp.h" | 25 #include "xfa/fxfa/xfa_ffapp.h" |
| 25 #include "xfa/fxfa/xfa_ffdoc.h" | 26 #include "xfa/fxfa/xfa_ffdoc.h" |
| (...skipping 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) || | 641 if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) || |
| 641 (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0)) { | 642 (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0)) { |
| 642 if (m_bPrint && !(m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { | 643 if (m_bPrint && !(m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { |
| 643 m_Result = false; | 644 m_Result = false; |
| 644 return false; | 645 return false; |
| 645 } | 646 } |
| 646 CFX_DIBSource* pDib = m_pDIBSource; | 647 CFX_DIBSource* pDib = m_pDIBSource; |
| 647 if (m_pDIBSource->HasAlpha() && | 648 if (m_pDIBSource->HasAlpha() && |
| 648 !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE) && | 649 !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE) && |
| 649 !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) { | 650 !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) { |
| 650 m_pCloneConvert.reset(m_pDIBSource->CloneConvert(FXDIB_Rgb)); | 651 m_pCloneConvert = m_pDIBSource->CloneConvert(FXDIB_Rgb); |
| 651 if (!m_pCloneConvert) { | 652 if (!m_pCloneConvert) { |
| 652 m_Result = false; | 653 m_Result = false; |
| 653 return false; | 654 return false; |
| 654 } | 655 } |
| 655 pDib = m_pCloneConvert.get(); | 656 pDib = m_pCloneConvert.get(); |
| 656 } | 657 } |
| 657 FX_RECT clip_box = m_pDevice->GetClipBox(); | 658 FX_RECT clip_box = m_pDevice->GetClipBox(); |
| 658 clip_box.Intersect(image_rect); | 659 clip_box.Intersect(image_rect); |
| 659 m_Status = 2; | 660 m_Status = 2; |
| 660 m_pTransformer.reset( | 661 m_pTransformer.reset( |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 776 if (bGetBackGround) { | 777 if (bGetBackGround) { |
| 777 if (bIsolated || !bGroup) { | 778 if (bIsolated || !bGroup) { |
| 778 if (pDIBitmap->IsAlphaMask()) { | 779 if (pDIBitmap->IsAlphaMask()) { |
| 779 return; | 780 return; |
| 780 } | 781 } |
| 781 m_pDevice->SetDIBitsWithBlend(pDIBitmap, left, top, blend_mode); | 782 m_pDevice->SetDIBitsWithBlend(pDIBitmap, left, top, blend_mode); |
| 782 } else { | 783 } else { |
| 783 FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), | 784 FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), |
| 784 top + pDIBitmap->GetHeight()); | 785 top + pDIBitmap->GetHeight()); |
| 785 rect.Intersect(m_pDevice->GetClipBox()); | 786 rect.Intersect(m_pDevice->GetClipBox()); |
| 786 CFX_DIBitmap* pClone = nullptr; | 787 CFX_MaybeOwned<CFX_DIBitmap> pClone; |
| 787 bool bClone = false; | |
| 788 if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) { | 788 if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) { |
| 789 bClone = true; | |
| 790 pClone = m_pDevice->GetBackDrop()->Clone(&rect); | 789 pClone = m_pDevice->GetBackDrop()->Clone(&rect); |
| 791 CFX_DIBitmap* pForeBitmap = m_pDevice->GetBitmap(); | 790 CFX_DIBitmap* pForeBitmap = m_pDevice->GetBitmap(); |
| 792 pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), | 791 pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), |
| 793 pForeBitmap, rect.left, rect.top); | 792 pForeBitmap, rect.left, rect.top); |
| 794 left = left >= 0 ? 0 : left; | 793 left = left >= 0 ? 0 : left; |
| 795 top = top >= 0 ? 0 : top; | 794 top = top >= 0 ? 0 : top; |
| 796 if (!pDIBitmap->IsAlphaMask()) | 795 if (!pDIBitmap->IsAlphaMask()) |
| 797 pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), | 796 pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), |
| 798 pDIBitmap, left, top, blend_mode); | 797 pDIBitmap, left, top, blend_mode); |
| 799 else | 798 else |
| 800 pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(), | 799 pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(), |
| 801 pDIBitmap, mask_argb, left, top, blend_mode); | 800 pDIBitmap, mask_argb, left, top, blend_mode); |
| 802 } else { | 801 } else { |
| 803 pClone = pDIBitmap; | 802 pClone = pDIBitmap; |
| 804 } | 803 } |
| 805 if (m_pDevice->GetBackDrop()) { | 804 if (m_pDevice->GetBackDrop()) { |
| 806 m_pDevice->SetDIBits(pClone, rect.left, rect.top); | 805 m_pDevice->SetDIBits(pClone.Get(), rect.left, rect.top); |
| 807 } else { | 806 } else { |
| 808 if (pDIBitmap->IsAlphaMask()) | 807 if (pDIBitmap->IsAlphaMask()) |
| 809 return; | 808 return; |
| 810 m_pDevice->SetDIBitsWithBlend(pDIBitmap, rect.left, rect.top, | 809 m_pDevice->SetDIBitsWithBlend(pDIBitmap, rect.left, rect.top, |
| 811 blend_mode); | 810 blend_mode); |
| 812 } | 811 } |
| 813 if (bClone) { | |
| 814 delete pClone; | |
| 815 } | |
| 816 } | 812 } |
| 817 return; | 813 return; |
| 818 } | 814 } |
| 819 if (pDIBitmap->HasAlpha() && | 815 if (!pDIBitmap->HasAlpha() || |
| 820 !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE)) { | 816 (m_pDevice->GetRenderCaps() & FXRC_ALPHA_IMAGE)) { |
| 821 CFX_DIBitmap* pCloneConvert = pDIBitmap->CloneConvert(FXDIB_Rgb); | |
| 822 if (!pCloneConvert) { | |
| 823 return; | |
| 824 } | |
| 825 CXFA_ImageRenderer imageRender; | |
| 826 bool bRet = imageRender.Start(m_pDevice, pCloneConvert, m_FillArgb, | |
| 827 m_BitmapAlpha, &m_ImageMatrix, m_Flags); | |
| 828 while (bRet) { | |
| 829 bRet = imageRender.Continue(nullptr); | |
| 830 } | |
| 831 delete pCloneConvert; | |
| 832 return; | 817 return; |
| 833 } | 818 } |
| 819 std::unique_ptr<CFX_DIBitmap> pCloneConvert = |
| 820 pDIBitmap->CloneConvert(FXDIB_Rgb); |
| 821 if (!pCloneConvert) |
| 822 return; |
| 823 |
| 824 CXFA_ImageRenderer imageRender; |
| 825 if (!imageRender.Start(m_pDevice, pCloneConvert.get(), m_FillArgb, |
| 826 m_BitmapAlpha, &m_ImageMatrix, m_Flags)) { |
| 827 return; |
| 828 } |
| 829 while (imageRender.Continue(nullptr)) |
| 830 continue; |
| 834 } | 831 } |
| 832 |
| 835 void XFA_DrawImage(CFX_Graphics* pGS, | 833 void XFA_DrawImage(CFX_Graphics* pGS, |
| 836 const CFX_RectF& rtImage, | 834 const CFX_RectF& rtImage, |
| 837 CFX_Matrix* pMatrix, | 835 CFX_Matrix* pMatrix, |
| 838 CFX_DIBitmap* pDIBitmap, | 836 CFX_DIBitmap* pDIBitmap, |
| 839 int32_t iAspect, | 837 int32_t iAspect, |
| 840 int32_t iImageXDpi, | 838 int32_t iImageXDpi, |
| 841 int32_t iImageYDpi, | 839 int32_t iImageYDpi, |
| 842 int32_t iHorzAlign, | 840 int32_t iHorzAlign, |
| 843 int32_t iVertAlign) { | 841 int32_t iVertAlign) { |
| 844 if (rtImage.IsEmpty()) { | 842 if (rtImage.IsEmpty()) { |
| (...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2045 } | 2043 } |
| 2046 XFA_BOX_Fill(box, strokes, pGS, rtWidget, pMatrix, dwFlags); | 2044 XFA_BOX_Fill(box, strokes, pGS, rtWidget, pMatrix, dwFlags); |
| 2047 XFA_BOX_Stroke(box, strokes, pGS, rtWidget, pMatrix, dwFlags); | 2045 XFA_BOX_Stroke(box, strokes, pGS, rtWidget, pMatrix, dwFlags); |
| 2048 } | 2046 } |
| 2049 | 2047 |
| 2050 CXFA_CalcData::CXFA_CalcData() : m_iRefCount(0) {} | 2048 CXFA_CalcData::CXFA_CalcData() : m_iRefCount(0) {} |
| 2051 | 2049 |
| 2052 CXFA_CalcData::~CXFA_CalcData() { | 2050 CXFA_CalcData::~CXFA_CalcData() { |
| 2053 m_Globals.RemoveAll(); | 2051 m_Globals.RemoveAll(); |
| 2054 } | 2052 } |
| OLD | NEW |