// 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_FPDFDOC_FPDF_AP_H_
#define CORE_INCLUDE_FPDFDOC_FPDF_AP_H_

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

class IPVT_FontMap {
 public:
  virtual ~IPVT_FontMap() {}
  virtual CPDF_Font* GetPDFFont(int32_t nFontIndex) = 0;
  virtual CFX_ByteString GetPDFFontAlias(int32_t nFontIndex) = 0;
};
struct CPVT_Dash {
  CPVT_Dash(int32_t dash, int32_t gap, int32_t phase)
      : nDash(dash), nGap(gap), nPhase(phase) {}

  int32_t nDash;

  int32_t nGap;

  int32_t nPhase;
};
#define CT_TRANSPARENT 0
#define CT_GRAY 1
#define CT_RGB 2
#define CT_CMYK 3
struct CPVT_Color {
  CPVT_Color(int32_t type = 0,
             FX_FLOAT color1 = 0.0f,
             FX_FLOAT color2 = 0.0f,
             FX_FLOAT color3 = 0.0f,
             FX_FLOAT color4 = 0.0f)
      : nColorType(type),
        fColor1(color1),
        fColor2(color2),
        fColor3(color3),
        fColor4(color4) {}

  int32_t nColorType;
  FX_FLOAT fColor1;
  FX_FLOAT fColor2;
  FX_FLOAT fColor3;
  FX_FLOAT fColor4;
};
class CPVT_Provider : public IPDF_VariableText_Provider {
 public:
  CPVT_Provider(IPVT_FontMap* pFontMap);

  virtual ~CPVT_Provider();

  int32_t GetCharWidth(int32_t nFontIndex, FX_WORD word, 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);

  FX_BOOL IsLatinWord(FX_WORD word);

  int32_t GetDefaultFontIndex();

 private:
  IPVT_FontMap* m_pFontMap;
};
#define PBS_SOLID 0
#define PBS_DASH 1
#define PBS_BEVELED 2
#define PBS_INSET 3
#define PBS_UNDERLINED 4
class CPVT_GenerateAP {
 public:
  static FX_BOOL GenerateTextFieldAP(CPDF_Document* pDoc,
                                     CPDF_Dictionary* pAnnotDict);

  static FX_BOOL GenerateComboBoxAP(CPDF_Document* pDoc,
                                    CPDF_Dictionary* pAnnotDict);

  static FX_BOOL GenerateListBoxAP(CPDF_Document* pDoc,
                                   CPDF_Dictionary* pAnnotDict);

  static CFX_ByteString GenerateEditAP(IPVT_FontMap* pFontMap,
                                       IPDF_VariableText_Iterator* pIterator,
                                       const CPDF_Point& ptOffset,
                                       FX_BOOL bContinuous,
                                       FX_WORD SubWord = 0,
                                       const CPVT_WordRange* pVisible = NULL);

  static CFX_ByteString GenerateBorderAP(const CPDF_Rect& rect,
                                         FX_FLOAT fWidth,
                                         const CPVT_Color& color,
                                         const CPVT_Color& crLeftTop,
                                         const CPVT_Color& crRightBottom,
                                         int32_t nStyle,
                                         const CPVT_Dash& dash);

  static CFX_ByteString GenerateColorAP(const CPVT_Color& color,
                                        const FX_BOOL& bFillOrStroke);
};

#endif  // CORE_INCLUDE_FPDFDOC_FPDF_AP_H_
