Home | History | Annotate | Download | only in fxcrt
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #ifndef CORE_FXCRT_FX_ARABIC_H_
      8 #define CORE_FXCRT_FX_ARABIC_H_
      9 
     10 #include "core/fxcrt/fx_arb.h"
     11 
     12 #define FX_BIDIMAXLEVEL 61
     13 #define FX_BidiDirection(a) (FX_IsOdd(a) ? FX_BIDICLASS_R : FX_BIDICLASS_L)
     14 #define FX_BidiGetDeferredType(a) (((a) >> 4) & 0x0F)
     15 #define FX_BidiGetResolvedType(a) ((a)&0x0F)
     16 
     17 namespace pdfium {
     18 namespace arabic {
     19 
     20 bool IsArabicChar(FX_WCHAR wch);
     21 bool IsArabicFormChar(FX_WCHAR wch);
     22 FX_WCHAR GetFormChar(FX_WCHAR wch, FX_WCHAR prev = 0, FX_WCHAR next = 0);
     23 FX_WCHAR GetFormChar(const CFX_Char* cur,
     24                      const CFX_Char* prev,
     25                      const CFX_Char* next);
     26 
     27 }  // namespace arabic
     28 }  // namespace pdfium
     29 
     30 void FX_BidiReverseString(CFX_WideString& wsText,
     31                           int32_t iStart,
     32                           int32_t iCount);
     33 void FX_BidiSetDeferredRun(CFX_ArrayTemplate<int32_t>& values,
     34                            int32_t iStart,
     35                            int32_t iCount,
     36                            int32_t iValue);
     37 void FX_BidiClassify(const CFX_WideString& wsText,
     38                      CFX_ArrayTemplate<int32_t>& classes,
     39                      bool bWS = false);
     40 int32_t FX_BidiResolveExplicit(int32_t iBaseLevel,
     41                                int32_t iDirection,
     42                                CFX_ArrayTemplate<int32_t>& classes,
     43                                CFX_ArrayTemplate<int32_t>& levels,
     44                                int32_t iStart,
     45                                int32_t iCount,
     46                                int32_t iNest = 0);
     47 
     48 enum FX_BIDIWEAKSTATE {
     49   FX_BIDIWEAKSTATE_xa = 0,
     50   FX_BIDIWEAKSTATE_xr,
     51   FX_BIDIWEAKSTATE_xl,
     52   FX_BIDIWEAKSTATE_ao,
     53   FX_BIDIWEAKSTATE_ro,
     54   FX_BIDIWEAKSTATE_lo,
     55   FX_BIDIWEAKSTATE_rt,
     56   FX_BIDIWEAKSTATE_lt,
     57   FX_BIDIWEAKSTATE_cn,
     58   FX_BIDIWEAKSTATE_ra,
     59   FX_BIDIWEAKSTATE_re,
     60   FX_BIDIWEAKSTATE_la,
     61   FX_BIDIWEAKSTATE_le,
     62   FX_BIDIWEAKSTATE_ac,
     63   FX_BIDIWEAKSTATE_rc,
     64   FX_BIDIWEAKSTATE_rs,
     65   FX_BIDIWEAKSTATE_lc,
     66   FX_BIDIWEAKSTATE_ls,
     67   FX_BIDIWEAKSTATE_ret,
     68   FX_BIDIWEAKSTATE_let,
     69 };
     70 #define FX_BWSxa FX_BIDIWEAKSTATE_xa
     71 #define FX_BWSxr FX_BIDIWEAKSTATE_xr
     72 #define FX_BWSxl FX_BIDIWEAKSTATE_xl
     73 #define FX_BWSao FX_BIDIWEAKSTATE_ao
     74 #define FX_BWSro FX_BIDIWEAKSTATE_ro
     75 #define FX_BWSlo FX_BIDIWEAKSTATE_lo
     76 #define FX_BWSrt FX_BIDIWEAKSTATE_rt
     77 #define FX_BWSlt FX_BIDIWEAKSTATE_lt
     78 #define FX_BWScn FX_BIDIWEAKSTATE_cn
     79 #define FX_BWSra FX_BIDIWEAKSTATE_ra
     80 #define FX_BWSre FX_BIDIWEAKSTATE_re
     81 #define FX_BWSla FX_BIDIWEAKSTATE_la
     82 #define FX_BWSle FX_BIDIWEAKSTATE_le
     83 #define FX_BWSac FX_BIDIWEAKSTATE_ac
     84 #define FX_BWSrc FX_BIDIWEAKSTATE_rc
     85 #define FX_BWSrs FX_BIDIWEAKSTATE_rs
     86 #define FX_BWSlc FX_BIDIWEAKSTATE_lc
     87 #define FX_BWSls FX_BIDIWEAKSTATE_ls
     88 #define FX_BWSret FX_BIDIWEAKSTATE_ret
     89 #define FX_BWSlet FX_BIDIWEAKSTATE_let
     90 
     91 enum FX_BIDIWEAKACTION {
     92   FX_BIDIWEAKACTION_IX = 0x100,
     93   FX_BIDIWEAKACTION_XX = 0x0F,
     94   FX_BIDIWEAKACTION_xxx = (0x0F << 4) + 0x0F,
     95   FX_BIDIWEAKACTION_xIx = 0x100 + FX_BIDIWEAKACTION_xxx,
     96   FX_BIDIWEAKACTION_xxN = (0x0F << 4) + FX_BIDICLASS_ON,
     97   FX_BIDIWEAKACTION_xxE = (0x0F << 4) + FX_BIDICLASS_EN,
     98   FX_BIDIWEAKACTION_xxA = (0x0F << 4) + FX_BIDICLASS_AN,
     99   FX_BIDIWEAKACTION_xxR = (0x0F << 4) + FX_BIDICLASS_R,
    100   FX_BIDIWEAKACTION_xxL = (0x0F << 4) + FX_BIDICLASS_L,
    101   FX_BIDIWEAKACTION_Nxx = (FX_BIDICLASS_ON << 4) + 0x0F,
    102   FX_BIDIWEAKACTION_Axx = (FX_BIDICLASS_AN << 4) + 0x0F,
    103   FX_BIDIWEAKACTION_ExE = (FX_BIDICLASS_EN << 4) + FX_BIDICLASS_EN,
    104   FX_BIDIWEAKACTION_NIx = (FX_BIDICLASS_ON << 4) + 0x0F + 0x100,
    105   FX_BIDIWEAKACTION_NxN = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_ON,
    106   FX_BIDIWEAKACTION_NxR = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_R,
    107   FX_BIDIWEAKACTION_NxE = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_EN,
    108   FX_BIDIWEAKACTION_AxA = (FX_BIDICLASS_AN << 4) + FX_BIDICLASS_AN,
    109   FX_BIDIWEAKACTION_NxL = (FX_BIDICLASS_ON << 4) + FX_BIDICLASS_L,
    110   FX_BIDIWEAKACTION_LxL = (FX_BIDICLASS_L << 4) + FX_BIDICLASS_L,
    111   FX_BIDIWEAKACTION_xIL = (0x0F << 4) + FX_BIDICLASS_L + 0x100,
    112   FX_BIDIWEAKACTION_AxR = (FX_BIDICLASS_AN << 4) + FX_BIDICLASS_R,
    113   FX_BIDIWEAKACTION_Lxx = (FX_BIDICLASS_L << 4) + 0x0F,
    114 };
    115 #define FX_BWAIX FX_BIDIWEAKACTION_IX
    116 #define FX_BWAXX FX_BIDIWEAKACTION_XX
    117 #define FX_BWAxxx FX_BIDIWEAKACTION_xxx
    118 #define FX_BWAxIx FX_BIDIWEAKACTION_xIx
    119 #define FX_BWAxxN FX_BIDIWEAKACTION_xxN
    120 #define FX_BWAxxE FX_BIDIWEAKACTION_xxE
    121 #define FX_BWAxxA FX_BIDIWEAKACTION_xxA
    122 #define FX_BWAxxR FX_BIDIWEAKACTION_xxR
    123 #define FX_BWAxxL FX_BIDIWEAKACTION_xxL
    124 #define FX_BWANxx FX_BIDIWEAKACTION_Nxx
    125 #define FX_BWAAxx FX_BIDIWEAKACTION_Axx
    126 #define FX_BWAExE FX_BIDIWEAKACTION_ExE
    127 #define FX_BWANIx FX_BIDIWEAKACTION_NIx
    128 #define FX_BWANxN FX_BIDIWEAKACTION_NxN
    129 #define FX_BWANxR FX_BIDIWEAKACTION_NxR
    130 #define FX_BWANxE FX_BIDIWEAKACTION_NxE
    131 #define FX_BWAAxA FX_BIDIWEAKACTION_AxA
    132 #define FX_BWANxL FX_BIDIWEAKACTION_NxL
    133 #define FX_BWALxL FX_BIDIWEAKACTION_LxL
    134 #define FX_BWAxIL FX_BIDIWEAKACTION_xIL
    135 #define FX_BWAAxR FX_BIDIWEAKACTION_AxR
    136 #define FX_BWALxx FX_BIDIWEAKACTION_Lxx
    137 
    138 void FX_BidiResolveWeak(int32_t iBaseLevel,
    139                         CFX_ArrayTemplate<int32_t>& classes,
    140                         CFX_ArrayTemplate<int32_t>& levels);
    141 enum FX_BIDINEUTRALSTATE {
    142   FX_BIDINEUTRALSTATE_r = 0,
    143   FX_BIDINEUTRALSTATE_l,
    144   FX_BIDINEUTRALSTATE_rn,
    145   FX_BIDINEUTRALSTATE_ln,
    146   FX_BIDINEUTRALSTATE_a,
    147   FX_BIDINEUTRALSTATE_na,
    148 };
    149 #define FX_BNSr FX_BIDINEUTRALSTATE_r
    150 #define FX_BNSl FX_BIDINEUTRALSTATE_l
    151 #define FX_BNSrn FX_BIDINEUTRALSTATE_rn
    152 #define FX_BNSln FX_BIDINEUTRALSTATE_ln
    153 #define FX_BNSa FX_BIDINEUTRALSTATE_a
    154 #define FX_BNSna FX_BIDINEUTRALSTATE_na
    155 enum FX_BIDINEUTRALACTION {
    156   FX_BIDINEUTRALACTION_nL = FX_BIDICLASS_L,
    157   FX_BIDINEUTRALACTION_En = (FX_BIDICLASS_AN << 4),
    158   FX_BIDINEUTRALACTION_Rn = (FX_BIDICLASS_R << 4),
    159   FX_BIDINEUTRALACTION_Ln = (FX_BIDICLASS_L << 4),
    160   FX_BIDINEUTRALACTION_In = FX_BIDIWEAKACTION_IX,
    161   FX_BIDINEUTRALACTION_LnL = (FX_BIDICLASS_L << 4) + FX_BIDICLASS_L,
    162 };
    163 #define FX_BNAnL FX_BIDINEUTRALACTION_nL
    164 #define FX_BNAEn FX_BIDINEUTRALACTION_En
    165 #define FX_BNARn FX_BIDINEUTRALACTION_Rn
    166 #define FX_BNALn FX_BIDINEUTRALACTION_Ln
    167 #define FX_BNAIn FX_BIDINEUTRALACTION_In
    168 #define FX_BNALnL FX_BIDINEUTRALACTION_LnL
    169 int32_t FX_BidiGetDeferredNeutrals(int32_t iAction, int32_t iLevel);
    170 int32_t FX_BidiGetResolvedNeutrals(int32_t iAction);
    171 void FX_BidiResolveNeutrals(int32_t iBaseLevel,
    172                             CFX_ArrayTemplate<int32_t>& classes,
    173                             const CFX_ArrayTemplate<int32_t>& levels);
    174 void FX_BidiResolveImplicit(const CFX_ArrayTemplate<int32_t>& classes,
    175                             CFX_ArrayTemplate<int32_t>& levels);
    176 void FX_BidiResolveWhitespace(int32_t iBaseLevel,
    177                               const CFX_ArrayTemplate<int32_t>& classes,
    178                               CFX_ArrayTemplate<int32_t>& levels);
    179 int32_t FX_BidiReorderLevel(int32_t iBaseLevel,
    180                             CFX_WideString& wsText,
    181                             const CFX_ArrayTemplate<int32_t>& levels,
    182                             int32_t iStart,
    183                             bool bReverse = false);
    184 void FX_BidiReorder(int32_t iBaseLevel,
    185                     CFX_WideString& wsText,
    186                     const CFX_ArrayTemplate<int32_t>& levels);
    187 
    188 #endif  // CORE_FXCRT_FX_ARABIC_H_
    189