// 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

#ifndef _PDF_TXTPROC_H_
#define _PDF_TXTPROC_H_
class CTextColumn : public CFX_Object
{
public:
    FX_FLOAT	m_AvgPos;
    int		m_Count;
    int		m_TextPos;
};
class CTextBox : public CFX_Object
{
public:
    CFX_WideString	m_Text;
    FX_FLOAT	m_Left;
    FX_FLOAT	m_Right;
    FX_FLOAT	m_SpaceWidth;
    FX_FLOAT	m_Top;
    FX_FLOAT	m_Bottom;
    FX_FLOAT	m_FontSizeV;
    CTextColumn* m_pColumn;
};
class CTextBaseLine : public CFX_Object
{
public:
    CTextBaseLine();
    ~CTextBaseLine();
    void	InsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy,
                          FX_FLOAT spacew, FX_FLOAT fontsize_v, const CFX_WideString& str);
    FX_BOOL	GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx);
    FX_BOOL	CanMerge(CTextBaseLine* pOther);
    void	Merge(CTextBaseLine* pOther);
    void	MergeBoxes();
    void	CountChars(int& count, FX_FLOAT& width, int& minchars);
    void	WriteOutput(CFX_WideString& str, FX_FLOAT leftx, FX_FLOAT width, int iWidth);
    FX_FLOAT	m_BaseLine;
    FX_FLOAT	m_Top;
    FX_FLOAT	m_Bottom;
    FX_FLOAT	m_MaxFontSizeV;
    CFX_PtrArray		m_TextList;
};
class CPDF_PageObject;
class CPDF_TextObject;
class CTextPage : public CFX_Object
{
public:
    CTextPage();
    ~CTextPage();
    void	ProcessObject(CPDF_PageObject* pObj);
    CTextBaseLine* InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey, FX_FLOAT leftx,
                                 FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy, FX_FLOAT spacew, FX_FLOAT fontsize_v,
                                 CFX_ByteString& str, CPDF_Font* pFont);
    void	WriteOutput(CFX_WideStringArray& lines, int iMinWidth);
    FX_BOOL	m_bAutoWidth;
    FX_BOOL	m_bKeepColumn;
    FX_BOOL	m_bBreakSpace;
    FX_BOOL	m_bOCR;
private:
    CFX_PtrArray	m_BaseLines;
    CFX_PtrArray	m_TextColumns;
    void	FindColumns();
    CTextColumn*	FindColumn(FX_FLOAT xpos);
    void	BreakSpace(CPDF_TextObject* pTextObj);
};
#endif
