Je me lance dans la programmation et j'ai donc décidé de vous faire un petit tuto sur l'intégration d'une image de type JPEG dans votre HomeBrew.
Les sources de mon travail sont dispo dans le topic pour une meilleure compréhension
Pour ceci, vous avez besoin de la bibliothèque libogc_jpeg disponible ici.
Une fois le fichier téléchargé, décompressez le dans C:\devkitPro\devkitPPC\powerpc-gekko
Après il nous faut modifier notre makefile pour lui ajouter la bibliothèque :
Après "any extra libraries we wish to link with the project"
Code
LIBS????:=??-logc -lm -ljpeg
Nous devons créer un fichier picture.s dans ../source qui contiens ceci :
Code
.rodata
.balign 32
.globl piclength
.globl picdata
piclength:????.long????picdataend - picdata
picdata:????.incbin "../include/Wii Addict.jpg" //adresse de l'image
picdataend:
.balign 32
.globl piclength
.globl picdata
piclength:????.long????picdataend - picdata
picdata:????.incbin "../include/Wii Addict.jpg" //adresse de l'image
picdataend:
Ensuite, il faut dire à notre programme d'utiliser la bibliothèque. Ajoutez donc dans votre fichier .c :
Code
#include
Nous devons ensuite définir deux variables : picdata et piclength
Code
char picdata[];
int piclength;
int piclength;
Puis créer une fonction JPEG :
Code
void display_jpeg(JPEGIMG jpeg, int x, int y)
{
????unsigned int *jpegout = (unsigned int *) jpeg.outbuffer;
????int i,j;
????int height = jpeg.height;
????int width = jpeg.width/2;
????
????for(i=0;i<=width;i++)
????{
????????for(j=0;j<=height-2;j++)
????????{
????????????xfb[(i+x)+320*(j+16+y)]=jpegout[i+width*j];
????????}
????}
????
}
{
????unsigned int *jpegout = (unsigned int *) jpeg.outbuffer;
????int i,j;
????int height = jpeg.height;
????int width = jpeg.width/2;
????
????for(i=0;i<=width;i++)
????{
????????for(j=0;j<=height-2;j++)
????????{
????????????xfb[(i+x)+320*(j+16+y)]=jpegout[i+width*j];
????????}
????}
????
}
La première ligne dans la fonction est liée à la façon dont la bibliothèque jpeg fonctionne. Plus tard, vous verrez que nous décompressons les images jpeg. A ce moment là, l'image est stockée dans jpeg.outbuffer.
Les lignes suivantes définissent des variables locales de hauteur et de largeur, puis copient le jpeg sur le frame buffer (l'écran) pour les coordonnées que nous avons définis en tant que x et y.
La dernière ligne de la fonction veille à ce que nous ayons effacé l'espace dans la mémoire où nous avons fait une copie locale de l'image jpeg (unsigned int * jpegout = (unsigned int *) jpeg.outbuffer;)
Nous pouvons maintenant utiliser notre fonction dans le main pour afficher une image. Il faut d'abord déclarer une variable qui utilise notre fonction :
Code
JPEGIMG wiiaddict;
Ensuite il faut assigner de la mémoire à notre image :
Code
memset(&wiiaddict, 0, sizeof(JPEGIMG));
Nous définissons les variables de wiiaddict conformément à notre picture.s :
Code
wiiaddict.inbuffer = picdata;
wiiaddict.inbufferlength = piclength;
wiiaddict.inbufferlength = piclength;
On décompresse notre image :
Code
JPEG_Decompress(&wiiaddict);
Il ne nous reste plus qu'à appeler notre fonction pour afficher notre image aux coordonnées souhaitées :
Code
display_jpeg(wiiaddict, 0, 0);
Et voila ce que cela nous donne avec les sources que je fournis :

Petites notes :
-L'écran a une résolution de 640 pixels en largeur