// 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_ArrayTemplate<CTextBox*> 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:
  void FindColumns();
  CTextColumn* FindColumn(FX_FLOAT xpos);
  void BreakSpace(CPDF_TextObject* pTextObj);

  CFX_ArrayTemplate<CTextBaseLine*> m_BaseLines;
  CFX_ArrayTemplate<CTextColumn*> m_TextColumns;
};

#endif  // CORE_SRC_FPDFTEXT_TXTPROC_H_
