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 #include "core/fxcrt/fx_ucd.h"
      8 
      9 uint32_t FX_GetUnicodeProperties(FX_WCHAR wch) {
     10   size_t idx = static_cast<size_t>(wch);
     11   if (idx < kTextLayoutCodePropertiesSize)
     12     return kTextLayoutCodeProperties[(uint16_t)wch];
     13   return 0;
     14 }
     15 
     16 #ifdef PDF_ENABLE_XFA
     17 bool FX_IsCtrlCode(FX_WCHAR ch) {
     18   uint32_t dwRet = (FX_GetUnicodeProperties(ch) & FX_CHARTYPEBITSMASK);
     19   return dwRet == FX_CHARTYPE_Tab || dwRet == FX_CHARTYPE_Control;
     20 }
     21 #endif  // PDF_ENABLE_XFA
     22 
     23 FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, bool bRTL, bool bVertical) {
     24   uint32_t dwProps = FX_GetUnicodeProperties(wch);
     25   uint32_t dwTemp = (dwProps & 0xFF800000);
     26   if (bRTL && dwTemp < 0xFF800000) {
     27     size_t idx = dwTemp >> 23;
     28     if (idx < kFXTextLayoutBidiMirrorSize) {
     29       wch = kFXTextLayoutBidiMirror[idx];
     30       dwProps = FX_GetUnicodeProperties(wch);
     31     }
     32   }
     33   if (bVertical) {
     34     dwTemp = (dwProps & 0x007E0000);
     35     if (dwTemp < 0x007E0000) {
     36       size_t idx = dwTemp >> 17;
     37       if (idx < kFXTextLayoutVerticalMirrorSize)
     38         wch = kFXTextLayoutVerticalMirror[idx];
     39     }
     40   }
     41   return wch;
     42 }
     43 
     44 #ifdef PDF_ENABLE_XFA
     45 FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch,
     46                           uint32_t dwProps,
     47                           bool bRTL,
     48                           bool bVertical) {
     49   uint32_t dwTemp = (dwProps & 0xFF800000);
     50   if (bRTL && dwTemp < 0xFF800000) {
     51     size_t idx = dwTemp >> 23;
     52     if (idx < kFXTextLayoutBidiMirrorSize) {
     53       wch = kFXTextLayoutBidiMirror[idx];
     54       dwProps = FX_GetUnicodeProperties(wch);
     55     }
     56   }
     57   if (bVertical) {
     58     dwTemp = (dwProps & 0x007E0000);
     59     if (dwTemp < 0x007E0000) {
     60       size_t idx = dwTemp >> 17;
     61       if (idx < kFXTextLayoutVerticalMirrorSize)
     62         wch = kFXTextLayoutVerticalMirror[idx];
     63     }
     64   }
     65   return wch;
     66 }
     67 #endif  // PDF_ENABLE_XFA
     68