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

C Discussion :

Chargement police avec SDL_TTF


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut Chargement police avec SDL_TTF
    Bonjour,

    Je travaille avec CODE:BLOCKS sur W7, je charge une police avec le nom complet du fichier :

    police = TTF_OpenFont(f_name, 14);

    Lorsque je lance le debug sur CB (icone triangle rouge) cela fonctionne
    mais lorsque je fais un Run (icone triangle vert), la police ne se charge pas et le programme plante.

    J'ai fait un printf du nom de fichier pour vérifier,
    en Run j'obtient :
    Chemin police : F:\Mes documents\Développement\Langage C\Projets\MasterMind2\arial.ttf
    et en debug :
    Chemin police : F:\MESDOC~1\DVELOP~1\LANGAG~1\Projets\MASTER~1\arial.ttf

    L'éxécutable lancé indépendamment hors de CODE:BLOCKS ne fonctionne pas non plus sur mon PC,
    mais, chose curieuse, cela fonctionne sur un autre PC w7 et sur un autre PC w8.

    Sur mon PC le disque est partitionné ( C Programmes et F: Data) alors que sur 2 les autres non.
    Je ne sais pas si cela peut-être l'explication?

    Je vous remercie pour toute aide pour m'aider à comprendre ce qui se passe.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Ce "chemin police" c'est quoi, est-ce que c'est f_name?
    Comment l'obtiens-tu?

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut Chemin avec caractère accentué
    Bonjour Médinoc,

    Oui, le chemin police est le nom complet du fichier = f_name
    Je l'obtiens en récupérant le répertoire courant suivant le code ci-dessous.
    (l'éxécutable et la police sont dans le même dossier du programme)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Récupération du répertoire courant
    DWORD dwRet;
    dwRet = GetCurrentDirectory(MAX_PATH, repertoire);
    printf("Répertoire du programme = %s \n",repertoire);
     
    // Nom complet du fichier de la police
    char f_name[MAX_PATH]="";
    strcat(f_name,repertoire);
    strcat(f_name, "\\arial.ttf");
    printf("Chemin police : %s \n", f_name);
     
    // Chargement police
    police = TTF_OpenFont(f_name, 14);
    J'ai trouvé pourquoi cela marche sur certains PC et pas sur d'autres:
    Ce n'est pas lié au PC mais à l'emplacement du dossier du programme,
    lorsque le chemin du dossier comprend un caractère accentué cela ne marche pas.

    Dans le cas présent, je peux contourner le problème en appelant la police en relatif:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    police = TTF_OpenFont("arial.ttf", 14);
    Cela fonctionne.

    Cependant j'aimerais savoir comment faire pour un chemin avec un caractère accentué pour, dans d'autres applications, accéder au chemin absolu ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    En fait j'ai surtout l'impression que ça foire en Debug parce que Code::Blocks règle le répertoire courant sur un chemin de type "8.3" au lieu d'un chemin normal.
    Les caractères accentués eux-mêmes ne devraient pas poser problème tant qu'il s'agit de caractères pris en charge par l'encodage Windows-1252 (pour les caractères non-Windows-1252 (comme des caractères arabes, japonais etc.) il faudrait utiliser les fonctions basées sur des "caractères larges" mais la bibliothèque SDL TTF ne semble pas compatible avec ça).

    Essaie en remplaçant strcat(f_name,repertoire); par GetLongPathName(repertoire, f_name, MAX_PATH);.

    Edit: Ah, je vois le problème: TTF_OpenFont est basé sur TTF_OpenFontIndex qui est basé sur TTF_OpenFontIndexRW qui est basé sur https://wiki.libsdl.org/SDL_RWFromFile, qui attend un chemin encodé en UTF-8, et non en Windows-1252.

    Donc, il faudrait plutôt un truc du genre:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Note: Je n'ai pas inclus la gestion d'erreur
    wchar_t repertoire[MAX_PATH];
    GetCurrentDirectoryW(repertoire, MAX_PATH);
    wprintf(L"Repertoire: %ls\n", repertoire);
     
    wchar_t chemin[MAX_PATH];
    GetLongPathNameW(repertoire, chemin, MAX_PATH);
    wcscat(chemin, L"\\arial.ttf"); //Note: Pour bien faire il faudrait s'assurer qu'il y a la place
    char f_name[MAX_PATH];
    WideCharToMultiByte(CP_UTF8, 0, chemin, -1, f_name, MAX_PATH, NULL, NULL);
    printf("Chemin police: %s\n", f_name);
     
    police = TTF_OpenFont(f_name, 14);

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Bonjour,

    Merci pour la réponse mais j'ai une référence indéfinie avec "GetLongPathNameW".
    J'ai cherché un peu, j'ai rajouté dans le linker libkernel32.a et libpsapi.a mais sans succès ...

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    As-tu une version récente de MinGW? parce que cette fonction est supportée par kernel32.dll depuis au moins Windows XP...

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Points : 321
    Points
    321
    Par défaut
    Je viens de réinstaller un W7 sur mon PC (c'est après que j'ai vu que mes programmes avec SDL_TTF posaient ce problème) et de réinstaller CODE:BLOCKS (17.12mingw).

Discussions similaires

  1. chargement police avec cufòn
    Par mzwygart dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/12/2010, 09h58
  2. problème chargement de police avec pango
    Par WicloW dans le forum GTK+
    Réponses: 0
    Dernier message: 21/08/2009, 10h37
  3. problème de police avec un recordset
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 18/04/2006, 13h33
  4. Changer la police avec un select, sans recharger la page
    Par Netoman dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 30/12/2004, 18h07

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