// Copyright 2017 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 XFA_FGAS_LAYOUT_CFGAS_CHAR_H_
#define XFA_FGAS_LAYOUT_CFGAS_CHAR_H_

#include <stdint.h>

#include <vector>

#include "core/fxcrt/fx_unicode.h"
#include "core/fxcrt/retain_ptr.h"
#include "xfa/fgas/layout/cfgas_textuserdata.h"
#include "xfa/fgas/layout/fgas_linebreak.h"

class CFGAS_Char {
 public:
  enum class BreakType : uint8_t {
    kNone = 0,
    kPiece,
    kLine,
    kParagraph,
    kPage
  };

  static void BidiLine(std::vector<CFGAS_Char>* chars, size_t iCount);

  explicit CFGAS_Char(uint16_t wCharCode);
  CFGAS_Char(uint16_t wCharCode,
             int32_t iHorizontalScale,
             int32_t iVerticalScale);
  CFGAS_Char(const CFGAS_Char& other);
  ~CFGAS_Char();

  FX_CHARTYPE GetCharType() const;
  uint16_t char_code() const { return m_wCharCode; }
  int16_t horizonal_scale() const { return m_iHorizontalScale; }
  int16_t vertical_scale() const { return m_iVerticalScale; }

  BreakType m_dwStatus = BreakType::kNone;
  FX_BIDICLASS m_iBidiClass = FX_BIDICLASS::kON;
  FX_LINEBREAKTYPE m_eLineBreakType = FX_LINEBREAKTYPE::kUNKNOWN;
  uint32_t m_dwCharStyles = 0;
  int32_t m_iCharWidth = 0;
  uint16_t m_iBidiLevel = 0;
  uint16_t m_iBidiPos = 0;
  uint16_t m_iBidiOrder = 0;
  int32_t m_iFontSize = 0;
  uint32_t m_dwIdentity = 0;
  RetainPtr<CFGAS_TextUserData> m_pUserData;

 private:
  uint16_t m_wCharCode;
  int32_t m_iHorizontalScale;
  int32_t m_iVerticalScale;
};

#endif  // XFA_FGAS_LAYOUT_CFGAS_CHAR_H_
