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 c69ffc8ee831cd0c5de256082a8562ece5b577c4..ee768af3bc697b6af09e80d4bd20c5fa39042aca 100644 |
--- a/core/src/fpdftext/fpdf_text_int.cpp |
+++ b/core/src/fpdftext/fpdf_text_int.cpp |
@@ -1421,6 +1421,62 @@ void CPDF_TextPage::FindPreviousTextObject(void) { |
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; |
+ 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); |
+ } |
+ FX_WCHAR* pTempBuffer = m_TempTextBuf.GetBuffer(); |
+ i = iBufStartAppend; |
+ j = m_TempTextBuf.GetLength() - 1; |
+ for (; i < j; i++, j--) { |
+ std::swap(pTempBuffer[i], pTempBuffer[j]); |
+ } |
+} |
+FX_BOOL CPDF_TextPage::IsRightToLeft(const CPDF_TextObject* pTextObj, |
+ const CPDF_Font* pFont, |
+ int nItems) const { |
+ nonstd::unique_ptr<CFX_BidiChar> pBidiChar(new CFX_BidiChar); |
+ int32_t nR2L = 0; |
+ int32_t nL2R = 0; |
+ int32_t start = 0, count = 0; |
+ CPDF_TextObjectItem item; |
+ for (int32_t i = 0; i < nItems; i++) { |
+ pTextObj->GetItemInfo(i, &item); |
+ if (item.m_CharCode == (FX_DWORD)-1) { |
+ continue; |
+ } |
+ CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode); |
+ FX_WCHAR wChar = wstrItem.GetAt(0); |
+ if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) { |
+ wChar = (FX_WCHAR)item.m_CharCode; |
+ } |
+ if (!wChar) { |
+ continue; |
+ } |
+ if (pBidiChar->AppendChar(wChar)) { |
+ CFX_BidiChar::Direction ret = pBidiChar->GetBidiInfo(&start, &count); |
+ if (ret == CFX_BidiChar::RIGHT) { |
+ nR2L++; |
+ } else if (ret == CFX_BidiChar::LEFT) { |
+ nL2R++; |
+ } |
+ } |
+ } |
+ if (pBidiChar->EndChar()) { |
+ CFX_BidiChar::Direction ret = pBidiChar->GetBidiInfo(&start, &count); |
+ if (ret == CFX_BidiChar::RIGHT) { |
+ nR2L++; |
+ } else if (ret == CFX_BidiChar::LEFT) { |
+ nL2R++; |
+ } |
+ } |
+ return (nR2L > 0 && nR2L >= nL2R); |
+} |
void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { |
CPDF_TextObject* pTextObj = Obj.m_pTextObj; |
if (FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f) { |
@@ -1525,52 +1581,8 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { |
int nItems = pTextObj->CountItems(); |
FX_FLOAT baseSpace = _CalculateBaseSpace(pTextObj, matrix); |
-#ifndef PDF_ENABLE_XFA |
const FX_BOOL bR2L = IsRightToLeft(pTextObj, pFont, nItems); |
const FX_BOOL bIsBidiAndMirrorInverse = |
-#else |
- FX_BOOL bIsBidiAndMirrosInverse = FALSE; |
- CFX_BidiChar* BidiChar = new CFX_BidiChar; |
- int32_t nR2L = 0; |
- int32_t nL2R = 0; |
- int32_t start = 0, count = 0; |
- CPDF_TextObjectItem item; |
- for (int32_t i = 0; i < nItems; i++) { |
- pTextObj->GetItemInfo(i, &item); |
- if (item.m_CharCode == (FX_DWORD)-1) { |
- continue; |
- } |
- CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode); |
- FX_WCHAR wChar = wstrItem.GetAt(0); |
- if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) { |
- wChar = (FX_WCHAR)item.m_CharCode; |
- } |
- if (!wChar) { |
- continue; |
- } |
- if (BidiChar && BidiChar->AppendChar(wChar)) { |
- CFX_BidiChar::Direction ret = BidiChar->GetBidiInfo(&start, &count); |
- if (ret == CFX_BidiChar::RIGHT) { |
- nR2L++; |
- } else if (ret == CFX_BidiChar::LEFT) { |
- nL2R++; |
- } |
- } |
- } |
- if (BidiChar && BidiChar->EndChar()) { |
- CFX_BidiChar::Direction ret = BidiChar->GetBidiInfo(&start, &count); |
- if (ret == CFX_BidiChar::RIGHT) { |
- nR2L++; |
- } else if (ret == CFX_BidiChar::LEFT) { |
- nL2R++; |
- } |
- } |
- FX_BOOL bR2L = FALSE; |
- if (nR2L > 0 && nR2L >= nL2R) { |
- bR2L = TRUE; |
- } |
- bIsBidiAndMirrosInverse = |
-#endif |
bR2L && (matrix.a * matrix.d - matrix.b * matrix.c) < 0; |
int32_t iBufStartAppend = m_TempTextBuf.GetLength(); |
int32_t iCharListStartAppend = m_TempCharList.GetSize(); |
@@ -1729,86 +1741,10 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj) { |
} |
} |
} |
-#ifndef PDF_ENABLE_XFA |
if (bIsBidiAndMirrorInverse) { |
SwapTempTextBuf(iCharListStartAppend, iBufStartAppend); |
} |
} |
-void CPDF_TextPage::SwapTempTextBuf(int32_t iCharListStartAppend, |
- int32_t iBufStartAppend) { |
- int32_t i, j; |
- i = iCharListStartAppend; |
- j = m_TempCharList.GetSize() - 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); |
- } |
- FX_WCHAR* pTempBuffer = m_TempTextBuf.GetBuffer(); |
- i = iBufStartAppend; |
- j = m_TempTextBuf.GetLength() - 1; |
- for (; i < j; i++, j--) { |
- std::swap(pTempBuffer[i], pTempBuffer[j]); |
- } |
-} |
-FX_BOOL CPDF_TextPage::IsRightToLeft(const CPDF_TextObject* pTextObj, |
- const CPDF_Font* pFont, |
- int nItems) const { |
- nonstd::unique_ptr<CFX_BidiChar> pBidiChar(new CFX_BidiChar); |
- int32_t nR2L = 0; |
- int32_t nL2R = 0; |
- int32_t start = 0, count = 0; |
- CPDF_TextObjectItem item; |
- for (int32_t i = 0; i < nItems; i++) { |
- pTextObj->GetItemInfo(i, &item); |
- if (item.m_CharCode == (FX_DWORD)-1) { |
- continue; |
- } |
- CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode); |
- FX_WCHAR wChar = wstrItem.GetAt(0); |
- if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) { |
- wChar = (FX_WCHAR)item.m_CharCode; |
-#else |
- if (bIsBidiAndMirrosInverse) { |
- int32_t i, j; |
- i = iCharListStartAppend; |
- j = m_TempCharList.GetSize() - 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); |
-#endif |
- } |
-#ifndef PDF_ENABLE_XFA |
- if (!wChar) { |
- continue; |
- } |
- if (pBidiChar->AppendChar(wChar)) { |
- CFX_BidiChar::Direction ret = pBidiChar->GetBidiInfo(&start, &count); |
- if (ret == CFX_BidiChar::RIGHT) { |
- nR2L++; |
- } else if (ret == CFX_BidiChar::LEFT) { |
- nL2R++; |
- } |
- } |
- } |
- if (pBidiChar->EndChar()) { |
- CFX_BidiChar::Direction ret = pBidiChar->GetBidiInfo(&start, &count); |
- if (ret == CFX_BidiChar::RIGHT) { |
- nR2L++; |
- } else if (ret == CFX_BidiChar::LEFT) { |
- nL2R++; |
-#else |
- FX_WCHAR* pTempBuffer = m_TempTextBuf.GetBuffer(); |
- i = iBufStartAppend; |
- j = m_TempTextBuf.GetLength() - 1; |
- for (; i < j; i++, j--) { |
- std::swap(pTempBuffer[i], pTempBuffer[j]); |
-#endif |
- } |
- } |
-#ifndef PDF_ENABLE_XFA |
- return (nR2L > 0 && nR2L >= nL2R); |
-#endif |
-} |
int32_t CPDF_TextPage::GetTextObjectWritingMode( |
const CPDF_TextObject* pTextObj) { |
int32_t nChars = pTextObj->CountChars(); |