Accueil > Nouvelles > Java, JavaFx, Swing, ICU, HarfBuzz, SILE, Open Font Format et l’écriture (...)

Java, JavaFx, Swing, ICU, HarfBuzz, SILE, Open Font Format et l’écriture mathématique.

Où se passe l’écriture dans JavaFx. Où sont ICU et Harfbuzz dans Java ? À quand l’écriture mathématique pour tous ?

mercredi 2 mars 2016, par ScientificWare

JavaFx où cela se passe-t-il ?

  • libjavafx-font
  • modules/graphics/src/main/java/com/sun/javafx/font/coretext/
    • modules/graphics/src/main/java/com/sun/javafx/font/coretext/CTGlyphLayout.java : c’est cette classe qui étend modules/graphics/src/main/java/com/sun/javafx/text/GlyphLayout.java
    • modules/graphics/src/main/java/com/sun/javafx/font/coretext/OS.java
  • modules/graphics/src/main/java/com/sun/glass/utils/
    • modules/graphics/src/main/java/com/sun/glass/utils/NativeLibLoader.java
  • modules/graphics/src/main/java/com/sun/javafx/text/
    • modules/graphics/src/main/java/com/sun/javafx/text/PrismTextLayout.java
    • modules/graphics/src/main/java/com/sun/javafx/text/TextRun.java
    • modules/graphics/src/main/java/com/sun/javafx/text/PrismTextLayoutFactory.java
    • modules/graphics/src/main/java/com/sun/javafx/text/GlyphLayout.java : c’est cette classe qui scinde le texte en paragraphes en parcourant la chaine pour détecter les \n. Celle classe est abstraite une implémentation complète est dans modules/graphics/src/main/java/com/sun/javafx/font/coretext/CTGlyphLayout.java
  • modules/graphics/src/main/java/javafx/scene/text/ c’est le cas par exemple de la méthode layout(...) qui s’occupe d’afficher chaque paragraphe.
    • modules/graphics/src/main/java/javafx/scene/text/Font.java : Pour mémoire, cette classe fournie la méthode hashCode().

Pour finir sans doute avec Pango et Cairo ...

HarfBuzz remplace ICU Layout Engine dans Java, mais dans quelle partie du code cela intervient-il ?

HarfBuzz et ICU sont deux moteurs de rendu pour les textes. Ce sont deux applications indépendantes de Java. Elles sont également utilisées dans d’autres applications.

HarfBuzz est utilisé dans Androïd, LibreOffice, Firefox, GNOME, ChromeOS, Chrome, XeTeX, Android, PlayStation 4, KDE et donc Java à partir de la version 9.

ICU était utilisé dans Java jusqu’à sa version 8. ICU n’étant plus plus maintenu, les développeurs de Java se devaient de le remplacer au risque d’accumuler les bugs non corrigés ou de prendre du retard sur les applications citées précédemment par rapport aux nouvelles possibilités des polices Open Font Format (OFF). Les developpeurs d’ICU suggérant eux-même de remplacer ICU par HarfBuzz, le choix était évident.

Pour découvrir où interviennent ces changements, il faut plonger dans les méandres du code du JDK9 (Java version 9 en cours de développement, voir OpenJDK) :

C’est là !

« 

...
public void layout(FontStrikeDesc desc, float[] mat, float ptSize, int gmask,
                       int baseIndex, TextRecord tr, int typo_flags,
                       Point2D.Float pt, GVData data) {
        ...
        if (useICU) {
        nativeLayout(font, strike, mat, gmask, baseIndex,
             tr.text, tr.start, tr.limit, tr.min, tr.max,
             key.script(), key.lang(), typo_flags, pt, data,
             font.getUnitsPerEm(), layoutTables);
        } else {
            long pNativeFont = font.getPlatformNativeFontPtr(); // used on OSX
            // pScaler probably not needed long term.
            long pScaler = 0L;
            if (font instanceof FileFont) {
                pScaler = ((FileFont)font).getScaler().nativeScaler;
            }
            shape(font, strike, ptSize, mat, pScaler, pNativeFont, isAAT(font),
                  tr.text, data, key.script(),
                  tr.start, tr.limit, baseIndex, pt,
                  typo_flags, gmask);
         }
    }
...

 »

  • Pour trouver le code complet, aller dans le paquet "sun.font",
  • Et ouvrir la classe "SunLayoutEngine", c’est cette classe écrite par IBM en 2003 qui a été modifiée.
  • Plus particulièrement, la méthode layout, en partie reproduite ci-dessus. On remarque que le moteur de rendu ICU est toujours disponible. C’est la variable booléenne useICU qui déterminera si l’on utilise ICU ou HarfBuzz. Cette variable est initialisée en début de classe.
  • Si ICU est utilisée, la méthode employée est nativeLayout,
  • Sinon c’est HarfBuzz avec la méthode shape.
  • Ces deux méthodes sont natives, autrement dit, elles font référence à des méthodes de leur moteur de rendu respectif ICU et HarfBuzz et sont écrites en C.
  • On sort du monde Java. Pour fonctionner sur une plateforme Linux, Apple OS, Windows, ... Java a donc besoin que ICU et Harfbuzz soient présents sur ces plateformes.

Quelles sont donc les possibilités introduites par HarfBuzz et comment les exploiter dans Java en particulier dans ScientificPad ?

Open Font Format est un format de police prenant en compte la notation mathématique. Son fonctionnement pour la création de caractères mathématiques particuliers s’inspire fortement de la méthode utilisée par Donald Knuth dans TeX.
Si Harfbuzz est une application libre créée pour pouvoir afficher les police OFF, elle ne sait pas encore utiliser les tables d’affichage mathématique. Ce sont les applications qui l’utilisent qui se chargent du "bricolage" à la Knuth (assemblage de glyphes).
Heureusement, une première réponse donnée par Frédérique Wang est en cours d’implentation :

Si ce travail est mené à son terme. Toute application utilisant Harfbuzz saura gérer l’écriture des symboles mathématiques de base. Y compris Java et par conséquent ScientificPad. J’ai pour l’instant deux solutions d’attente qui sont satisfaisantes.

Pour aller plus loin : au détour d’une discussion, on se retrouve nez à nez avec SILE
...

Portfolio