namespace Avalonia.Media.TextFormatting.Unicode
{
///
/// Helper for looking up unicode character class information
///
internal static class UnicodeData
{
internal const int CATEGORY_BITS = 6;
internal const int SCRIPT_BITS = 8;
internal const int BIDI_BITS = 5;
internal const int LINEBREAK_BITS = 6;
internal const int SCRIPT_SHIFT = CATEGORY_BITS;
internal const int BIDI_SHIFT = CATEGORY_BITS + SCRIPT_BITS;
internal const int LINEBREAK_SHIFT = CATEGORY_BITS + SCRIPT_BITS + BIDI_BITS;
internal const int CATEGORY_MASK = (1 << CATEGORY_BITS) - 1;
internal const int SCRIPT_MASK = (1 << SCRIPT_BITS) - 1;
internal const int BIDI_MASK = (1 << BIDI_BITS) - 1;
internal const int LINEBREAK_MASK = (1 << LINEBREAK_BITS) - 1;
private static readonly UnicodeTrie s_unicodeDataTrie;
private static readonly UnicodeTrie s_graphemeBreakTrie;
static UnicodeData()
{
s_unicodeDataTrie = new UnicodeTrie(typeof(UnicodeData).Assembly.GetManifestResourceStream("Avalonia.Assets.UnicodeData.trie"));
s_graphemeBreakTrie = new UnicodeTrie(typeof(UnicodeData).Assembly.GetManifestResourceStream("Avalonia.Assets.GraphemeBreak.trie"));
}
///
/// Gets the for a Unicode codepoint.
///
/// The codepoint in question.
/// The code point's general category.
public static GeneralCategory GetGeneralCategory(int codepoint)
{
var value = s_unicodeDataTrie.Get(codepoint);
return (GeneralCategory)(value & CATEGORY_MASK);
}
///
/// Gets the for a Unicode codepoint.
///
/// The codepoint in question.
/// The code point's script.
public static Script GetScript(int codepoint)
{
var value = s_unicodeDataTrie.Get(codepoint);
return (Script)((value >> SCRIPT_SHIFT) & SCRIPT_MASK);
}
///
/// Gets the for a Unicode codepoint.
///
/// The codepoint in question.
/// The code point's biDi class.
public static BiDiClass GetBiDiClass(int codepoint)
{
var value = s_unicodeDataTrie.Get(codepoint);
return (BiDiClass)((value >> BIDI_SHIFT) & BIDI_MASK);
}
///
/// Gets the line break class for a Unicode codepoint.
///
/// The codepoint in question.
/// The code point's line break class.
public static LineBreakClass GetLineBreakClass(int codepoint)
{
var value = s_unicodeDataTrie.Get(codepoint);
return (LineBreakClass)((value >> LINEBREAK_SHIFT) & LINEBREAK_MASK);
}
///
/// Gets the grapheme break type for the Unicode codepoint.
///
/// The codepoint in question.
/// The code point's grapheme break type.
public static GraphemeBreakClass GetGraphemeClusterBreak(int codepoint)
{
return (GraphemeBreakClass)s_graphemeBreakTrie.Get(codepoint);
}
}
}