diff options
Diffstat (limited to 'core/src')
-rw-r--r-- | core/src/reflow/autoreflow.cpp | 777 | ||||
-rw-r--r-- | core/src/reflow/autoreflow.h | 125 | ||||
-rw-r--r-- | core/src/reflow/layoutprocessor_reflow.cpp | 1551 | ||||
-rw-r--r-- | core/src/reflow/layoutprovider_taggedpdf.cpp | 769 | ||||
-rw-r--r-- | core/src/reflow/layoutprovider_taggedpdf.h | 85 | ||||
-rw-r--r-- | core/src/reflow/reflowedpage.cpp | 617 | ||||
-rw-r--r-- | core/src/reflow/reflowedpage.h | 374 | ||||
-rw-r--r-- | core/src/reflow/reflowedtextpage.cpp | 395 | ||||
-rw-r--r-- | core/src/reflow/reflowedtextpage.h | 74 | ||||
-rw-r--r-- | core/src/reflow/reflowengine.cpp | 34 |
10 files changed, 0 insertions, 4801 deletions
diff --git a/core/src/reflow/autoreflow.cpp b/core/src/reflow/autoreflow.cpp deleted file mode 100644 index a5285f375c..0000000000 --- a/core/src/reflow/autoreflow.cpp +++ /dev/null @@ -1,777 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "autoreflow.h" -#define approachto(a,b,c) (FXSYS_fabs((float)((a)-(b)))>(c) ? 0 : 1) -int FPDF_ProcessInterObj(const CPDF_PageObject* pPrevObj, const CPDF_PageObject* pObj) -{ - CFX_AffineMatrix matrix; - FX_RECT PreRect = pPrevObj->GetBBox(&matrix); - FX_RECT rect = pObj->GetBBox(&matrix); - int flag = 0; - if(PreRect.top > rect.bottom) { - flag = 0; - } else if(rect.top > PreRect.bottom) { - flag = 1; - } else if(PreRect.right < rect.left) { - flag = 0; - } else if(PreRect.left > rect.right) { - flag = 1; - } else if(pObj->m_Type != PDFPAGE_TEXT) { - flag = 1; - } else if(pPrevObj->m_Type != PDFPAGE_TEXT) { - flag = 0; - } else { - if((PreRect.top < rect.top && PreRect.bottom > rect.bottom) || - (PreRect.top > rect.top && PreRect.bottom < rect.bottom)) { - if(PreRect.left > rect.left) { - flag = 1; - } else { - flag = 0; - } - } else { - CPDF_TextObject* pPrevTextObj = (CPDF_TextObject* )pPrevObj; - CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj; - CPDF_TextObjectItem item, prevItem; - pPrevTextObj->GetItemInfo(0, &prevItem); - pTextObj->GetItemInfo(0, &item); - CFX_AffineMatrix TextMatrix; - pTextObj->GetTextMatrix(&TextMatrix); - FX_FLOAT originX, originY, prevOriginX, preOriginY; - TextMatrix.Transform(item.m_OriginX, item.m_OriginY, originX, originY); - pPrevTextObj->GetTextMatrix(&TextMatrix); - TextMatrix.Transform(prevItem.m_OriginX, prevItem.m_OriginY, prevOriginX, preOriginY); - if(preOriginY > originY) { - flag = 0; - } else { - flag = 1; - } - } - } - return flag; -} -void CPDF_AutoReflowLayoutProvider::Conver2AppreceOrder(const CPDF_PageObjects* pStreamOrderObjs, CPDF_PageObjects* pAppraceOrderObjs) -{ - FX_POSITION pos = pStreamOrderObjs->GetFirstObjectPosition(); - CFX_AffineMatrix matrix; - while(pos) { - CPDF_PageObject* pObj = pStreamOrderObjs->GetNextObject(pos); - CFX_AffineMatrix matrix; - if(pObj->m_Type != PDFPAGE_TEXT) { - continue; - } - FX_POSITION pos1 = pAppraceOrderObjs->GetLastObjectPosition(); - while(pos1) { - CPDF_PageObject* pTempObj = pAppraceOrderObjs->GetPrevObject(pos1); - if(FPDF_ProcessInterObj(pObj, pTempObj) == 1) { - if(!pos1) { - pos1 = pAppraceOrderObjs->GetFirstObjectPosition(); - } else { - pAppraceOrderObjs->GetNextObject(pos1); - } - break; - } - } - pAppraceOrderObjs->InsertObject(pos1, pObj); - } - pos = pStreamOrderObjs->GetFirstObjectPosition(); - while(pos) { - CPDF_PageObject* pObj = pStreamOrderObjs->GetNextObject(pos); - if(pObj->m_Type != PDFPAGE_IMAGE) { - continue; - } - FX_POSITION pos1 = pAppraceOrderObjs->GetLastObjectPosition(); - while(pos1) { - CPDF_PageObject* pTempObj = pAppraceOrderObjs->GetPrevObject(pos1); - if(FPDF_ProcessInterObj(pObj, pTempObj) == 1) { - if(!pos1) { - pos1 = pAppraceOrderObjs->GetFirstObjectPosition(); - } else { - pAppraceOrderObjs->GetNextObject(pos1); - } - break; - } - } - pAppraceOrderObjs->InsertObject(pos1, pObj); - } -} -IPDF_LayoutProvider* IPDF_LayoutProvider::Create_LayoutProvider_AutoReflow(CPDF_PageObjects* pPage, FX_BOOL bReadOrder) -{ - return new CPDF_AutoReflowLayoutProvider(pPage, bReadOrder); -} -CPDF_AutoReflowElement::CPDF_AutoReflowElement(LayoutType layoutType , CPDF_AutoReflowElement* pParent) -{ - m_ElmType = layoutType; - m_pParentElm = pParent; - if(pParent) { - pParent->m_ChildArray.Add(this); - } - m_SpaceBefore = 0; -} -CPDF_AutoReflowElement::~CPDF_AutoReflowElement() -{ - m_ChildArray.RemoveAll(); - m_ObjArray.RemoveAll(); -} -int CPDF_AutoReflowElement::CountAttrValues(LayoutAttr attr_type) -{ - return 1; -} -LayoutEnum CPDF_AutoReflowElement::GetEnumAttr(LayoutAttr attr_type, int index ) -{ - return LayoutInvalid; -} -FX_FLOAT CPDF_AutoReflowElement::GetNumberAttr(LayoutAttr attr_type, int index ) -{ - switch (attr_type) { - case LayoutSpaceBefore: - return m_SpaceBefore; - default: - return 0; - } -} -FX_COLORREF CPDF_AutoReflowElement::GetColorAttr(LayoutAttr attr_type, int index ) -{ - return 0; -} -#define WritingMode_UNKNOW 0 -#define WritingMode_LRTB 1 -#define WritingMode_RLTB 2 -#define WritingMode_TBRL 3 -CPDF_AutoReflowLayoutProvider::CPDF_AutoReflowLayoutProvider(CPDF_PageObjects* pPage, FX_BOOL bReadOrder) -{ - m_pPDFPage = (CPDF_Page*)pPage; - FX_FLOAT width = m_pPDFPage->GetPageWidth(); - FX_FLOAT height = m_pPDFPage->GetPageHeight(); - m_pPDFPage->GetDisplayMatrix(m_PDFDisplayMatrix, 0, 0, (int)(m_pPDFPage->GetPageWidth()), (int)(m_pPDFPage->GetPageHeight()), 0); - m_bReadOrder = bReadOrder; - m_Status = LayoutReady; - m_pRoot = NULL; - m_pCurrElm = NULL; - m_pPreObj = NULL; - m_Step = 0; - m_WritingMode = WritingMode_UNKNOW; -} -CPDF_AutoReflowLayoutProvider::~CPDF_AutoReflowLayoutProvider() -{ - m_pPDFPage = NULL; - ReleaseElm(m_pRoot); -} -void CPDF_AutoReflowLayoutProvider::ReleaseElm(CPDF_AutoReflowElement*& pElm, FX_BOOL bReleaseChildren) -{ - if(bReleaseChildren) { - int count = pElm->CountChildren(); - for(int i = 0; i < count; i++) { - CPDF_AutoReflowElement* pChild = (CPDF_AutoReflowElement*)pElm->GetChild(i); - ReleaseElm(pChild); - } - } - delete pElm; - pElm = NULL; -} -void CPDF_AutoReflowLayoutProvider::AddObjectArray(CPDF_AutoReflowElement* pElm, CFX_PtrList& ObjList) -{ - if(!pElm) { - return; - } - FX_POSITION pos = ObjList.GetHeadPosition(); - while (pos) { - pElm->m_ObjArray.Add((CPDF_PageObject*)ObjList.GetNext(pos)); - } -} -void CPDF_AutoReflowLayoutProvider::GenerateStructTree() -{ - if (m_Step < AUTOREFLOW_STEP_GENERATELINE) { - GenerateLine(m_cellArray); - if(m_cellArray.GetSize() == 0) { - m_Status = LayoutError; - return; - } - if(m_pPause && m_pPause->NeedToPauseNow()) { - m_Step = AUTOREFLOW_STEP_GENERATELINE; - m_Status = LayoutToBeContinued; - return; - } - } - if (m_Step < AUTOREFLOW_STEP_GENERATEParagraph) { - GenerateParagraph(m_cellArray); - if(m_pPause && m_pPause->NeedToPauseNow()) { - m_Step = AUTOREFLOW_STEP_GENERATEParagraph; - m_Status = LayoutToBeContinued; - return; - } - } - if (m_Step < AUTOREFLOW_STEP_CREATEELEMENT) { - CreateElement(); - if(m_pPause && m_pPause->NeedToPauseNow()) { - m_Step = AUTOREFLOW_STEP_CREATEELEMENT; - m_Status = LayoutToBeContinued; - return; - } - } - if (m_Step < AUTOREFLOW_STEP_REMOVEDATA) { - int count = m_cellArray.GetSize(); - for(int i = 0; i < count; i++) { - CRF_CELL* pCell = (CRF_CELL*)m_cellArray.GetAt(i); - if(pCell) { - pCell->m_ObjList.RemoveAll(); - delete pCell; - } - } - m_cellArray.RemoveAll(); - if(m_pPause && m_pPause->NeedToPauseNow()) { - m_Step = AUTOREFLOW_STEP_REMOVEDATA; - m_Status = LayoutToBeContinued; - return; - } - } - m_Step = AUTOREFLOW_STEP_REMOVEDATA; - m_Status = LayoutFinished; - return; -} -void CPDF_AutoReflowLayoutProvider::CreateElement() -{ - int count = m_cellArray.GetSize(); - CRF_CELL* plastCell = NULL; - CRF_CELL* pCell = NULL; - CRF_CELL* pNextCell = NULL; - CPDF_AutoReflowElement* pParent = m_pRoot; - CPDF_AutoReflowElement* pCurrElm = NULL; - int i; - for(i = 0; i < count; i++) { - pCell = (CRF_CELL*)m_cellArray.GetAt(i); - if(!pCell) { - continue; - } - if(i < count - 1) { - pNextCell = (CRF_CELL*)m_cellArray.GetAt(i + 1); - } else { - pNextCell = NULL; - } - pCurrElm = new CPDF_AutoReflowElement(LayoutParagraph, pParent); - if(pCurrElm->GetType() == LayoutParagraph && plastCell) { - int SpaceBefore = 0; - if(pCell->m_CellWritingMode != plastCell->m_CellWritingMode ) { - SpaceBefore = 20; - } else if(pCell->m_CellWritingMode == WritingMode_LRTB) { - SpaceBefore = plastCell->m_BBox.bottom - pCell->m_BBox.top; - } else if(pCell->m_CellWritingMode == WritingMode_TBRL) { - SpaceBefore = plastCell->m_BBox.left - pCell->m_BBox.right; - } - if(SpaceBefore > 0) { - pCurrElm->m_SpaceBefore = SpaceBefore > 50 ? 50.0f : SpaceBefore; - } - } - AddObjectArray(pCurrElm, pCell->m_ObjList); - plastCell = pCell; - } -} -void CPDF_AutoReflowLayoutProvider::GenerateParagraph(CFX_PtrArray& cellArray) -{ - int count = cellArray.GetSize(); - if(count <= 1) { - return; - } - CRF_CELL* plastCell = (CRF_CELL*)cellArray.GetAt(0); - if(plastCell->m_BBox.Height() > plastCell->m_BBox.Width()) { - m_WritingMode = WritingMode_TBRL; - } else { - m_WritingMode = WritingMode_LRTB; - } - FX_BOOL bEnforce = FALSE; - int i = 0; - for(i = 1; i < count; i++) { - CRF_CELL* pCell = (CRF_CELL*)cellArray.GetAt(i); - if(!pCell) { - continue; - } - int c = pCell->m_ObjList.GetCount(); - FX_BOOL bMerge = FALSE; - FX_POSITION pos1 = plastCell->m_ObjList.GetTailPosition(); - CPDF_PageObject* pLastObj = (CPDF_PageObject*)plastCell->m_ObjList.GetPrev(pos1); - pos1 = pCell->m_ObjList.GetHeadPosition(); - CPDF_PageObject* pCurObj = (CPDF_PageObject*)pCell->m_ObjList.GetNext(pos1); - int WritingMode = GetRectEnd(pCell->m_BBox); - if(pCell->m_CellWritingMode == WritingMode_UNKNOW) { - if(pCell->m_BBox.Height() > pCell->m_BBox.Width()) { - pCell->m_CellWritingMode = WritingMode_TBRL; - } else { - pCell->m_CellWritingMode = WritingMode_LRTB; - } - } - WritingMode = pCell->m_CellWritingMode; - if(WritingMode == WritingMode_LRTB && (m_Style.m_Language & LP_Lang_ChinesePRC || m_Style.m_Language & LP_Lang_ChineseTaiwan - || m_Style.m_Language & LP_Lang_Japanese || m_Style.m_Language & LP_Lang_Korean)) { - if(pCurObj->m_Type == PDFPAGE_TEXT) { - CPDF_TextObject* pText; - pText = (CPDF_TextObject*)pCurObj; - if(pText->CountItems()) { - CPDF_TextObjectItem item; - pText->GetItemInfo(0, &item); - CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode); - FX_WCHAR unicode = str.GetAt(0); - if(unicode == 32) { - plastCell = pCell; - bMerge = FALSE; - bEnforce = FALSE; - continue; - } - } - } - } - if(m_WritingMode == WritingMode) { - if(bEnforce) { - bMerge = FALSE; - bEnforce = FALSE; - if(pCurObj->m_Type == PDFPAGE_TEXT) { - CPDF_TextObject* pText; - pText = (CPDF_TextObject*)pCurObj; - if(pText->CountItems()) { - CPDF_TextObjectItem item; - pText->GetItemInfo(0, &item); - CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode); - FX_WCHAR unicode = str.GetAt(0); - if(unicode > 96 && unicode < 123) { - bMerge = TRUE; - } - } - } else { - CPDF_ImageObject* pImage = (CPDF_ImageObject*)pCurObj; - FX_RECT imageBBox = pImage->GetBBox(&m_PDFDisplayMatrix); - if(GetRectEnd(plastCell->m_BBox) - GetRectEnd(pCell->m_BBox) < GetRectWidth(imageBBox)) { - bMerge = TRUE; - } - } - } else { - if(!approachto(GetRectStart(pCell->m_BBox), GetRectStart(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) / 4)) { - if(approachto(GetRectStart(plastCell->m_BBox), GetRectStart(pCell->m_BBox), GetRectHeight(pCell->m_BBox) * 2.3) && - GetRectStart(plastCell->m_BBox) - GetRectStart(pCell->m_BBox) > 0) { - if(pCurObj->m_Type == PDFPAGE_TEXT || pLastObj->m_Type == PDFPAGE_TEXT) { - CPDF_TextObject* pText; - if(pCurObj->m_Type == PDFPAGE_TEXT) { - pText = (CPDF_TextObject*)pCurObj; - } else { - pText = (CPDF_TextObject*)pLastObj; - } - CPDF_TextObjectItem item; - pText->GetItemInfo(0, &item); - CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode); - FX_WCHAR unicode = str.GetAt(0); - if(unicode > 255) { - bMerge = TRUE; - } - } - } - } else if(!approachto(GetRectEnd(pCell->m_BBox), GetRectEnd(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) * 3)) { - FX_RECT rect = pLastObj->GetBBox(&m_PDFDisplayMatrix); - if(approachto(GetRectStart(pCell->m_BBox), GetRectStart(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) / 4)) { - if(GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) > 0) { - bMerge = TRUE; - bEnforce = TRUE; - } else if(GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) <= 0 && - GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) > GetRectHeight(pCell->m_BBox) * -3) { - if(pCurObj->m_Type == PDFPAGE_TEXT) { - CPDF_TextObject* pText = (CPDF_TextObject*)pCurObj; - CPDF_TextObjectItem item; - pText->GetItemInfo(0, &item); - CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode); - FX_WCHAR unicode = str.GetAt(0); - if(unicode > 96 && unicode < 123) { - bMerge = TRUE; - } - } - } - } - } else { - bMerge = TRUE; - } - } - } else { - m_WritingMode = WritingMode; - bEnforce = FALSE; - } - if(bMerge) { - if(GetRectEnd(plastCell->m_BBox) - GetRectEnd(pCell->m_BBox) > 30) { - bEnforce = TRUE; - } - FX_POSITION pos = pCell->m_ObjList.GetHeadPosition(); - while(pos) { - plastCell->m_ObjList.AddTail(pCell->m_ObjList.GetNext(pos)); - } - plastCell->m_BBox.Union(pCell->m_BBox); - pCell->m_ObjList.RemoveAll(); - delete pCell; - cellArray.RemoveAt(i); - i--; - count--; - } else { - plastCell = pCell; - } - } -} -void CPDF_AutoReflowLayoutProvider::ProcessObj(CFX_PtrArray& cellArray, CPDF_PageObject* pObj, CFX_AffineMatrix matrix) -{ -} -int32_t CPDF_AutoReflowLayoutProvider::LogicPreObj(CPDF_PageObject* pObj) -{ - CPDF_PageObject* pPreObj = m_pPreObj; - m_pPreObj = pObj; - if(!pPreObj) { - return 0; - } - if(pPreObj->m_Type != pObj->m_Type) { - return 0; - } - CFX_FloatRect rcCurObj(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top); - CFX_FloatRect rcPreObj(pPreObj->m_Left, pPreObj->m_Bottom, pPreObj->m_Right, pPreObj->m_Top); - if(pObj->m_Type == PDFPAGE_IMAGE) { - if(rcPreObj.Contains(rcCurObj)) { - return 2; - } - if(rcCurObj.Contains(rcPreObj)) { - return 2; - } - return 0; - } - if(pObj->m_Type == PDFPAGE_TEXT) { - if(!((rcPreObj.bottom > rcCurObj.top) || (rcPreObj.top < rcCurObj.bottom))) { - FX_FLOAT height = FX_MIN(rcPreObj.Height(), rcCurObj.Height()); - if((rcCurObj.left - rcPreObj.right) > height / 3) { - return 3; - } - } - if(FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) >= 2 || FXSYS_fabs(rcPreObj.Height() - rcCurObj.Height()) >= 2 ) { - return 0; - } - CPDF_TextObject* pPreTextObj = (CPDF_TextObject*)pPreObj; - CPDF_TextObject* pCurTextObj = (CPDF_TextObject*)pObj; - int nPreCount = pPreTextObj->CountItems(); - int nCurCount = pCurTextObj->CountItems(); - if (nPreCount != nCurCount) { - return 0; - } - FX_BOOL bSame = TRUE; - for (int i = 0; i < nPreCount; i++) { - CPDF_TextObjectItem itemPer, itemCur; - pPreTextObj->GetItemInfo(i, &itemPer); - pCurTextObj->GetItemInfo(i, &itemCur); - if (itemCur.m_CharCode != itemPer.m_CharCode) { - return 0; - } - if (itemCur.m_OriginX != itemPer.m_OriginX) { - bSame = FALSE; - } - if (itemCur.m_OriginY != itemPer.m_OriginY) { - bSame = FALSE; - } - } - if(rcPreObj.left == rcCurObj.left && rcPreObj.top == rcCurObj.top) { - return 1; - } - if(FXSYS_fabs(rcPreObj.left - rcCurObj.left) < rcPreObj.Width() / 3 - && FXSYS_fabs(rcPreObj.top - rcCurObj.top) < rcPreObj.Height() / 3) { - return 2; - } - } - return 0; -} -void CPDF_AutoReflowLayoutProvider::GenerateLine(CFX_PtrArray& cellArray) -{ - CRF_CELL* pCell = NULL; - CFX_AffineMatrix matrix; - FX_POSITION pos = m_pPDFPage->GetFirstObjectPosition(); - if(!pos) { - return; - } - FX_FLOAT PDFWidth = m_pPDFPage->GetPageWidth(); - FX_FLOAT PDFHeight = m_pPDFPage->GetPageHeight(); - m_pPDFPage->GetDisplayMatrix(m_PDFDisplayMatrix, 0, 0, (int)PDFWidth, (int)PDFHeight, 0); - CPDF_PageObject* pPerObj = NULL; - int a = 0; - CFX_FloatRect pageBBox = m_pPDFPage->m_BBox; - FX_FLOAT PrevX = 0 , PrevY = 0, PosX, PosY; - while(pos) { - CPDF_PageObject* pObj = m_pPDFPage->GetNextObject(pos); - if(!pObj || pObj->m_Type == PDFPAGE_PATH) { - continue; - } - int logic = LogicPreObj(pObj); - if(logic == 2) { - if(pCell) { - pCell->m_ObjList.SetAt(pCell->m_ObjList.GetTailPosition(), pObj); - } - continue; - } - if (pObj->m_Type == PDFPAGE_TEXT) { - CPDF_TextObject* pTextObj = (CPDF_TextObject*)pObj; - int textmode = pTextObj->m_TextState.GetObject()->m_TextMode; - if(m_Style.m_bIgnoreInvisibleText && pTextObj->m_TextState.GetObject()->m_TextMode == 3) { - continue; - } - PosX = pTextObj->GetPosX(); - PosY = pTextObj->GetPosY(); - m_PDFDisplayMatrix.Transform(PosX, PosY); - } else { - PosX = 0; - PosY = 0; - } - FX_BOOL bNewLine = TRUE; - FX_RECT ObjBBox = pObj->GetBBox(&m_PDFDisplayMatrix); - if(ObjBBox.left > PDFWidth || ObjBBox.right < 0 || - ObjBBox.bottom < 0 || ObjBBox.top > PDFHeight) { - continue; - } - if(ObjBBox.IsEmpty()) { - continue; - } - a++; - if(!pCell) { - bNewLine = TRUE; - m_WritingMode = GetWritingMode(NULL, pObj); - } else { - int WritingMode = GetWritingMode(pPerObj, pObj); - if(m_WritingMode == WritingMode || m_WritingMode == WritingMode_UNKNOW || WritingMode == WritingMode_UNKNOW) { - if(WritingMode != WritingMode_UNKNOW) { - m_WritingMode = WritingMode; - } - if(m_WritingMode == WritingMode_TBRL) { - if(!(GetRectBottom(ObjBBox) > GetRectTop(pCell->m_BBox) || - GetRectTop(ObjBBox) < GetRectBottom(pCell->m_BBox))) { - bNewLine = FALSE; - } - } else { - if(!(GetRectBottom(ObjBBox) < GetRectTop(pCell->m_BBox) || - GetRectTop(ObjBBox) > GetRectBottom(pCell->m_BBox))) { - bNewLine = FALSE; - } - if (pObj->m_Type == PDFPAGE_TEXT) { - if(FXSYS_fabs(PrevY - PosY) < 1 ) { - bNewLine = FALSE; - } - } - } - } else { - m_WritingMode = WritingMode; - } - } - pPerObj = pObj; - if(bNewLine) { - int c = pCell ? pCell->m_ObjList.GetCount() : 0; - pCell = new CRF_CELL; - pCell->m_CellWritingMode = m_WritingMode; - pCell->m_BBox = ObjBBox; - if(pObj->m_Type == PDFPAGE_TEXT) { - FX_FLOAT x = ((CPDF_TextObject*)pObj)->GetPosX(), y = ((CPDF_TextObject*)pObj)->GetPosY(); - m_PDFDisplayMatrix.Transform(x, y); - if(x < ObjBBox.left) { - pCell->m_BBox.left = (int)x; - } - } - pCell->m_ObjList.AddTail(pObj); - cellArray.Add(pCell); - } else { - pCell->m_ObjList.AddTail(pObj); - pCell->m_BBox.Union(ObjBBox); - } - PrevX = PosX; - PrevY = PosY; - } -} -FX_FLOAT CPDF_AutoReflowLayoutProvider::GetLayoutOrderHeight(CPDF_PageObject* pCurObj) -{ - CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top); - if (m_WritingMode == WritingMode_TBRL) { - return rcCurObj.Width(); - } - return rcCurObj.Height(); -} -FX_FLOAT CPDF_AutoReflowLayoutProvider::GetLayoutOrderWidth(CPDF_PageObject* pCurObj) -{ - CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top); - if (m_WritingMode == WritingMode_TBRL) { - return rcCurObj.Height(); - } - return rcCurObj.Width(); -} -int CPDF_AutoReflowLayoutProvider:: GetRectWidth(FX_RECT rect) -{ - if(m_WritingMode == WritingMode_TBRL) { - return rect.Height(); - } - return rect.Width(); -} -int CPDF_AutoReflowLayoutProvider:: GetRectHeight(FX_RECT rect) -{ - if(m_WritingMode == WritingMode_TBRL) { - return rect.Width(); - } - return rect.Height(); -} -int CPDF_AutoReflowLayoutProvider:: GetRectStart(FX_RECT rect) -{ - if(m_WritingMode == WritingMode_TBRL) { - return rect.top; - } - return rect.left; -} -int CPDF_AutoReflowLayoutProvider:: GetRectEnd(FX_RECT rect) -{ - if(m_WritingMode == WritingMode_TBRL) { - return rect.bottom; - } - return rect.right; -} -int CPDF_AutoReflowLayoutProvider:: GetRectTop(FX_RECT rect) -{ - if(m_WritingMode == WritingMode_TBRL) { - return rect.right; - } - return rect.top; -} -int CPDF_AutoReflowLayoutProvider:: GetRectBottom(FX_RECT rect) -{ - if(m_WritingMode == WritingMode_TBRL) { - return rect.left; - } - return rect.bottom; -} -int CPDF_AutoReflowLayoutProvider::GetWritingMode(CPDF_PageObject* pPreObj, CPDF_PageObject* pCurObj) -{ - CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top); - if(pCurObj->m_Type == PDFPAGE_TEXT) { - CPDF_TextObject* ptextObj = (CPDF_TextObject* )pCurObj; - int count = ptextObj->CountItems(); - if(count > 1) { - CPDF_TextObjectItem Item1, Item2; - ptextObj->GetItemInfo(0, &Item1); - ptextObj->GetItemInfo(count - 1, &Item2); - if(Item2.m_CharCode == -1 && count > 2) { - ptextObj->GetItemInfo(2, &Item2); - } - CFX_AffineMatrix textMatrix; - ptextObj->GetTextMatrix(&textMatrix); - textMatrix.Transform(Item1.m_OriginX, Item1.m_OriginY); - textMatrix.Transform(Item2.m_OriginX, Item2.m_OriginY); - FX_FLOAT dx = FXSYS_fabs(Item1.m_OriginX - Item2.m_OriginX); - FX_FLOAT dy = FXSYS_fabs(Item1.m_OriginY - Item2.m_OriginY); - return dx >= dy ? WritingMode_LRTB : WritingMode_TBRL; - } else { - if(m_WritingMode != WritingMode_UNKNOW) { - return m_WritingMode; - } - } - } - if(pPreObj) { - FX_FLOAT threshold = rcCurObj.Width() / 4; - if(m_WritingMode == WritingMode_LRTB) { - if(FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) < threshold * 2 - && FXSYS_fabs(pPreObj->m_Top - pCurObj->m_Top) < threshold * 2) { - return m_WritingMode; - } - FX_FLOAT mid = (pCurObj->m_Bottom + pCurObj->m_Top) / 2; - if(mid > pPreObj->m_Bottom && mid < pPreObj->m_Top && pCurObj->m_Right > pPreObj->m_Right) { - return m_WritingMode; - } - } else if(m_WritingMode == WritingMode_TBRL) { - if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) < threshold * 2 - && FXSYS_fabs(pPreObj->m_Right - pCurObj->m_Right) < threshold * 2) { - return m_WritingMode; - } - FX_FLOAT mid = (pCurObj->m_Right + pCurObj->m_Left) / 2; - if(mid > pPreObj->m_Left && mid < pPreObj->m_Right && pCurObj->m_Bottom < pPreObj->m_Bottom) { - return m_WritingMode; - } - } - if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) < threshold && - FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) > threshold * 2) { - return WritingMode_TBRL; - } - if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) > threshold && - FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) < threshold * 2) { - return WritingMode_LRTB; - } - int count = 0; - if(pPreObj->m_Type == PDFPAGE_TEXT) { - CPDF_TextObject* ptextObj = (CPDF_TextObject* )pCurObj; - count = ptextObj->CountItems(); - } - if(pPreObj->m_Type != PDFPAGE_TEXT || count == 1) { - if(pCurObj->m_Left > pPreObj->m_Right) { - FX_FLOAT mid = (pCurObj->m_Top + pCurObj->m_Bottom) / 2; - if(mid < pPreObj->m_Top && mid > pPreObj->m_Bottom) { - return WritingMode_LRTB; - } - } - if(pCurObj->m_Top < pPreObj->m_Bottom) { - FX_FLOAT mid = (pCurObj->m_Left + pCurObj->m_Right) / 2; - if(mid < pPreObj->m_Right && mid > pPreObj->m_Left) { - return WritingMode_TBRL; - } - } - } - } - return WritingMode_UNKNOW; -} -LayoutStatus CPDF_AutoReflowLayoutProvider::StartLoad(IFX_Pause* pPause) -{ - m_pPause = pPause; - m_pRoot = new CPDF_AutoReflowElement(LayoutDocument); - m_Step = 0; - return Continue(); -} -LayoutStatus CPDF_AutoReflowLayoutProvider::Continue() -{ - GenerateStructTree(); - return m_Status; -} -int CPDF_AutoReflowLayoutProvider::GetPosition() -{ - if(m_Step == 0) { - return 0; - } else { - return m_Step * 100 / AUTOREFLOW_STEP_REMOVEDATA; - } -} -FX_FLOAT CPDF_AutoReflowLayoutProvider::GetObjMinCell(CPDF_PageObject* pObj) -{ - if(!pObj) { - return 0; - } - if(pObj->m_Type != PDFPAGE_TEXT) { - CFX_AffineMatrix matrix; - FX_RECT rect = pObj->GetBBox(&matrix); - return (FX_FLOAT)(rect.Width()); - } - CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj; - int count = pTextObj->CountItems(); - for(int i = 0; i < count; i++) { - CPDF_TextObjectItem Item; - pTextObj->GetItemInfo(i, &Item); - if(Item.m_CharCode == -1) { - continue; - } - if((Item.m_CharCode > 47 && Item.m_CharCode < 58) || (Item.m_CharCode > 64 && Item.m_CharCode < 91) - || (Item.m_CharCode > 96 && Item.m_CharCode < 123)) { - continue; - } - if(Item.m_CharCode > 127 || (Item.m_CharCode > 32 && Item.m_CharCode < 35) || Item.m_CharCode == 37 || - (Item.m_CharCode > 38 && Item.m_CharCode < 42) || Item.m_CharCode == 44 || Item.m_CharCode == 46 || - Item.m_CharCode == 58 || Item.m_CharCode == 59 || Item.m_CharCode == 63 || Item.m_CharCode == 93) { - if(i == count - 1) { - CFX_AffineMatrix matrix; - FX_RECT rect = pObj->GetBBox(&matrix); - return (FX_FLOAT)(rect.Width()); - } else { - pTextObj->GetItemInfo(i + 1, &Item); - return Item.m_OriginX; - } - } - return Item.m_OriginX; - } - CFX_AffineMatrix matrix; - FX_RECT rect = pObj->GetBBox(&matrix); - return (FX_FLOAT)(rect.Width()); -} diff --git a/core/src/reflow/autoreflow.h b/core/src/reflow/autoreflow.h deleted file mode 100644 index 20babd72da..0000000000 --- a/core/src/reflow/autoreflow.h +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef CORE_SRC_REFLOW_AUTOREFLOW_H_ -#define CORE_SRC_REFLOW_AUTOREFLOW_H_ - -#include "../../include/reflow/reflowengine.h" -#include "reflowedpage.h" - -class CPDF_AutoReflowElement; -class CPDF_AutoReflowLayoutProvider; -typedef CFX_ArrayTemplate<CPDF_AutoReflowElement*> CAR_ElmPtrArray; -typedef CFX_ArrayTemplate<CPDF_PageObject*> CAR_ObjPtrArray; -class CRF_CELL -{ -public: - CRF_CELL() { }; - ~CRF_CELL() { }; - CFX_PtrList m_ObjList; - int m_CellWritingMode; - FX_RECT m_BBox; -}; -class CPDF_AutoReflowElement : public IPDF_LayoutElement -{ -public: - CPDF_AutoReflowElement(LayoutType layoutType = LayoutUnknown , CPDF_AutoReflowElement* pParent = NULL) ; - ~CPDF_AutoReflowElement(); - LayoutType GetType() - { - return m_ElmType; - } - void GetRect(CFX_FloatRect& rcRect) {}; - - int CountAttrValues(LayoutAttr attr_type); - LayoutEnum GetEnumAttr(LayoutAttr attr_type, int index); - FX_FLOAT GetNumberAttr(LayoutAttr attr_type, int index); - FX_COLORREF GetColorAttr(LayoutAttr attr_type, int index); - - int CountChildren() - { - return m_ChildArray.GetSize(); - } - IPDF_LayoutElement* GetChild(int index) - { - return m_ChildArray.GetAt(index); - } - - IPDF_LayoutElement* GetParent() - { - return m_pParentElm; - } - int CountObjects() - { - return m_ObjArray.GetSize(); - } - CPDF_PageObject* GetObject(int index) - { - return m_ObjArray.GetAt(index); - } - CPDF_AutoReflowElement* m_pParentElm; - LayoutType m_ElmType; - CAR_ElmPtrArray m_ChildArray; - CAR_ObjPtrArray m_ObjArray; - FX_FLOAT m_SpaceBefore; -}; -#define AUTOREFLOW_STEP_GENERATELINE 1 -#define AUTOREFLOW_STEP_GENERATEParagraph 2 -#define AUTOREFLOW_STEP_CREATEELEMENT 3 -#define AUTOREFLOW_STEP_REMOVEDATA 4 -class CPDF_AutoReflowLayoutProvider : public IPDF_LayoutProvider -{ -public: - CPDF_AutoReflowLayoutProvider(CPDF_PageObjects* pPage, FX_BOOL bReadOrder); - ~CPDF_AutoReflowLayoutProvider(); - void SetLayoutProviderStyle(LAYOUTPROVIDER_STYLE Style) - { - m_Style = Style; - } - LayoutStatus StartLoad(IFX_Pause* pPause = NULL); - LayoutStatus Continue(); - int GetPosition(); - IPDF_LayoutElement* GetRoot() - { - return m_pRoot; - } - FX_FLOAT GetObjMinCell(CPDF_PageObject* pObj); - void Conver2AppreceOrder(const CPDF_PageObjects* pStreamOrderObjs, CPDF_PageObjects* pAppraceOrderObjs); - void ReleaseElm(CPDF_AutoReflowElement*& pElm, FX_BOOL bReleaseChildren = TRUE); - void GenerateCell(); - void GenerateStructTree(); - void GenerateLine(CFX_PtrArray& cellArray); - void GenerateParagraph(CFX_PtrArray& cellArray); - void CreateElement(); - void AddObjectArray(CPDF_AutoReflowElement* pElm, CFX_PtrList& ObjList); - FX_FLOAT GetLayoutOrderHeight(CPDF_PageObject* pCurObj); - FX_FLOAT GetLayoutOrderWidth(CPDF_PageObject* pCurObj); - int GetWritingMode(CPDF_PageObject* pPreObj, CPDF_PageObject* pCurObj); - int GetRectStart(FX_RECT rect); - int GetRectEnd(FX_RECT rect); - int GetRectTop(FX_RECT rect); - int GetRectBottom(FX_RECT rect); - int GetRectHeight(FX_RECT rect); - int GetRectWidth(FX_RECT rect); - void ProcessObj(CFX_PtrArray& cellArray, CPDF_PageObject* pObj, CFX_AffineMatrix matrix); - int32_t LogicPreObj(CPDF_PageObject* pObj); - - CPDF_AutoReflowElement* m_pRoot; - CPDF_AutoReflowElement* m_pCurrElm; - CPDF_Page* m_pPDFPage; - IFX_Pause* m_pPause; - CFX_AffineMatrix m_PDFDisplayMatrix; - CPDF_PageObject* m_pPreObj; - LayoutStatus m_Status; - int m_WritingMode; - CFX_PtrArray m_CellArray; - FX_BOOL m_bReadOrder; - LAYOUTPROVIDER_STYLE m_Style; - CFX_PtrArray m_cellArray; - int m_Step; -}; - -#endif // CORE_SRC_REFLOW_AUTOREFLOW_H_ diff --git a/core/src/reflow/layoutprocessor_reflow.cpp b/core/src/reflow/layoutprocessor_reflow.cpp deleted file mode 100644 index 151ae9b4a5..0000000000 --- a/core/src/reflow/layoutprocessor_reflow.cpp +++ /dev/null @@ -1,1551 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "../../include/reflow/reflowengine.h" -#include "reflowedpage.h" -#include "layoutprovider_taggedpdf.h" -IPDF_LayoutProcessor* IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, void* pReflowedPage, int flags, FX_FLOAT lineSpace ) -{ - if(pReflowedPage == NULL || fWidth <= 20) { - return NULL; - } - CPDF_LayoutProcessor_Reflow* pReflowEngine = new CPDF_LayoutProcessor_Reflow(); - pReflowEngine->Init(TopIndent, fWidth, fHeight, (CPDF_ReflowedPage*)pReflowedPage, flags, lineSpace); - return pReflowEngine; -} -CPDF_LayoutProcessor_Reflow::CPDF_LayoutProcessor_Reflow() -{ - m_pPause = NULL; - m_pLayoutElement = NULL; - m_fRefWidth = 0; - m_fRefWidth = 0; - m_fCurrLineWidth = 0; - m_fCurrLineHeight = 0; - m_bIllustration = FALSE; - m_pPreObj = NULL; - m_pCurrLine = new CRF_DataPtrArray(50); - m_pTempLine = new CRF_DataPtrArray(50); - m_StartIndent = 0; - m_PausePosition = 0; -} -CPDF_LayoutProcessor_Reflow::~CPDF_LayoutProcessor_Reflow() -{ - if (m_pCurrLine) { - m_pCurrLine->RemoveAll(); - delete m_pCurrLine; - } - m_pCurrLine = NULL; - if (m_pTempLine) { - m_pTempLine->RemoveAll(); - delete m_pTempLine; - } - m_pTempLine = NULL; -} -void CPDF_LayoutProcessor_Reflow::Init(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, CPDF_ReflowedPage* pReflowedPage, int flags, FX_FLOAT lineSpace) -{ - m_pLayoutElement = NULL; - m_TopIndent = TopIndent; - m_Status = LayoutReady; - m_flags = flags; - m_pReflowedPage = pReflowedPage; - m_fScreenHeight = fHeight; - m_fRefWidth = fWidth; - m_fCurrLineHeight = 0; - m_fCurrLineWidth = 0; - m_fLineSpace = lineSpace; - pReflowedPage->m_PageWidth = fWidth; - pReflowedPage->m_PageHeight = TopIndent; -} -void CPDF_LayoutProcessor_Reflow::FitPageMode() -{ - if(m_flags & RF_PARSER_PAGEMODE && m_fScreenHeight > 20) { - float fitPageHeight = m_fScreenHeight; - CPDF_ReflowedPage* pRFPage = m_pReflowedPage; - int count = pRFPage->m_pReflowed->GetSize(); - CFX_WordArray dy; - dy.Add(0); - int pos = 0; - int screenCount = 1; - FX_FLOAT h = pRFPage->GetPageHeight(); - while (h > screenCount * fitPageHeight) { - FX_FLOAT tempPageHeight = screenCount * fitPageHeight; - int j = 0; - FX_FLOAT tempDy = 0; - for(int i = 0; i < count; i++) { - CRF_Data* pData = (*pRFPage->m_pReflowed)[i]; - FX_FLOAT posY; - posY = pData->m_PosY; - if(FXSYS_fabs(posY) > tempPageHeight && - FXSYS_fabs(posY + pData->m_Height) < tempPageHeight) { - if(j == 0) { - j = i; - } - if(pData->m_Height > fitPageHeight) { - FX_FLOAT zoom; - FX_FLOAT spaceh = screenCount * fitPageHeight + posY + pData->m_Height; - if(spaceh < fitPageHeight / 3 * 2) { - spaceh = fitPageHeight; - } - zoom = spaceh / pData->m_Height; - tempDy = spaceh - pData->m_Height; - pData->m_Height = spaceh; - pData->m_Width *= zoom; - break; - } - FX_FLOAT dy = pData->m_PosY + pData->m_Height + tempPageHeight; - if(dy > tempDy) { - tempDy = dy; - } - } else if(FXSYS_fabs(posY + pData->m_Height) > tempPageHeight) { - break; - } - } - for(; j < count; j++) { - CRF_Data* pData = (*pRFPage->m_pReflowed)[j]; - FX_FLOAT posY; - posY = pData->m_PosY; - if(FXSYS_fabs(posY) > tempPageHeight ) { - pData->m_PosY -= tempDy; - } - if(pData->m_Height >= fitPageHeight) { - pData->m_Height = fitPageHeight - 1; - if(pData->GetType() == CRF_Data::Text) { - CRF_CharData* pCharData = (CRF_CharData*)pData; - pCharData->m_pCharState->m_fFontSize = pData->m_Height; - } - } - } - pRFPage->m_PageHeight += tempDy; - h += tempDy; - screenCount++; - } - } -} -LayoutStatus CPDF_LayoutProcessor_Reflow::StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix) -{ - if(!pElement) { - return LayoutError; - } - m_pPause = pPause; - m_PDFMatrix = *pPDFMatrix; - m_pRootElement = pElement; - ProcessElement(m_pRootElement, m_fRefWidth); - if(m_Status == LayoutToBeContinued) { - return LayoutToBeContinued; - } - m_Status = LayoutFinished; - FitPageMode(); - return LayoutFinished; -} -LayoutStatus CPDF_LayoutProcessor_Reflow::Continue() -{ - int size = m_pReflowedPage->m_pReflowed->GetSize(); - ProcessElement(m_pRootElement, m_CurrRefWidth); - size = m_pReflowedPage->m_pReflowed->GetSize(); - if(m_Status == LayoutReady) { - m_Status = LayoutFinished; - FitPageMode(); - } - return m_Status; -} -int CPDF_LayoutProcessor_Reflow::GetPosition() -{ - return m_PausePosition; -} -FX_BOOL CPDF_LayoutProcessor_Reflow::IsCanBreakAfter(FX_DWORD unicode) -{ - if(unicode == -1) { - return FALSE; - } - switch(unicode) { - case 40: - case 91: - case 123: - return FALSE; - } - if(unicode >= 256) { - return TRUE; - } else if(unicode >= 48 && unicode <= 57) { - return FALSE; - } else if(unicode >= 64 && unicode <= 90) { - return FALSE; - } else if(unicode >= 97 && unicode <= 122) { - return FALSE; - } - return TRUE; -} -FX_BOOL CPDF_LayoutProcessor_Reflow::IsCanBreakBefore(FX_DWORD unicode) -{ - if(unicode == -1) { - return FALSE; - } - switch(unicode) { - case 33: - case 41: - case 44: - case 46: - case 59: - case 63: - case 93: - case 125: - return FALSE; - } - if(unicode >= 256) { - return TRUE; - } else if(unicode >= 48 && unicode <= 57) { - return FALSE; - } else if(unicode >= 64 && unicode <= 90) { - return FALSE; - } else if(unicode >= 97 && unicode <= 122) { - return FALSE; - } - return TRUE; -} -void CPDF_LayoutProcessor_Reflow::ProcessTable(FX_FLOAT dx) -{ - if(m_pReflowedPage->m_pReflowed->GetSize() == 0) { - return; - } - CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); - int rowCount = pTable->m_nCell.GetSize(); - int n = 0; - FX_FLOAT* dyRow = FX_Alloc(FX_FLOAT, rowCount + 1); - FXSYS_memset(dyRow, 0, sizeof(FX_FLOAT) * (rowCount + 1)); - dyRow[0] = 0 ; - dyRow[0] = - pTable->m_ReflowPageHeight; - int tableColCount = 0; - int i; - for(i = 0; i < rowCount; i++) { - int colCount = pTable->m_nCell.GetAt(i); - if(colCount > tableColCount) { - tableColCount = colCount; - } - } - int cellCount = tableColCount * rowCount; - RF_TableCell** pVirtualTable = FX_Alloc(RF_TableCell*, cellCount); - FXSYS_memset(pVirtualTable, 0, sizeof(RF_TableCell*) * cellCount); - for(i = 0; i < rowCount; i++) { - int colCount = pTable->m_nCell.GetAt(i); - FX_FLOAT rowWidth = 0; - int j = 0; - int s = pTable->m_pCellArray.GetSize(); - for(j = 0; j < colCount; j++) { - RF_TableCell* pCell = (RF_TableCell*)pTable->m_pCellArray.GetAt(n++); - if(pCell->m_EndPos < pCell->m_BeginPos) { - continue; - } - int pos = i * tableColCount; - while(pos < cellCount && pVirtualTable[pos] != NULL) { - pos++; - } - if(pos >= (i + 1) * tableColCount) { - pos = i * tableColCount + j; - } - int RowSpan = pCell->m_RowSpan; - int ColSpan = pCell->m_ColSpan; - if(RowSpan + i > rowCount) { - RowSpan = rowCount - i; - } - if(ColSpan + j > colCount) { - ColSpan = colCount - j; - } - for(int m = 0; m < RowSpan; m++) { - for(int nn = 0; nn < ColSpan; nn++) { - if(pos + nn >= cellCount) { - break; - } - pVirtualTable[pos + nn] = pCell; - } - pos += tableColCount; - } - FX_FLOAT dxCell = dx; - for(pos = i * tableColCount; pVirtualTable[pos] != pCell && pos < cellCount; pos++) { - dxCell += (pVirtualTable[pos])->m_MaxWidth; - } - CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[pCell->m_BeginPos]; - FX_FLOAT dy = dyRow[i] - pData->m_Height - pData->m_PosY; - CFX_AffineMatrix matrix(1, 0, 0, 1, dxCell, dy); - Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1); - if(pCell->m_RowSpan + i <= rowCount) { - if(FXSYS_fabs(dyRow[pCell->m_RowSpan + i]) < FXSYS_fabs(dyRow[i] - pCell->m_CellHeight)) { - dyRow[pCell->m_RowSpan + i] = dyRow[i] - pCell->m_CellHeight; - } - } - } - } - n = 0; - for(i = 0; i < rowCount; i++) { - int colCount = pTable->m_nCell.GetAt(i); - for(int j = 0; j < colCount; j++) { - RF_TableCell* pCell = (RF_TableCell*)pTable->m_pCellArray.GetAt(n++); - switch(pCell->m_BlockAlign) { - case LayoutAfter: { - FX_FLOAT dy = dyRow[i + pCell->m_RowSpan] - pCell->m_CellHeight - dyRow[i]; - CFX_AffineMatrix matrix(1, 0, 0, 1, 0, dy); - Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1); - } - break; - case LayoutMiddle: - case LayoutJustify: { - FX_FLOAT dy = (dyRow[i + pCell->m_RowSpan] + pCell->m_CellHeight - dyRow[i]) / 2; - CFX_AffineMatrix matrix(1, 0, 0, 1, 0, dy); - Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1); - break; - } - default: - break; - } - } - } - CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[m_pReflowedPage->m_pReflowed->GetSize() - 1]; - m_pReflowedPage->m_PageHeight = - dyRow[rowCount] + pData->m_Height; - FX_Free(pVirtualTable); - FX_Free(dyRow); - int size = pTable->m_pCellArray.GetSize(); - for(i = 0; i < size; i++) { - RF_TableCell* pCell = pTable->m_pCellArray.GetAt(i); - FX_Free(pCell); - } - pTable->m_pCellArray.RemoveAll(); - pTable->m_nCell.RemoveAll(); - int s = sizeof(CRF_Table); - delete pTable; - m_TableArray.RemoveAt(m_TableArray.GetSize() - 1); -} -CFX_FloatRect CPDF_LayoutProcessor_Reflow::GetElmBBox(IPDF_LayoutElement* pElement) -{ - CFX_FloatRect rect; - int objCount = pElement->CountObjects(); - int count = pElement->CountChildren(); - if(objCount == 0 && count == 0) { - return rect; - } - CFX_AffineMatrix matrix; - int i; - for(i = 0; i < objCount; i++) { - CPDF_PageObject* pObj = pElement->GetObject(0); - if(!pObj) { - continue; - } - if( rect.Height() == 0 ) { - rect = pObj->GetBBox(&matrix); - } else { - rect.Union(pObj->GetBBox(&matrix)); - } - } - for(i = 0; i < count; i++) { - IPDF_LayoutElement* pChildElement = pElement->GetChild(i); - if( rect.Height() == 0 ) { - rect = GetElmBBox(pChildElement); - } else { - rect.Union(GetElmBBox(pChildElement)); - } - } - return rect; -} -FX_FLOAT CPDF_LayoutProcessor_Reflow::GetElmWidth(IPDF_LayoutElement* pElement) -{ - if(!pElement) { - return 0; - } - LayoutType layoutType = pElement->GetType(); - FX_FLOAT width = 0; - if(layoutType == LayoutTable || layoutType == LayoutTableDataCell || layoutType == LayoutTableHeaderCell) { - width = pElement->GetNumberAttr(LayoutWidth); - if(width > 0) { - return width; - } - } else if( layoutType == LayoutTableRow) { - int count = pElement->CountChildren(); - for(int i = 0; i < count; i++) { - IPDF_LayoutElement* pElm = pElement->GetChild(i); - width += pElm->GetNumberAttr(LayoutWidth); - } - if(width > 0) { - return width; - } - } - CFX_FloatRect rect = GetElmBBox(pElement); - return rect.Width(); -} -FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2, - FX_FLOAT& interlow, FX_FLOAT& interhigh); -FX_BOOL IsSameLine(FX_BOOL bHorizontal, CFX_FloatRect Rect1, CFX_FloatRect Rect2) -{ - if(bHorizontal) { - FX_FLOAT inter_top, inter_bottom; - if (!GetIntersection(Rect1.bottom, Rect1.top, Rect2.bottom, Rect2.top, - inter_bottom, inter_top)) { - return FALSE; - } - FX_FLOAT lineHeight = Rect1.top - Rect1.bottom; - if(lineHeight > 20 && lineHeight > Rect2.Height() * 2) { - return FALSE; - } - if(lineHeight > 5 && Rect2.Height() / 2 > lineHeight) { - return FALSE; - } - FX_FLOAT inter_h = inter_top - inter_bottom; - if (inter_h < (lineHeight) / 2 && inter_h < Rect2.Height() / 2) { - return FALSE; - } - } else { - FX_FLOAT inter_left, inter_right; - if(!GetIntersection(Rect1.left, Rect1.right, Rect2.left, Rect2.right, inter_left, inter_right)) { - return FALSE; - } - FX_FLOAT inter_w = inter_right - inter_left; - if (inter_w < (Rect1.right - Rect1.left) / 2 && inter_w < (Rect2.right - Rect2.left) / 2) { - return FALSE; - } - } - return TRUE; -} -int32_t IsCanMergeParagraph(IPDF_LayoutElement* pPrevElement, IPDF_LayoutElement* pNextElement) -{ - int32_t analogial = 100; - int32_t nPrevObj = pPrevElement->CountObjects(), i; - CPDF_PageObject* pPrevObj = NULL; - CFX_FloatRect prevRect, rect; - CFX_PtrArray prevLine, line; - FX_BOOL bParagraphStart = FALSE; - for(i = 0; i < nPrevObj; i++) { - CPDF_PageObject* pObj = pPrevElement->GetObject(i); - if(!pPrevObj) { - pPrevObj = pObj; - rect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top); - line.Add(pObj); - continue; - } - CFX_FloatRect objRect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top); - if(IsSameLine(TRUE, rect, objRect)) { - line.Add(pObj); - rect.Union(objRect); - } else { - prevLine.RemoveAll(); - prevLine.Append(line); - prevRect = rect; - line.RemoveAll(); - line.Add(pObj); - rect = objRect; - if(!bParagraphStart) { - if (prevRect.left > rect.left + rect.Height() * 1.5) { - bParagraphStart = TRUE; - } - } - } - } - if(prevLine.GetSize()) { - if(FXSYS_fabs(rect.right - prevRect.right) > rect.Height()) { - analogial -= 50; - } - } - CPDF_PageObject* pObj = pPrevElement->GetObject(nPrevObj - 1); - if(pObj->m_Type == PDFPAGE_TEXT) { - CPDF_TextObject* pText = (CPDF_TextObject*)pObj; - int32_t nItem = pText->CountItems(); - CPDF_TextObjectItem item; - pText->GetItemInfo(nItem - 1, &item); - CFX_WideString wStr = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode); - if(wStr.IsEmpty()) { - wStr = (FX_WCHAR)item.m_CharCode; - } - FX_WCHAR wch = wStr.GetAt(wStr.GetLength() - 1); - switch(wch) { - case '.': - case 12290: - case 65311: - case 63: - case 33: - case 65281: - analogial -= 50; - break; - } - } - prevLine.RemoveAll(); - prevLine.Append(line); - line.RemoveAll(); - int32_t nNextObj = pNextElement->CountObjects(); - pPrevObj = NULL; - FX_BOOL bFirst = TRUE; - for(i = 0; i < nNextObj; i++) { - CPDF_PageObject* pObj = pNextElement->GetObject(i); - if(!pPrevObj) { - pPrevObj = pObj; - rect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top); - line.Add(pObj); - continue; - } - CFX_FloatRect objRect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top); - if(IsSameLine(TRUE, rect, objRect)) { - line.Add(pObj); - rect.Union(objRect); - } else { - if(FXSYS_fabs(rect.right - prevRect.right) < rect.Height() && FXSYS_fabs(rect.left - prevRect.left) < rect.Height()) { - analogial += 50; - } - prevLine.RemoveAll(); - prevLine.Append(line); - prevRect = rect; - line.RemoveAll(); - line.Add(pObj); - rect = objRect; - if(!bFirst) { - break; - } - bFirst = FALSE; - } - } - if(prevLine.GetSize()) { - if(bParagraphStart) { - if(prevRect.left - rect.left > rect.Height() && prevRect.left - rect.left < rect.Height() * 3) { - analogial -= 50; - } - } else { - if(FXSYS_fabs(prevRect.left - rect.left) < rect.Height()) { - analogial -= 50; - } - } - } - return analogial; -} -void CPDF_LayoutProcessor_Reflow::ProcessElement(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth) -{ - if(pElement == NULL) { - return; - } - if(m_Status == LayoutReady) { - LayoutType layoutType = pElement->GetType(); - int32_t ElementType = GetElementTypes(layoutType); - switch(ElementType) { - case SST_IE: - m_bIllustration = TRUE; - break; - case SST_BLSE: - FinishedCurrLine(); - FX_FLOAT StartIndent = 0; - if(IPDF_LayoutElement* pParent = pElement->GetParent()) { - StartIndent = pParent->GetNumberAttr(LayoutStartIndent); - } - FX_FLOAT currStartIndent = pElement->GetNumberAttr(LayoutStartIndent); - m_StartIndent = ConverWidth(currStartIndent); - FX_FLOAT width = reflowWidth; - if(StartIndent != currStartIndent) { - reflowWidth -= m_StartIndent; - } - FX_FLOAT spaceBefore = pElement->GetNumberAttr(LayoutSpaceBefore); - m_pReflowedPage->m_PageHeight += spaceBefore; - m_TextAlign = pElement->GetEnumAttr(LayoutTextAlign); - if(IPDF_LayoutElement* pParent = pElement->GetParent()) { - StartIndent = pParent->GetNumberAttr(LayoutEndIndent); - FX_FLOAT currEndIndent = pElement->GetNumberAttr(LayoutEndIndent); - if(StartIndent != currStartIndent) { - reflowWidth -= ConverWidth(currEndIndent); - } - } - if(reflowWidth * 2 < width) { - reflowWidth = width; - m_StartIndent = 0; - } - break; - } - switch(layoutType) { - case LayoutTable: { - CRF_Table* pTable = new CRF_Table; - m_TableArray.Add(pTable); - pTable->m_ReflowPageHeight = m_pReflowedPage->m_PageHeight; - pTable->m_TableWidth = GetElmWidth(pElement); - break; - } - case LayoutTableRow: { - if(!m_TableArray.GetSize()) { - break; - } - int count = pElement->CountChildren(); - CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); - int f = 0; - for(int i = 0; i < count; i++) { - IPDF_LayoutElement* pChildElement = pElement->GetChild(i); - LayoutType type = pChildElement->GetType(); - if(type == LayoutTableDataCell || type == LayoutTableHeaderCell) { - f++; - } - } - pTable->m_nCell.Add(f); - break; - } - case LayoutTableDataCell: - case LayoutTableHeaderCell: { - if(!m_TableArray.GetSize()) { - break; - } - RF_TableCell* pCell = FX_Alloc(RF_TableCell, 1); - FXSYS_memset(pCell, 0 , sizeof(RF_TableCell)); - CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); - int pos = pTable->m_nCell.GetSize() - 1; - pCell->m_BeginPos = m_pReflowedPage->m_pReflowed->GetSize(); - FX_FLOAT cellWidth = pElement->GetNumberAttr(LayoutWidth); - if(cellWidth == 0 || pCell->m_MaxWidth > pTable->m_TableWidth) { - CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); - pCell->m_MaxWidth = reflowWidth / pTable->m_nCell.GetAt(pTable->m_nCell.GetSize() - 1); - } else { - pCell->m_MaxWidth = pElement->GetNumberAttr(LayoutWidth) * reflowWidth / pTable->m_TableWidth; - } - pCell->m_ColSpan = (int)(pElement->GetNumberAttr(LayoutColSpan)); - pCell->m_RowSpan = (int)(pElement->GetNumberAttr(LayoutRowSpan)); - if(!pCell->m_ColSpan) { - pCell->m_ColSpan = 1; - } - if(!pCell->m_RowSpan ) { - pCell->m_RowSpan = 1; - } - pCell->m_BlockAlign = pElement->GetEnumAttr(LayoutBlockAlign); - m_TextAlign = pElement->GetEnumAttr(LayoutInlineAlign); - pCell->m_PosX = 0; - pCell->m_PosY = 0; - reflowWidth = pCell->m_MaxWidth; - pTable->m_pCellArray.Add(pCell); - break; - } - default: - break; - } - m_fLineHeight = pElement->GetNumberAttr(LayoutLineHeight); - int ReflowedSize = m_pReflowedPage->m_pReflowed->GetSize(); - if(pElement->CountObjects()) { - ProcessObjs(pElement, reflowWidth); - } - } - int count = pElement->CountChildren(); - for(int i = 0; i < count; i++) { - IPDF_LayoutElement* pChildElement = pElement->GetChild(i); - ProcessElement(pChildElement, reflowWidth); - if(m_pPause && m_pRootElement == pElement && m_Status != LayoutToBeContinued ) { - if(m_pPause->NeedToPauseNow()) { - m_pLayoutElement = pChildElement; - m_Status = LayoutToBeContinued; - m_CurrRefWidth = reflowWidth; - m_PausePosition = (i + 1) * 100 / (count + 1); - return ; - } - } - if(m_Status == LayoutToBeContinued && m_pLayoutElement == pChildElement) { - m_Status = LayoutReady; - } - } - if(m_Status == LayoutReady) { - FX_FLOAT dx = 0; - LayoutType layoutType = pElement->GetType(); - int32_t ElementType = GetElementTypes(layoutType); - switch(ElementType) { - case SST_IE: - m_bIllustration = FALSE; - FinishedCurrLine(); - break; - case SST_BLSE: - FinishedCurrLine(); - FX_FLOAT StartIndent = 0; - if(IPDF_LayoutElement* pParent = pElement->GetParent()) { - StartIndent = pParent->GetNumberAttr(LayoutStartIndent); - } - FX_FLOAT currStartIndent = pElement->GetNumberAttr(LayoutStartIndent); - if(StartIndent != currStartIndent) { - reflowWidth += ConverWidth(currStartIndent); - dx += ConverWidth(currStartIndent); - } - FX_FLOAT spaceAfter = pElement->GetNumberAttr(LayoutSpaceAfter); - m_pReflowedPage->m_PageHeight += spaceAfter; - break; - } - switch(layoutType) { - case LayoutTableDataCell: - case LayoutTableHeaderCell: { - if(!m_TableArray.GetSize()) { - break; - } - CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); - RF_TableCell* pCell = pTable->m_pCellArray.GetAt(pTable->m_pCellArray.GetSize() - 1); - pCell->m_EndPos = m_pReflowedPage->m_pReflowed->GetSize() - 1; - if(pCell->m_EndPos < pCell->m_BeginPos) { - pCell->m_CellHeight = 0; - } else { - CRF_Data* pBeginData = (*m_pReflowedPage->m_pReflowed)[pCell->m_BeginPos]; - CRF_Data* pEndData = (*m_pReflowedPage->m_pReflowed)[pCell->m_EndPos]; - pCell->m_CellHeight = pBeginData->m_Height > pEndData->m_Height ? pBeginData->m_Height : pEndData->m_Height; - pCell->m_CellHeight -= pEndData->m_PosY - pBeginData->m_PosY; - } - break; - } - case LayoutTableRow: { - if(!m_TableArray.GetSize()) { - break; - } - CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); - if(pTable->m_nCol == 0) { - pTable->m_nCol = pTable->m_pCellArray.GetSize(); - } - break; - } - case LayoutTable: { - ProcessTable(dx); - break; - } - default: - if(dx) { - CFX_AffineMatrix matrix(1, 0, 0, 1, dx, 0); - int ReflowedSize = m_pReflowedPage->m_pReflowed->GetSize(); - Transform(&matrix, m_pReflowedPage->m_pReflowed, ReflowedSize, m_pReflowedPage->m_pReflowed->GetSize() - ReflowedSize); - } - } - } - if(m_pRootElement == pElement) { - m_PausePosition = 100; - } -} -int32_t CPDF_LayoutProcessor_Reflow::GetElementTypes(LayoutType layoutType) -{ - switch(layoutType) { - case LayoutParagraph: - case LayoutHeading: - case LayoutHeading1: - case LayoutHeading2: - case LayoutHeading3: - case LayoutHeading4: - case LayoutHeading5: - case LayoutHeading6: - case LayoutList: - case LayoutListItem: - case LayoutListLabel: - case LayoutListBody: - case LayoutTable: - case LayoutTableHeaderCell: - case LayoutTableDataCell: - case LayoutTableRow: - case LayoutTableHeaderGroup: - case LayoutTableBodyGroup: - case LayoutTableFootGroup: - case LayoutTOCI: - case LayoutCaption: - return SST_BLSE; - case LayoutFigure: - case LayoutFormula: - case LayoutForm: - return SST_IE; - case LayoutSpan: - case LayoutQuote: - case LayoutNote: - case LayoutReference: - case LayoutBibEntry: - case LayoutCode: - case LayoutLink: - case LayoutAnnot: - case LayoutRuby: - case LayoutWarichu: - return SST_ILSE; - default: - return SST_GE; - } - return FALSE; -} -FX_FLOAT CPDF_LayoutProcessor_Reflow::ConverWidth(FX_FLOAT width) -{ - return width; -} -void CPDF_LayoutProcessor_Reflow::ProcessObject(CPDF_PageObject* pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix) -{ - if(!pObj) { - return; - } - if(pObj->m_Type == PDFPAGE_TEXT) { - ProcessTextObject( (CPDF_TextObject *)pObj, reflowWidth, objMatrix); - } else if(pObj->m_Type == PDFPAGE_IMAGE) { - if(!(m_flags & RF_PARSER_IMAGE)) { - return; - } - CPDF_PageObjects* pObjs = new CPDF_PageObjects(FALSE); - FX_POSITION pos = pObjs->GetLastObjectPosition(); - pos = pObjs->InsertObject(pos, pObj); - CFX_AffineMatrix matrix; - FX_RECT rect = pObj->GetBBox(&matrix); - CPDF_ImageObject* ImageObj = (CPDF_ImageObject*)pObj; - ProcessUnitaryObjs(pObjs, reflowWidth, objMatrix); - delete pObjs; - } else if(pObj->m_Type == PDFPAGE_PATH) { - } else if(pObj->m_Type == PDFPAGE_FORM) { - CPDF_FormObject* pForm = (CPDF_FormObject*)pObj; - FX_POSITION pos = pForm->m_pForm->GetFirstObjectPosition(); - objMatrix.Concat(pForm->m_FormMatrix); - while (pos) { - CPDF_PageObject* pObj1 = pForm->m_pForm->GetNextObject(pos); - ProcessObject(pObj1, reflowWidth, objMatrix); - } - } -} -void CPDF_LayoutProcessor_Reflow::ProcessObjs(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth) -{ - m_fCurrMaxWidth = reflowWidth; - int ObjCount = pElement->CountObjects(); - for(int i = 0; i < ObjCount; i++) { - CPDF_PageObject* pObj = pElement->GetObject(i); - ProcessObject(pObj, reflowWidth, m_PDFMatrix); - continue; - } -} -void CPDF_LayoutProcessor_Reflow::AddTemp2CurrLine(int begin, int count) -{ - if(begin < 0 || count <= 0 || !m_pReflowedPage || !m_pReflowedPage->m_pReflowed || !m_pTempLine) { - return; - } else { - count += begin; - } - int size = m_pReflowedPage->m_pReflowed->GetSize(); - int temps = m_pTempLine->GetSize(); - for(int i = begin; i < count; i++) { - CRF_Data* pData = (*m_pTempLine)[i]; - AddData2CurrLine(pData); - } -} -void CPDF_LayoutProcessor_Reflow::AddData2CurrLine(CRF_Data* pData) -{ - if(pData == NULL || m_pCurrLine == NULL) { - return; - } - m_pCurrLine->Add(pData); - m_fCurrLineWidth = pData->m_PosX + pData->m_Width; - if(pData->m_Height > m_fCurrLineHeight) { - m_fCurrLineHeight = pData->m_Height; - } -} -void CPDF_LayoutProcessor_Reflow::UpdateCurrLine() -{ -} -void CPDF_LayoutProcessor_Reflow::Transform(const CFX_AffineMatrix* pMatrix, CRF_DataPtrArray* pDataArray, int beginPos, int count) -{ - if (!pDataArray) { - return; - } - if(count == 0) { - count = pDataArray->GetSize(); - } else { - count += beginPos; - } - for(int i = beginPos; i < count; i++) { - CRF_Data* pData = (*pDataArray)[i]; - Transform(pMatrix, pData); - } -} -void CPDF_LayoutProcessor_Reflow::Transform(const CFX_AffineMatrix* pMatrix, CRF_Data* pData) -{ - if(pData->GetType() == CRF_Data::Path) { - CRF_PathData* pPathData = (CRF_PathData*)pData; - pPathData->m_pPath2Device.Concat(*pMatrix); - } - pMatrix->Transform(pData->m_PosX, pData->m_PosY, pData->m_PosX, pData->m_PosY); -} -FX_BOOL CPDF_LayoutProcessor_Reflow::FinishedCurrLine() -{ - if (NULL == m_pCurrLine) { - return FALSE; - } - int count = m_pCurrLine->GetSize(); - if(count == 0) { - return FALSE; - } - if(m_fLineHeight > m_fCurrLineHeight) { - m_fCurrLineHeight = m_fLineHeight; - } else { - m_fCurrLineHeight += 2; - } - if(m_pReflowedPage->m_pReflowed->GetSize() > 0) { - m_fCurrLineHeight += m_fLineSpace; - } - FX_FLOAT height = m_pReflowedPage->m_PageHeight + m_fCurrLineHeight; - FX_FLOAT lineHeight = m_fLineHeight; - if(lineHeight == 0) { - lineHeight = m_fCurrLineHeight; - } - FX_FLOAT dx = 0; - switch(m_TextAlign) { - case LayoutCenter: - dx = (m_fCurrMaxWidth - m_fCurrLineWidth) / 2; - break; - case LayoutEnd: - dx = m_fCurrMaxWidth - m_fCurrLineWidth; - break; - case LayoutJustify: - break; - default: - break; - } - FX_FLOAT dy = - height; - int refedSize = m_pReflowedPage->m_pReflowed->GetSize(); - if(count == 13) { - int a = 0; - } - for(int i = 0; i < count; i++) { - CRF_Data* pData = (*m_pCurrLine)[i]; - m_pReflowedPage->m_pReflowed->Add(pData); - FX_FLOAT x = m_StartIndent + dx * (m_TextAlign == LayoutJustify ? i + 1 : 1); - CFX_AffineMatrix matrix(1, 0, 0, 1, x, dy); - Transform(&matrix, pData); - } - m_pCurrLine->RemoveAll(); - m_fCurrLineWidth = 0; - m_pReflowedPage->m_PageHeight += m_fCurrLineHeight; - m_fCurrLineHeight = 0; - return TRUE; -} -CRF_CharState* CPDF_LayoutProcessor_Reflow::GetCharState(CPDF_TextObject* pObj, CPDF_Font* pFont, FX_FLOAT fHeight, FX_ARGB color) -{ - if (NULL == m_pReflowedPage->m_pCharState) { - return NULL; - } - int count = m_pReflowedPage->m_pCharState->GetSize(); - for(int i = count - 1; i >= 0; i--) { - CRF_CharState* pState = (CRF_CharState*)m_pReflowedPage->m_pCharState->GetAt(i); - if(pState->m_Color == color && pState->m_fFontSize == fHeight && pState->m_pFont == pFont && pState->m_pTextObj == pObj) { - return pState; - } - } - CRF_CharState pState; - pState.m_pTextObj = pObj; - pState.m_Color = color; - pState.m_pFont = pFont; - pState.m_fFontSize = fHeight; - int ascent = pFont->GetTypeAscent(); - int descent = pFont->GetTypeDescent(); - pState.m_fAscent = ascent * fHeight / (ascent - descent); - if(descent == 0) { - pState.m_fDescent = 0; - } else { - pState.m_fDescent = descent * fHeight / (ascent - descent); - } - pState.m_bVert = FALSE; - CPDF_CIDFont *pCIDFont = pFont->GetCIDFont(); - if(pCIDFont) { - pState.m_bVert = pCIDFont->IsVertWriting(); - } - m_pReflowedPage->m_pCharState->Add(pState); - return (CRF_CharState*)m_pReflowedPage->m_pCharState->GetAt(count); -} -int CPDF_LayoutProcessor_Reflow::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const -{ - if(charCode == -1) { - return 0; - } - int w = pFont->GetCharWidthF(charCode); - if(w == 0) { - CFX_ByteString str; - pFont->AppendChar(str, charCode); - w = pFont->GetStringWidth(str, 1); - if(w == 0) { - FX_RECT BBox; - pFont->GetCharBBox(charCode, BBox); - w = BBox.right - BBox.left; - } - } - return w; -} -void CPDF_LayoutProcessor_Reflow::CreateRFData(CPDF_PageObject* pObj, CFX_AffineMatrix* pObjMatrix) -{ - if (NULL == m_pReflowedPage->m_pMemoryPool) { - return; - } - if(pObj->m_Type == PDFPAGE_TEXT) { - CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj; - int count = pTextObj->CountItems(); - if(!count) { - return; - } - if(count == 1) { - CPDF_TextObjectItem Item; - pTextObj->GetItemInfo(0, &Item); - if(Item.m_CharCode == 49) { - int a = 0; - } - } - CPDF_Font * pFont = pTextObj->GetFont(); - FX_FLOAT fs = pTextObj->GetFontSize(); - FX_FLOAT* pmatrix = pTextObj->m_TextState.GetMatrix(); - FX_FLOAT matrix1 = pmatrix[1]; - if(pmatrix[2] == 0) { - matrix1 = 0; - } - CFX_AffineMatrix textMatrix(pmatrix[0], matrix1, pmatrix[2], pmatrix[3], 0, 0); - FX_FLOAT height = FXSYS_fabs(textMatrix.TransformDistance(fs)); - if(pObjMatrix) { - height = FXSYS_fabs(pObjMatrix->TransformDistance(height)); - } - int r = 0, g = 0, b = 0; - pTextObj->m_ColorState.GetFillColor()->GetRGB(r, g, b); - FX_ARGB col = r * 0x10000; - col += g * 0x100; - col += b; - CRF_CharState* pState = GetCharState(pTextObj, pFont, height, col); - FX_FLOAT dx = 0, dy = 0; - FX_RECT ObjBBox; - if(pObjMatrix) { - ObjBBox = pTextObj->GetBBox(pObjMatrix); - dx = (float)ObjBBox.left; - dy = (float)ObjBBox.bottom; - } else { - CFX_AffineMatrix matrix; - ObjBBox = pTextObj->GetBBox(&matrix); - } - FX_FLOAT objWidth = 0; - CFX_ByteString str; - FX_BOOL bOrder = TRUE; - CFX_PtrArray tempArray; - int i = 0; - CPDF_TextObjectItem Item; - pTextObj->GetItemInfo(i, &Item); - dx = Item.m_OriginX; - dy = Item.m_OriginY; - textMatrix.Transform(Item.m_OriginX, Item.m_OriginY, dx, dy); - CRF_CharData* pLastData = NULL; - FX_FLOAT horzScale = pTextObj->m_TextState.GetFontSizeV() / pTextObj->m_TextState.GetFontSizeH(); - while(i < count) { - pTextObj->GetItemInfo(i, &Item); - if(Item.m_CharCode == -1) { - i++; - continue; - } - FX_FLOAT OriginX, OriginY; - textMatrix.Transform(Item.m_OriginX, Item.m_OriginY, OriginX, OriginY); - CRF_CharData* pData = (CRF_CharData*)m_pReflowedPage->m_pMemoryPool->Alloc(sizeof(CRF_CharData)); - if (NULL == pData) { - continue; - } - pData->m_Type = CRF_Data::Text; - if(FXSYS_fabs(OriginY - dy) > FXSYS_fabs(OriginX - dx)) { - pData->m_PosY = dy; - pData->m_PosX = pLastData->m_PosX + pLastData->m_Width + textMatrix.TransformDistance(pTextObj->m_TextState.GetObject()->m_CharSpace); - } else { - pData->m_PosY = OriginY; - pData->m_PosX = OriginX; - } - int size = tempArray.GetSize(); - if(size && pData->m_PosX < pLastData->m_PosX ) { - for (int j = 0; j < size; j++) { - CRF_CharData* pData1 = (CRF_CharData*)tempArray.GetAt(j); - if(pData1->m_PosX > pData->m_PosX) { - tempArray.InsertAt(j, pData); - break; - } - } - } else { - tempArray.Add(pData); - } - pLastData = pData; - pData->m_CharCode = Item.m_CharCode; - pData->m_Height = FXSYS_fabs(height); - int w = GetCharWidth(Item.m_CharCode, pFont); - pData->m_Width = FXSYS_fabs(fs * textMatrix.TransformDistance((FX_FLOAT)w) / 1000); - if(horzScale) { - pData->m_Width /= horzScale; - } - pData->m_pCharState = pState; - i++; - } - count = tempArray.GetSize(); - for (int j = 0; j < count; j++) { - CRF_CharData* pData = (CRF_CharData*)tempArray.GetAt(j); - if (m_pTempLine) { - m_pTempLine->Add(pData); - } - } - tempArray.RemoveAll(); - } else if(pObj->m_Type == PDFPAGE_IMAGE) { - CPDF_ImageObject* pImageObj = (CPDF_ImageObject* )pObj; - CRF_ImageData* pRFImage = (CRF_ImageData*)m_pReflowedPage->m_pMemoryPool->Alloc(sizeof(CRF_ImageData)); - if (NULL == pRFImage) { - return; - } - pRFImage->m_pBitmap = NULL; - pRFImage->m_Type = CRF_Data::Image; - if (m_pTempLine) { - m_pTempLine->Add(pRFImage); - } - CPDF_Image *pImage = pImageObj->m_pImage; - if (!pImage->m_pDIBSource || !pImage->m_pMask) { - if(pImage->StartLoadDIBSource(m_pReflowedPage->GetFormResDict(pImageObj), m_pReflowedPage->m_pPDFPage->m_pResources, 0, 0, TRUE)) { - pImage->Continue(NULL); - } - } - CFX_DIBSource* pDibSource = pImage->DetachBitmap(); - if (pDibSource) { - pRFImage->m_pBitmap = pDibSource->Clone(); - delete pDibSource; - } - CFX_DIBSource* pMask = pImage->DetachMask(); - if (pMask) { - if (!pMask->IsAlphaMask()) { - CFX_DIBitmap* pMaskBmp = pMask->Clone(); - pMaskBmp->ConvertFormat(FXDIB_8bppMask); - pRFImage->m_pBitmap->MultiplyAlpha(pMaskBmp); - delete pMaskBmp; - } else { - pRFImage->m_pBitmap->MultiplyAlpha(pMask); - } - delete pMask; - } - CFX_FloatRect ObjBBox; - if(pObjMatrix) { - ObjBBox = pImageObj->GetBBox(pObjMatrix); - } else { - CFX_AffineMatrix matrix; - ObjBBox = pImageObj->GetBBox(&matrix); - } - pRFImage->m_Width = ObjBBox.Width(); - pRFImage->m_Height = ObjBBox.Height(); - pRFImage->m_PosX = 0; - pRFImage->m_PosY = 0; - CFX_AffineMatrix matrix(1, 0, 0, -1, 0, 0); - matrix.Concat(pImageObj->m_Matrix); - matrix.Concat(*pObjMatrix); - pRFImage->m_Matrix.Set(matrix.a == 0 ? 0 : matrix.a / FXSYS_fabs(matrix.a), - matrix.b == 0 ? 0 : matrix.b / FXSYS_fabs(matrix.b), - matrix.c == 0 ? 0 : matrix.c / FXSYS_fabs(matrix.c), - matrix.d == 0 ? 0 : matrix.d / FXSYS_fabs(matrix.d), 0, 0); - } else if(pObj->m_Type == PDFPAGE_PATH) { - } -} -FX_FLOAT CPDF_LayoutProcessor_Reflow:: GetDatasWidth(int beginPos, int endpos) -{ - if(endpos < beginPos || !m_pTempLine) { - return 0; - } - if(endpos > m_pTempLine->GetSize() - 1) { - endpos = m_pTempLine->GetSize() - 1; - } - CRF_Data* pBeginData = (*m_pTempLine)[beginPos]; - CRF_Data* pEndData = (*m_pTempLine)[endpos]; - return pEndData->m_PosX - pBeginData->m_PosX + pEndData->m_Width; -} -FX_WCHAR CPDF_LayoutProcessor_Reflow::GetPreChar() -{ - if (NULL == m_pCurrLine) { - return -1; - } - int index = m_pCurrLine->GetSize() - 1; - CRF_CharData* pCharData = NULL; - while (index >= 0 && !pCharData) { - CRF_Data* pData = (*m_pCurrLine)[index]; - if(pData->GetType() == CRF_Data::Text) { - pCharData = (CRF_CharData*)pData; - } else { - return -1; - } - index --; - } - if(m_pReflowedPage) { - index = m_pReflowedPage->m_pReflowed->GetSize() - 1; - } - while(!pCharData && index >= 0) { - CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[index]; - if(pData->GetType() == CRF_Data::Text) { - pCharData = (CRF_CharData*)pData; - } else { - return -1; - } - index --; - } - if(pCharData) { - CFX_WideString str = pCharData->m_pCharState->m_pFont->UnicodeFromCharCode(pCharData->m_CharCode); - return str.GetAt(0); - } - return -1; -} -int CPDF_LayoutProcessor_Reflow::ProcessInsertObject(CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix) -{ - if(!pObj || !m_pPreObj || !m_pCurrLine) { - return 0; - } - if(m_pCurrLine->GetSize() == 0) { - return 0; - } - CPDF_TextObjectItem item; - int nItem = m_pPreObj->CountItems(); - m_pPreObj->GetItemInfo(nItem - 1, &item); - FX_FLOAT last_pos = item.m_OriginX; - FX_FLOAT last_width = GetCharWidth(item.m_CharCode, m_pPreObj->GetFont()) * m_pPreObj->GetFontSize() / 1000; - last_width = FXSYS_fabs(last_width); - pObj->GetItemInfo(0, &item); - FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pObj->GetFont()) * pObj->GetFontSize() / 1000; - this_width = FXSYS_fabs(this_width); - FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4; - CFX_AffineMatrix prev_matrix, prev_reverse; - m_pPreObj->GetTextMatrix(&prev_matrix); - prev_matrix.Concat(m_perMatrix); - prev_reverse.SetReverse(prev_matrix); - FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY(); - formMatrix.Transform(x, y); - prev_reverse.Transform(x, y); - FX_WCHAR preChar = GetPreChar(); - CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode); - FX_WCHAR curChar = wstrItem.GetAt(0); - if (FXSYS_fabs(y) > threshold * 2) { - if (preChar == L'-') { - return 3; - } - if (preChar != L' ') { - return 1; - } - return 2; - } - if ((x - last_pos - last_width) > threshold && curChar != L' ' && preChar != L' ') { - return 1; - } - return 0; -} -int32_t CPDF_LayoutProcessor_Reflow::LogicPreObj(CPDF_TextObject* pObj) -{ - CPDF_TextObject* pPreObj = m_pPreObj; - m_pPreObj = pObj; - if(!pObj || !pPreObj) { - return 0; - } - CPDF_TextObjectItem item; - pPreObj->GetItemInfo(pPreObj->CountItems() - 1, &item); - FX_FLOAT last_pos = item.m_OriginX; - FX_FLOAT last_width = pPreObj->GetFont()->GetCharWidthF(item.m_CharCode) * pPreObj->GetFontSize() / 1000; - last_width = FXSYS_fabs(last_width); - pObj->GetItemInfo(0, &item); - FX_FLOAT this_width = pObj->GetFont()->GetCharWidthF(item.m_CharCode) * pObj->GetFontSize() / 1000; - this_width = FXSYS_fabs(this_width); - FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4; - CFX_AffineMatrix prev_matrix, prev_reverse; - pPreObj->GetTextMatrix(&prev_matrix); - prev_reverse.SetReverse(prev_matrix); - FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY(); - prev_reverse.Transform(x, y); - CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode); - FX_WCHAR curChar = wstrItem.GetAt(0); - if (FXSYS_fabs(y) > threshold * 2) { - return 2; - } - FX_WCHAR preChar = 0; - if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ') { - return 1; - } - return 0; - m_pPreObj = pObj; - if(!pPreObj) { - return 0; - } - if(pPreObj->m_Type != pObj->m_Type) { - return 0; - } - CFX_FloatRect rcCurObj(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top); - CFX_FloatRect rcPreObj(pPreObj->m_Left, pPreObj->m_Bottom, pPreObj->m_Right, pPreObj->m_Top); - if(pObj->m_Type == PDFPAGE_IMAGE) { - if(rcPreObj.Contains(rcCurObj)) { - return 2; - } - if(rcCurObj.Contains(rcPreObj)) { - return 2; - } - return 0; - } - if(pObj->m_Type == PDFPAGE_TEXT) { - if(!((rcPreObj.bottom > rcCurObj.top) || (rcPreObj.top < rcCurObj.bottom))) { - FX_FLOAT height = FX_MIN(rcPreObj.Height(), rcCurObj.Height()); - if((rcCurObj.left - rcPreObj.right) > height / 3) { - return 3; - } - } - if(FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) >= 2 || FXSYS_fabs(rcPreObj.Height() - rcCurObj.Height()) >= 2 ) { - return 0; - } - CPDF_TextObject* pPreTextObj = (CPDF_TextObject*)pPreObj; - CPDF_TextObject* pCurTextObj = (CPDF_TextObject*)pObj; - int nPreCount = pPreTextObj->CountItems(); - int nCurCount = pCurTextObj->CountItems(); - if (nPreCount != nCurCount) { - return 0; - } - FX_BOOL bSame = TRUE; - for (int i = 0; i < nPreCount; i++) { - CPDF_TextObjectItem itemPer, itemCur; - pPreTextObj->GetItemInfo(i, &itemPer); - pCurTextObj->GetItemInfo(i, &itemCur); - if (itemCur.m_CharCode != itemPer.m_CharCode) { - return 0; - } - if (itemCur.m_OriginX != itemPer.m_OriginX) { - bSame = FALSE; - } - if (itemCur.m_OriginY != itemPer.m_OriginY) { - bSame = FALSE; - } - } - if(rcPreObj.left == rcCurObj.left && rcPreObj.top == rcCurObj.top) { - return 1; - } - if(FXSYS_fabs(rcPreObj.left - rcCurObj.left) < rcPreObj.Width() / 3 - && FXSYS_fabs(rcPreObj.top - rcCurObj.top) < rcPreObj.Height() / 3) { - return 2; - } - } - return 0; -} -FX_BOOL CPDF_LayoutProcessor_Reflow::IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2) -{ - if (!pTextObj1 || !pTextObj2) { - return FALSE; - } - CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top); - CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top); - if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) { - return FALSE; - } - if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) { - rcPreObj.Intersect(rcCurObj); - if (rcPreObj.IsEmpty()) { - return FALSE; - } - if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) { - return FALSE; - } - if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) { - return FALSE; - } - } - int nPreCount = pTextObj2->CountItems(); - int nCurCount = pTextObj1->CountItems(); - if (nPreCount != nCurCount) { - return FALSE; - } - for (int i = 0; i < nPreCount; i++) { - CPDF_TextObjectItem itemPer, itemCur; - pTextObj2->GetItemInfo(i, &itemPer); - pTextObj1->GetItemInfo(i, &itemCur); - if (itemCur.m_CharCode != itemPer.m_CharCode) { - return FALSE; - } - } - return TRUE; -} -void CPDF_LayoutProcessor_Reflow::ProcessTextObject(CPDF_TextObject *pTextObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix) -{ - if(reflowWidth < 0 || !m_pCurrLine || !m_pTempLine) { - return; - } - if(IsSameTextObject(pTextObj, m_pPreObj)) { - return; - } - CPDF_PageObject* pPreObj = m_pPreObj; - int32_t logic = ProcessInsertObject(pTextObj, objMatrix); - m_pPreObj = pTextObj; - m_perMatrix.Copy(objMatrix); - int size = m_pTempLine->GetSize(); - int curs = m_pCurrLine->GetSize(); - CreateRFData(pTextObj); - size = m_pTempLine->GetSize(); - int reds = m_pReflowedPage->m_pReflowed->GetSize(); - if(size == 0) { - return; - } - if(logic == 1) { - m_fCurrLineWidth += pTextObj->GetBBox(&objMatrix).Height() / 3; - } else if(logic == 3 && curs) { - m_fCurrLineWidth -= (*m_pCurrLine)[curs - 1]->m_Width; - m_pCurrLine->Delete(curs - 1); - } - int beginPos = 0, endPos = m_pTempLine->GetSize() - 1; - while(beginPos <= endPos) { - int tempBeginPos = beginPos; - int tempEndPos = endPos; - FX_FLOAT all_width = GetDatasWidth( beginPos, endPos); - if(all_width < reflowWidth - m_fCurrLineWidth) { - CRF_CharData* pBeginData = (CRF_CharData*)(*m_pTempLine)[beginPos]; - CFX_AffineMatrix matrix(1, 0, 0, 1, -pBeginData->m_PosX + m_fCurrLineWidth, -pBeginData->m_PosY); - Transform(&matrix, m_pTempLine, beginPos, endPos - beginPos + 1); - AddTemp2CurrLine(beginPos, endPos - beginPos + 1); - m_pTempLine->RemoveAll(); - return; - } - int midPos ; - if(tempBeginPos >= tempEndPos && tempEndPos != 0) { - midPos = tempEndPos; - } else { - while (tempBeginPos < tempEndPos ) { - midPos = (tempEndPos - tempBeginPos) / 2 + tempBeginPos; - if(midPos == tempBeginPos || midPos == tempEndPos) { - break; - } - FX_FLOAT w = GetDatasWidth( beginPos, midPos); - if(w < reflowWidth - m_fCurrLineWidth) { - tempBeginPos = midPos; - } else { - tempEndPos = midPos; - } - } - midPos = tempBeginPos; - if(midPos == 0) { - FX_FLOAT w = GetDatasWidth( beginPos, 1); - if(w > reflowWidth - m_fCurrLineWidth) { - midPos = -1; - } - } - } - if(midPos == -1) { - int count = m_pCurrLine->GetSize(); - if(count == 0) { - midPos = 0; - } - } - int f = -1; - int i = 0; - for(i = midPos; i >= beginPos; i--) { - CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[i]; - CFX_WideString Wstr = pData->m_pCharState->m_pFont->UnicodeFromCharCode(pData->m_CharCode); - FX_WCHAR cha = Wstr.GetAt(0); - if(i < m_pTempLine->GetSize() - 1) { - CRF_CharData* pNextData = (CRF_CharData*)(*m_pTempLine)[i + 1]; - if(pNextData->m_PosX - (pData->m_PosX + pData->m_Width) >= pData->m_Height / 4) { - f = i; - i++; - } - } - if(f == -1) { - if(IsCanBreakAfter((FX_DWORD)cha)) { - f = i; - i++; - } else if(IsCanBreakBefore((FX_DWORD)cha)) { - f = i - 1; - if(f < beginPos) { - f = -1; - } - } - } - if(f != -1) { - CRF_CharData* pBeginData = (CRF_CharData*)(*m_pTempLine)[beginPos]; - CFX_AffineMatrix matrix(1, 0, 0, 1, -pBeginData->m_PosX + m_fCurrLineWidth, -pBeginData->m_PosY); - Transform(&matrix, m_pTempLine, beginPos, f - beginPos + 1); - CRF_Data* pData = (*m_pTempLine)[0]; - AddTemp2CurrLine(beginPos, f - beginPos + 1); - beginPos = i; - FinishedCurrLine(); - f = 1; - break; - } - } - if(f == -1 && i < beginPos) { - if( m_pCurrLine->GetSize()) { - int count = m_pCurrLine->GetSize(); - f = -1; - for(int i = count - 1; i >= 0; i--) { - CRF_Data* pData = (*m_pCurrLine)[i]; - if(pData->GetType() != CRF_Data::Text) { - f = i + 1; - } else { - CRF_CharData* pCharData = (CRF_CharData*)pData; - CFX_WideString Wstr = pCharData->m_pCharState->m_pFont->UnicodeFromCharCode(pCharData->m_CharCode); - FX_WCHAR cha = Wstr.GetAt(0); - if(IsCanBreakAfter(cha)) { - f = i + 1; - i++; - } else if(IsCanBreakBefore(cha)) { - f = i; - } - if(f == 0) { - f = -1; - } - } - if(f != -1) { - FinishedCurrLine(); - if(f < count) { - int reflowdCount = m_pReflowedPage->m_pReflowed->GetSize(); - int pos = reflowdCount + f - count; - CRF_CharData* pData = (CRF_CharData*)(*m_pReflowedPage->m_pReflowed)[pos]; - CFX_AffineMatrix matrix(1, 0, 0, 1, -pData->m_PosX + m_fCurrLineWidth, -pData->m_PosY); - Transform(&matrix, m_pReflowedPage->m_pReflowed, pos, reflowdCount - pos); - for(int j = pos; j < reflowdCount; j++) { - AddData2CurrLine((*m_pReflowedPage->m_pReflowed)[j]); - } - m_pReflowedPage->m_pReflowed->Delete(pos, count - f); - if(logic == 3) { - m_fCurrLineWidth += pTextObj->GetBBox(&objMatrix).Height() / 3; - } - } - break; - } - } - } - if(f == -1) { - CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[beginPos]; - CFX_AffineMatrix matrix(1, 0, 0, 1, -pData->m_PosX + m_fCurrLineWidth, -pData->m_PosY); - if(beginPos == midPos) { - Transform(&matrix, pData); - FX_RECT rect; - pData->m_pCharState->m_pFont->GetFontBBox(rect); - FX_FLOAT* pmatrix = pTextObj->m_TextState.GetMatrix(); - CFX_AffineMatrix textMatrix(pmatrix[0], pmatrix[1], pmatrix[2], pmatrix[3], 0, 0); - FX_FLOAT width = pData->m_Height * (rect.right - rect.left) / 1000; - FX_FLOAT f = (reflowWidth - m_fCurrLineWidth) / width; - pData->m_PosY *= f; - pData->m_Width *= f; - pData->m_Height *= f; - pData->m_pCharState = GetCharState(pData->m_pCharState->m_pTextObj, pData->m_pCharState->m_pFont, pData->m_Height, pData->m_pCharState->m_Color); - AddData2CurrLine(pData); - } else { - for(int m = beginPos; m <= midPos; m++) { - CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[m]; - Transform(&matrix, pData); - AddData2CurrLine(pData); - } - } - FinishedCurrLine(); - beginPos = midPos + 1; - } - } - } - m_pTempLine->RemoveAll(); - return; -} -void CPDF_LayoutProcessor_Reflow::ProcessUnitaryObjs(CPDF_PageObjects *pObjs, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix) -{ - if(!pObjs) { - return; - } - CFX_FloatRect ObjBBox = pObjs->CalcBoundingBox(); - objMatrix.TransformRect(ObjBBox); - FX_FLOAT ObjWidth = ObjBBox.Width(); - FX_FLOAT ObjHeight = ObjBBox.Height(); - CFX_AffineMatrix matrix; - if(ObjWidth <= reflowWidth - m_fCurrLineWidth) { - matrix.Set(1, 0, 0, 1, m_fCurrLineWidth , 0); - } else if(ObjWidth <= reflowWidth) { - FinishedCurrLine(); - matrix.Set(1, 0, 0, 1, 0, 0); - } else { - FinishedCurrLine(); - FX_FLOAT f = reflowWidth / ObjWidth ; - matrix.Set(f, 0, 0, f, 0, 0); - } - CFX_AffineMatrix tempMatrix = matrix; - matrix.Concat(objMatrix); - FX_POSITION pos = pObjs->GetFirstObjectPosition(); - while(pos) { - CPDF_PageObject* pObj = pObjs->GetNextObject(pos); - if(pObj->m_Type == PDFPAGE_TEXT) { - int32_t ret = LogicPreObj((CPDF_TextObject*)pObj); - if(ret == 1 || ret == 2) { - continue; - } - } - CreateRFData(pObj, &matrix); - } - if (m_pTempLine) { - Transform(&tempMatrix, m_pTempLine, 0, m_pTempLine->GetSize()); - AddTemp2CurrLine(0, m_pTempLine->GetSize()); - m_pTempLine->RemoveAll(); - } -} -void CPDF_LayoutProcessor_Reflow::ProcessPathObject(CPDF_PathObject *pObj, FX_FLOAT reflowWidth) -{ -} diff --git a/core/src/reflow/layoutprovider_taggedpdf.cpp b/core/src/reflow/layoutprovider_taggedpdf.cpp deleted file mode 100644 index 37eb2ad3cc..0000000000 --- a/core/src/reflow/layoutprovider_taggedpdf.cpp +++ /dev/null @@ -1,769 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "layoutprovider_taggedpdf.h" -CPDF_LayoutElement::CPDF_LayoutElement() -{ - m_pTaggedElement = NULL; - m_pParentElement = NULL; -} -CPDF_LayoutElement::~CPDF_LayoutElement() -{ - m_ObjArray.RemoveAll(); - int size = m_ChildArray.GetSize(); - for(int i = 0; i < size; i++) { - CPDF_LayoutElement* pChild = (CPDF_LayoutElement*)m_ChildArray.GetAt(i); - delete pChild; - pChild = NULL; - } - m_ChildArray.RemoveAll(); -} -LayoutType CPDF_LayoutElement::ConvertLayoutType(const CFX_ByteStringC& name) -{ - if(name == (const char*)("Document")) { - return LayoutDocument; - } else if(name == (const char*)("Part")) { - return LayoutPart; - } else if(name == (const char*)("Art")) { - return LayoutArt; - } else if(name == (const char*)("Sect")) { - return LayoutSect; - } else if(name == (const char*)("Div")) { - return LayoutDiv; - } else if(name == (const char*)("BlockQuote")) { - return LayoutBlockQuote; - } else if(name == (const char*)("Caption")) { - return LayoutCaption; - } else if(name == (const char*)("TOC")) { - return LayoutTOC; - } else if(name == (const char*)("TOCI")) { - return LayoutTOCI; - } else if(name == (const char*)("Index")) { - return LayoutIndex; - } else if(name == (const char*)("NonStruct")) { - return LayoutNonStruct; - } else if(name == (const char*)("Private")) { - return LayoutPrivate; - } else if(name == (const char*)("P")) { - return LayoutParagraph; - } else if(name == (const char*)("H")) { - return LayoutHeading; - } else if(name == (const char*)("H1")) { - return LayoutHeading1; - } else if(name == (const char*)("H2")) { - return LayoutHeading2; - } else if(name == (const char*)("H3")) { - return LayoutHeading3; - } else if(name == (const char*)("H4")) { - return LayoutHeading4; - } else if(name == (const char*)("H5")) { - return LayoutHeading5; - } else if(name == (const char*)("H6")) { - return LayoutHeading6; - } else if(name == (const char*)("L")) { - return LayoutList; - } else if(name == (const char*)("LI")) { - return LayoutListItem; - } else if(name == (const char*)("Lbl")) { - return LayoutListLabel; - } else if(name == (const char*)("LBody")) { - return LayoutListBody; - } else if(name == (const char*)("Table")) { - return LayoutTable; - } else if(name == (const char*)("TR")) { - return LayoutTableRow; - } else if(name == (const char*)("TH")) { - return LayoutTableHeaderCell; - } else if(name == (const char*)("TD")) { - return LayoutTableDataCell; - } else if(name == (const char*)("THead")) { - return LayoutTableHeaderGroup; - } else if(name == (const char*)("TBody")) { - return LayoutTableBodyGroup; - } else if(name == (const char*)("TFoot")) { - return LayoutTableFootGroup; - } else if(name == (const char*)("Span")) { - return LayoutSpan; - } else if(name == (const char*)("Quote")) { - return LayoutQuote; - } else if(name == (const char*)("Note")) { - return LayoutNote; - } else if(name == (const char*)("Reference")) { - return LayoutReference; - } else if(name == (const char*)("BibEntry")) { - return LayoutBibEntry; - } else if(name == (const char*)("Code")) { - return LayoutCode; - } else if(name == (const char*)("Link")) { - return LayoutLink; - } else if(name == (const char*)("Annot")) { - return LayoutAnnot; - } else if(name == (const char*)("Ruby")) { - return LayoutRuby; - } else if(name == (const char*)("RB")) { - return LayoutRubyBase; - } else if(name == (const char*)("RT")) { - return LayoutRubyAnnot; - } else if(name == (const char*)("RP")) { - return LayoutRubyPunc; - } else if(name == (const char*)("Warichu")) { - return LayoutWarichu; - } else if(name == (const char*)("WT")) { - return LayoutWarichuText; - } else if(name == (const char*)("WP")) { - return LayoutWarichuPunc; - } else if(name == (const char*)("Figure")) { - return LayoutFigure; - } else if(name == (const char*)("Formula")) { - return LayoutFormula; - } else if(name == (const char*)("Form")) { - return LayoutForm; - } else { - return LayoutUnknown; - } -} -CFX_ByteStringC CPDF_LayoutElement::ConvertLayoutType(LayoutType type) -{ - const CFX_ByteStringC& name = ""; - if(type == LayoutArifact) { - return "Arifact"; - } else if( type == LayoutDocument) { - return "Document"; - } else if( type == LayoutPart) { - return "Part"; - } else if( type == LayoutArt) { - return "Art"; - } else if( type == LayoutSect) { - return "Sect"; - } else if( type == LayoutDiv) { - return "Div"; - } else if( type == LayoutBlockQuote) { - return "BlockQuote"; - } else if( type == LayoutCaption) { - return "Caption"; - } else if( type == LayoutTOC) { - return "TOC"; - } else if( type == LayoutTOCI) { - return "TOCI"; - } else if( type == LayoutIndex) { - return "Index"; - } else if( type == LayoutNonStruct) { - return "NonStruct"; - } else if( type == LayoutPrivate) { - return "Private"; - } else if( type == LayoutParagraph) { - return "P"; - } else if( type == LayoutHeading) { - return "H"; - } else if( type == LayoutHeading1) { - return "H1"; - } else if( type == LayoutHeading2) { - return "H2"; - } else if( type == LayoutHeading3) { - return "H3"; - } else if( type == LayoutHeading4) { - return "H4"; - } else if( type == LayoutHeading5) { - return "H5"; - } else if( type == LayoutHeading6) { - return "H6"; - } else if( type == LayoutList) { - return "L"; - } else if( type == LayoutListItem) { - return "LI"; - } else if( type == LayoutListLabel) { - return "Lbl"; - } else if( type == LayoutListBody) { - return "LBody"; - } else if( type == LayoutTable) { - return "Table"; - } else if( type == LayoutTableRow) { - return "TR"; - } else if( type == LayoutTableHeaderCell) { - return "TH"; - } else if( type == LayoutTableDataCell) { - return "TD"; - } else if( type == LayoutTableHeaderGroup) { - return "THead"; - } else if( type == LayoutTableBodyGroup) { - return "TBody"; - } else if( type == LayoutTableFootGroup) { - return "TFoot"; - } else if( type == LayoutSpan) { - return "Span"; - } else if( type == LayoutQuote) { - return "Quote"; - } else if( type == LayoutNote) { - return "Note"; - } else if( type == LayoutReference) { - return "Reference"; - } else if( type == LayoutBibEntry) { - return "BibEntry"; - } else if( type == LayoutCode) { - return "Code"; - } else if( type == LayoutLink) { - return "Link"; - } else if( type == LayoutAnnot) { - return "Annot"; - } else if( type == LayoutRuby) { - return "Ruby"; - } else if( type == LayoutRubyBase) { - return "RB"; - } else if( type == LayoutRubyAnnot) { - return "RT"; - } else if( type == LayoutRubyPunc) { - return "RP"; - } else if( type == LayoutWarichu) { - return "Warichu"; - } else if( type == LayoutWarichuText) { - return "WT"; - } else if( type == LayoutWarichuPunc) { - return "WP"; - } else if( type == LayoutFigure) { - return "Figure"; - } else if( type == LayoutFormula) { - return "Formula"; - } else if( type == LayoutForm) { - return "Form"; - } - return name; -} -CFX_ByteStringC CPDF_LayoutElement::ConvertLayoutAttr(LayoutAttr attr) -{ - switch(attr) { - case LayoutArtifactType: - return "Type"; - case LayoutArtifactAttached: - return "Attached"; - case LayoutArtifactSubType: - return "Subtype"; - case LayoutPlacement: - return "Placement"; - case LayoutWritingMode: - return "WritingMode"; - case LayoutBackgroundColor: - return "BackgroundColor"; - case LayoutBorderColor: - return "BorderColor"; - case LayoutBorderStyle: - return "BorderStyle"; - case LayoutBorderThickness: - return "BorderThickness"; - case LayoutPadding: - return "Padding"; - case LayoutColor: - return "Color"; - case LayoutSpaceBefore: - return "SpaceBefore"; - case LayoutSpaceAfter: - return "SpaceAfter"; - case LayoutStartIndent: - return "StartIndent"; - case LayoutEndIndent: - return "EndIndent"; - case LayoutTextIndent: - return "TextIndent"; - case LayoutTextAlign: - return "TextAlign"; - case LayoutBBox: - return "BBox"; - case LayoutWidth: - return "Width"; - case LayoutHeight: - return "Height"; - case LayoutBlockAlign: - return "BlockAlign"; - case LayoutInlineAlign: - return "InlineAlign"; - case LayoutTBorderStyle: - return "TBorderStyle"; - case LayoutTPadding: - return "TPadding"; - case LayoutBaselineShift: - return "BaselineShift"; - case LayoutLineHeight: - return "LineHeight"; - case LayoutTextDecorationColor: - return "TextDecorationColor"; - case LayoutTextDecorationThickness: - return "TextDecorationThickness"; - case LayoutTextDecorationType: - return "TextDecorationType"; - case LayoutRubyAlign: - return "RubyAlign"; - case LayoutRubyPosition: - return "RubyPosition"; - case LayoutGlyphOrientationVertical: - return "GlyphOrientationVertical"; - case LayoutColumnCount: - return "ColumnCount"; - case LayoutColumnGap: - return "ColumnGap"; - case LayoutColumnWidths: - return "ColumnWidths"; - case LayoutListNumbering: - return "ListNumbering"; - case LayoutFieldRole: - return "Role"; - case LayoutFieldChecked: - return "checked"; - case LayoutFieldDesc: - return "Desc"; - case LayoutRowSpan: - return "RowSpan"; - case LayoutColSpan: - return "ColSpan"; - case LayoutTableHeaders: - return "Headers"; - case LayoutTableHeaderScope: - return "Scope"; - case LayoutTableSummary: - return "Summary"; - default: - return ""; - } -} -LayoutEnum CPDF_LayoutElement::ConvertLayoutEnum(CFX_ByteStringC Enum) -{ - if(Enum == "Block") { - return LayoutBlock; - } else if (Enum == "Inline") { - return LayoutInline; - } else if (Enum == "Before") { - return LayoutBefore; - } else if (Enum == "Start") { - return LayoutStart; - } else if (Enum == "End") { - return LayoutEnd; - } else if (Enum == "LrTb") { - return LayoutLrTb; - } else if (Enum == "RlTb") { - return LayoutRlTb; - } else if (Enum == "TbRl") { - return LayoutTbRl; - } else if (Enum == "None") { - return LayoutNone; - } else if (Enum == "Hidden") { - return LayoutHidden; - } else if (Enum == "Dotted") { - return LayoutDotted; - } else if (Enum == "Dashed") { - return LayoutDashed; - } else if (Enum == "Solid") { - return LayoutSolid; - } else if (Enum == "Double") { - return LayoutDouble; - } else if (Enum == "Groove") { - return LayoutGroove; - } else if (Enum == "Ridge") { - return LayoutRidge; - } else if (Enum == "Inset") { - return LayoutInset; - } else if (Enum == "Outset") { - return LayoutOutset; - } else if (Enum == "Normal") { - return LayoutNormal; - } else if (Enum == "Auto") { - return LayoutAuto; - } else if (Enum == "Center") { - return LayoutCenter; - } else if (Enum == "Justify") { - return LayoutJustify; - } else if (Enum == "Middle") { - return LayoutMiddle; - } else if (Enum == "Underline") { - return LayoutUnderline; - } else if (Enum == "Overline") { - return LayoutOverline; - } else if (Enum == "LineThrough") { - return LayoutLineThrough; - } else if (Enum == "Distribute") { - return LayoutDistribute; - } else if (Enum == "Disc") { - return LayoutDisc; - } else if (Enum == "Circle") { - return LayoutCircle; - } else if (Enum == "Square") { - return LayoutSquare; - } else if (Enum == "Decimal") { - return LayoutDecimal; - } else if (Enum == "UpperRoman") { - return LayoutUpperRoman; - } else if (Enum == "LowerRoman") { - return LayoutLowerRoman; - } else if (Enum == "UpperAlpha") { - return LayoutUpperAlpha; - } else if (Enum == "LowerAlpha") { - return LayoutLowerAlpha; - } else if (Enum == "rb") { - return LayoutRB; - } else if (Enum == "cb") { - return LayoutCB; - } else if (Enum == "pb") { - return LayoutPB; - } else if (Enum == "tv") { - return LayoutTV; - } else if (Enum == "on") { - return LayoutOn; - } else if (Enum == "off") { - return LayoutOff; - } else if (Enum == "neutral") { - return LayoutNeutral; - } else if (Enum == "Row") { - return LayoutRow; - } else if (Enum == "Column") { - return LayoutColumn; - } else if (Enum == "Both") { - return LayoutBoth; - } else if (Enum == "Left") { - return LayoutLeft; - } else if (Enum == "Top") { - return LayoutTop; - } else if (Enum == "Bottom") { - return LayoutBottom; - } else if (Enum == "Right") { - return LayoutRight; - } else if (Enum == "Pagination") { - return LayoutPagination; - } else if (Enum == "Layout") { - return LayoutLayout; - } else if (Enum == "Page") { - return LayoutPage; - } else if (Enum == "Background") { - return LayoutBackground; - } else if (Enum == "Header") { - return LayoutHeader; - } else if (Enum == "Footer") { - return LayoutFooter; - } else if (Enum == "Watermark") { - return LayoutWatermark; - } else { - return LayoutInvalid; - } -} -LayoutType CPDF_LayoutElement::GetType() -{ - if(!m_pTaggedElement) { - return LayoutUnknown; - } - CFX_ByteString name = m_pTaggedElement->GetType(); - return ConvertLayoutType(name); -} -int CPDF_LayoutElement::CountAttrValues(LayoutAttr attr_type) -{ - if(!m_pTaggedElement) { - return 0; - } - CPDF_Object* pObj = m_pTaggedElement->GetAttr(GetAttrOwner(attr_type), ConvertLayoutAttr(attr_type), IsInheritable(attr_type)); - if(pObj) { - return 1; - } else { - return 0; - } -} -LayoutEnum CPDF_LayoutElement::GetEnumAttr(LayoutAttr attr_type, int index) -{ - if(!m_pTaggedElement) { - return LayoutInvalid; - } - CFX_ByteStringC owner = GetAttrOwner(attr_type); - CFX_ByteStringC default_value = GetDefaultNameValue(attr_type); - CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type); - CFX_ByteString AttrValue = m_pTaggedElement->GetName(owner, AttrName, default_value, IsInheritable(attr_type), index); - return ConvertLayoutEnum(AttrValue); -} -CFX_ByteStringC CPDF_LayoutElement::GetAttrOwner(LayoutAttr attr_type) -{ - switch(attr_type) { - case LayoutListNumbering: - return "List"; - case LayoutFieldRole: - case LayoutFieldChecked : - case LayoutFieldDesc: - return "PrintField"; - case LayoutRowSpan: - case LayoutColSpan: - case LayoutTableHeaders: - case LayoutTableHeaderScope: - case LayoutTableSummary: - return "Table"; - default: - return "Layout"; - } -} -FX_FLOAT CPDF_LayoutElement::GetNumberAttr(LayoutAttr attr_type, int index) -{ - if(!m_pTaggedElement) { - return 0; - } - CFX_ByteStringC owner = GetAttrOwner(attr_type); - FX_FLOAT default_value = GetDefaultFloatValue(attr_type); - CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type); - FX_FLOAT f = m_pTaggedElement->GetNumber(owner, AttrName, default_value, IsInheritable(attr_type), index); - if(attr_type == LayoutWidth && !f) { - f = m_pTaggedElement->GetNumber("Table", AttrName, default_value, IsInheritable(attr_type), index); - } - return f; -} -FX_COLORREF CPDF_LayoutElement::GetColorAttr(LayoutAttr attr_type, int index) -{ - if(!m_pTaggedElement) { - return 0; - } - CFX_ByteStringC owner = GetAttrOwner(attr_type); - FX_COLORREF default_value = GetDefaultColorValue(attr_type); - CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type); - FX_ARGB f = m_pTaggedElement->GetColor(owner, AttrName, default_value, IsInheritable(attr_type), index); - return f; -} -FX_FLOAT CPDF_LayoutElement::GetDefaultFloatValue(LayoutAttr attr_type) -{ - switch(attr_type) { - case LayoutColumnCount: - return 1; - case LayoutRowSpan: - return 1; - case LayoutColSpan: - return 1; - default: - return 0; - } -} -FX_COLORREF CPDF_LayoutElement::GetDefaultColorValue(LayoutAttr attr_type) -{ - return -1; -} -CFX_ByteStringC CPDF_LayoutElement::GetDefaultNameValue(LayoutAttr attr_type) -{ - switch(attr_type) { - case LayoutPlacement: - return "Inline"; - case LayoutWritingMode: - return "LrTb"; - case LayoutBorderStyle: - return "None"; - case LayoutTextAlign: - return "Start"; - case LayoutBlockAlign: - return "Before"; - case LayoutInlineAlign: - return "Start"; - case LayoutTBorderStyle: - return "None"; - case LayoutTextDecorationType: - return "None"; - case LayoutRubyAlign: - return "Distribute"; - case LayoutRubyPosition: - return "Before"; - case LayoutGlyphOrientationVertical: - return "Auto"; - case LayoutListNumbering: - return "None"; - case LayoutFieldRole: - return "None"; - default: - return ""; - } -} -FX_BOOL CPDF_LayoutElement::IsInheritable(LayoutAttr type) -{ - switch(type) { - case LayoutWritingMode: - case LayoutTextAlign: - case LayoutBlockAlign: - case LayoutInlineAlign: - case LayoutLineHeight: - case LayoutGlyphOrientationVertical: - case LayoutRubyAlign: - case LayoutRubyPosition: - case LayoutBorderThickness: - case LayoutStartIndent: - case LayoutEndIndent: - case LayoutTextIndent: - case LayoutTPadding: - case LayoutTextDecorationThickness: - case LayoutBorderColor: - case LayoutColor: - case LayoutTextDecorationColor: - return TRUE; - default: - return FALSE; - } -} -int CPDF_LayoutElement::CountChildren() -{ - return m_ChildArray.GetSize(); -} -IPDF_LayoutElement* CPDF_LayoutElement::GetChild(int index) -{ - return (IPDF_LayoutElement*)m_ChildArray.GetAt(index); -} -IPDF_LayoutElement* CPDF_LayoutElement::GetParent() -{ - return m_pParentElement; -} -int CPDF_LayoutElement::CountObjects() -{ - if(m_pTaggedElement == NULL) { - return 0; - } - CFX_PtrArray* pObj = &m_ObjArray; - int size = pObj->GetSize(); - return size; -} -CPDF_PageObject* CPDF_LayoutElement::GetObject(int index) -{ - if(m_pTaggedElement == NULL) { - return NULL; - } - CFX_PtrArray *pObj = &m_ObjArray; - int size = pObj->GetSize(); - if(index < size) { - return (CPDF_PageObject*)pObj->GetAt(index); - } - return NULL; -} -FX_BOOL CPDF_LayoutElement::AddObject(CPDF_PageObject* pObj) -{ - return m_ObjArray.Add(pObj); -} -IPDF_LayoutProvider* IPDF_LayoutProvider::Create_LayoutProvider_TaggedPDF(CPDF_PageObjects* pPage) -{ - if(pPage == NULL) { - return NULL; - } - CPDF_LayoutProvider_TaggedPDF* pProvider = new CPDF_LayoutProvider_TaggedPDF; - pProvider->Init(pPage); - return pProvider; -} -CPDF_LayoutProvider_TaggedPDF::CPDF_LayoutProvider_TaggedPDF() -{ - m_pPause = NULL; - m_pRoot = NULL; - m_pPageTree = NULL; - m_pCurTaggedElement = NULL; -} -CPDF_LayoutProvider_TaggedPDF::~CPDF_LayoutProvider_TaggedPDF() -{ - m_pCurTaggedElement = NULL; - m_pPause = NULL; - if(m_pRoot) { - delete m_pRoot; - } - m_pRoot = NULL; - if(m_pPageTree) { - delete m_pPageTree; - } - m_pPageTree = NULL; -} -void CPDF_LayoutProvider_TaggedPDF::ProcessElement(CPDF_LayoutElement*pParent, CPDF_StructElement* pTaggedElement) -{ - if(!pTaggedElement) { - return; - } - if(!pParent) { - m_Status = LayoutError; - return; - } - CPDF_LayoutElement* pElement = new CPDF_LayoutElement; - pElement->m_pParentElement = pParent; - pElement->m_pTaggedElement = pTaggedElement; - pParent->m_ChildArray.Add(pElement); - int count = pTaggedElement->CountKids(); - for(int i = 0; i < count; i++) { - CPDF_StructKid Kid = pTaggedElement->GetKid(i); - switch(Kid.m_Type) { - case CPDF_StructKid::Element: { - ProcessElement(pElement, Kid.m_Element.m_pElement); - if(m_Status != LayoutReady) { - return ; - } - } - break; - case CPDF_StructKid::PageContent: { - int count = m_pPage->CountObjects(); - FX_POSITION pos = m_pPage->GetFirstObjectPosition(); - if(!pos) { - m_Status = LayoutError; - return ; - } - while (pos) { - CPDF_PageObject* pObj = m_pPage->GetNextObject(pos); - int pbjMCID = pObj->m_ContentMark.GetMCID(); - if((FX_DWORD)(pObj->m_ContentMark.GetMCID()) == Kid.m_PageContent.m_ContentId) { - pElement->AddObject(pObj); - } - } - } - break; - case CPDF_StructKid::StreamContent: - case CPDF_StructKid::Object: - default: - break; - } - } -} -LayoutStatus CPDF_LayoutProvider_TaggedPDF::StartLoad(IFX_Pause* pPause) -{ - m_pPause = pPause; - if(m_pPage->m_pDocument && m_pPage->m_pFormDict) { - m_pPageTree = CPDF_StructTree::LoadPage(m_pPage->m_pDocument, m_pPage->m_pFormDict); - } - if(!m_pPageTree) { - m_Status = LayoutError; - return LayoutError; - } - int count = m_pPageTree->CountTopElements(); - if(count == 0) { - m_Status = LayoutError; - return LayoutError; - } - m_pRoot = new CPDF_LayoutElement; - for(int i = 0; i < count; i++) { - CPDF_StructElement* pElement = m_pPageTree->GetTopElement(i); - if(pElement) { - ProcessElement(m_pRoot, pElement); - if(m_Status != LayoutReady) { - return m_Status; - } - } - } - m_pCurTaggedElement = NULL; - m_Status = LayoutFinished; - return LayoutFinished; -} -LayoutStatus CPDF_LayoutProvider_TaggedPDF::Continue() -{ - if(!m_pCurTaggedElement) { - return LayoutError; - } - if(m_Status != LayoutToBeContinued) { - return LayoutError; - } - m_Status = LayoutReady; - int count = m_pPageTree->CountTopElements(); - for(int i = 0; i < count; i++) { - CPDF_StructElement* pElement = m_pPageTree->GetTopElement(i); - if(pElement) { - ProcessElement(m_pRoot, pElement); - if(m_Status != LayoutReady) { - return m_Status; - } - } - } - m_pCurTaggedElement = NULL; - m_Status = LayoutFinished; - return LayoutFinished; -} -int CPDF_LayoutProvider_TaggedPDF::GetPosition() -{ - if(m_TopElementIndex == 0) { - return 0; - } - int count = m_pPageTree->CountTopElements(); - return m_TopElementIndex / count * 100; -} diff --git a/core/src/reflow/layoutprovider_taggedpdf.h b/core/src/reflow/layoutprovider_taggedpdf.h deleted file mode 100644 index fa6c994bf0..0000000000 --- a/core/src/reflow/layoutprovider_taggedpdf.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef CORE_SRC_REFLOW_LAYOUTPROVIDER_TAGGEDPDF_H_ -#define CORE_SRC_REFLOW_LAYOUTPROVIDER_TAGGEDPDF_H_ - -#include "../../include/reflow/reflowengine.h" - -class CPDF_LayoutElement : public IPDF_LayoutElement -{ -public: - CPDF_LayoutElement(); - ~CPDF_LayoutElement(); - - LayoutType GetType(); - void GetRect(CFX_FloatRect& rcRect) {}; - - int CountAttrValues(LayoutAttr attr_type); - - LayoutEnum GetEnumAttr(LayoutAttr attr_type, int index); - FX_FLOAT GetNumberAttr(LayoutAttr attr_type, int index); - FX_COLORREF GetColorAttr(LayoutAttr attr_type, int index); - - int CountChildren(); - - IPDF_LayoutElement* GetChild(int index); - - IPDF_LayoutElement* GetParent(); - - int CountObjects(); - CPDF_PageObject* GetObject(int index); - FX_BOOL AddObject(CPDF_PageObject* pObj); - CPDF_StructElement* m_pTaggedElement; - CPDF_LayoutElement* m_pParentElement; - CFX_PtrArray m_ChildArray; - LayoutType ConvertLayoutType(const CFX_ByteStringC& name); - CFX_ByteStringC ConvertLayoutType(LayoutType type); - CFX_ByteStringC ConvertLayoutAttr(LayoutAttr attr); - LayoutEnum ConvertLayoutEnum(CFX_ByteStringC Enum); - -protected: - FX_BOOL IsInheritable(LayoutAttr attr_type); - CFX_ByteStringC GetAttrOwner(LayoutAttr attr_type); - CFX_ByteStringC GetDefaultNameValue(LayoutAttr attr_type); - FX_FLOAT GetDefaultFloatValue(LayoutAttr attr_type); - FX_COLORREF GetDefaultColorValue(LayoutAttr attr_type); - CFX_PtrArray m_ObjArray; -}; -class CPDF_LayoutProvider_TaggedPDF : public IPDF_LayoutProvider -{ -public: - CPDF_LayoutProvider_TaggedPDF(); - ~CPDF_LayoutProvider_TaggedPDF(); - void SetLayoutProviderStyle(LAYOUTPROVIDER_STYLE style) {}; - - void Init(CPDF_PageObjects* pPage) - { - m_pPage = pPage; - m_Status = LayoutReady; - }; - - LayoutStatus StartLoad(IFX_Pause* pPause = NULL); - LayoutStatus Continue(); - int GetPosition(); - - IPDF_LayoutElement* GetRoot() - { - return m_pRoot; - }; - -protected: - void ProcessElement(CPDF_LayoutElement*pParent, CPDF_StructElement* pTaggedElement); - LayoutStatus m_Status; - CPDF_StructElement* m_pCurTaggedElement; - CPDF_LayoutElement* m_pRoot; - IFX_Pause* m_pPause; - CPDF_PageObjects* m_pPage; - CPDF_StructTree* m_pPageTree; - int m_TopElementIndex; -}; - -#endif // CORE_SRC_REFLOW_LAYOUTPROVIDER_TAGGEDPDF_H_ diff --git a/core/src/reflow/reflowedpage.cpp b/core/src/reflow/reflowedpage.cpp deleted file mode 100644 index 41a80b7a06..0000000000 --- a/core/src/reflow/reflowedpage.cpp +++ /dev/null @@ -1,617 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "../../include/reflow/reflowengine.h" -#include "reflowedpage.h" -CPDF_ProgressiveReflowPageParser::CPDF_ProgressiveReflowPageParser() -{ - m_nObjProcessed = 0; - m_pReflowEngine = NULL; - m_pProvider = NULL; -} -CPDF_ProgressiveReflowPageParser::~CPDF_ProgressiveReflowPageParser() -{ - if(m_pProvider) { - delete m_pProvider; - } - m_pProvider = NULL; - if(m_pReflowEngine) { - delete m_pReflowEngine; - } - m_pReflowEngine = NULL; -} -void CPDF_ProgressiveReflowPageParser::Init() -{ - m_Status = Ready; -} -CPDF_ReflowedPage::CPDF_ReflowedPage(CFX_GrowOnlyPool* pMemoryPool) -{ - m_PageWidth = 0; - m_PageHeight = 0; - m_bWaiting = TRUE; - if(pMemoryPool) { - m_pMemoryPool = pMemoryPool; - m_bCreateMemoryPool = FALSE; - } else { - m_pMemoryPool = new CFX_GrowOnlyPool; - m_bCreateMemoryPool = TRUE; - } - m_pCharState = new CRF_CharStateArray(10); - m_pReflowed = new CRF_DataPtrArray(500); - m_pPageInfos = NULL; -} -CPDF_ReflowedPage::~CPDF_ReflowedPage() -{ - if (m_pReflowed) { - for(int i = 0; i < m_pReflowed->GetSize(); i++) { - CRF_Data* pData = (*m_pReflowed)[i]; - if(pData->m_Type == CRF_Data::Image) { - delete ((CRF_ImageData*)pData)->m_pBitmap; - } - } - m_pReflowed->RemoveAll(); - delete m_pReflowed; - } - m_pReflowed = NULL; - if (m_pCharState) { - m_pCharState->RemoveAll(); - delete m_pCharState; - } - m_pCharState = NULL; - if(m_bCreateMemoryPool && m_pMemoryPool) { - m_pMemoryPool->FreeAll(); - } - if (m_pMemoryPool) { - delete m_pMemoryPool; - } - m_pMemoryPool = NULL; - m_pPDFPage = NULL; - if (m_pPageInfos) { - ReleasePageObjsMemberShip(); - } -} -FX_BOOL CPDF_ReflowedPage::RetainPageObjsMemberShip() -{ - if (NULL == m_pPDFPage) { - return FALSE; - } - if (NULL == m_pPageInfos) { - m_pPageInfos = new CFX_MapPtrToPtr(); - } else { - return TRUE; - } - FX_POSITION pos = m_pPDFPage->GetFirstObjectPosition(); - if (!pos) { - return FALSE; - } - CPDF_PageObject* pPageObj = NULL; - while (pos) { - pPageObj = m_pPDFPage->GetNextObject(pos); - MarkPageObjMemberShip(pPageObj, NULL); - pPageObj = NULL; - } - return TRUE; -} -void CPDF_ReflowedPage::MarkPageObjMemberShip(CPDF_PageObject* pObj, CRF_PageInfo* pParent) -{ - if (NULL == m_pPageInfos) { - return; - } - CRF_PageInfo* pPageInfo = new CRF_PageInfo(pObj, pParent); - m_pPageInfos->SetAt(pObj, pPageInfo); - if (PDFPAGE_FORM != pObj->m_Type) { - return; - } - CPDF_FormObject* pFormObj = (CPDF_FormObject*)pObj; - FX_POSITION pos; - pos = pFormObj->m_pForm->GetFirstObjectPosition(); - if (!pos) { - return; - } - CPDF_PageObject* pPageObj = NULL; - while (pos) { - pPageObj = pFormObj->m_pForm->GetNextObject(pos); - MarkPageObjMemberShip(pPageObj, pPageInfo); - pPageObj = NULL; - } -} -void CPDF_ReflowedPage::ReleasePageObjsMemberShip() -{ - if (NULL == m_pPageInfos) { - return; - } - CPDF_PageObject* pPageObj = NULL; - CRF_PageInfo* pPageInfo = NULL; - FX_POSITION pos = m_pPageInfos->GetStartPosition(); - while (pos) { - m_pPageInfos->GetNextAssoc(pos, (void*&)pPageObj, (void*&)pPageInfo); - delete pPageInfo; - } - m_pPageInfos->RemoveAll(); - delete m_pPageInfos; - m_pPageInfos = NULL; -} -CPDF_Dictionary* CPDF_ReflowedPage::GetFormResDict(CPDF_PageObject* pObj) -{ - if (NULL == m_pPageInfos) { - return NULL; - } - if (FALSE == RetainPageObjsMemberShip()) { - return NULL; - } - CRF_PageInfo* pPageInfo = (CRF_PageInfo*)m_pPageInfos->GetValueAt(pObj); - if (NULL == pPageInfo) { - return NULL; - } - return pPageInfo->GetFormDict(); -} -void CPDF_ReflowedPage::GetDisplayMatrix(CFX_AffineMatrix& matrix, int32_t xPos, int32_t yPos, int32_t xSize, int32_t ySize, int32_t iRotate, const CFX_AffineMatrix* pPageMatrix) -{ - CFX_AffineMatrix display_matrix; - if(m_PageHeight == 0) { - matrix.Set(1, 0, 0, -1, 0, 0); - return; - } - int32_t x0, y0, x1, y1, x2, y2; - iRotate %= 4; - switch (iRotate) { - case 0: - x0 = xPos; - y0 = yPos; - x1 = xPos; - y1 = yPos + ySize; - x2 = xPos + xSize; - y2 = yPos; - break; - case 3: - x0 = xPos; - y0 = ySize + yPos; - x1 = xPos + xSize; - y1 = yPos + ySize; - x2 = xPos; - y2 = yPos; - break; - case 2: - x0 = xSize + xPos; - y0 = ySize + yPos; - x1 = xSize + xPos ; - y1 = yPos; - x2 = xPos; - y2 = ySize + yPos; - break; - case 1: - x0 = xPos + xSize; - y0 = yPos; - x1 = xPos; - y1 = yPos; - x2 = xPos + xSize; - y2 = yPos + ySize; - break; - } - display_matrix.Set(FXSYS_Div((FX_FLOAT)(x2 - x0), m_PageWidth), - FXSYS_Div((FX_FLOAT)(y2 - y0), m_PageWidth), - FXSYS_Div((FX_FLOAT)(x1 - x0), m_PageHeight), - FXSYS_Div((FX_FLOAT)(y1 - y0), m_PageHeight), - (FX_FLOAT)(x0), (FX_FLOAT)(y0)); - matrix.Set(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f); - matrix.Concat(display_matrix); - return; -} -FX_FLOAT CPDF_ReflowedPage::GetPageHeight() -{ - return m_PageHeight; -} -void CPDF_ReflowedPage::FocusGetData(const CFX_AffineMatrix matrix, int32_t x, int32_t y, CFX_ByteString& str) -{ - if (NULL == m_pReflowed) { - return; - } - CFX_AffineMatrix revMatrix; - revMatrix.SetReverse(matrix); - FX_FLOAT x1, y1; - revMatrix.Transform((float)x, (float)y, x1, y1); - int count = m_pReflowed->GetSize(); - FX_FLOAT dx = 1000, dy = 1000; - int32_t pos = 0; - int32_t i; - for(i = 0; i < count; i++) { - CRF_Data* pData = (*m_pReflowed)[i]; - FX_FLOAT tempdy = FXSYS_fabs(pData->m_PosY - y1); - if(FXSYS_fabs(tempdy - dy) < 1) { - continue; - } - CFX_FloatRect rect (0, pData->m_PosY + pData->m_Height, m_PageWidth, pData->m_PosY); - if(rect.Contains(x1, y1)) { - pos = i; - dx = 0; - dy = 0; - break; - } else if(tempdy < dy) { - dy = tempdy; - dx = FXSYS_fabs(pData->m_PosX - x1); - pos = i; - } else if (tempdy == dy) { - FX_FLOAT tempdx = FXSYS_fabs(pData->m_PosX - x1); - if(tempdx < dx) { - dx = tempdx; - pos = i; - } - } else if (tempdy > dy) { - break; - } - } - if(dx != 0 || dy != 0) { - count = count < (pos + 10) ? count : (pos + 10); - for(i = 0 > (pos - 10) ? 0 : (pos - 10); i < count; i++) { - CRF_Data* pData = (*m_pReflowed)[i]; - FX_FLOAT tempdy = FXSYS_fabs(pData->m_PosY - y1); - if(tempdy < dy) { - dy = tempdy; - dx = FXSYS_fabs(pData->m_PosX - x1); - pos = i; - } else if (tempdy == dy) { - FX_FLOAT tempdx = FXSYS_fabs(pData->m_PosX - x1); - if(tempdx < dx) { - dx = tempdx; - pos = i; - } - } - } - } - str.Format("%d", pos); -} -FX_BOOL CPDF_ReflowedPage::FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, int32_t& x, int32_t& y) -{ - if (NULL == m_pReflowed) { - return FALSE; - } - int32_t pos = FXSYS_atoi(str); - if(pos < 0 || pos >= m_pReflowed->GetSize()) { - return FALSE; - } - CRF_Data* pData = (*m_pReflowed)[pos]; - FX_FLOAT x1, y1; - matrix.Transform(pData->m_PosX, pData->m_PosY + pData->m_Height, x1, y1); - x = (int)x1; - y = (int)y1; - return TRUE; -} -int CPDF_ProgressiveReflowPageParser::GetPosition() -{ - if(!m_pProvider) { - return 0; - } - if(!m_pReflowEngine) { - return m_pProvider->GetPosition() / 2; - } - return m_pProvider->GetPosition() / 2 + m_pReflowEngine->GetPosition() / 2; -} -void CPDF_ProgressiveReflowPageParser::Continue(IFX_Pause* pPause) -{ - if (NULL == m_pReflowPage) { - return; - } - if(m_Status != ToBeContinued) { - return; - } - m_pPause = pPause; - if(m_pReflowEngine) { - if(m_pReflowEngine->Continue() != LayoutToBeContinued) { - m_Status = Done; - } - } else { - if(m_pProvider->Continue() == LayoutFinished) { - m_pReflowEngine = IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(m_TopIndent, m_ReflowedWidth, m_fScreenHeight, m_pReflowPage, m_flags, m_ParseStyle.m_LineSpace); - CFX_AffineMatrix matrix; - m_pPDFPage->GetDisplayMatrix(matrix, 0, 0, (int)(m_pPDFPage->GetPageWidth()), (int)(m_pPDFPage->GetPageHeight()), 0); - if(m_pReflowEngine->StartProcess(m_pProvider->GetRoot(), m_pPause, &matrix) != LayoutToBeContinued) { - m_Status = Done; - } - } - } - if(m_TopIndent && m_Status == Done) { - m_pReflowPage->m_PageHeight -= m_TopIndent; - } -} -void CPDF_ProgressiveReflowPageParser::Clear() -{ - Init(); - return; -} -FX_BOOL IPDF_ProgressiveReflowPageParser::IsTaggedPage(CPDF_PageObjects*pPage) -{ - if(!pPage) { - return FALSE; - } - CPDF_StructTree* pPageTree = CPDF_StructTree::LoadPage(pPage->m_pDocument, pPage->m_pFormDict); - if(pPageTree) { - int count = pPageTree->CountTopElements(); - if(count) { - for(int i = 0; i < count; i++) { - CPDF_StructElement* pElm = pPageTree->GetTopElement(i); - if(pElm) { - delete pPageTree; - pPageTree = NULL; - return TRUE; - } - } - } - delete pPageTree; - pPageTree = NULL; - return FALSE; - } - return FALSE; -} -void CPDF_ProgressiveReflowPageParser::Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT topIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags) -{ - if (NULL == pReflowPage) { - m_Status = Failed; - return; - } - m_flags = flags; - m_pReflowPage = (CPDF_ReflowedPage*)pReflowPage; - m_pReflowPage->m_pPDFPage = pPage; - m_pReflowPage->ReleasePageObjsMemberShip(); - m_pPDFPage = pPage; - m_TopIndent = topIndent; - m_pPause = pPause; - m_fScreenHeight = fHeight; - m_ReflowedWidth = fWidth; - m_pProvider = IPDF_LayoutProvider::Create_LayoutProvider_TaggedPDF(m_pPDFPage); - LayoutStatus status = m_pProvider->StartLoad(pPause); - if(status == LayoutError) { - delete m_pProvider; - m_pProvider = IPDF_LayoutProvider::Create_LayoutProvider_AutoReflow(m_pPDFPage, m_flags & RF_PARSER_READERORDER); - if (NULL == m_pProvider) { - m_Status = Failed; - return; - } - status = m_pProvider->StartLoad(pPause); - } - if(status == LayoutError) { - delete m_pProvider; - m_pProvider = NULL; - m_Status = Failed; - return; - } - if(status == LayoutToBeContinued) { - m_Status = ToBeContinued; - } else if (status == LayoutFinished) { - m_pReflowEngine = IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(topIndent, fWidth, fHeight, pReflowPage, m_flags, m_ParseStyle.m_LineSpace); - if(NULL == m_pReflowEngine) { - delete m_pProvider; - m_pProvider = NULL; - m_Status = Failed; - return; - } - CFX_AffineMatrix matrix; - pPage->GetDisplayMatrix(matrix, 0, 0, (int)(pPage->GetPageWidth()), (int)(pPage->GetPageHeight()), 0); - CFX_AffineMatrix matrix1 = pPage->GetPageMatrix(); - if((status = m_pReflowEngine->StartProcess(m_pProvider->GetRoot(), pPause, &matrix)) != LayoutToBeContinued) { - delete m_pReflowEngine; - m_pReflowEngine = NULL; - m_Status = Done; - } else { - m_Status = ToBeContinued; - } - } - if(status != LayoutToBeContinued) { - delete m_pProvider; - m_pProvider = NULL; - } - if(m_TopIndent && m_Status == Done) { - m_pReflowPage->m_PageHeight -= m_TopIndent; - } - return; -} -CPDF_ProgressiveReflowPageRender::~CPDF_ProgressiveReflowPageRender() -{ - if(m_pDisplayMatrix) { - delete m_pDisplayMatrix; - } - m_pDisplayMatrix = NULL; -} -CPDF_ProgressiveReflowPageRender::CPDF_ProgressiveReflowPageRender() -{ - m_Status = Ready; - m_pReflowPage = NULL; - m_pDisplayMatrix = NULL; - m_CurrNum = 0; - m_pFontEncoding = NULL; - m_DisplayColor = -1; -} -static FX_FLOAT _CIDTransformToFloat(uint8_t ch) -{ - if (ch < 128) { - return ch * 1.0f / 127; - } - return (-255 + ch) * 1.0f / 127; -} -int CPDF_ProgressiveReflowPageRender::GetPosition() -{ - if(m_CurrNum == 0 || NULL == m_pReflowPage) { - return 0; - } - int size = m_pReflowPage->m_pReflowed->GetSize(); - if(size == 0 || m_CurrNum >= size) { - return 100; - } - return (int)(m_CurrNum * 100 / size); -} -void CPDF_ProgressiveReflowPageRender::Display(IFX_Pause* pPause) -{ - if (NULL == m_pReflowPage) { - m_Status = Done; - return; - } - FX_RECT clipBox = m_pFXDevice->GetClipBox(); - int size = m_pReflowPage->m_pReflowed->GetSize(); - if (size < 1 || NULL == m_pDisplayMatrix) { - m_Status = Done; - return; - } - for(int i = m_CurrNum; i < size; i++) { - CRF_Data* pData = (*m_pReflowPage->m_pReflowed)[i]; - if(!pData) { - continue; - } - CFX_FloatRect rect (pData->m_PosX, pData->m_PosY + pData->m_Height, pData->m_PosX + pData->m_Width, pData->m_PosY); - m_pDisplayMatrix->TransformRect(rect); - if(rect.left > clipBox.right || rect.right < clipBox.left || rect.bottom > clipBox.bottom || rect.top < clipBox.top) { - continue; - } - if(pData->GetType() == CRF_Data::Text) { - CRF_CharData* pCharData = (CRF_CharData*)pData; - CPDF_Font* pPDFFont = pCharData->m_pCharState->m_pFont; - if(pPDFFont->GetFontType() == PDFFONT_TYPE3) { - continue; - } - FX_FLOAT x = pData->m_PosX, y = pData->m_PosY - pCharData->m_pCharState->m_fDescent; - FXTEXT_CHARPOS charpos ; - charpos.m_GlyphIndex = pPDFFont->GlyphFromCharCode(pCharData->m_CharCode); - charpos.m_FontCharWidth = pPDFFont->m_Font.GetGlyphWidth(charpos.m_GlyphIndex); - charpos.m_OriginX = x; - charpos.m_OriginY = y; - FX_FLOAT charW = pData->m_Width * 1000 / pData->m_Height; - if(charW != charpos.m_FontCharWidth) { - charpos.m_bGlyphAdjust = TRUE; - charpos.m_AdjustMatrix[0] = charW / charpos.m_FontCharWidth; - charpos.m_AdjustMatrix[1] = 0; - charpos.m_AdjustMatrix[2] = 0; - charpos.m_AdjustMatrix[3] = 1; - } else { - charpos.m_bGlyphAdjust = FALSE; - } - FX_BOOL bRet = FALSE; - if(m_DisplayColor == -1) - bRet = m_pFXDevice->DrawNormalText(1, &charpos, &(pPDFFont->m_Font), - NULL, pCharData->m_pCharState->m_fFontSize, - m_pDisplayMatrix, pCharData->m_pCharState->m_Color + 0xff000000, FXTEXT_CLEARTYPE); - else - bRet = m_pFXDevice->DrawNormalText(1, &charpos, &(pPDFFont->m_Font), - NULL, pCharData->m_pCharState->m_fFontSize, m_pDisplayMatrix, m_DisplayColor, FXTEXT_CLEARTYPE); - } else if(pData->GetType() == CRF_Data::Image) { - CRF_ImageData* pImageData = (CRF_ImageData*)pData; - if(!pImageData->m_pBitmap) { - continue; - } - int left = 0, top = 0; - CFX_DIBitmap* pDiBmp = NULL; - CFX_DIBSource* pDispSource = pImageData->m_pBitmap; - if(pImageData->m_Matrix.d < 0) { - CFX_AffineMatrix matrix(pImageData->m_Matrix.a, 0, 0, -pImageData->m_Matrix.d, 0, 0); - int left, top; - pDiBmp = pImageData->m_pBitmap->TransformTo(&matrix, left, top); - pDispSource = pDiBmp; - } - if (NULL == pDispSource) { - continue; - } - if (pDispSource->GetFormat() == FXDIB_1bppMask || pDispSource->GetFormat() == FXDIB_8bppMask) { - m_pFXDevice->StretchBitMask(pDispSource, (int)(rect.left + 0.5), (int)(rect.bottom + 0.5), (int)(rect.Width() + 0.5), (int)(rect.Height() + 0.5), 0xff000000); - } else { - m_pFXDevice->StretchDIBits(pDispSource, (int)(rect.left + 0.5), (int)(rect.bottom + 0.5), (int)(rect.Width() + 0.5), (int)(rect.Height() + 0.5)); - } - if(m_pFXDevice->GetBitmap() && m_pFXDevice->GetBitmap()->GetFormat() == FXDIB_8bppRgb && - m_pFXDevice->GetBitmap()->GetPalette() == NULL) { - int nPalette = 0; - switch(m_DitherBits) { - case 0: - nPalette = 0; - break; - case 1: - nPalette = 2; - break; - case 2: - nPalette = 4; - break; - case 3: - nPalette = 8; - break; - case 4: - nPalette = 16; - break; - case 5: - nPalette = 32; - break; - case 6: - nPalette = 64; - break; - case 7: - nPalette = 128; - break; - default: - nPalette = 256; - break; - } - if(nPalette >= 2) { - FX_ARGB * palette = FX_Alloc(FX_ARGB, nPalette); - nPalette --; - palette[0] = 0; - palette[nPalette] = 255; - FX_FLOAT Dither = (FX_FLOAT)255 / (nPalette); - for(int i = 1; i < nPalette; i++) { - palette[i] = (FX_ARGB)(Dither * i + 0.5); - } - FX_RECT tmpRect = rect.GetOutterRect(); - m_pFXDevice->GetBitmap()->DitherFS(palette, nPalette + 1, &tmpRect); - FX_Free (palette); - } - } - if(pDiBmp) { - delete pDiBmp; - } - } else if(pData->GetType() == CRF_Data::Path) { - } - if(!(i % 10)) { - if(pPause && pPause->NeedToPauseNow()) { - i++; - m_CurrNum = i; - m_Status = ToBeContinued; - return; - } - } - } - m_CurrNum = size; - m_Status = Done; -} -void CPDF_ProgressiveReflowPageRender::Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits) -{ - if(!pReflowPage || !pDevice || !pMatrix) { - m_Status = Failed; - return; - } - m_DitherBits = DitherBits; - m_Status = Ready; - m_CurrNum = 0; - m_pReflowPage = (CPDF_ReflowedPage*)pReflowPage; - m_pFXDevice = pDevice; - if(NULL == m_pDisplayMatrix) { - m_pDisplayMatrix = new CFX_AffineMatrix; - } - m_pDisplayMatrix->Copy(*pMatrix); - m_Status = ToBeContinued; - Display(pPause); -} -void CPDF_ProgressiveReflowPageRender::Continue(IFX_Pause* pPause) -{ - Display(pPause); -} -void CPDF_ProgressiveReflowPageRender::SetDisplayColor(FX_COLORREF color) -{ - m_DisplayColor = color; -} -void CPDF_ProgressiveReflowPageRender::Clear() -{ - if (m_pDisplayMatrix) { - delete m_pDisplayMatrix; - } - m_pDisplayMatrix = NULL; - m_pReflowPage = NULL; - m_pFXDevice = NULL; - m_CurrNum = 0; - m_Status = Ready; -} diff --git a/core/src/reflow/reflowedpage.h b/core/src/reflow/reflowedpage.h deleted file mode 100644 index 79b4937bdb..0000000000 --- a/core/src/reflow/reflowedpage.h +++ /dev/null @@ -1,374 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef CORE_SRC_REFLOW_REFLOWEDPAGE_H_ -#define CORE_SRC_REFLOW_REFLOWEDPAGE_H_ - -#include "../../include/reflow/reflowengine.h" - -#define GET_SIGNED(a) ( (a)>0 ? a/a : (a==0 ? 0 : -a/a) ) -class CRF_Data; -class CRF_LineData; -class CRF_CharData; -class CRF_PathData; -class CRF_ImageData; -class CRF_Table; -class CRF_AttrOperation; -class CRF_OperationDate; -class CPDF_ReflowedPage; -class CPDF_Rect; -typedef CFX_SegmentedArray<CRF_Data*> CRF_DataPtrArray; -class CRF_CharState; -typedef CFX_SegmentedArray<CRF_CharState> CRF_CharStateArray; -#define SST_GE 1 -#define SST_BLSE 2 -#define SST_ILSE 3 -#define SST_IE 4 -class CPDF_LayoutProcessor_Reflow : public IPDF_LayoutProcessor -{ -public: - CPDF_LayoutProcessor_Reflow(); - ~CPDF_LayoutProcessor_Reflow(); - void Init(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, CPDF_ReflowedPage* pReflowedPage, int flags, FX_FLOAT lineSpace); - - LayoutStatus StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix = NULL); - LayoutStatus Continue(); - int GetPosition(); -protected: - void FitPageMode(); - void ProcessElement(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth); - FX_FLOAT GetElmWidth(IPDF_LayoutElement* pElement); - CFX_FloatRect GetElmBBox(IPDF_LayoutElement* pElement); - void ProcessTable(FX_FLOAT dx); - void ProcessObjs(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth); - void ProcessObject(CPDF_PageObject* pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix); - void ProcessTextObject(CPDF_TextObject *pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix); - void ProcessPathObject(CPDF_PathObject *pObj, FX_FLOAT reflowWidth); - void ProcessUnitaryObjs(CPDF_PageObjects *pObjs, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix); - int32_t LogicPreObj(CPDF_TextObject* pObj); - int ProcessInsertObject(CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix); - FX_WCHAR GetPreChar(); - FX_BOOL IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2); - int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const; - FX_BOOL IsCanBreakAfter(FX_DWORD unicode); - FX_BOOL IsCanBreakBefore(FX_DWORD unicode); - int32_t GetElementTypes(LayoutType layoutType); - void CreateRFData(CPDF_PageObject* pObj, CFX_AffineMatrix* pMatrix = NULL); - CRF_CharState* GetCharState(CPDF_TextObject* pObj, CPDF_Font* pFont, FX_FLOAT fHeight, FX_ARGB color); - FX_FLOAT ConverWidth(FX_FLOAT width); - void AddData2CurrLine(CRF_Data* pData); - void AddTemp2CurrLine(int begin, int count ); - void Transform(const CFX_AffineMatrix* pMatrix, CRF_Data* pData); - void Transform(const CFX_AffineMatrix* pMatrix, CRF_DataPtrArray* pDataArray, int beginPos, int count = 0); - FX_FLOAT GetDatasWidth( int beginPos, int endpos); - void UpdateCurrLine(); - FX_BOOL FinishedCurrLine(); - int m_flags; - CFX_AffineMatrix m_PDFMatrix; - LayoutStatus m_Status; - CPDF_TextObject* m_pPreObj; - CFX_AffineMatrix m_perMatrix; - IPDF_LayoutElement* m_pLayoutElement; - IPDF_LayoutElement* m_pRootElement; - FX_FLOAT m_CurrRefWidth; - IFX_Pause* m_pPause; - LayoutEnum m_CurrWritingMode; - CPDF_ReflowedPage* m_pReflowedPage; - FX_FLOAT m_fRefWidth; - FX_FLOAT m_TopIndent; - FX_FLOAT m_fLineSpace; - FX_FLOAT m_fScreenHeight; - FX_FLOAT m_fCurrMaxWidth; - FX_FLOAT m_fCurrLineWidth; - FX_FLOAT m_fCurrLineHeight; - CRF_DataPtrArray* m_pCurrLine; - CRF_DataPtrArray* m_pTempLine; - FX_BOOL m_bIllustration; - FX_FLOAT m_fLineHeight; - LayoutEnum m_TextAlign; - FX_FLOAT m_StartIndent; - CFX_ArrayTemplate<CRF_Table*> m_TableArray; - int m_PausePosition; -}; -struct RF_TableCell { - int m_BeginPos; - int m_EndPos; - FX_FLOAT m_MaxWidth; - FX_FLOAT m_PosX; - FX_FLOAT m_PosY; - FX_FLOAT m_CellWidth; - FX_FLOAT m_CellHeight; - int m_RowSpan; - int m_ColSpan; - LayoutEnum m_BlockAlign; - LayoutEnum m_InlineAlign; -}; -typedef CFX_ArrayTemplate<RF_TableCell*> CRF_TableCellArray; -class CRF_Table -{ -public: - CRF_Table() - { - m_TableWidth = 0; - m_nCol = 0; - } - CRF_TableCellArray m_pCellArray; - CFX_WordArray m_nCell; - int m_nCol; - FX_FLOAT m_TableWidth; - FX_FLOAT m_ReflowPageHeight; -}; -class CRF_CharState -{ -public: - CPDF_Font* m_pFont; - FX_ARGB m_Color; - FX_BOOL m_bVert; - FX_FLOAT m_fFontSize; - FX_FLOAT m_fAscent; - FX_FLOAT m_fDescent; - - CPDF_TextObject* m_pTextObj; -}; -class CRF_PageInfo -{ -public: - CRF_PageInfo(CPDF_PageObject* pPageObj, CRF_PageInfo* pParent = NULL) - : m_pPageObj(pPageObj) , m_pParent(pParent) - { - } - CPDF_PageObject* GetPageObj() - { - return m_pPageObj; - } - CPDF_Dictionary* GetFormDict() - { - if (NULL == m_pParent) { - return NULL; - } - CPDF_PageObject* pParentObj = m_pParent->GetPageObj(); - if (NULL == pParentObj || PDFPAGE_FORM != pParentObj->m_Type) { - return NULL; - } - return ((CPDF_FormObject*)pParentObj)->m_pForm->m_pResources; - } -protected: - CPDF_PageObject* m_pPageObj; - CRF_PageInfo* m_pParent; -}; -class CPDF_ReflowedPage : public IPDF_ReflowedPage, public CFX_PrivateData -{ -public: - - CPDF_ReflowedPage(CFX_GrowOnlyPool* pMemoryPool); - ~CPDF_ReflowedPage(); - CFX_PrivateData* GetPrivateDataCtrl() - { - return this; - }; - void GetDisplayMatrix(CFX_AffineMatrix& matrix, int32_t xPos, int32_t yPos, int32_t xSize, int32_t ySize, int32_t iRotate, const CFX_AffineMatrix* pPageMatrix); - - FX_FLOAT GetPageHeight() ; - FX_FLOAT GetPageWidth() - { - return m_PageWidth; - }; - void FocusGetData(const CFX_AffineMatrix matrix, int32_t x, int32_t y, CFX_ByteString& str); - FX_BOOL FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, int32_t& x, int32_t& y); - CRF_DataPtrArray* m_pReflowed; - FX_FLOAT m_PageWidth; - FX_FLOAT m_PageHeight; - FX_BOOL m_bWaiting; - CRF_CharStateArray* m_pCharState; - CFX_GrowOnlyPool* m_pMemoryPool; - FX_BOOL m_bCreateMemoryPool; - CPDF_Page* m_pPDFPage; - FX_BOOL RetainPageObjsMemberShip(); - void MarkPageObjMemberShip(CPDF_PageObject* pObj, CRF_PageInfo* pParent); - void ReleasePageObjsMemberShip(); - CPDF_Dictionary* GetFormResDict(CPDF_PageObject* pObj); - - CFX_MapPtrToPtr* m_pPageInfos; -}; -class CPDF_ProgressiveReflowPageParser : public IPDF_ProgressiveReflowPageParser -{ -public: - CPDF_ProgressiveReflowPageParser(); - ~CPDF_ProgressiveReflowPageParser() ; - void Init(); - - ParseStatus GetStatus() - { - return m_Status; - }; - - void SetParserStyle(RF_ParseStyle style) - { - m_ParseStyle = style; - }; - void Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags); - void Continue(IFX_Pause* pPause); - int GetPosition() ; - - void Clear(); - ParseStatus m_Status; -protected: - RF_ParseStyle m_ParseStyle; - CPDF_Page* m_pPDFPage; - IFX_Pause* m_pPause; - CPDF_ReflowedPage* m_pReflowPage; - FX_FLOAT m_TopIndent; - FX_FLOAT m_ReflowedWidth; - FX_FLOAT m_fScreenHeight; - IPDF_LayoutProvider* m_pProvider; - IPDF_LayoutProcessor* m_pReflowEngine; - int m_nObjProcessed; - int m_flags; -}; -class CPDF_ProgressiveReflowPageRender : public IPDF_ProgressiveReflowPageRender -{ -public: - CPDF_ProgressiveReflowPageRender(); - ~CPDF_ProgressiveReflowPageRender() ; - - RenderStatus GetStatus() - { - return m_Status; - }; - - - void SetDisplayColor(FX_COLORREF color); - void Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits); - void Continue(IFX_Pause* pPause); - int GetPosition(); - - - void Clear(); -protected: - void Display(IFX_Pause* pPause); - RenderStatus m_Status; - CPDF_ReflowedPage* m_pReflowPage; - CFX_AffineMatrix* m_pDisplayMatrix; - int m_CurrNum; - IFX_FontEncoding* m_pFontEncoding; - CFX_RenderDevice* m_pFXDevice; - int m_DitherBits; - FX_COLORREF m_DisplayColor; - typedef struct CRF_TextDataAtt { - CRF_TextDataAtt() - { - pFont = NULL; - fFontSize = 0.0f; - Color = 0; - } - CRF_TextDataAtt(CPDF_Font* font, FX_FLOAT fontSize, FX_ARGB color) - { - pFont = font; - fFontSize = fontSize; - Color = color; - } - CPDF_Font* pFont; - FX_FLOAT fFontSize; - FX_ARGB Color; - } CRF_TEXTDATAATT; - inline bool isTextDataAttSame(CRF_TEXTDATAATT data1, CRF_TEXTDATAATT data2) - { - if (data1.pFont != data2.pFont) { - return false; - } - if (data1.Color != data2.Color) { - return false; - } - if (fabs(data1.fFontSize - data2.fFontSize) > 0.0f) { - return false; - } - return true; - }; -}; -#define TYPE_UNKNOW 0 -#define TYPE_TEXT 1 -#define TYPE_PATH 2 -#define TYPE_IMAGE 3 -#define TYPE_LINE 4 -class CRF_Data -{ -public: - typedef enum {Unknow, Text, Image, Path, Line, paragraph} RF_DataType; - CRF_Data() - { - m_Type = Unknow; - m_Width = 0; - m_PosY = 0; - m_PosX = 0; - m_Height = 0; - } - RF_DataType GetType() - { - return m_Type; - } - virtual ~CRF_Data() {} - RF_DataType m_Type; - FX_FLOAT m_PosX; - FX_FLOAT m_PosY; - FX_FLOAT m_Width; - FX_FLOAT m_Height; -}; -class CRF_LineData : public CRF_Data -{ -public: - CRF_LineData() - { - m_Type = Line; - } -}; -class CRF_CharData : public CRF_Data -{ -public: - CRF_CharData() - { - m_Type = Text; - m_CharCode = -1; - } - CRF_CharState* m_pCharState; - FX_DWORD m_CharCode; -}; -class CRF_ImageData : public CRF_Data -{ -public: - CRF_ImageData() - { - m_Type = Image; - m_pBitmap = NULL; - } - ~CRF_ImageData() - { - if(m_pBitmap) { - delete m_pBitmap; - } - m_pBitmap = NULL; - } - CFX_AffineMatrix m_Matrix; - CFX_DIBitmap* m_pBitmap; -}; -class CRF_PathData : public CRF_Data -{ -public: - CRF_PathData() - { - m_Type = Path; - m_bDecoration = FALSE; - } - ~CRF_PathData() {}; - FX_BOOL m_bDecoration; - CPDF_Path m_pPathData; - CFX_AffineMatrix m_pPath2Device; - CPDF_GraphState m_pGraphState; - FX_ARGB m_fill_argb; - FX_ARGB m_stroke_argb; - int m_fill_mode; -}; - -#endif // CORE_SRC_REFLOW_REFLOWEDPAGE_H_ diff --git a/core/src/reflow/reflowedtextpage.cpp b/core/src/reflow/reflowedtextpage.cpp deleted file mode 100644 index 0844f780b6..0000000000 --- a/core/src/reflow/reflowedtextpage.cpp +++ /dev/null @@ -1,395 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include <algorithm> - -#include "reflowedtextpage.h" - -IPDF_TextPage* IPDF_TextPage::CreateReflowTextPage(IPDF_ReflowedPage* pRefPage) -{ - return new CRF_TextPage(pRefPage); -} -CRF_TextPage::CRF_TextPage(IPDF_ReflowedPage* pRefPage) -{ - m_pRefPage = (CPDF_ReflowedPage*)(pRefPage); - m_pDataList = NULL; - m_CountBSArray = NULL; -} -CRF_TextPage::~CRF_TextPage() -{ - if(m_pDataList) { - delete m_pDataList; - m_pDataList = NULL; - } - if(m_CountBSArray) { - delete m_CountBSArray; - m_CountBSArray = NULL; - } -} -FX_BOOL CRF_TextPage::ParseTextPage() -{ - if(!m_pRefPage) { - return FALSE; - } - int count = m_pRefPage->m_pReflowed->GetSize(); - m_pDataList = new CRF_CharDataPtrArray(std::min(count, 500)); - for(int i = 0; i < count; i++) { - CRF_Data* pData = (*(m_pRefPage->m_pReflowed))[i]; - if(pData->GetType() == CRF_Data::Text) { - m_pDataList->Add((CRF_CharData*)pData); - } - } - m_CountBSArray = new CFX_CountBSINT32Array(20); - return TRUE; -} -FX_BOOL CRF_TextPage::IsParsered() const -{ - if(m_pDataList) { - return TRUE; - } - return FALSE; -} -int CRF_TextPage::CharIndexFromTextIndex(int TextIndex) const -{ - return TextIndex; -} -int CRF_TextPage::TextIndexFromCharIndex(int CharIndex) const -{ - return CharIndex; -} - -int CRF_TextPage::CountChars() const -{ - if (NULL == m_pDataList) { - return -1; - } - return m_pDataList->GetSize(); -} -void CRF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO & info) const -{ - if(index >= CountChars() || index < 0 || !m_pDataList) { - return; - } - CRF_CharData* pData = (*m_pDataList)[index]; - FX_FLOAT ReltiveCorddDs = pData->m_pCharState->m_fDescent; - FX_FLOAT ReltiveCorddAs = pData->m_pCharState->m_fAscent; - info.m_Flag = CHAR_NORMAL; - info.m_pTextObj = pData->m_pCharState->m_pTextObj; - info.m_OriginX = pData->m_PosX; - info.m_OriginY = pData->m_PosY - ReltiveCorddDs; - info.m_FontSize = pData->m_pCharState->m_fFontSize; - CFX_FloatRect FloatRectTmp(pData->m_PosX, pData->m_PosY, pData->m_PosX + pData->m_Width, pData->m_PosY + ReltiveCorddAs - ReltiveCorddDs); - info.m_CharBox = FloatRectTmp; - CFX_WideString str = pData->m_pCharState->m_pFont->UnicodeFromCharCode(pData->m_CharCode); - if(!str.IsEmpty()) { - info.m_Unicode = str.GetAt(0); - } else { - info.m_Unicode = -1; - } - info.m_Charcode = (FX_WCHAR)pData->m_CharCode; - info.m_Matrix = CFX_Matrix(1, 0, 0, 1, 0, 0); -} -extern FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2, FX_FLOAT& interlow, FX_FLOAT& interhigh); -inline FX_BOOL _IsInsameline(const CFX_FloatRect& rectA, const CFX_FloatRect& rectB) -{ - if((rectA.top >= rectB.bottom && rectB.top >= rectA.bottom)) { - return TRUE; - } else { - return FALSE; - } -} -inline FX_BOOL _IsIntersect(const CFX_FloatRect& rectA, const CFX_FloatRect& rectB) -{ - FX_FLOAT interlow = .0f, interhigh = .0f; - if(GetIntersection(rectA.bottom, rectA.top, rectB.bottom, rectB.top, interlow, interhigh)) { - if(GetIntersection(rectA.left, rectA.right, rectB.left, rectB.right, interlow, interhigh)) { - return TRUE; - } else { - return FALSE; - } - } - return FALSE; -} -void CRF_TextPage::GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const -{ - int indexlen = start + nCount; - FPDF_CHAR_INFO info; - FX_BOOL bstart = TRUE; - CFX_FloatRect recttmp; - int i; - for(i = start; i < indexlen; i++) { - GetCharInfo(i, info); - if(bstart) { - recttmp = info.m_CharBox; - bstart = FALSE; - } else if(_IsInsameline(recttmp, info.m_CharBox)) { - recttmp.right = info.m_CharBox.right; - if(info.m_CharBox.top > recttmp.top) { - recttmp.top = info.m_CharBox.top; - } - if(info.m_CharBox.bottom < recttmp.bottom) { - recttmp.bottom = info.m_CharBox.bottom; - } - } else { - rectArray.Add(recttmp); - recttmp = info.m_CharBox; - } - } - rectArray.Add(recttmp); -} -inline FX_FLOAT _GetDistance(CFX_FloatRect floatRect, CPDF_Point point) -{ - if(floatRect.right < point.x && floatRect.bottom > point.y) { - return FXSYS_sqrt(FXSYS_pow(point.x - floatRect.right, 2) + FXSYS_pow(floatRect.bottom - point.y, 2)); - } - if (floatRect.right < point.x && floatRect.top < point.y) { - return FXSYS_sqrt(FXSYS_pow(point.x - floatRect.right, 2) + FXSYS_pow(point.y - floatRect.top, 2)); - } - if(floatRect.left > point.x && floatRect.bottom > point.y) { - return FXSYS_sqrt(FXSYS_pow(floatRect.bottom - point.y, 2) + FXSYS_pow(floatRect.left - point.x, 2)); - } - if((floatRect.right > point.x || FXSYS_fabs(floatRect.right - point.x) <= 0.0001f) && - (floatRect.left < point.x || FXSYS_fabs(floatRect.left - point.x) <= 0.0001f) && floatRect.bottom > point.y) { - return FXSYS_fabs(floatRect.bottom - point.y); - } - if(floatRect.left > point.x && (floatRect.bottom < point.y || FXSYS_fabs(floatRect.bottom - point.y) <= 0.0001f) && - (floatRect.top > point.y || FXSYS_fabs(floatRect.top - point.y) <= 0.0001f)) { - return FXSYS_fabs(floatRect.left - point.x); - } - if(floatRect.left > point.x && floatRect.top < point.y) { - return FXSYS_sqrt(FXSYS_pow(floatRect.left - point.x, 2) + FXSYS_pow(point.y - floatRect.top, 2)); - } - if ((floatRect.left < point.x || FXSYS_fabs(floatRect.left - point.x) <= 0.0001f) && - (floatRect.right > point.x || FXSYS_fabs(floatRect.right - point.x) <= 0.0001f) && floatRect.top < point.y) { - return FXSYS_fabs(point.y - floatRect.top); - } - if(floatRect.right < point.x && (floatRect.top > point.y || FXSYS_fabs(floatRect.top - point.y) <= 0.0001f) && - (floatRect.bottom < point.y || FXSYS_fabs(floatRect.bottom - point.y) <= 0.0001f)) { - return point.x - floatRect.right; - } - return .0f; -} -int CRF_TextPage::GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const -{ - int index = -1, i = 0, j = 0; - FPDF_CHAR_INFO info; - CFX_FloatRect rectTmp; - FX_FLOAT MinDistance = 1000, DistanceTmp = 0; - FX_FLOAT rect_bottom = point.x - xTorelance; - CFX_FloatRect TorelanceRect(rect_bottom <= 0 ? 0 : rect_bottom, point.y - yTorelance, point.x + xTorelance, point.y + yTorelance); - int count = CountChars(); - for(i = 0; i < count; i++) { - GetCharInfo(i, info); - rectTmp = info.m_CharBox; - if(rectTmp.Contains(point.x, point.y)) { - index = i; - break; - } else if(_IsIntersect(rectTmp, TorelanceRect)) { - DistanceTmp = _GetDistance(rectTmp, point); - if(DistanceTmp < MinDistance) { - MinDistance = DistanceTmp; - index = i; - } - } - } - return index; -} -int CRF_TextPage::GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const -{ - int index = 0; - CPDF_Point point(x, y); - if((index = GetIndexAtPos(point, xTorelance, yTorelance)) < 0) { - return -1; - } else { - return index; - } -} -int CRF_TextPage::GetOrderByDirection(int index, int direction) const -{ - return -1; -} -CFX_WideString CRF_TextPage::GetTextByRect(CFX_FloatRect rect) const -{ - int count; - FPDF_CHAR_INFO info; - CFX_WideString str; - CFX_FloatRect Recttmp; - FX_BOOL bstart = TRUE; - count = CountChars(); - if(rect.IsEmpty()) { - return L""; - } - for(int i = 0; i < count; i++) { - GetCharInfo(i, info); - if(_IsIntersect(rect, info.m_CharBox)) { - if(bstart) { - Recttmp = info.m_CharBox; - str += info.m_Unicode; - bstart = FALSE; - } else if(_IsInsameline(Recttmp, info.m_CharBox)) { - str += info.m_Unicode; - } else { - str += L"\r\n"; - Recttmp = info.m_CharBox; - str += info.m_Unicode; - } - } - } - if(str.IsEmpty()) { - return L""; - } else { - return str; - } -} -void CRF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const -{ - int count, i; - FX_BOOL bstart = TRUE; - FPDF_CHAR_INFO info; - CFX_FloatRect recttmp; - count = CountChars(); - for(i = 0; i < count; i++) { - GetCharInfo(i, info); - if(_IsIntersect(rect, info.m_CharBox)) { - if(bstart) { - recttmp = info.m_CharBox; - bstart = FALSE; - } else if(_IsInsameline(recttmp, info.m_CharBox)) { - recttmp.right = info.m_CharBox.right; - if(info.m_CharBox.top > recttmp.top) { - recttmp.top = info.m_CharBox.top; - } - if(info.m_CharBox.bottom < recttmp.bottom) { - recttmp.bottom = info.m_CharBox.bottom; - } - } else { - resRectArray.Add(recttmp); - recttmp = info.m_CharBox; - } - } - } - resRectArray.Add(recttmp); -} -int CRF_TextPage::CountRects(int start, int nCount) -{ - m_rectArray.RemoveAll(); - GetRectArray(start, nCount, m_rectArray); - return m_rectArray.GetSize(); -} -void CRF_TextPage::GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const -{ - if(m_rectArray.GetSize() <= rectIndex) { - return; - } - left = m_rectArray[rectIndex].left; - top = m_rectArray[rectIndex].top; - right = m_rectArray[rectIndex].right; - bottom = m_rectArray[rectIndex].bottom; -} -FX_BOOL CRF_TextPage::GetBaselineRotate(int rectIndex, int& Rotate) -{ - Rotate = 0; - return TRUE; -} -FX_BOOL CRF_TextPage::GetBaselineRotate(CFX_FloatRect rect, int& Rotate) -{ - Rotate = 0; - return TRUE; -} -int CRF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains) -{ - if (!m_CountBSArray) { - return -1; - } - m_CountBSArray->RemoveAll(); - CFX_FloatRect floatrect(left, bottom, right, top); - int totalcount, i, j = 0, counttmp = 0; - FX_BOOL bstart = TRUE; - FPDF_CHAR_INFO info; - CFX_FloatRect recttmp; - totalcount = CountChars(); - for(i = 0; i < totalcount; i++) { - GetCharInfo(i, info); - if(_IsIntersect(floatrect, info.m_CharBox)) { - if(bstart) { - m_CountBSArray->Add(i); - counttmp = 1; - recttmp = info.m_CharBox; - bstart = FALSE; - } else if(_IsInsameline(recttmp, info.m_CharBox)) { - recttmp.right = info.m_CharBox.right; - if(info.m_CharBox.top > recttmp.top) { - recttmp.top = info.m_CharBox.top; - } - if(info.m_CharBox.bottom < recttmp.bottom) { - recttmp.bottom = info.m_CharBox.bottom; - } - counttmp ++; - } else { - m_CountBSArray->Add(counttmp); - m_CountBSArray->Add(i); - counttmp = 1; - j++; - recttmp = info.m_CharBox; - } - } - } - m_CountBSArray->Add(counttmp); - j++; - return j; -} -void CRF_TextPage::GetBoundedSegment(int index, int& start, int& count) const -{ - if (!m_CountBSArray) { - return; - } - if(m_CountBSArray->GetSize() <= index * 2) { - start = 0; - count = 0; - return; - } - start = *(int *)m_CountBSArray->GetAt(index * 2); - count = *(int *)m_CountBSArray->GetAt(index * 2 + 1); -} - -int CRF_TextPage::GetWordBreak(int index, int direction) const -{ - return -1; -} -CFX_WideString CRF_TextPage::GetPageText(int start, int nCount ) const -{ - if(nCount == -1) { - nCount = CountChars(); - start = 0; - } else if(nCount < 1) { - return L""; - } else if(start >= CountChars()) { - return L""; - } - int i, index = start + nCount; - FPDF_CHAR_INFO info; - CFX_WideString str; - CFX_FloatRect recttmp; - FX_BOOL bstart = TRUE; - for(i = start; i < index; i++) { - GetCharInfo(i, info); - if(bstart) { - recttmp = info.m_CharBox; - str += info.m_Unicode; - bstart = FALSE; - } else if (_IsInsameline(recttmp, info.m_CharBox)) { - str += info.m_Unicode; - } else { - str += L"\r\n"; - recttmp = info.m_CharBox; - str += info.m_Unicode; - } - } - if(str.IsEmpty()) { - return L""; - } - return str; -} diff --git a/core/src/reflow/reflowedtextpage.h b/core/src/reflow/reflowedtextpage.h deleted file mode 100644 index bb6e24a9cd..0000000000 --- a/core/src/reflow/reflowedtextpage.h +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef CORE_SRC_REFLOW_REFLOWEDTEXTPAGE_H_ -#define CORE_SRC_REFLOW_REFLOWEDTEXTPAGE_H_ - -#include "../../include/reflow/reflowengine.h" -#include "../../src/reflow/reflowedpage.h" - -typedef CFX_SegmentedArray<CRF_CharData*> CRF_CharDataPtrArray; -typedef CFX_SegmentedArray<int32_t> CFX_CountBSINT32Array; -class CRF_TextPage : public IPDF_TextPage -{ -public: - CRF_TextPage(IPDF_ReflowedPage* pRefPage); - - virtual ~CRF_TextPage() ; - FX_BOOL ParseTextPage(); - void NormalizeObjects(FX_BOOL bNormalize) - { - return; - }; - - FX_BOOL IsParsered() const; -public: - - int CharIndexFromTextIndex(int TextIndex) const; - - int TextIndexFromCharIndex(int CharIndex) const; - - - int CountChars() const; - - virtual void GetCharInfo(int index, FPDF_CHAR_INFO & info) const; - - void GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const; - - - int GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const; - - int GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const; - - virtual int GetOrderByDirection(int index, int direction) const; - - CFX_WideString GetTextByRect(CFX_FloatRect rect) const; - - void GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const; - - - int CountRects(int start, int nCount); - - virtual void GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const; - virtual FX_BOOL GetBaselineRotate(int rectIndex, int& Rotate); - virtual FX_BOOL GetBaselineRotate(CFX_FloatRect rect, int& Rotate); - - virtual int CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE); - - virtual void GetBoundedSegment(int index, int& start, int& count) const; - - - int GetWordBreak(int index, int direction) const; - - CFX_WideString GetPageText(int start, int nCount = -1 ) const; -private: - CPDF_ReflowedPage* m_pRefPage; - CRF_CharDataPtrArray* m_pDataList; - CFX_RectArray m_rectArray; - CFX_CountBSINT32Array* m_CountBSArray; -}; - -#endif // CORE_SRC_REFLOW_REFLOWEDTEXTPAGE_H_ diff --git a/core/src/reflow/reflowengine.cpp b/core/src/reflow/reflowengine.cpp deleted file mode 100644 index 7f766caefb..0000000000 --- a/core/src/reflow/reflowengine.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "../../include/reflow/reflowengine.h" -#include "reflowedpage.h" -IPDF_ReflowedPage* IPDF_ReflowedPage::Create() -{ - return new CPDF_ReflowedPage(NULL); -} -IPDF_ReflowedPage* Create_ReflowPage() -{ - return IPDF_ReflowedPage::Create(); -} -IPDF_ProgressiveReflowPageParser* Create_ReflowPageParser() -{ - return IPDF_ProgressiveReflowPageParser::Create(); -} -IPDF_ProgressiveReflowPageParser* IPDF_ProgressiveReflowPageParser::Create() -{ - CPDF_ProgressiveReflowPageParser* pParser = new CPDF_ProgressiveReflowPageParser; - pParser->Init(); - return pParser; -} -IPDF_ProgressiveReflowPageRender* Create_ReflowPageRender() -{ - return IPDF_ProgressiveReflowPageRender::Create(); -} -IPDF_ProgressiveReflowPageRender* IPDF_ProgressiveReflowPageRender::Create() -{ - return new CPDF_ProgressiveReflowPageRender; -} |