// 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 "core/include/fpdfdoc/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;
};

struct CPVT_Color {
  enum Type { kTransparent = 0, kGray, kRGB, kCMYK };

  CPVT_Color(Type type = kTransparent,
             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) {}

  Type 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);
  ~CPVT_Provider() override;

  // IPDF_VariableText_Provider
  int32_t GetCharWidth(int32_t nFontIndex,
                       uint16_t word,
                       int32_t nWordStyle) override;
  int32_t GetTypeAscent(int32_t nFontIndex) override;
  int32_t GetTypeDescent(int32_t nFontIndex) override;
  int32_t GetWordFontIndex(uint16_t word,
                           int32_t charset,
                           int32_t nFontIndex) override;
  FX_BOOL IsLatinWord(uint16_t word) override;
  int32_t GetDefaultFontIndex() override;

 private:
  IPVT_FontMap* m_pFontMap;
};

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 CFX_FloatPoint& ptOffset,
                                       FX_BOOL bContinuous,
                                       uint16_t SubWord = 0,
                                       const CPVT_WordRange* pVisible = NULL);

  static CFX_ByteString GenerateBorderAP(const CFX_FloatRect& 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_
