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 dea5722aa822f4625a85dcd0e1d3555d528f03e5..f7c5565bd95a87fbddb4b929146f834cd849777b 100644 |
--- a/core/src/fpdftext/fpdf_text_int.cpp |
+++ b/core/src/fpdftext/fpdf_text_int.cpp |
@@ -10,7 +10,11 @@ |
#include "../../include/fpdfapi/fpdf_page.h" |
#include "../../include/fpdfapi/fpdf_module.h" |
#include <ctype.h> |
+#include <algorithm> |
#include "text_int.h" |
+ |
+namespace { |
+ |
FX_BOOL _IsIgnoreSpaceCharacter(FX_WCHAR curChar) |
{ |
if(curChar < 255 ) { |
@@ -29,6 +33,48 @@ FX_BOOL _IsIgnoreSpaceCharacter(FX_WCHAR curChar) |
} |
return TRUE; |
} |
+ |
+FX_FLOAT _NormalizeThreshold(FX_FLOAT threshold) |
+{ |
+ if (threshold < 300) { |
+ return threshold / 2.0; |
+ } else if (threshold < 500) { |
+ return threshold / 4.0; |
+ } else if (threshold < 700) { |
+ return threshold / 5.0; |
+ } |
+ return threshold / 6.0; |
+} |
+ |
+FX_FLOAT _CalculateBaseSpace(const CPDF_TextObject* pTextObj, |
+ const CFX_AffineMatrix& matrix) |
+{ |
+ FX_FLOAT baseSpace = 0.0; |
+ const int nItems = pTextObj->CountItems(); |
+ if (pTextObj->m_TextState.GetObject()->m_CharSpace && nItems >= 3) { |
+ FX_BOOL bAllChar = TRUE; |
+ FX_FLOAT spacing = matrix.TransformDistance( |
+ pTextObj->m_TextState.GetObject()->m_CharSpace); |
+ baseSpace = spacing; |
+ for (int i = 0; i < nItems; i++) { |
+ CPDF_TextObjectItem item; |
+ pTextObj->GetItemInfo(i, &item); |
+ if (item.m_CharCode == (FX_DWORD) - 1) { |
+ FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH(); |
+ FX_FLOAT kerning = -fontsize_h * item.m_OriginX / 1000; |
+ baseSpace = std::min(baseSpace, kerning + spacing); |
+ bAllChar = FALSE; |
+ } |
+ } |
+ if (baseSpace < 0.0 || (nItems == 3 && !bAllChar)) { |
+ baseSpace = 0.0; |
+ } |
+ } |
+ return baseSpace; |
+} |
+ |
+} // namespace |
+ |
CPDFText_ParseOptions::CPDFText_ParseOptions() |
: m_bGetCharCodeOnly(FALSE), m_bNormalizeObjs(TRUE), m_bOutputHyphen(FALSE) |
{ |
@@ -1642,29 +1688,7 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) |
m_pPreTextObj = pTextObj; |
m_perMatrix.Copy(formMatrix); |
int nItems = pTextObj->CountItems(); |
- FX_FLOAT spacing = 0; |
- FX_FLOAT baseSpace = 0.0; |
- FX_BOOL bAllChar = TRUE; |
- if (pTextObj->m_TextState.GetObject()->m_CharSpace && nItems >= 3) { |
- spacing = matrix.TransformDistance(pTextObj->m_TextState.GetObject()->m_CharSpace); |
- baseSpace = spacing; |
- for (int i = 0; i < nItems; i++) { |
- CPDF_TextObjectItem item; |
- pTextObj->GetItemInfo(i, &item); |
- if (item.m_CharCode == (FX_DWORD) - 1) { |
- FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH(); |
- FX_FLOAT kerning = -fontsize_h * item.m_OriginX / 1000; |
- if(kerning + spacing < baseSpace) { |
- baseSpace = kerning + spacing; |
- } |
- bAllChar = FALSE; |
- } |
- } |
- spacing = 0; |
- if(baseSpace < 0.0 || (nItems == 3 && !bAllChar)) { |
- baseSpace = 0.0; |
- } |
- } |
+ FX_FLOAT baseSpace = _CalculateBaseSpace(pTextObj, matrix); |
FX_BOOL bIsBidiAndMirrosInverse = FALSE; |
IFX_BidiChar* BidiChar = IFX_BidiChar::Create(); |
@@ -1712,6 +1736,7 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) |
FX_INT32 iBufStartAppend = m_TempTextBuf.GetLength(); |
FX_INT32 iCharListStartAppend = m_TempCharList.GetSize(); |
+ FX_FLOAT spacing = 0; |
for (int i = 0; i < nItems; i++) { |
CPDF_TextObjectItem item; |
PAGECHAR_INFO charinfo; |
@@ -1754,15 +1779,7 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) |
threshold = fontsize_h; |
int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont)); |
threshold = this_width > last_width ? (FX_FLOAT)this_width : (FX_FLOAT)last_width; |
- int nDivide = 6; |
- if (threshold < 300) { |
- nDivide = 2; |
- } else if (threshold < 500) { |
- nDivide = 4; |
- } else if (threshold < 700) { |
- nDivide = 5; |
- } |
- threshold = threshold / nDivide; |
+ threshold = _NormalizeThreshold(threshold); |
threshold = fontsize_h * threshold / 1000; |
} |
if (threshold && (spacing && spacing >= threshold) ) { |
@@ -1825,11 +1842,12 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) |
continue; |
} else { |
int nTotal = wstrItem.GetLength(); |
- int n = 0; |
FX_BOOL bDel = FALSE; |
- while (n < m_TempCharList.GetSize() && n < 7) { |
- n++; |
- PAGECHAR_INFO* charinfo1 = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - n); |
+ const int count = std::min(m_TempCharList.GetSize(), 7); |
+ 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) < TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize() && |
@@ -1862,24 +1880,16 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) |
FX_INT32 i, j; |
i = iCharListStartAppend; |
j = m_TempCharList.GetSize() - 1; |
- PAGECHAR_INFO tempCharInfo; |
- FX_INT32 tempIndex = 0; |
for (; i < j; i++, j--) { |
- tempCharInfo = m_TempCharList[i]; |
- m_TempCharList[i] = m_TempCharList[j]; |
- m_TempCharList[j] = tempCharInfo; |
- tempIndex = m_TempCharList[i].m_Index; |
- m_TempCharList[i].m_Index = m_TempCharList[j].m_Index; |
- m_TempCharList[j].m_Index = tempIndex; |
+ std::swap(m_TempCharList[i], m_TempCharList[j]); |
+ std::swap(m_TempCharList[i].m_Index, m_TempCharList[j].m_Index); |
} |
FX_WCHAR * pTempBuffer = m_TempTextBuf.GetBuffer(); |
i = iBufStartAppend; |
j = m_TempTextBuf.GetLength() - 1; |
FX_WCHAR wTemp; |
for (; i < j; i++, j--) { |
- wTemp = pTempBuffer[i]; |
- pTempBuffer[i] = pTempBuffer[j]; |
- pTempBuffer[j] = wTemp; |
+ std::swap(pTempBuffer[i], pTempBuffer[j]); |
} |
} |
} |