/// <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(); }