Пример #1
0
        /// <summary>
        /// Initialize with an array of Unicode code points
        /// </summary>
        /// <param name="codePoints">The unicode code points to be processed</param>
        /// <param name="paragraphEmbeddingLevel">The paragraph embedding level</param>
        public void Init(Slice <int> codePoints, sbyte paragraphEmbeddingLevel)
        {
            // Set working buffer sizes
            _types.Length = codePoints.Length;
            _pairedBracketTypes.Length  = codePoints.Length;
            _pairedBracketValues.Length = codePoints.Length;

            _paragraphPositions.Clear();
            _paragraphEmbeddingLevel = paragraphEmbeddingLevel;

            // Resolve the directionality, paired bracket type and paired bracket values for
            // all code points
            _hasBrackets   = false;
            _hasEmbeddings = false;
            _hasIsolates   = false;
            for (int i = 0; i < codePoints.Length; i++)
            {
                var bidiData = UnicodeClasses.BidiData(codePoints[i]);

                // Look up directionality
                var dir = (Directionality)(bidiData >> 24);
                _types[i] = dir;

                switch (dir)
                {
                case Directionality.LRE:
                case Directionality.LRO:
                case Directionality.RLE:
                case Directionality.RLO:
                case Directionality.PDF:
                    _hasEmbeddings = true;
                    break;

                case Directionality.LRI:
                case Directionality.RLI:
                case Directionality.FSI:
                case Directionality.PDI:
                    _hasIsolates = true;
                    break;
                }

                // Lookup paired bracket types
                var pbt = (PairedBracketType)((bidiData >> 16) & 0xFF);
                _pairedBracketTypes[i] = pbt;
                switch (pbt)
                {
                case PairedBracketType.o:
                    _pairedBracketValues[i] = MapCanon((int)(bidiData & 0xFFFF));
                    _hasBrackets            = true;
                    break;

                case PairedBracketType.c:
                    _pairedBracketValues[i] = MapCanon(codePoints[i]);
                    _hasBrackets            = true;
                    break;
                }

                /*
                 * if (_types[i] == RichTextKit.Directionality.B)
                 * {
                 *  _types[i] = (Directionality)Directionality.WS;
                 *  _paragraphPositions.Add(i);
                 * }
                 */
            }

            // Create slices on work buffers
            Types = _types.AsSlice();
            PairedBracketTypes  = _pairedBracketTypes.AsSlice();
            PairedBracketValues = _pairedBracketValues.AsSlice();
        }