// 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 "xfa/fgas/layout/fgas_unicode.h"

void FX_TEXTLAYOUT_PieceSort(CFX_TPOArray& tpos, int32_t iStart, int32_t iEnd) {
  ASSERT(iStart > -1 && iStart < tpos.GetSize());
  ASSERT(iEnd > -1 && iEnd < tpos.GetSize());
  if (iStart >= iEnd) {
    return;
  }
  int32_t i = iStart, j = iEnd;
  FX_TPO *pCur = tpos.GetPtrAt(iStart), *pSort;
  int32_t v = pCur->pos;
  while (i < j) {
    while (j > i) {
      pSort = tpos.GetPtrAt(j);
      if (pSort->pos < v) {
        FX_TPO t = *pSort;
        *pSort = *pCur;
        *pCur = t;
        pCur = pSort;
        break;
      }
      j--;
    }
    while (i < j) {
      pSort = tpos.GetPtrAt(i);
      if (pSort->pos > v) {
        FX_TPO t = *pSort;
        *pSort = *pCur;
        *pCur = t;
        pCur = pSort;
        break;
      }
      i++;
    }
  }
  i--, j++;
  if (iStart < i) {
    FX_TEXTLAYOUT_PieceSort(tpos, iStart, i);
  }
  if (j < iEnd) {
    FX_TEXTLAYOUT_PieceSort(tpos, j, iEnd);
  }
}
static const FX_JAPCHARPROPERTYEX gs_FX_JapCharPropertysEx[] = {
    {0x3001, 0x13}, {0x3002, 0x13}, {0x3041, 0x23}, {0x3043, 0x23},
    {0x3045, 0x23}, {0x3047, 0x23}, {0x3049, 0x23}, {0x3063, 0x23},
    {0x3083, 0x23}, {0x3085, 0x23}, {0x3087, 0x23}, {0x308E, 0x23},
    {0x3095, 0x23}, {0x3096, 0x23}, {0x30A1, 0x23}, {0x30A3, 0x23},
    {0x30A5, 0x23}, {0x30A7, 0x23}, {0x30A9, 0x23}, {0x30C3, 0x23},
    {0x30E3, 0x23}, {0x30E5, 0x23}, {0x30E7, 0x23}, {0x30EE, 0x23},
    {0x30F5, 0x23}, {0x30F6, 0x23}, {0x30FB, 0x22}, {0x31F0, 0x23},
    {0x31F1, 0x23}, {0x31F2, 0x23}, {0x31F3, 0x23}, {0x31F4, 0x23},
    {0x31F5, 0x23}, {0x31F6, 0x23}, {0x31F7, 0x23}, {0x31F8, 0x23},
    {0x31F9, 0x23}, {0x31FA, 0x23}, {0x31FB, 0x23}, {0x31FC, 0x23},
    {0x31FD, 0x23}, {0x31FE, 0x23}, {0x31FF, 0x23},
};
const FX_JAPCHARPROPERTYEX* FX_GetJapCharPropertyEx(FX_WCHAR wch) {
  int32_t iStart = 0;
  int32_t iEnd =
      sizeof(gs_FX_JapCharPropertysEx) / sizeof(FX_JAPCHARPROPERTYEX);
  while (iStart <= iEnd) {
    int32_t iMid = (iStart + iEnd) / 2;
    FX_WCHAR wJapChar = gs_FX_JapCharPropertysEx[iMid].wChar;
    if (wch == wJapChar) {
      return gs_FX_JapCharPropertysEx + iMid;
    } else if (wch < wJapChar) {
      iEnd = iMid - 1;
    } else {
      iStart = iMid + 1;
    }
  }
  return NULL;
}
FX_BOOL FX_AdjustJapCharDisplayPos(FX_WCHAR wch,
                                   FX_BOOL bMBCSCode,
                                   IFX_Font* pFont,
                                   FX_FLOAT fFontSize,
                                   FX_BOOL bVertical,
                                   CFX_PointF& ptOffset) {
  if (pFont == NULL || !bVertical) {
    return FALSE;
  }
  if (wch < 0x3001 || wch > 0x31FF) {
    return FALSE;
  }
  const FX_JAPCHARPROPERTYEX* pJapChar = FX_GetJapCharPropertyEx(wch);
  if (pJapChar == NULL) {
    return FALSE;
  }
  CFX_Rect rtBBox;
  rtBBox.Reset();
  if (pFont->GetCharBBox(wch, rtBBox, bMBCSCode)) {
    switch (pJapChar->uAlign & 0xF0) {
      case FX_JAPCHARPROPERTYEX_Top:
        ptOffset.y = fFontSize * (1000 - rtBBox.height) / 1200.0f;
        break;
      case FX_JAPCHARPROPERTYEX_Middle:
        ptOffset.y = fFontSize * (1000 - rtBBox.height) / 6000.0f;
        break;
    }
    switch (pJapChar->uAlign & 0x0F) {
      case FX_JAPCHARPROPERTYEX_Center:
        ptOffset.x = fFontSize * (600 - rtBBox.right()) / 1000.0f;
        break;
      case FX_JAPCHARPROPERTYEX_Right:
        ptOffset.x = fFontSize * (950 - rtBBox.right()) / 1000.0f;
        break;
    }
  }
  return TRUE;
}
