¿Qué quieres exactamente? Hay un ejemplo con jpg y png.
Lo básico que tienes que hacer es tener una carpeta data donde va a estar el archivo png y le añades la extensión.bin
Ejemplo: imagen.png lo llamas imagen_png.bin dentro de la carpeta data
Los directorios deben de quedar así:
ejemplopng
data (en este directorio tener imagen_png.bin)
source (en este directorio tener el main.c)
Makefile (archivo Makefile del ejemplo directamente dentro de ejemplopng)
compilla_ifcaro.bat (archivo bat ejemplo directamente dentro de ejemplopng para compilar)
Coge un ejemplo de psl1gth y añades sino están
#include <sysmodule/sysmodule.h>
#include <pngdec/pngdec.h>
#include <pngdec/loadpng.h>
#include "imagen_png.bin.h" // Aquí tienes que pones el nombre que le has puesto al nombre y añadirle un .h
Cambia el Main por este, he quitado lo de controlar los pads para salir para que quede más sencillo el ejemplo. Ten en cuenta que faltan las funciones de init_screen que están en los ejemplos de
psl1ght. Cogelas de
s32 main(s32 argc, const char* argv[])
{
// Cargamos el módulo para cargar PNG
if(SysLoadModule(SYSMODULE_PNGDEC)!=0) return 0;
// Iniciamos la pantalla
init_screen();
// Variable donde guardar los datos del PNG
PngDatas imagenpng;
// Valores antes de la llamada
imagenpng.png_in= (void *) imagen_png_bin;
imagenpng.png_size= sizeof(imagen_png_bin);
// Llamada para cargar los datos del PNG en la variable imagenPNG
LoadPNG(&imagenpng, NULL);
long frame = 0; // Número de frames
// Loop
while(1){
waitFlip();
// En png1.bmp_out se guarda el puntero de los datos del PNG, si no se ha cargado bien no entra en el if
if(imagenpng.bmp_out) {
// x e y serán la posición donde lo vas a dibujar, puedes cambiarlas
static int x=0,y=0;
int n, m;
// Valores de los punteros uno de la pantalla y otro del PNG
u32 *scr= (u32 *) buffer[currentBuffer];
u32 *png= (u32 *) imagenpng.bmp_out;
// Será la posición donde va a empezar a poner los pixels del png
scr+=y*res.width+x;
// Dibujamos el PNG pixel a pixel con un for
for(n=0;n<imagenpng.height;n++) {
// Para que no se salga de pantalla por la derecha
if((y+n)>=res.height) break;
for(m=0;m<imagenpng.width;m++) {
// Para que no se salga de pantalla por abajo
if((x+m)>=res.width) break;
// Ponemos el pixel
scr[m]=png[m];
}
// Actualizamos las posiciones de los punteros en la siguiente línea
png+=imagenpng.wpitch>>2;
scr+=res.width;
}
}
// Cambio del buffer
flip(currentBuffer);
currentBuffer = !currentBuffer;
frame++;
// Para que salga a los 500 frames
if (frame > 500) break;
}
// Antes de salir hacemos el Unload del módulo de PNG
SysUnloadModule(SYSMODULE_PNGDEC);
return 0;
}
Aquí tienes lo que tiene que ir delante del main ... jeje
#include <psl1ght/lv2.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <sysutil/video.h>
#include <rsx/gcm.h>
#include <rsx/reality.h>
#include <io/pad.h>
#include <sysmodule/sysmodule.h>
#include <pngdec/pngdec.h>
#include <pngdec/loadpng.h>
#include "imagen_png.bin.h"
gcmContextData *context; // Context to keep track of the RSX buffer.
VideoResolution res; // Screen Resolution
int currentBuffer = 0;
s32 *buffer[2]; // The buffer we will be drawing into.
void waitFlip() { // Block the PPU thread untill the previous flip operation has finished.
while(gcmGetFlipStatus() != 0)
usleep(200);
gcmResetFlipStatus();
}
void flip(s32 buffer) {
assert(gcmSetFlip(context, buffer) == 0);
realityFlushBuffer(context);
gcmSetWaitFlip(context); // Prevent the RSX from continuing until the flip has finished.
}
// Initilize everything. You can probally skip over this function.
void init_screen() {
// Allocate a 1Mb buffer, alligned to a 1Mb boundary to be our shared IO memory with the RSX.
void *host_addr = memalign(1024*1024, 1024*1024);
assert(host_addr != NULL);
// Initilise Reality, which sets up the command buffer and shared IO memory
context = realityInit(0x10000, 1024*1024, host_addr);
assert(context != NULL);
VideoState state;
assert(videoGetState(0, 0, &state) == 0); // Get the state of the display
assert(state.state == 0); // Make sure display is enabled
// Get the current resolution
assert(videoGetResolution(state.displayMode.resolution, &res) == 0);
// Configure the buffer format to xRGB
VideoConfiguration vconfig;
memset(&vconfig, 0, sizeof(VideoConfiguration));
vconfig.resolution = state.displayMode.resolution;
vconfig.format = VIDEO_BUFFER_FORMAT_XRGB;
vconfig.pitch = res.width * 4;
vconfig.aspect=state.displayMode.aspect;
assert(videoConfigure(0, &vconfig, NULL, 0) == 0);
assert(videoGetState(0, 0, &state) == 0);
s32 buffer_size = 4 * res.width * res.height; // each pixel is 4 bytes
printf("buffers will be 0x%x bytes\n", buffer_size);
gcmSetFlipMode(GCM_FLIP_VSYNC); // Wait for VSYNC to flip
// Allocate two buffers for the RSX to draw to the screen (double buffering)
buffer[0] = rsxMemAlign(16, buffer_size);
buffer[1] = rsxMemAlign(16, buffer_size);
assert(buffer[0] != NULL && buffer[1] != NULL);
u32 offset[2];
assert(realityAddressToOffset(buffer[0], &offset[0]) == 0);
assert(realityAddressToOffset(buffer[1], &offset[1]) == 0);
// Setup the display buffers
assert(gcmSetDisplayBuffer(0, offset[0], res.width * 4, res.width, res.height) == 0);
assert(gcmSetDisplayBuffer(1, offset[1], res.width * 4, res.width, res.height) == 0);
gcmResetFlipStatus();
flip(1);
}