Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2322)

Unified Diff: core/src/fpdftext/fpdf_text_int.cpp

Issue 484503002: Fix hebrew character highlight issue in a special document (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« core/src/fpdftext/fpdf_text.cpp ('K') | « core/src/fpdftext/fpdf_text.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 de4c703a042635d2c195443ac9c1e3398e05dbb7..5b174f0187bf523fe77675d86854f0856b4e25ae 100644
--- a/core/src/fpdftext/fpdf_text_int.cpp
+++ b/core/src/fpdftext/fpdf_text_int.cpp
@@ -1682,6 +1682,53 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj)
baseSpace = 0.0;
}
}
+
+ FX_BOOL bIsBidiAndMirrosInverse = FALSE;
jbreiden 2014/08/18 19:10:50 What does MirrosInverse mean?
+ 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) {
jbreiden 2014/08/18 19:10:49 Same question. Is the character to Unicode mapping
Bo Xu 2014/08/19 03:31:49 Yes, in CFX_WideString CPDF_Font::UnicodeFromCharC
jbreiden 2014/08/22 16:58:44 Okay. If I understand correctly: The PDF files I
+ 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;
+ FX_INT32 iBufStartAppend = m_TempTextBuf.GetLength();
+ FX_INT32 iCharListStartAppend = m_TempCharList.GetSize();
+
for (int i = 0; i < nItems; i++) {
CPDF_TextObjectItem item;
PAGECHAR_INFO charinfo;
@@ -1828,6 +1875,30 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj)
}
}
}
+ if (bIsBidiAndMirrosInverse) {
jbreiden 2014/08/18 19:10:50 Ok, I see what is going on here. The code is rever
Bo Xu 2014/08/19 03:31:49 I wonder do you generate this particular pdf file?
jbreiden 2014/08/22 16:58:44 The PDF file is generated by Tesseract, which is a
+ 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;
+ }
+ 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;
+ }
+ }
}
FX_INT32 CPDF_TextPage::GetTextObjectWritingMode(const CPDF_TextObject* pTextObj)
{
« core/src/fpdftext/fpdf_text.cpp ('K') | « core/src/fpdftext/fpdf_text.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698