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

extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536];
extern const FX_WCHAR gs_FX_TextLayout_VerticalMirror[64];
extern const FX_WCHAR gs_FX_TextLayout_BidiMirror[512];
FX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch)
{
    return gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
}
bool FX_IsCtrlCode(FX_WCHAR ch)
{
    FX_DWORD dwRet = (gs_FX_TextLayout_CodeProperties[(FX_WORD)ch] & FX_CHARTYPEBITSMASK);
    return dwRet == FX_CHARTYPE_Tab || dwRet == FX_CHARTYPE_Control;
}
bool FX_IsRotationCode(FX_WCHAR ch)
{
    return (gs_FX_TextLayout_CodeProperties[(FX_WORD)ch] & 0x8000) != 0;
}
bool FX_IsCombinationChar(FX_WCHAR wch)
{
    FX_DWORD dwProps = (gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & FX_CHARTYPEBITSMASK);
    return dwProps == FX_CHARTYPE_Combination;
}
bool	FX_IsBidiChar(FX_WCHAR wch)
{
    FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
    int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
    return (FX_BIDICLASS_R == iBidiCls || FX_BIDICLASS_AL == iBidiCls);
}
FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, bool bRTL, bool bVertical)
{
    FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
    FX_DWORD dwTemp = (dwProps & 0xFF800000);
    if (bRTL && dwTemp < 0xFF800000) {
        wch = gs_FX_TextLayout_BidiMirror[dwTemp >> 23];
        dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
    }
    if (bVertical) {
        dwTemp = (dwProps & 0x007E0000);
        if (dwTemp < 0x007E0000) {
            wch = gs_FX_TextLayout_VerticalMirror[dwTemp >> 17];
        }
    }
    return wch;
}
FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_DWORD dwProps, bool bRTL, bool bVertical)
{
    FX_DWORD dwTemp = (dwProps & 0xFF800000);
    if (bRTL && dwTemp < 0xFF800000) {
        wch = gs_FX_TextLayout_BidiMirror[dwTemp >> 23];
        dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
    }
    if (bVertical) {
        dwTemp = (dwProps & 0x007E0000);
        if (dwTemp < 0x007E0000) {
            wch = gs_FX_TextLayout_VerticalMirror[dwTemp >> 17];
        }
    }
    return wch;
}
