void CPDF_PageObjectList::Transform(const CFX_Matrix& matrix) { FX_POSITION pos = m_ObjectList.GetHeadPosition(); while (pos) { CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos); pObj->Transform(matrix); } }
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; }
CPDF_Form* CPDF_Form::Clone() const { CPDF_Form* pClone = new CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources); FX_POSITION pos = m_ObjectList.GetHeadPosition(); while (pos) { CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos); pClone->m_ObjectList.AddTail(pObj->Clone()); } return pClone; }
DLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object, double a, double b, double c, double d, double e, double f) { CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object; if(pPageObj == NULL) return; //PDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject; CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f); pPageObj->Transform(matrix); }
DLLEXPORT void STDCALL FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object,double a, double b, double c, double d, double e, double f) { CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object; if(pPageObj == NULL) return; CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f); //Special treatment to shading object, because the ClipPath for shading object is already transformed. if(pPageObj->m_Type != PDFPAGE_SHADING) pPageObj->TransformClipPath(matrix); pPageObj->TransformGeneralState(matrix); }
DLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object, double a, double b, double c, double d, double e, double f) { CPDF_PageObject* pPageObj = reinterpret_cast<CPDF_PageObject*>(page_object); if (!pPageObj) return; CFX_Matrix matrix((FX_FLOAT)a, (FX_FLOAT)b, (FX_FLOAT)c, (FX_FLOAT)d, (FX_FLOAT)e, (FX_FLOAT)f); pPageObj->Transform(matrix); }
bool CPDF_TextPage::IsSameAsPreTextObject( CPDF_TextObject* pTextObj, const CPDF_PageObjectList* pObjList, CPDF_PageObjectList::const_iterator iter) { int i = 0; while (i < 5 && iter != pObjList->begin()) { --iter; CPDF_PageObject* pOtherObj = iter->get(); if (pOtherObj == pTextObj || !pOtherObj->IsText()) continue; if (IsSameTextObject(pOtherObj->AsText(), pTextObj)) return true; ++i; } return false; }
CPDF_PageObjects::~CPDF_PageObjects() { if (m_pParser) { delete m_pParser; } if (!m_bReleaseMembers) { return; } FX_POSITION pos = m_ObjectList.GetHeadPosition(); while (pos) { CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos); if (!pPageObj) { continue; } pPageObj->Release(); } }
void CPDF_PageObjects::ClearCacheObjects() { m_ParseState = PDF_CONTENT_NOT_PARSED; if (m_pParser) { delete m_pParser; } m_pParser = NULL; if (m_bReleaseMembers) { FX_POSITION pos = m_ObjectList.GetHeadPosition(); while (pos) { CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos); if (!pPageObj) { continue; } pPageObj->Release(); } } m_ObjectList.RemoveAll(); }
FPDF_EXPORT void FPDF_CALLCONV FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object, double a, double b, double c, double d, double e, double f) { CPDF_PageObject* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object); if (!pPageObj) return; CFX_Matrix matrix((float)a, (float)b, (float)c, (float)d, (float)e, (float)f); // Special treatment to shading object, because the ClipPath for shading // object is already transformed. if (!pPageObj->IsShading()) pPageObj->TransformClipPath(matrix); pPageObj->TransformGeneralState(matrix); }
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_PageContentGenerator::GenerateContent() { CFX_ByteTextBuf buf; CPDF_Dictionary* pPageDict = m_pPage->m_pFormDict; for (int i = 0; i < m_pageObjects.GetSize(); ++i) { CPDF_PageObject* pPageObj = m_pageObjects[i]; if (!pPageObj || !pPageObj->IsImage()) { continue; } ProcessImage(buf, pPageObj->AsImage()); } CPDF_Object* pContent = pPageDict ? pPageDict->GetDirectObjectFor("Contents") : nullptr; if (pContent) pPageDict->RemoveFor("Contents"); CPDF_Stream* pStream = new CPDF_Stream; pStream->SetData(buf.GetBuffer(), buf.GetLength()); pPageDict->SetReferenceFor("Contents", m_pDocument, m_pDocument->AddIndirectObject(pStream)); }
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(); }
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_ProgressiveRenderer::Continue(IFX_Pause* pPause) { while (m_Status == ToBeContinued) { if (!m_pCurrentLayer) { if (m_LayerIndex >= m_pContext->CountLayers()) { m_Status = Done; return; } m_pCurrentLayer = m_pContext->GetLayer(m_LayerIndex); m_LastObjectRendered = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end(); m_pRenderStatus.reset(new CPDF_RenderStatus()); m_pRenderStatus->Initialize( m_pContext, m_pDevice, nullptr, nullptr, nullptr, nullptr, m_pOptions, m_pCurrentLayer->m_pObjectHolder->m_Transparency, FALSE, nullptr); m_pDevice->SaveState(); m_ClipRect = CFX_FloatRect(m_pDevice->GetClipBox()); CFX_Matrix device2object; device2object.SetReverse(m_pCurrentLayer->m_Matrix); device2object.TransformRect(m_ClipRect); } CPDF_PageObjectList::iterator iter; CPDF_PageObjectList::iterator iterEnd = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end(); if (m_LastObjectRendered != iterEnd) { iter = m_LastObjectRendered; ++iter; } else { iter = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->begin(); } int nObjsToGo = kStepLimit; while (iter != iterEnd) { CPDF_PageObject* pCurObj = iter->get(); if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Right >= m_ClipRect.left && pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_ClipRect.bottom) { if (m_pRenderStatus->ContinueSingleObject( pCurObj, &m_pCurrentLayer->m_Matrix, pPause)) { return; } if (pCurObj->IsImage() && m_pRenderStatus->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) { m_pContext->GetPageCache()->CacheOptimization( m_pRenderStatus->m_Options.m_dwLimitCacheSize); } if (pCurObj->IsForm() || pCurObj->IsShading()) { nObjsToGo = 0; } else { --nObjsToGo; } } m_LastObjectRendered = iter; if (nObjsToGo == 0) { if (pPause && pPause->NeedToPauseNow()) return; nObjsToGo = kStepLimit; } ++iter; } if (m_pCurrentLayer->m_pObjectHolder->IsParsed()) { m_pRenderStatus.reset(); m_pDevice->RestoreState(false); m_pCurrentLayer = nullptr; m_LayerIndex++; if (pPause && pPause->NeedToPauseNow()) { return; } } else { m_pCurrentLayer->m_pObjectHolder->ContinueParse(pPause); if (!m_pCurrentLayer->m_pObjectHolder->IsParsed()) return; } } }
CPDF_PageObject* CPDF_PageObject::Clone() const { CPDF_PageObject* pObj = Create(m_Type); pObj->Copy(this); return pObj; }