// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include <ctype.h>
#include <algorithm>

#include "../../../third_party/base/nonstd_unique_ptr.h"
#include "../../include/fpdfapi/fpdf_module.h"
#include "../../include/fpdfapi/fpdf_page.h"
#include "../../include/fpdfapi/fpdf_pageobj.h"
#include "../../include/fpdfapi/fpdf_resource.h"
#include "../../include/fpdftext/fpdf_text.h"
#include "../../include/fxcrt/fx_arb.h"
#include "../../include/fxcrt/fx_ucd.h"
#include "text_int.h"

namespace {

FX_BOOL _IsIgnoreSpaceCharacter(FX_WCHAR curChar)
{
    if(curChar < 255 ) {
        return FALSE;
    }
    if ( (curChar >= 0x0600 && curChar <= 0x06FF)
            || (curChar >= 0xFE70 && curChar <= 0xFEFF)
            || (curChar >= 0xFB50 && curChar <= 0xFDFF)
            || (curChar >= 0x0400 && curChar <= 0x04FF)
            || (curChar >= 0x0500 && curChar <= 0x052F)
            || (curChar >= 0xA640 && curChar <= 0xA69F)
            || (curChar >= 0x2DE0 && curChar <= 0x2DFF)
            || curChar == 8467
            || (curChar >= 0x2000 && curChar <= 0x206F)) {
        return FALSE;
    }
    return TRUE;
}

FX_FLOAT _NormalizeThreshold(FX_FLOAT threshold)
{
    if (threshold < 300) {
        return threshold / 2.0f;
    }
    if (threshold < 500) {
        return threshold / 4.0f;
    }
    if (threshold < 700) {
        return threshold / 5.0f;
    }
    return threshold / 6.0f;
}

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)
{
}
IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)
{
    return new CPDF_TextPage(pPage, ParserOptions);
}
IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, int flags)
{
    return new CPDF_TextPage(pPage, flags);
}
IPDF_TextPage*	IPDF_TextPage::CreateTextPage(const CPDF_PageObjects* pObjs, int flags)
{
    return new CPDF_TextPage(pObjs, flags);
}
IPDF_TextPageFind*	IPDF_TextPageFind::CreatePageFind(const IPDF_TextPage* pTextPage)
{
    if (!pTextPage) {
        return NULL;
    }
    return new CPDF_TextPageFind(pTextPage);
}
IPDF_LinkExtract* IPDF_LinkExtract::CreateLinkExtract()
{
    return new CPDF_LinkExtract();
}
#define  TEXT_BLANK_CHAR		L' '
#define  TEXT_LINEFEED_CHAR		L'\n'
#define	 TEXT_RETURN_CHAR		L'\r'
#define  TEXT_EMPTY				L""
#define  TEXT_BLANK				L" "
#define  TEXT_RETURN_LINEFEED	L"\r\n"
#define  TEXT_LINEFEED			L"\n"
#define	 TEXT_CHARRATIO_GAPDELTA	0.070
CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags)
    : m_charList(512),
      m_TempCharList(50),
      m_pPreTextObj(NULL),
      m_IsParsered(FALSE),
      m_TextlineDir(-1),
      m_CurlineRect(0, 0, 0, 0)
{
    m_pPage = pPage;
    m_parserflag = flags;
    m_TextBuf.EstimateSize(0, 10240);
    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_ParseOptions(ParserOptions)
    , m_charList(512)
    , m_TempCharList(50)
    , m_pPreTextObj(NULL)
    , m_IsParsered(FALSE)
    , m_TextlineDir(-1)
    , m_CurlineRect(0, 0, 0, 0)
{
    m_pPage = pPage;
    m_parserflag = 0;
    m_TextBuf.EstimateSize(0, 10240);
    pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);
}
CPDF_TextPage::CPDF_TextPage(const CPDF_PageObjects* pPage, int flags)
    : m_charList(512),
      m_TempCharList(50),
      m_pPreTextObj(NULL),
      m_IsParsered(FALSE),
      m_TextlineDir(-1),
      m_CurlineRect(0, 0, 0, 0)
{
    m_pPage = pPage;
    m_parserflag = flags;
    m_TextBuf.EstimateSize(0, 10240);
    CFX_FloatRect pageRect = pPage->CalcBoundingBox();
    m_DisplayMatrix = CFX_AffineMatrix(1, 0, 0, -1, pageRect.right, pageRect.top);
}
void CPDF_TextPage::NormalizeObjects(FX_BOOL bNormalize)
{
    m_ParseOptions.m_bNormalizeObjs = bNormalize;
}
bool CPDF_TextPage::IsControlChar(const PAGECHAR_INFO& charInfo)
{
    switch (charInfo.m_Unicode) {
        case 0x2:
        case 0x3:
        case 0x93:
        case 0x94:
        case 0x96:
        case 0x97:
        case 0x98:
        case 0xfffe:
            return charInfo.m_Flag != FPDFTEXT_CHAR_HYPHEN;
        default:
            return false;
    }
}
FX_BOOL CPDF_TextPage::ParseTextPage()
{
    if (!m_pPage) {
        m_IsParsered = FALSE;
        return FALSE;
    }
    m_IsParsered = FALSE;
    m_TextBuf.Clear();
    m_charList.RemoveAll();
    m_pPreTextObj = NULL;
    ProcessObject();
    m_IsParsered = TRUE;
    if(!m_ParseOptions.m_bGetCharCodeOnly) {
        m_CharIndex.RemoveAll();
        int nCount = m_charList.GetSize();
        if(nCount) {
            m_CharIndex.Add(0);
        }
        for(int i = 0; i < nCount; i++) {
            int indexSize = m_CharIndex.GetSize();
            FX_BOOL bNormal = FALSE;
            PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(i);
            if(charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) {
                bNormal = TRUE;
            }
            else if(charinfo.m_Unicode == 0 || IsControlChar(charinfo))
                bNormal = FALSE;
            else {
                bNormal = TRUE;
            }
            if(bNormal) {
                if(indexSize % 2) {
                    m_CharIndex.Add(1);
                } else {
                    if(indexSize <= 0) {
                        continue;
                    }
                    m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);
                }
            } else {
                if(indexSize % 2) {
                    if(indexSize <= 0) {
                        continue;
                    }
                    m_CharIndex.SetAt(indexSize - 1, i + 1);
                } else {
                    m_CharIndex.Add(i + 1);
                }
            }
        }
        int indexSize = m_CharIndex.GetSize();
        if(indexSize % 2) {
            m_CharIndex.RemoveAt(indexSize - 1);
        }
    }
    return TRUE;
}
int	CPDF_TextPage::CountChars() const
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return m_TextBuf.GetSize();
    }
    return m_charList.GetSize();
}
int CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const
{
    int indexSize = m_CharIndex.GetSize();
    int count = 0;
    for(int i = 0; i < indexSize; i += 2) {
        count += m_CharIndex.GetAt(i + 1);
        if(count > TextIndex) {
            return 	TextIndex - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);
        }
    }
    return -1;
}
int CPDF_TextPage::TextIndexFromCharIndex(int CharIndex) const
{
    int indexSize = m_CharIndex.GetSize();
    int count = 0;
    for(int i = 0; i < indexSize; i += 2) {
        count += m_CharIndex.GetAt(i + 1);
        if(m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i) > CharIndex) {
            if(CharIndex - m_CharIndex.GetAt(i) < 0) {
                return -1;
            }
            return 	CharIndex - m_CharIndex.GetAt(i) + count - m_CharIndex.GetAt(i + 1);
        }
    }
    return -1;
}
void CPDF_TextPage::GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return;
    }
    if(start < 0 || nCount == 0) {
        return;
    }
    if (!m_IsParsered)	{
        return;
    }
    PAGECHAR_INFO		info_curchar;
    CPDF_TextObject*	pCurObj = NULL;
    CFX_FloatRect		rect;
    int					curPos = start;
    FX_BOOL				flagNewRect = TRUE;
    if (nCount + start > m_charList.GetSize() || nCount == -1) {
        nCount = m_charList.GetSize() - start;
    }
    while (nCount--) {
        info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(curPos++);
        if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
            continue;
        }
        if(info_curchar.m_CharBox.Width() < 0.01 || info_curchar.m_CharBox.Height() < 0.01) {
            continue;
        }
        if(!pCurObj) {
            pCurObj = info_curchar.m_pTextObj;
        }
        if (pCurObj != info_curchar.m_pTextObj) {
            rectArray.Add(rect);
            pCurObj = info_curchar.m_pTextObj;
            flagNewRect = TRUE;
        }
        if (flagNewRect) {
            FX_FLOAT orgX = info_curchar.m_OriginX, orgY = info_curchar.m_OriginY;
            CFX_AffineMatrix matrix, matrix_reverse;
            info_curchar.m_pTextObj->GetTextMatrix(&matrix);
            matrix.Concat(info_curchar.m_Matrix);
            matrix_reverse.SetReverse(matrix);
            matrix_reverse.Transform(orgX, orgY);
            rect.left = info_curchar.m_CharBox.left;
            rect.right = info_curchar.m_CharBox.right;
            if (pCurObj->GetFont()->GetTypeDescent()) {
                rect.bottom = orgY + pCurObj->GetFont()->GetTypeDescent() * pCurObj->GetFontSize() / 1000;
                FX_FLOAT xPosTemp = orgX;
                matrix.Transform(xPosTemp, rect.bottom);
            } else {
                rect.bottom = info_curchar.m_CharBox.bottom;
            }
            if (pCurObj->GetFont()->GetTypeAscent()) {
                rect.top = orgY + pCurObj->GetFont()->GetTypeAscent() * pCurObj->GetFontSize() / 1000;
                FX_FLOAT xPosTemp = orgX + GetCharWidth(info_curchar.m_CharCode, pCurObj->GetFont()) * pCurObj->GetFontSize() / 1000;
                matrix.Transform(xPosTemp, rect.top);
            } else {
                rect.top = info_curchar.m_CharBox.top;
            }
            flagNewRect = FALSE;
            rect = info_curchar.m_CharBox;
            rect.Normalize();
        } else {
            info_curchar.m_CharBox.Normalize();
            if (rect.left > info_curchar.m_CharBox.left) {
                rect.left = info_curchar.m_CharBox.left;
            }
            if (rect.right < info_curchar.m_CharBox.right) {
                rect.right = info_curchar.m_CharBox.right;
            }
            if ( rect.top < info_curchar.m_CharBox.top) {
                rect.top = info_curchar.m_CharBox.top;
            }
            if (rect.bottom > info_curchar.m_CharBox.bottom) {
                rect.bottom = info_curchar.m_CharBox.bottom;
            }
        }
    }
    rectArray.Add(rect);
    return;
}
int CPDF_TextPage::GetIndexAtPos(CPDF_Point point , FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return -3;
    }
    if (!m_IsParsered)	{
        return	-3;
    }
    int pos = 0;
    int NearPos = -1;
    double xdif = 5000, ydif = 5000;
    while(pos < m_charList.GetSize()) {
        PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)(m_charList.GetAt(pos));
        CFX_FloatRect charrect = charinfo.m_CharBox;
        if (charrect.Contains(point.x, point.y)) {
            break;
        }
        if (xTorelance > 0 || yTorelance > 0) {
            CFX_FloatRect charRectExt;
            charrect.Normalize();
            charRectExt.left = charrect.left - xTorelance / 2;
            charRectExt.right = charrect.right + xTorelance / 2;
            charRectExt.top = charrect.top + yTorelance / 2;
            charRectExt.bottom = charrect.bottom - yTorelance / 2;
            if (charRectExt.Contains(point.x, point.y)) {
                double curXdif, curYdif;
                curXdif = FXSYS_fabs(point.x - charrect.left) < FXSYS_fabs(point.x - charrect.right) ? FXSYS_fabs(point.x - charrect.left) : FXSYS_fabs(point.x - charrect.right);
                curYdif = FXSYS_fabs(point.y - charrect.bottom) < FXSYS_fabs(point.y - charrect.top	) ? FXSYS_fabs(point.y - charrect.bottom) : FXSYS_fabs(point.y - charrect.top);
                if (curYdif + curXdif < xdif + ydif) {
                    ydif = curYdif;
                    xdif = curXdif;
                    NearPos = pos;
                }
            }
        }
        ++pos;
    }
    if (pos >= m_charList.GetSize()) {
        pos = NearPos;
    }
    return pos;
}
CFX_WideString CPDF_TextPage::GetTextByRect(const CFX_FloatRect& rect) const
{
    CFX_WideString strText;
    if(m_ParseOptions.m_bGetCharCodeOnly || !m_IsParsered) {
        return strText;
    }
    int nCount = m_charList.GetSize();
    int pos = 0;
    FX_FLOAT posy = 0;
    FX_BOOL IsContainPreChar = FALSE;
    FX_BOOL	ISAddLineFeed = FALSE;
    while (pos < nCount) {
        PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);
        if (IsRectIntersect(rect, charinfo.m_CharBox)) {
            if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar && ISAddLineFeed) {
                posy = charinfo.m_OriginY;
                if (strText.GetLength() > 0) {
                    strText += L"\r\n";
                }
            }
            IsContainPreChar = TRUE;
            ISAddLineFeed = FALSE;
            if (charinfo.m_Unicode) {
                strText += charinfo.m_Unicode;
            }
        } else if (charinfo.m_Unicode == 32) {
            if (IsContainPreChar && charinfo.m_Unicode) {
                strText += charinfo.m_Unicode;
                IsContainPreChar = FALSE;
                ISAddLineFeed = FALSE;
            }
        } else {
            IsContainPreChar = FALSE;
            ISAddLineFeed = TRUE;
        }
    }
    return strText;
}
void CPDF_TextPage::GetRectsArrayByRect(const CFX_FloatRect& rect, CFX_RectArray& resRectArray) const
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return;
    }
    if (!m_IsParsered)	{
        return;
    }
    CFX_FloatRect		curRect;
    FX_BOOL				flagNewRect = TRUE;
    CPDF_TextObject*	pCurObj = NULL;
    int nCount = m_charList.GetSize();
    int pos = 0;
    while (pos < nCount) {
        PAGECHAR_INFO info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);
        if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
            continue;
        }
        if (IsRectIntersect(rect, info_curchar.m_CharBox)) {
            if(!pCurObj) {
                pCurObj = info_curchar.m_pTextObj;
            }
            if (pCurObj != info_curchar.m_pTextObj) {
                resRectArray.Add(curRect);
                pCurObj = info_curchar.m_pTextObj;
                flagNewRect = TRUE;
            }
            if (flagNewRect) {
                curRect = info_curchar.m_CharBox;
                flagNewRect = FALSE;
                curRect.Normalize();
            } else {
                info_curchar.m_CharBox.Normalize();
                if (curRect.left > info_curchar.m_CharBox.left) {
                    curRect.left = info_curchar.m_CharBox.left;
                }
                if (curRect.right < info_curchar.m_CharBox.right) {
                    curRect.right = info_curchar.m_CharBox.right;
                }
                if ( curRect.top < info_curchar.m_CharBox.top) {
                    curRect.top = info_curchar.m_CharBox.top;
                }
                if (curRect.bottom > info_curchar.m_CharBox.bottom) {
                    curRect.bottom = info_curchar.m_CharBox.bottom;
                }
            }
        }
    }
    resRectArray.Add(curRect);
    return;
}
int	CPDF_TextPage::GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return -3;
    }
    CPDF_Point point(x, y);
    return GetIndexAtPos(point, xTorelance, yTorelance);
}
void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO & info) const
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return;
    }
    if (!m_IsParsered)	{
        return;
    }
    if (index < 0 || index >= m_charList.GetSize())	{
        return;
    }
    PAGECHAR_INFO charinfo;
    charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
    info.m_Charcode = charinfo.m_CharCode;
    info.m_OriginX = charinfo.m_OriginX;
    info.m_OriginY = charinfo.m_OriginY;
    info.m_Unicode = charinfo.m_Unicode;
    info.m_Flag = charinfo.m_Flag;
    info.m_CharBox = charinfo.m_CharBox;
    info.m_pTextObj = charinfo.m_pTextObj;
    if (charinfo.m_pTextObj && charinfo.m_pTextObj->GetFont()) {
        info.m_FontSize = charinfo.m_pTextObj->GetFontSize();
    }
    info.m_Matrix.Copy(charinfo.m_Matrix);
    return;
}
void CPDF_TextPage::CheckMarkedContentObject(int32_t& start, int32_t& nCount) const
{
    PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);
    PAGECHAR_INFO charinfo2 = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);
    if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) {
        return;
    }
    if (FPDFTEXT_CHAR_PIECE == charinfo.m_Flag) {
        PAGECHAR_INFO charinfo1 = charinfo;
        int startIndex = start;
        while(FPDFTEXT_CHAR_PIECE == charinfo1.m_Flag && charinfo1.m_Index == charinfo.m_Index) {
            startIndex--;
            if (startIndex < 0)	{
                break;
            }
            charinfo1 = *(PAGECHAR_INFO*)m_charList.GetAt(startIndex);
        }
        startIndex++;
        start = startIndex;
    }
    if (FPDFTEXT_CHAR_PIECE == charinfo2.m_Flag) {
        PAGECHAR_INFO charinfo3 = charinfo2;
        int endIndex = start + nCount - 1;
        while(FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && charinfo3.m_Index == charinfo2.m_Index) {
            endIndex++;
            if (endIndex >= m_charList.GetSize())	{
                break;
            }
            charinfo3 = *(PAGECHAR_INFO*)m_charList.GetAt(endIndex);
        }
        endIndex--;
        nCount = endIndex - start + 1;
    }
}
CFX_WideString CPDF_TextPage::GetPageText(int start , int nCount) const
{
    if (!m_IsParsered || nCount == 0) {
        return L"";
    }
    if (start < 0) {
        start = 0;
    }
    if	(nCount == -1) {
        nCount = m_charList.GetSize() - start;
        return m_TextBuf.GetWideString().Mid(start, m_TextBuf.GetWideString().GetLength());
    }
    if(nCount <= 0 || m_charList.GetSize() <= 0) {
        return L"";
    }
    if(nCount + start > m_charList.GetSize() - 1) {
        nCount = m_charList.GetSize() - start;
    }
    if (nCount <= 0) {
        return L"";
    }
    CheckMarkedContentObject(start, nCount);
    int startindex = 0;
    PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);
    int startOffset = 0;
    while(charinfo.m_Index == -1) {
        startOffset++;
        if (startOffset > nCount || start + startOffset >= m_charList.GetSize())	{
            return L"";
        }
        charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + startOffset);
    }
    startindex = charinfo.m_Index;
    charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);
    int nCountOffset = 0;
    while (charinfo.m_Index == -1) {
        nCountOffset++;
        if (nCountOffset >= nCount) {
            return L"";
        }
        charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - nCountOffset - 1);
    }
    nCount = start + nCount - nCountOffset - startindex;
    if(nCount <= 0) {
        return L"";
    }
    return m_TextBuf.GetWideString().Mid(startindex, nCount);
}
int CPDF_TextPage::CountRects(int start, int nCount)
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return -1;
    }
    if (!m_IsParsered)	{
        return -1;
    }
    if (start < 0) {
        return -1;
    }
    if (nCount == -1 || nCount + start > m_charList.GetSize() ) {
        nCount = m_charList.GetSize() - start;
    }
    m_SelRects.RemoveAll();
    GetRectArray(start, nCount, m_SelRects);
    return m_SelRects.GetSize();
}
void CPDF_TextPage::GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return ;
    }
    if (!m_IsParsered || rectIndex < 0 || rectIndex >= m_SelRects.GetSize()) {
        return;
    }
    left = m_SelRects.GetAt(rectIndex).left;
    top = m_SelRects.GetAt(rectIndex).top;
    right = m_SelRects.GetAt(rectIndex).right;
    bottom = m_SelRects.GetAt(rectIndex).bottom;
}
FX_BOOL CPDF_TextPage::GetBaselineRotate(int start, int end, int& Rotate)
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return FALSE;
    }
    if(end == start) {
        return FALSE;
    }
    FX_FLOAT dx, dy;
    FPDF_CHAR_INFO info1, info2;
    GetCharInfo(start, info1);
    GetCharInfo(end, info2);
    while(info2.m_CharBox.Width() == 0 || info2.m_CharBox.Height() == 0) {
        end--;
        if(end <= start) {
            return FALSE;
        }
        GetCharInfo(end, info2);
    }
    dx = (info2.m_OriginX - info1.m_OriginX);
    dy = (info2.m_OriginY - info1.m_OriginY);
    if(dx == 0) {
        if(dy > 0) {
            Rotate = 90;
        } else if (dy < 0) {
            Rotate = 270;
        } else {
            Rotate = 0;
        }
    } else {
        float a = FXSYS_atan2(dy, dx);
        Rotate = (int)(a * 180 / FX_PI + 0.5);
    }
    if(Rotate < 0) {
        Rotate = -Rotate;
    } else if(Rotate > 0) {
        Rotate = 360 - Rotate;
    }
    return TRUE;
}
FX_BOOL	CPDF_TextPage::GetBaselineRotate(const CFX_FloatRect& rect , int& Rotate)
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return FALSE;
    }
    int start, end, count, n = CountBoundedSegments(rect.left, rect.top, rect.right, rect.bottom, TRUE);
    if(n < 1) {
        return FALSE;
    }
    if(n > 1) {
        GetBoundedSegment(n - 1, start, count);
        end = start + count - 1;
        GetBoundedSegment(0, start, count);
    } else {
        GetBoundedSegment(0, start, count);
        end = start + count - 1;
    }
    return GetBaselineRotate(start, end, Rotate);
}
FX_BOOL	CPDF_TextPage::GetBaselineRotate(int rectIndex, int& Rotate)
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return FALSE;
    }
    if (!m_IsParsered || rectIndex < 0 || rectIndex > m_SelRects.GetSize()) {
        return FALSE;
    }
    CFX_FloatRect rect = m_SelRects.GetAt(rectIndex);
    return GetBaselineRotate(rect , Rotate);
}
int	CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains )
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return -1;
    }
    m_Segment.RemoveAll();
    if (!m_IsParsered)	{
        return -1;
    }
    CFX_FloatRect rect(left, bottom, right, top);
    rect.Normalize();
    int nCount = m_charList.GetSize();
    int pos = 0;
    FPDF_SEGMENT	segment;
    segment.m_Start = 0;
    segment.m_nCount = 0;
    int  		segmentStatus = 0;
    FX_BOOL		IsContainPreChar = FALSE;
    while (pos < nCount) {
        PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos);
        if(bContains && rect.Contains(charinfo.m_CharBox)) {
            if (segmentStatus == 0 || segmentStatus == 2) {
                segment.m_Start = pos;
                segment.m_nCount = 1;
                segmentStatus = 1;
            } else if (segmentStatus == 1) {
                segment.m_nCount++;
            }
            IsContainPreChar = TRUE;
        } else if (!bContains && (IsRectIntersect(rect, charinfo.m_CharBox) || rect.Contains(charinfo.m_OriginX, charinfo.m_OriginY))) {
            if (segmentStatus == 0 || segmentStatus == 2) {
                segment.m_Start = pos;
                segment.m_nCount = 1;
                segmentStatus = 1;
            } else if (segmentStatus == 1) {
                segment.m_nCount++;
            }
            IsContainPreChar = TRUE;
        } else if (charinfo.m_Unicode == 32) {
            if (IsContainPreChar == TRUE) {
                if (segmentStatus == 0 || segmentStatus == 2) {
                    segment.m_Start = pos;
                    segment.m_nCount = 1;
                    segmentStatus = 1;
                } else if (segmentStatus == 1) {
                    segment.m_nCount++;
                }
                IsContainPreChar = FALSE;
            } else {
                if (segmentStatus == 1) {
                    segmentStatus = 2;
                    m_Segment.Add(segment);
                    segment.m_Start = 0;
                    segment.m_nCount = 0;
                }
            }
        } else {
            if (segmentStatus == 1) {
                segmentStatus = 2;
                m_Segment.Add(segment);
                segment.m_Start = 0;
                segment.m_nCount = 0;
            }
            IsContainPreChar = FALSE;
        }
        pos++;
    }
    if (segmentStatus == 1) {
        segmentStatus = 2;
        m_Segment.Add(segment);
        segment.m_Start = 0;
        segment.m_nCount = 0;
    }
    return m_Segment.GetSize();
}
void CPDF_TextPage::GetBoundedSegment(int index, int& start, int& count) const
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return ;
    }
    if (index < 0 || index >= m_Segment.GetSize()) {
        return;
    }
    start = m_Segment.GetAt(index).m_Start;
    count = m_Segment.GetAt(index).m_nCount;
}
int CPDF_TextPage::GetWordBreak(int index, int direction) const
{
    if(m_ParseOptions.m_bGetCharCodeOnly) {
        return -1;
    }
    if (!m_IsParsered)	{
        return -1;
    }
    if (direction != FPDFTEXT_LEFT && direction != FPDFTEXT_RIGHT) {
        return -1;
    }
    if (index < 0 || index >= m_charList.GetSize()) {
        return -1;
    }
    PAGECHAR_INFO charinfo;
    charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
    if (charinfo.m_Index == -1 || charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED)	{
        return index;
    }
    if (!IsLetter(charinfo.m_Unicode)) {
        return index;
    }
    int breakPos = index;
    if (direction == FPDFTEXT_LEFT) {
        while (--breakPos > 0) {
            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);
            if (!IsLetter(charinfo.m_Unicode)) {
                return breakPos;
            }
        }
    } else if (direction == FPDFTEXT_RIGHT) {
        while (++breakPos < m_charList.GetSize()) {
            charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);
            if (!IsLetter(charinfo.m_Unicode)) {
                return breakPos;
            }
        }
    }
    return breakPos;
}
int32_t CPDF_TextPage::FindTextlineFlowDirection()
{
    if (!m_pPage)	{
        return -1;
    }
    const int32_t nPageWidth = (int32_t)((CPDF_Page*)m_pPage)->GetPageWidth();
    const int32_t nPageHeight = (int32_t)((CPDF_Page*)m_pPage)->GetPageHeight();
    CFX_ByteArray nHorizontalMask;
    if (!nHorizontalMask.SetSize(nPageWidth)) {
        return -1;
    }
    uint8_t* pDataH = nHorizontalMask.GetData();
    CFX_ByteArray nVerticalMask;
    if (!nVerticalMask.SetSize(nPageHeight)) {
        return -1;
    }
    uint8_t* pDataV = nVerticalMask.GetData();
    int32_t index = 0;
    FX_FLOAT fLineHeight = 0.0f;
    CPDF_PageObject* pPageObj = NULL;
    FX_POSITION	pos = NULL;
    pos = m_pPage->GetFirstObjectPosition();
    if(!pos) {
        return -1;
    }
    while(pos) {
        pPageObj = m_pPage->GetNextObject(pos);
        if(NULL == pPageObj) {
            continue;
        }
        if(PDFPAGE_TEXT != pPageObj->m_Type) {
            continue;
        }
        int32_t minH = (int32_t)pPageObj->m_Left < 0 ? 0 : (int32_t)pPageObj->m_Left;
        int32_t maxH = (int32_t)pPageObj->m_Right > nPageWidth ? nPageWidth : (int32_t)pPageObj->m_Right;
        int32_t minV = (int32_t)pPageObj->m_Bottom < 0 ? 0 : (int32_t)pPageObj->m_Bottom;
        int32_t maxV = (int32_t)pPageObj->m_Top > nPageHeight ? nPageHeight : (int32_t)pPageObj->m_Top;
        if (minH >= maxH || minV >= maxV) {
            continue;
        }
        FXSYS_memset(pDataH + minH, 1, maxH - minH);
        FXSYS_memset(pDataV + minV, 1, maxV - minV);
        if (fLineHeight <= 0.0f) {
            fLineHeight = pPageObj->m_Top - pPageObj->m_Bottom;
        }
        pPageObj = NULL;
    }
    int32_t nStartH = 0;
    int32_t nEndH = 0;
    FX_FLOAT nSumH = 0.0f;
    for (index = 0; index < nPageWidth; index++)
        if(1 == nHorizontalMask[index]) {
            break;
        }
    nStartH = index;
    for (index = nPageWidth; index > 0; index--)
        if(1 == nHorizontalMask[index - 1]) {
            break;
        }
    nEndH = index;
    for (index = nStartH; index < nEndH; index++) {
        nSumH += nHorizontalMask[index];
    }
    nSumH /= nEndH - nStartH;
    int32_t nStartV = 0;
    int32_t nEndV = 0;
    FX_FLOAT nSumV = 0.0f;
    for (index = 0; index < nPageHeight; index++)
        if(1 == nVerticalMask[index]) {
            break;
        }
    nStartV = index;
    for (index = nPageHeight; index > 0; index--)
        if(1 == nVerticalMask[index - 1]) {
            break;
        }
    nEndV = index;
    for (index = nStartV; index < nEndV; index++) {
        nSumV += nVerticalMask[index];
    }
    nSumV /= nEndV - nStartV;
    if ((nEndV - nStartV) < (int32_t)(2 * fLineHeight)) {
        return 0;
    }
    if ((nEndH - nStartH) < (int32_t)(2 * fLineHeight)) {
        return 1;
    }
    if (nSumH > 0.8f) {
        return 0;
    }
    if (nSumH - nSumV > 0.0f) {
        return 0;
    }
    if (nSumV - nSumH > 0.0f) {
        return 1;
    }
    return -1;
}
void CPDF_TextPage::ProcessObject()
{
    CPDF_PageObject*	pPageObj = NULL;
    if (!m_pPage)	{
        return;
    }
    FX_POSITION	pos;
    pos = m_pPage->GetFirstObjectPosition();
    if (!pos)	{
        return;
    }
    m_TextlineDir = FindTextlineFlowDirection();
    int nCount = 0;
    while (pos) {
        pPageObj = m_pPage->GetNextObject(pos);
        if(pPageObj) {
            if(pPageObj->m_Type == PDFPAGE_TEXT) {
                CFX_AffineMatrix matrix;
                ProcessTextObject((CPDF_TextObject*)pPageObj, matrix, pos);
                nCount++;
            } else if (pPageObj->m_Type == PDFPAGE_FORM) {
                CFX_AffineMatrix formMatrix(1, 0, 0, 1, 0, 0);
                ProcessFormObject((CPDF_FormObject*)pPageObj, formMatrix);
            }
        }
        pPageObj = NULL;
    }
    int count = m_LineObj.GetSize();
    for(int i = 0; i < count; i++) {
        ProcessTextObject(m_LineObj.GetAt(i));
    }
    m_LineObj.RemoveAll();
    CloseTempLine();
}
void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, const CFX_AffineMatrix& formMatrix)
{
    CPDF_PageObject*	pPageObj = NULL;
    FX_POSITION	pos;
    if (!pFormObj)	{
        return;
    }
    pos = pFormObj->m_pForm->GetFirstObjectPosition();
    if (!pos)	{
        return;
    }
    CFX_AffineMatrix curFormMatrix;
    curFormMatrix.Copy(pFormObj->m_FormMatrix);
    curFormMatrix.Concat(formMatrix);
    while (pos) {
        pPageObj = pFormObj->m_pForm->GetNextObject(pos);
        if(pPageObj) {
            if(pPageObj->m_Type == PDFPAGE_TEXT) {
                ProcessTextObject((CPDF_TextObject*)pPageObj, curFormMatrix, pos);
            } else if (pPageObj->m_Type == PDFPAGE_FORM) {
                ProcessFormObject((CPDF_FormObject*)pPageObj, curFormMatrix);
            }
        }
        pPageObj = NULL;
    }
}
int CPDF_TextPage::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const
{
    if(charCode == -1) {
        return 0;
    }
    int w = pFont->GetCharWidthF(charCode);
    if(w == 0) {
        CFX_ByteString str;
        pFont->AppendChar(str, charCode);
        w = pFont->GetStringWidth(str, 1);
        if(w == 0) {
            FX_RECT BBox;
            pFont->GetCharBBox(charCode, BBox);
            w = BBox.right - BBox.left;
        }
    }
    return w;
}
void CPDF_TextPage::OnPiece(IFX_BidiChar* pBidi, CFX_WideString& str)
{
    int32_t start, count;
    int32_t ret = pBidi->GetBidiInfo(start, count);
    if(ret == 2) {
        for(int i = start + count - 1; i >= start; i--) {
            m_TextBuf.AppendChar(str.GetAt(i));
            m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));
        }
    } else {
        int end = start + count ;
        for(int i = start; i < end; i++) {
            m_TextBuf.AppendChar(str.GetAt(i));
            m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));
        }
    }
}
void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i)
{
    PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
    FX_WCHAR wChar = str.GetAt(i);
    if(!IsControlChar(Info)) {
        Info.m_Index = m_TextBuf.GetLength();
        if (wChar >= 0xFB00 && wChar <= 0xFB06) {
            FX_WCHAR* pDst = NULL;
            FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
            if (nCount >= 1) {
                pDst = FX_Alloc(FX_WCHAR, nCount);
                FX_Unicode_GetNormalization(wChar, pDst);
                for (int nIndex = 0; nIndex < nCount; nIndex++) {
                    PAGECHAR_INFO Info2 = Info;
                    Info2.m_Unicode = pDst[nIndex];
                    Info2.m_Flag = FPDFTEXT_CHAR_PIECE;
                    m_TextBuf.AppendChar(Info2.m_Unicode);
                    if( !m_ParseOptions.m_bGetCharCodeOnly) {
                        m_charList.Add(Info2);
                    }
                }
                FX_Free(pDst);
                return;
            }
        }
        m_TextBuf.AppendChar(wChar);
    } else {
        Info.m_Index = -1;
    }
    if( !m_ParseOptions.m_bGetCharCodeOnly) {
        m_charList.Add(Info);
    }
}
void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i)
{
    PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
    if(!IsControlChar(Info)) {
        Info.m_Index = m_TextBuf.GetLength();
        FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE);
        FX_WCHAR* pDst = NULL;
        FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
        if (nCount >= 1) {
            pDst = FX_Alloc(FX_WCHAR, nCount);
            FX_Unicode_GetNormalization(wChar, pDst);
            for (int nIndex = 0; nIndex < nCount; nIndex++) {
                PAGECHAR_INFO Info2 = Info;
                Info2.m_Unicode = pDst[nIndex];
                Info2.m_Flag = FPDFTEXT_CHAR_PIECE;
                m_TextBuf.AppendChar(Info2.m_Unicode);
                if( !m_ParseOptions.m_bGetCharCodeOnly) {
                    m_charList.Add(Info2);
                }
            }
            FX_Free(pDst);
            return;
        }
        Info.m_Unicode = wChar;
        m_TextBuf.AppendChar(Info.m_Unicode);
    } else {
        Info.m_Index = -1;
    }
    if( !m_ParseOptions.m_bGetCharCodeOnly) {
        m_charList.Add(Info);
    }
}
void CPDF_TextPage::CloseTempLine()
{
    int count1 = m_TempCharList.GetSize();
    if (count1 <= 0) {
        return;
    }
    nonstd::unique_ptr<IFX_BidiChar> pBidiChar(IFX_BidiChar::Create());
    CFX_WideString str = m_TempTextBuf.GetWideString();
    CFX_WordArray order;
    FX_BOOL bR2L = FALSE;
    int32_t start = 0, count = 0;
    int nR2L = 0, nL2R = 0;
    FX_BOOL bPrevSpace = FALSE;
    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--;
                i--;
                continue;
            }
            bPrevSpace = TRUE;
        } else {
            bPrevSpace = FALSE;
        }
        if(pBidiChar->AppendChar(str.GetAt(i))) {
            int32_t ret = pBidiChar->GetBidiInfo(start, count);
            order.Add(start);
            order.Add(count);
            order.Add(ret);
            if(!bR2L) {
                if(ret == 2) {
                    nR2L++;
                } else if (ret == 1) {
                    nL2R++;
                }
            }
        }
    }
    if(pBidiChar->EndChar()) {
        int32_t ret = pBidiChar->GetBidiInfo(start, count);
        order.Add(start);
        order.Add(count);
        order.Add(ret);
        if(!bR2L) {
            if(ret == 2) {
                nR2L++;
            } else if(ret == 1) {
                nL2R++;
            }
        }
    }
    if(nR2L > 0 && nR2L >= nL2R) {
        bR2L = TRUE;
    }
    if (m_parserflag == FPDFTEXT_RLTB || bR2L) {
        int count = order.GetSize();
        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 j = start + count1 - 1; j >= start; j--) {
                    AddCharInfoByRLDirection(str, j);
                }
            } else {
                int j = i;
                FX_BOOL bSymbol = FALSE;
                while(j > 0 && order.GetAt(j) != 2) {
                    bSymbol = !order.GetAt(j);
                    j -= 3;
                }
                int end = start + count1 ;
                int n = 0;
                if(bSymbol) {
                    n = j + 6;
                } else {
                    n = j + 3;
                }
                if(n >= i) {
                    for(int m = start; m < end; m++) {
                        AddCharInfoByLRDirection(str, m);
                    }
                } else {
                    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 ;
                        for(int m = start; m < end; m++) {
                            AddCharInfoByLRDirection(str, m);
                        }
                    }
                }
            }
        }
    } else {
        int count = order.GetSize();
        FX_BOOL bL2R = FALSE;
        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 {
                        j += 3;
                    }
                }
                if(j == 3) {
                    i = -3;
                    bL2R = TRUE;
                    continue;
                }
                int end = m_TempCharList.GetSize() - 1;
                if(j < count) {
                    end = order.GetAt(j) - 1;
                }
                i = j - 3;
                for(int n = end; n >= start; n--) {
                    AddCharInfoByRLDirection(str, n);
                }
            } else {
                int end = start + count1 ;
                for(int n = start; n < end; n++) {
                    AddCharInfoByLRDirection(str, n);
                }
            }
        }
    }
    order.RemoveAll();
    m_TempCharList.RemoveAll();
    m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength());
}
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 ) {
        return;
    }
    int count = m_LineObj.GetSize();
    PDFTEXT_Obj Obj;
    Obj.m_pTextObj = pTextObj;
    Obj.m_formMatrix = formMatrix;
    if(count == 0) {
        m_LineObj.Add(Obj);
        return;
    }
    if (IsSameAsPreTextObject(pTextObj, ObjPos)) {
        return;
    }
    PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(count - 1);
    CPDF_TextObjectItem item;
    int nItem = prev_Obj.m_pTextObj->CountItems();
    prev_Obj.m_pTextObj->GetItemInfo(nItem - 1, &item);
    FX_FLOAT prev_width = GetCharWidth(item.m_CharCode, prev_Obj.m_pTextObj->GetFont()) * prev_Obj.m_pTextObj->GetFontSize() / 1000;
    CFX_AffineMatrix prev_matrix;
    prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);
    prev_width = FXSYS_fabs(prev_width);
    prev_matrix.Concat(prev_Obj.m_formMatrix);
    prev_width = prev_matrix.TransformDistance(prev_width);
    pTextObj->GetItemInfo(0, &item);
    FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pTextObj->GetFont()) * pTextObj->GetFontSize() / 1000;
    this_width = FXSYS_fabs(this_width);
    CFX_AffineMatrix this_matrix;
    pTextObj->GetTextMatrix(&this_matrix);
    this_width = FXSYS_fabs(this_width);
    this_matrix.Concat(formMatrix);
    this_width = this_matrix.TransformDistance(this_width);
    FX_FLOAT threshold = prev_width > this_width ? prev_width / 4 : this_width / 4;
    FX_FLOAT prev_x = prev_Obj.m_pTextObj->GetPosX(), prev_y = prev_Obj.m_pTextObj->GetPosY();
    prev_Obj.m_formMatrix.Transform(prev_x, prev_y);
    m_DisplayMatrix.Transform(prev_x, prev_y);
    FX_FLOAT this_x = pTextObj->GetPosX(), this_y = pTextObj->GetPosY();
    formMatrix.Transform(this_x, this_y);
    m_DisplayMatrix.Transform(this_x, this_y);
    if (FXSYS_fabs(this_y - prev_y) > threshold * 2) {
        for(int i = 0; i < count; i++) {
            ProcessTextObject(m_LineObj.GetAt(i));
        }
        m_LineObj.RemoveAll();
        m_LineObj.Add(Obj);
        return;
    }
    int i = 0;
    if(m_ParseOptions.m_bNormalizeObjs) {
        for(i = count - 1; i >= 0; i--) {
            PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(i);
            CFX_AffineMatrix prev_matrix;
            prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);
            FX_FLOAT Prev_x = prev_Obj.m_pTextObj->GetPosX(), Prev_y = prev_Obj.m_pTextObj->GetPosY();
            prev_Obj.m_formMatrix.Transform(Prev_x, Prev_y);
            m_DisplayMatrix.Transform(Prev_x, Prev_y);
            if(this_x >= Prev_x) {
                if(i == count - 1) {
                    m_LineObj.Add(Obj);
                } else {
                    m_LineObj.InsertAt(i + 1, Obj);
                }
                break;
            }
        }
        if(i < 0) {
            m_LineObj.InsertAt(0, Obj);
        }
    } else {
        m_LineObj.Add(Obj);
    }
}
int32_t CPDF_TextPage::PreMarkedContent(PDFTEXT_Obj Obj)
{
    CPDF_TextObject* pTextObj = Obj.m_pTextObj;
    CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();
    if(!pMarkData) {
        return FPDFTEXT_MC_PASS;
    }
    int nContentMark = pMarkData->CountItems();
    if (nContentMark < 1) {
        return FPDFTEXT_MC_PASS;
    }
    CFX_WideString actText;
    FX_BOOL bExist = FALSE;
    CPDF_Dictionary* pDict = NULL;
    int n = 0;
    for (n = 0; n < nContentMark; n++) {
        CPDF_ContentMarkItem& item = pMarkData->GetItem(n);
        CFX_ByteString tagStr = (CFX_ByteString)item.GetName();
        pDict = (CPDF_Dictionary*)item.GetParam();
        CPDF_String* temp = (CPDF_String*)(pDict ? pDict->GetElement(FX_BSTRC("ActualText")) : NULL);
        if (temp) {
            bExist = TRUE;
            actText = temp->GetUnicodeText();
        }
    }
    if (!bExist) {
        return FPDFTEXT_MC_PASS;
    }
    if (m_pPreTextObj) {
        if (CPDF_ContentMarkData* pPreMarkData = (CPDF_ContentMarkData*)m_pPreTextObj->m_ContentMark.GetObject()) {
            if (pPreMarkData->CountItems() == n) {
                CPDF_ContentMarkItem& item = pPreMarkData->GetItem(n - 1);
                if (pDict == item.GetParam()) {
                    return FPDFTEXT_MC_DONE;
                }
            }
        }
    }
    CPDF_Font*	pFont = pTextObj->GetFont();
    FX_STRSIZE nItems = actText.GetLength();
    if (nItems < 1) {
        return FPDFTEXT_MC_PASS;
    }
    bExist = FALSE;
    for (FX_STRSIZE i = 0; i < nItems; i++) {
        FX_WCHAR wChar = actText.GetAt(i);
        if (-1 == pFont->CharCodeFromUnicode(wChar)) {
            continue;
        } else {
            bExist = TRUE;
            break;
        }
    }
    if (!bExist) {
        return FPDFTEXT_MC_PASS;
    }
    bExist = FALSE;
    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;
        }
    }
    if (!bExist) {
        return FPDFTEXT_MC_DONE;
    }
    return FPDFTEXT_MC_DELAY;
}
void CPDF_TextPage::ProcessMarkedContent(PDFTEXT_Obj Obj)
{
    CPDF_TextObject* pTextObj = Obj.m_pTextObj;
    CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();
    if(!pMarkData) {
        return;
    }
    int nContentMark = pMarkData->CountItems();
    if (nContentMark < 1) {
        return;
    }
    CFX_WideString actText;
    CPDF_Dictionary* pDict = NULL;
    int n = 0;
    for (n = 0; n < nContentMark; n++) {
        CPDF_ContentMarkItem& item = pMarkData->GetItem(n);
        CFX_ByteString tagStr = (CFX_ByteString)item.GetName();
        pDict = (CPDF_Dictionary*)item.GetParam();
        CPDF_String* temp = (CPDF_String*)(pDict ? pDict->GetElement(FX_BSTRC("ActualText")) : NULL);
        if (temp) {
            actText = temp->GetUnicodeText();
        }
    }
    FX_STRSIZE nItems = actText.GetLength();
    if (nItems < 1) {
        return;
    }
    CPDF_Font*	pFont = pTextObj->GetFont();
    CFX_AffineMatrix formMatrix = Obj.m_formMatrix;
    CFX_AffineMatrix matrix;
    pTextObj->GetTextMatrix(&matrix);
    matrix.Concat(formMatrix);
    FX_FLOAT fPosX = pTextObj->GetPosX();
    FX_FLOAT fPosY = pTextObj->GetPosY();
    int nCharInfoIndex = m_TextBuf.GetLength();
    CFX_FloatRect charBox;
    charBox.top = pTextObj->m_Top;
    charBox.left = pTextObj->m_Left;
    charBox.right = pTextObj->m_Right;
    charBox.bottom = pTextObj->m_Bottom;
    for (FX_STRSIZE k = 0; k < nItems; k++) {
        FX_WCHAR wChar = actText.GetAt(k);
        if (wChar <= 0x80 && !isprint(wChar)) {
            wChar = 0x20;
        }
        if (wChar >= 0xFFFD) {
            continue;
        }
        PAGECHAR_INFO charinfo;
        charinfo.m_OriginX = fPosX;
        charinfo.m_OriginY = fPosY;
        charinfo.m_Index = nCharInfoIndex;
        charinfo.m_Unicode = wChar;
        charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar);
        charinfo.m_Flag = FPDFTEXT_CHAR_PIECE;
        charinfo.m_pTextObj = pTextObj;
        charinfo.m_CharBox.top = charBox.top;
        charinfo.m_CharBox.left = charBox.left;
        charinfo.m_CharBox.right = charBox.right;
        charinfo.m_CharBox.bottom = charBox.bottom;
        charinfo.m_Matrix.Copy(matrix);
        m_TempTextBuf.AppendChar(wChar);
        m_TempCharList.Add(charinfo);
    }
}
void CPDF_TextPage::FindPreviousTextObject(void)
{
    if (m_TempCharList.GetSize() < 1 && m_charList.GetSize() < 1) {
        return;
    }
    PAGECHAR_INFO preChar;
    if (m_TempCharList.GetSize() >= 1) {
        preChar = *(PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);
    } else {
        preChar = *(PAGECHAR_INFO*)m_charList.GetAt(m_charList.GetSize() - 1);
    }
    if (preChar.m_pTextObj) {
        m_pPreTextObj = preChar.m_pTextObj;
    }
}
void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj)
{
    CPDF_TextObject* pTextObj = Obj.m_pTextObj;
    if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {
        return;
    }
    CFX_AffineMatrix formMatrix = Obj.m_formMatrix;
    CPDF_Font*	pFont = pTextObj->GetFont();
    CFX_AffineMatrix matrix;
    pTextObj->GetTextMatrix(&matrix);
    matrix.Concat(formMatrix);
    int32_t bPreMKC = PreMarkedContent(Obj);
    if (FPDFTEXT_MC_DONE == bPreMKC) {
        m_pPreTextObj = pTextObj;
        m_perMatrix.Copy(formMatrix);
        return;
    }
    int result = 0;
    if (m_pPreTextObj) {
        result = ProcessInsertObject(pTextObj, formMatrix);
        if (2 == result) {
            m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);
        } else {
            m_CurlineRect.Union(CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top));
        }
        PAGECHAR_INFO generateChar;
        if (result == 1) {
            if (GenerateCharInfo(TEXT_BLANK_CHAR, generateChar)) {
                if (!formMatrix.IsIdentity()) {
                    generateChar.m_Matrix.Copy(formMatrix);
                }
                m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);
                m_TempCharList.Add(generateChar);
            }
        } else if(result == 2) {
            CloseTempLine();
            if(m_TextBuf.GetSize()) {
                if(m_ParseOptions.m_bGetCharCodeOnly) {
                    m_TextBuf.AppendChar(TEXT_RETURN_CHAR);
                    m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);
                } else {
                    if(GenerateCharInfo(TEXT_RETURN_CHAR, generateChar)) {
                        m_TextBuf.AppendChar(TEXT_RETURN_CHAR);
                        if (!formMatrix.IsIdentity()) {
                            generateChar.m_Matrix.Copy(formMatrix);
                        }
                        m_charList.Add(generateChar);
                    }
                    if(GenerateCharInfo(TEXT_LINEFEED_CHAR, generateChar)) {
                        m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);
                        if (!formMatrix.IsIdentity()) {
                            generateChar.m_Matrix.Copy(formMatrix);
                        }
                        m_charList.Add(generateChar);
                    }
                }
            }
        } else if (result == 3 && !m_ParseOptions.m_bOutputHyphen) {
            int32_t nChars = pTextObj->CountChars();
            if (nChars == 1) {
                CPDF_TextObjectItem item;
                pTextObj->GetCharInfo(0, &item);
                CFX_WideString wstrItem = pTextObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
                if(wstrItem.IsEmpty()) {
                    wstrItem += (FX_WCHAR)item.m_CharCode;
                }
                FX_WCHAR curChar = wstrItem.GetAt(0);
                if (0x2D == curChar || 0xAD == curChar) {
                    return;
                }
            }
            while (m_TempTextBuf.GetSize() > 0 && m_TempTextBuf.GetWideString().GetAt(m_TempTextBuf.GetLength() - 1) == 0x20) {
                m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
                m_TempCharList.Delete(m_TempCharList.GetSize() - 1);
            }
            PAGECHAR_INFO* cha = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);
            m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
            cha->m_Unicode = 0x2;
            cha->m_Flag = FPDFTEXT_CHAR_HYPHEN;
            m_TempTextBuf.AppendChar(0xfffe);
        }
    } 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);
    }
    if (FPDFTEXT_MC_DELAY == bPreMKC) {
        ProcessMarkedContent(Obj);
        m_pPreTextObj = pTextObj;
        m_perMatrix.Copy(formMatrix);
        return;
    }
    m_pPreTextObj = pTextObj;
    m_perMatrix.Copy(formMatrix);
    int nItems = pTextObj->CountItems();
    FX_FLOAT baseSpace = _CalculateBaseSpace(pTextObj, matrix);

    const FX_BOOL bR2L = IsRightToLeft(pTextObj, pFont, nItems);
    const FX_BOOL bIsBidiAndMirrorInverse =
        bR2L && (matrix.a * matrix.d - matrix.b * matrix.c) < 0;
    int32_t iBufStartAppend = m_TempTextBuf.GetLength();
    int32_t iCharListStartAppend = m_TempCharList.GetSize();

    FX_FLOAT spacing = 0;
    for (int i = 0; i < nItems; i++) {
        CPDF_TextObjectItem item;
        PAGECHAR_INFO charinfo;
        charinfo.m_OriginX = 0;
        charinfo.m_OriginY = 0;
        pTextObj->GetItemInfo(i, &item);
        if (item.m_CharCode == (FX_DWORD) - 1) {
            CFX_WideString str = m_TempTextBuf.GetWideString();
            if(str.IsEmpty()) {
                str = m_TextBuf.GetWideString();
            }
            if (str.IsEmpty() || str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {
                continue;
            }
            FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();
            spacing = -fontsize_h * item.m_OriginX / 1000;
            continue;
        }
        FX_FLOAT charSpace = pTextObj->m_TextState.GetObject()->m_CharSpace;
        if (charSpace > 0.001) {
            spacing += matrix.TransformDistance(charSpace);
        } else if(charSpace < -0.001) {
            spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace));
        }
        spacing -= baseSpace;
        if (spacing && i > 0) {
            int last_width = 0;
            FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();
            FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');
            FX_FLOAT threshold = 0;
            if (space_charcode != -1) {
                threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000 ;
            }
            if (threshold > fontsize_h / 3) {
                threshold = 0;
            } else {
                threshold /= 2;
            }
            if (threshold == 0) {
                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;
                threshold = _NormalizeThreshold(threshold);
                threshold = fontsize_h * threshold / 1000;
            }
            if (threshold && (spacing && spacing >= threshold) ) {
                charinfo.m_Unicode = TEXT_BLANK_CHAR;
                charinfo.m_Flag = FPDFTEXT_CHAR_GENERATED;
                charinfo.m_pTextObj = pTextObj;
                charinfo.m_Index = m_TextBuf.GetLength();
                m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);
                charinfo.m_CharCode = -1;
                charinfo.m_Matrix.Copy(formMatrix);
                matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
                charinfo.m_CharBox = CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
                m_TempCharList.Add(charinfo);
            }
            if (item.m_CharCode == (FX_DWORD) - 1) {
                continue;
            }
        }
        spacing = 0;
        CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode);
        FX_BOOL bNoUnicode = FALSE;
        FX_WCHAR wChar = wstrItem.GetAt(0);
        if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) {
            if(wstrItem.IsEmpty()) {
                wstrItem += (FX_WCHAR)item.m_CharCode;
            } else {
                wstrItem.SetAt(0, (FX_WCHAR)item.m_CharCode);
            }
            bNoUnicode = TRUE;
        }
        charinfo.m_Index = -1;
        charinfo.m_CharCode = item.m_CharCode;
        if(bNoUnicode) {
            charinfo.m_Flag = FPDFTEXT_CHAR_UNUNICODE;
        } else {
            charinfo.m_Flag = FPDFTEXT_CHAR_NORMAL;
        }
        charinfo.m_pTextObj = pTextObj;
        charinfo.m_OriginX = 0, charinfo.m_OriginY = 0;
        matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
        FX_RECT rect(0, 0, 0, 0);
        rect.Intersect(0, 0, 0, 0);
        charinfo.m_pTextObj->GetFont()->GetCharBBox(charinfo.m_CharCode, rect);
        charinfo.m_CharBox.top = rect.top * pTextObj->GetFontSize() / 1000 + item.m_OriginY;
        charinfo.m_CharBox.left = rect.left * pTextObj->GetFontSize() / 1000 + item.m_OriginX;
        charinfo.m_CharBox.right = rect.right * pTextObj->GetFontSize() / 1000 + item.m_OriginX;
        charinfo.m_CharBox.bottom = rect.bottom * pTextObj->GetFontSize() / 1000 + item.m_OriginY;
        if (fabsf(charinfo.m_CharBox.top - charinfo.m_CharBox.bottom) < 0.01f) {
            charinfo.m_CharBox.top = charinfo.m_CharBox.bottom + pTextObj->GetFontSize();
        }
        if (fabsf(charinfo.m_CharBox.right - charinfo.m_CharBox.left) < 0.01f) {
            charinfo.m_CharBox.right = charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode);
        }
        matrix.TransformRect(charinfo.m_CharBox);
        charinfo.m_Matrix.Copy(matrix);
        if (wstrItem.IsEmpty()) {
            charinfo.m_Unicode = 0;
            m_TempCharList.Add(charinfo);
            m_TempTextBuf.AppendChar(0xfffe);
            continue;
        } else {
            int nTotal = wstrItem.GetLength();
            FX_BOOL bDel = FALSE;
            const int count = std::min(m_TempCharList.GetSize(), 7);
            FX_FLOAT threshold = charinfo.m_Matrix.TransformXDistance((FX_FLOAT)TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize());
            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) < threshold  &&
                        FXSYS_fabs(charinfo1->m_OriginY - charinfo.m_OriginY) < threshold) {
                    bDel = TRUE;
                    break;
                }
            }
            if(!bDel) {
                for (int nIndex = 0; nIndex < nTotal; nIndex++) {
                    charinfo.m_Unicode = wstrItem.GetAt(nIndex);
                    if (charinfo.m_Unicode) {
                        charinfo.m_Index = m_TextBuf.GetLength();
                        m_TempTextBuf.AppendChar(charinfo.m_Unicode);
                    } else {
                        m_TempTextBuf.AppendChar(0xfffe);
                    }
                    m_TempCharList.Add(charinfo);
                }
            } else if(i == 0) {
                CFX_WideString str = m_TempTextBuf.GetWideString();
                if (!str.IsEmpty() && str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {
                    m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
                    m_TempCharList.Delete(m_TempCharList.GetSize() - 1);
                }
            }
        }
    }
    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<IFX_BidiChar> pBidiChar(IFX_BidiChar::Create());
    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)) {
            int32_t ret = pBidiChar->GetBidiInfo(start, count);
            if (ret == 2) {
                nR2L++;
            }
            else if (ret == 1) {
                nL2R++;
            }
        }
    }
    if (pBidiChar->EndChar()) {
        int32_t ret = pBidiChar->GetBidiInfo(start, count);
        if (ret == 2) {
            nR2L++;
        }
        else if (ret == 1) {
            nL2R++;
        }
    }
    return (nR2L > 0 && nR2L >= nL2R);
}
int32_t CPDF_TextPage::GetTextObjectWritingMode(const CPDF_TextObject* pTextObj)
{
    int32_t nChars = pTextObj->CountChars();
    if (nChars == 1) {
        return m_TextlineDir;
    }
    CPDF_TextObjectItem first, last;
    pTextObj->GetCharInfo(0, &first);
    pTextObj->GetCharInfo(nChars - 1, &last);
    CFX_Matrix textMatrix;
    pTextObj->GetTextMatrix(&textMatrix);
    textMatrix.TransformPoint(first.m_OriginX, first.m_OriginY);
    textMatrix.TransformPoint(last.m_OriginX, last.m_OriginY);
    FX_FLOAT dX = FXSYS_fabs(last.m_OriginX - first.m_OriginX);
    FX_FLOAT dY = FXSYS_fabs(last.m_OriginY - first.m_OriginY);
    if (dX <= 0.0001f && dY <= 0.0001f) {
        return -1;
    }
    CFX_VectorF v;
    v.Set(dX, dY);
    v.Normalize();
    if (v.y <= 0.0872f) {
        return v.x <= 0.0872f ? m_TextlineDir : 0;
    }
    if (v.x <= 0.0872f) {
        return 1;
    }
    return m_TextlineDir;
}
FX_BOOL CPDF_TextPage::IsHyphen(FX_WCHAR curChar)
{
    CFX_WideString strCurText = m_TempTextBuf.GetWideString();
    if(strCurText.GetLength() == 0) {
        strCurText = m_TextBuf.GetWideString();
    }
    FX_STRSIZE nCount = strCurText.GetLength();
    int nIndex = nCount - 1;
    FX_WCHAR wcTmp = strCurText.GetAt(nIndex);
    while(wcTmp == 0x20 && nIndex <= nCount - 1 && nIndex >= 0) {
        wcTmp = strCurText.GetAt(--nIndex);
    }
    if (0x2D == wcTmp || 0xAD == wcTmp) {
        if (--nIndex > 0) {
            FX_WCHAR preChar = strCurText.GetAt((nIndex));
            if (((preChar >= L'A' && preChar <= L'Z') || (preChar >= L'a' && preChar <= L'z'))
                    && ((curChar >= L'A' && curChar <= L'Z') || (curChar >= L'a' && curChar <= L'z'))) {
                return TRUE;
            }
        }
        int size = m_TempCharList.GetSize();
        PAGECHAR_INFO preChar;
        if (size) {
            preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];
        } else {
            size = m_charList.GetSize();
            if(size == 0) {
                return FALSE;
            }
            preChar = (PAGECHAR_INFO)m_charList[size - 1];
        }
        if (FPDFTEXT_CHAR_PIECE == preChar.m_Flag)
            if (0xAD == preChar.m_Unicode || 0x2D == preChar.m_Unicode) {
                return TRUE;
            }
    }
    return FALSE;
}
int CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, const CFX_AffineMatrix& formMatrix)
{
    FindPreviousTextObject();
    FX_BOOL bNewline = FALSE;
    int WritingMode = GetTextObjectWritingMode(pObj);
    if(WritingMode == -1) {
        WritingMode = GetTextObjectWritingMode(m_pPreTextObj);
    }
    CFX_FloatRect this_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
    CFX_FloatRect prev_rect(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);
    CPDF_TextObjectItem PrevItem, item;
    int nItem = m_pPreTextObj->CountItems();
    m_pPreTextObj->GetItemInfo(nItem - 1, &PrevItem);
    pObj->GetItemInfo(0, &item);
    CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
    if(wstrItem.IsEmpty()) {
        wstrItem += (FX_WCHAR)item.m_CharCode;
    }
    FX_WCHAR curChar = wstrItem.GetAt(0);
    if(WritingMode == 0) {
        if(this_rect.Height() > 4.5 && prev_rect.Height() > 4.5) {
            FX_FLOAT top = this_rect.top < prev_rect.top ? this_rect.top : prev_rect.top;
            FX_FLOAT bottom = this_rect.bottom > prev_rect.bottom ? this_rect.bottom : prev_rect.bottom;
            if(bottom >= top) {
                if(IsHyphen(curChar)) {
                    return 3;
                }
                return 2;
            }
        }
    } else if (WritingMode == 1) {
        if(this_rect.Width() > pObj->GetFontSize() * 0.1f && prev_rect.Width() > m_pPreTextObj->GetFontSize() * 0.1f) {
            FX_FLOAT left = this_rect.left > m_CurlineRect.left ? this_rect.left : m_CurlineRect.left;
            FX_FLOAT right = this_rect.right < m_CurlineRect.right ? this_rect.right : m_CurlineRect.right;
            if(right <= left) {
                if(IsHyphen(curChar)) {
                    return 3;
                }
                return 2;
            }
        }
    }
    FX_FLOAT last_pos = PrevItem.m_OriginX;
    int nLastWidth = GetCharWidth(PrevItem.m_CharCode, m_pPreTextObj->GetFont());
    FX_FLOAT last_width = nLastWidth * m_pPreTextObj->GetFontSize() / 1000;
    last_width = FXSYS_fabs(last_width);
    int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont());
    FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000;
    this_width = FXSYS_fabs(this_width);
    FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;
    CFX_AffineMatrix prev_matrix, prev_reverse;
    m_pPreTextObj->GetTextMatrix(&prev_matrix);
    prev_matrix.Concat(m_perMatrix);
    prev_reverse.SetReverse(prev_matrix);
    FX_FLOAT x = pObj->GetPosX();
    FX_FLOAT y = pObj->GetPosY();
    formMatrix.Transform(x, y);
    prev_reverse.Transform(x, y);
    if(last_width < this_width) {
        threshold = prev_reverse.TransformDistance(threshold);
    }
    CFX_FloatRect rect1(m_pPreTextObj->m_Left, pObj->m_Bottom, m_pPreTextObj->m_Right, pObj->m_Top);
    CFX_FloatRect rect2(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);
    CFX_FloatRect rect3 = rect1;
    rect1.Intersect(rect2);
    if (WritingMode == 0) {
        if ((rect1.IsEmpty() && rect2.Height() > 5 && rect3.Height() > 5)
                || ((y > threshold * 2 || y < threshold * -3) && (FXSYS_fabs(y) < 1 ? FXSYS_fabs(x) < FXSYS_fabs(y) : TRUE))) {
            bNewline = TRUE;
            if(nItem > 1 ) {
                CPDF_TextObjectItem tempItem;
                m_pPreTextObj->GetItemInfo(0, &tempItem);
                CFX_AffineMatrix m;
                m_pPreTextObj->GetTextMatrix(&m);
                if(PrevItem.m_OriginX > tempItem.m_OriginX &&
                        m_DisplayMatrix.a > 0.9 && m_DisplayMatrix.b < 0.1 &&
                        m_DisplayMatrix.c < 0.1 && m_DisplayMatrix.d < -0.9
                        && m.b < 0.1 && m.c < 0.1 ) {
                    CFX_FloatRect re(0, m_pPreTextObj->m_Bottom, 1000, m_pPreTextObj->m_Top);
                    if(re.Contains(pObj->GetPosX(), pObj->GetPosY())) {
                        bNewline = FALSE;
                    } else {
                        CFX_FloatRect re(0, pObj->m_Bottom, 1000, pObj->m_Top);
                        if(re.Contains(m_pPreTextObj->GetPosX(), m_pPreTextObj->GetPosY())) {
                            bNewline = FALSE;
                        }
                    }
                }
            }
        }
    }
    if(bNewline) {
        if(IsHyphen(curChar)) {
            return 3;
        }
        return 2;
    }
    int32_t nChars = pObj->CountChars();
    if (nChars == 1 && ( 0x2D == curChar || 0xAD == curChar))
        if (IsHyphen(curChar)) {
            return 3;
        }
    CFX_WideString PrevStr = m_pPreTextObj->GetFont()->UnicodeFromCharCode(PrevItem.m_CharCode);
    FX_WCHAR preChar = PrevStr.GetAt(PrevStr.GetLength() - 1);
    CFX_AffineMatrix matrix;
    pObj->GetTextMatrix(&matrix);
    matrix.Concat(formMatrix);
    threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth);
    threshold = threshold > 400 ? (threshold < 700 ? threshold / 4 :  (threshold > 800 ? threshold / 6 : threshold / 5)) : (threshold / 2);
    if(nLastWidth >= nThisWidth) {
        threshold *= FXSYS_fabs(m_pPreTextObj->GetFontSize());
    } else {
        threshold *= FXSYS_fabs(pObj->GetFontSize());
        threshold = matrix.TransformDistance(threshold);
        threshold = prev_reverse.TransformDistance(threshold);
    }
    threshold /= 1000;
    if((threshold < 1.4881 && threshold > 1.4879)
            || (threshold < 1.39001 && threshold > 1.38999)) {
        threshold *= 1.5;
    }
    if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ' && preChar != L' ')
        if (curChar != L' ' && preChar != L' ') {
            if((x - last_pos - last_width) > threshold || (last_pos - x - last_width) > threshold) {
                return 1;
            }
            if(x < 0 && (last_pos - x - last_width) > threshold) {
                return 1;
            }
            if((x - last_pos - last_width) > this_width || (x - last_pos - this_width) > last_width ) {
                return 1;
            }
        }
    return 0;
}
FX_BOOL CPDF_TextPage::IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2)
{
    if (!pTextObj1 || !pTextObj2) {
        return FALSE;
    }
    CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);
    CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);
    if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty() && !m_ParseOptions.m_bGetCharCodeOnly) {
        FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left);
        int nCount = m_charList.GetSize();
        if (nCount >= 2) {
            PAGECHAR_INFO perCharTemp = (PAGECHAR_INFO)m_charList[nCount - 2];
            FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width();
            if (dbXdif > dbSpace) {
                return FALSE;
            }
        }
    }
    if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {
        rcPreObj.Intersect(rcCurObj);
        if (rcPreObj.IsEmpty()) {
            return FALSE;
        }
        if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {
            return FALSE;
        }
        if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {
            return FALSE;
        }
    }
    int nPreCount = pTextObj2->CountItems();
    int nCurCount = pTextObj1->CountItems();
    if (nPreCount != nCurCount) {
        return FALSE;
    }
    CPDF_TextObjectItem itemPer, itemCur;
    for (int i = 0; i < nPreCount; i++) {
        pTextObj2->GetItemInfo(i, &itemPer);
        pTextObj1->GetItemInfo(i, &itemCur);
        if (itemCur.m_CharCode != itemPer.m_CharCode) {
            return FALSE;
        }
    }
    if(FXSYS_fabs(pTextObj1->GetPosX() - pTextObj2->GetPosX()) > GetCharWidth(itemPer.m_CharCode, pTextObj2->GetFont())*pTextObj2->GetFontSize() / 1000 * 0.9 ||
            FXSYS_fabs(pTextObj1->GetPosY() - pTextObj2->GetPosY()) >
            FX_MAX(FX_MAX(rcPreObj.Height() , rcPreObj.Width()), pTextObj2->GetFontSize()) / 8) {
        return FALSE;
    }
    return TRUE;
}
FX_BOOL CPDF_TextPage::IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos)
{
    if (!pTextObj) {
        return FALSE;
    }
    int i = 0;
    if (!ObjPos) {
        ObjPos = m_pPage->GetLastObjectPosition();
    }
    CPDF_PageObject* pObj = m_pPage->GetPrevObject(ObjPos);
    while (i < 5 && ObjPos) {
        pObj = m_pPage->GetPrevObject(ObjPos);
        if(pObj == pTextObj) {
            continue;
        }
        if(pObj->m_Type != PDFPAGE_TEXT) {
            continue;
        }
        if(IsSameTextObject((CPDF_TextObject*)pObj, pTextObj)) {
            return TRUE;
        }
        i++;
    }
    return FALSE;
}
FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info)
{
    int size = m_TempCharList.GetSize();
    PAGECHAR_INFO preChar;
    if (size) {
        preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];
    } else {
        size = m_charList.GetSize();
        if(size == 0) {
            return FALSE;
        }
        preChar = (PAGECHAR_INFO)m_charList[size - 1];
    }
    info.m_Index = m_TextBuf.GetLength();
    info.m_Unicode = unicode;
    info.m_pTextObj = NULL;
    info.m_CharCode = -1;
    info.m_Flag = FPDFTEXT_CHAR_GENERATED;
    int preWidth = 0;
    if (preChar.m_pTextObj && preChar.m_CharCode != (FX_DWORD) - 1) {
        preWidth = GetCharWidth(preChar.m_CharCode, preChar.m_pTextObj->GetFont());
    }
    FX_FLOAT fs = 0;
    if(preChar.m_pTextObj) {
        fs = preChar.m_pTextObj->GetFontSize();
    } else {
        fs = preChar.m_CharBox.Height();
    }
    if(!fs) {
        fs = 1;
    }
    info.m_OriginX = preChar.m_OriginX + preWidth * (fs) / 1000;
    info.m_OriginY = preChar.m_OriginY;
    info.m_CharBox = CFX_FloatRect(info.m_OriginX, info.m_OriginY, info.m_OriginX, info.m_OriginY);
    return TRUE;
}
FX_BOOL CPDF_TextPage::IsRectIntersect(const CFX_FloatRect& rect1, const CFX_FloatRect& rect2)
{
    CFX_FloatRect rect = rect1;
    rect.Intersect(rect2);
    return !rect.IsEmpty();
}
FX_BOOL	CPDF_TextPage::IsLetter(FX_WCHAR unicode)
{
    if (unicode < L'A') {
        return FALSE;
    }
    if (unicode > L'Z' && unicode < L'a') {
        return FALSE;
    }
    if (unicode > L'z') {
        return FALSE;
    }
    return TRUE;
}
CPDF_TextPageFind::CPDF_TextPageFind(const IPDF_TextPage* pTextPage)
    : m_pTextPage(pTextPage),
      m_flags(0),
      m_findNextStart(-1),
      m_findPreStart(-1),
      m_bMatchCase(FALSE),
      m_bMatchWholeWord(FALSE),
      m_resStart(0),
      m_resEnd(-1),
      m_IsFind(FALSE)
{
    m_strText = m_pTextPage->GetPageText();
    int nCount = pTextPage->CountChars();
    if(nCount) {
        m_CharIndex.Add(0);
    }
    for(int i = 0; i < nCount; i++) {
        FPDF_CHAR_INFO info;
        pTextPage->GetCharInfo(i, info);
        int indexSize = m_CharIndex.GetSize();
        if(info.m_Flag == CHAR_NORMAL || info.m_Flag == CHAR_GENERATED) {
            if(indexSize % 2) {
                m_CharIndex.Add(1);
            } else {
                if(indexSize <= 0) {
                    continue;
                }
                m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);
            }
        } else {
            if(indexSize % 2) {
                if(indexSize <= 0) {
                    continue;
                }
                m_CharIndex.SetAt(indexSize - 1, i + 1);
            } else {
                m_CharIndex.Add(i + 1);
            }
        }
    }
    int indexSize = m_CharIndex.GetSize();
    if(indexSize % 2) {
        m_CharIndex.RemoveAt(indexSize - 1);
    }
}
int CPDF_TextPageFind::GetCharIndex(int index) const
{
    return m_pTextPage->CharIndexFromTextIndex(index);
    int indexSize = m_CharIndex.GetSize();
    int count = 0;
    for(int i = 0; i < indexSize; i += 2) {
        count += m_CharIndex.GetAt(i + 1);
        if(count > index) {
            return 	index - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);
        }
    }
    return -1;
}
FX_BOOL	CPDF_TextPageFind::FindFirst(const CFX_WideString& findwhat, int flags, int startPos)
{
    if (!m_pTextPage) {
        return FALSE;
    }
    if (m_strText.IsEmpty() || m_bMatchCase != (flags & FPDFTEXT_MATCHCASE)) {
        m_strText = m_pTextPage->GetPageText();
    }
    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 = findwhatStr.GetLength();
    if (!m_bMatchCase) {
        findwhatStr.MakeLower();
        m_strText.MakeLower();
    }
    m_bMatchWholeWord = flags & FPDFTEXT_MATCHWHOLEWORD;
    m_findNextStart = startPos;
    if (startPos == -1) {
        m_findPreStart = m_strText.GetLength() - 1;
    } else {
        m_findPreStart = startPos;
    }
    m_csFindWhatArray.RemoveAll();
    int i = 0;
    while(i < len) {
        if(findwhatStr.GetAt(i) != ' ') {
            break;
        }
        i++;
    }
    if(i < len) {
        ExtractFindWhat(findwhatStr);
    } else {
        m_csFindWhatArray.Add(findwhatStr);
    }
    if(m_csFindWhatArray.GetSize() <= 0) {
        return FALSE;
    }
    m_IsFind = TRUE;
    m_resStart = 0;
    m_resEnd = -1;
    return TRUE;
}
FX_BOOL CPDF_TextPageFind::FindNext()
{
    if (!m_pTextPage) {
        return FALSE;
    }
    m_resArray.RemoveAll();
    if(m_findNextStart == -1) {
        return FALSE;
    }
    if(m_strText.IsEmpty()) {
        m_IsFind = FALSE;
        return m_IsFind;
    }
    int strLen = m_strText.GetLength();
    if (m_findNextStart > strLen - 1) {
        m_IsFind = FALSE;
        return m_IsFind;
    }
    int nCount = m_csFindWhatArray.GetSize();
    int nResultPos = 0;
    int	nStartPos = 0;
    nStartPos = m_findNextStart;
    FX_BOOL bSpaceStart = FALSE;
    for(int iWord = 0; iWord < nCount; iWord++) {
        CFX_WideString csWord = m_csFindWhatArray[iWord];
        if(csWord.IsEmpty()) {
            if(iWord == nCount - 1) {
                FX_WCHAR strInsert = m_strText.GetAt(nStartPos);
                if(strInsert == TEXT_LINEFEED_CHAR || strInsert == TEXT_BLANK_CHAR || strInsert == TEXT_RETURN_CHAR || strInsert == 160) {
                    nResultPos = nStartPos + 1;
                    break;
                }
                iWord = -1;
            } else if(iWord == 0) {
                bSpaceStart = TRUE;
            }
            continue;
        }
        int endIndex;
        nResultPos = m_strText.Find(csWord.c_str(), nStartPos);
        if (nResultPos == -1) {
            m_IsFind = FALSE;
            return m_IsFind;
        }
        endIndex = nResultPos + csWord.GetLength() - 1;
        if(iWord == 0) {
            m_resStart = nResultPos;
        }
        FX_BOOL bMatch = TRUE;
        if(iWord != 0 && !bSpaceStart) {
            int PreResEndPos = nStartPos;
            int curChar = csWord.GetAt(0);
            CFX_WideString lastWord = m_csFindWhatArray[iWord - 1];
            int lastChar = lastWord.GetAt(lastWord.GetLength() - 1);
            if(nStartPos == nResultPos && !(_IsIgnoreSpaceCharacter(lastChar) || _IsIgnoreSpaceCharacter(curChar))) {
                bMatch = FALSE;
            }
            for(int d = PreResEndPos; d < nResultPos; d++) {
                FX_WCHAR strInsert = m_strText.GetAt(d);
                if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {
                    bMatch = FALSE;
                    break;
                }
            }
        } else if(bSpaceStart) {
            if(nResultPos > 0) {
                FX_WCHAR strInsert = m_strText.GetAt(nResultPos - 1);
                if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {
                    bMatch = FALSE;
                    m_resStart = nResultPos;
                } else {
                    m_resStart = nResultPos - 1;
                }
            }
        }
        if(m_bMatchWholeWord && bMatch) {
            bMatch = IsMatchWholeWord(m_strText, nResultPos, endIndex);
        }
        nStartPos = endIndex + 1;
        if(!bMatch) {
            iWord = -1;
            if(bSpaceStart) {
                nStartPos = m_resStart + m_csFindWhatArray[1].GetLength();
            } else {
                nStartPos = m_resStart + m_csFindWhatArray[0].GetLength();
            }
        }
    }
    m_resEnd = nResultPos + m_csFindWhatArray[m_csFindWhatArray.GetSize() - 1].GetLength() - 1;
    m_IsFind = TRUE;
    int resStart = GetCharIndex(m_resStart);
    int resEnd = GetCharIndex(m_resEnd);
    m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1, m_resArray);
    if(m_flags & FPDFTEXT_CONSECUTIVE) {
        m_findNextStart = m_resStart + 1;
        m_findPreStart = m_resEnd - 1;
    } else {
        m_findNextStart = m_resEnd + 1;
        m_findPreStart = m_resStart - 1;
    }
    return m_IsFind;
}
FX_BOOL CPDF_TextPageFind::FindPrev()
{
    if (!m_pTextPage) {
        return FALSE;
    }
    m_resArray.RemoveAll();
    if(m_strText.IsEmpty() || m_findPreStart < 0) {
        m_IsFind = FALSE;
        return m_IsFind;
    }
    CPDF_TextPageFind findEngine(m_pTextPage);
    FX_BOOL ret = findEngine.FindFirst(m_findWhat, m_flags);
    if(!ret) {
        m_IsFind = FALSE;
        return m_IsFind;
    }
    int	order = -1, MatchedCount = 0;
    while(ret) {
        ret = findEngine.FindNext();
        if(ret) {
            int order1 = findEngine.GetCurOrder() ;
            int	MatchedCount1 = findEngine.GetMatchedCount();
            if(((order1 + MatchedCount1) - 1) > m_findPreStart) {
                break;
            }
            order = order1;
            MatchedCount = MatchedCount1;
        }
    }
    if(order == -1) {
        m_IsFind = FALSE;
        return m_IsFind;
    }
    m_resStart = m_pTextPage->TextIndexFromCharIndex(order);
    m_resEnd = m_pTextPage->TextIndexFromCharIndex(order + MatchedCount - 1);
    m_IsFind = TRUE;
    m_pTextPage->GetRectArray(order, MatchedCount, m_resArray);
    if(m_flags & FPDFTEXT_CONSECUTIVE) {
        m_findNextStart = m_resStart + 1;
        m_findPreStart = m_resEnd - 1;
    } else {
        m_findNextStart = m_resEnd + 1;
        m_findPreStart = m_resStart - 1;
    }
    return m_IsFind;
}
void CPDF_TextPageFind::ExtractFindWhat(const CFX_WideString& findwhat)
{
    if(findwhat.IsEmpty()) {
        return ;
    }
    int index = 0;
    while(1) {
        CFX_WideString csWord = TEXT_EMPTY;
        int ret = ExtractSubString(csWord, findwhat.c_str(), index, TEXT_BLANK_CHAR);
        if(csWord.IsEmpty()) {
            if(ret) {
                m_csFindWhatArray.Add(CFX_WideString(L""));
                index++;
                continue;
            } else {
                break;
            }
        }
        int pos = 0;
        while(pos < csWord.GetLength()) {
            CFX_WideString curStr = csWord.Mid(pos, 1);
            FX_WCHAR curChar = csWord.GetAt(pos);
            if (_IsIgnoreSpaceCharacter(curChar)) {
                if (pos > 0 && curChar == 0x2019) {
                    pos++;
                    continue;
                }
                if (pos > 0 ) {
                    CFX_WideString preStr = csWord.Mid(0, pos);
                    m_csFindWhatArray.Add(preStr);
                }
                m_csFindWhatArray.Add(curStr);
                if (pos == csWord.GetLength() - 1) {
                    csWord.Empty();
                    break;
                }
                csWord = csWord.Right(csWord.GetLength() - pos - 1);
                pos = 0;
                continue;
            }
            pos++;
        }
        if (!csWord.IsEmpty()) {
            m_csFindWhatArray.Add(csWord);
        }
        index++;
    }
}
FX_BOOL CPDF_TextPageFind::IsMatchWholeWord(const CFX_WideString& csPageText, int startPos, int endPos)
{
    int char_left = 0;
    int char_right = 0;
    int char_count = endPos - startPos + 1;
    if(char_count < 1) {
        return FALSE;
    }
    if (char_count == 1 && csPageText.GetAt(startPos) > 255) {
        return TRUE;
    }
    if(startPos - 1 >= 0 ) {
        char_left = csPageText.GetAt(startPos - 1);
    }
    if(startPos + char_count < csPageText.GetLength()) {
        char_right = csPageText.GetAt(startPos + char_count);
    }
    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;
    }
    if(!(('A' > char_left || char_left > 'Z')  && ('a' > char_left || char_left > 'z')
            && ('A' > char_right || char_right > 'Z')  && ('a' > char_right || char_right > 'z'))) {
        return FALSE;
    }
    if (char_count > 0) {
        if (csPageText.GetAt(startPos) >= L'0' && csPageText.GetAt(startPos) <= L'9' && char_left >= L'0' && char_left <= L'9') {
            return FALSE;
        }
        if (csPageText.GetAt(endPos) >= L'0' && csPageText.GetAt(endPos) <= L'9' && char_right >= L'0' && char_right <= L'9') {
            return FALSE;
        }
    }
    return TRUE;
}
FX_BOOL CPDF_TextPageFind::ExtractSubString(CFX_WideString& rString, const FX_WCHAR* lpszFullString,
        int iSubString, FX_WCHAR chSep)
{
    if (lpszFullString == NULL) {
        return FALSE;
    }
    while (iSubString--) {
        lpszFullString = FXSYS_wcschr(lpszFullString, chSep);
        if (lpszFullString == NULL) {
            rString.Empty();
            return FALSE;
        }
        lpszFullString++;
        while(*lpszFullString == chSep) {
            lpszFullString++;
        }
    }
    const FX_WCHAR* lpchEnd = FXSYS_wcschr(lpszFullString, chSep);
    int nLen = (lpchEnd == NULL) ?
               (int)FXSYS_wcslen(lpszFullString) : (int)(lpchEnd - lpszFullString);
    ASSERT(nLen >= 0);
    FXSYS_memcpy(rString.GetBuffer(nLen), lpszFullString, nLen * sizeof(FX_WCHAR));
    rString.ReleaseBuffer();
    return TRUE;
}
CFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString& str)
{
    CFX_WideString str2;
    str2.Empty();
    int nlen = str.GetLength();
    for(int i = nlen - 1; i >= 0; i--) {
        str2 += str.GetAt(i);
    }
    return str2;
}
void CPDF_TextPageFind::GetRectArray(CFX_RectArray& rects) const
{
    rects.Copy(m_resArray);
}
int	CPDF_TextPageFind::GetCurOrder() const
{
    return GetCharIndex(m_resStart);
}
int	CPDF_TextPageFind::GetMatchedCount()const
{
    int resStart = GetCharIndex(m_resStart);
    int resEnd = GetCharIndex(m_resEnd);
    return resEnd - resStart + 1;
}
CPDF_LinkExtract::CPDF_LinkExtract()
    : m_pTextPage(NULL),
      m_IsParserd(FALSE)
{
}
CPDF_LinkExtract::~CPDF_LinkExtract()
{
    DeleteLinkList();
}
FX_BOOL CPDF_LinkExtract::ExtractLinks(const IPDF_TextPage* pTextPage)
{
    if (!pTextPage || !pTextPage->IsParsered()) {
        return FALSE;
    }
    m_pTextPage = (const CPDF_TextPage*)pTextPage;
    m_strPageText = m_pTextPage->GetPageText(0, -1);
    DeleteLinkList();
    if (m_strPageText.IsEmpty()) {
        return FALSE;
    }
    parserLink();
    m_IsParserd = TRUE;
    return TRUE;
}
void CPDF_LinkExtract::DeleteLinkList()
{
    while (m_LinkList.GetSize()) {
        CPDF_LinkExt* linkinfo = NULL;
        linkinfo = m_LinkList.GetAt(0);
        m_LinkList.RemoveAt(0);
        delete linkinfo;
    }
    m_LinkList.RemoveAll();
}
int CPDF_LinkExtract::CountLinks() const
{
    if (!m_IsParserd)	{
        return -1;
    }
    return m_LinkList.GetSize();
}
void CPDF_LinkExtract::parserLink()
{
    int start = 0, pos = 0;
    int TotalChar = m_pTextPage->CountChars();
    while (pos < TotalChar) {
        FPDF_CHAR_INFO pageChar;
        m_pTextPage->GetCharInfo(pos, pageChar);
        if (pageChar.m_Flag == CHAR_GENERATED || pageChar.m_Unicode == 0x20 || pos == TotalChar - 1) {
            int nCount = pos - start;
            if(pos == TotalChar - 1) {
                nCount++;
            }
            CFX_WideString strBeCheck;
            strBeCheck = m_pTextPage->GetPageText(start, nCount);
            if (strBeCheck.GetLength() > 5) {
                while(strBeCheck.GetLength() > 0) {
                    FX_WCHAR ch = strBeCheck.GetAt(strBeCheck.GetLength() - 1);
                    if (ch == L')' || ch == L',' || ch == L'>' || ch == L'.') {
                        strBeCheck = strBeCheck.Mid(0, strBeCheck.GetLength() - 1);
                        nCount--;
                    } else {
                        break;
                    }
                }
                if (nCount > 5 && (CheckWebLink(strBeCheck) || CheckMailLink(strBeCheck))) {
                    if (!AppendToLinkList(start, nCount, strBeCheck)) {
                        break;
                    }
                }
            }
            start = ++pos;
        } else {
            pos++;
        }
    }
}
FX_BOOL CPDF_LinkExtract::CheckWebLink(CFX_WideString& strBeCheck)
{
    CFX_WideString str = strBeCheck;
    str.MakeLower();
    if (str.Find(L"http://www.") != -1) {
        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://www."));
        return TRUE;
    }
    if (str.Find(L"http://") != -1) {
        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://"));
        return TRUE;
    }
    if (str.Find(L"https://www.") != -1) {
        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://www."));
        return TRUE;
    }
    if (str.Find(L"https://") != -1) {
        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://"));
        return TRUE;
    }
    if (str.Find(L"www.") != -1) {
        strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"www."));
        strBeCheck = L"http://" + strBeCheck;
        return TRUE;
    }
    return FALSE;
}
FX_BOOL CPDF_LinkExtract::CheckMailLink(CFX_WideString& str)
{
    str.MakeLower();
    int aPos = str.Find(L'@');
    if (aPos < 1) {
        return FALSE;
    }
    if (str.GetAt(aPos - 1) == L'.' || str.GetAt(aPos - 1) == L'_') {
        return FALSE;
    }
    int i;
    for (i = aPos - 1; i >= 0; i--) {
        FX_WCHAR ch = str.GetAt(i);
        if (ch == L'_' || ch == L'.' || (ch >= L'a' && ch <= L'z') || (ch >= L'0' && ch <= L'9')) {
            continue;
        } else {
            if (i == aPos - 1) {
                return FALSE;
            }
            str = str.Right(str.GetLength() - i - 1);
            break;
        }
    }
    aPos = str.Find(L'@');
    if (aPos < 1) {
        return FALSE;
    }
    CFX_WideString strtemp = L"";
    for (i = 0; i < aPos; i++) {
        FX_WCHAR wch = str.GetAt(i);
        if (wch >= L'a' && wch <= L'z') {
            break;
        } else {
            strtemp = str.Right(str.GetLength() - i + 1);
        }
    }
    if (strtemp != L"") {
        str = strtemp;
    }
    aPos = str.Find(L'@');
    if (aPos < 1) {
        return FALSE;
    }
    str.TrimRight(L'.');
    strtemp = str;
    int ePos = str.Find(L'.');
    if (ePos == -1) {
        return FALSE;
    }
    while (ePos != -1) {
        strtemp = strtemp.Right(strtemp.GetLength() - ePos - 1);
        ePos = strtemp.Find('.');
    }
    ePos = strtemp.GetLength();
    for (i = 0; i < ePos; i++) {
        FX_WCHAR wch = str.GetAt(i);
        if ((wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {
            continue;
        } else {
            str = str.Left(str.GetLength() - ePos + i + 1);
            ePos = ePos - i - 1;
            break;
        }
    }
    int nLen = str.GetLength();
    for (i = aPos + 1; i < nLen - ePos; i++) {
        FX_WCHAR wch = str.GetAt(i);
        if (wch == L'-' || wch == L'.' || (wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {
            continue;
        } else {
            return FALSE;
        }
    }
    if (str.Find(L"mailto:") == -1) {
        str = L"mailto:" + str;
    }
    return TRUE;
}
FX_BOOL CPDF_LinkExtract::AppendToLinkList(int start, int count, const CFX_WideString& strUrl)
{
    CPDF_LinkExt* linkInfo = new CPDF_LinkExt;
    linkInfo->m_strUrl = strUrl;
    linkInfo->m_Start = start;
    linkInfo->m_Count = count;
    m_LinkList.Add(linkInfo);
    return TRUE;
}
CFX_WideString CPDF_LinkExtract::GetURL(int index) const
{
    if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
        return L"";
    }
    CPDF_LinkExt* link = NULL;
    link = m_LinkList.GetAt(index);
    if (!link) {
        return L"";
    }
    return link->m_strUrl;
}
void CPDF_LinkExtract::GetBoundedSegment(int index, int& start, int& count) const
{
    if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
        return ;
    }
    CPDF_LinkExt* link = NULL;
    link = m_LinkList.GetAt(index);
    if (!link) {
        return ;
    }
    start = link->m_Start;
    count = link->m_Count;
}
void CPDF_LinkExtract::GetRects(int index, CFX_RectArray& rects) const
{
    if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
        return;
    }
    CPDF_LinkExt* link = NULL;
    link = m_LinkList.GetAt(index);
    if (!link) {
        return ;
    }
    m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects);
}
