Cleanup: Refactor some code into its own function in fpdf_text_int.cpp.
[pdfium.git] / core / src / fpdftext / fpdf_text_int.cpp
index 8736575..7a8e029 100644 (file)
 #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)
 {
@@ -68,10 +114,10 @@ IPDF_LinkExtract* IPDF_LinkExtract::CreateLinkExtract()
 #define  TEXT_LINEFEED                 L"\n"
 #define         TEXT_CHARRATIO_GAPDELTA        0.070
 CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags)
-    : m_pPreTextObj(NULL),
-      m_IsParsered(FALSE),
-      m_charList(512),
+    : m_charList(512),
       m_TempCharList(50),
+      m_pPreTextObj(NULL),
+      m_IsParsered(FALSE),
       m_TextlineDir(-1),
       m_CurlineRect(0, 0, 0, 0)
 {
@@ -81,13 +127,13 @@ CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags)
     pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);
 }
 CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)
-    : m_pPreTextObj(NULL)
-    , m_IsParsered(FALSE)
+    : m_ParseOptions(ParserOptions)
     , m_charList(512)
     , m_TempCharList(50)
+    , m_pPreTextObj(NULL)
+    , m_IsParsered(FALSE)
     , m_TextlineDir(-1)
     , m_CurlineRect(0, 0, 0, 0)
-    , m_ParseOptions(ParserOptions)
 {
     m_pPage = pPage;
     m_parserflag = 0;
@@ -95,10 +141,10 @@ CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions Parse
     pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);
 }
 CPDF_TextPage::CPDF_TextPage(const CPDF_PageObjects* pPage, int flags)
-    : m_pPreTextObj(NULL),
-      m_IsParsered(FALSE),
-      m_charList(512),
+    : m_charList(512),
       m_TempCharList(50),
+      m_pPreTextObj(NULL),
+      m_IsParsered(FALSE),
       m_TextlineDir(-1),
       m_CurlineRect(0, 0, 0, 0)
 {
@@ -160,11 +206,7 @@ FX_BOOL CPDF_TextPage::ParseTextPage()
             if(charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) {
                 bNormal = TRUE;
             }
-#ifdef FOXIT_CHROME_BUILD
             else if(charinfo.m_Unicode == 0 || IsControlChar(&charinfo))
-#else
-            else if(charinfo.m_Unicode == 0)
-#endif
                 bNormal = FALSE;
             else {
                 bNormal = TRUE;
@@ -318,7 +360,6 @@ int CPDF_TextPage::GetIndexAtPos(CPDF_Point point , FX_FLOAT xTorelance, FX_FLOA
     if (!m_IsParsered) {
         return -3;
     }
-    FX_FLOAT distance = 0;
     int pos = 0;
     int NearPos = -1;
     double xdif = 5000, ydif = 5000;
@@ -353,7 +394,7 @@ int CPDF_TextPage::GetIndexAtPos(CPDF_Point point , FX_FLOAT xTorelance, FX_FLOA
     }
     return pos;
 }
-CFX_WideString CPDF_TextPage::GetTextByRect(CFX_FloatRect rect) const
+CFX_WideString CPDF_TextPage::GetTextByRect(const CFX_FloatRect& rect) const
 {
     CFX_WideString strText;
     if(m_ParseOptions.m_bGetCharCodeOnly || !m_IsParsered) {
@@ -391,7 +432,7 @@ CFX_WideString CPDF_TextPage::GetTextByRect(CFX_FloatRect rect) const
     }
     return strText;
 }
-void CPDF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const
+void CPDF_TextPage::GetRectsArrayByRect(const CFX_FloatRect& rect, CFX_RectArray& resRectArray) const
 {
     if(m_ParseOptions.m_bGetCharCodeOnly) {
         return;
@@ -409,9 +450,6 @@ void CPDF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRe
         if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
             continue;
         }
-        if(pos == 494) {
-            int a = 0;
-        }
         if (IsRectIntersect(rect, info_curchar.m_CharBox)) {
             if(!pCurObj) {
                 pCurObj = info_curchar.m_pTextObj;
@@ -767,7 +805,7 @@ FX_BOOL CPDF_TextPage::GetBaselineRotate(int start, int end, int& Rotate)
     }
     return TRUE;
 }
-FX_BOOL        CPDF_TextPage::GetBaselineRotate(CFX_FloatRect rect , int& Rotate)
+FX_BOOL        CPDF_TextPage::GetBaselineRotate(const CFX_FloatRect& rect , int& Rotate)
 {
     if(m_ParseOptions.m_bGetCharCodeOnly) {
         return FALSE;
@@ -816,9 +854,6 @@ int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT ri
     FX_BOOL            segmentStatus = 0;
     FX_BOOL            IsContainPreChar = FALSE;
     while (pos < nCount) {
-        if(pos == 493) {
-            int a = 0;
-        }
         PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos);
         if(bContains && rect.Contains(charinfo.m_CharBox)) {
             if (segmentStatus == 0 || segmentStatus == 2) {
@@ -1043,9 +1078,6 @@ void CPDF_TextPage::ProcessObject()
         pPageObj = m_pPage->GetNextObject(pos);
         if(pPageObj) {
             if(pPageObj->m_Type == PDFPAGE_TEXT) {
-                if (nCount == 3) {
-                    nCount = nCount;
-                }
                 CFX_AffineMatrix matrix;
                 ProcessTextObject((CPDF_TextObject*)pPageObj, matrix, pos);
                 nCount++;
@@ -1063,7 +1095,7 @@ void CPDF_TextPage::ProcessObject()
     m_LineObj.RemoveAll();
     CloseTempLine();
 }
-void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, CFX_AffineMatrix formMatrix)
+void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, const CFX_AffineMatrix& formMatrix)
 {
     CPDF_PageObject*   pPageObj = NULL;
     FX_POSITION        pos;
@@ -1128,11 +1160,7 @@ void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i)
 {
     PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
     FX_WCHAR wChar = str.GetAt(i);
-#ifdef FOXIT_CHROME_BUILD
     if(!IsControlChar(&Info)) {
-#else
-    if(wChar != 0xfffe) {
-#endif
         Info.m_Index = m_TextBuf.GetLength();
         if (wChar >= 0xFB00 && wChar <= 0xFB06) {
             FX_LPWSTR pDst = NULL;
@@ -1167,11 +1195,7 @@ void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i)
 void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i)
 {
     PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
-#ifdef FOXIT_CHROME_BUILD
     if(!IsControlChar(&Info)) {
-#else
-    if(str.GetAt(i) != 0xfffe) {
-#endif
         Info.m_Index = m_TextBuf.GetLength();
         FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE);
         FX_LPWSTR pDst = NULL;
@@ -1214,16 +1238,16 @@ void CPDF_TextPage::CloseTempLine()
     CFX_WideString str = m_TempTextBuf.GetWideString();
     CFX_WordArray order;
     FX_BOOL bR2L = FALSE;
-    FX_INT32 start = 0, count = 0, i = 0;
+    FX_INT32 start = 0, count = 0;
     int nR2L = 0, nL2R = 0;
     FX_BOOL bPrevSpace = FALSE;
-    for (i = 0; i < str.GetLength(); i++) {
+    for (int i = 0; i < str.GetLength(); i++) {
         if(str.GetAt(i) == 32) {
             if(bPrevSpace) {
                 m_TempTextBuf.Delete(i, 1);
                 m_TempCharList.Delete(i);
                 str.Delete(i);
-                count1 --;
+                count1--;
                 i--;
                 continue;
             }
@@ -1263,37 +1287,36 @@ void CPDF_TextPage::CloseTempLine()
     }
     if(this->m_parserflag == FPDFTEXT_RLTB || bR2L) {
         int count = order.GetSize();
-        for(int j = count - 1; j > 0; j -= 3) {
-            int ret = order.GetAt(j);
-            int start = order.GetAt(j - 2);
-            int count1 = order.GetAt(j - 1);
+        for(int i = count - 1; i > 0; i -= 3) {
+            int ret = order.GetAt(i);
+            int start = order.GetAt(i - 2);
+            int count1 = order.GetAt(i - 1);
             if(ret == 2 || ret == 0) {
-                for(int i = start + count1 - 1; i >= start; i--) {
-                    AddCharInfoByRLDirection(str, i);
+                for(int j = start + count1 - 1; j >= start; j--) {
+                    AddCharInfoByRLDirection(str, j);
                 }
             } else {
-                i = j;
+                int j = i;
                 FX_BOOL bSymbol = FALSE;
-                while(i > 0 && order.GetAt(i) != 2) {
-                    bSymbol = !order.GetAt(i);
-                    i -= 3;
+                while(j > 0 && order.GetAt(j) != 2) {
+                    bSymbol = !order.GetAt(j);
+                    j -= 3;
                 }
                 int end = start + count1 ;
                 int n = 0;
                 if(bSymbol) {
-                    n = i + 6;
+                    n = j + 6;
                 } else {
-                    n = i + 3;
+                    n = j + 3;
                 }
-                if(n >= j) {
+                if(n >= i) {
                     for(int m = start; m < end; m++) {
                         AddCharInfoByLRDirection(str, m);
                     }
                 } else {
-                    i = j;
-                    j = n;
-                    for(; n <= i; n += 3) {
-                        int ret = order.GetAt(n);
+                    j = i;
+                    i = n;
+                    for(; n <= j; n += 3) {
                         int start = order.GetAt(n - 2);
                         int count1 = order.GetAt(n - 1);
                         int end = start + count1 ;
@@ -1307,36 +1330,36 @@ void CPDF_TextPage::CloseTempLine()
     } else {
         int count = order.GetSize();
         FX_BOOL bL2R = FALSE;
-        for(int j = 0; j < count; j += 3) {
-            int ret = order.GetAt(j + 2);
-            int start = order.GetAt(j);
-            int count1 = order.GetAt(j + 1);
-            if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) {
-                int i = j + 3;
-                while(bR2L && i < count) {
-                    if(order.GetAt(i + 2) == 1) {
+        for(int i = 0; i < count; i += 3) {
+            int ret = order.GetAt(i + 2);
+            int start = order.GetAt(i);
+            int count1 = order.GetAt(i + 1);
+            if(ret == 2 || (i == 0 && ret == 0 && !bL2R)) {
+                int j = i + 3;
+                while(bR2L && j < count) {
+                    if(order.GetAt(j + 2) == 1) {
                         break;
                     } else {
-                        i += 3;
+                        j += 3;
                     }
                 }
-                if(i == 3) {
-                    j = -3;
+                if(j == 3) {
+                    i = -3;
                     bL2R = TRUE;
                     continue;
                 }
                 int end = m_TempCharList.GetSize() - 1;
-                if(i < count) {
-                    end = order.GetAt(i) - 1;
+                if(j < count) {
+                    end = order.GetAt(j) - 1;
                 }
-                j = i - 3;
+                i = j - 3;
                 for(int n = end; n >= start; n--) {
                     AddCharInfoByRLDirection(str, n);
                 }
             } else {
                 int end = start + count1 ;
-                for(int i = start; i < end; i++) {
-                    AddCharInfoByLRDirection(str, i);
+                for(int n = start; n < end; n++) {
+                    AddCharInfoByLRDirection(str, n);
                 }
             }
         }
@@ -1348,7 +1371,7 @@ void CPDF_TextPage::CloseTempLine()
     m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength());
     BidiChar->Release();
 }
-void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj, CFX_AffineMatrix formMatrix, FX_POSITION ObjPos)
+void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj, const CFX_AffineMatrix& formMatrix, FX_POSITION ObjPos)
 {
     CFX_FloatRect re(pTextObj->m_Left, pTextObj->m_Bottom, pTextObj->m_Right, pTextObj->m_Top);
     if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {
@@ -1480,8 +1503,8 @@ FX_INT32 CPDF_TextPage::PreMarkedContent(PDFTEXT_Obj Obj)
         return FPDFTEXT_MC_PASS;
     }
     bExist = FALSE;
-    for (FX_STRSIZE j = 0; j < nItems; j++) {
-        FX_WCHAR wChar = actText.GetAt(j);
+    for (FX_STRSIZE i = 0; i < nItems; i++) {
+        FX_WCHAR wChar = actText.GetAt(i);
         if ((wChar > 0x80 && wChar < 0xFFFD) || (wChar <= 0x80 && isprint(wChar))) {
             bExist = TRUE;
             break;
@@ -1510,7 +1533,7 @@ void CPDF_TextPage::ProcessMarkedContent(PDFTEXT_Obj Obj)
         CPDF_ContentMarkItem& item = pMarkData->GetItem(n);
         CFX_ByteString tagStr = (CFX_ByteString)item.GetName();
         pDict = (CPDF_Dictionary*)item.GetParam();
-        CPDF_String* temp = (CPDF_String*)pDict->GetElement(FX_BSTRC("ActualText"));
+        CPDF_String* temp = (CPDF_String*)(pDict ? pDict->GetElement(FX_BSTRC("ActualText")) : NULL);
         if (temp) {
             actText = temp->GetUnicodeText();
         }
@@ -1649,14 +1672,9 @@ void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj)
             }
             PAGECHAR_INFO* cha = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);
             m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
-#ifdef FOXIT_CHROME_BUILD
             cha->m_Unicode = 0x2;
             cha->m_Flag = FPDFTEXT_CHAR_HYPHEN;
             m_TempTextBuf.AppendChar(0xfffe);
-#else
-            cha->m_Unicode = 0;
-            m_TempTextBuf.AppendChar(0xfffe);
-#endif
         }
     } else {
         m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);
@@ -1670,29 +1688,55 @@ 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;
+    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++;
             }
         }
-        spacing = 0;
-        if(baseSpace < 0.0 || (nItems == 3 && !bAllChar)) {
-            baseSpace = 0.0;
+    }
+    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();
+
+    FX_FLOAT spacing = 0;
     for (int i = 0; i < nItems; i++) {
         CPDF_TextObjectItem item;
         PAGECHAR_INFO charinfo;
@@ -1735,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) ) {
@@ -1806,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()  &&
@@ -1839,6 +1876,22 @@ 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);
+        }
+        FX_WCHAR * pTempBuffer = m_TempTextBuf.GetBuffer();
+        i = iBufStartAppend;
+        j = m_TempTextBuf.GetLength() - 1;
+        FX_WCHAR wTemp;
+        for (; i < j; i++, j--) {
+            std::swap(pTempBuffer[i], pTempBuffer[j]);
+        }
+    }
 }
 FX_INT32 CPDF_TextPage::GetTextObjectWritingMode(const CPDF_TextObject* pTextObj)
 {
@@ -1909,7 +1962,7 @@ FX_BOOL CPDF_TextPage::IsHyphen(FX_WCHAR curChar)
     }
     return FALSE;
 }
-int CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix)
+int CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, const CFX_AffineMatrix& formMatrix)
 {
     FindPreviousTextObject();
     FX_BOOL bNewline = FALSE;
@@ -2155,13 +2208,11 @@ FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info)
     info.m_CharBox = CFX_FloatRect(info.m_OriginX, info.m_OriginY, info.m_OriginX, info.m_OriginY);
     return TRUE;
 }
-FX_BOOL CPDF_TextPage::IsRectIntersect(CFX_FloatRect rect1, CFX_FloatRect rect2)
+FX_BOOL CPDF_TextPage::IsRectIntersect(const CFX_FloatRect& rect1, const CFX_FloatRect& rect2)
 {
-    rect1.Intersect(rect2);
-    if(rect1.IsEmpty()) {
-        return FALSE;
-    }
-    return TRUE;
+    CFX_FloatRect rect = rect1;
+    rect.Intersect(rect2);
+    return !rect.IsEmpty();
 }
 FX_BOOL        CPDF_TextPage::IsLetter(FX_WCHAR unicode)
 {
@@ -2177,13 +2228,12 @@ FX_BOOL CPDF_TextPage::IsLetter(FX_WCHAR unicode)
     return TRUE;
 }
 CPDF_TextPageFind::CPDF_TextPageFind(const IPDF_TextPage* pTextPage)
-    : m_IsFind(FALSE),
-      m_pTextPage(NULL)
+    : m_pTextPage(NULL),
+      m_IsFind(FALSE)
 {
     if (!pTextPage) {
         return;
     }
-    CPDF_ModuleMgr* pPDFModule = CPDF_ModuleMgr::Get();
     m_pTextPage = pTextPage;
     m_strText = m_pTextPage->GetPageText();
     int nCount = pTextPage->CountChars();
@@ -2234,7 +2284,7 @@ int CPDF_TextPageFind::GetCharIndex(int index) const
     }
     return -1;
 }
-FX_BOOL        CPDF_TextPageFind::FindFirst(CFX_WideString findwhat, int flags, int startPos)
+FX_BOOL        CPDF_TextPageFind::FindFirst(const CFX_WideString& findwhat, int flags, int startPos)
 {
     if (!m_pTextPage) {
         return FALSE;
@@ -2242,16 +2292,17 @@ FX_BOOL CPDF_TextPageFind::FindFirst(CFX_WideString findwhat, int flags, int sta
     if (m_strText.IsEmpty() || m_bMatchCase != (flags & FPDFTEXT_MATCHCASE)) {
         m_strText = m_pTextPage->GetPageText();
     }
-    m_findWhat = findwhat;
+    CFX_WideString findwhatStr = findwhat;
+    m_findWhat = findwhatStr;
     m_flags = flags;
     m_bMatchCase = flags & FPDFTEXT_MATCHCASE;
     if (m_strText.IsEmpty()) {
         m_IsFind = FALSE;
         return TRUE;
     }
-    FX_STRSIZE len = findwhat.GetLength();
+    FX_STRSIZE len = findwhatStr.GetLength();
     if (!m_bMatchCase) {
-        findwhat.MakeLower();
+        findwhatStr.MakeLower();
         m_strText.MakeLower();
     }
     m_bMatchWholeWord = flags & FPDFTEXT_MATCHWHOLEWORD;
@@ -2264,15 +2315,15 @@ FX_BOOL CPDF_TextPageFind::FindFirst(CFX_WideString findwhat, int flags, int sta
     m_csFindWhatArray.RemoveAll();
     int i = 0;
     while(i < len) {
-        if(findwhat.GetAt(i) != ' ') {
+        if(findwhatStr.GetAt(i) != ' ') {
             break;
         }
         i++;
     }
     if(i < len) {
-        ExtractFindWhat(findwhat);
+        ExtractFindWhat(findwhatStr);
     } else {
-        m_csFindWhatArray.Add(findwhat);
+        m_csFindWhatArray.Add(findwhatStr);
     }
     if(m_csFindWhatArray.GetSize() <= 0) {
         return FALSE;
@@ -2430,7 +2481,7 @@ FX_BOOL CPDF_TextPageFind::FindPrev()
     }
     return m_IsFind;
 }
-void CPDF_TextPageFind::ExtractFindWhat(CFX_WideString findwhat)
+void CPDF_TextPageFind::ExtractFindWhat(const CFX_WideString& findwhat)
 {
     if(findwhat.IsEmpty()) {
         return ;
@@ -2483,7 +2534,7 @@ void CPDF_TextPageFind::ExtractFindWhat(CFX_WideString findwhat)
     }
     return;
 }
-FX_BOOL CPDF_TextPageFind::IsMatchWholeWord(CFX_WideString csPageText, int startPos, int endPos)
+FX_BOOL CPDF_TextPageFind::IsMatchWholeWord(const CFX_WideString& csPageText, int startPos, int endPos)
 {
     int char_left = 0;
     int char_right = 0;
@@ -2500,9 +2551,6 @@ FX_BOOL CPDF_TextPageFind::IsMatchWholeWord(CFX_WideString csPageText, int start
     if(startPos + char_count < csPageText.GetLength()) {
         char_right = csPageText.GetAt(startPos + char_count);
     }
-    if(char_left == 0x61) {
-        int a = 0;
-    }
     if ((char_left > 'A' && char_left < 'a') || (char_left > 'a' && char_left < 'z') || (char_left > 0xfb00 && char_left < 0xfb06) || (char_left >= '0' && char_left <= '9') ||
             (char_right > 'A' && char_right < 'a') || (char_right > 'a' && char_right < 'z') || (char_right > 0xfb00 && char_right < 0xfb06) || (char_right >= '0' && char_right <= '9')) {
         return FALSE;
@@ -2546,7 +2594,7 @@ FX_BOOL CPDF_TextPageFind::ExtractSubString(CFX_WideString& rString, FX_LPCWSTR
     rString.ReleaseBuffer();
     return TRUE;
 }
-CFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString str)
+CFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString& str)
 {
     CFX_WideString str2;
     str2.Empty();
@@ -2749,7 +2797,7 @@ FX_BOOL CPDF_LinkExtract::CheckMailLink(CFX_WideString& str)
     }
     return TRUE;
 }
-FX_BOOL CPDF_LinkExtract::AppendToLinkList(int start, int count, CFX_WideString strUrl)
+FX_BOOL CPDF_LinkExtract::AppendToLinkList(int start, int count, const CFX_WideString& strUrl)
 {
     CPDF_LinkExt* linkInfo = NULL;
     linkInfo = FX_NEW CPDF_LinkExt;