Index: core/src/reflow/autoreflow.cpp |
diff --git a/core/src/reflow/autoreflow.cpp b/core/src/reflow/autoreflow.cpp |
index 8c37960932668bf73b534ae90dcbdb3022679c5a..951a620f904df216c770bc164099e100c72237eb 100644 |
--- a/core/src/reflow/autoreflow.cpp |
+++ b/core/src/reflow/autoreflow.cpp |
@@ -1,781 +1,813 @@ |
// 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) { |
+#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 if(pPrevObj->m_Type != PDFPAGE_TEXT) { |
+ } else { |
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(); |
+ 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; |
- 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 FX_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; |
+ 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 FX_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; |
-} |
-void CPDF_AutoReflowLayoutProvider::CreateElement() |
-{ |
+ } |
+ 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(); |
- 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 = NULL; |
- pCurrElm = FX_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; |
+ 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 { |
- 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) { |
+ pNextCell = NULL; |
+ } |
+ pCurrElm = NULL; |
+ pCurrElm = FX_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; |
- } |
- 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; |
+ } |
+ } |
+ } |
+ } |
+ 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; |
} |
- } |
- 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; |
+ } |
+ } 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; |
- 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; |
- } |
- } |
+ } 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; |
+ } |
} |
- } |
- 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 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 { |
- 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; |
+ 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) |
-{ |
+void CPDF_AutoReflowLayoutProvider::ProcessObj(CFX_PtrArray& cellArray, |
+ CPDF_PageObject* pObj, |
+ CFX_AffineMatrix matrix) { |
} |
-FX_INT32 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; |
- } |
+FX_INT32 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; |
-} |
-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); |
+ } |
+ 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 { |
- 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 = FX_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; |
- } |
+ 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; |
} |
- 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(); |
- } |
+ } |
+ } |
+ } else { |
+ m_WritingMode = WritingMode; |
+ } |
+ } |
+ pPerObj = pObj; |
+ if (bNewLine) { |
+ int c = pCell ? pCell->m_ObjList.GetCount() : 0; |
+ pCell = FX_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(); |
- } |
+int CPDF_AutoReflowLayoutProvider::GetRectWidth(FX_RECT rect) { |
+ if (m_WritingMode == WritingMode_TBRL) { |
return rect.Height(); |
+ } |
+ return rect.Width(); |
} |
-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::GetRectHeight(FX_RECT rect) { |
+ if (m_WritingMode == WritingMode_TBRL) { |
+ return rect.Width(); |
+ } |
+ return rect.Height(); |
} |
-int CPDF_AutoReflowLayoutProvider:: GetRectTop(FX_RECT rect) |
-{ |
- if(m_WritingMode == WritingMode_TBRL) { |
- return rect.right; |
- } |
+int CPDF_AutoReflowLayoutProvider::GetRectStart(FX_RECT rect) { |
+ if (m_WritingMode == WritingMode_TBRL) { |
return rect.top; |
+ } |
+ return rect.left; |
} |
-int CPDF_AutoReflowLayoutProvider:: GetRectBottom(FX_RECT rect) |
-{ |
- if(m_WritingMode == WritingMode_TBRL) { |
- return rect.left; |
- } |
+int CPDF_AutoReflowLayoutProvider::GetRectEnd(FX_RECT rect) { |
+ if (m_WritingMode == WritingMode_TBRL) { |
return rect.bottom; |
+ } |
+ return rect.right; |
} |
-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 = FX_NEW CPDF_AutoReflowElement(LayoutDocument); |
- if(!m_pRoot) { |
- return LayoutError; |
- } |
- m_Step = 0; |
- return Continue(); |
-} |
-LayoutStatus CPDF_AutoReflowLayoutProvider::Continue() |
-{ |
- GenerateStructTree(); |
- return m_Status; |
+int CPDF_AutoReflowLayoutProvider::GetRectTop(FX_RECT rect) { |
+ if (m_WritingMode == WritingMode_TBRL) { |
+ return rect.right; |
+ } |
+ return rect.top; |
} |
-int CPDF_AutoReflowLayoutProvider::GetPosition() |
-{ |
- if(m_Step == 0) { |
- return 0; |
+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 { |
- return m_Step * 100 / AUTOREFLOW_STEP_REMOVEDATA; |
- } |
+ 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 = FX_NEW CPDF_AutoReflowElement(LayoutDocument); |
+ if (!m_pRoot) { |
+ return LayoutError; |
+ } |
+ 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) { |
+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()); |
- } |
- 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; |
- } |
- } |
+ } else { |
+ pTextObj->GetItemInfo(i + 1, &Item); |
return Item.m_OriginX; |
+ } |
} |
- CFX_AffineMatrix matrix; |
- FX_RECT rect = pObj->GetBBox(&matrix); |
- return (FX_FLOAT)(rect.Width()); |
+ return Item.m_OriginX; |
+ } |
+ CFX_AffineMatrix matrix; |
+ FX_RECT rect = pObj->GetBBox(&matrix); |
+ return (FX_FLOAT)(rect.Width()); |
} |