// 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_FPDFDOC_PDF_VT_H_
#define CORE_SRC_FPDFDOC_PDF_VT_H_

class CPVT_Size;
class CPVT_FloatRect;
struct CPVT_SectionInfo;
struct CPVT_LineInfo;
struct CPVT_WordInfo;
class CLine;
class CLines;
class CSection;
class CTypeset;
class CPDF_EditContainer;
class CPDF_VariableText;
class CPDF_VariableText_Iterator;
#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
template <class T>
T FPDF_MIN(const T& i, const T& j) {
  return ((i < j) ? i : j);
}
template <class T>
T FPDF_MAX(const T& i, const T& j) {
  return ((i > j) ? i : j);
}
class CPVT_Size {
 public:
  CPVT_Size() : x(0.0f), y(0.0f) {}
  CPVT_Size(FX_FLOAT other_x, FX_FLOAT other_y) {
    x = other_x;
    y = other_y;
  }
  FX_FLOAT x, y;
};
class CPVT_FloatRect : public CFX_FloatRect {
 public:
  CPVT_FloatRect() { left = top = right = bottom = 0.0f; }
  CPVT_FloatRect(FX_FLOAT other_left,
                 FX_FLOAT other_top,
                 FX_FLOAT other_right,
                 FX_FLOAT other_bottom) {
    left = other_left;
    top = other_top;
    right = other_right;
    bottom = other_bottom;
  }
  CPVT_FloatRect(const CPDF_Rect& rect) {
    left = rect.left;
    top = rect.top;
    right = rect.right;
    bottom = rect.bottom;
  }
  void Default() { left = top = right = bottom = 0.0f; }
  FX_FLOAT Height() const {
    if (top > bottom)
      return top - bottom;
    return bottom - top;
  }
};
struct CPVT_SectionInfo {
  CPVT_SectionInfo()
      : rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL) {}
  virtual ~CPVT_SectionInfo() {
    delete pSecProps;
    delete pWordProps;
  }
  CPVT_SectionInfo(const CPVT_SectionInfo& other)
      : rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL) {
    operator=(other);
  }
  void operator=(const CPVT_SectionInfo& other) {
    if (this == &other) {
      return;
    }
    rcSection = other.rcSection;
    nTotalLine = other.nTotalLine;
    if (other.pSecProps) {
      if (pSecProps) {
        *pSecProps = *other.pSecProps;
      } else {
        pSecProps = new CPVT_SecProps(*other.pSecProps);
      }
    }
    if (other.pWordProps) {
      if (pWordProps) {
        *pWordProps = *other.pWordProps;
      } else {
        pWordProps = new CPVT_WordProps(*other.pWordProps);
      }
    }
  }
  CPVT_FloatRect rcSection;
  int32_t nTotalLine;
  CPVT_SecProps* pSecProps;
  CPVT_WordProps* pWordProps;
};
struct CPVT_LineInfo {
  CPVT_LineInfo()
      : nTotalWord(0),
        nBeginWordIndex(-1),
        nEndWordIndex(-1),
        fLineX(0.0f),
        fLineY(0.0f),
        fLineWidth(0.0f),
        fLineAscent(0.0f),
        fLineDescent(0.0f) {}
  int32_t nTotalWord;
  int32_t nBeginWordIndex;
  int32_t nEndWordIndex;
  FX_FLOAT fLineX;
  FX_FLOAT fLineY;
  FX_FLOAT fLineWidth;
  FX_FLOAT fLineAscent;
  FX_FLOAT fLineDescent;
};
struct CPVT_WordInfo {
  CPVT_WordInfo()
      : Word(0),
        nCharset(0),
        fWordX(0.0f),
        fWordY(0.0f),
        fWordTail(0.0f),
        nFontIndex(-1),
        pWordProps(NULL) {}
  CPVT_WordInfo(FX_WORD word,
                int32_t charset,
                int32_t fontIndex,
                CPVT_WordProps* pProps)
      : Word(word),
        nCharset(charset),
        fWordX(0.0f),
        fWordY(0.0f),
        fWordTail(0.0f),
        nFontIndex(fontIndex),
        pWordProps(pProps) {}
  virtual ~CPVT_WordInfo() { delete pWordProps; }
  CPVT_WordInfo(const CPVT_WordInfo& word)
      : Word(0),
        nCharset(0),
        fWordX(0.0f),
        fWordY(0.0f),
        fWordTail(0.0f),
        nFontIndex(-1),
        pWordProps(NULL) {
    operator=(word);
  }
  void operator=(const CPVT_WordInfo& word) {
    if (this == &word) {
      return;
    }
    Word = word.Word;
    nCharset = word.nCharset;
    nFontIndex = word.nFontIndex;
    if (word.pWordProps) {
      if (pWordProps) {
        *pWordProps = *word.pWordProps;
      } else {
        pWordProps = new CPVT_WordProps(*word.pWordProps);
      }
    }
  }
  FX_WORD Word;
  int32_t nCharset;
  FX_FLOAT fWordX;
  FX_FLOAT fWordY;
  FX_FLOAT fWordTail;
  int32_t nFontIndex;
  CPVT_WordProps* pWordProps;
};
struct CPVT_FloatRange {
  CPVT_FloatRange() : fMin(0.0f), fMax(0.0f) {}
  CPVT_FloatRange(FX_FLOAT min, FX_FLOAT max) : fMin(min), fMax(max) {}
  FX_FLOAT Range() const { return fMax - fMin; }
  FX_FLOAT fMin, fMax;
};
template <class TYPE>
class CPVT_ArrayTemplate : public CFX_ArrayTemplate<TYPE> {
 public:
  FX_BOOL IsEmpty() { return CFX_ArrayTemplate<TYPE>::GetSize() <= 0; }
  TYPE GetAt(int nIndex) const {
    if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
      return CFX_ArrayTemplate<TYPE>::GetAt(nIndex);
    }
    return NULL;
  }
  void RemoveAt(int nIndex) {
    if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
      CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);
    }
  }
};
class CLine {
 public:
  CLine();
  virtual ~CLine();
  CPVT_WordPlace GetBeginWordPlace() const;
  CPVT_WordPlace GetEndWordPlace() const;
  CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const;
  CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const;
  CPVT_WordPlace LinePlace;
  CPVT_LineInfo m_LineInfo;
};
class CLines {
 public:
  CLines() : m_nTotal(0) {}
  virtual ~CLines() { RemoveAll(); }
  int32_t GetSize() const { return m_Lines.GetSize(); }
  CLine* GetAt(int32_t nIndex) const { return m_Lines.GetAt(nIndex); }
  void Empty() { m_nTotal = 0; }
  void RemoveAll() {
    for (int32_t i = 0, sz = GetSize(); i < sz; i++) {
      delete GetAt(i);
    }
    m_Lines.RemoveAll();
    m_nTotal = 0;
  }
  int32_t Add(const CPVT_LineInfo& lineinfo) {
    if (m_nTotal >= GetSize()) {
      CLine* pLine = new CLine;
      pLine->m_LineInfo = lineinfo;
      m_Lines.Add(pLine);
    } else if (CLine* pLine = GetAt(m_nTotal)) {
      pLine->m_LineInfo = lineinfo;
    }
    return m_nTotal++;
  }
  void Clear() {
    for (int32_t i = GetSize() - 1; i >= m_nTotal; i--) {
      delete GetAt(i);
      m_Lines.RemoveAt(i);
    }
  }

 private:
  CPVT_ArrayTemplate<CLine*> m_Lines;
  int32_t m_nTotal;
};
class CSection {
  friend class CTypeset;

 public:
  CSection(CPDF_VariableText* pVT);
  virtual ~CSection();
  void ResetAll();
  void ResetLineArray();
  void ResetWordArray();
  void ResetLinePlace();
  CPVT_WordPlace AddWord(const CPVT_WordPlace& place,
                         const CPVT_WordInfo& wordinfo);
  CPVT_WordPlace AddLine(const CPVT_LineInfo& lineinfo);
  void ClearWords(const CPVT_WordRange& PlaceRange);
  void ClearWord(const CPVT_WordPlace& place);
  CPVT_FloatRect Rearrange();
  CPVT_Size GetSectionSize(FX_FLOAT fFontSize);
  CPVT_WordPlace GetBeginWordPlace() const;
  CPVT_WordPlace GetEndWordPlace() const;
  CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const;
  CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const;
  void UpdateWordPlace(CPVT_WordPlace& place) const;
  CPVT_WordPlace SearchWordPlace(const CPDF_Point& point) const;
  CPVT_WordPlace SearchWordPlace(FX_FLOAT fx,
                                 const CPVT_WordPlace& lineplace) const;
  CPVT_WordPlace SearchWordPlace(FX_FLOAT fx,
                                 const CPVT_WordRange& range) const;

 public:
  CPVT_WordPlace SecPlace;
  CPVT_SectionInfo m_SecInfo;
  CLines m_LineArray;
  CPVT_ArrayTemplate<CPVT_WordInfo*> m_WordArray;

 private:
  void ClearLeftWords(int32_t nWordIndex);
  void ClearRightWords(int32_t nWordIndex);
  void ClearMidWords(int32_t nBeginIndex, int32_t nEndIndex);

  CPDF_VariableText* m_pVT;
};
class CTypeset {
 public:
  CTypeset(CSection* pSection);
  virtual ~CTypeset();
  CPVT_Size GetEditSize(FX_FLOAT fFontSize);
  CPVT_FloatRect Typeset();
  CPVT_FloatRect CharArray();

 private:
  void SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize);
  void OutputLines();

  CPVT_FloatRect m_rcRet;
  CPDF_VariableText* m_pVT;
  CSection* m_pSection;
};
class CPDF_EditContainer {
 public:
  CPDF_EditContainer() : m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {}
  virtual ~CPDF_EditContainer() {}
  virtual void SetPlateRect(const CPDF_Rect& rect) { m_rcPlate = rect; }
  virtual const CPDF_Rect& GetPlateRect() const { return m_rcPlate; }
  virtual void SetContentRect(const CPVT_FloatRect& rect) {
    m_rcContent = rect;
  };
  virtual CPDF_Rect GetContentRect() const { return m_rcContent; }
  FX_FLOAT GetPlateWidth() const { return m_rcPlate.right - m_rcPlate.left; }
  FX_FLOAT GetPlateHeight() const { return m_rcPlate.top - m_rcPlate.bottom; }
  CPVT_Size GetPlateSize() const {
    return CPVT_Size(GetPlateWidth(), GetPlateHeight());
  };
  CPDF_Point GetBTPoint() const {
    return CPDF_Point(m_rcPlate.left, m_rcPlate.top);
  };
  CPDF_Point GetETPoint() const {
    return CPDF_Point(m_rcPlate.right, m_rcPlate.bottom);
  };
  inline CPDF_Point InToOut(const CPDF_Point& point) const {
    return CPDF_Point(point.x + GetBTPoint().x, GetBTPoint().y - point.y);
  };
  inline CPDF_Point OutToIn(const CPDF_Point& point) const {
    return CPDF_Point(point.x - GetBTPoint().x, GetBTPoint().y - point.y);
  };
  inline CPDF_Rect InToOut(const CPVT_FloatRect& rect) const {
    CPDF_Point ptLeftTop = InToOut(CPDF_Point(rect.left, rect.top));
    CPDF_Point ptRightBottom = InToOut(CPDF_Point(rect.right, rect.bottom));
    return CPDF_Rect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x,
                     ptLeftTop.y);
  };
  inline CPVT_FloatRect OutToIn(const CPDF_Rect& rect) const {
    CPDF_Point ptLeftTop = OutToIn(CPDF_Point(rect.left, rect.top));
    CPDF_Point ptRightBottom = OutToIn(CPDF_Point(rect.right, rect.bottom));
    return CPVT_FloatRect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x,
                          ptRightBottom.y);
  };

 private:
  CPDF_Rect m_rcPlate;
  CPVT_FloatRect m_rcContent;
};

class CPDF_VariableText : public IPDF_VariableText, private CPDF_EditContainer {
  friend class CTypeset;
  friend class CSection;
  friend class CPDF_VariableText_Iterator;

 public:
  CPDF_VariableText();
  ~CPDF_VariableText() override;

  // IPDF_VariableText
  IPDF_VariableText_Provider* SetProvider(
      IPDF_VariableText_Provider* pProvider) override;
  IPDF_VariableText_Iterator* GetIterator() override;
  void SetPlateRect(const CPDF_Rect& rect) override {
    CPDF_EditContainer::SetPlateRect(rect);
  }
  void SetAlignment(int32_t nFormat = 0) override { m_nAlignment = nFormat; }
  void SetPasswordChar(FX_WORD wSubWord = '*') override {
    m_wSubWord = wSubWord;
  }
  void SetLimitChar(int32_t nLimitChar = 0) override {
    m_nLimitChar = nLimitChar;
  }
  void SetCharSpace(FX_FLOAT fCharSpace = 0.0f) override {
    m_fCharSpace = fCharSpace;
  }
  void SetHorzScale(int32_t nHorzScale = 100) override {
    m_nHorzScale = nHorzScale;
  }
  void SetMultiLine(FX_BOOL bMultiLine = TRUE) override {
    m_bMultiLine = bMultiLine;
  }
  void SetAutoReturn(FX_BOOL bAuto = TRUE) override { m_bLimitWidth = bAuto; }
  void SetFontSize(FX_FLOAT fFontSize) override { m_fFontSize = fFontSize; }
  void SetCharArray(int32_t nCharArray = 0) override {
    m_nCharArray = nCharArray;
  }
  void SetAutoFontSize(FX_BOOL bAuto = TRUE) override {
    m_bAutoFontSize = bAuto;
  }
  void SetRichText(FX_BOOL bRichText) override { m_bRichText = bRichText; }
  void SetLineLeading(FX_FLOAT fLineLeading) override {
    m_fLineLeading = fLineLeading;
  }
  void Initialize() override;
  FX_BOOL IsValid() const override { return m_bInitial; }
  FX_BOOL IsRichText() const override { return m_bRichText; }
  void RearrangeAll() override;
  void RearrangePart(const CPVT_WordRange& PlaceRange) override;
  void ResetAll() override;
  void SetText(const FX_WCHAR* text,
               int32_t charset = 1,
               const CPVT_SecProps* pSecProps = NULL,
               const CPVT_WordProps* pWordProps = NULL) override;
  CPVT_WordPlace InsertWord(const CPVT_WordPlace& place,
                            FX_WORD word,
                            int32_t charset = 1,
                            const CPVT_WordProps* pWordProps = NULL) override;
  CPVT_WordPlace InsertSection(
      const CPVT_WordPlace& place,
      const CPVT_SecProps* pSecProps = NULL,
      const CPVT_WordProps* pWordProps = NULL) override;
  CPVT_WordPlace InsertText(const CPVT_WordPlace& place,
                            const FX_WCHAR* text,
                            int32_t charset = 1,
                            const CPVT_SecProps* pSecProps = NULL,
                            const CPVT_WordProps* pWordProps = NULL) override;
  CPVT_WordPlace DeleteWords(const CPVT_WordRange& PlaceRange) override;
  CPVT_WordPlace DeleteWord(const CPVT_WordPlace& place) override;
  CPVT_WordPlace BackSpaceWord(const CPVT_WordPlace& place) override;
  const CPDF_Rect& GetPlateRect() const override {
    return CPDF_EditContainer::GetPlateRect();
  }
  CPDF_Rect GetContentRect() const override;
  int32_t GetTotalWords() const override;
  FX_FLOAT GetFontSize() const override { return m_fFontSize; }
  int32_t GetAlignment() const override { return m_nAlignment; }
  FX_WORD GetPasswordChar() const override { return GetSubWord(); }
  int32_t GetCharArray() const override { return m_nCharArray; }
  int32_t GetLimitChar() const override { return m_nLimitChar; }
  FX_BOOL IsMultiLine() const override { return m_bMultiLine; }
  int32_t GetHorzScale() const override { return m_nHorzScale; }
  FX_FLOAT GetCharSpace() const override { return m_fCharSpace; }
  CPVT_WordPlace GetBeginWordPlace() const override;
  CPVT_WordPlace GetEndWordPlace() const override;
  CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const override;
  CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const override;
  CPVT_WordPlace SearchWordPlace(const CPDF_Point& point) const override;
  CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace& place,
                                const CPDF_Point& point) const override;
  CPVT_WordPlace GetDownWordPlace(const CPVT_WordPlace& place,
                                  const CPDF_Point& point) const override;
  CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace& place) const override;
  CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace& place) const override;
  CPVT_WordPlace GetSectionBeginPlace(
      const CPVT_WordPlace& place) const override;
  CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace& place) const override;
  void UpdateWordPlace(CPVT_WordPlace& place) const override;
  CPVT_WordPlace AdjustLineHeader(const CPVT_WordPlace& place,
                                  FX_BOOL bPrevOrNext) const override;
  int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const override;
  CPVT_WordPlace WordIndexToWordPlace(int32_t index) const override;

  FX_WORD GetSubWord() const { return m_wSubWord; }

 private:
  int32_t GetCharWidth(int32_t nFontIndex,
                       FX_WORD Word,
                       FX_WORD SubWord,
                       int32_t nWordStyle);
  int32_t GetTypeAscent(int32_t nFontIndex);
  int32_t GetTypeDescent(int32_t nFontIndex);
  int32_t GetWordFontIndex(FX_WORD word, int32_t charset, int32_t nFontIndex);
  int32_t GetDefaultFontIndex();
  FX_BOOL IsLatinWord(FX_WORD word);

  CPVT_WordPlace AddSection(const CPVT_WordPlace& place,
                            const CPVT_SectionInfo& secinfo);
  CPVT_WordPlace AddLine(const CPVT_WordPlace& place,
                         const CPVT_LineInfo& lineinfo);
  CPVT_WordPlace AddWord(const CPVT_WordPlace& place,
                         const CPVT_WordInfo& wordinfo);
  FX_BOOL GetWordInfo(const CPVT_WordPlace& place, CPVT_WordInfo& wordinfo);
  FX_BOOL SetWordInfo(const CPVT_WordPlace& place,
                      const CPVT_WordInfo& wordinfo);
  FX_BOOL GetLineInfo(const CPVT_WordPlace& place, CPVT_LineInfo& lineinfo);
  FX_BOOL GetSectionInfo(const CPVT_WordPlace& place,
                         CPVT_SectionInfo& secinfo);
  FX_FLOAT GetWordFontSize(const CPVT_WordInfo& WordInfo,
                           FX_BOOL bFactFontSize = FALSE);
  FX_FLOAT GetWordWidth(int32_t nFontIndex,
                        FX_WORD Word,
                        FX_WORD SubWord,
                        FX_FLOAT fCharSpace,
                        int32_t nHorzScale,
                        FX_FLOAT fFontSize,
                        FX_FLOAT fWordTail,
                        int32_t nWordStyle);
  FX_FLOAT GetWordWidth(const CPVT_WordInfo& WordInfo);
  FX_FLOAT GetWordAscent(const CPVT_WordInfo& WordInfo, FX_FLOAT fFontSize);
  FX_FLOAT GetWordDescent(const CPVT_WordInfo& WordInfo, FX_FLOAT fFontSize);
  FX_FLOAT GetWordAscent(const CPVT_WordInfo& WordInfo,
                         FX_BOOL bFactFontSize = FALSE);
  FX_FLOAT GetWordDescent(const CPVT_WordInfo& WordInfo,
                          FX_BOOL bFactFontSize = FALSE);
  FX_FLOAT GetLineAscent(const CPVT_SectionInfo& SecInfo);
  FX_FLOAT GetLineDescent(const CPVT_SectionInfo& SecInfo);
  FX_FLOAT GetFontAscent(int32_t nFontIndex, FX_FLOAT fFontSize);
  FX_FLOAT GetFontDescent(int32_t nFontIndex, FX_FLOAT fFontSize);
  int32_t GetWordFontIndex(const CPVT_WordInfo& WordInfo);
  FX_FLOAT GetCharSpace(const CPVT_WordInfo& WordInfo);
  int32_t GetHorzScale(const CPVT_WordInfo& WordInfo);
  FX_FLOAT GetLineLeading(const CPVT_SectionInfo& SecInfo);
  FX_FLOAT GetLineIndent(const CPVT_SectionInfo& SecInfo);
  int32_t GetAlignment(const CPVT_SectionInfo& SecInfo);

  void ClearSectionRightWords(const CPVT_WordPlace& place);

  FX_BOOL ClearEmptySection(const CPVT_WordPlace& place);
  void ClearEmptySections(const CPVT_WordRange& PlaceRange);
  void LinkLatterSection(const CPVT_WordPlace& place);
  void ClearWords(const CPVT_WordRange& PlaceRange);
  CPVT_WordPlace ClearLeftWord(const CPVT_WordPlace& place);
  CPVT_WordPlace ClearRightWord(const CPVT_WordPlace& place);

 private:
  CPVT_FloatRect Rearrange(const CPVT_WordRange& PlaceRange);
  FX_FLOAT GetAutoFontSize();
  FX_BOOL IsBigger(FX_FLOAT fFontSize);
  CPVT_FloatRect RearrangeSections(const CPVT_WordRange& PlaceRange);

  void ResetSectionArray();

  CPVT_ArrayTemplate<CSection*> m_SectionArray;
  int32_t m_nLimitChar;
  int32_t m_nCharArray;
  FX_BOOL m_bMultiLine;
  FX_BOOL m_bLimitWidth;
  FX_BOOL m_bAutoFontSize;
  int32_t m_nAlignment;
  FX_FLOAT m_fLineLeading;
  FX_FLOAT m_fCharSpace;
  int32_t m_nHorzScale;
  FX_WORD m_wSubWord;
  FX_FLOAT m_fFontSize;

 private:
  FX_BOOL m_bInitial;
  FX_BOOL m_bRichText;
  IPDF_VariableText_Provider* m_pVTProvider;
  CPDF_VariableText_Iterator* m_pVTIterator;
};

class CPDF_VariableText_Iterator : public IPDF_VariableText_Iterator {
 public:
  CPDF_VariableText_Iterator(CPDF_VariableText* pVT);
  ~CPDF_VariableText_Iterator() override;

  // IPDF_VariableText_Iterator
  FX_BOOL NextWord() override;
  FX_BOOL PrevWord() override;
  FX_BOOL NextLine() override;
  FX_BOOL PrevLine() override;
  FX_BOOL NextSection() override;
  FX_BOOL PrevSection() override;
  FX_BOOL SetWord(const CPVT_Word& word) override;
  FX_BOOL GetWord(CPVT_Word& word) const override;
  FX_BOOL GetLine(CPVT_Line& line) const override;
  FX_BOOL GetSection(CPVT_Section& section) const override;
  FX_BOOL SetSection(const CPVT_Section& section) override;
  void SetAt(int32_t nWordIndex) override;
  void SetAt(const CPVT_WordPlace& place) override;
  const CPVT_WordPlace& GetAt() const override { return m_CurPos; }

 private:
  CPVT_WordPlace m_CurPos;
  CPDF_VariableText* m_pVT;
};

#endif  // CORE_SRC_FPDFDOC_PDF_VT_H_
