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 :

SDL_ttf n'affiche pas mon texte -> rectangle Blanc


Sujet :

SDL

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut SDL_ttf n'affiche pas mon texte -> rectangle Blanc
    Au secours, braves gens...
    Je m'efforce d'utiliser SDL_ttf, mais sans grand succès...

    Lorsque je créé une texture avec une instruction du type TTF_RenderText_Shaded ou Solid, etc... Je n'obtiens qu'une texture pleine de vide... -_-'
    Un joli rectangle blanc...

    Est-ce que ça pourrait venir d'un mauvais linkage ? (en particulier de FreeType ?)
    D'où est-ce que ça pourrait venir d'autre ?

    Jutilise OpenGL et des quads texturés pour mon affichage.
    Je programme sous VC++ .net 2003

    Par acquis de conscience, j'ai essayé de créer une autre SDL_Surface remplie d'une couleur unie et de les blitter, mais sans succès...

    Tout aide ou tout indice serait le bienvenue !
    Merci beaucoup et A++

    Peterson

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Sans le code qui montre le problème (et réduit au minimum) ce sera difficile d'aider.

    Par acquis de conscience, j'ai essayé de créer une autre SDL_Surface remplie d'une couleur unie et de les blitter, mais sans succès...
    Tu obtenais quoi?

    Jc

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    La même chose : un rectangle blanc...

  4. #4
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Voilà un bout d'code :
    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
    40
    41
     
    	TTF_Font * m_font;
    	assert(font = TTF_OpenFont("./font/lsans.ttf",16));
    	SDL_Color m_fg = {0,0,0};
    	m_text = "Hello world\0";
     
    SDL_Surface * resource = TTF_RenderText_Solid(m_font, m_text, m_fg);
    	assert(resource);
     
    	SDL_Surface * bg = SDL_CreateRGBSurface(SDL_HWSURFACE, resource->w, resource->h, 32,0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000);
    	assert(bg);
     
    	SDL_Rect rect;
    	rect.x = 0;
    	rect.y = 0;
    	rect.w = resource->w;
    	rect.h = resource->h;
    	if(SDL_BlitSurface(bg,&rect,resource,&rect)!=0)
    	{
    		printf("ERREUR de blit\n");
    		getchar();
    	}
     
    	// gets a unique texture id
    	m_texture_iterator ++;
    	m_texture_id = m_texture_iterator;
    	//m_texture_iterator tient le compte des id de texture déjà affectées.
     
    	// initializes the texture
    	glBindTexture(GL_TEXTURE_2D, m_texture_id);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     
     
    	// gets the pixel data from the SDL_Surface
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, resource->w, resource->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, resource->pixels);
     
    	// releases the SDL_Surface, as it isn't useful anymore
    	SDL_FreeSurface(resource);
    Mais quand j'affiche un quad avec la texture référencée par l'ID de texture obtenu... Blanc...

    (Merci pour la réponse rapide)

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Je pense qu'il y a un problème de compréhension dans ce que tu fais...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	TTF_Font * m_font;
    	assert(font = TTF_OpenFont("./font/lsans.ttf",16))
    	SDL_Color m_fg = {0,0,0};
    	m_text = "Hello world\0";
     
            SDL_Surface * resource = TTF_RenderText_Solid(m_font, m_text, m_fg);
    	assert(resource);
    Jusque là tout va bien à part mélanger des instructions et des déclarations (et oui, même si c'est autorisé, je préfére l'éviter lorsque ce n'est pas justifé...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	SDL_Surface * bg = SDL_CreateRGBSurface(SDL_HWSURFACE, 
               resource->w, resource->h, 32,0x000000FF, 0x0000FF00, 0x00FF0000,
               0xFF000000);
    	assert(bg);
    Pas d'accord, si tu crées une surface à 32 bits alors chaque canal utilise que 8 bits donc cet appel devrait plutôt être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	SDL_Surface * bg = SDL_CreateRGBSurface(SDL_HWSURFACE, 
                    resource->w, resource->h, 32,0xFF, 0xFF, 0xFF,0xFF);
    Cette erreur explique que tu obtenais des carrés blancs...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	SDL_Rect rect;
    	rect.x = 0;
    	rect.y = 0;
    	rect.w = resource->w;
    	rect.h = resource->h;
    	assert(SDL_BlitSurface(bg,&rect,resource,&rect)!=0)
    Utiliser un assert comme cela est pas conseillé, cela rend la lecture plus lourde (avis personnel). Mais cela ne m'étonne pas énormément que t'as un problème, tu blit sur la ressource créées par TTF_RenderText_Solid donc c'est logique que tu n'aies plus rien que du blanc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	// gets a unique texture id
    	m_texture_iterator ++;
    	m_texture_id = m_texture_iterator;
    	//m_texture_iterator tient le compte des id de texture déjà affectées.
    Sauf grande raison et grande expérience c'est déconseillé de le gérer soi-même, il vaut mieux utiliser glGenTextures.


    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
     
    	// initializes the texture
    	glBindTexture(GL_TEXTURE_2D, m_texture_id);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     
     
    	// gets the pixel data from the SDL_Surface
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, resource->w, resource->h,
                  0, GL_RGBA, GL_UNSIGNED_BYTE, resource->pixels);
     
    	// releases the SDL_Surface, as it isn't useful anymore
    	SDL_FreeSurface(resource);
    rien à dire

    (Merci pour la réponse rapide)
    De rien, comme quoi avec un code concis, on trouve des choses à dire

    Jc

  6. #6
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Hey, il y a un mieux ^^

    En changeant ma gestion d'ID de texture un peu bancale et les 0x000000FF en 0XFF, j'obtiens maintenant un rectangle... Noir ^^
    J'ai changé la couleur d'écriture pour voir si ça changeait quelque chose, mais non...

    Désolé pour l'assert et les déclarations un peu embrouillées... l'assert est même faux >_<
    Les copier/coller de codes... ;-)

    J'avoue que je ne comprends pas trop la signification des 0xFF... C'est la valeur par défaut de la couleur dans ma nouvelle surface ?

    J'ai essayé de bliter dans l'autre sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    	if(SDL_BlitSurface(resource,&rect,bg,&rect)!=0)
    	{
    		printf("ERREUR de blit\n");
    		getchar();
    	}
    (en affichant le bon...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, resource->w, resource->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, bg->pixels);
    mais rien n'y fait...

    (noir, c'est noir...)

    (re-merci pour le coup de main )


    Après 2-3 testes, il semblerait que ce soit ma gestion d'ID de textures qui merdoit...

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Darn...

    Bon, après vérification et correction de mes ID de textures... Retour à la case départ...
    Le retour de la vengence du rectangle blanc...

    Bon, j'ai peut-être un élément de réponse, toutefois :

    Aide sur le wiki de SDL pour "SDL_BlitSurface" :
    "Like most surface manipulation functions in SDL, it should not be used together with OpenGL."

    Oups...
    Est-ce que ça signifierait que je ne peux pas utiliser à la fois SDL_ttf et OpenGL ?
    Ou simplement que l'utilisation de bliting n'était pas une bonne idée ?

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bon, j'étais visiblement un peu fatigué...

    Pour la création de la surface, tu avais presque raison et j'avais entièrement tort

    Pour être entièrement portable, il faut faire attention au Big/Little Endian...

    Donc il faudrait faire comme ceci :
    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
     
     
        Uint32 rmask, gmask, bmask, amask;
     
    /*Vu qu'on est en 32bit, l'Endian est important...*/
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
        rmask = 0xff000000;
        gmask = 0x00ff0000;
        bmask = 0x0000ff00;
        amask = 0x000000ff;
    #else
        rmask = 0x000000ff;
        gmask = 0x0000ff00;
        bmask = 0x00ff0000;
        amask = 0xff000000;
    #endif
        SDL_Surface *bg =  SDL_CreateRGBSurface(SDL_HWSURFACE,
                        ecran->w, ecran->h, 32, rmask, gmask, bmask, amask);
    Les masques définis servent pour dire à SDL où se trouve chaque couleur. Vu qu'on veut un code portable, il faut faire attention à comment sont codés les entiers. Voir un cours sur le Big/Little Endian pour vraiment bien comprendre les implications de ce bout de code.


    Ensuite pour la couleur que tu souhaites avoir, il faut utiliser SDL_FillRect (et j'ai honte d'avoir oublié de le mentionner), donc pour l'utiliser il faut faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        SDL_FillRect(Fond,  NULL,SDL_MapRGBA(Fond->format, 0, 0, 255, 255));
    Pourquoi utiliser SDL_MapRGBA? Voir la FAQ sur SDL_MapRGB. http://jeux.developpez.net/faq/sdl/

    Enfin, pour avoir une couleur de fond (comme je suppose que tu veux), blitter cette surface sur ton texte ne pourras pas fonctionner puisque tu vas écraser le texte créer par la fonction ttf.

    Dans l'autre sens, cela ne peut pas fonctionner non plus vu que tu écrase la couleur de fond avec celle choisi par la fonction ttf.

    Il faut utiliser la fonction TTF_RenderText_Blended, voir l'exemple ici :
    http://jcatki.no-ip.org/SDL_ttf/SDL_ttf_44.html#SEC44

    Jc

  9. #9
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Peterson
    Aide sur le wiki de SDL pour "SDL_BlitSurface" :
    "Like most surface manipulation functions in SDL, it should not be used together with OpenGL."

    Oups...
    Est-ce que ça signifierait que je ne peux pas utiliser à la fois SDL_ttf et OpenGL ?
    Ou simplement que l'utilisation de bliting n'était pas une bonne idée ?
    Non, tu peux faire du blitting sur une surface autre que l'écran rendu par la fonction SDL_SetVideoMode, cela ne devrait pas perturbé OpenGL.

    Jc

  10. #10
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Encore merci, c'est super sympa de m'aider !

    Malheureusement... C'est pas encore gagné ! >_<

    Bon, alors j'ai apporté les différentes corrections à mon code... Mais le rectangle reste blanc...
    Pour en avoir le cœur net, j'ai arrêté le bliting et essayé d'affiché le rectangle ainsi rempli d'une couleur bleue si je ne m'abuse... Ben il apparaît blanc...
    J'ai du faire une erreur ailleurs -_-

    Mon code d'affichage est un peu indigeste, c'est pour ça que je ne l'avais pas mis... D'autant qu'il fonctionne avec des Surfaces chargées à partir d'une image (IMG_Load). À tout hasard, le voilà :
    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
    40
    41
    42
    43
    44
    45
    46
     
    		glEnable(GL_TEXTURE_2D);
     
    		glEnable(GL_ALPHA_TEST);
    		glAlphaFunc(GL_GREATER, 0);
     
    		glEnable(GL_BLEND);
    		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     
    		// sets the opacity with the alpha channel of glColor4f
    		float opacity = m_graphic_properties.getOpacity() * m_owner->getGraphicProperties().getOpacity();
    		glColor4f(1, 1, 1, opacity);
     
    		// binds the texture to apply
    		glBindTexture(GL_TEXTURE_2D, m_texture_id);
     
    		// draws a quad and apply the texture to it
    		glBegin(GL_QUADS);
     
    		Position pos = m_graphic_properties.getPosition() - m_graphic_properties.getReferencePoint();
    		glTexCoord2f(m_offset.getX(), m_offset.getY() + m_height_rate);
    		glVertex3f(m_graphic_properties.getReferencePoint().getX()*-1,
    				   m_graphic_properties.getReferencePoint().getY()*-1,
    				   m_graphic_properties.getDepth());
     
    		glTexCoord2f(m_offset.getX() + m_width_rate, m_offset.getY() + m_height_rate);
    		glVertex3f(m_graphic_properties.getReferencePoint().getX()*-1 + m_width,
    				   m_graphic_properties.getReferencePoint().getY()*-1,
    				   m_graphic_properties.getDepth());
     
    		glTexCoord2f(m_offset.getX() + m_width_rate, m_offset.getY());
    		glVertex3f(m_graphic_properties.getReferencePoint().getX()*-1 + m_width,
    				   m_graphic_properties.getReferencePoint().getY()*-1 + m_height,
    				   m_graphic_properties.getDepth());
     
    		glTexCoord2f(m_offset.getX() + xFlip, m_offset.getY());
    		glVertex3f(m_graphic_properties.getReferencePoint().getX()*-1,
    				   m_graphic_properties.getReferencePoint().getY()*-1 + m_height,
    				   m_graphic_properties.getDepth());
     
    		glEnd();
     
    		// disables OpenGL modules
    		glDisable(GL_BLEND);
    		glDisable(GL_ALPHA_TEST);
    		glDisable(GL_TEXTURE_2D);

  11. #11
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Peterson
    Bon, alors j'ai apporté les différentes corrections à mon code... Mais le rectangle reste blanc...
    Montre le code que tu utilises maintenant pour créer ta texture.

    Jc

  12. #12
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    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
     
    	Uint32 rmask, gmask, bmask, amask;
    	/*Vu qu'on est en 32bit, l'Endian est important...*/
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
    	rmask = 0xff000000;
    	gmask = 0x00ff0000;
    	bmask = 0x0000ff00;
    	amask = 0x000000ff;
    #else
    	rmask = 0x000000ff;
    	gmask = 0x0000ff00;
    	bmask = 0x00ff0000;
    	amask = 0xff000000;
    #endif
     
    	SDL_Surface * bg = SDL_CreateRGBSurface(SDL_HWSURFACE, 200, 50, 32,rmask, gmask, bmask, amask);
    	assert(bg);
     
    	SDL_FillRect(bg,  NULL,SDL_MapRGBA(bg->format, 0, 0, 255, 255));
     
     
    	glGenTextures(1,(GLuint*)&m_texture_id);
     
    	// initializes the texture
    	glBindTexture(GL_TEXTURE_2D, m_texture_id);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     
     
    	// gets the pixel data from the SDL_Surface
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 200, 50, 0, GL_RGBA, GL_UNSIGNED_BYTE, bg->pixels);

  13. #13
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Aaaarrghh !
    Une idée vient de me heurter...
    Vu que je colle ensuite mes textures dans OpenGL... Il faudrait probablement qu'elles aient une dimention en puissance de deux, non ?

    C'est p't'être ben ça l'problème...

    [Edit]
    -_-' ça marche beaucoup mieux...

  14. #14
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    C'était donc bien ça le problème...
    Un incommensurable merci à Fearyourself pour son aide inestimable ! :bow: (Zut, ce smiley y est pas... Ça fait défaut)

    Le problème est résolu ! Nickel ^^ Par contre, on est obligé de passer par du bliting. Comme je ne voulais pas de fond, je le fais sur une surface transparente (et bleue acessoirement, mais ça s'voit pas...)
    Bref, mon code ressemble maintenant à ça :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    	SDL_Surface * resource = TTF_RenderText_Solid(m_font, m_text, m_fg);
    	assert(resource);
     
    	int n_w = 1;
    	while(n_w<resource->w)
    		n_w*=2;
     
    	int n_h = 1;
    	while(n_h<resource->h)
    		n_h*=2;
     
    	Uint32 rmask, gmask, bmask, amask;
    	/*Vu qu'on est en 32bit, l'Endian est important...*/
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
    	rmask = 0xff000000;
    	gmask = 0x00ff0000;
    	bmask = 0x0000ff00;
    	amask = 0x000000ff;
    #else
    	rmask = 0x000000ff;
    	gmask = 0x0000ff00;
    	bmask = 0x00ff0000;
    	amask = 0xff000000;
    #endif
     
    	SDL_Surface * bg = SDL_CreateRGBSurface(SDL_HWSURFACE, n_w, n_h, 32,rmask, gmask, bmask, amask);
    	assert(bg);
     
    	SDL_FillRect(bg,  NULL,SDL_MapRGBA(bg->format, 0, 0, 255, 0));
     
    	SDL_Rect rect_text;
    	rect_text.x = 0;
    	rect_text.y = 0;
    	rect_text.w = resource->w;
    	rect_text.h = resource->h;
     
    	SDL_Rect rect_bg;
    	rect_bg.x = 0;
    	rect_bg.y = 0;
    	rect_bg.w = n_w;
    	rect_bg.h = n_h;
     
    	if(SDL_BlitSurface(resource,&rect_text,bg,&rect_bg)!=0)
    	{
    		printf("ERREUR de blit\n");
    		getchar();
    	}
     
    	glGenTextures(1,(GLuint*)&m_texture_id);
     
    	// initializes the texture
    	glBindTexture(GL_TEXTURE_2D, m_texture_id);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     
     
    	// gets the pixel data from the SDL_Surface
    	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, n_w, n_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, bg->pixels);
     
     
    	// releases the SDL_Surface, as it isn't useful anymore
    	SDL_FreeSurface(resource);
    	SDL_FreeSurface(bg);
    C'est p't'être pas super joli, ma manière de calculer la dimension de la surface de fond...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	int n_w = 1;
    	while(n_w<resource->w)
    		n_w*=2;
    Si vous avez une meilleur idée... ^^

  15. #15
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Effectivement, j'aurais du penser au problème de la taille de l'image.

    Par contre, je ne vois pas en quoi ton blit aide. Es-tu sûr que tu en as vraiment besoin? A part te donner une surface rgba par rapport au rgb de la fonction ttf je ne vois pas vraiment.

    T'es sûr que tu ne peux pas te simplifier la vie avec :

    TTF_RenderText_Blended?

    Jc

  16. #16
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Hé bien, il faut en fait que je redimentionne ma surface pour qu'elle colle aux dimentions requises...
    Or, TTF_RenderText_Whatever me renvoit une surface qui fait juste la taille du texte.
    Il faut donc que je redimentionne cette surface pour quelle colle à une taille en puissance de deux.

    J'utilise pour ça le bliting parce que je n'ai... Heu... Pas réfléchis à une autre solution ^_^"
    Peut-être que "SDL_SetClipRect" me permettrait de le faire plus simplement ^^ Mais il me faut aussi de RGBA, donc ça me semble le plus simple... (?)

    Merci encore pour ton aide :-)
    A++

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

Discussions similaires

  1. afficher dans mon text box en vb.net
    Par debutant00 dans le forum VB.NET
    Réponses: 23
    Dernier message: 12/06/2009, 16h20
  2. [A-07] MsgBox n'affiche pas le texte
    Par tAKAmAkA dans le forum IHM
    Réponses: 5
    Dernier message: 03/03/2009, 18h44
  3. IE n'affiche pas mon menu en position absolue apres un back-1
    Par gunth dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 22/11/2007, 10h42
  4. Firefox et ie n'affiche pas mon tableau de la même manière.
    Par poly128 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 17/10/2007, 15h27
  5. IE ne m'affiche pas du texte
    Par barok dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 16/05/2006, 00h01

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