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:
Avec SDL_draw ça marchait, je voyais le rectangle gris en dessous de mon texte, ici rien du tout.
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; }
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
DrawMe est un pointeur sur la fonction DrawWindow().
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);
Comme le forum "officiel" SDL ne permet pas de poster de nouveaux topics (allez comprendre...) je reviens à vous ^^
Partager