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 "render_int.h" | 7 #include "render_int.h" |
8 | 8 |
9 #include "core/include/fpdfapi/fpdf_module.h" | 9 #include "core/include/fpdfapi/fpdf_module.h" |
10 #include "core/include/fpdfapi/fpdf_render.h" | 10 #include "core/include/fpdfapi/fpdf_render.h" |
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 } | 643 } |
644 int textcount = ClipPath.GetTextCount(); | 644 int textcount = ClipPath.GetTextCount(); |
645 if (textcount == 0) | 645 if (textcount == 0) |
646 return; | 646 return; |
647 | 647 |
648 if (m_pDevice->GetDeviceClass() == FXDC_DISPLAY && | 648 if (m_pDevice->GetDeviceClass() == FXDC_DISPLAY && |
649 !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) { | 649 !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) { |
650 return; | 650 return; |
651 } | 651 } |
652 | 652 |
653 nonstd::unique_ptr<CFX_PathData> pTextClippingPath; | 653 std::unique_ptr<CFX_PathData> pTextClippingPath; |
654 for (int i = 0; i < textcount; ++i) { | 654 for (int i = 0; i < textcount; ++i) { |
655 CPDF_TextObject* pText = ClipPath.GetText(i); | 655 CPDF_TextObject* pText = ClipPath.GetText(i); |
656 if (pText) { | 656 if (pText) { |
657 if (!pTextClippingPath) | 657 if (!pTextClippingPath) |
658 pTextClippingPath.reset(new CFX_PathData); | 658 pTextClippingPath.reset(new CFX_PathData); |
659 ProcessText(pText, pObj2Device, pTextClippingPath.get()); | 659 ProcessText(pText, pObj2Device, pTextClippingPath.get()); |
660 continue; | 660 continue; |
661 } | 661 } |
662 | 662 |
663 if (!pTextClippingPath) | 663 if (!pTextClippingPath) |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
804 rect.Intersect(m_pDevice->GetClipBox()); | 804 rect.Intersect(m_pDevice->GetClipBox()); |
805 if (rect.IsEmpty()) { | 805 if (rect.IsEmpty()) { |
806 return TRUE; | 806 return TRUE; |
807 } | 807 } |
808 CFX_Matrix deviceCTM = m_pDevice->GetCTM(); | 808 CFX_Matrix deviceCTM = m_pDevice->GetCTM(); |
809 FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a); | 809 FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a); |
810 FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d); | 810 FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d); |
811 int width = FXSYS_round((FX_FLOAT)rect.Width() * scaleX); | 811 int width = FXSYS_round((FX_FLOAT)rect.Width() * scaleX); |
812 int height = FXSYS_round((FX_FLOAT)rect.Height() * scaleY); | 812 int height = FXSYS_round((FX_FLOAT)rect.Height() * scaleY); |
813 CFX_FxgeDevice bitmap_device; | 813 CFX_FxgeDevice bitmap_device; |
814 nonstd::unique_ptr<CFX_DIBitmap> oriDevice; | 814 std::unique_ptr<CFX_DIBitmap> oriDevice; |
815 if (!isolated && (m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) { | 815 if (!isolated && (m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) { |
816 oriDevice.reset(new CFX_DIBitmap); | 816 oriDevice.reset(new CFX_DIBitmap); |
817 if (!m_pDevice->CreateCompatibleBitmap(oriDevice.get(), width, height)) | 817 if (!m_pDevice->CreateCompatibleBitmap(oriDevice.get(), width, height)) |
818 return TRUE; | 818 return TRUE; |
819 | 819 |
820 m_pDevice->GetDIBits(oriDevice.get(), rect.left, rect.top); | 820 m_pDevice->GetDIBits(oriDevice.get(), rect.left, rect.top); |
821 } | 821 } |
822 if (!bitmap_device.Create(width, height, FXDIB_Argb, 0, oriDevice.get())) | 822 if (!bitmap_device.Create(width, height, FXDIB_Argb, 0, oriDevice.get())) |
823 return TRUE; | 823 return TRUE; |
824 | 824 |
825 CFX_DIBitmap* bitmap = bitmap_device.GetBitmap(); | 825 CFX_DIBitmap* bitmap = bitmap_device.GetBitmap(); |
826 bitmap->Clear(0); | 826 bitmap->Clear(0); |
827 CFX_Matrix new_matrix = *pObj2Device; | 827 CFX_Matrix new_matrix = *pObj2Device; |
828 new_matrix.TranslateI(-rect.left, -rect.top); | 828 new_matrix.TranslateI(-rect.left, -rect.top); |
829 new_matrix.Scale(scaleX, scaleY); | 829 new_matrix.Scale(scaleX, scaleY); |
830 nonstd::unique_ptr<CFX_DIBitmap> pTextMask; | 830 std::unique_ptr<CFX_DIBitmap> pTextMask; |
831 if (bTextClip) { | 831 if (bTextClip) { |
832 pTextMask.reset(new CFX_DIBitmap); | 832 pTextMask.reset(new CFX_DIBitmap); |
833 if (!pTextMask->Create(width, height, FXDIB_8bppMask)) | 833 if (!pTextMask->Create(width, height, FXDIB_8bppMask)) |
834 return TRUE; | 834 return TRUE; |
835 | 835 |
836 pTextMask->Clear(0); | 836 pTextMask->Clear(0); |
837 CFX_FxgeDevice text_device; | 837 CFX_FxgeDevice text_device; |
838 text_device.Attach(pTextMask.get()); | 838 text_device.Attach(pTextMask.get()); |
839 for (FX_DWORD i = 0; i < pPageObj->m_ClipPath.GetTextCount(); i++) { | 839 for (FX_DWORD i = 0; i < pPageObj->m_ClipPath.GetTextCount(); i++) { |
840 CPDF_TextObject* textobj = pPageObj->m_ClipPath.GetText(i); | 840 CPDF_TextObject* textobj = pPageObj->m_ClipPath.GetText(i); |
(...skipping 13 matching lines...) Expand all Loading... |
854 bitmap_render.Initialize(m_pContext, &bitmap_device, NULL, m_pStopObj, NULL, | 854 bitmap_render.Initialize(m_pContext, &bitmap_device, NULL, m_pStopObj, NULL, |
855 NULL, &m_Options, 0, m_bDropObjects, pFormResource, | 855 NULL, &m_Options, 0, m_bDropObjects, pFormResource, |
856 TRUE); | 856 TRUE); |
857 bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix); | 857 bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix); |
858 m_bStopped = bitmap_render.m_bStopped; | 858 m_bStopped = bitmap_render.m_bStopped; |
859 if (pSMaskDict) { | 859 if (pSMaskDict) { |
860 CFX_Matrix smask_matrix; | 860 CFX_Matrix smask_matrix; |
861 FXSYS_memcpy(&smask_matrix, pGeneralState->m_SMaskMatrix, | 861 FXSYS_memcpy(&smask_matrix, pGeneralState->m_SMaskMatrix, |
862 sizeof smask_matrix); | 862 sizeof smask_matrix); |
863 smask_matrix.Concat(*pObj2Device); | 863 smask_matrix.Concat(*pObj2Device); |
864 nonstd::unique_ptr<CFX_DIBSource> pSMaskSource( | 864 std::unique_ptr<CFX_DIBSource> pSMaskSource( |
865 LoadSMask(pSMaskDict, &rect, &smask_matrix)); | 865 LoadSMask(pSMaskDict, &rect, &smask_matrix)); |
866 if (pSMaskSource) | 866 if (pSMaskSource) |
867 bitmap->MultiplyAlpha(pSMaskSource.get()); | 867 bitmap->MultiplyAlpha(pSMaskSource.get()); |
868 } | 868 } |
869 if (pTextMask) { | 869 if (pTextMask) { |
870 bitmap->MultiplyAlpha(pTextMask.get()); | 870 bitmap->MultiplyAlpha(pTextMask.get()); |
871 pTextMask.reset(); | 871 pTextMask.reset(); |
872 } | 872 } |
873 if (Transparency & PDFTRANS_GROUP && group_alpha != 1.0f) { | 873 if (Transparency & PDFTRANS_GROUP && group_alpha != 1.0f) { |
874 bitmap->MultiplyAlpha((int32_t)(group_alpha * 255)); | 874 bitmap->MultiplyAlpha((int32_t)(group_alpha * 255)); |
(...skipping 14 matching lines...) Expand all Loading... |
889 FX_BOOL bBackAlphaRequired) { | 889 FX_BOOL bBackAlphaRequired) { |
890 FX_RECT bbox = rect; | 890 FX_RECT bbox = rect; |
891 bbox.Intersect(m_pDevice->GetClipBox()); | 891 bbox.Intersect(m_pDevice->GetClipBox()); |
892 left = bbox.left; | 892 left = bbox.left; |
893 top = bbox.top; | 893 top = bbox.top; |
894 CFX_Matrix deviceCTM = m_pDevice->GetCTM(); | 894 CFX_Matrix deviceCTM = m_pDevice->GetCTM(); |
895 FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a); | 895 FX_FLOAT scaleX = FXSYS_fabs(deviceCTM.a); |
896 FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d); | 896 FX_FLOAT scaleY = FXSYS_fabs(deviceCTM.d); |
897 int width = FXSYS_round(bbox.Width() * scaleX); | 897 int width = FXSYS_round(bbox.Width() * scaleX); |
898 int height = FXSYS_round(bbox.Height() * scaleY); | 898 int height = FXSYS_round(bbox.Height() * scaleY); |
899 nonstd::unique_ptr<CFX_DIBitmap> pBackdrop(new CFX_DIBitmap); | 899 std::unique_ptr<CFX_DIBitmap> pBackdrop(new CFX_DIBitmap); |
900 if (bBackAlphaRequired && !m_bDropObjects) | 900 if (bBackAlphaRequired && !m_bDropObjects) |
901 pBackdrop->Create(width, height, FXDIB_Argb); | 901 pBackdrop->Create(width, height, FXDIB_Argb); |
902 else | 902 else |
903 m_pDevice->CreateCompatibleBitmap(pBackdrop.get(), width, height); | 903 m_pDevice->CreateCompatibleBitmap(pBackdrop.get(), width, height); |
904 | 904 |
905 if (!pBackdrop->GetBuffer()) | 905 if (!pBackdrop->GetBuffer()) |
906 return nullptr; | 906 return nullptr; |
907 | 907 |
908 FX_BOOL bNeedDraw; | 908 FX_BOOL bNeedDraw; |
909 if (pBackdrop->HasAlpha()) | 909 if (pBackdrop->HasAlpha()) |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1183 CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) { | 1183 CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) { |
1184 if (!pObj) | 1184 if (!pObj) |
1185 return nullptr; | 1185 return nullptr; |
1186 | 1186 |
1187 auto it = m_TransferFuncMap.find(pObj); | 1187 auto it = m_TransferFuncMap.find(pObj); |
1188 if (it != m_TransferFuncMap.end()) { | 1188 if (it != m_TransferFuncMap.end()) { |
1189 CPDF_CountedObject<CPDF_TransferFunc>* pTransferCounter = it->second; | 1189 CPDF_CountedObject<CPDF_TransferFunc>* pTransferCounter = it->second; |
1190 return pTransferCounter->AddRef(); | 1190 return pTransferCounter->AddRef(); |
1191 } | 1191 } |
1192 | 1192 |
1193 nonstd::unique_ptr<CPDF_Function> pFuncs[3]; | 1193 std::unique_ptr<CPDF_Function> pFuncs[3]; |
1194 FX_BOOL bUniTransfer = TRUE; | 1194 FX_BOOL bUniTransfer = TRUE; |
1195 FX_BOOL bIdentity = TRUE; | 1195 FX_BOOL bIdentity = TRUE; |
1196 if (CPDF_Array* pArray = pObj->AsArray()) { | 1196 if (CPDF_Array* pArray = pObj->AsArray()) { |
1197 bUniTransfer = FALSE; | 1197 bUniTransfer = FALSE; |
1198 if (pArray->GetCount() < 3) | 1198 if (pArray->GetCount() < 3) |
1199 return nullptr; | 1199 return nullptr; |
1200 | 1200 |
1201 for (FX_DWORD i = 0; i < 3; ++i) { | 1201 for (FX_DWORD i = 0; i < 3; ++i) { |
1202 pFuncs[2 - i].reset(CPDF_Function::Load(pArray->GetElementValue(i))); | 1202 pFuncs[2 - i].reset(CPDF_Function::Load(pArray->GetElementValue(i))); |
1203 if (!pFuncs[2 - i]) | 1203 if (!pFuncs[2 - i]) |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1398 item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) { | 1398 item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) { |
1399 CPDF_Dictionary* pOCG = | 1399 CPDF_Dictionary* pOCG = |
1400 ToDictionary(static_cast<CPDF_Object*>(item.GetParam())); | 1400 ToDictionary(static_cast<CPDF_Object*>(item.GetParam())); |
1401 if (!CheckOCGVisible(pOCG)) { | 1401 if (!CheckOCGVisible(pOCG)) { |
1402 return FALSE; | 1402 return FALSE; |
1403 } | 1403 } |
1404 } | 1404 } |
1405 } | 1405 } |
1406 return TRUE; | 1406 return TRUE; |
1407 } | 1407 } |
OLD | NEW |