// Copyright 2016 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_FPDFTEXT_INCLUDE_IPDF_TEXTPAGE_H_
#define CORE_FPDFTEXT_INCLUDE_IPDF_TEXTPAGE_H_

#include "core/include/fpdfapi/fpdf_page.h"
#include "core/include/fpdfapi/fpdf_pageobj.h"
#include "core/include/fxcrt/fx_coordinates.h"
#include "core/include/fxcrt/fx_system.h"

struct FPDF_CHAR_INFO {
  FX_WCHAR m_Unicode;
  FX_WCHAR m_Charcode;
  int32_t m_Flag;
  FX_FLOAT m_FontSize;
  FX_FLOAT m_OriginX;
  FX_FLOAT m_OriginY;
  CFX_FloatRect m_CharBox;
  CPDF_TextObject* m_pTextObj;
  CFX_Matrix m_Matrix;
};

class IPDF_TextPage {
 public:
  static IPDF_TextPage* CreateTextPage(const CPDF_Page* pPage, int flags = 0);
  virtual ~IPDF_TextPage() {}

  virtual void ParseTextPage() = 0;
  virtual bool IsParsed() const = 0;
  virtual int CharIndexFromTextIndex(int TextIndex) const = 0;
  virtual int TextIndexFromCharIndex(int CharIndex) const = 0;
  virtual int CountChars() const = 0;
  virtual void GetCharInfo(int index, FPDF_CHAR_INFO* info) const = 0;
  virtual void GetRectArray(int start,
                            int nCount,
                            CFX_RectArray& rectArray) const = 0;
  virtual int GetIndexAtPos(CFX_FloatPoint point,
                            FX_FLOAT xTolerance,
                            FX_FLOAT yTolerance) const = 0;
  virtual int GetIndexAtPos(FX_FLOAT x,
                            FX_FLOAT y,
                            FX_FLOAT xTolerance,
                            FX_FLOAT yTolerance) const = 0;
  virtual CFX_WideString GetTextByRect(const CFX_FloatRect& rect) const = 0;
  virtual void GetRectsArrayByRect(const CFX_FloatRect& rect,
                                   CFX_RectArray& resRectArray) const = 0;
  virtual int CountRects(int start, int nCount) = 0;
  virtual void GetRect(int rectIndex,
                       FX_FLOAT& left,
                       FX_FLOAT& top,
                       FX_FLOAT& right,
                       FX_FLOAT& bottom) const = 0;
  virtual FX_BOOL GetBaselineRotate(int rectIndex, int& Rotate) = 0;
  virtual FX_BOOL GetBaselineRotate(const CFX_FloatRect& rect, int& Rotate) = 0;
  virtual int CountBoundedSegments(FX_FLOAT left,
                                   FX_FLOAT top,
                                   FX_FLOAT right,
                                   FX_FLOAT bottom,
                                   FX_BOOL bContains = FALSE) = 0;
  virtual void GetBoundedSegment(int index, int& start, int& count) const = 0;
  virtual int GetWordBreak(int index, int direction) const = 0;
  virtual CFX_WideString GetPageText(int start = 0, int nCount = -1) const = 0;
};

#endif  // CORE_FPDFTEXT_INCLUDE_IPDF_TEXTPAGE_H_
