internal static int[] ReorderLine(IList <LineRenderer.RendererGlyph> line, byte[] lineLevels, byte[] levels ) { if (!TYPOGRAPHY_MODULE_INITIALIZED) { logger.Warn("Cannot find advanced typography module, which was implicitly required by one of the layout properties" ); } else { if (levels == null) { return(null); } int[] reorder = (int[])CallMethod(TYPOGRAPHY_PACKAGE + BIDI_ALGORITHM, COMPUTE_REORDERING, new Type[] { typeof( byte[]) }, lineLevels); // int[] reorder = BidiAlgorithm.computeReordering(lineLevels); int[] inverseReorder = (int[])CallMethod(TYPOGRAPHY_PACKAGE + BIDI_ALGORITHM, INVERSE_REORDERING, new Type [] { typeof(int[]) }, reorder); // int[] inverseReorder = BidiAlgorithm.inverseReordering(reorder); IList <LineRenderer.RendererGlyph> reorderedLine = new List <LineRenderer.RendererGlyph>(lineLevels.Length); for (int i = 0; i < line.Count; i++) { reorderedLine.Add(line[reorder[i]]); // Mirror RTL glyphs if (levels[reorder[i]] % 2 == 1) { if (reorderedLine[i].glyph.HasValidUnicode()) { int unicode = reorderedLine[i].glyph.GetUnicode(); int pairedBracket = (int)CallMethod(TYPOGRAPHY_PACKAGE + BIDI_BRACKET_MAP, GET_PAIRED_BRACKET, new Type[] { typeof(int) }, unicode); // int pairedBracket = BidiBracketMap.getPairedBracket(reorderedLine.get(i).glyph.getUnicode()); if (pairedBracket != unicode) { PdfFont font = reorderedLine[i].renderer.GetPropertyAsFont(Property.FONT); reorderedLine[i] = new LineRenderer.RendererGlyph(font.GetGlyph(pairedBracket), reorderedLine[i].renderer); } } } } // fix anchorDelta for (int i_1 = 0; i_1 < reorderedLine.Count; i_1++) { Glyph glyph = reorderedLine[i_1].glyph; if (glyph.HasPlacement()) { int oldAnchor = reorder[i_1] + glyph.GetAnchorDelta(); int newPos = inverseReorder[oldAnchor]; int newAnchorDelta = newPos - i_1; glyph.SetAnchorDelta((short)newAnchorDelta); } } line.Clear(); line.AddAll(reorderedLine); return(reorder); } return(null); }
internal static int[] ReorderLine(IList <LineRenderer.RendererGlyph> line, byte[] lineLevels, byte[] levels ) { if (!TYPOGRAPHY_MODULE_INITIALIZED) { logger.Warn("Cannot find advanced typography module, which was implicitly required by one of the layout properties" ); } else { if (levels == null) { return(null); } int[] reorder = (int[])CallMethod(TYPOGRAPHY_PACKAGE + "bidi.BidiAlgorithm", "computeReordering", new Type [] { typeof(byte[]) }, lineLevels); //int[] reorder = BidiAlgorithm.computeReordering(lineLevels); IList <LineRenderer.RendererGlyph> reorderedLine = new List <LineRenderer.RendererGlyph>(lineLevels.Length); for (int i = 0; i < line.Count; i++) { reorderedLine.Add(line[reorder[i]]); // Mirror RTL glyphs if (levels[reorder[i]] % 2 == 1) { if (reorderedLine[i].glyph.HasValidUnicode()) { int pairedBracket = (int)CallMethod(TYPOGRAPHY_PACKAGE + "bidi.BidiBracketMap", "getPairedBracket", new Type [] { typeof(int) }, reorderedLine[i].glyph.GetUnicode()); PdfFont font = reorderedLine[i].renderer.GetPropertyAsFont(Property.FONT); //BidiBracketMap.getPairedBracket(reorderedLine.get(i).getUnicode()) reorderedLine[i] = new LineRenderer.RendererGlyph(font.GetGlyph(pairedBracket), reorderedLine[i].renderer); } } } line.Clear(); line.AddAll(reorderedLine); return(reorder); } return(null); }