Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
 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);
 }