// 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_INCLUDE_FPDFTEXT_FPDF_TEXT_H_
#define CORE_INCLUDE_FPDFTEXT_FPDF_TEXT_H_

#include "../fpdfapi/fpdf_parser.h"

class CPDF_Page;
class CPDF_PageObjects;
class CPDF_TextObject;
class IPDF_LinkExtract;
class IPDF_ReflowedPage;
class IPDF_TextPage;
class IPDF_TextPageFind;

#define PDF2TXT_AUTO_ROTATE 1
#define PDF2TXT_AUTO_WIDTH 2
#define PDF2TXT_KEEP_COLUMN 4
#define PDF2TXT_USE_OCR 8
#define PDF2TXT_INCLUDE_INVISIBLE 16
void PDF_GetPageText(CFX_ByteStringArray& lines,
                     CPDF_Document* pDoc,
                     CPDF_Dictionary* pPage,
                     int iMinWidth,
                     FX_DWORD flags);
void PDF_GetPageText_Unicode(CFX_WideStringArray& lines,
                             CPDF_Document* pDoc,
                             CPDF_Dictionary* pPage,
                             int iMinWidth,
                             FX_DWORD flags);
void PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer,
                               CPDF_Document* pDoc,
                               CPDF_Dictionary* pPage,
                               FX_DWORD flags);
CFX_WideString PDF_GetFirstTextLine_Unicode(CPDF_Document* pDoc,
                                            CPDF_Dictionary* pPage);
#define CHAR_ERROR -1
#define CHAR_NORMAL 0
#define CHAR_GENERATED 1
#define CHAR_UNUNICODE 2
typedef struct {
  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_AffineMatrix m_Matrix;
} FPDF_CHAR_INFO;
typedef CFX_ArrayTemplate<CFX_FloatRect> CFX_RectArray;
#define FPDFTEXT_LRTB 0
#define FPDFTEXT_RLTB 1
#define FPDFTEXT_TBRL 2
#define FPDFTEXT_LEFT -1
#define FPDFTEXT_RIGHT 1
#define FPDFTEXT_UP -2
#define FPDFTEXT_DOWN 2
#define FPDFTEXT_WRITINGMODE_UNKNOW 0
#define FPDFTEXT_WRITINGMODE_LRTB 1
#define FPDFTEXT_WRITINGMODE_RLTB 2
#define FPDFTEXT_WRITINGMODE_TBRL 3
class CPDFText_ParseOptions {
 public:
  CPDFText_ParseOptions();
  FX_BOOL m_bGetCharCodeOnly;
  FX_BOOL m_bNormalizeObjs;
  FX_BOOL m_bOutputHyphen;
};

class IPDF_TextPage {
 public:
  static IPDF_TextPage* CreateTextPage(const CPDF_Page* pPage, int flags = 0);
  static IPDF_TextPage* CreateReflowTextPage(IPDF_ReflowedPage* pRefPage);

  virtual ~IPDF_TextPage() {}

  virtual void NormalizeObjects(FX_BOOL bNormalize) = 0;

  virtual FX_BOOL 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(CPDF_Point 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;
};

#define FPDFTEXT_MATCHCASE 0x00000001
#define FPDFTEXT_MATCHWHOLEWORD 0x00000002
#define FPDFTEXT_CONSECUTIVE 0x00000004
class IPDF_TextPageFind {
 public:
  virtual ~IPDF_TextPageFind() {}

  static IPDF_TextPageFind* CreatePageFind(const IPDF_TextPage* pTextPage);

 public:
  virtual FX_BOOL FindFirst(const CFX_WideString& findwhat,
                            int flags,
                            int startPos = 0) = 0;

  virtual FX_BOOL FindNext() = 0;

  virtual FX_BOOL FindPrev() = 0;

  virtual void GetRectArray(CFX_RectArray& rects) const = 0;

  virtual int GetCurOrder() const = 0;

  virtual int GetMatchedCount() const = 0;
};
class IPDF_LinkExtract {
 public:
  virtual ~IPDF_LinkExtract() {}

  static IPDF_LinkExtract* CreateLinkExtract();

  virtual FX_BOOL ExtractLinks(const IPDF_TextPage* pTextPage) = 0;

 public:
  virtual int CountLinks() const = 0;

  virtual CFX_WideString GetURL(int index) const = 0;

  virtual void GetBoundedSegment(int index, int& start, int& count) const = 0;

  virtual void GetRects(int index, CFX_RectArray& rects) const = 0;
};

#endif  // CORE_INCLUDE_FPDFTEXT_FPDF_TEXT_H_
