Programación Wii - Mostrar imagen JPG

En construcción.png

Este artículo está en construcción.

Por esta razón, seguramente habrá lagunas en el contenido o en el formato. Por favor, antes de cambiar el contenido, consulta la página de discusión del artículo.

Este artículo tiene información extraída de una web que no trabaja con Creative Commons.

No se pueden añadir contenidos no CC al wiki de ElOtroLado, podríamos tener problemas legales. Considera la posibilidad de buscar fuentes similares bajo CC, y en última instancia, pedir el borrado del artículo.

Contenido

Descripción

El código siguiente muestra una imagen jpg en pantalla haciendo uso de las librerías libJPEG. Éstas librerías han sido portadas a wii por dsbomb.

Código

//LIBRERIAS////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <gccore.h>		
#include <ogcsys.h>		
#include <string.h>
#include <jpeg/jpgogc.h> //Para manejar imágenes jpg 


//---External Picture---//
extern char     picdata[];
extern int      piclength;

//DATOS GLOBALES///////////////////////////////////////////////////////////////////////////////////
GXRModeObj     *modovideo;		          //Objeto para cargar los datos del modo de vídeo
u32            *framebuffer[2] = { NULL, NULL }; // Creamos dos Framebuffers
int             cualfb = 0;	                  // Lo utilizaremos para seleccionar el framebuffer
//-------------------------------------------------------------------------------------------------
// Inicializa()
//
// Esta función se encargará de configurar el modo de vídeo y ...
// output.
//-------------------------------------------------------------------------------------------------
static void Inicializa(void)
{
 VIDEO_Init();  //Es IMPORTANTE que seal lo primero que hagamos en cualquier proyecto
	         //Además de inicializar el subsistema de vídeo configura el  sistema del ogc 

 PAD_Init();  //Inicializa los padas para recibir datos

 //Establecemos para para el modo de vídeo de la consola la mayor resolución entrelazada
 switch (VIDEO_GetCurrentTvMode()) {
 case VI_NTSC:
	modovideo = &TVNtsc480IntDf;
	break;

 case VI_PAL:
	modovideo = &TVPal528IntDf; //Para el área PAL usaremos 640x528
	break;

 case VI_MPAL:
	modovideo = &TVMpal480IntDf;
	break;

 default:
	modovideo = &TVNtsc480IntDf;
	break;
 }

VIDEO_Configure(modovideo); //Permitimos que libogc configure el modo que hayamos establecido

	
//Configuramos las pantallas virtuales (framebuffers). Las pantallas virtuales son trozos de
//memoria que almacenan la "ristra" de píxels que se dibujarán en la pantalla real............
framebuffer[0] = (u32 *) MEM_K0_TO_K1(SYS_AllocateFramebuffer(modovideo)); //Reservamos memoria
framebuffer[1] = (u32 *) MEM_K0_TO_K1(SYS_AllocateFramebuffer(modovideo)); //No lo usaremos

//Definimos una consola........................................................................
console_init(framebuffer[0], 20, 64, modovideo->fbWidth, modovideo->fbHeight, modovideo->fbWidth *  2); 

//Limpiamos las pantallas virtuales............................................................
VIDEO_ClearFrameBuffer(modovideo, framebuffer[0], COLOR_BLACK); //Limpiamos el framebuffer poniendo color
VIDEO_ClearFrameBuffer(modovideo, framebuffer[1], COLOR_BLACK); //negro todos lo píxels

VIDEO_SetNextFramebuffer(framebuffer[0]); //Preparamos el framebuffer para que sea dibujado durante la
                                          //próxima actualización de la pantalla

	
//Hacemos que libogc actualice la información de los PADs......................................
VIDEO_SetPostRetraceCallback(PAD_ScanPads);
VIDEO_SetBlack(0);

//Actualizamos el vídeo........................................................................
VIDEO_Flush();

VIDEO_WaitVSync(); //Esperamos al retrazo vertical
if (modovideo->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync();

}
//-------------------------------------------------------------------------------------------------
// MAIN
//-------------------------------------------------------------------------------------------------
int main()
{
 //VARIALBES....................................................................................
 JPEGIMG            jpeg;      //Los datos de la imagen jpg
    int             fila,      //Nos indicará en qué fila de píxels nos encontramos
                    columna,   //Ídem columna
                    pixeldoble,//Píxel activo (IMPORTANTE: los píxels se cargarán de dos en dos)
                    offset;    //Posición dentro del framebuffer o de la imagen
    unsigned int   *jpegout;   //Puntero con el que accederemos a nuestra imagen

//Inicializaciones.............................................................................
memset(&jpeg, 0, sizeof(JPEGIMG)); //Rellenamos la variable jpeg con el valor cero

Inicializa();	//LLAMADA A LA FUNCIÓN QUE CREAMOS previamente encargada de las inicializaciones

//INICIO.......................................................................................
printf("Tutorial segundo: La librería libjpeg\n");

//
jpeg.inbuffer = picdata;
jpeg.inbufferlength = piclength;

JPEG_Decompress(&jpeg);//Llamada al decompresor

printf("Pulsa A para mostrar la imagen\n");

while (!(PAD_ButtonsDown(0) & PAD_BUTTON_A)); //Este bucle no parará hasta que se pulse A
while (PAD_ButtonsDown(0) & PAD_BUTTON_A);

cualfb ^= 1; //
pixeldoble = 0; // Inicializamos a cero para situarnos al comienzo

jpegout = (unsigned int *) jpeg.outbuffer;

offset = 0; // Inicializamos a cero para situarnos al comienzo del array de píxels
	
//Recorremos píxel a píxel la imagen cargando el valor de éstos (los colores) a la pantalla
//virtual (que simplemente es una sucesión de valores de colores)
for (fila = 0; fila < jpeg.height; fila++) {               //Repetimos tantas veces como filas haya

 for (columna = 0; columna < (jpeg.width >> 1); columna++) //Recorremos la fila horizontalmente
	                                                    //Sólo recorreremos la mitad del ancho (ancho >>  1)
                                                           //puesto que cada vez que cargamos la varible lo
                                                           //hacemos con un valor que nos permite conocer
                                                           //el color de dos píxels contiguos
 
 framebuffer[cualfb][offset + columna] = jpegout[pixeldoble++]; //Guardamos el valor en el framebuffer
 offset += jpeg.width >> 1; //Movemos el offset para que se situe en lo que sería la siguiente línea 
 }

//Es IMPORTANTE liberar la memoria
free(jpeg.outbuffer); 

//Finalmente mostramos la imagen
VIDEO_SetNextFramebuffer(framebuffer[cualfb]);
VIDEO_Flush();
VIDEO_WaitVSync();

while (1); //Bucle infinito

return 0;		/*** Keep gcc happy ***/

}

Apuntes

Pendiente

Enlaces