1

J'ai pas trouvé beaucoup d'explication pour la fonction SDL_SetGamma est ce que ça ne marche que pour une pallette 8bit ou bien ça peu fonctionné avec un ecran 32/16/24bit ??

Je cherche a faire varié la luminosité de ce que j'affiche en temps reel ....je pensais a cette fonction mais si quelqu'un a une meilleur idée ... grin
Merci d'avance

2

Typhoon ou le gars qui crée plus de topic à l'heure qu n'importe qui ... smile
avatar
Break on through to the other side

3

clovis27 :
Typhoon ou le gars qui crée plus de topic à l'heure qu n'importe qui ... smile

lollllllll grin désolé ..bon je vais me calmer alors .... tongue Mais bon si quelqu'un a une idée pour mon pb SDL_SetGamma ? car j'ai rien reussi a rouver sur le web pour l'instant

4



Dans la man page tu as :

Not all display hardware is able to change gamma.

De plus certaine verson de X11 ne supporte pas la fonction et une version de SDL sur Windows a un bug qui fait qu'elle
ne fonctionne pas.

C'est peut être pour cela que "rien ne se passe" dans ton cas.

Fait le test de retour de la fonction, car :
Returns -1 on error (or if gamma adjustment is not supported)

avatar
:*)

5

bille2 :
Dans la man page tu as :

Not all display hardware is able to change gamma.

De plus certaine verson de X11 ne supporte pas la fonction et une version de SDL sur Windows a un bug qui fait qu'elle
ne fonctionne pas.

C'est peut être pour cela que "rien ne se passe" dans ton cas.

Fait le test de retour de la fonction, car :
Returns -1 on error (or if gamma adjustment is not supported)

A oui j'avais pas vu ça comme ça je pensais que c'était pour ceux qui avait de vielle carte graphique:
Je vais tester sinon j'ai commencé a coder une fonction mais c'est pas au point.
j'ai donc fait une fonction qui creer une surface temporaire

SDL_Surface *Brightness(SDL_Surface *org,int lum){
tmp_surface=SDL_CreateRGBSurface(SDL_HWSURFACE, org->w, org->h, 32, 0, 0, 0, 0);
int x;
int y;
int color;
for (x=0;x<=org->w;x++) {
for (y=0;y<=org->h;y++) {
color=getpixel(org,x,y);
putpixel(tmp_surface,x,y,color-SDL_MapRGB(screen->format,lum,lum,lum));
}
}
return tmp_surface;
}

et pour l'utilisé je fais un
SDL_BlitSurface(lumi(ground,128), &coord_ground, screen,NULL );

mais bon comme je dis c'est pas au point et c'est lourd mais si quelqu'un a une meilleur piste tongue
Merci en tout cas bille2

6



Je pense que tu n'as pas besoin de créé une nouvelle surface, tu peux tout simplement modifié dans la surface transmise dans ta fonction.

N'oublie pas que dans ton cas SDL_Surface *Brightness(SDL_Surface *org,int lum) transmet la surface org par référence, toute modification de org à l'intéreur de la fonction Brightness(), se retrouvera après la sortie de fonction. Dans le cas ou tu travail en 256 couleurs tu peux écrire :


SDL_Surface *Brightness(SDL_Surface *org,unsigned char lum){

unsigned int x;
unsigned int y;
unsigned char color;
for (i=0;i<=org->w*org->h;i++) {
*(org+i)=lum-*(org+i);
}


return 0;
}

Mais je pense que tu préféreras, plus lisiblement, et qui marche dans tous les cas :


SDL_Surface *Brightness(SDL_Surface *org,int lum){
unsigned int x;
unsigned int y;
int color;
for (x=0;x<=org->w;x++) {
for (y=0;y<=org->h;y++) {
color=getpixel(org,x,y);
putpixel(org,x,y,color-SDL_MapRGB(screen->format,lum,lum,lum));
}
}
return 0;
}

avatar
:*)

7

bille2 :
Je pense que tu n'as pas besoin de créé une nouvelle surface, tu peux tout simplement modifié dans la surface transmise dans ta fonction.

merci ta proposition de fonction est interessente. Mais helas je suis en 16bit et pas en 256 couleurs. Le problème retourner la même surface c'est que tu detruit peu a peu la surface....et a chaque fois que tu change de luminosité faut recharger la surface ! (un peu lourd) explication =>
image une pixel ayant comme courleur RGB (200,20,100)
si jammais tu baisse la luminosité de 50 ça te donne RGB(150,0,50)
et si apres tu re augmente de 50 ça donne du RGB(200,50,100)
tu vois le problème ?
alors aute question comment dans un format SDL_MapRGB(screen->format,lum,lum,lum)); je peux ne recuperer qu'une composante avoir la valeur du rouge ? du bleu ? du vert ?

8

Essaye en 24 bits :

int main()
{
unsigned int color=0xFF0A0B;
printf("%d\n",(unsigned char)color);
printf("%d\n",(unsigned char)(color>>8));
printf("%d\n",(unsigned char)(color>>16));
}

Tu as dans l'ordre l'affichage bleu, vert et rouge.

Adapté rapidement cela pourrait être

int main()
{
//@ unsigned int color=0xFF0A0B;
unsigned int color=0x4000;
printf("%d\n",(unsigned char)color);
printf("%d\n",(unsigned char)(color>>4));
printf("%d\n",(unsigned char)(color>>8));
}

pour référence (GP32)
topics/57969-palette-niveaux-de-gris-rouge/2


avatar
:*)

9

wouaaaaaaaaou ça marche ! Je t'embrasse pas le coeur y est embarrassedP

Dit moi ...pour la GP2X on pourra ouvrir des ecran 8/16/24/32 ou juste 16 ?

10

Cela à l'air d'être de l'hybride : il ya 260,000 colors affichable ,
mais le co-pro vidéo étant un ARM940T, il supportera le 32 bit,
je pense que c'est à son niveau que l'interfaçage 32 bit -> 260,000 colors se fera,
et que cela sera transparent pour le developpeur.


La SDK nous le confirmera à sa sortie .
avatar
:*)

11

bille2 :
Cela à l'air d'être de l'hybride : il ya 260,000 colors affichable ,
mais le co-pro vidéo étant un ARM940T, il supportera le 32 bit,
je pense que c'est à son niveau que l'interfaçage 32 bit -> 260,000 colors se fera,
et que cela sera transparent pour le developpeur.


La SDK nous le confirmera à sa sortie .

Ok merci beaucoup !! vivment qu'ils sortent le SDK

12

thyphoon :
alors aute question comment dans un format SDL_MapRGB(screen->format,lum,lum,lum)); je peux ne recuperer qu'une composante avoir la valeur du rouge ? du bleu ? du vert ?


T'as essayé SDL_GetRGB()?

13

Oankali :
T'as essayé SDL_GetRGB()?

Heuuuu ...Lollllllllllllllllllllllllllllll..ba je suis une nouille elle m'était passé sous le nez... On peu pas faire mieux ! Merci beaucoup en tout cas

14

Pour information tu peux décortiquer le code souvent utilisé et ci-dessous. Il n'apport pas grand chose fonctionnelement, mais permet de comprendre le rôle essentiel du casting en c:

void DrawPixel(SDL_Surface *screen, int x, int y,
Uint8 R, Uint8 G, Uint8 B)
{
Uint32 color = SDL_MapRGB(screen->format, R, G, B);
switch (screen->format->BytesPerPixel)
{
case 1: // Assuming 8-bpp
{
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
*bufp = color;
}
break;
case 2: // Probably 15-bpp or 16-bpp
{
Uint16 *bufp;
bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
*bufp = color;
}
break;
case 3: // Slow 24-bpp mode, usually not used
{
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
if(SDL_BYTEORDER == SDL_LIL_ENDIAN)
{
bufp[];
0 = color bufp[1] = color >> 8;
bufp[2] = color >> 16;
} else{
bufp[2] = color;
bufp[1] = color >> 8;
bufp[0] = color >> 16;
}
}
break;
case 4: // Probably 32-bpp
{
Uint32 *bufp;
bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
*bufp = color;
}
break;
}
}
avatar
:*)

15

Merci je vais étudier ça smile