summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/fpdftext/fpdf_text_int.cpp120
-rw-r--r--core/src/fpdftext/text_int.h5
2 files changed, 70 insertions, 55 deletions
diff --git a/core/src/fpdftext/fpdf_text_int.cpp b/core/src/fpdftext/fpdf_text_int.cpp
index 4650272e4c..c9cfbdda2d 100644
--- a/core/src/fpdftext/fpdf_text_int.cpp
+++ b/core/src/fpdftext/fpdf_text_int.cpp
@@ -1690,49 +1690,9 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj)
int nItems = pTextObj->CountItems();
FX_FLOAT baseSpace = _CalculateBaseSpace(pTextObj, matrix);
- FX_BOOL bIsBidiAndMirrosInverse = FALSE;
- IFX_BidiChar* BidiChar = IFX_BidiChar::Create();
- FX_INT32 nR2L = 0;
- FX_INT32 nL2R = 0;
- FX_INT32 start = 0, count = 0;
- CPDF_TextObjectItem item;
- for (FX_INT32 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)) {
- FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
- if (ret == 2) {
- nR2L++;
- }
- else if (ret == 1) {
- nL2R++;
- }
- }
- }
- if (BidiChar && BidiChar->EndChar()) {
- FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
- if (ret == 2) {
- nR2L++;
- }
- else if (ret == 1) {
- nL2R++;
- }
- }
- FX_BOOL bR2L = FALSE;
- if (nR2L > 0 && nR2L >= nL2R) {
- bR2L = TRUE;
- }
- bIsBidiAndMirrosInverse = bR2L && (matrix.a * matrix.d - matrix.b * matrix.c) < 0;
+ const FX_BOOL bR2L = IsRightToLeft(pTextObj, pFont, nItems);
+ const FX_BOOL bIsBidiAndMirrorInverse =
+ bR2L && (matrix.a * matrix.d - matrix.b * matrix.c) < 0;
FX_INT32 iBufStartAppend = m_TempTextBuf.GetLength();
FX_INT32 iCharListStartAppend = m_TempCharList.GetSize();
@@ -1877,21 +1837,71 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj)
}
}
}
- if (bIsBidiAndMirrosInverse) {
- FX_INT32 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);
+ if (bIsBidiAndMirrorInverse) {
+ SwapTempTextBuf(iCharListStartAppend, iBufStartAppend);
+ }
+}
+void CPDF_TextPage::SwapTempTextBuf(FX_INT32 iCharListStartAppend,
+ FX_INT32 iBufStartAppend)
+{
+ FX_INT32 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
+{
+ IFX_BidiChar* BidiChar = IFX_BidiChar::Create();
+ FX_INT32 nR2L = 0;
+ FX_INT32 nL2R = 0;
+ FX_INT32 start = 0, count = 0;
+ CPDF_TextObjectItem item;
+ for (FX_INT32 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;
}
- FX_WCHAR * pTempBuffer = m_TempTextBuf.GetBuffer();
- i = iBufStartAppend;
- j = m_TempTextBuf.GetLength() - 1;
- for (; i < j; i++, j--) {
- std::swap(pTempBuffer[i], pTempBuffer[j]);
+ if (!wChar) {
+ continue;
+ }
+ if (BidiChar && BidiChar->AppendChar(wChar)) {
+ FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+ if (ret == 2) {
+ nR2L++;
+ }
+ else if (ret == 1) {
+ nL2R++;
+ }
+ }
+ }
+ if (BidiChar && BidiChar->EndChar()) {
+ FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+ if (ret == 2) {
+ nR2L++;
+ }
+ else if (ret == 1) {
+ nL2R++;
}
}
+ if (BidiChar)
+ BidiChar->Release();
+ return (nR2L > 0 && nR2L >= nL2R);
}
FX_INT32 CPDF_TextPage::GetTextObjectWritingMode(const CPDF_TextObject* pTextObj)
{
diff --git a/core/src/fpdftext/text_int.h b/core/src/fpdftext/text_int.h
index 65ffddea0a..c3f3b7108e 100644
--- a/core/src/fpdftext/text_int.h
+++ b/core/src/fpdftext/text_int.h
@@ -115,6 +115,11 @@ private:
void AddCharInfoByRLDirection(CFX_WideString& str, int i);
FX_INT32 GetTextObjectWritingMode(const CPDF_TextObject* pTextObj);
FX_INT32 FindTextlineFlowDirection();
+ void SwapTempTextBuf(FX_INT32 iCharListStartAppend,
+ FX_INT32 iBufStartAppend);
+ FX_BOOL IsRightToLeft(const CPDF_TextObject* pTextObj,
+ const CPDF_Font* pFont,
+ int nItems) const;
protected:
CPDFText_ParseOptions m_ParseOptions;
CFX_WordArray m_CharIndex;