Index: core/src/fpdftext/fpdf_text_int.cpp |
diff --git a/core/src/fpdftext/fpdf_text_int.cpp b/core/src/fpdftext/fpdf_text_int.cpp |
index 67411e31b8481fd4230cbfffcca9dc28a5dfc9e4..ae26cbd252787e521556c7143c5013485790109b 100644 |
--- a/core/src/fpdftext/fpdf_text_int.cpp |
+++ b/core/src/fpdftext/fpdf_text_int.cpp |
@@ -4,6 +4,8 @@ |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
+#include "core/src/fpdftext/text_int.h" |
+ |
#include <algorithm> |
#include <cctype> |
#include <cwctype> |
@@ -17,7 +19,7 @@ |
#include "core/include/fxcrt/fx_bidi.h" |
#include "core/include/fxcrt/fx_ext.h" |
#include "core/include/fxcrt/fx_ucd.h" |
-#include "text_int.h" |
+#include "third_party/base/stl_util.h" |
namespace { |
@@ -106,8 +108,6 @@ IPDF_LinkExtract* IPDF_LinkExtract::CreateLinkExtract() { |
CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags) |
: m_pPage(pPage), |
- m_charList(512), |
- m_TempCharList(50), |
m_parserflag(flags), |
m_pPreTextObj(nullptr), |
m_bIsParsed(false), |
@@ -139,19 +139,19 @@ FX_BOOL CPDF_TextPage::ParseTextPage() { |
return FALSE; |
m_TextBuf.Clear(); |
- m_charList.RemoveAll(); |
+ m_CharList.clear(); |
m_pPreTextObj = NULL; |
ProcessObject(); |
m_bIsParsed = true; |
m_CharIndex.RemoveAll(); |
- int nCount = m_charList.GetSize(); |
+ int nCount = pdfium::CollectionSize<int>(m_CharList); |
if (nCount) { |
m_CharIndex.Add(0); |
} |
for (int i = 0; i < nCount; i++) { |
int indexSize = m_CharIndex.GetSize(); |
FX_BOOL bNormal = FALSE; |
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(i); |
+ const PAGECHAR_INFO& charinfo = m_CharList[i]; |
if (charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
bNormal = TRUE; |
} else if (charinfo.m_Unicode == 0 || IsControlChar(charinfo)) { |
@@ -186,7 +186,7 @@ FX_BOOL CPDF_TextPage::ParseTextPage() { |
return TRUE; |
} |
int CPDF_TextPage::CountChars() const { |
- return m_charList.GetSize(); |
+ return pdfium::CollectionSize<int>(m_CharList); |
} |
int CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const { |
int indexSize = m_CharIndex.GetSize(); |
@@ -224,16 +224,16 @@ void CPDF_TextPage::GetRectArray(int start, |
if (!m_bIsParsed) { |
return; |
} |
- PAGECHAR_INFO info_curchar; |
CPDF_TextObject* pCurObj = NULL; |
CFX_FloatRect rect; |
int curPos = start; |
FX_BOOL flagNewRect = TRUE; |
- if (nCount + start > m_charList.GetSize() || nCount == -1) { |
- nCount = m_charList.GetSize() - start; |
+ if (nCount + start > pdfium::CollectionSize<int>(m_CharList) || |
+ nCount == -1) { |
+ nCount = pdfium::CollectionSize<int>(m_CharList) - start; |
} |
while (nCount--) { |
- info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(curPos++); |
+ PAGECHAR_INFO info_curchar = m_CharList[curPos++]; |
if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
continue; |
} |
@@ -299,7 +299,6 @@ void CPDF_TextPage::GetRectArray(int start, |
} |
} |
rectArray.Add(rect); |
- return; |
} |
int CPDF_TextPage::GetIndexAtPos(CPDF_Point point, |
FX_FLOAT xTolerance, |
@@ -309,9 +308,10 @@ int CPDF_TextPage::GetIndexAtPos(CPDF_Point point, |
int pos = 0; |
int NearPos = -1; |
- double xdif = 5000, ydif = 5000; |
- while (pos < m_charList.GetSize()) { |
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)(m_charList.GetAt(pos)); |
+ double xdif = 5000; |
+ double ydif = 5000; |
+ while (pos < pdfium::CollectionSize<int>(m_CharList)) { |
+ PAGECHAR_INFO charinfo = m_CharList[pos]; |
CFX_FloatRect charrect = charinfo.m_CharBox; |
if (charrect.Contains(point.x, point.y)) { |
break; |
@@ -342,45 +342,40 @@ int CPDF_TextPage::GetIndexAtPos(CPDF_Point point, |
} |
++pos; |
} |
- if (pos >= m_charList.GetSize()) { |
- pos = NearPos; |
- } |
- return pos; |
+ return pos < pdfium::CollectionSize<int>(m_CharList) ? pos : NearPos; |
} |
+ |
CFX_WideString CPDF_TextPage::GetTextByRect(const CFX_FloatRect& rect) const { |
- CFX_WideString strText; |
if (!m_bIsParsed) |
- return strText; |
+ return CFX_WideString(); |
- int nCount = m_charList.GetSize(); |
- int pos = 0; |
FX_FLOAT posy = 0; |
- FX_BOOL IsContainPreChar = FALSE; |
- FX_BOOL ISAddLineFeed = FALSE; |
- while (pos < nCount) { |
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos++); |
+ bool IsContainPreChar = false; |
+ bool IsAddLineFeed = false; |
+ CFX_WideString strText; |
+ for (const auto& charinfo : m_CharList) { |
if (IsRectIntersect(rect, charinfo.m_CharBox)) { |
if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar && |
- ISAddLineFeed) { |
+ IsAddLineFeed) { |
posy = charinfo.m_OriginY; |
if (strText.GetLength() > 0) { |
strText += L"\r\n"; |
} |
} |
- IsContainPreChar = TRUE; |
- ISAddLineFeed = FALSE; |
+ IsContainPreChar = true; |
+ IsAddLineFeed = false; |
if (charinfo.m_Unicode) { |
strText += charinfo.m_Unicode; |
} |
} else if (charinfo.m_Unicode == 32) { |
if (IsContainPreChar && charinfo.m_Unicode) { |
strText += charinfo.m_Unicode; |
- IsContainPreChar = FALSE; |
- ISAddLineFeed = FALSE; |
+ IsContainPreChar = false; |
+ IsAddLineFeed = false; |
} |
} else { |
- IsContainPreChar = FALSE; |
- ISAddLineFeed = TRUE; |
+ IsContainPreChar = false; |
+ IsAddLineFeed = true; |
} |
} |
return strText; |
@@ -391,47 +386,36 @@ void CPDF_TextPage::GetRectsArrayByRect(const CFX_FloatRect& rect, |
return; |
CFX_FloatRect curRect; |
- FX_BOOL flagNewRect = TRUE; |
- CPDF_TextObject* pCurObj = NULL; |
- int nCount = m_charList.GetSize(); |
- int pos = 0; |
- while (pos < nCount) { |
- PAGECHAR_INFO info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(pos++); |
+ bool flagNewRect = true; |
+ CPDF_TextObject* pCurObj = nullptr; |
+ for (auto info_curchar : m_CharList) { |
if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
continue; |
} |
- if (IsRectIntersect(rect, info_curchar.m_CharBox)) { |
- if (!pCurObj) { |
- pCurObj = info_curchar.m_pTextObj; |
- } |
- if (pCurObj != info_curchar.m_pTextObj) { |
- resRectArray.Add(curRect); |
- pCurObj = info_curchar.m_pTextObj; |
- flagNewRect = TRUE; |
- } |
- if (flagNewRect) { |
- curRect = info_curchar.m_CharBox; |
- flagNewRect = FALSE; |
- curRect.Normalize(); |
- } else { |
- info_curchar.m_CharBox.Normalize(); |
- if (curRect.left > info_curchar.m_CharBox.left) { |
- curRect.left = info_curchar.m_CharBox.left; |
- } |
- if (curRect.right < info_curchar.m_CharBox.right) { |
- curRect.right = info_curchar.m_CharBox.right; |
- } |
- if (curRect.top < info_curchar.m_CharBox.top) { |
- curRect.top = info_curchar.m_CharBox.top; |
- } |
- if (curRect.bottom > info_curchar.m_CharBox.bottom) { |
- curRect.bottom = info_curchar.m_CharBox.bottom; |
- } |
- } |
+ if (!IsRectIntersect(rect, info_curchar.m_CharBox)) { |
+ continue; |
+ } |
+ if (!pCurObj) { |
+ pCurObj = info_curchar.m_pTextObj; |
+ } |
+ if (pCurObj != info_curchar.m_pTextObj) { |
+ resRectArray.Add(curRect); |
+ pCurObj = info_curchar.m_pTextObj; |
+ flagNewRect = true; |
+ } |
+ if (flagNewRect) { |
+ curRect = info_curchar.m_CharBox; |
+ curRect.Normalize(); |
+ flagNewRect = false; |
+ } else { |
+ info_curchar.m_CharBox.Normalize(); |
+ curRect.left = std::min(curRect.left, info_curchar.m_CharBox.left); |
+ curRect.bottom = std::min(curRect.bottom, info_curchar.m_CharBox.bottom); |
+ curRect.right = std::max(curRect.right, info_curchar.m_CharBox.right); |
+ curRect.top = std::max(curRect.top, info_curchar.m_CharBox.top); |
} |
} |
resRectArray.Add(curRect); |
- return; |
} |
int CPDF_TextPage::GetIndexAtPos(FX_FLOAT x, |
FX_FLOAT y, |
@@ -445,31 +429,29 @@ void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO* info) const { |
if (!m_bIsParsed) |
return; |
- if (index < 0 || index >= m_charList.GetSize()) |
+ if (index < 0 || index >= pdfium::CollectionSize<int>(m_CharList)) |
return; |
- const PAGECHAR_INFO* charinfo = |
- static_cast<PAGECHAR_INFO*>(m_charList.GetAt(index)); |
- info->m_Charcode = charinfo->m_CharCode; |
- info->m_OriginX = charinfo->m_OriginX; |
- info->m_OriginY = charinfo->m_OriginY; |
- info->m_Unicode = charinfo->m_Unicode; |
- info->m_Flag = charinfo->m_Flag; |
- info->m_CharBox = charinfo->m_CharBox; |
- info->m_pTextObj = charinfo->m_pTextObj; |
- if (charinfo->m_pTextObj && charinfo->m_pTextObj->GetFont()) { |
- info->m_FontSize = charinfo->m_pTextObj->GetFontSize(); |
+ const PAGECHAR_INFO& charinfo = m_CharList[index]; |
+ info->m_Charcode = charinfo.m_CharCode; |
+ info->m_OriginX = charinfo.m_OriginX; |
+ info->m_OriginY = charinfo.m_OriginY; |
+ info->m_Unicode = charinfo.m_Unicode; |
+ info->m_Flag = charinfo.m_Flag; |
+ info->m_CharBox = charinfo.m_CharBox; |
+ info->m_pTextObj = charinfo.m_pTextObj; |
+ if (charinfo.m_pTextObj && charinfo.m_pTextObj->GetFont()) { |
+ info->m_FontSize = charinfo.m_pTextObj->GetFontSize(); |
} else { |
info->m_FontSize = kDefaultFontSize; |
} |
- info->m_Matrix.Copy(charinfo->m_Matrix); |
+ info->m_Matrix.Copy(charinfo.m_Matrix); |
} |
void CPDF_TextPage::CheckMarkedContentObject(int32_t& start, |
int32_t& nCount) const { |
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start); |
- PAGECHAR_INFO charinfo2 = |
- *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1); |
+ PAGECHAR_INFO charinfo = m_CharList[start]; |
+ PAGECHAR_INFO charinfo2 = m_CharList[start + nCount - 1]; |
if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && |
FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) { |
return; |
@@ -483,7 +465,7 @@ void CPDF_TextPage::CheckMarkedContentObject(int32_t& start, |
if (startIndex < 0) { |
break; |
} |
- charinfo1 = *(PAGECHAR_INFO*)m_charList.GetAt(startIndex); |
+ charinfo1 = m_CharList[startIndex]; |
} |
startIndex++; |
start = startIndex; |
@@ -494,10 +476,10 @@ void CPDF_TextPage::CheckMarkedContentObject(int32_t& start, |
while (FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && |
charinfo3.m_Index == charinfo2.m_Index) { |
endIndex++; |
- if (endIndex >= m_charList.GetSize()) { |
+ if (endIndex >= pdfium::CollectionSize<int>(m_CharList)) { |
break; |
} |
- charinfo3 = *(PAGECHAR_INFO*)m_charList.GetAt(endIndex); |
+ charinfo3 = m_CharList[endIndex]; |
} |
endIndex--; |
nCount = endIndex - start + 1; |
@@ -511,40 +493,40 @@ CFX_WideString CPDF_TextPage::GetPageText(int start, int nCount) const { |
start = 0; |
if (nCount == -1) { |
- nCount = m_charList.GetSize() - start; |
+ nCount = pdfium::CollectionSize<int>(m_CharList) - start; |
return m_TextBuf.GetWideString().Mid(start, |
m_TextBuf.GetWideString().GetLength()); |
} |
- if (nCount <= 0 || m_charList.GetSize() <= 0) { |
+ if (nCount <= 0 || m_CharList.empty()) { |
return L""; |
} |
- if (nCount + start > m_charList.GetSize() - 1) { |
- nCount = m_charList.GetSize() - start; |
+ if (nCount + start > pdfium::CollectionSize<int>(m_CharList) - 1) { |
+ nCount = pdfium::CollectionSize<int>(m_CharList) - start; |
} |
if (nCount <= 0) { |
return L""; |
} |
CheckMarkedContentObject(start, nCount); |
int startindex = 0; |
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start); |
+ PAGECHAR_INFO charinfo = m_CharList[start]; |
int startOffset = 0; |
while (charinfo.m_Index == -1) { |
startOffset++; |
- if (startOffset > nCount || start + startOffset >= m_charList.GetSize()) { |
+ if (startOffset > nCount || |
+ start + startOffset >= pdfium::CollectionSize<int>(m_CharList)) { |
return L""; |
} |
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + startOffset); |
+ charinfo = m_CharList[start + startOffset]; |
} |
startindex = charinfo.m_Index; |
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1); |
+ charinfo = m_CharList[start + nCount - 1]; |
int nCountOffset = 0; |
while (charinfo.m_Index == -1) { |
nCountOffset++; |
if (nCountOffset >= nCount) { |
return L""; |
} |
- charinfo = |
- *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - nCountOffset - 1); |
+ charinfo = m_CharList[start + nCount - nCountOffset - 1]; |
} |
nCount = start + nCount - nCountOffset - startindex; |
if (nCount <= 0) { |
@@ -556,8 +538,9 @@ int CPDF_TextPage::CountRects(int start, int nCount) { |
if (!m_bIsParsed || start < 0) |
return -1; |
- if (nCount == -1 || nCount + start > m_charList.GetSize()) { |
- nCount = m_charList.GetSize() - start; |
+ if (nCount == -1 || |
+ nCount + start > pdfium::CollectionSize<int>(m_CharList)) { |
+ nCount = pdfium::CollectionSize<int>(m_CharList) - start; |
} |
m_SelRects.RemoveAll(); |
GetRectArray(start, nCount, m_SelRects); |
@@ -649,21 +632,21 @@ int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, |
FX_FLOAT right, |
FX_FLOAT bottom, |
FX_BOOL bContains) { |
- m_Segment.RemoveAll(); |
+ m_Segments.RemoveAll(); |
if (!m_bIsParsed) |
return -1; |
CFX_FloatRect rect(left, bottom, right, top); |
rect.Normalize(); |
- int nCount = m_charList.GetSize(); |
- int pos = 0; |
+ |
FPDF_SEGMENT segment; |
segment.m_Start = 0; |
segment.m_nCount = 0; |
+ |
+ int pos = 0; |
int segmentStatus = 0; |
FX_BOOL IsContainPreChar = FALSE; |
- while (pos < nCount) { |
- PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos); |
+ for (const auto& charinfo : m_CharList) { |
if (bContains && rect.Contains(charinfo.m_CharBox)) { |
if (segmentStatus == 0 || segmentStatus == 2) { |
segment.m_Start = pos; |
@@ -697,7 +680,7 @@ int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, |
} else { |
if (segmentStatus == 1) { |
segmentStatus = 2; |
- m_Segment.Add(segment); |
+ m_Segments.Add(segment); |
segment.m_Start = 0; |
segment.m_nCount = 0; |
} |
@@ -705,7 +688,7 @@ int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, |
} else { |
if (segmentStatus == 1) { |
segmentStatus = 2; |
- m_Segment.Add(segment); |
+ m_Segments.Add(segment); |
segment.m_Start = 0; |
segment.m_nCount = 0; |
} |
@@ -715,18 +698,18 @@ int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, |
} |
if (segmentStatus == 1) { |
segmentStatus = 2; |
- m_Segment.Add(segment); |
+ m_Segments.Add(segment); |
segment.m_Start = 0; |
segment.m_nCount = 0; |
} |
- return m_Segment.GetSize(); |
+ return m_Segments.GetSize(); |
} |
void CPDF_TextPage::GetBoundedSegment(int index, int& start, int& count) const { |
- if (index < 0 || index >= m_Segment.GetSize()) { |
+ if (index < 0 || index >= m_Segments.GetSize()) { |
return; |
} |
- start = m_Segment.GetAt(index).m_Start; |
- count = m_Segment.GetAt(index).m_nCount; |
+ start = m_Segments.GetAt(index).m_Start; |
+ count = m_Segments.GetAt(index).m_nCount; |
} |
int CPDF_TextPage::GetWordBreak(int index, int direction) const { |
if (!m_bIsParsed) |
@@ -735,11 +718,10 @@ int CPDF_TextPage::GetWordBreak(int index, int direction) const { |
if (direction != FPDFTEXT_LEFT && direction != FPDFTEXT_RIGHT) |
return -1; |
- if (index < 0 || index >= m_charList.GetSize()) |
+ if (index < 0 || index >= pdfium::CollectionSize<int>(m_CharList)) |
return -1; |
- PAGECHAR_INFO charinfo; |
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index); |
+ const PAGECHAR_INFO& charinfo = m_CharList[index]; |
if (charinfo.m_Index == -1 || charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) { |
return index; |
} |
@@ -749,17 +731,13 @@ int CPDF_TextPage::GetWordBreak(int index, int direction) const { |
int breakPos = index; |
if (direction == FPDFTEXT_LEFT) { |
while (--breakPos > 0) { |
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos); |
- if (!IsLetter(charinfo.m_Unicode)) { |
- return breakPos; |
- } |
+ if (!IsLetter(m_CharList[breakPos].m_Unicode)) |
+ break; |
} |
} else if (direction == FPDFTEXT_RIGHT) { |
- while (++breakPos < m_charList.GetSize()) { |
- charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos); |
- if (!IsLetter(charinfo.m_Unicode)) { |
- return breakPos; |
- } |
+ while (++breakPos < pdfium::CollectionSize<int>(m_CharList)) { |
+ if (!IsLetter(m_CharList[breakPos].m_Unicode)) |
+ break; |
} |
} |
return breakPos; |
@@ -949,21 +927,21 @@ void CPDF_TextPage::OnPiece(CFX_BidiChar* pBidi, CFX_WideString& str) { |
if (ret == CFX_BidiChar::RIGHT) { |
for (int i = start + count - 1; i >= start; i--) { |
m_TextBuf.AppendChar(str.GetAt(i)); |
- m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i)); |
+ m_CharList.push_back(m_TempCharList[i]); |
} |
} else { |
int end = start + count; |
for (int i = start; i < end; i++) { |
m_TextBuf.AppendChar(str.GetAt(i)); |
- m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i)); |
+ m_CharList.push_back(m_TempCharList[i]); |
} |
} |
} |
void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i) { |
- PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i); |
+ PAGECHAR_INFO info = m_TempCharList[i]; |
FX_WCHAR wChar = str.GetAt(i); |
- if (!IsControlChar(Info)) { |
- Info.m_Index = m_TextBuf.GetLength(); |
+ if (!IsControlChar(info)) { |
+ info.m_Index = m_TextBuf.GetLength(); |
if (wChar >= 0xFB00 && wChar <= 0xFB06) { |
FX_WCHAR* pDst = NULL; |
FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst); |
@@ -971,11 +949,11 @@ void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i) { |
pDst = FX_Alloc(FX_WCHAR, nCount); |
FX_Unicode_GetNormalization(wChar, pDst); |
for (int nIndex = 0; nIndex < nCount; nIndex++) { |
- PAGECHAR_INFO Info2 = Info; |
- Info2.m_Unicode = pDst[nIndex]; |
- Info2.m_Flag = FPDFTEXT_CHAR_PIECE; |
- m_TextBuf.AppendChar(Info2.m_Unicode); |
- m_charList.Add(Info2); |
+ PAGECHAR_INFO info2 = info; |
+ info2.m_Unicode = pDst[nIndex]; |
+ info2.m_Flag = FPDFTEXT_CHAR_PIECE; |
+ m_TextBuf.AppendChar(info2.m_Unicode); |
+ m_CharList.push_back(info2); |
} |
FX_Free(pDst); |
return; |
@@ -983,14 +961,14 @@ void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i) { |
} |
m_TextBuf.AppendChar(wChar); |
} else { |
- Info.m_Index = -1; |
+ info.m_Index = -1; |
} |
- m_charList.Add(Info); |
+ m_CharList.push_back(info); |
} |
void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i) { |
- PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i); |
- if (!IsControlChar(Info)) { |
- Info.m_Index = m_TextBuf.GetLength(); |
+ PAGECHAR_INFO info = m_TempCharList[i]; |
+ if (!IsControlChar(info)) { |
+ info.m_Index = m_TextBuf.GetLength(); |
FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE); |
FX_WCHAR* pDst = NULL; |
FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst); |
@@ -998,25 +976,24 @@ void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i) { |
pDst = FX_Alloc(FX_WCHAR, nCount); |
FX_Unicode_GetNormalization(wChar, pDst); |
for (int nIndex = 0; nIndex < nCount; nIndex++) { |
- PAGECHAR_INFO Info2 = Info; |
- Info2.m_Unicode = pDst[nIndex]; |
- Info2.m_Flag = FPDFTEXT_CHAR_PIECE; |
- m_TextBuf.AppendChar(Info2.m_Unicode); |
- m_charList.Add(Info2); |
+ PAGECHAR_INFO info2 = info; |
+ info2.m_Unicode = pDst[nIndex]; |
+ info2.m_Flag = FPDFTEXT_CHAR_PIECE; |
+ m_TextBuf.AppendChar(info2.m_Unicode); |
+ m_CharList.push_back(info2); |
} |
FX_Free(pDst); |
return; |
} |
- Info.m_Unicode = wChar; |
- m_TextBuf.AppendChar(Info.m_Unicode); |
+ info.m_Unicode = wChar; |
+ m_TextBuf.AppendChar(info.m_Unicode); |
} else { |
- Info.m_Index = -1; |
+ info.m_Index = -1; |
} |
- m_charList.Add(Info); |
+ m_CharList.push_back(info); |
} |
void CPDF_TextPage::CloseTempLine() { |
- int count1 = m_TempCharList.GetSize(); |
- if (count1 <= 0) { |
+ if (m_TempCharList.empty()) { |
return; |
} |
std::unique_ptr<CFX_BidiChar> pBidiChar(new CFX_BidiChar); |
@@ -1030,9 +1007,8 @@ void CPDF_TextPage::CloseTempLine() { |
if (str.GetAt(i) == 32) { |
if (bPrevSpace) { |
m_TempTextBuf.Delete(i, 1); |
- m_TempCharList.Delete(i); |
+ m_TempCharList.erase(m_TempCharList.begin() + i); |
str.Delete(i); |
- count1--; |
i--; |
continue; |
} |
@@ -1133,7 +1109,7 @@ void CPDF_TextPage::CloseTempLine() { |
bL2R = TRUE; |
continue; |
} |
- int end = m_TempCharList.GetSize() - 1; |
+ int end = pdfium::CollectionSize<int>(m_TempCharList) - 1; |
if (j < count) { |
end = order.GetAt(j) - 1; |
} |
@@ -1150,7 +1126,7 @@ void CPDF_TextPage::CloseTempLine() { |
} |
} |
order.RemoveAll(); |
- m_TempCharList.RemoveAll(); |
+ m_TempCharList.clear(); |
m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength()); |
} |
void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj, |
@@ -1367,29 +1343,23 @@ void CPDF_TextPage::ProcessMarkedContent(PDFTEXT_Obj Obj) { |
charinfo.m_CharBox.bottom = charBox.bottom; |
charinfo.m_Matrix.Copy(matrix); |
m_TempTextBuf.AppendChar(wChar); |
- m_TempCharList.Add(charinfo); |
+ m_TempCharList.push_back(charinfo); |
} |
} |
-void CPDF_TextPage::FindPreviousTextObject(void) { |
- if (m_TempCharList.GetSize() < 1 && m_charList.GetSize() < 1) { |
+void CPDF_TextPage::FindPreviousTextObject() { |
+ if (m_TempCharList.empty() && m_CharList.empty()) |
return; |
- } |
- PAGECHAR_INFO preChar; |
- if (m_TempCharList.GetSize() >= 1) { |
- preChar = |
- *(PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1); |
- } else { |
- preChar = *(PAGECHAR_INFO*)m_charList.GetAt(m_charList.GetSize() - 1); |
- } |
- if (preChar.m_pTextObj) { |
+ |
+ PAGECHAR_INFO preChar = |
+ m_TempCharList.empty() ? m_CharList.back() : m_TempCharList.back(); |
+ |
+ if (preChar.m_pTextObj) |
m_pPreTextObj = preChar.m_pTextObj; |
- } |
} |
void CPDF_TextPage::SwapTempTextBuf(int32_t iCharListStartAppend, |
int32_t iBufStartAppend) { |
- int32_t i, j; |
- i = iCharListStartAppend; |
- j = m_TempCharList.GetSize() - 1; |
+ int32_t i = iCharListStartAppend; |
+ int32_t j = pdfium::CollectionSize<int32_t>(m_TempCharList) - 1; |
for (; i < j; i++, j--) { |
std::swap(m_TempCharList[i], m_TempCharList[j]); |
std::swap(m_TempCharList[i].m_Index, m_TempCharList[j].m_Index); |
@@ -1476,7 +1446,7 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { |
generateChar.m_Matrix.Copy(formMatrix); |
} |
m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR); |
- m_TempCharList.Add(generateChar); |
+ m_TempCharList.push_back(generateChar); |
} |
} else if (result == 2) { |
CloseTempLine(); |
@@ -1486,14 +1456,14 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { |
if (!formMatrix.IsIdentity()) { |
generateChar.m_Matrix.Copy(formMatrix); |
} |
- m_charList.Add(generateChar); |
+ m_CharList.push_back(generateChar); |
} |
if (GenerateCharInfo(TEXT_LINEFEED_CHAR, generateChar)) { |
m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR); |
if (!formMatrix.IsIdentity()) { |
generateChar.m_Matrix.Copy(formMatrix); |
} |
- m_charList.Add(generateChar); |
+ m_CharList.push_back(generateChar); |
} |
} |
} else if (result == 3) { |
@@ -1515,13 +1485,12 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { |
m_TempTextBuf.GetWideString().GetAt(m_TempTextBuf.GetLength() - |
1) == 0x20) { |
m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); |
- m_TempCharList.Delete(m_TempCharList.GetSize() - 1); |
+ m_TempCharList.pop_back(); |
} |
- PAGECHAR_INFO* cha = |
- (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1); |
+ PAGECHAR_INFO* charinfo = &m_TempCharList.back(); |
m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); |
- cha->m_Unicode = 0x2; |
- cha->m_Flag = FPDFTEXT_CHAR_HYPHEN; |
+ charinfo->m_Unicode = 0x2; |
+ charinfo->m_Flag = FPDFTEXT_CHAR_HYPHEN; |
m_TempTextBuf.AppendChar(0xfffe); |
} |
} else { |
@@ -1544,7 +1513,8 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { |
const FX_BOOL bIsBidiAndMirrorInverse = |
bR2L && (matrix.a * matrix.d - matrix.b * matrix.c) < 0; |
int32_t iBufStartAppend = m_TempTextBuf.GetLength(); |
- int32_t iCharListStartAppend = m_TempCharList.GetSize(); |
+ int32_t iCharListStartAppend = |
+ pdfium::CollectionSize<int32_t>(m_TempCharList); |
FX_FLOAT spacing = 0; |
for (int i = 0; i < nItems; i++) { |
@@ -1606,7 +1576,7 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { |
charinfo.m_CharBox = |
CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY, |
charinfo.m_OriginX, charinfo.m_OriginY); |
- m_TempCharList.Add(charinfo); |
+ m_TempCharList.push_back(charinfo); |
} |
if (item.m_CharCode == (FX_DWORD)-1) { |
continue; |
@@ -1658,23 +1628,23 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { |
charinfo.m_Matrix.Copy(matrix); |
if (wstrItem.IsEmpty()) { |
charinfo.m_Unicode = 0; |
- m_TempCharList.Add(charinfo); |
+ m_TempCharList.push_back(charinfo); |
m_TempTextBuf.AppendChar(0xfffe); |
continue; |
} else { |
int nTotal = wstrItem.GetLength(); |
FX_BOOL bDel = FALSE; |
- const int count = std::min(m_TempCharList.GetSize(), 7); |
+ const int count = |
+ std::min(pdfium::CollectionSize<int>(m_TempCharList), 7); |
FX_FLOAT threshold = charinfo.m_Matrix.TransformXDistance( |
(FX_FLOAT)TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize()); |
- for (int n = m_TempCharList.GetSize(); |
- n > m_TempCharList.GetSize() - count; n--) { |
- PAGECHAR_INFO* charinfo1 = (PAGECHAR_INFO*)m_TempCharList.GetAt(n - 1); |
- if (charinfo1->m_CharCode == charinfo.m_CharCode && |
- charinfo1->m_pTextObj->GetFont() == |
- charinfo.m_pTextObj->GetFont() && |
- FXSYS_fabs(charinfo1->m_OriginX - charinfo.m_OriginX) < threshold && |
- FXSYS_fabs(charinfo1->m_OriginY - charinfo.m_OriginY) < threshold) { |
+ for (int n = pdfium::CollectionSize<int>(m_TempCharList); |
+ n > pdfium::CollectionSize<int>(m_TempCharList) - count; n--) { |
+ const PAGECHAR_INFO& charinfo1 = m_TempCharList[n - 1]; |
+ if (charinfo1.m_CharCode == charinfo.m_CharCode && |
+ charinfo1.m_pTextObj->GetFont() == charinfo.m_pTextObj->GetFont() && |
+ FXSYS_fabs(charinfo1.m_OriginX - charinfo.m_OriginX) < threshold && |
+ FXSYS_fabs(charinfo1.m_OriginY - charinfo.m_OriginY) < threshold) { |
bDel = TRUE; |
break; |
} |
@@ -1688,14 +1658,14 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { |
} else { |
m_TempTextBuf.AppendChar(0xfffe); |
} |
- m_TempCharList.Add(charinfo); |
+ m_TempCharList.push_back(charinfo); |
} |
} else if (i == 0) { |
CFX_WideString str = m_TempTextBuf.GetWideString(); |
if (!str.IsEmpty() && |
str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) { |
m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1); |
- m_TempCharList.Delete(m_TempCharList.GetSize() - 1); |
+ m_TempCharList.pop_back(); |
} |
} |
} |
@@ -1754,19 +1724,16 @@ FX_BOOL CPDF_TextPage::IsHyphen(FX_WCHAR curChar) { |
return TRUE; |
} |
} |
- int size = m_TempCharList.GetSize(); |
- PAGECHAR_INFO preChar; |
- if (size) { |
- preChar = (PAGECHAR_INFO)m_TempCharList[size - 1]; |
+ const PAGECHAR_INFO* preInfo; |
+ if (!m_TempCharList.empty()) { |
+ preInfo = &m_TempCharList.back(); |
+ } else if (!m_CharList.empty()) { |
+ preInfo = &m_CharList.back(); |
} else { |
- size = m_charList.GetSize(); |
- if (size == 0) { |
- return FALSE; |
- } |
- preChar = (PAGECHAR_INFO)m_charList[size - 1]; |
+ return FALSE; |
} |
- if (FPDFTEXT_CHAR_PIECE == preChar.m_Flag && |
- (0xAD == preChar.m_Unicode || 0x2D == preChar.m_Unicode)) { |
+ if (FPDFTEXT_CHAR_PIECE == preInfo->m_Flag && |
+ (0xAD == preInfo->m_Unicode || 0x2D == preInfo->m_Unicode)) { |
return TRUE; |
} |
} |
@@ -1939,9 +1906,9 @@ FX_BOOL CPDF_TextPage::IsSameTextObject(CPDF_TextObject* pTextObj1, |
pTextObj1->m_Right, pTextObj1->m_Top); |
if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) { |
FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left); |
- int nCount = m_charList.GetSize(); |
+ size_t nCount = m_CharList.size(); |
if (nCount >= 2) { |
- PAGECHAR_INFO perCharTemp = (PAGECHAR_INFO)m_charList[nCount - 2]; |
+ PAGECHAR_INFO perCharTemp = m_CharList[nCount - 2]; |
FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width(); |
if (dbXdif > dbSpace) { |
return FALSE; |
@@ -2012,16 +1979,13 @@ FX_BOOL CPDF_TextPage::IsSameAsPreTextObject(CPDF_TextObject* pTextObj, |
} |
FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info) { |
- int size = m_TempCharList.GetSize(); |
- PAGECHAR_INFO preChar; |
- if (size) { |
- preChar = (PAGECHAR_INFO)m_TempCharList[size - 1]; |
+ const PAGECHAR_INFO* preChar; |
+ if (!m_TempCharList.empty()) { |
+ preChar = &m_TempCharList.back(); |
+ } else if (!m_CharList.empty()) { |
+ preChar = &m_CharList.back(); |
} else { |
- size = m_charList.GetSize(); |
- if (size == 0) { |
- return FALSE; |
- } |
- preChar = (PAGECHAR_INFO)m_charList[size - 1]; |
+ return FALSE; |
} |
info.m_Index = m_TextBuf.GetLength(); |
info.m_Unicode = unicode; |
@@ -2029,16 +1993,17 @@ FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info) { |
info.m_CharCode = -1; |
info.m_Flag = FPDFTEXT_CHAR_GENERATED; |
int preWidth = 0; |
- if (preChar.m_pTextObj && preChar.m_CharCode != (FX_DWORD)-1) |
- preWidth = GetCharWidth(preChar.m_CharCode, preChar.m_pTextObj->GetFont()); |
+ if (preChar->m_pTextObj && preChar->m_CharCode != (FX_DWORD)-1) |
+ preWidth = |
+ GetCharWidth(preChar->m_CharCode, preChar->m_pTextObj->GetFont()); |
- FX_FLOAT fFontSize = preChar.m_pTextObj ? preChar.m_pTextObj->GetFontSize() |
- : preChar.m_CharBox.Height(); |
+ FX_FLOAT fFontSize = preChar->m_pTextObj ? preChar->m_pTextObj->GetFontSize() |
+ : preChar->m_CharBox.Height(); |
if (!fFontSize) |
fFontSize = kDefaultFontSize; |
- info.m_OriginX = preChar.m_OriginX + preWidth * (fFontSize) / 1000; |
- info.m_OriginY = preChar.m_OriginY; |
+ info.m_OriginX = preChar->m_OriginX + preWidth * (fFontSize) / 1000; |
+ info.m_OriginY = preChar->m_OriginY; |
info.m_CharBox = CFX_FloatRect(info.m_OriginX, info.m_OriginY, info.m_OriginX, |
info.m_OriginY); |
return TRUE; |