summaryrefslogtreecommitdiff
path: root/core/src/fpdftext
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/fpdftext')
-rw-r--r--core/src/fpdftext/fpdf_text_int.cpp141
-rw-r--r--core/src/fpdftext/text_int.h8
2 files changed, 64 insertions, 85 deletions
diff --git a/core/src/fpdftext/fpdf_text_int.cpp b/core/src/fpdftext/fpdf_text_int.cpp
index aa13acee8a..8972f84d7c 100644
--- a/core/src/fpdftext/fpdf_text_int.cpp
+++ b/core/src/fpdftext/fpdf_text_int.cpp
@@ -761,20 +761,13 @@ int32_t CPDF_TextPage::FindTextlineFlowDirection() {
uint8_t* pDataV = nVerticalMask.data();
int32_t index = 0;
FX_FLOAT fLineHeight = 0.0f;
- CPDF_PageObject* pPageObj = NULL;
- FX_POSITION pos = NULL;
- pos = m_pPage->GetPageObjectList()->GetHeadPosition();
- if (!pos) {
+ if (m_pPage->GetPageObjectList()->empty())
return -1;
- }
- while (pos) {
- pPageObj = m_pPage->GetPageObjectList()->GetNextObject(pos);
- if (!pPageObj) {
- continue;
- }
- if (CPDF_PageObject::TEXT != pPageObj->m_Type) {
+
+ for (auto& pPageObj : *m_pPage->GetPageObjectList()) {
+ if (!pPageObj || pPageObj->m_Type != CPDF_PageObject::TEXT)
continue;
- }
+
int32_t minH =
(int32_t)pPageObj->m_Left < 0 ? 0 : (int32_t)pPageObj->m_Left;
int32_t maxH = (int32_t)pPageObj->m_Right > nPageWidth
@@ -785,28 +778,26 @@ int32_t CPDF_TextPage::FindTextlineFlowDirection() {
int32_t maxV = (int32_t)pPageObj->m_Top > nPageHeight
? nPageHeight
: (int32_t)pPageObj->m_Top;
- if (minH >= maxH || minV >= maxV) {
+ if (minH >= maxH || minV >= maxV)
continue;
- }
+
FXSYS_memset(pDataH + minH, 1, maxH - minH);
FXSYS_memset(pDataV + minV, 1, maxV - minV);
- if (fLineHeight <= 0.0f) {
+ if (fLineHeight <= 0.0f)
fLineHeight = pPageObj->m_Top - pPageObj->m_Bottom;
- }
- pPageObj = NULL;
}
int32_t nStartH = 0;
int32_t nEndH = 0;
FX_FLOAT nSumH = 0.0f;
- for (index = 0; index < nPageWidth; index++)
- if (1 == nHorizontalMask[index]) {
+ for (index = 0; index < nPageWidth; index++) {
+ if (1 == nHorizontalMask[index])
break;
- }
+ }
nStartH = index;
- for (index = nPageWidth; index > 0; index--)
- if (1 == nHorizontalMask[index - 1]) {
+ for (index = nPageWidth; index > 0; index--) {
+ if (1 == nHorizontalMask[index - 1])
break;
- }
+ }
nEndH = index;
for (index = nStartH; index < nEndH; index++) {
nSumH += nHorizontalMask[index];
@@ -815,15 +806,15 @@ int32_t CPDF_TextPage::FindTextlineFlowDirection() {
int32_t nStartV = 0;
int32_t nEndV = 0;
FX_FLOAT nSumV = 0.0f;
- for (index = 0; index < nPageHeight; index++)
- if (1 == nVerticalMask[index]) {
+ for (index = 0; index < nPageHeight; index++) {
+ if (1 == nVerticalMask[index])
break;
- }
+ }
nStartV = index;
- for (index = nPageHeight; index > 0; index--)
- if (1 == nVerticalMask[index - 1]) {
+ for (index = nPageHeight; index > 0; index--) {
+ if (1 == nVerticalMask[index - 1])
break;
- }
+ }
nEndV = index;
for (index = nStartV; index < nEndV; index++) {
nSumV += nVerticalMask[index];
@@ -848,58 +839,50 @@ int32_t CPDF_TextPage::FindTextlineFlowDirection() {
}
void CPDF_TextPage::ProcessObject() {
- FX_POSITION pos = m_pPage->GetPageObjectList()->GetHeadPosition();
- if (!pos) {
+ if (m_pPage->GetPageObjectList()->empty())
return;
- }
+
m_TextlineDir = FindTextlineFlowDirection();
- int nCount = 0;
- while (pos) {
- CPDF_PageObject* pPageObj =
- m_pPage->GetPageObjectList()->GetNextObject(pos);
- if (pPageObj) {
- if (pPageObj->m_Type == CPDF_PageObject::TEXT) {
+ const CPDF_PageObjectList* pObjList = m_pPage->GetPageObjectList();
+ for (auto it = pObjList->begin(); it != pObjList->end(); ++it) {
+ if (CPDF_PageObject* pObj = it->get()) {
+ if (pObj->m_Type == CPDF_PageObject::TEXT) {
CFX_Matrix matrix;
- ProcessTextObject((CPDF_TextObject*)pPageObj, matrix, pos);
- nCount++;
- } else if (pPageObj->m_Type == CPDF_PageObject::FORM) {
+ ProcessTextObject(static_cast<CPDF_TextObject*>(pObj), matrix, pObjList,
+ it);
+ } else if (pObj->m_Type == CPDF_PageObject::FORM) {
CFX_Matrix formMatrix(1, 0, 0, 1, 0, 0);
- ProcessFormObject((CPDF_FormObject*)pPageObj, formMatrix);
+ ProcessFormObject(static_cast<CPDF_FormObject*>(pObj), formMatrix);
}
}
}
- int count = m_LineObj.GetSize();
- for (int i = 0; i < count; i++) {
+ for (int i = 0; i < m_LineObj.GetSize(); i++)
ProcessTextObject(m_LineObj.GetAt(i));
- }
+
m_LineObj.RemoveAll();
CloseTempLine();
}
void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj,
const CFX_Matrix& formMatrix) {
- CPDF_PageObject* pPageObj = NULL;
- FX_POSITION pos;
- if (!pFormObj) {
+ CPDF_PageObjectList* pObjectList = pFormObj->m_pForm->GetPageObjectList();
+ if (pObjectList->empty())
return;
- }
- pos = pFormObj->m_pForm->GetPageObjectList()->GetHeadPosition();
- if (!pos) {
- return;
- }
+
CFX_Matrix curFormMatrix;
curFormMatrix.Copy(pFormObj->m_FormMatrix);
curFormMatrix.Concat(formMatrix);
- while (pos) {
- pPageObj = pFormObj->m_pForm->GetPageObjectList()->GetNextObject(pos);
- if (pPageObj) {
+
+ for (auto it = pObjectList->begin(); it != pObjectList->end(); ++it) {
+ if (CPDF_PageObject* pPageObj = it->get()) {
if (pPageObj->m_Type == CPDF_PageObject::TEXT) {
- ProcessTextObject((CPDF_TextObject*)pPageObj, curFormMatrix, pos);
+ ProcessTextObject(static_cast<CPDF_TextObject*>(pPageObj),
+ curFormMatrix, pObjectList, it);
} else if (pPageObj->m_Type == CPDF_PageObject::FORM) {
- ProcessFormObject((CPDF_FormObject*)pPageObj, curFormMatrix);
+ ProcessFormObject(static_cast<CPDF_FormObject*>(pPageObj),
+ curFormMatrix);
}
}
- pPageObj = NULL;
}
}
@@ -1032,9 +1015,11 @@ void CPDF_TextPage::CloseTempLine() {
m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength());
}
-void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj,
- const CFX_Matrix& formMatrix,
- FX_POSITION ObjPos) {
+void CPDF_TextPage::ProcessTextObject(
+ CPDF_TextObject* pTextObj,
+ const CFX_Matrix& formMatrix,
+ const CPDF_PageObjectList* pObjList,
+ CPDF_PageObjectList::const_iterator ObjPos) {
CFX_FloatRect re(pTextObj->m_Left, pTextObj->m_Bottom, pTextObj->m_Right,
pTextObj->m_Top);
if (FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f) {
@@ -1048,7 +1033,7 @@ void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj,
m_LineObj.Add(Obj);
return;
}
- if (IsSameAsPreTextObject(pTextObj, ObjPos)) {
+ if (IsSameAsPreTextObject(pTextObj, pObjList, ObjPos)) {
return;
}
PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(count - 1);
@@ -1832,29 +1817,19 @@ FX_BOOL CPDF_TextPage::IsSameTextObject(CPDF_TextObject* pTextObj1,
}
return TRUE;
}
-
-FX_BOOL CPDF_TextPage::IsSameAsPreTextObject(CPDF_TextObject* pTextObj,
- FX_POSITION ObjPos) {
- if (!pTextObj) {
- return FALSE;
- }
+FX_BOOL CPDF_TextPage::IsSameAsPreTextObject(
+ CPDF_TextObject* pTextObj,
+ const CPDF_PageObjectList* pObjList,
+ CPDF_PageObjectList::const_iterator iter) {
int i = 0;
- if (!ObjPos) {
- ObjPos = m_pPage->GetPageObjectList()->GetTailPosition();
- }
- CPDF_PageObject* pObj = m_pPage->GetPageObjectList()->GetPrevObject(ObjPos);
- while (i < 5 && ObjPos) {
- pObj = m_pPage->GetPageObjectList()->GetPrevObject(ObjPos);
- if (pObj == pTextObj) {
+ while (i < 5 && iter != pObjList->begin()) {
+ --iter;
+ CPDF_PageObject* pOtherObj = iter->get();
+ if (pOtherObj == pTextObj || pOtherObj->m_Type != CPDF_PageObject::TEXT)
continue;
- }
- if (pObj->m_Type != CPDF_PageObject::TEXT) {
- continue;
- }
- if (IsSameTextObject((CPDF_TextObject*)pObj, pTextObj)) {
+ if (IsSameTextObject(static_cast<CPDF_TextObject*>(pOtherObj), pTextObj))
return TRUE;
- }
- i++;
+ ++i;
}
return FALSE;
}
diff --git a/core/src/fpdftext/text_int.h b/core/src/fpdftext/text_int.h
index 9b7d654930..113e1d1ac8 100644
--- a/core/src/fpdftext/text_int.h
+++ b/core/src/fpdftext/text_int.h
@@ -10,6 +10,7 @@
#include <deque>
#include <vector>
+#include "core/include/fpdfapi/fpdf_page.h"
#include "core/include/fpdftext/fpdf_text.h"
#include "core/include/fxcrt/fx_basic.h"
@@ -107,11 +108,14 @@ class CPDF_TextPage : public IPDF_TextPage {
void ProcessTextObject(PDFTEXT_Obj pObj);
void ProcessTextObject(CPDF_TextObject* pTextObj,
const CFX_Matrix& formMatrix,
- FX_POSITION ObjPos);
+ const CPDF_PageObjectList* pObjList,
+ CPDF_PageObjectList::const_iterator ObjPos);
int ProcessInsertObject(const CPDF_TextObject* pObj,
const CFX_Matrix& formMatrix);
FX_BOOL GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info);
- FX_BOOL IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos);
+ FX_BOOL IsSameAsPreTextObject(CPDF_TextObject* pTextObj,
+ const CPDF_PageObjectList* pObjList,
+ CPDF_PageObjectList::const_iterator ObjPos);
FX_BOOL IsSameTextObject(CPDF_TextObject* pTextObj1,
CPDF_TextObject* pTextObj2);
int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const;