IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

cairo_show_text(), FreeType, T1lib et la police Symbol


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    Par défaut cairo_show_text(), FreeType, T1lib et la police Symbol
    Bonjour,

    Voici un problème que mes faibles connaissances en la matière ne me permettent pas de résoudre.

    Grace et GraceGTK utilisent la bibliothèque T1lib pour transformer des polices de caractères en glyphes tracés sur le dessin sous forme de bitmaps.

    J'essaye de moderniser GraceGTK et d'utiliser la fonction cairo_show_text(), ce qui implique l'emploi de FreeType2 au lieu de T1lib, mais je souhaite garder les mêmes fichiers de définition des polices.

    Le schéma est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     FT_Face ft_face;
      error = FT_New_Face (library ,"s050000l.pfb" ,0 ,&ft_face);
    ...
      cairo_font_face_t *cr_face;
      cr_face  = cairo_ft_font_face_create_for_ft_face (*ft_face ,CAIRO_HINT_METRICS_DEFAULT);
      cairo_set_font_face (cr ,cr_face);
    ...
       cairo_show_text (cr ,"the_string");
    Cela se passe en général correctement sauf pour certaines polices comme par exemple Symbol (fichier joins s050000l.pfb).

    Quand on regarde le contenu de ce fichier on voit par exemple la ligne

    dans ce qui ressemble fort au vecteur d'encodage décrit dans la doc de T1lib.

    Avec T1lib le caractère a (ASCII 97) est bien dessiné comme attendu: la lettre grecque alpha.
    Ce n'est pas le cas avec cairo_show_text(): rien de visible n'est affiché.

    En poussant plus avant, j'ai constaté que ft_face->num_charmaps == 2, donc qu'il existe deux cartes, la première étant Unicode comme indiqué dans la doc de FT_CharMap.

    J'ai donc rajouté une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FT_Select_Charmap (ft_face ,FT_ENCODING_ADOBE_CUSTOM)
    et vérifié que cette deuxième carte est bien celle sélectionnée par FreeType,
    mais les caractères ne sont toujours pas dessinés comme souhaités.

    On voit que:
    printf ("Char_Index = %d\n" ,FT_Get_Char_Index (*ft_face ,97));
    => imprime 65 (= 97 - 32), ce qi ne correspond pas au /alpha de la carte de la T1lib.

    Remarque: les autres FT_ENCODING_ADOBE_xxx donnent des erreurs.

    Remarque: je ne souhaite pas utiliser Pango car Grace utilise son propre système de séquences d'échappement pour faire des indice, exposants,... et que je veux maintenir une compatibilité ascendante.

    Je joins un petit programme de démonstration avec 2 polices (Roman et Symbol).

    Toute aide sera la bienvenue.
    Fichiers attachés Fichiers attachés
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

  2. #2
    Membre confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    Par défaut Correctif
    Le fichier Makefile a été corrompu lors de la confection du fichier attaché ci-dessus. Je post donc un exemple de Makefile utilisable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    PROGRAM       = a.out
     
     
    CC=gcc
     
    CFLAGS =-g -Wall `pkg-config --cflags  gtk+-3.0` -I/usr/include/freetype2
    LIBS = `pkg-config --libs gtk+-3.0` -lfreetype -lm
     
    SRCS = main.c
     
    OBJS = main.o
     
    ####################################################
     
    all:		$(PROGRAM)
     
    $(PROGRAM):     $(OBJS)
    		@echo "Linking $(PROGRAM) ..."
    		$(CC) -o $(PROGRAM)  $(LDFLAGS) $(OBJS) $(LIBS)
    		@echo "done"
     
     
    clean:
    	/bin/rm -f *.o *~ core
     
    propre:
    	rm -f *~  *.o core TAGS $(PROGRAM)
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

  3. #3
    Membre confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    Par défaut FontForge et g_convert()
    J'ai posée ma question sur la liste de diffusion de Cairo sans plus de succès qu'ici, donc je me suis orienté vers une autre méthode: modifier la police utilisée.

    Le codage de la police initiale est d'abord forcé au format ISO-8859-1 en utilisant FontForge, ce qui permet d'obtenir l'affichage de la partie basse (code < 128) sans problème.

    Dans Grace, la chaîne de la partie haute (128 < code < 256) est obtenue en translatant la chaîne de test de la partie basse. Pour obtenir un affichage correspondant à celui obtenu avec la T1lib, il faut convertir la chaîne en UTF-8 avec g_convert().
    Je joins le programme de test amendé.

    Je pense que ça marche car cairo_show_text() travaille alors en UTF-8, mais je suis loin de bien comprendre toutes les subtilités de ces histoires d'encodage.
    Fichiers attachés Fichiers attachés
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Je n'ai pas de réponse à ton problème, mais voici un post qui parle des évolutions de la stack de gestion des fontes via Pango, et qui pourrait t'intéresser tout de même:
    https://blogs.gnome.org/mclasen/2019...re-directions/

    Le passage "stop using freetype" peut éventuellement t'intéresser ?
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  5. #5
    Membre confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    Par défaut
    Excusez-moi pour ma réponse tardive.

    Merci pour le lien.
    Cela me conforte dans l'idée de continuer à inclure dans la distribution de GraceGTK une version de la T1lib qui n'est pas bien encombrante: au moins ces polices continuerons de fonctionner quoiqu'il arrive
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Macro police et symbole
    Par lovely2604 dans le forum Word
    Réponses: 2
    Dernier message: 12/12/2014, 09h01
  2. Réponses: 2
    Dernier message: 30/09/2014, 08h59
  3. [XL-2003] Associer des symboles à une police
    Par Silencee dans le forum Conception
    Réponses: 4
    Dernier message: 22/03/2013, 11h53
  4. police symbol dans RichEdit
    Par GerardJ dans le forum Débuter
    Réponses: 5
    Dernier message: 28/03/2009, 17h13
  5. Adresse des polices de caractères dans la RAM video ?
    Par Anonymous dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 27/05/2002, 17h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo