DLLEXPORT FPDF_BOOL STDCALL FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject) { if (!pageObject) return FALSE; CPDF_PageObject* pPageObj = reinterpret_cast<CPDF_PageObject*>(pageObject); int blend_type = pPageObj->m_GeneralState.GetBlendType(); if (blend_type != FXDIB_BLEND_NORMAL) return TRUE; CPDF_Dictionary* pSMaskDict = ToDictionary(pPageObj->m_GeneralState.GetSoftMask()); if (pSMaskDict) return TRUE; if (pPageObj->m_GeneralState.GetFillAlpha() != 1.0f) return TRUE; if (pPageObj->IsPath() && pPageObj->m_GeneralState.GetStrokeAlpha() != 1.0f) { return TRUE; } if (pPageObj->IsForm()) { const CPDF_Form* pForm = pPageObj->AsForm()->form(); if (pForm) { int trans = pForm->m_Transparency; if ((trans & PDFTRANS_ISOLATED) || (trans & PDFTRANS_GROUP)) return TRUE; } } return FALSE; }
DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj) { CPDF_PageObject* pPageObj = reinterpret_cast<CPDF_PageObject*>(page_obj); if (!pPageObj) return; std::unique_ptr<CPDF_PageObject> pPageObjHolder(pPageObj); CPDF_Page* pPage = CPDFPageFromFPDFPage(page); if (!IsPageObject(pPage)) return; pPage->GetPageObjectList()->push_back(std::move(pPageObjHolder)); switch (pPageObj->GetType()) { case CPDF_PageObject::TEXT: { break; } case CPDF_PageObject::PATH: { CPDF_PathObject* pPathObj = pPageObj->AsPath(); pPathObj->CalcBoundingBox(); break; } case CPDF_PageObject::IMAGE: { CPDF_ImageObject* pImageObj = pPageObj->AsImage(); pImageObj->CalcBoundingBox(); break; } case CPDF_PageObject::SHADING: { CPDF_ShadingObject* pShadingObj = pPageObj->AsShading(); pShadingObj->CalcBoundingBox(); break; } case CPDF_PageObject::FORM: { CPDF_FormObject* pFormObj = pPageObj->AsForm(); pFormObj->CalcBoundingBox(); break; } default: { ASSERT(false); break; } } }
void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, const CFX_Matrix& formMatrix) { const CPDF_PageObjectList* pObjectList = pFormObj->form()->GetPageObjectList(); if (pObjectList->empty()) return; CFX_Matrix curFormMatrix = pFormObj->form_matrix() * formMatrix; for (auto it = pObjectList->begin(); it != pObjectList->end(); ++it) { CPDF_PageObject* pPageObj = it->get(); if (!pPageObj) continue; if (pPageObj->IsText()) ProcessTextObject(pPageObj->AsText(), curFormMatrix, pObjectList, it); else if (pPageObj->IsForm()) ProcessFormObject(pPageObj->AsForm(), curFormMatrix); } }
void CPDF_TextPage::ProcessObject() { if (m_pPage->GetPageObjectList()->empty()) return; m_TextlineDir = FindTextlineFlowOrientation(); const CPDF_PageObjectList* pObjList = m_pPage->GetPageObjectList(); for (auto it = pObjList->begin(); it != pObjList->end(); ++it) { CPDF_PageObject* pObj = it->get(); if (!pObj) continue; CFX_Matrix matrix; if (pObj->IsText()) ProcessTextObject(pObj->AsText(), matrix, pObjList, it); else if (pObj->IsForm()) ProcessFormObject(pObj->AsForm(), matrix); } for (const auto& obj : m_LineObj) ProcessTextObject(obj); m_LineObj.clear(); CloseTempLine(); }