// 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

#include "../../include/fxcrt/fx_bidi.h"
#include "../../include/fxcrt/fx_ucd.h"

CFX_BidiChar::CFX_BidiChar()
    : m_iCurStart(0),
      m_iCurCount(0),
      m_CurBidi(NEUTRAL),
      m_iLastStart(0),
      m_iLastCount(0),
      m_LastBidi(NEUTRAL) {
}

CFX_BidiChar::~CFX_BidiChar() {
}

bool CFX_BidiChar::AppendChar(FX_WCHAR wch) {
  FX_DWORD dwProps = FX_GetUnicodeProperties(wch);
  int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
  Direction bidi = NEUTRAL;
  switch (iBidiCls) {
    case FX_BIDICLASS_L:
    case FX_BIDICLASS_AN:
    case FX_BIDICLASS_EN:
      bidi = LEFT;
      break;
    case FX_BIDICLASS_R:
    case FX_BIDICLASS_AL:
      bidi = RIGHT;
      break;
  }

  bool bRet = (bidi != m_CurBidi);
  if (bRet) {
    SaveCurrentStateToLastState();
    m_CurBidi = bidi;
  }
  m_iCurCount++;
  return bRet;
}

bool CFX_BidiChar::EndChar() {
  SaveCurrentStateToLastState();
  return m_iLastCount > 0;
}

CFX_BidiChar::Direction CFX_BidiChar::GetBidiInfo(int32_t* iStart,
                                                  int32_t* iCount) const {
  if (iStart)
    *iStart = m_iLastStart;
  if (iCount)
    *iCount = m_iLastCount;
  return m_LastBidi;
}

void CFX_BidiChar::SaveCurrentStateToLastState() {
  m_LastBidi = m_CurBidi;
  m_iLastStart = m_iCurStart;
  m_iCurStart = m_iCurCount;
  m_iLastCount = m_iCurCount - m_iLastStart;
}
