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_gfx] SDL_gfxprimitives.h -- roundedRectangleRGBA


Sujet :

SDL

  1. #1
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut [SDL_gfx] SDL_gfxprimitives.h -- roundedRectangleRGBA
    Greetings ! Salutations ! Paix sur tous les hommes et femmes de bonne volonté ^^

    Je suis en train de m'arracher les dreadlocks sur ce code qui marche pas (évidemment).

    common.tar

    Ce code utilise les librairies suivantes, à ajouter dans la partie "compiler" de votre IDE (chez moi c'est netbeans 8.1)

    -lrt -lpthread -lSDL_gfx -lSDL_ttf -lSDL_image -lSDL

    ...dans la partie "linker"

    linkedlist.o -D_REENTRANT -I/usr/include/SDL -D_GNU_SOURCE=1

    Ceci en comptant que linkedlist.o est compilé de manière séparée dans un autre répertoire mais j'ai mis le code source et le header dans le .tar au cas où...

    Mes soucis:

    Il faut savoir que ça marchait déjà mieux avec SDL_Draw (librairie SDL_draw-1.2.13) mais que lorsque je travaille en 24 bits ça provoque une erreur de segmentation dès que x1 et y1 sont à une valeur différente de 0, ce qui n'est pas pratique.
    Mais au moins je voyais un rectangle aux coins arrondis en dessous de mon texte ce qui me rendait très heureux...

    Ici, j'ai vu que SDL_gfx permettait la gestion des rectangles aux coins arrondis sans devoir passer par une librairie qu'il fallait ajouter, du coup, hop ! on y va.
    Résultats: rien !
    Et aussi, dès que je mets la profondeur à 24 bits, boum ! Erreur de segmentation, par contre que x1 ou y1 soit égal ou différent de 0 ça passe, ce qui n'était pas le cas avec SDL_draw.

    Ce que j'ai envie de faire: tracer un rectangle aux coins arrondis sur lequel placer du texte.

    Voici la fonction où tout se joue:

    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
    bool DrawWindow(t_CSSMWindow *thisWindow,LinkedList errors,int startx,int starty,SDL_Color foreground,SDL_Color background,SDL_Surface *target)
    {
      // Vérifier si la "fenêtre" est valide...
      if(thisWindow->pSurface)
      {
        SDL_FillRect(thisWindow->pSurface,
                     NULL,
                     SDL_MapRGBA(thisWindow->pSurface->format,background.r,background.g,background.b,SDL_ALPHA_TRANSPARENT));
     
        thisWindow->pSurface->clip_rect.x=startx;
        thisWindow->pSurface->clip_rect.y=starty;
     
    		// N'affiche rien du tout...
     
    		//int roundedRectangleRGBA(SDL_Surface * dst, Sint16 x1, Sint16 y1,
        //            Sint16 x2, Sint16 y2, Sint16 rad, 
        //            Uint8 r, Uint8 g, Uint8 b, Uint8 a);
    		int rc=roundedRectangleRGBA(	thisWindow->pSurface,
    									startx,
    									starty,
    									thisWindow->pSurface->clip_rect.w,
    									thisWindow->pSurface->clip_rect.h,
    									2,
    									foreground.r,
    									foreground.g,
    									foreground.b,
    									SDL_ALPHA_TRANSPARENT);
     
    		// rc toujours égal à 0 (pas d'erreur).
     
    		if(!rc) fprintf(stderr,"[STATUS] Ok...\n"); 
    		else
    		{
    			char *pMessage=malloc(sizeof(XCPTN_001));
    			strcpy(pMessage,XCPTN_001);
    			lc_add((void*)pMessage,&errors,cssmuserdef,sizeof(XCPTN_001));
    			return false;
    		}
     
        SDL_BlitSurface(thisWindow->pSurface,&thisWindow->pSurface->clip_rect,target,NULL);
        SDL_UpdateRect( thisWindow->pSurface,
                        startx,
                        starty,
                        thisWindow->pSurface->clip_rect.w,
                        thisWindow->pSurface->clip_rect.h); // ...mieux que SDL_Flip()...
      }
      else
      {
        char *pMessage=malloc(sizeof(XCPTN_000));
        strcpy(pMessage,XCPTN_000);
        lc_add((void*)pMessage,&errors,cssmuserdef,sizeof(XCPTN_000));
        return false;
      }
    	return true;
    }
    Avec SDL_draw ça marchait, je voyais le rectangle gris en dessous de mon texte, ici rien du tout.
    Dès que DEPTH passe à 24 --> erreur de segmentation
    Avec SDL_draw je devais forcer starx et starty à 0 (mais ça marchait !!).

    Voici dans la fonction main avec l'appel de fonction

    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
     
    if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO|SDL_INIT_TIMER|SDL_INIT_EVENTTHREAD) != 0) 
    	{
    		fprintf(stderr,"Impossible d'initialiser SDL: %s\n", SDL_GetError());
    		exit(0);
    	}
     
    	TTF_Init();
    	atexit(SDL_Quit);
     
    	pVideoMode=SDL_GetVideoInfo();
     
    	if(pVideoMode==NULL)
      {
    	  fprintf(stderr,"\nimpossible d'obtenir les informations...");
    	  exit(0);
    	}
     
    	police = TTF_OpenFont("/usr/share/fonts/truetype/LiberationMono-Bold.ttf", taillepolice);
    	if(police==NULL)
    	{
    	  fprintf(stderr,"\nimpossible d'initialiser la police de caractère...");
    	  exit(0);
    	}
     
      /*
       * Affichage de l'écran principal (fonctionne pas en 24bits)
       */
     
      EcranPrincipal=SDL_SetVideoMode(0,
                                      0,
                                      DEPTH,SDL_HWSURFACE|SDL_DOUBLEBUF); // |SDL_FULLSCREEN);
     
      if(EcranPrincipal==NULL)
      {
        fprintf(stderr,"\nErreur dans SDL_SetVideoMode !!");
        exit(0);
      }
     
      Message=malloc(EcranPrincipal->clip_rect.w/taillepolice);
     
      SDL_FillRect(EcranPrincipal, 
                   NULL, 
                   SDL_MapRGBA(EcranPrincipal->format,122,122,122,SDL_ALPHA_TRANSPARENT));
     
      SDL_EnableUNICODE(1);
     
      t_CSSMWindow *pUneFenetre=(t_CSSMWindow*)malloc(sizeof(t_CSSMWindow));                  // réservation d'une fenêtre en mémoire
      pUneFenetre->CreateMe=CreateWindow;  
      pUneFenetre->CreateMe(pUneFenetre,200,300);
     
      pUneFenetre->DrawMe=DrawWindow;
      pUneFenetre->DrawMe(pUneFenetre,ErrorQueue,3,3,(SDL_Color){62,118,118,0},(SDL_Color){122,122,122,0},EcranPrincipal);
    DrawMe est un pointeur sur la fonction DrawWindow().

    Comme le forum "officiel" SDL ne permet pas de poster de nouveaux topics (allez comprendre...) je reviens à vous ^^

  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
    Pour moi et la doc officiel SDL_SetVideoMode a 4 argument , et tu n'en met que 3.

    EcranPrincipal=SDL_SetVideoMode(0,
    0,
    DEPTH,SDL_HWSURFACE|SDL_DOUBLEBUF);
    D'ailleur avec 0 , 0 t'as quoi comme résolution ? x)
    Sur la doc officiel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);
    exemple utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_SetVideoMode(640,480, 24,SDL_OPENGL);
    Et donc oui chez moi le 24bits par couleur marche parfaitement.

    ensuite je déconseille SDL_gfx , trop lourd a mon gout.

  3. #3
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    EcranPrincipal=SDL_SetVideoMode(0,
    0,
    DEPTH,
    SDL_HWSURFACE|SDL_DOUBLEBUF);
    Le programme se compile... il y a bien quatre paramètres...

    Avec 0,0 j'obtiens la définition "par défaut"

    if width and height are both 0 SDL_SetVideoMode will use the width and height of the current video mode (or the desktop mode, if no mode has been set).

    Si la hauteur et la largeur sont égales à 0, la fonction va utiliser la hauteur et largeur du mode graphique courant (ou de la console si aucun mode n'était défini).

    Peut-être est-ce pour cela qu'en 24bits ça part en vrille, je vais essayer.

    Sinon, si tu n'utilises pas SDL_gfx, comment fais-tu pour afficher des rectangles aux bords aux coins arrondis ?
    As-tu une idée par rapport au code source qui expliquerait pourquoi j'obtiens rien du tout ?

    Je n'y suis pas encore vraiment retourné sur le code, mais je te tiendrais au courant. Merci beaucoup ^^

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Un peu bizarre votre histoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pUneFenetre->CreateMe=CreateWindow;  
    pUneFenetre->CreateMe(pUneFenetre,200,300);
    J'imagine que CreateMe est un pointeur de fonction.
    C'est surement pour faire de l'objet sans langage orienté objet, mais bon.

    Sinon, je pense que l'erreur peut être évitée en convertissant la surface au format de l'écran avec SDL_DisplayFormat().
    En dernier recours, utilisez un débogueur pour comprendre la raison du bogue.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    Oui, le problème d'erreur de segmentation finira bien par être résolu, par contre, je me demande pourquoi je n'obtiens rien quand j'exécute la fonction SDL_roundedRectangle().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Draw_FillRound( thisWindow->pSurface,
                        startx,
                        starty,
                        thisWindow->pSurface->clip_rect.w,
                        thisWindow->pSurface->clip_rect.h,
                        5,
                        SDL_MapRGBA(thisWindow->pSurface->format,foreground.r,foreground.g,foreground.b,SDL_ALPHA_TRANSPARENT));
    ...fonctionnait (SDL_draw)

    Quand j'ai débugé, il y un bail, j'ai noté que c'était la macro SDL_DRAW_PUTPIXEL qui posait soucis quand SDL_PIXEL_BPP était à 3.
    J'ai envoyé un mail à la personne qui avait fait la librairie mais il ne m'a jamais répondu (ça fait des mois maintenant).

    Là j'ai laissé tomber (finirais bien par comprendre pourquoi ça ne marche pas en 24 bits de profondeur).
    Par contre, le fait que je n'obtienne rien du tout (juste mon fond d'écran et mon texte dessus sans le background avec les coins arrondis) là je calle ^^

  6. #6
    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
    Est tu sur que la lib SDL_draw est fiable ?
    Je l'ai jamais utilisé (et je ne la connaissais pas).

  7. #7
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    A mon avis non c'est pour cela que je suis passé par SDL_GFXprimitives...

    C'est dans le "standard" SDL et SDL2.

Discussions similaires

  1. [CodeBlocks] {SDL_gfx} Compilation
    Par LeFlou dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 15/08/2007, 22h55
  2. aider moi svp je craque ! sdl_gfx
    Par rafale001 dans le forum SDL
    Réponses: 4
    Dernier message: 25/02/2007, 23h40
  3. Comment utiliser SDL_gfx
    Par Clément76 dans le forum SDL
    Réponses: 7
    Dernier message: 25/07/2006, 14h32
  4. John :: Help!! Probleme de compilation avec SDL_gfx
    Par Raggajohnjohn dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 29/10/2005, 15h46
  5. Réponses: 11
    Dernier message: 07/04/2005, 10h20

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