// 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_FPDFAPI_PAGE_CPDF_TEXTSTATE_H_
#define CORE_FPDFAPI_PAGE_CPDF_TEXTSTATE_H_

#include "core/fxcrt/cfx_count_ref.h"
#include "core/fxcrt/fx_basic.h"

class CPDF_Document;
class CPDF_Font;

// See PDF Reference 1.7, page 402, table 5.3.
enum class TextRenderingMode {
  MODE_FILL = 0,
  MODE_STROKE = 1,
  MODE_FILL_STROKE = 2,
  MODE_INVISIBLE = 3,
  MODE_FILL_CLIP = 4,
  MODE_STROKE_CLIP = 5,
  MODE_FILL_STROKE_CLIP = 6,
  MODE_CLIP = 7,
};

class CPDF_TextState {
 public:
  CPDF_TextState();
  ~CPDF_TextState();

  void Emplace();

  CPDF_Font* GetFont() const;
  void SetFont(CPDF_Font* pFont);

  FX_FLOAT GetFontSize() const;
  void SetFontSize(FX_FLOAT size);

  const FX_FLOAT* GetMatrix() const;
  FX_FLOAT* GetMutableMatrix();

  FX_FLOAT GetCharSpace() const;
  void SetCharSpace(FX_FLOAT sp);

  FX_FLOAT GetWordSpace() const;
  void SetWordSpace(FX_FLOAT sp);

  FX_FLOAT GetFontSizeV() const;
  FX_FLOAT GetFontSizeH() const;
  FX_FLOAT GetBaselineAngle() const;
  FX_FLOAT GetShearAngle() const;

  TextRenderingMode GetTextMode() const;
  void SetTextMode(TextRenderingMode mode);

  const FX_FLOAT* GetCTM() const;
  FX_FLOAT* GetMutableCTM();

 private:
  class TextData {
   public:
    TextData();
    TextData(const TextData& src);
    ~TextData();

    void SetFont(CPDF_Font* pFont);
    FX_FLOAT GetFontSizeV() const;
    FX_FLOAT GetFontSizeH() const;
    FX_FLOAT GetBaselineAngle() const;
    FX_FLOAT GetShearAngle() const;

    CPDF_Font* m_pFont;
    CPDF_Document* m_pDocument;
    FX_FLOAT m_FontSize;
    FX_FLOAT m_CharSpace;
    FX_FLOAT m_WordSpace;
    TextRenderingMode m_TextMode;
    FX_FLOAT m_Matrix[4];
    FX_FLOAT m_CTM[4];
  };

  CFX_CountRef<TextData> m_Ref;
};

bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode);
bool TextRenderingModeIsClipMode(const TextRenderingMode& mode);
bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode);

#endif  // CORE_FPDFAPI_PAGE_CPDF_TEXTSTATE_H_
