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

SDL Discussion :

TTF_SetFontOutline + TTF_Render = comportement aléatoire ?


Sujet :

SDL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut TTF_SetFontOutline + TTF_Render = comportement aléatoire ?
    Bonjour, j'ai un soucis bien particulier avec SDL ttf, je cherche à blitter une même ligne de texte en plusieurs couleur avec un contour tout ça sur une seule surface. J'ai donc bricolé ce code et ensuite ma fonction de rendu s'occupe de l'animation mais voilà le resultat
    Nom : 846746bug.gif
Affichages : 128
Taille : 20,5 Ko
    un autre exemple avec la surface affichée en entière(les B ont disparus)
    Nom : 157195Sanstitre.png
Affichages : 255
Taille : 1,7 Ko

    La couleur blanche c'est le premier passage dans la boucle ensuite bleu et les autres ne s'affichent même pas, le comportement est aléatoire, parfois les autres couleurs s'affichent avec des lettres en moins soit elles ne s'affichent pas et j'ai le message : text has zero width alors que line ne change pas.

    ça me fait ça seulement si je met TTF_SetFontOuline donc je me doute que cette fonction a un comportement particulier que je ne connais pas. Si quelqu'un pouvais m'aider j'en serais reconnaissant, merci d'avance.

    ps: je précise que ça ne vient pas de l'animation, si j'affiche sfTarget on voit la même chose.
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
      SDL_Surface* sfTarget = RGBA_Surface(width,height);
      for(int i=0;i<font->colors.size();i++) // on blite le texte pour chaque couleur sur sfTarget
        {
          int vPos = 0;
          SDL_Surface* sf = TTF_RenderUNICODE_Solid(font->font,line,
    						font->colors[i]); 
          if(font->outlineSize>0)
    	{
    	  TTF_SetFontOutline(font->font,font->outlineSize);
    	  SDL_Surface* outlineSf = TTF_RenderUNICODE_Solid(font->font,line,
    							   font->outlineColors[i]);
    	  if(outlineSf)
    	    {
    	      vPos = outlineSf->h * i;
    	      SDL_Rect dstRct = {0,vPos,0,0};
    	      SDL_BlitSurface(outlineSf,NULL,sfTarget,&dstRct);
    	      SDL_FreeSurface(outlineSf);
    	    }
    	  else
    	    {
    	      //Print_UNICODE(line);
    	      std::cout << TTF_GetError() << std::endl;
    	    }
        	  TTF_SetFontOutline(font->font,0);
    	}
          if(sf)
    	{
    	  if(!font->outlineSize)
    	      vPos = sf->h * i;
    	  SDL_Rect dstRct = {font->outlineSize,vPos+font->outlineSize,0,0};
    	  SDL_BlitSurface(sf,NULL,sfTarget,&dstRct);
    	  SDL_FreeSurface(sf);
    	}
          else
    	{
    	  //Print_UNICODE(line);
    	  std::cout << TTF_GetError() << std::endl;
    	}
        }

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Au début je n'ai pas compris pourquoi il ya 2 BlitSurrface (et donc 2 TTF).
    Mais j'imagine que c'est pour avoir les 2 couleur pour le texte ?
    Juste pour t'informer normalement pour faire cet effet on ne fait pas comme ça , on utilise un bitmap font et on change les couleurs (ou plutôt la palette).

    A la première lecture je vois rien d'anormal , mais tu devrait tenter de debugger pour voir le probleme (je parle pas ici forcément on utilisant un debuggeur) mais :
    -afficher qu'une lettre ici 'B'
    -puis mettre la lettre superposé
    Si ça marche rajouter les lettre suivante pour voir ou ça coince
    Si ça ne marche pas , alors enlever /rajouter du code pour faire différents test
    ect ect

    (Je n'utilise plus TTF depuis des lustres a vrai dire).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut
    oui les 2 blit servent à mettre le contour puis le texte sur sfTarget il font comme ça dans la doc. Sinon oui je vais continuer mes test.

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par aperdemak Voir le message
    il font comme ça dans la doc.
    Doc de la SDL2 ? je trouve cela étonnant.

    Enfin après moi je te dis comment font les pro a toi de voir pour la suite

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut
    de la doc j'en parle pour le contour du texte pas pour le changement de couleur, J'ai pas encore trouvé mieux pour changer la couleur du texte, sachant que je peux plus toucher aux pixels après la génération de la texture, ou alors faire du software rendering et changer la palette oui ^^ ou encore mieux avec un shader mais pour 2-3 couleurs j'ai pas trops envie de m'embêter

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut
    Bonjour j'ai réduit le code, voici le nouveau, celui ci a le même problème et get error me donne toujours "text has zero size"

    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
     SDL_Surface* targetSf = RGBA_Surface(rct.w,rct.h);
     
      TTF_SetFontOutline(font,outlineSize);
      SDL_Surface* olSf=TTF_RenderUNICODE_Solid(font,line,outlineColor);
      if(!olSf)
    	std::cout << TTF_GetError() << std::endl;
      SDL_Rect olRctDst = {0,0,0,0};
      SDL_BlitSurface(olSf,NULL,targetSf,&olRctDst);
      SDL_FreeSurface(olSf);
      TTF_SetFontOutline(font,0);
     
      SDL_Surface* sf = TTF_RenderUNICODE_Solid(font,line,color);
      SDL_Rect rctDst = {outlineSize,outlineSize,0,0};
      SDL_BlitSurface(sf,NULL,targetSf,&rctDst);
      SDL_FreeSurface(sf);

  7. #7
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    le truc que j'aurais fait c'est faire un printf de line pour voir sur quel ligne ça bloque.

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/02/2010, 10h43
  2. Comportement (aléatoire?) de send()/recv() ?
    Par grip.inc dans le forum Réseau
    Réponses: 4
    Dernier message: 11/12/2009, 13h56
  3. comportement aléatoire de sort -u
    Par obivatel dans le forum Linux
    Réponses: 1
    Dernier message: 04/09/2009, 18h46
  4. sscanf comportement aléatoire
    Par devdebutantajax dans le forum C++
    Réponses: 4
    Dernier message: 27/11/2008, 18h03
  5. Comportement aléatoire du programme
    Par afrikha dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 12/12/2005, 15h15

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