Question

J'essaie d'obtenir des ligatures Devanagari (dans Unicode Strings) rendu correctement sur Mac OS X 10.6.

Les cordes sont dessinées sur un JComponent et prend RenderingHints pour l'antialiasage. Les ligatures sont affichées correctement dans Windows XP SP2 et 7, et Ubuntu, mais dans Mac OS X, les ligatures sont décomposées (ou plutôt, non fusionnées correctement), les diacritiques sont éloignés de leurs positions, etc. (cf. Exemple de rendu correct de Win XP SP2 à gauche (avec RenderingHints Clé antialiasante ON), Exemple de rendu mauvais de Mac OS X 10.6.7 à droite (Antialiling DEFAULT = OFF).

J'ai défini la police comme suit, il doit donc utiliser une police par défaut sur n'importe quel système:

new Font(null,Font.PLAIN,20);

Je crois que tout cela pourrait avoir quelque chose à voir avec le fait que le codage de caractères par défaut sur les Mac est Macroman (pas un sous-ensemble UTF-8), et que d'autres systèmes (comme Windows) utilisent un sous-ensemble UTF-8 (comme Winlatin-1 ) ou CP1252 ou tels.

Même avec ces informations à portée de main, je suis dans le noir sur la façon de gérer ce problème. Ainsi, je serais très reconnaissant si quelqu'un pouvait me diriger dans la bonne direction.

correct and incorrect rendering of the same string

J'ai déjà essayé un certain nombre de choses:

  • Définir la police sur Devanagari MT n'a pas résolu le problème
  • TextAttribute LIGATURES_ON n'a pas résolu le problème

Je serais extrêmement reconnaissant pour tout indice, ou extraits de code par d'autres développeurs (de préférence avec un fond hindi qui se développe sur Mac).

Était-ce utile?

La solution

Utilisation du rendu de quartz au lieu du rendu Java 2D.

Cela fait une différence substantielle dans la qualité du rendu des glyphes. Cela doit être fait en premier, comme suggéré ici.

if (System.getProperty("os.name").startsWith("Mac OS X")) {
    System.setProperty("apple.awt.graphics.UseQuartz", "true");
}

Vous pourriez également regarder l'utilisation TextLayout, comme le FontRenderContext peut postuler RenderingHints.KEY_FRACTIONALMETRICS.

Autres conseils

Je ne suis pas un expert moi-même, mais ici quelques pointeurs. Pour autant que je sache de Wikipedia, le problème est très susceptible d'être votre police. Excuses à l'avance pour les longues citations, mais j'aurais pu lier les 2 articles Wikipedia.

Ici une partie de la section sur ligatures du Article Unicode:

Ligatures

De nombreux scripts, dont l'arabe et Devanagari, ont des règles orthographiques spéciales qui nécessitent que certaines combinaisons de formes de lettres soient combinées en formes de ligature spéciales. Les règles régissant la formation de ligature peuvent être assez complexes, nécessitant des technologies spéciales de transmission de scripts comme ACE (Arabe Calligraphic Engine by Decotype dans les années 1980 et utilisé pour générer tous les exemples arabes dans les éditions imprimées de la norme Unicode), qui est devenue la preuve de concept pour OpenType (par Adobe et Microsoft), Graphite (par SIL International ), ou AAT (par Apple).

Lire plus loin dans le AAT (Apple Advanced Typography) Article, révèle les informations suivantes. Je recommande de lire l'intégralité de l'article.

AAT et OpenType dans Mac OS X

En ce qui concerne le léopard Mac OS X 10.5, une prise en charge partielle pour OpenType est disponible. Le soutien est actuellement limité aux scripts occidentaux et à l'arabe (à partir de 2011). Si une police a des tables AAT, elle sera utilisée pour la typographie. Si la police n'a pas de tables AAT mais dispose de tables OpenType, elle sera utilisée dans la mesure où le système les prend en charge.

Cela signifie que de nombreuses polices d'OpenType pour les scripts occidentales ou du Moyen-Orient peuvent être utilisées sans modification sur Mac OS X 10.5, mais les scripts sud-asiatiques tels que Thai et Devanagari ne le peuvent pas. Ceux-ci nécessitent des tables AAT pour une disposition appropriée.

Et plus tard dans la section sur la disposition des polices:

Puisque AAT fonctionne entièrement avec des glyphes et jamais avec des personnages, Toutes les informations de mise en page nécessaires à la production de l'affichage approprié résident dans la police elle-même. Cela permet d'ajouter des polices pour de nouveaux scripts sans nécessiter de support spécifique du système d'exploitation.

Enfin:

AAT pour les scripts indic

Pour les scripts indic, les seules caractéristiques nécessaires sont la réorganisation et la substitution des glyphes. L'AAT prend en charge les deux. Comme indiqué ci-dessus, les polices OpenType pour les scripts indic exigent que les tables AAT soient ajoutées avant qu'elles ne fonctionnent correctement sur Mac OS X. Notez cependant que cela s'applique uniquement au logiciel dépend de la prise en charge du système d'OpenType. Les programmes qui fournissent leur propre implémentation d'OpenType rendront correctement les polices OpenType. (Ils peuvent cependant ne pas rendre correctement les polices Indic avec des tables AAT.)

Mac OS X 10.5 expédiés avec des polices pour Devanagari, Gurmukhi, Gujarati, Thaï, Tibétain et Tamoul. Les polices pour d'autres scripts indic sont disponibles auprès de tiers.

Vous devez peut-être choisir une police qui prend explicitement en charge Devanagari.

J'ai exactement le même problème avec un projet sur lequel je travaille avec le script Gurmukhi. J'ai maintenant essayé les deux polices avec des tables AAT qui viennent des paquets avec Mac OS X (Gurmukhi MT, Gurmukhi MN) et des polices avec des tables OpenType. Aucun des deux ne fonctionne en Java sur Mac OS X, mais les polices OpenType sont légèrement plus lisibles. Le seul problème est que le personnage "Halant" ne rend pas les demi-formes de personnages comme il devrait.

Je pense que le problème est avec les polices que nous utilisons et leur compatibilité avec Java sur Mac OS X.

J'ai fait face au même problème quand j'ai essayé http://jambula.sourceforge.net sur Mac pour la langue tamoule.

La solution de contournement que j'ai proposée était d'utiliser Font.CreateFont pour charger une police explicite.

Vous pouvez voir un programme de test à: TestRendering.java

java org.jambula.image.TestRendering text.png

rend le texte tamoul incorrectement dans le texte.png

Cependant

java org.jambula.image.TestRendering text.png "/Library/Fonts/Arial Unicode.ttf"

le rend correctement.

Cela pourrait être dû à https://bugs.openjdk.java.net/browse/jdk-7162125.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top