// 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 CORE_SRC_FPDFTEXT_TXTPROC_H_
#define CORE_SRC_FPDFTEXT_TXTPROC_H_

class CTextColumn {
 public:
  FX_FLOAT m_AvgPos;
  int m_Count;
  int m_TextPos;
};
class CTextBox {
 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:
  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:
  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;

 private:
  CFX_PtrArray m_BaseLines;
  CFX_PtrArray m_TextColumns;
  void FindColumns();
  CTextColumn* FindColumn(FX_FLOAT xpos);
  void BreakSpace(CPDF_TextObject* pTextObj);
};

#endif  // CORE_SRC_FPDFTEXT_TXTPROC_H_
