PDA

Voir la version complète : [µLibrary][Aide] Problème de création d'images


morukutsu
18/02/2008, 20h43
(Je copie mon post de dev-fr, je n'avais pas pensé à poster sur le forum de support officiel. )

Salut @ tous.
Je suis face à un problème que je n'arrive pas à résoudre au sujet de l'utilisation avancée d'images avec l'µLib
.
Mon problème tourne au autour des fonctions :

UL_IMAGE * ulCreateImage (int width, int height, int location, int format, int palCount)
int ulCreateImagePalette (UL_IMAGE *img, int location, int palCount)
int ulRealizeImage (UL_IMAGE *img)
int ulUnrealizeImage (UL_IMAGE *img)
void * ulLockImage (UL_IMAGE *img, UL_LOCK_REASON lockReason)
void ulUnlockImage (UL_IMAGE *img, UL_LOCK_REASON lockReason)
void ulSetImagePixel (UL_IMAGE *img, int x, int y, int pixelValue)

J'essaie de m'en servir pour générer dynamiquement une texture. Ces fonctions sont assez bien documentées mais il n'y a pas d'exemple qui les utilise :s . Du coup, je n'arrive pas bien a comprendre comment m'en servir de la bonne façon.

J'ai plusieurs questions au sujet de celles-ci :
Dans la fonction ulCreateImage, que signifie le paramètre palCount ? Avez-vous un code source d'une utilisation concrète de cette fonction ?
Mes essais se sont terminés soit pas une segfault où une image non affichée ...

J'ai regardé le code de la fonction ulCreateImage et il semblerait qu'elle crée aussi une palette. Or je suis en mode 8bits (256 couleurs palette) et j'aimerai choisir moi même les couleurs qui vont composer cette palette.
Comment je peux faire cela ?

Pour lire où écrire un pixel sur une image avec ulSetImagePixel, est-ce que je dois faire un ulLockImage avant ?
Comment exploite t-on les pointeurs retournées par ulLockImage ?

Voila, je sais que ça fait beaucoup de questions mais je galère vraiment là :( .
Merci d'avance !

Yodajr
18/02/2008, 21h34
Je ne connais pas du tout µlib, donc surement un post qui sert à rien :)

- A mon avis PalCount c'est le nombre de couleurs de la palette que tu as créé.
- Peut être avec ulCreateImagePalette ?
- Pas forcément si elle est en RAM, mais c'est plus sûr selon la doc.
- je dirais un peu comme ça :

UL_IMAGE *image;

image = ulCreateImage(blabla) ou ulLoadImagePNG(blabla);
void *pimage = ulLockImage(image, UL_LOCK_PIXELS);
ulSetImagePixel(pimage, 23, 46, 1);
ulUnlockImage(image, UL_LOCK_PALETTE);

morukutsu
18/02/2008, 21h41
Le problème c'est que ulSetImagePixel prend en 1er paramètre une UL_IMAGE* et pas un pointeur vers un array en mémoire.
Mais merci quand même pour l'aide !

Sinon, en tâtonnant je biens d'arriver à obtenir un résultat mais j'ai du passer mon image en 16 bits... De fait, il m'est maintenant impossible de créer une image de 256*256 pixels en mémoire car elle remplit totalement la VRAM :( .

Brunni
18/02/2008, 22h44
Salut et bienvenue sur ce forum ^^
La pixelValue de setImagePixel dépend du type d'image en fait. En 8 bits et inférieur c'est le n° de couleur, en 16 bits c'est la couleur elle-même.
La création d'une palette dynamique pour une image se fait ainsi:
ulCreateImagePalette(tonImage, UL_IN_VRAM, nombreCouleurs);
Sinon il suffit de passer un palCount > 0 à ulCreateImage et la palette se crée en même temps que l'image (plus simple, c'est ce que je te conseille).
Pour remplir les valeurs de palette, je ne me rappelle plus s'il y a une fonction, mais tu peux faire comme ça:
u16 *palette = ulLockImage(tonImage, UL_LOCK_PALETTE);
palette[x] = RGB15(...);
ulUnlockImage(tonImage, UL_LOCK_PALETTE);
Pour modifier les pixels avec ulSetImagePixel ou ulGetImagePixel il faut d'abord locker ton image:
ulLockImage(tonImage, UL_LOCK_PIXELS);
ulSetImagePixel(tonImage, ...);
ulUnlockImage(tonImage, UL_LOCK_PIXELS);
Sinon tu peux aussi à la main en utilisant le pointeur retourné par ulLockImage. Une ligne correspond à sysSizeX pixels, chacun de taille ul_pixelWidth[tonImage->format] bits (à diviser par 8 pour avoir la taille en octets).

morukutsu
18/02/2008, 23h44
Dac, j'ai compris maintenant :).
Je retourne coder cela :p

Edit : Merci

sdevilcry
27/06/2008, 11h09
Salut, j'ai une petite question avec cette fonction :

UL_IMAGE * ulCreateImage (int width, int height, int location, int format, int palCount)

le format, c'est bien le format de mon image 8,16 bits ?

Par contre le palCount c'est quoi exactement ?