| Index: core/src/fxcrt/fx_unicode.cpp
 | 
| diff --git a/core/src/fxcrt/fx_unicode.cpp b/core/src/fxcrt/fx_unicode.cpp
 | 
| index c7ab618200debe2702810979248c267c4615801e..be27542cdb0295ca2fa0a29e3f6be7da52342e67 100644
 | 
| --- a/core/src/fxcrt/fx_unicode.cpp
 | 
| +++ b/core/src/fxcrt/fx_unicode.cpp
 | 
| @@ -13,6 +13,13 @@ FX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch) {
 | 
|    return 0;
 | 
|  }
 | 
|  
 | 
| +#ifdef PDF_ENABLE_XFA
 | 
| +FX_BOOL FX_IsCtrlCode(FX_WCHAR ch) {
 | 
| +  FX_DWORD dwRet = (FX_GetUnicodeProperties(ch) & FX_CHARTYPEBITSMASK);
 | 
| +  return dwRet == FX_CHARTYPE_Tab || dwRet == FX_CHARTYPE_Control;
 | 
| +}
 | 
| +
 | 
| +#endif
 | 
|  FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical) {
 | 
|    FX_DWORD dwProps = FX_GetUnicodeProperties(wch);
 | 
|    FX_DWORD dwTemp = (dwProps & 0xFF800000);
 | 
| @@ -33,3 +40,28 @@ FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical) {
 | 
|    }
 | 
|    return wch;
 | 
|  }
 | 
| +#ifdef PDF_ENABLE_XFA
 | 
| +
 | 
| +FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch,
 | 
| +                          FX_DWORD dwProps,
 | 
| +                          FX_BOOL bRTL,
 | 
| +                          FX_BOOL bVertical) {
 | 
| +  FX_DWORD dwTemp = (dwProps & 0xFF800000);
 | 
| +  if (bRTL && dwTemp < 0xFF800000) {
 | 
| +    size_t idx = dwTemp >> 23;
 | 
| +    if (idx < kFXTextLayoutBidiMirrorSize) {
 | 
| +      wch = kFXTextLayoutBidiMirror[idx];
 | 
| +      dwProps = FX_GetUnicodeProperties(wch);
 | 
| +    }
 | 
| +  }
 | 
| +  if (bVertical) {
 | 
| +    dwTemp = (dwProps & 0x007E0000);
 | 
| +    if (dwTemp < 0x007E0000) {
 | 
| +      size_t idx = dwTemp >> 17;
 | 
| +      if (idx < kFXTextLayoutVerticalMirrorSize)
 | 
| +        wch = kFXTextLayoutVerticalMirror[idx];
 | 
| +    }
 | 
| +  }
 | 
| +  return wch;
 | 
| +}
 | 
| +#endif
 | 
| 
 |