// 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 "core/fxcrt/fx_arabic.h"
#include "core/fxcrt/fx_ucd.h"

namespace {

const FX_ARBFORMTABLE g_FX_ArabicFormTables[] = {
    {0xFE81, 0xFE82, 0xFE81, 0xFE82}, {0xFE83, 0xFE84, 0xFE83, 0xFE84},
    {0xFE85, 0xFE86, 0xFE85, 0xFE86}, {0xFE87, 0xFE88, 0xFE87, 0xFE88},
    {0xFE89, 0xFE8A, 0xFE8B, 0xFE8C}, {0xFE8D, 0xFE8E, 0xFE8D, 0xFE8E},
    {0xFE8F, 0xFE90, 0xFE91, 0xFE92}, {0xFE93, 0xFE94, 0xFE93, 0xFE94},
    {0xFE95, 0xFE96, 0xFE97, 0xFE98}, {0xFE99, 0xFE9A, 0xFE9B, 0xFE9C},
    {0xFE9D, 0xFE9E, 0xFE9F, 0xFEA0}, {0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4},
    {0xFEA5, 0xFEA6, 0xFEA7, 0xFEA8}, {0xFEA9, 0xFEAA, 0xFEA9, 0xFEAA},
    {0xFEAB, 0xFEAC, 0xFEAB, 0xFEAC}, {0xFEAD, 0xFEAE, 0xFEAD, 0xFEAE},
    {0xFEAF, 0xFEB0, 0xFEAF, 0xFEB0}, {0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4},
    {0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8}, {0xFEB9, 0xFEBA, 0xFEBB, 0xFEBC},
    {0xFEBD, 0xFEBE, 0xFEBF, 0xFEC0}, {0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4},
    {0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8}, {0xFEC9, 0xFECA, 0xFECB, 0xFECC},
    {0xFECD, 0xFECE, 0xFECF, 0xFED0}, {0x063B, 0x063B, 0x063B, 0x063B},
    {0x063C, 0x063C, 0x063C, 0x063C}, {0x063D, 0x063D, 0x063D, 0x063D},
    {0x063E, 0x063E, 0x063E, 0x063E}, {0x063F, 0x063F, 0x063F, 0x063F},
    {0x0640, 0x0640, 0x0640, 0x0640}, {0xFED1, 0xFED2, 0xFED3, 0xFED4},
    {0xFED5, 0xFED6, 0xFED7, 0xFED8}, {0xFED9, 0xFEDA, 0xFEDB, 0xFEDC},
    {0xFEDD, 0xFEDE, 0xFEDF, 0xFEE0}, {0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4},
    {0xFEE5, 0xFEE6, 0xFEE7, 0xFEE8}, {0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC},
    {0xFEED, 0xFEEE, 0xFEED, 0xFEEE}, {0xFEEF, 0xFEF0, 0xFBFE, 0xFBFF},
    {0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4}, {0x064B, 0x064B, 0x064B, 0x064B},
    {0x064C, 0x064C, 0x064C, 0x064C}, {0x064D, 0x064D, 0x064D, 0x064D},
    {0x064E, 0x064E, 0x064E, 0x064E}, {0x064F, 0x064F, 0x064F, 0x064F},
    {0x0650, 0x0650, 0x0650, 0x0650}, {0x0651, 0x0651, 0x0651, 0x0651},
    {0x0652, 0x0652, 0x0652, 0x0652}, {0x0653, 0x0653, 0x0653, 0x0653},
    {0x0654, 0x0654, 0x0654, 0x0654}, {0x0655, 0x0655, 0x0655, 0x0655},
    {0x0656, 0x0656, 0x0656, 0x0656}, {0x0657, 0x0657, 0x0657, 0x0657},
    {0x0658, 0x0658, 0x0658, 0x0658}, {0x0659, 0x0659, 0x0659, 0x0659},
    {0x065A, 0x065A, 0x065A, 0x065A}, {0x065B, 0x065B, 0x065B, 0x065B},
    {0x065C, 0x065C, 0x065C, 0x065C}, {0x065D, 0x065D, 0x065D, 0x065D},
    {0x065E, 0x065E, 0x065E, 0x065E}, {0x065F, 0x065F, 0x065F, 0x065F},
    {0x0660, 0x0660, 0x0660, 0x0660}, {0x0661, 0x0661, 0x0661, 0x0661},
    {0x0662, 0x0662, 0x0662, 0x0662}, {0x0663, 0x0663, 0x0663, 0x0663},
    {0x0664, 0x0664, 0x0664, 0x0664}, {0x0665, 0x0665, 0x0665, 0x0665},
    {0x0666, 0x0666, 0x0666, 0x0666}, {0x0667, 0x0667, 0x0667, 0x0667},
    {0x0668, 0x0668, 0x0668, 0x0668}, {0x0669, 0x0669, 0x0669, 0x0669},
    {0x066A, 0x066A, 0x066A, 0x066A}, {0x066B, 0x066B, 0x066B, 0x066B},
    {0x066C, 0x066C, 0x066C, 0x066C}, {0x066D, 0x066D, 0x066D, 0x066D},
    {0x066E, 0x066E, 0x066E, 0x066E}, {0x066F, 0x066F, 0x066F, 0x066F},
    {0x0670, 0x0670, 0x0670, 0x0670}, {0xFB50, 0xFB51, 0xFB50, 0xFB51},
    {0x0672, 0x0672, 0x0672, 0x0672}, {0x0673, 0x0673, 0x0673, 0x0673},
    {0x0674, 0x0674, 0x0674, 0x0674}, {0x0675, 0x0675, 0x0675, 0x0675},
    {0x0676, 0x0676, 0x0676, 0x0676}, {0x0677, 0x0677, 0x0677, 0x0677},
    {0x0678, 0x0678, 0x0678, 0x0678}, {0xFB66, 0xFB67, 0xFB68, 0xFB69},
    {0xFB5E, 0xFB5F, 0xFB60, 0xFB61}, {0xFB52, 0xFB53, 0xFB54, 0xFB55},
    {0x067C, 0x067C, 0x067C, 0x067C}, {0x067D, 0x067D, 0x067D, 0x067D},
    {0xFB56, 0xFB57, 0xFB58, 0xFB59}, {0xFB62, 0xFB63, 0xFB64, 0xFB65},
    {0xFB5A, 0xFB5B, 0xFB5C, 0xFB5D}, {0x0681, 0x0681, 0x0681, 0x0681},
    {0x0682, 0x0682, 0x0682, 0x0682}, {0xFB76, 0xFB77, 0xFB78, 0xFB79},
    {0xFB72, 0xFB73, 0xFB74, 0xFB75}, {0x0685, 0x0685, 0x0685, 0x0685},
    {0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D}, {0xFB7E, 0xFB7F, 0xFB80, 0xFB81},
    {0xFB88, 0xFB89, 0xFB88, 0xFB89}, {0x0689, 0x0689, 0x0689, 0x0689},
    {0x068A, 0x068A, 0x068A, 0x068A}, {0x068B, 0x068B, 0x068B, 0x068B},
    {0xFB84, 0xFB85, 0xFB84, 0xFB85}, {0xFB82, 0xFB83, 0xFB82, 0xFB83},
    {0xFB86, 0xFB87, 0xFB86, 0xFB87}, {0x068F, 0x068F, 0x068F, 0x068F},
    {0x0690, 0x0690, 0x0690, 0x0690}, {0xFB8C, 0xFB8D, 0xFB8C, 0xFB8D},
    {0x0692, 0x0692, 0x0692, 0x0692}, {0x0693, 0x0693, 0x0693, 0x0693},
    {0x0694, 0x0694, 0x0694, 0x0694}, {0x0695, 0x0695, 0x0695, 0x0695},
    {0x0696, 0x0696, 0x0696, 0x0696}, {0x0697, 0x0697, 0x0697, 0x0697},
    {0xFB8A, 0xFB8B, 0xFB8A, 0xFB8B}, {0x0699, 0x0699, 0x0699, 0x0699},
    {0x069A, 0x069A, 0x069A, 0x069A}, {0x069B, 0x069B, 0x069B, 0x069B},
    {0x069C, 0x069C, 0x069C, 0x069C}, {0x069D, 0x069D, 0x069D, 0x069D},
    {0x069E, 0x069E, 0x069E, 0x069E}, {0x069F, 0x069F, 0x069F, 0x069F},
    {0x06A0, 0x06A0, 0x06A0, 0x06A0}, {0x06A1, 0x06A1, 0x06A1, 0x06A1},
    {0x06A2, 0x06A2, 0x06A2, 0x06A2}, {0x06A3, 0x06A3, 0x06A3, 0x06A3},
    {0xFB6A, 0xFB6B, 0xFB6C, 0xFB6D}, {0x06A5, 0x06A5, 0x06A5, 0x06A5},
    {0xFB6E, 0xFB6F, 0xFB70, 0xFB71}, {0x06A7, 0x06A7, 0x06A7, 0x06A7},
    {0x06A8, 0x06A8, 0x06A8, 0x06A8}, {0xFB8E, 0xFB8F, 0xFB90, 0xFB91},
    {0x06AA, 0x06AA, 0x06AA, 0x06AA}, {0x06AB, 0x06AB, 0x06AB, 0x06AB},
    {0x06AC, 0x06AC, 0x06AC, 0x06AC}, {0xFBD3, 0xFBD4, 0xFBD5, 0xFBD6},
    {0x06AE, 0x06AE, 0x06AE, 0x06AE}, {0xFB92, 0xFB93, 0xFB94, 0xFB95},
    {0x06B0, 0x06B0, 0x06B0, 0x06B0}, {0xFB9A, 0xFB9B, 0xFB9C, 0xFB9D},
    {0x06B2, 0x06B2, 0x06B2, 0x06B2}, {0xFB96, 0xFB97, 0xFB98, 0xFB99},
    {0x06B4, 0x06B4, 0x06B4, 0x06B4}, {0x06B5, 0x06B5, 0x06B5, 0x06B5},
    {0x06B6, 0x06B6, 0x06B6, 0x06B6}, {0x06B7, 0x06B7, 0x06B7, 0x06B7},
    {0x06B8, 0x06B8, 0x06B8, 0x06B8}, {0x06B9, 0x06B9, 0x06B9, 0x06B9},
    {0xFB9E, 0xFB9F, 0xFBE8, 0xFBE9}, {0xFBA0, 0xFBA1, 0xFBA2, 0xFBA3},
    {0x06BC, 0x06BC, 0x06BC, 0x06BC}, {0x06BD, 0x06BD, 0x06BD, 0x06BD},
    {0xFBAA, 0xFBAB, 0xFBAC, 0xFBAD}, {0x06BF, 0x06BF, 0x06BF, 0x06BF},
    {0xFBA4, 0xFBA5, 0xFBA4, 0xFBA5}, {0xFBA6, 0xFBA7, 0xFBA8, 0xFBA9},
    {0x06C2, 0x06C2, 0x06C2, 0x06C2}, {0x06C3, 0x06C3, 0x06C3, 0x06C3},
    {0x06C4, 0x06C4, 0x06C4, 0x06C4}, {0xFBE0, 0xFBE1, 0xFBE0, 0xFBE1},
    {0xFBD9, 0xFBDA, 0xFBD9, 0xFBDA}, {0xFBD7, 0xFBD8, 0xFBD7, 0xFBD8},
    {0xFBDB, 0xFBDC, 0xFBDB, 0xFBDC}, {0xFBE2, 0xFBE3, 0xFBE2, 0xFBE3},
    {0x06CA, 0x06CA, 0x06CA, 0x06CA}, {0xFBDE, 0xFBDF, 0xFBDE, 0xFBDF},
    {0xFBFC, 0xFBFD, 0xFBFE, 0xFBFF}, {0x06CD, 0x06CD, 0x06CD, 0x06CD},
    {0x06CE, 0x06CE, 0x06CE, 0x06CE}, {0x06CF, 0x06CF, 0x06CF, 0x06CF},
    {0xFBE4, 0xFBE5, 0xFBE6, 0xFBE7}, {0x06D1, 0x06D1, 0x06D1, 0x06D1},
    {0xFBAE, 0xFBAF, 0xFBAE, 0xFBAF}, {0xFBB0, 0xFBB1, 0xFBB0, 0xFBB1},
    {0x06D4, 0x06D4, 0x06D4, 0x06D4}, {0x06D5, 0x06D5, 0x06D5, 0x06D5},
};

const FX_ARAALEF gs_FX_AlefTable[] = {
    {0x0622, 0xFEF5},
    {0x0623, 0xFEF7},
    {0x0625, 0xFEF9},
    {0x0627, 0xFEFB},
};

const FX_ARASHADDA gs_FX_ShaddaTable[] = {
    {0x064C, 0xFC5E}, {0x064D, 0xFC5F}, {0x064E, 0xFC60},
    {0x064F, 0xFC61}, {0x0650, 0xFC62},
};

const int32_t gc_FX_BidiNTypes[] = {
    FX_BIDICLASS_N,   FX_BIDICLASS_L,   FX_BIDICLASS_R,   FX_BIDICLASS_AN,
    FX_BIDICLASS_EN,  FX_BIDICLASS_AL,  FX_BIDICLASS_NSM, FX_BIDICLASS_CS,
    FX_BIDICLASS_ES,  FX_BIDICLASS_ET,  FX_BIDICLASS_BN,  FX_BIDICLASS_BN,
    FX_BIDICLASS_N,   FX_BIDICLASS_B,   FX_BIDICLASS_RLO, FX_BIDICLASS_RLE,
    FX_BIDICLASS_LRO, FX_BIDICLASS_LRE, FX_BIDICLASS_PDF, FX_BIDICLASS_ON,
};

const int32_t gc_FX_BidiWeakStates[][10] = {
    {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn, FX_BWSxa, FX_BWSxa,
     FX_BWSao, FX_BWSao, FX_BWSao},
    {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSxr,
     FX_BWSro, FX_BWSro, FX_BWSrt},
    {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSxl,
     FX_BWSlo, FX_BWSlo, FX_BWSlt},
    {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn, FX_BWSxa, FX_BWSao,
     FX_BWSao, FX_BWSao, FX_BWSao},
    {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSro,
     FX_BWSro, FX_BWSro, FX_BWSrt},
    {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSlo,
     FX_BWSlo, FX_BWSlo, FX_BWSlt},
    {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSrt,
     FX_BWSro, FX_BWSro, FX_BWSrt},
    {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSlt,
     FX_BWSlo, FX_BWSlo, FX_BWSlt},
    {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn, FX_BWSxa, FX_BWScn,
     FX_BWSac, FX_BWSao, FX_BWSao},
    {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSra,
     FX_BWSrc, FX_BWSro, FX_BWSrt},
    {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSre,
     FX_BWSrs, FX_BWSrs, FX_BWSret},
    {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSla,
     FX_BWSlc, FX_BWSlo, FX_BWSlt},
    {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSle,
     FX_BWSls, FX_BWSls, FX_BWSlet},
    {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn, FX_BWSxa, FX_BWSao,
     FX_BWSao, FX_BWSao, FX_BWSao},
    {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSro,
     FX_BWSro, FX_BWSro, FX_BWSrt},
    {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSro,
     FX_BWSro, FX_BWSro, FX_BWSrt},
    {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSlo,
     FX_BWSlo, FX_BWSlo, FX_BWSlt},
    {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSlo,
     FX_BWSlo, FX_BWSlo, FX_BWSlt},
    {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSret,
     FX_BWSro, FX_BWSro, FX_BWSret},
    {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSlet,
     FX_BWSlo, FX_BWSlo, FX_BWSlet},
};

const int32_t gc_FX_BidiWeakActions[][10] = {
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR,
     FX_BWAxxR, FX_BWAxxN, FX_BWAxxN, FX_BWAxxN},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR,
     FX_BWAxxR, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR,
     FX_BWAxxL, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR,
     FX_BWAxxN, FX_BWAxxN, FX_BWAxxN, FX_BWAxxN},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR,
     FX_BWAxxN, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR,
     FX_BWAxxN, FX_BWAxxN, FX_BWAxxN, FX_BWAxIx},
    {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAExE, FX_BWANxR,
     FX_BWAxIx, FX_BWANxN, FX_BWANxN, FX_BWAxIx},
    {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWALxL, FX_BWANxR,
     FX_BWAxIx, FX_BWANxN, FX_BWANxN, FX_BWAxIx},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR,
     FX_BWAxxA, FX_BWAxIx, FX_BWAxxN, FX_BWAxxN},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR,
     FX_BWAxxA, FX_BWAxIx, FX_BWAxxN, FX_BWAxIx},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR,
     FX_BWAxxE, FX_BWAxIx, FX_BWAxIx, FX_BWAxxE},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR,
     FX_BWAxxA, FX_BWAxIx, FX_BWAxxN, FX_BWAxIx},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR,
     FX_BWAxxL, FX_BWAxIx, FX_BWAxIx, FX_BWAxxL},
    {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWAAxA, FX_BWANxR,
     FX_BWANxN, FX_BWANxN, FX_BWANxN, FX_BWANxN},
    {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWANxE, FX_BWANxR,
     FX_BWANxN, FX_BWANxN, FX_BWANxN, FX_BWANIx},
    {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAExE, FX_BWANxR,
     FX_BWANxN, FX_BWANxN, FX_BWANxN, FX_BWANIx},
    {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWAAxx, FX_BWANxL, FX_BWANxR,
     FX_BWANxN, FX_BWANxN, FX_BWANxN, FX_BWANIx},
    {FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWANxx, FX_BWALxL, FX_BWANxR,
     FX_BWANxN, FX_BWANxN, FX_BWANxN, FX_BWANIx},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR,
     FX_BWAxxE, FX_BWAxxN, FX_BWAxxN, FX_BWAxxE},
    {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR,
     FX_BWAxxL, FX_BWAxxN, FX_BWAxxN, FX_BWAxxL},
};

const int32_t gc_FX_BidiNeutralStates[][5] = {
    {FX_BNSrn, FX_BNSl, FX_BNSr, FX_BNSr, FX_BNSr},
    {FX_BNSln, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl},
    {FX_BNSrn, FX_BNSl, FX_BNSr, FX_BNSr, FX_BNSr},
    {FX_BNSln, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl},
    {FX_BNSna, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl},
    {FX_BNSna, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl},
};
const int32_t gc_FX_BidiNeutralActions[][5] = {
    {FX_BNAIn, 0, 0, 0, 0},
    {FX_BNAIn, 0, 0, 0, FX_BIDICLASS_L},
    {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNARn},
    {FX_BNAIn, FX_BNALn, FX_BNAEn, FX_BNAEn, FX_BNALnL},
    {FX_BNAIn, 0, 0, 0, FX_BIDICLASS_L},
    {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNAEn},
};

const int32_t gc_FX_BidiAddLevel[][4] = {
    {0, 1, 2, 2},
    {1, 0, 1, 1},
};

const FX_ARBFORMTABLE* ParseChar(const CFX_Char* pTC,
                                 FX_WCHAR& wChar,
                                 FX_CHARTYPE& eType) {
  if (!pTC) {
    eType = FX_CHARTYPE_Unknown;
    wChar = 0xFEFF;
    return nullptr;
  }
  eType = pTC->GetCharType();
  wChar = (FX_WCHAR)pTC->m_wCharCode;
  const FX_ARBFORMTABLE* pFT = FX_GetArabicFormTable(wChar);
  if (!pFT || eType >= FX_CHARTYPE_ArabicNormal)
    eType = FX_CHARTYPE_Unknown;

  return pFT;
}

}  // namespace

const FX_ARBFORMTABLE* FX_GetArabicFormTable(FX_WCHAR unicode) {
  if (unicode < 0x622 || unicode > 0x6d5) {
    return nullptr;
  }
  return g_FX_ArabicFormTables + unicode - 0x622;
}
FX_WCHAR FX_GetArabicFromAlefTable(FX_WCHAR alef) {
  static const int32_t s_iAlefCount =
      sizeof(gs_FX_AlefTable) / sizeof(FX_ARAALEF);
  for (int32_t iStart = 0; iStart < s_iAlefCount; iStart++) {
    const FX_ARAALEF& v = gs_FX_AlefTable[iStart];
    if (v.wAlef == alef) {
      return v.wIsolated;
    }
  }
  return alef;
}
FX_WCHAR FX_GetArabicFromShaddaTable(FX_WCHAR shadda) {
  static const int32_t s_iShaddaCount =
      sizeof(gs_FX_ShaddaTable) / sizeof(FX_ARASHADDA);
  for (int32_t iStart = 0; iStart < s_iShaddaCount; iStart++) {
    const FX_ARASHADDA& v = gs_FX_ShaddaTable[iStart];
    if (v.wShadda == shadda) {
      return v.wIsolated;
    }
  }
  return shadda;
}

namespace pdfium {
namespace arabic {

bool IsArabicChar(FX_WCHAR wch) {
  uint32_t dwRet =
      kTextLayoutCodeProperties[(uint16_t)wch] & FX_CHARTYPEBITSMASK;
  return dwRet >= FX_CHARTYPE_ArabicAlef;
}

bool IsArabicFormChar(FX_WCHAR wch) {
  return (kTextLayoutCodeProperties[(uint16_t)wch] & FX_CHARTYPEBITSMASK) ==
         FX_CHARTYPE_ArabicForm;
}

FX_WCHAR GetFormChar(FX_WCHAR wch, FX_WCHAR prev, FX_WCHAR next) {
  CFX_Char c(wch, kTextLayoutCodeProperties[(uint16_t)wch]);
  CFX_Char p(prev, kTextLayoutCodeProperties[(uint16_t)prev]);
  CFX_Char n(next, kTextLayoutCodeProperties[(uint16_t)next]);
  return GetFormChar(&c, &p, &n);
}

FX_WCHAR GetFormChar(const CFX_Char* cur,
                     const CFX_Char* prev,
                     const CFX_Char* next) {
  FX_CHARTYPE eCur;
  FX_WCHAR wCur;
  const FX_ARBFORMTABLE* ft = ParseChar(cur, wCur, eCur);
  if (eCur < FX_CHARTYPE_ArabicAlef || eCur >= FX_CHARTYPE_ArabicNormal) {
    return wCur;
  }
  FX_CHARTYPE ePrev;
  FX_WCHAR wPrev;
  ParseChar(prev, wPrev, ePrev);
  if (wPrev == 0x0644 && eCur == FX_CHARTYPE_ArabicAlef) {
    return 0xFEFF;
  }
  FX_CHARTYPE eNext;
  FX_WCHAR wNext;
  ParseChar(next, wNext, eNext);
  bool bAlef = (eNext == FX_CHARTYPE_ArabicAlef && wCur == 0x644);
  if (ePrev < FX_CHARTYPE_ArabicAlef) {
    if (bAlef) {
      return FX_GetArabicFromAlefTable(wNext);
    }
    return (eNext < FX_CHARTYPE_ArabicAlef) ? ft->wIsolated : ft->wInitial;
  }
  if (bAlef) {
    wCur = FX_GetArabicFromAlefTable(wNext);
    return (ePrev != FX_CHARTYPE_ArabicDistortion) ? wCur : ++wCur;
  }
  if (ePrev == FX_CHARTYPE_ArabicAlef || ePrev == FX_CHARTYPE_ArabicSpecial) {
    return (eNext < FX_CHARTYPE_ArabicAlef) ? ft->wIsolated : ft->wInitial;
  }
  return (eNext < FX_CHARTYPE_ArabicAlef) ? ft->wFinal : ft->wMedial;
}

}  // namespace arabic
}  // namespace pdfium

void FX_BidiReverseString(CFX_WideString& wsText,
                          int32_t iStart,
                          int32_t iCount) {
  ASSERT(iStart > -1 && iStart < wsText.GetLength());
  ASSERT(iCount >= 0 && iStart + iCount <= wsText.GetLength());
  FX_WCHAR wch;
  FX_WCHAR* pStart = const_cast<FX_WCHAR*>(wsText.c_str());
  pStart += iStart;
  FX_WCHAR* pEnd = pStart + iCount - 1;
  while (pStart < pEnd) {
    wch = *pStart;
    *pStart++ = *pEnd;
    *pEnd-- = wch;
  }
}


int32_t FX_BidiGetDeferredNeutrals(int32_t iAction, int32_t iLevel) {
  iAction = (iAction >> 4) & 0xF;
  if (iAction == (FX_BIDINEUTRALACTION_En >> 4)) {
    return FX_BidiDirection(iLevel);
  } else {
    return iAction;
  }
}

int32_t FX_BidiGetResolvedNeutrals(int32_t iAction) {
  iAction = (iAction & 0xF);
  if (iAction == FX_BIDINEUTRALACTION_In) {
    return 0;
  } else {
    return iAction;
  }
}

int32_t FX_BidiReorderLevel(int32_t iBaseLevel,
                            CFX_WideString& wsText,
                            const CFX_Int32Array& levels,
                            int32_t iStart,
                            FX_BOOL bReverse) {
  ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL);
  ASSERT(wsText.GetLength() == levels.GetSize());
  ASSERT(iStart >= 0 && iStart < wsText.GetLength());
  int32_t iSize = wsText.GetLength();
  if (iSize < 1) {
    return 0;
  }
  bReverse = bReverse || FX_IsOdd(iBaseLevel);
  int32_t i = iStart, iLevel;
  for (; i < iSize; i++) {
    if ((iLevel = levels.GetAt(i)) == iBaseLevel) {
      continue;
    }
    if (iLevel < iBaseLevel) {
      break;
    }
    i += FX_BidiReorderLevel(iBaseLevel + 1, wsText, levels, i, bReverse) - 1;
  }
  int32_t iCount = i - iStart;
  if (bReverse && iCount > 1) {
    FX_BidiReverseString(wsText, iStart, iCount);
  }
  return iCount;
}
void FX_BidiReorder(int32_t iBaseLevel,
                    CFX_WideString& wsText,
                    const CFX_Int32Array& levels) {
  ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL);
  ASSERT(wsText.GetLength() == levels.GetSize());
  int32_t iSize = wsText.GetLength();
  if (iSize < 1) {
    return;
  }
  int32_t i = 0;
  while (i < iSize) {
    i += FX_BidiReorderLevel(iBaseLevel, wsText, levels, i, FALSE);
  }
}

template <class baseType>
class CFX_BidiLineTemplate {
 public:
  void FX_BidiReverseString(CFX_ArrayTemplate<baseType>& chars,
                            int32_t iStart,
                            int32_t iCount) {
    ASSERT(iStart > -1 && iStart < chars.GetSize());
    ASSERT(iCount >= 0 && iStart + iCount <= chars.GetSize());
    baseType *pStart, *pEnd;
    int32_t iEnd = iStart + iCount - 1, iTemp;
    while (iStart < iEnd) {
      pStart = chars.GetDataPtr(iStart++);
      pEnd = chars.GetDataPtr(iEnd--);
      iTemp = pStart->m_iBidiPos;
      pStart->m_iBidiPos = pEnd->m_iBidiPos;
      pEnd->m_iBidiPos = iTemp;
    }
  }
  void FX_BidiSetDeferredRun(CFX_ArrayTemplate<baseType>& chars,
                             FX_BOOL bClass,
                             int32_t iStart,
                             int32_t iCount,
                             int32_t iValue) {
    ASSERT(iStart > -1 && iStart <= chars.GetSize());
    ASSERT(iStart - iCount > -1);
    baseType* pTC;
    int32_t iLast = iStart - iCount;
    if (bClass) {
      for (int32_t i = iStart - 1; i >= iLast; i--) {
        pTC = chars.GetDataPtr(i);
        pTC->m_iBidiClass = (int16_t)iValue;
      }
    } else {
      for (int32_t i = iStart - 1; i >= iLast; i--) {
        pTC = chars.GetDataPtr(i);
        pTC->m_iBidiLevel = (int16_t)iValue;
      }
    }
  }
  void FX_BidiClassify(CFX_ArrayTemplate<baseType>& chars,
                       int32_t iCount,
                       FX_BOOL bWS) {
    ASSERT(iCount > -1 && iCount <= chars.GetSize());
    baseType* pTC;
    if (bWS) {
      for (int32_t i = 0; i < iCount; i++) {
        pTC = chars.GetDataPtr(i);
        pTC->m_iBidiClass =
            (int16_t)(pTC->m_dwCharProps & FX_BIDICLASSBITSMASK) >>
            FX_BIDICLASSBITS;
      }
    } else {
      for (int32_t i = 0; i < iCount; i++) {
        pTC = chars.GetDataPtr(i);
        pTC->m_iBidiClass = (int16_t)
            gc_FX_BidiNTypes[(pTC->m_dwCharProps & FX_BIDICLASSBITSMASK) >>
                             FX_BIDICLASSBITS];
      }
    }
  }
  void FX_BidiResolveExplicit(CFX_ArrayTemplate<baseType>& chars,
                              int32_t iCount,
                              int32_t iBaseLevel) {
    ASSERT(iCount > -1 && iCount <= chars.GetSize());
    ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL);
    if (iCount < 1) {
      return;
    }
    baseType* pTC;
    for (int32_t i = 0; i < iCount; i++) {
      pTC = chars.GetDataPtr(i);
      pTC->m_iBidiLevel = (int16_t)iBaseLevel;
    }
  }
  void FX_BidiResolveWeak(CFX_ArrayTemplate<baseType>& chars,
                          int32_t iCount,
                          int32_t iBaseLevel) {
    ASSERT(iCount > -1 && iCount <= chars.GetSize());
    iCount--;
    if (iCount < 1) {
      return;
    }
    baseType *pTC, *pTCNext;
    int32_t iLevelCur = iBaseLevel;
    int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BWSxr : FX_BWSxl;
    int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction;
    for (; i <= iCount; i++) {
      pTC = chars.GetDataPtr(i);
      iClsCur = pTC->m_iBidiClass;
      if (iClsCur == FX_BIDICLASS_BN) {
        pTC->m_iBidiLevel = (int16_t)iLevelCur;
        if (i == iCount && iLevelCur != iBaseLevel) {
          iClsCur = FX_BidiDirection(iLevelCur);
          pTC->m_iBidiClass = (int16_t)iClsCur;
        } else if (i < iCount) {
          pTCNext = chars.GetDataPtr(i + 1);
          int32_t iLevelNext, iLevelNew;
          iClsNew = pTCNext->m_iBidiClass;
          iLevelNext = pTCNext->m_iBidiLevel;
          if (iClsNew != FX_BIDICLASS_BN && iLevelCur != iLevelNext) {
            iLevelNew = iLevelNext;
            if (iLevelCur > iLevelNew) {
              iLevelNew = iLevelCur;
            }
            pTC->m_iBidiLevel = (int16_t)iLevelNew;
            iClsCur = FX_BidiDirection(iLevelNew);
            pTC->m_iBidiClass = (int16_t)iClsCur;
            iLevelCur = iLevelNext;
          } else {
            if (iNum > 0) {
              iNum++;
            }
            continue;
          }
        } else {
          if (iNum > 0) {
            iNum++;
          }
          continue;
        }
      }
      ASSERT(iClsCur <= FX_BIDICLASS_BN);
      iAction = gc_FX_BidiWeakActions[iState][iClsCur];
      iClsRun = FX_BidiGetDeferredType(iAction);
      if (iClsRun != FX_BIDIWEAKACTION_XX && iNum > 0) {
        FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun);
        iNum = 0;
      }
      iClsNew = FX_BidiGetResolvedType(iAction);
      if (iClsNew != FX_BIDIWEAKACTION_XX) {
        pTC->m_iBidiClass = (int16_t)iClsNew;
      }
      if (FX_BIDIWEAKACTION_IX & iAction) {
        iNum++;
      }
      iState = gc_FX_BidiWeakStates[iState][iClsCur];
    }
    if (iNum > 0) {
      iClsCur = FX_BidiDirection(iBaseLevel);
      iClsRun = FX_BidiGetDeferredType(gc_FX_BidiWeakActions[iState][iClsCur]);
      if (iClsRun != FX_BIDIWEAKACTION_XX) {
        FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun);
      }
    }
  }
  void FX_BidiResolveNeutrals(CFX_ArrayTemplate<baseType>& chars,
                              int32_t iCount,
                              int32_t iBaseLevel) {
    ASSERT(iCount > -1 && iCount <= chars.GetSize());
    ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL);
    iCount--;
    if (iCount < 1) {
      return;
    }
    baseType* pTC;
    int32_t iLevel = iBaseLevel;
    int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BNSr : FX_BNSl;
    int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction;
    for (; i <= iCount; i++) {
      pTC = chars.GetDataPtr(i);
      iClsCur = pTC->m_iBidiClass;
      if (iClsCur == FX_BIDICLASS_BN) {
        if (iNum) {
          iNum++;
        }
        continue;
      }
      ASSERT(iClsCur < FX_BIDICLASS_AL);
      iAction = gc_FX_BidiNeutralActions[iState][iClsCur];
      iClsRun = FX_BidiGetDeferredNeutrals(iAction, iLevel);
      if (iClsRun != FX_BIDICLASS_N && iNum > 0) {
        FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun);
        iNum = 0;
      }
      iClsNew = FX_BidiGetResolvedNeutrals(iAction);
      if (iClsNew != FX_BIDICLASS_N) {
        pTC->m_iBidiClass = (int16_t)iClsNew;
      }
      if (FX_BIDINEUTRALACTION_In & iAction) {
        iNum++;
      }
      iState = gc_FX_BidiNeutralStates[iState][iClsCur];
      iLevel = pTC->m_iBidiLevel;
    }
    if (iNum > 0) {
      iClsCur = FX_BidiDirection(iLevel);
      iClsRun = FX_BidiGetDeferredNeutrals(
          gc_FX_BidiNeutralActions[iState][iClsCur], iLevel);
      if (iClsRun != FX_BIDICLASS_N) {
        FX_BidiSetDeferredRun(chars, TRUE, i, iNum, iClsRun);
      }
    }
  }
  void FX_BidiResolveImplicit(CFX_ArrayTemplate<baseType>& chars,
                              int32_t iCount) {
    ASSERT(iCount > -1 && iCount <= chars.GetSize());
    baseType* pTC;
    int32_t iCls, iLevel;
    for (int32_t i = 0; i < iCount; i++) {
      pTC = chars.GetDataPtr(i);
      iCls = pTC->m_iBidiClass;
      if (iCls == FX_BIDICLASS_BN) {
        continue;
      }
      ASSERT(iCls > FX_BIDICLASS_ON && iCls < FX_BIDICLASS_AL);
      iLevel = pTC->m_iBidiLevel;
      iLevel += gc_FX_BidiAddLevel[FX_IsOdd(iLevel)][iCls - 1];
      pTC->m_iBidiLevel = (int16_t)iLevel;
    }
  }
  void FX_BidiResolveWhitespace(CFX_ArrayTemplate<baseType>& chars,
                                int32_t iCount,
                                int32_t iBaseLevel) {
    ASSERT(iCount > -1 && iCount <= chars.GetSize());
    ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL);
    if (iCount < 1) {
      return;
    }
    iCount--;
    int32_t iLevel = iBaseLevel;
    int32_t i = 0, iNum = 0;
    baseType* pTC;
    for (; i <= iCount; i++) {
      pTC = chars.GetDataPtr(i);
      switch (pTC->m_iBidiClass) {
        case FX_BIDICLASS_WS:
          iNum++;
          break;
        case FX_BIDICLASS_RLE:
        case FX_BIDICLASS_LRE:
        case FX_BIDICLASS_LRO:
        case FX_BIDICLASS_RLO:
        case FX_BIDICLASS_PDF:
        case FX_BIDICLASS_BN:
          pTC->m_iBidiLevel = (int16_t)iLevel;
          iNum++;
          break;
        case FX_BIDICLASS_S:
        case FX_BIDICLASS_B:
          if (iNum > 0) {
            FX_BidiSetDeferredRun(chars, FALSE, i, iNum, iBaseLevel);
          }
          pTC->m_iBidiLevel = (int16_t)iBaseLevel;
          iNum = 0;
          break;
        default:
          iNum = 0;
          break;
      }
      iLevel = pTC->m_iBidiLevel;
    }
    if (iNum > 0) {
      FX_BidiSetDeferredRun(chars, FALSE, i, iNum, iBaseLevel);
    }
  }
  int32_t FX_BidiReorderLevel(CFX_ArrayTemplate<baseType>& chars,
                              int32_t iCount,
                              int32_t iBaseLevel,
                              int32_t iStart,
                              FX_BOOL bReverse) {
    ASSERT(iCount > -1 && iCount <= chars.GetSize());
    ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL);
    ASSERT(iStart >= 0 && iStart < iCount);
    if (iCount < 1) {
      return 0;
    }
    baseType* pTC;
    bReverse = bReverse || FX_IsOdd(iBaseLevel);
    int32_t i = iStart, iLevel;
    for (; i < iCount; i++) {
      pTC = chars.GetDataPtr(i);
      if ((iLevel = pTC->m_iBidiLevel) == iBaseLevel) {
        continue;
      }
      if (iLevel < iBaseLevel) {
        break;
      }
      i += FX_BidiReorderLevel(chars, iCount, iBaseLevel + 1, i, bReverse) - 1;
    }
    int32_t iNum = i - iStart;
    if (bReverse && iNum > 1) {
      FX_BidiReverseString(chars, iStart, iNum);
    }
    return iNum;
  }
  void FX_BidiReorder(CFX_ArrayTemplate<baseType>& chars,
                      int32_t iCount,
                      int32_t iBaseLevel) {
    ASSERT(iCount > -1 && iCount <= chars.GetSize());
    ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL);
    int32_t i = 0;
    while (i < iCount) {
      i += FX_BidiReorderLevel(chars, iCount, iBaseLevel, i, FALSE);
    }
  }
  void FX_BidiPosition(CFX_ArrayTemplate<baseType>& chars, int32_t iCount) {
    ASSERT(iCount > -1 && iCount <= chars.GetSize());
    baseType* pTC;
    int32_t i = 0;
    while (i < iCount) {
      pTC = chars.GetDataPtr(i);
      pTC = chars.GetDataPtr(pTC->m_iBidiPos);
      pTC->m_iBidiOrder = i++;
    }
  }

  void FX_BidiLine(CFX_ArrayTemplate<baseType>& chars,
                   int32_t iCount,
                   int32_t iBaseLevel) {
    ASSERT(iCount > -1 && iCount <= chars.GetSize());
    if (iCount < 2) {
      return;
    }
    FX_BidiClassify(chars, iCount, FALSE);
    FX_BidiResolveExplicit(chars, iCount, iBaseLevel);
    FX_BidiResolveWeak(chars, iCount, iBaseLevel);
    FX_BidiResolveNeutrals(chars, iCount, iBaseLevel);
    FX_BidiResolveImplicit(chars, iCount);
    FX_BidiClassify(chars, iCount, TRUE);
    FX_BidiResolveWhitespace(chars, iCount, iBaseLevel);
    FX_BidiReorder(chars, iCount, iBaseLevel);
    FX_BidiPosition(chars, iCount);
  }
};
void FX_BidiLine(CFX_TxtCharArray& chars, int32_t iCount, int32_t iBaseLevel) {
  CFX_BidiLineTemplate<CFX_TxtChar> blt;
  blt.FX_BidiLine(chars, iCount, iBaseLevel);
}
void FX_BidiLine(CFX_RTFCharArray& chars, int32_t iCount, int32_t iBaseLevel) {
  CFX_BidiLineTemplate<CFX_RTFChar> blt;
  blt.FX_BidiLine(chars, iCount, iBaseLevel);
}
