diff --git a/HBC/META.XML b/HBC/META.XML index af011be0..7e88d32b 100644 --- a/HBC/META.XML +++ b/HBC/META.XML @@ -2,8 +2,8 @@ USB Loader GX USB Loader GX Team - 1.0 r975 - 201009250708 + 1.0 r976 + 201009251926 Loads games from USB-devices USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller. diff --git a/Makefile b/Makefile index 75bd4536..d878f456 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,6 @@ SOURCES := source \ source/libwbfs \ source/language \ source/mload \ - source/ramdisk \ source/patches \ source/usbloader \ source/xml \ @@ -42,6 +41,7 @@ SOURCES := source \ source/memory \ source/libntfs \ source/FileOperations \ + source/ImageOperations \ source/utils \ source/utils/minizip \ source/usbloader/wbfs @@ -60,7 +60,7 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00 #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lpngu -lpng -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad -lmxml -ljpeg -lunzip +LIBS := -lpngu -lpng -lgd -lm -lz -lwiiuse -lbte -lasnd -logc -lfreetype -lvorbisidec -lmad -lmxml -ljpeg -lunzip #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing # include and lib diff --git a/gui.pnproj b/gui.pnproj index d7934e45..88aef2e8 100644 --- a/gui.pnproj +++ b/gui.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gui.pnps b/gui.pnps index c83c30f2..6dee8ea1 100644 --- a/gui.pnps +++ b/gui.pnps @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/source/ImageOperations/TextureConverter.c b/source/ImageOperations/TextureConverter.c new file mode 100644 index 00000000..74b2b076 --- /dev/null +++ b/source/ImageOperations/TextureConverter.c @@ -0,0 +1,616 @@ +/*************************************************************************** + * Copyright (C) 2010 + * Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + * TextureConverter.cpp + * + * for WiiXplorer 2010 + ***************************************************************************/ +#include +#include +#include "TextureConverter.h" + +#define cut_bounds(x, min, max) ( (x < min) ? min : (x > max) ? max : x ) +#define ALIGN(x) (((x) + 3) & ~3) +#define ALIGN32(x) (((x) + 31) & ~31) +#define coordsRGBA8(x, y, w) (((((y >> 2) * (w >> 2) + (x >> 2)) << 5) + ((y & 3) << 2) + (x & 3)) << 1) +#define datasizeRGBA8(w, h) ALIGN32(((w+3)>>2)*((h+3)>>2)*32*2) + +#define MAXWIDTH 1024.0f +#define MAXHEIGHT 768.0f + +static u16 avg(u16 w0, u16 w1, u16 c0, u16 c1) +{ + u16 a0, a1; + u16 a, c; + + a0 = c0 >> 11; + a1 = c1 >> 11; + a = (w0*a0 + w1*a1) / (w0 + w1); + c = a << 11; + + a0 = (c0 >> 5) & 63; + a1 = (c1 >> 5) & 63; + a = (w0*a0 + w1*a1) / (w0 + w1); + c |= a << 5; + + a0 = c0 & 31; + a1 = c1 & 31; + a = (w0*a0 + w1*a1) / (w0 + w1); + c |= a; + + return c; +} + +bool I4ToGD(const u8 * buffer, u32 width, u32 height, gdImagePtr * im) +{ + u32 x, y; + u32 x1, y1; + u32 iv; + + if(!buffer) + return false; + + *im = gdImageCreateTrueColor(width, height); + if(*im == 0) + return false; + + gdImageAlphaBlending(*im, 0); + gdImageSaveAlpha(*im, 1); + + for(iv = 0, y1 = 0; y1 < height; y1 += 8) + { + for(x1 = 0; x1 < width; x1 += 8) + { + for(y = y1; y < (y1 + 8); y++) + { + for(x = x1; x < (x1 + 8); x += 2, iv++) + { + if((x >= width) || (y >= height)) + continue; + + u8 oldpixel = buffer[iv]; + u8 b = (oldpixel >> 4) * 255 / 15; + u8 g = (oldpixel >> 4) * 255 / 15; + u8 r = (oldpixel >> 4) * 255 / 15; + u8 a = gdAlphaOpaque; + + gdImageSetPixel(*im, x, y, gdTrueColorAlpha(r, g, b, a)); + + r = (oldpixel & 0xF) * 255 / 15; + g = (oldpixel & 0xF) * 255 / 15; + b = (oldpixel & 0xF) * 255 / 15; + a = gdAlphaOpaque; + + gdImageSetPixel(*im, x+1, y, gdTrueColorAlpha(r, g, b, a)); + } + } + } + } + return true; +} + +bool IA4ToGD(const u8 * buffer, u32 width, u32 height, gdImagePtr * im) +{ + u32 x, y; + u32 x1, y1; + u32 iv; + + if(!buffer) + return false; + + *im = gdImageCreateTrueColor(width, height); + if(*im == 0) + return false; + + gdImageAlphaBlending(*im, 0); + gdImageSaveAlpha(*im, 1); + + for(iv = 0, y1 = 0; y1 < height; y1 += 4) + { + for(x1 = 0; x1 < width; x1 += 8) + { + for(y = y1; y < (y1 + 4); y++) + { + for(x = x1; x < (x1 + 8); x++) + { + u8 oldpixel = *(u8*)(buffer + (iv++)); + oldpixel = ~oldpixel; + + if((x >= width) || (y >= height)) + continue; + + u8 r = ((oldpixel & 0xF) * 255) / 15; + u8 g = ((oldpixel & 0xF) * 255) / 15; + u8 b = ((oldpixel & 0xF) * 255) / 15; + u8 a = ((oldpixel >> 4) * 255) / 15; + a = 127-127*a/255; + + gdImageSetPixel(*im, x+1, y, gdTrueColorAlpha(r, g, b, a)); + } + } + } + } + return true; +} + +bool I8ToGD(const u8 * buffer, u32 width, u32 height, gdImagePtr * im) +{ + u32 x, y; + u32 x1, y1; + u32 iv; + + if(!buffer) + return false; + + *im = gdImageCreateTrueColor(width, height); + if(*im == 0) + return false; + + gdImageAlphaBlending(*im, 0); + gdImageSaveAlpha(*im, 1); + + for(iv = 0, y1 = 0; y1 < height; y1 += 4) + { + for(x1 = 0; x1 < width; x1 += 8) + { + for(y = y1; y < (y1 + 4); y++) + { + for(x = x1; x < (x1 + 8); x++) + { + u8 pixel = *(u8*)(buffer + ((iv++) * 1)); + if((x >= width) || (y >= height)) + continue; + + u8 r = pixel; + u8 g = pixel; + u8 b = pixel; + u8 a = gdAlphaOpaque; + + gdImageSetPixel(*im, x, y, gdTrueColorAlpha(r, g, b, a)); + } + } + } + } + + return true; +} + +bool IA8ToGD(const u8 * buffer, u32 width, u32 height, gdImagePtr * im) +{ + u32 x, y; + u32 x1, y1; + u32 iv; + + if(!buffer) + return false; + + *im = gdImageCreateTrueColor(width, height); + if(*im == 0) + return false; + + gdImageAlphaBlending(*im, 0); + gdImageSaveAlpha(*im, 1); + + for(iv = 0, y1 = 0; y1 < height; y1 += 4) + { + for(x1 = 0; x1 < width; x1 += 4) + { + for(y = y1; y < (y1 + 4); y++) + { + for(x = x1; x < (x1 + 4); x++) + { + u16 oldpixel = *(u16*)(buffer + ((iv++) * 2)); + + if((x >= width) || (y >= height)) + continue; + + u8 r = oldpixel >> 8; + u8 g = oldpixel >> 8; + u8 b = oldpixel >> 8; + u8 a = oldpixel & 0xFF; + a = 127-127*a/255; + + gdImageSetPixel(*im, x+1, y, gdTrueColorAlpha(r, g, b, a)); + } + } + } + } + return true; +} + +bool CMPToGD(const u8* buffer, u32 width, u32 height, gdImagePtr * im) +{ + u32 x, y; + u8 r, g, b, a; + u16 raw; + u16 c[4]; + int x0, x1, x2, y0, y1, y2, off; + int ww = (-(-(width) & -(8))); + int ix; + u32 px; + + if(!buffer) + return false; + + *im = gdImageCreateTrueColor(width, height); + if(*im == 0) + return false; + + gdImageAlphaBlending(*im, 0); + gdImageSaveAlpha(*im, 1); + + for (y = 0; y < height; y++) + { + for (x = 0; x < width; x++) + { + x0 = x & 3; + x1 = (x >> 2) & 1; + x2 = x >> 3; + y0 = y & 3; + y1 = (y >> 2) & 1; + y2 = y >> 3; + off = (8 * x1) + (16 * y1) + (32 * x2) + (4 * ww * y2); + + c[0] = *(u16*)(buffer + off); + c[1] = *(u16*)(buffer + off + 2); + if (c[0] > c[1]) { + c[2] = avg(2, 1, c[0], c[1]); + c[3] = avg(1, 2, c[0], c[1]); + } else { + c[2] = avg(1, 1, c[0], c[1]); + c[3] = 0; + } + + px = *(u32*)(buffer + off + 4); + ix = x0 + (4 * y0); + raw = c[(px >> (30 - (2 * ix))) & 3]; + + r = (raw >> 8) & 0xf8; + g = (raw >> 3) & 0xf8; + b = (raw << 3) & 0xf8; + a = gdAlphaOpaque; + + gdImageSetPixel(*im, x, y, gdTrueColorAlpha(r, g, b, a)); + } + } + + return true; +} + +bool RGB565ToGD(const u8* buffer, u32 width, u32 height, gdImagePtr * im) +{ + u32 x, y; + u32 x1, y1; + u32 iv; + + if(!buffer) + return false; + + *im = gdImageCreateTrueColor(width, height); + if(*im == 0) + return false; + + gdImageAlphaBlending(*im, 0); + gdImageSaveAlpha(*im, 1); + + for(iv = 0, y1 = 0; y1 < height; y1 += 4) + { + for(x1 = 0; x1 < width; x1 += 4) + { + for(y = y1; y < (y1 + 4); y++) + { + for(x = x1; x < (x1 + 4); x++) + { + if((x >= width) || (y >= height)) + continue; + + u16 pixel = *(u16*)(buffer + ((iv++) * 2)); + + u8 r = ((pixel >> 11) & 0x1F) << 3; + u8 g = ((pixel >> 5) & 0x3F) << 2; + u8 b = ((pixel >> 0) & 0x1F) << 3; + u8 a = gdAlphaOpaque; + + gdImageSetPixel(*im, x, y, gdTrueColorAlpha(r, g, b, a)); + } + } + } + } + return true; +} + +bool RGB565A3ToGD(const u8* buffer, u32 width, u32 height, gdImagePtr * im) +{ + u32 x, y; + u32 x1, y1; + u32 iv; + + if(!buffer) + return false; + + *im = gdImageCreateTrueColor(width, height); + if(*im == 0) + return false; + + gdImageAlphaBlending(*im, 0); + gdImageSaveAlpha(*im, 1); + + for(iv = 0, y1 = 0; y1 < height; y1 += 4) + { + for(x1 = 0; x1 < width; x1 += 4) + { + for(y = y1; y < (y1 + 4); y++) + { + for(x = x1; x < (x1 + 4); x++) + { + u16 pixel = *(u16*)(buffer + ((iv++) * 2)); + if((x >= width) || (y >= height)) + continue; + + if(pixel & (1 << 15)) + { + // RGB5 + u8 r = (((pixel >> 10) & 0x1F) * 255) / 31; + u8 g = (((pixel >> 5) & 0x1F) * 255) / 31; + u8 b = (((pixel >> 0) & 0x1F) * 255) / 31; + u8 a = gdAlphaOpaque; + + gdImageSetPixel(*im, x, y, gdTrueColorAlpha(r, g, b, a)); + } + else + { + // RGB4A3 + u8 r = (((pixel >> 12) & 0xF) * 255) / 15; + u8 g = (((pixel >> 8) & 0xF) * 255) / 15; + u8 b = (((pixel >> 4) & 0xF) * 255) / 15; + u8 a = (((pixel >> 0) & 0x7) * 64) / 7; + a = 127-127*a/255; + + gdImageSetPixel(*im, x, y, gdTrueColorAlpha(r, g, b, a)); + } + } + } + } + } + + return true; +} + +bool RGBA8ToGD(const u8* buffer, u32 width, u32 height, gdImagePtr * im) +{ + u32 x, y, offset; + u8 r, g, b, a; + + if(!buffer) + return false; + + *im = gdImageCreateTrueColor(width, height); + if(*im == 0) + return false; + + gdImageAlphaBlending(*im, 0); + gdImageSaveAlpha(*im, 1); + + for(y = 0; y < height; y++) + { + for(x = 0; x < width; x++) + { + offset = coordsRGBA8(x, y, width); + a = *(buffer+offset); + r = *(buffer+offset+1); + g = *(buffer+offset+32); + b = *(buffer+offset+33); + + a = 127-127*a/255; + + gdImageSetPixel(*im, x, y, gdTrueColorAlpha(r, g, b, a)); + } + } + + return true; +} + +bool YCbYCrToGD(const u8* buffer, u32 width, u32 height, gdImagePtr * im) +{ + u32 x, y, x1, YCbYCr; + int r, g, b; + u8 r1, g1, b1; + + if(!buffer) + return false; + + *im = gdImageCreateTrueColor(width, height); + if(*im == 0) + return false; + + gdImageAlphaBlending(*im, 0); + gdImageSaveAlpha(*im, 1); + + for(y = 0; y < height; y++) + { + for (x = 0, x1 = 0; x < (width / 2); x++, x1++) + { + YCbYCr = ((u32 *) buffer)[y*width/2+x]; + + u8 * val = (u8 *) &YCbYCr; + + r = (int) (1.371f * (val[3] - 128)); + g = (int) (- 0.698f * (val[3] - 128) - 0.336f * (val[1] - 128)); + b = (int) (1.732f * (val[1] - 128)); + + r1 = cut_bounds(val[0] + r, 0, 255); + g1 = cut_bounds(val[0] + g, 0, 255); + b1 = cut_bounds(val[0] + b, 0, 255); + + gdImageSetPixel(*im, x1, y, gdTrueColorAlpha(r1, g1, b1, gdAlphaOpaque)); + x1++; + + r1 = cut_bounds(val[2] + r, 0, 255); + g1 = cut_bounds(val[2] + g, 0, 255); + b1 = cut_bounds(val[2] + b, 0, 255); + gdImageSetPixel(*im, x1, y, gdTrueColorAlpha(r1, g1, b1, gdAlphaOpaque)); + } + } + + return true; +} + +u8 * GDImageToRGBA8(gdImagePtr * gdImg, int * w, int * h) +{ + int width = gdImageSX(*gdImg); + int height = gdImageSY(*gdImg); + float scale = 1.0f; + int retries = 100; //shouldn't need that long but to be sure + + gdImageAlphaBlending(*gdImg, 0); + gdImageSaveAlpha(*gdImg, 1); + + while(width*scale > MAXWIDTH || height*scale > MAXHEIGHT) + { + if(width*scale > MAXWIDTH) + scale = MAXWIDTH/width; + if(height*scale > MAXHEIGHT) + scale = MAXHEIGHT/height; + + retries--; + + if(!retries) + { + while(width*scale > MAXWIDTH || height*scale > MAXHEIGHT) + scale -= 0.02; + break; + } + } + + width = ALIGN((int) (width * scale)); + height = ALIGN((int) (height * scale)); + + if(width != gdImageSX(*gdImg) || height != gdImageSY(*gdImg)) + { + gdImagePtr dst = gdImageCreateTrueColor(width, height); + gdImageAlphaBlending(dst, 0); + gdImageSaveAlpha(dst, 1); + gdImageCopyResized(dst, *gdImg, 0, 0, 0, 0, width, height, gdImageSX(*gdImg), gdImageSY(*gdImg)); + + gdImageDestroy(*gdImg); + *gdImg = dst; + + width = gdImageSX(*gdImg); + height = gdImageSY(*gdImg); + } + + int len = datasizeRGBA8(width, height); + + u8 * data = (u8 *) memalign(32, len); + if(!data) + return NULL; + + u8 a; + u32 x, y, pixel, offset; + + for(y = 0; y < height; ++y) + { + for(x = 0; x < width; ++x) + { + pixel = gdImageGetPixel(*gdImg, x, y); + + a = 254 - 2*((u8)gdImageAlpha(*gdImg, pixel)); + if(a == 254) a++; + + offset = coordsRGBA8(x, y, width); + data[offset] = a; + data[offset+1] = (u8)gdImageRed(*gdImg, pixel); + data[offset+32] = (u8)gdImageGreen(*gdImg, pixel); + data[offset+33] = (u8)gdImageBlue(*gdImg, pixel); + } + } + + DCFlushRange(data, len); + + if(w) + *w = width; + if(h) + *h = height; + + return data; +} + +u8 * FlipRGBAImage(const u8 *src, u32 width, u32 height) +{ + int x, y; + + int len = datasizeRGBA8(width, height); + + u8 * data = memalign(32, len); + if(!data) + return NULL; + + for (y = 0; y < height; y++) + { + for (x = 0; x < width; x++) + { + u32 offset = coordsRGBA8(x, y, width); + u8 a = src[offset]; + u8 r = src[offset+1]; + u8 g = src[offset+32]; + u8 b = src[offset+33]; + + u32 offset2 = coordsRGBA8((width-x-1), (height-y-1), width); + data[offset2] = a; + data[offset2+1] = r; + data[offset2+32] = g; + data[offset2+33] = b; + } + } + + DCFlushRange(data, len); + + return data; +} + +u8 * RGB8ToRGBA8(const u8 *src, u32 width, u32 height) +{ + u32 x, y, offset; + + int len = datasizeRGBA8(width, height); + + u8 * dst = (u8 *) memalign(32, len); + if(!dst) + return NULL; + + for (y = 0; y < height; ++y) + { + for (x = 0; x < width; ++x) + { + offset = coordsRGBA8(x, y, width); + dst[offset] = 0xFF; + dst[offset+1] = src[(y*width+x)*3]; + dst[offset+32] = src[(y*width+x)*3+1]; + dst[offset+33] = src[(y*width+x)*3+2]; + } + } + + DCFlushRange(dst, len); + + return dst; +} diff --git a/source/ImageOperations/TextureConverter.h b/source/ImageOperations/TextureConverter.h new file mode 100644 index 00000000..cfbac302 --- /dev/null +++ b/source/ImageOperations/TextureConverter.h @@ -0,0 +1,57 @@ +/*************************************************************************** + * Copyright (C) 2010 + * Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + * TextureConverter.h + * + * A texture to GD image converter. + * for WiiXplorer 2010 + ***************************************************************************/ +#ifndef __TEXTURE_CONVERTER_H_ +#define __TEXTURE_CONVERTER_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include +#include + +bool I4ToGD(const u8 * buffer, u32 width, u32 height, gdImagePtr * im); +bool IA4ToGD(const u8 * buffer, u32 width, u32 height, gdImagePtr * im); +bool I8ToGD(const u8 * buffer, u32 width, u32 height, gdImagePtr * im); +bool IA8ToGD(const u8 * buffer, u32 width, u32 height, gdImagePtr * im); +bool CMPToGD(const u8* buffer, u32 width, u32 height, gdImagePtr * im); +bool RGB565ToGD(const u8* buffer, u32 width, u32 height, gdImagePtr * im); +bool RGB565A3ToGD(const u8* buffer, u32 width, u32 height, gdImagePtr * im); +bool RGBA8ToGD(const u8* buffer, u32 width, u32 height, gdImagePtr * im); +bool YCbYCrToGD(const u8* buffer, u32 width, u32 height, gdImagePtr * im); +u8 * GDImageToRGBA8(gdImagePtr * gdImg, int * w, int * h); +u8 * FlipRGBAImage(const u8 *src, u32 width, u32 height); +u8 * RGB8ToRGBA8(const u8 *src, u32 width, u32 height); + +#ifdef __cplusplus +} +#endif + +#endif //__TEXTURE_CONVERTER_H_ diff --git a/source/ImageOperations/TplImage.cpp b/source/ImageOperations/TplImage.cpp new file mode 100644 index 00000000..145dd0cd --- /dev/null +++ b/source/ImageOperations/TplImage.cpp @@ -0,0 +1,244 @@ +/*************************************************************************** + * Copyright (C) 2010 + * Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + * TplImage.cpp + * + * for WiiXplorer 2010 + ***************************************************************************/ +#include +#include +#include +#include "FileOperations/fileops.h" +#include "TextureConverter.h" +#include "TplImage.h" + +TplImage::TplImage(const char * filepath) +{ + TPLBuffer = NULL; + TPLSize = 0; + + u8 * buffer = NULL; + u64 filesize = 0; + LoadFileToMem(filepath, &buffer, &filesize); + + if(buffer) + { + LoadImage(buffer, filesize); + free(buffer); + } +} + +TplImage::TplImage(const u8 * imgBuffer, u32 imgSize) +{ + TPLBuffer = NULL; + TPLSize = 0; + + if(imgBuffer) + { + LoadImage(imgBuffer, imgSize); + } +} + +TplImage::~TplImage() +{ + if(TPLBuffer) + free(TPLBuffer); + + Texture.clear(); + TextureHeader.clear(); + TplTextureBuffer.clear(); +} + +bool TplImage::LoadImage(const u8 * imgBuffer, u32 imgSize) +{ + if(TPLBuffer) + free(TPLBuffer); + + TPLBuffer = NULL; + TPLSize = 0; + + if(!imgBuffer) + return false; + + TPLBuffer = (u8 *) malloc(imgSize); + if(!TPLBuffer) + return false; + + TPLSize = imgSize; + + memcpy(TPLBuffer, imgBuffer, imgSize); + + return ParseTplFile(); +} + +bool TplImage::ParseTplFile() +{ + if(!TPLBuffer) + return false; + + TPLHeader = (const TPL_Header *) TPLBuffer; + + if(TPLHeader->magic != 0x0020AF30) + return false; + + if(TPLHeader->head_size != 12) + return false; + + const TPL_Texture * curTexture = (const TPL_Texture *) (TPLHeader+1); + + for(u32 i = 0; i < TPLHeader->num_textures; i++) + { + Texture.resize(i+1); + TextureHeader.resize(i+1); + TplTextureBuffer.resize(i+1); + + Texture[i] = curTexture; + + TextureHeader[i] = (const TPL_Texture_Header *) ((const u8 *) TPLBuffer+Texture[i]->text_header_offset); + + TplTextureBuffer[i] = TPLBuffer + TextureHeader[i]->offset; + + curTexture++; + } + + return true; + +} + +int TplImage::GetWidth(int pos) +{ + if(pos < 0 || pos >= (int) Texture.size()) + { + return 0; + } + + return TextureHeader[pos]->width; +} + +int TplImage::GetHeight(int pos) +{ + if(pos < 0 || pos >= (int) TextureHeader.size()) + { + return 0; + } + + return TextureHeader[pos]->height; +} + +u32 TplImage::GetFormat(int pos) +{ + if(pos < 0 || pos >= (int) TextureHeader.size()) + { + return 0; + } + + return TextureHeader[pos]->format; +} + +const u8 * TplImage::GetTextureBuffer(int pos) +{ + if(pos < 0 || pos >= (int) TplTextureBuffer.size()) + { + return 0; + } + + return TplTextureBuffer[pos]; +} + +int TplImage::GetTextureSize(int pos) +{ + int width = GetWidth(pos); + int height = GetHeight(pos); + int len = 0; + + switch(GetFormat(pos)) + { + case GX_TF_I4: + case GX_TF_CI4: + case GX_TF_CMPR: + len = ((width+7)>>3)*((height+7)>>3)*32; + break; + case GX_TF_I8: + case GX_TF_IA4: + case GX_TF_CI8: + len = ((width+7)>>3)*((height+7)>>2)*32; + break; + case GX_TF_IA8: + case GX_TF_CI14: + case GX_TF_RGB565: + case GX_TF_RGB5A3: + len = ((width+3)>>2)*((height+3)>>2)*32; + break; + case GX_TF_RGBA8: + len = ((width+3)>>2)*((height+3)>>2)*32*2; + break; + default: + len = ((width+3)>>2)*((height+3)>>2)*32*2; + break; + } + + return len; +} + +gdImagePtr TplImage::ConvertToGD(int pos) +{ + if(pos < 0 || pos >= (int) Texture.size()) + { + return 0; + } + + gdImagePtr gdImg = 0; + + switch(TextureHeader[pos]->format) + { + case GX_TF_RGB565: + RGB565ToGD(TplTextureBuffer[pos], TextureHeader[pos]->width, TextureHeader[pos]->height, &gdImg); + break; + case GX_TF_RGB5A3: + RGB565A3ToGD(TplTextureBuffer[pos], TextureHeader[pos]->width, TextureHeader[pos]->height, &gdImg); + break; + case GX_TF_RGBA8: + RGBA8ToGD(TplTextureBuffer[pos], TextureHeader[pos]->width, TextureHeader[pos]->height, &gdImg); + break; + case GX_TF_I4: + I4ToGD(TplTextureBuffer[pos], TextureHeader[pos]->width, TextureHeader[pos]->height, &gdImg); + break; + case GX_TF_I8: + I8ToGD(TplTextureBuffer[pos], TextureHeader[pos]->width, TextureHeader[pos]->height, &gdImg); + break; + case GX_TF_IA4: + IA4ToGD(TplTextureBuffer[pos], TextureHeader[pos]->width, TextureHeader[pos]->height, &gdImg); + break; + case GX_TF_IA8: + IA8ToGD(TplTextureBuffer[pos], TextureHeader[pos]->width, TextureHeader[pos]->height, &gdImg); + break; + case GX_TF_CMPR: + CMPToGD(TplTextureBuffer[pos], TextureHeader[pos]->width, TextureHeader[pos]->height, &gdImg); + break; + default: + gdImg = 0; + break; + } + + return gdImg; +} diff --git a/source/ImageOperations/TplImage.h b/source/ImageOperations/TplImage.h new file mode 100644 index 00000000..6f85a753 --- /dev/null +++ b/source/ImageOperations/TplImage.h @@ -0,0 +1,98 @@ +/*************************************************************************** + * Copyright (C) 2010 + * Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + * TplImage.h + * + * for WiiXplorer 2010 + ***************************************************************************/ +#ifndef TPL_IMAGE_H_ +#define TPL_IMAGE_H_ + +#include +#include +#include + +typedef struct +{ + u32 magic; + u32 num_textures; + u32 head_size; +} TPL_Header; + +typedef struct +{ + u32 text_header_offset; + u32 text_palette_offset; +} TPL_Texture; + +typedef struct +{ + u16 height; + u16 width; + u32 format; + u32 offset; + u32 wrap_s; + u32 wrap_t; + u32 min; + u32 mag; + f32 lod_bias; + u8 edge_lod; + u8 min_lod; + u8 max_lod; + u8 unpacked; +} TPL_Texture_Header; + +typedef struct +{ + u16 num_items; + u8 unpacked; + u8 pad; + u32 format; + u32 offset; +} TPL_Palette_Header; + +class TplImage +{ + public: + TplImage(const char * filepath); + TplImage(const u8 * imgBuffer, u32 imgSize); + ~TplImage(); + bool LoadImage(const u8 * imgBuffer, u32 imgSize); + int GetWidth(int Texture); + int GetHeight(int Texture); + u32 GetFormat(int Texture); + const u8 * GetTextureBuffer(int Texture); + int GetTextureSize(int Texture); + gdImagePtr ConvertToGD(int Texture); + private: + bool ParseTplFile(); + + u8 * TPLBuffer; + u32 TPLSize; + const TPL_Header * TPLHeader; + std::vector Texture; + std::vector TextureHeader; + std::vector TplTextureBuffer; +}; + +#endif diff --git a/source/banner/openingbnr.c b/source/banner/openingbnr.c index 0f35cfb3..5b15e532 100644 --- a/source/banner/openingbnr.c +++ b/source/banner/openingbnr.c @@ -25,7 +25,6 @@ #include "MD5.h" #include "banner.h" #include "openingbnr.h" -#include "../ramdisk/ramdisk.h" #include "FileOperations/fileops.h" u16 be16(const u8 *p) @@ -480,6 +479,8 @@ int unpackBin(const char * filename, const char * outdir) return 0; } +#if 0 + #define TMP_PATH(s) "BANNER:/dump"s //#define TMP_PATH(s) "SD:/dump"s @@ -559,3 +560,4 @@ int unpackBanner(const u8 *gameid, int what, const char *outdir) error2: if (ret < 0) return ret; return 1; } +#endif \ No newline at end of file diff --git a/source/banner/openingbnr.h b/source/banner/openingbnr.h index dafe18ce..dd36354c 100644 --- a/source/banner/openingbnr.h +++ b/source/banner/openingbnr.h @@ -33,7 +33,7 @@ extern "C" #define UNPACK_ICON_BIN 2 /* extract icon.bin to outdir/icon/ */ #define UNPACK_SOUND_BIN 4 /* copies sound.bin to outdir/sound.bin */ #define UNPACK_ALL (UNPACK_SOUND_BIN | UNPACK_ICON_BIN | UNPACK_BANNER_BIN) - int unpackBanner(const u8 * gameid, int what, const char *outdir); + //int unpackBanner(const u8 * gameid, int what, const char *outdir); //! Extract the lz77 compressed banner, icon and sound .bin u8* decompress_lz77(u8 *data, size_t data_size, size_t* decompressed_size); diff --git a/source/cheats/cheatmenu.cpp b/source/cheats/cheatmenu.cpp index 5ab3b0d3..f2de7880 100644 --- a/source/cheats/cheatmenu.cpp +++ b/source/cheats/cheatmenu.cpp @@ -34,11 +34,8 @@ int CheatMenu(const char * gameID) if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", Settings.theme_path); - GuiImageData settingsbg(imgPath, settings_background_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData settingsbg(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png")); GuiImage settingsbackground(&settingsbg); GuiTrigger trigA; @@ -83,8 +80,7 @@ int CheatMenu(const char * gameID) case 1: int cntcheats = c.getCnt(); customOptionList cheatslst(cntcheats); - GuiCustomOptionBrowser chtBrowser(400, 280, &cheatslst, Settings.theme_path, "bg_options_settings.png", - bg_options_settings_png, 1, 90); + GuiCustomOptionBrowser chtBrowser(400, 280, &cheatslst, "bg_options_settings.png", 1, 90); chtBrowser.SetPosition(0, 90); chtBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); chtBrowser.SetClickable(true); diff --git a/source/filelist.h b/source/filelist.h index 9b6a54a0..4c6e9a47 100644 --- a/source/filelist.h +++ b/source/filelist.h @@ -1,561 +1,553 @@ -/**************************************************************************** - * libwiigui Template - * Tantric 2009 - * - * imagelist.h - * Contains a list of all of the files in the images, fonts, sounds folders - ***************************************************************************/ - -#ifndef _FILELIST_H_ -#define _FILELIST_H_ - -#include - -extern const u8 font_ttf[]; -extern const u32 font_ttf_size; - -extern const u8 clock_ttf[]; -extern const u32 clock_ttf_size; - -extern const u8 closebutton_png[]; -extern const u32 closebutton_png_size; - -extern const u8 gxlogo_png[]; -extern const u32 gxlogo_png_size; - -extern const u8 sdcard_png[]; -extern const u32 sdcard_png_size; - -extern const u8 sdcard_over_png[]; -extern const u32 sdcard_over_png_size; - -extern const u8 Wifi_btn_png[]; -extern const u32 Wifi_btn_png_size; - -extern const u8 Channel_btn_png[]; -extern const u32 Channel_btn_png_size; - -extern const u8 wiimote_png[]; -extern const u32 wiimote_png_size; - -extern const u8 bg_music_ogg[]; -extern const u32 bg_music_ogg_size; - -extern const u8 credits_music_ogg[]; -extern const u32 credits_music_ogg_size; - -extern const u8 gameinfo1_png[]; -extern const u32 gameinfo1_png_size; - -extern const u8 gameinfo2_png[]; -extern const u32 gameinfo2_png_size; - -extern const u8 gameinfo1a_png[]; -extern const u32 gameinfo1a_png_size; - -extern const u8 gameinfo2a_png[]; -extern const u32 gameinfo2a_png_size; - -extern const u8 menuin_ogg[]; -extern const u32 menuin_ogg_size; - -extern const u8 menuout_ogg[]; -extern const u32 menuout_ogg_size; - -extern const u8 success_ogg[]; -extern const u32 success_ogg_size; - -extern const u8 credits_button_png[]; -extern const u32 credits_button_png_size; - -extern const u8 credits_button_over_png[]; -extern const u32 credits_button_over_png_size; - -extern const u8 button_over_pcm[]; -extern const u32 button_over_pcm_size; - -extern const u8 button_click_pcm[]; -extern const u32 button_click_pcm_size; - -extern const u8 button_click2_pcm[]; -extern const u32 button_click2_pcm_size; - -extern const u8 tooltip_left_png[]; -extern const u32 tooltip_left_png_size; - -extern const u8 tooltip_tile_png[]; -extern const u32 tooltip_tile_png_size; - -extern const u8 tooltip_right_png[]; -extern const u32 tooltip_right_png_size; - -extern const u8 startgame_arrow_left_png[]; -extern const u32 startgame_arrow_left_png_size; - -extern const u8 startgame_arrow_right_png[]; -extern const u32 startgame_arrow_right_png_size; - -extern const u8 credits_bg_png[]; -extern const u32 credits_bg_png_size; - -extern const u8 little_star_png[]; -extern const u32 little_star_png_size; - -extern const u8 background_png[]; -extern const u32 background_png_size; - -extern const u8 wbackground_png[]; -extern const u32 wbackground_png_size; - -extern const u8 bg_options_settings_png[]; -extern const u32 bg_options_settings_png_size; - -extern const u8 settings_background_png[]; -extern const u32 settings_background_png_size; - -extern const u8 bg_browser_png[]; -extern const u32 bg_browser_png_size; - -extern const u8 icon_archives_png[]; -extern const u32 icon_archives_png_size; - -//extern const u8 icon_default_png[]; -//extern const u32 icon_default_png_size; - -extern const u8 icon_folder_png[]; -extern const u32 icon_folder_png_size; -/* - extern const u8 icon_gfx_png[]; - extern const u32 icon_gfx_png_size; - - extern const u8 icon_pls_png[]; - extern const u32 icon_pls_png_size; - - extern const u8 icon_sfx_png[]; - extern const u32 icon_sfx_png_size; - - extern const u8 icon_txt_png[]; - extern const u32 icon_txt_png_size; - - extern const u8 icon_xml_png[]; - extern const u32 icon_xml_png_size; - */ -extern const u8 bg_browser_selection_png[]; -extern const u32 bg_browser_selection_png_size; - -extern const u8 addressbar_textbox_png[]; -extern const u32 addressbar_textbox_png_size; - -extern const u8 browser_png[]; -extern const u32 browser_png_size; - -extern const u8 browser_over_png[]; -extern const u32 browser_over_png_size; - -extern const u8 nocover_png[]; -extern const u32 nocover_png_size; - -extern const u8 nocoverFlat_png[]; -extern const u32 nocoverFlat_png_size; - -extern const u8 nodisc_png[]; -extern const u32 nodisc_png_size; - -extern const u8 theme_dialogue_box_png[]; -extern const u32 theme_dialogue_box_png_size; - -extern const u8 button_install_png[]; -extern const u32 button_install_png_size; - -extern const u8 button_install_over_png[]; -extern const u32 button_install_over_png_size; - -extern const u8 dialogue_box_startgame_png[]; -extern const u32 dialogue_box_startgame_png_size; - -extern const u8 wdialogue_box_startgame_png[]; -extern const u32 wdialogue_box_startgame_png_size; - -extern const u8 button_dialogue_box_startgame_png[]; -extern const u32 button_dialogue_box_startgame_size; - -extern const u8 button_dialogue_box_png[]; -extern const u32 button_dialogue_box_size; - -extern const u8 keyboard_textbox_png[]; -extern const u32 keyboard_textbox_png_size; - -extern const u8 keyboard_key_png[]; -extern const u32 keyboard_key_png_size; - -extern const u8 keyboard_key_over_png[]; -extern const u32 keyboard_key_over_png_size; - -extern const u8 keyboard_mediumkey_over_png[]; -extern const u32 keyboard_mediumkey_over_png_size; - -extern const u8 keyboard_largekey_over_png[]; -extern const u32 keyboard_largekey_over_png_size; - -extern const u8 keyboard_backspace_over_png[]; -extern const u32 keyboard_backspace_over_png_size; - -extern const u8 keyboard_clear_over_png[]; -extern const u32 keyboard_clear_over_png_size; - -extern const u8 menu_button_png[]; -extern const u32 menu_button_size; - -extern const u8 menu_button_over_png[]; -extern const u32 menu_button_over_size; - -extern const u8 settings_button_png[]; -extern const u32 settings_button_size; - -extern const u8 settings_button_over_png[]; -extern const u32 settings_button_over_size; - -extern const u8 settings_menu_button_png[]; -extern const u32 settings_menu_button_size; - -extern const u8 wiimote_poweroff_png[]; -extern const u32 wiimote_poweroff_png_size; - -extern const u8 dialogue_box_png[]; -extern const u32 dialogue_box_png_size; - -extern const u8 theme_box_png[]; -extern const u32 theme_box_png_size; - -extern const u8 wiimote_poweroff_over_png[]; -extern const u32 wiimote_poweroff_over_png_size; - -extern const u8 bg_options_png[]; -extern const u32 bg_options_png_size; - -extern const u8 bg_options_entry_png[]; -extern const u32 bg_options_entry_png_size; - -extern const u8 scrollbar_png[]; -extern const u32 scrollbar_png_size; - -extern const u8 scrollbar_arrowup_png[]; -extern const u32 scrollbar_arrowup_png_size; - -extern const u8 scrollbar_arrowup_over_png[]; -extern const u32 scrollbar_arrowup_over_png_size; - -extern const u8 scrollbar_arrowdown_png[]; -extern const u32 scrollbar_arrowdown_png_size; - -extern const u8 scrollbar_arrowdown_over_png[]; -extern const u32 scrollbar_arrowdown_over_png_size; - -extern const u8 scrollbar_box_png[]; -extern const u32 scrollbar_box_png_size; - -extern const u8 scrollbar_box_over_png[]; -extern const u32 scrollbar_box_over_png_size; - -extern const u8 progressbar_png[]; -extern const u32 progressbar_png_size; - -extern const u8 progressbar_empty_png[]; -extern const u32 progressbar_empty_png_size; - -extern const u8 progressbar_outline_png[]; -extern const u32 progressbar_outline_png_size; - -extern const u8 player1_point_png[]; -extern const u32 player1_point_png_size; - -extern const u8 player2_point_png[]; -extern const u32 player2_point_png_size; - -extern const u8 player3_point_png[]; -extern const u32 player3_point_png_size; - -extern const u8 player4_point_png[]; -extern const u32 player4_point_png_size; - -extern const u8 rplayer1_point_png[]; -extern const u32 rplayer1_point_png_size; - -extern const u8 rplayer2_point_png[]; -extern const u32 rplayer2_point_png_size; - -extern const u8 rplayer3_point_png[]; -extern const u32 rplayer3_point_png_size; - -extern const u8 rplayer4_point_png[]; -extern const u32 rplayer4_point_png_size; - -extern const u8 battery_png[]; -extern const u32 battery_png_size; - -extern const u8 battery_bar_png[]; -extern const u32 battery_bar_png_size; - -extern const u8 battery_white_png[]; -extern const u32 battery_white_png_size; - -extern const u8 battery_bar_white_png[]; -extern const u32 battery_bar_white_png_size; - -extern const u8 battery_red_png[]; -extern const u32 battery_red_png_size; - -extern const u8 battery_bar_red_png[]; -extern const u32 battery_bar_red_png_size; - -extern const u8 arrow_next_png[]; -extern const u32 arrow_next_png_size; - -extern const u8 arrow_previous_png[]; -extern const u32 arrow_previous_png_size; - -extern const u8 mp3_pause_png[]; -extern const u32 mp3_pause_png_size; - -extern const u8 exit_top_png[]; -extern const u32 exit_top_png_size; - -extern const u8 exit_top_over_png[]; -extern const u32 exit_top_over_png_size; - -extern const u8 exit_bottom_png[]; -extern const u32 exit_bottom_png_size; - -extern const u8 exit_bottom_over_png[]; -extern const u32 exit_bottom_over_png_size; - -extern const u8 exit_button_png[]; -extern const u32 exit_button_png_size; - -extern const u8 mp3_stop_png[]; -extern const u32 mp3_stop_png_size; - -extern const u8 favorite_png[]; -extern const u32 favorite_png_size; - -extern const u8 not_favorite_png[]; -extern const u32 not_favorite_png_size; - -extern const u8 favIcon_png[]; -extern const u32 favIcon_png_size; - -extern const u8 searchIcon_png[]; -extern const u32 searchIcon_png_size; - -extern const u8 abcIcon_png[]; -extern const u32 abcIcon_png_size; - -extern const u8 rankIcon_png[]; -extern const u32 rankIcon_png_size; - -extern const u8 playCountIcon_png[]; -extern const u32 playCountIcon_png_size; - -extern const u8 arrangeList_png[]; -extern const u32 arrangeList_png_size; - -extern const u8 arrangeGrid_png[]; -extern const u32 arrangeGrid_png_size; - -extern const u8 arrangeCarousel_png[]; -extern const u32 arrangeCarousel_png_size; - -extern const u8 settings_title_png[]; -extern const u32 settings_title_png_size; - -extern const u8 settings_title_over_png[]; -extern const u32 settings_title_over_png_size; - -extern const u8 pageindicator_png[]; -extern const u32 pageindicator_png_size; - -extern const u8 Wiimote1_png[]; -extern const u32 Wiimote1_png_size; - -extern const u8 Wiimote2_png[]; -extern const u32 Wiimote2_png_size; - -extern const u8 Wiimote4_png[]; -extern const u32 Wiimote4_png_size; - -extern const u8 wifi1_png[]; -extern const u32 wifi1_png_size; - -extern const u8 wifi2_png[]; -extern const u32 wifi2png_size; - -extern const u8 wifi3_png[]; -extern const u32 wifi3_png_size; - -extern const u8 wifi4_png[]; -extern const u32 wifi4_png_size; - -//extern const u8 wifi6_png[]; -//extern const u32 wifi6_png_size; - -extern const u8 wifi8_png[]; -extern const u32 wifi8_png_size; - -extern const u8 wifi12_png[]; -extern const u32 wifi12_png_size; - -extern const u8 wifi16_png[]; -extern const u32 wifi16_png_size; - -extern const u8 wifi32_png[]; -extern const u32 wifi32_png_size; - -extern const u8 norating_png[]; -extern const u32 norating_png_size; - -extern const u8 guitar_png[]; -extern const u32 guitar_png_size; -extern const u8 guitarR_png[]; -extern const u32 guitarR_png_size; - -extern const u8 microphone_png[]; -extern const u32 microphone_png_size; -extern const u8 microphoneR_png[]; -extern const u32 microphoneR_png_size; - -extern const u8 gcncontroller_png[]; -extern const u32 gcncontroller_png_size; -extern const u8 gcncontrollerR_png[]; -extern const u32 gcncontrollerR_png_size; - -extern const u8 classiccontroller_png[]; -extern const u32 classiccontroller_png_size; -extern const u8 classiccontrollerR_png[]; -extern const u32 classiccontrollerR_png_size; - -extern const u8 nunchuk_png[]; -extern const u32 nunchuk_png_size; -extern const u8 nunchukR_png[]; -extern const u32 nunchukR_png_size; - -extern const u8 dancepadR_png[]; -extern const u32 dancepadR_size; -extern const u8 dancepad_png[]; -extern const u32 dancepad_png_size; - -extern const u8 balanceboard_png[]; -extern const u32 balanceboard_png_size; -extern const u8 balanceboardR_png[]; -extern const u32 balanceboardR_png_size; - -extern const u8 drums_png[]; -extern const u32 drums_png_size; -extern const u8 drumsR_png[]; -extern const u32 drumsR_png_size; - -extern const u8 motionplus_png[]; -extern const u32 motionplus_png_size; -extern const u8 motionplusR_png[]; -extern const u32 motionplusR_png_size; - -extern const u8 wheel_png[]; -extern const u32 wheel_png_size; -extern const u8 wheelR_png[]; -extern const u32 wheelR_png_size; - -extern const u8 zapper_png[]; -extern const u32 zapper_png_size; -extern const u8 zapperR_png[]; -extern const u32 zapperR_png_size; - -extern const u8 wiispeak_png[]; -extern const u32 wiispeak_png_size; -extern const u8 wiispeakR_png[]; -extern const u32 wiispeakR_png_size; - -extern const u8 nintendods_png[]; -extern const u32 nintendods_png_size; -extern const u8 nintendodsR_png[]; -extern const u32 nintendodsR_png_size; -/* - extern const u8 vitalitysensor_png[]; - extern const u32 vitalitysensor_png_size; - extern const u8 vitalitysensor_png[]; - extern const u32 vitalitysensorR_png_size; - */ -extern const u8 esrb_ec_png[]; -extern const u32 esrb_ec_png_size; - -extern const u8 esrb_e_png[]; -extern const u32 esrb_e_png_size; - -extern const u8 esrb_eten_png[]; -extern const u32 esrb_eten_png_size; - -extern const u8 esrb_t_png[]; -extern const u32 esrb_t_png_size; - -extern const u8 esrb_m_png[]; -extern const u32 esrb_m_png_size; - -extern const u8 esrb_ao_png[]; -extern const u32 esrb_ao_png_size; - -extern const u8 cero_a_png[]; -extern const u32 cero_a_png_size; - -extern const u8 cero_b_png[]; -extern const u32 cero_b_png_size; - -extern const u8 cero_c_png[]; -extern const u32 cero_c_png_size; - -extern const u8 cero_d_png[]; -extern const u32 cero_d_png_size; - -extern const u8 cero_z_png[]; -extern const u32 cero_z_png_size; - -extern const u8 pegi_3_png[]; -extern const u32 pegi_3_png_size; - -extern const u8 pegi_7_png[]; -extern const u32 pegi_7_png_size; - -extern const u8 pegi_12_png[]; -extern const u32 pegi_12_png_size; - -extern const u8 pegi_16_png[]; -extern const u32 pegi_16_png_size; - -extern const u8 pegi_18_png[]; -extern const u32 pegi_18_png_size; - -extern const u8 usbport_png[]; -extern const u32 usbport_png_size; - -extern const u8 dvd_png[]; -extern const u32 dvd_png_size; - -extern const u8 new_png[]; -extern const u32 new_png_size; - -extern const u8 lock_png[]; -extern const u32 lock_png_size; - -extern const u8 unlock_png[]; -extern const u32 unlock_png_size; - -extern const u8 stub_bin[]; -extern const u32 stub_bin_size; - -extern const u8 fatffs_module_bin[]; -extern const u32 fatffs_module_bin_size; - -extern const u8 ehcmodule_frag_v4_bin[]; -extern const u32 ehcmodule_frag_v4_bin_size; - -extern const u8 ehcmodule_frag_v5_bin[]; -extern const u32 ehcmodule_frag_v5_bin_size; - -#endif +/**************************************************************************** + * libwiigui Template + * Tantric 2009 + * + * imagelist.h + * Contains a list of all of the files in the images, fonts, sounds folders + ***************************************************************************/ + +#ifndef _FILELIST_H_ +#define _FILELIST_H_ + +#include + +extern const u8 font_ttf[]; +extern const u32 font_ttf_size; + +extern const u8 clock_ttf[]; +extern const u32 clock_ttf_size; + +extern const u8 closebutton_png[]; +extern const u32 closebutton_png_size; + +extern const u8 gxlogo_png[]; +extern const u32 gxlogo_png_size; + +extern const u8 sdcard_png[]; +extern const u32 sdcard_png_size; + +extern const u8 sdcard_over_png[]; +extern const u32 sdcard_over_png_size; + +extern const u8 Wifi_btn_png[]; +extern const u32 Wifi_btn_png_size; + +extern const u8 Channel_btn_png[]; +extern const u32 Channel_btn_png_size; + +extern const u8 wiimote_png[]; +extern const u32 wiimote_png_size; + +extern const u8 bg_music_ogg[]; +extern const u32 bg_music_ogg_size; + +extern const u8 credits_music_ogg[]; +extern const u32 credits_music_ogg_size; + +extern const u8 gameinfo1_png[]; +extern const u32 gameinfo1_png_size; + +extern const u8 gameinfo2_png[]; +extern const u32 gameinfo2_png_size; + +extern const u8 gameinfo1a_png[]; +extern const u32 gameinfo1a_png_size; + +extern const u8 gameinfo2a_png[]; +extern const u32 gameinfo2a_png_size; + +extern const u8 menuin_ogg[]; +extern const u32 menuin_ogg_size; + +extern const u8 menuout_ogg[]; +extern const u32 menuout_ogg_size; + +extern const u8 success_ogg[]; +extern const u32 success_ogg_size; + +extern const u8 credits_button_png[]; +extern const u32 credits_button_png_size; + +extern const u8 credits_button_over_png[]; +extern const u32 credits_button_over_png_size; + +extern const u8 button_over_pcm[]; +extern const u32 button_over_pcm_size; + +extern const u8 button_click_pcm[]; +extern const u32 button_click_pcm_size; + +extern const u8 button_click2_pcm[]; +extern const u32 button_click2_pcm_size; + +extern const u8 tooltip_left_png[]; +extern const u32 tooltip_left_png_size; + +extern const u8 tooltip_tile_png[]; +extern const u32 tooltip_tile_png_size; + +extern const u8 tooltip_right_png[]; +extern const u32 tooltip_right_png_size; + +extern const u8 startgame_arrow_left_png[]; +extern const u32 startgame_arrow_left_png_size; + +extern const u8 startgame_arrow_right_png[]; +extern const u32 startgame_arrow_right_png_size; + +extern const u8 credits_bg_png[]; +extern const u32 credits_bg_png_size; + +extern const u8 little_star_png[]; +extern const u32 little_star_png_size; + +extern const u8 background_png[]; +extern const u32 background_png_size; + +extern const u8 wbackground_png[]; +extern const u32 wbackground_png_size; + +extern const u8 bg_options_settings_png[]; +extern const u32 bg_options_settings_png_size; + +extern const u8 settings_background_png[]; +extern const u32 settings_background_png_size; + +extern const u8 bg_browser_png[]; +extern const u32 bg_browser_png_size; + +extern const u8 icon_folder_png[]; +extern const u32 icon_folder_png_size; + +extern const u8 bg_browser_selection_png[]; +extern const u32 bg_browser_selection_png_size; + +extern const u8 addressbar_textbox_png[]; +extern const u32 addressbar_textbox_png_size; + +extern const u8 browser_png[]; +extern const u32 browser_png_size; + +extern const u8 browser_over_png[]; +extern const u32 browser_over_png_size; + +extern const u8 nocover_png[]; +extern const u32 nocover_png_size; + +extern const u8 nocoverFlat_png[]; +extern const u32 nocoverFlat_png_size; + +extern const u8 nodisc_png[]; +extern const u32 nodisc_png_size; + +extern const u8 theme_dialogue_box_png[]; +extern const u32 theme_dialogue_box_png_size; + +extern const u8 button_install_png[]; +extern const u32 button_install_png_size; + +extern const u8 button_install_over_png[]; +extern const u32 button_install_over_png_size; + +extern const u8 dialogue_box_startgame_png[]; +extern const u32 dialogue_box_startgame_png_size; + +extern const u8 wdialogue_box_startgame_png[]; +extern const u32 wdialogue_box_startgame_png_size; + +extern const u8 button_dialogue_box_png[]; +extern const u32 button_dialogue_box_png_size; + +extern const u8 keyboard_textbox_png[]; +extern const u32 keyboard_textbox_png_size; + +extern const u8 keyboard_key_png[]; +extern const u32 keyboard_key_png_size; + +extern const u8 keyboard_key_over_png[]; +extern const u32 keyboard_key_over_png_size; + +extern const u8 keyboard_mediumkey_over_png[]; +extern const u32 keyboard_mediumkey_over_png_size; + +extern const u8 keyboard_largekey_over_png[]; +extern const u32 keyboard_largekey_over_png_size; + +extern const u8 keyboard_backspace_over_png[]; +extern const u32 keyboard_backspace_over_png_size; + +extern const u8 keyboard_clear_over_png[]; +extern const u32 keyboard_clear_over_png_size; + +extern const u8 menu_button_png[]; +extern const u32 menu_button_png_size; + +extern const u8 menu_button_over_png[]; +extern const u32 menu_button_over_png_size; + +extern const u8 settings_button_png[]; +extern const u32 settings_button_png_size; + +extern const u8 settings_button_over_png[]; +extern const u32 settings_button_over_png_size; + +extern const u8 settings_menu_button_png[]; +extern const u32 settings_menu_button_png_size; + +extern const u8 wiimote_poweroff_png[]; +extern const u32 wiimote_poweroff_png_size; + +extern const u8 dialogue_box_png[]; +extern const u32 dialogue_box_png_size; + +extern const u8 theme_box_png[]; +extern const u32 theme_box_png_size; + +extern const u8 wiimote_poweroff_over_png[]; +extern const u32 wiimote_poweroff_over_png_size; + +extern const u8 bg_options_png[]; +extern const u32 bg_options_png_size; + +extern const u8 bg_options_entry_png[]; +extern const u32 bg_options_entry_png_size; + +extern const u8 scrollbar_png[]; +extern const u32 scrollbar_png_size; + +extern const u8 scrollbar_arrowup_png[]; +extern const u32 scrollbar_arrowup_png_size; + +extern const u8 scrollbar_arrowdown_png[]; +extern const u32 scrollbar_arrowdown_png_size; + +extern const u8 scrollbar_box_png[]; +extern const u32 scrollbar_box_png_size; + +extern const u8 progressbar_png[]; +extern const u32 progressbar_png_size; + +extern const u8 progressbar_empty_png[]; +extern const u32 progressbar_empty_png_size; + +extern const u8 progressbar_outline_png[]; +extern const u32 progressbar_outline_png_size; + +extern const u8 player1_point_png[]; +extern const u32 player1_point_png_size; + +extern const u8 player2_point_png[]; +extern const u32 player2_point_png_size; + +extern const u8 player3_point_png[]; +extern const u32 player3_point_png_size; + +extern const u8 player4_point_png[]; +extern const u32 player4_point_png_size; + +extern const u8 rplayer1_point_png[]; +extern const u32 rplayer1_point_png_size; + +extern const u8 rplayer2_point_png[]; +extern const u32 rplayer2_point_png_size; + +extern const u8 rplayer3_point_png[]; +extern const u32 rplayer3_point_png_size; + +extern const u8 rplayer4_point_png[]; +extern const u32 rplayer4_point_png_size; + +extern const u8 battery_png[]; +extern const u32 battery_png_size; + +extern const u8 battery_bar_png[]; +extern const u32 battery_bar_png_size; + +extern const u8 battery_white_png[]; +extern const u32 battery_white_png_size; + +extern const u8 battery_bar_white_png[]; +extern const u32 battery_bar_white_png_size; + +extern const u8 battery_red_png[]; +extern const u32 battery_red_png_size; + +extern const u8 battery_bar_red_png[]; +extern const u32 battery_bar_red_png_size; + +extern const u8 arrow_next_png[]; +extern const u32 arrow_next_png_size; + +extern const u8 arrow_previous_png[]; +extern const u32 arrow_previous_png_size; + +extern const u8 mp3_pause_png[]; +extern const u32 mp3_pause_png_size; + +extern const u8 exit_top_png[]; +extern const u32 exit_top_png_size; + +extern const u8 exit_top_over_png[]; +extern const u32 exit_top_over_png_size; + +extern const u8 exit_bottom_png[]; +extern const u32 exit_bottom_png_size; + +extern const u8 exit_bottom_over_png[]; +extern const u32 exit_bottom_over_png_size; + +extern const u8 exit_button_png[]; +extern const u32 exit_button_png_size; + +extern const u8 mp3_stop_png[]; +extern const u32 mp3_stop_png_size; + +extern const u8 favorite_png[]; +extern const u32 favorite_png_size; + +extern const u8 not_favorite_png[]; +extern const u32 not_favorite_png_size; + +extern const u8 favIcon_png[]; +extern const u32 favIcon_png_size; + +extern const u8 favIcon_gray_png[]; +extern const u32 favIcon_gray_png_size; + +extern const u8 searchIcon_png[]; +extern const u32 searchIcon_png_size; + +extern const u8 searchIcon_gray_png[]; +extern const u32 searchIcon_gray_png_size; + +extern const u8 abcIcon_png[]; +extern const u32 abcIcon_png_size; + +extern const u8 abcIcon_gray_png[]; +extern const u32 abcIcon_gray_png_size; + +extern const u8 rankIcon_png[]; +extern const u32 rankIcon_png_size; + +extern const u8 rankIcon_gray_png[]; +extern const u32 rankIcon_gray_png_size; + +extern const u8 playCountIcon_png[]; +extern const u32 playCountIcon_png_size; + +extern const u8 playCountIcon_gray_png[]; +extern const u32 playCountIcon_gray_png_size; + +extern const u8 arrangeList_png[]; +extern const u32 arrangeList_png_size; + +extern const u8 arrangeList_gray_png[]; +extern const u32 arrangeList_gray_png_size; + +extern const u8 arrangeGrid_png[]; +extern const u32 arrangeGrid_png_size; + +extern const u8 arrangeGrid_gray_png[]; +extern const u32 arrangeGrid_gray_png_size; + +extern const u8 arrangeCarousel_png[]; +extern const u32 arrangeCarousel_png_size; + +extern const u8 arrangeCarousel_gray_png[]; +extern const u32 arrangeCarousel_gray_png_size; + +extern const u8 settings_title_png[]; +extern const u32 settings_title_png_size; + +extern const u8 settings_title_over_png[]; +extern const u32 settings_title_over_png_size; + +extern const u8 pageindicator_png[]; +extern const u32 pageindicator_png_size; + +extern const u8 Wiimote1_png[]; +extern const u32 Wiimote1_png_size; + +extern const u8 Wiimote2_png[]; +extern const u32 Wiimote2_png_size; + +extern const u8 Wiimote4_png[]; +extern const u32 Wiimote4_png_size; + +extern const u8 wifi1_png[]; +extern const u32 wifi1_png_size; + +extern const u8 wifi2_png[]; +extern const u32 wifi2_png_size; + +extern const u8 wifi3_png[]; +extern const u32 wifi3_png_size; + +extern const u8 wifi4_png[]; +extern const u32 wifi4_png_size; + +extern const u8 wifi8_png[]; +extern const u32 wifi8_png_size; + +extern const u8 wifi12_png[]; +extern const u32 wifi12_png_size; + +extern const u8 wifi16_png[]; +extern const u32 wifi16_png_size; + +extern const u8 wifi32_png[]; +extern const u32 wifi32_png_size; + +extern const u8 norating_png[]; +extern const u32 norating_png_size; + +extern const u8 guitar_png[]; +extern const u32 guitar_png_size; +extern const u8 guitarR_png[]; +extern const u32 guitarR_png_size; + +extern const u8 microphone_png[]; +extern const u32 microphone_png_size; +extern const u8 microphoneR_png[]; +extern const u32 microphoneR_png_size; + +extern const u8 gcncontroller_png[]; +extern const u32 gcncontroller_png_size; +extern const u8 gcncontrollerR_png[]; +extern const u32 gcncontrollerR_png_size; + +extern const u8 classiccontroller_png[]; +extern const u32 classiccontroller_png_size; +extern const u8 classiccontrollerR_png[]; +extern const u32 classiccontrollerR_png_size; + +extern const u8 nunchuk_png[]; +extern const u32 nunchuk_png_size; +extern const u8 nunchukR_png[]; +extern const u32 nunchukR_png_size; + +extern const u8 dancepad_png[]; +extern const u32 dancepad_png_size; +extern const u8 dancepadR_png[]; +extern const u32 dancepadR_png_size; + +extern const u8 balanceboard_png[]; +extern const u32 balanceboard_png_size; +extern const u8 balanceboardR_png[]; +extern const u32 balanceboardR_png_size; + +extern const u8 drums_png[]; +extern const u32 drums_png_size; +extern const u8 drumsR_png[]; +extern const u32 drumsR_png_size; + +extern const u8 motionplus_png[]; +extern const u32 motionplus_png_size; +extern const u8 motionplusR_png[]; +extern const u32 motionplusR_png_size; + +extern const u8 wheel_png[]; +extern const u32 wheel_png_size; +extern const u8 wheelR_png[]; +extern const u32 wheelR_png_size; + +extern const u8 zapper_png[]; +extern const u32 zapper_png_size; +extern const u8 zapperR_png[]; +extern const u32 zapperR_png_size; + +extern const u8 wiispeak_png[]; +extern const u32 wiispeak_png_size; +extern const u8 wiispeakR_png[]; +extern const u32 wiispeakR_png_size; + +extern const u8 nintendods_png[]; +extern const u32 nintendods_png_size; +extern const u8 nintendodsR_png[]; +extern const u32 nintendodsR_png_size; + +extern const u8 esrb_ec_png[]; +extern const u32 esrb_ec_png_size; + +extern const u8 esrb_e_png[]; +extern const u32 esrb_e_png_size; + +extern const u8 esrb_eten_png[]; +extern const u32 esrb_eten_png_size; + +extern const u8 esrb_t_png[]; +extern const u32 esrb_t_png_size; + +extern const u8 esrb_m_png[]; +extern const u32 esrb_m_png_size; + +extern const u8 esrb_ao_png[]; +extern const u32 esrb_ao_png_size; + +extern const u8 cero_a_png[]; +extern const u32 cero_a_png_size; + +extern const u8 cero_b_png[]; +extern const u32 cero_b_png_size; + +extern const u8 cero_c_png[]; +extern const u32 cero_c_png_size; + +extern const u8 cero_d_png[]; +extern const u32 cero_d_png_size; + +extern const u8 cero_z_png[]; +extern const u32 cero_z_png_size; + +extern const u8 pegi_3_png[]; +extern const u32 pegi_3_png_size; + +extern const u8 pegi_7_png[]; +extern const u32 pegi_7_png_size; + +extern const u8 pegi_12_png[]; +extern const u32 pegi_12_png_size; + +extern const u8 pegi_16_png[]; +extern const u32 pegi_16_png_size; + +extern const u8 pegi_18_png[]; +extern const u32 pegi_18_png_size; + +extern const u8 usbport_png[]; +extern const u32 usbport_png_size; + +extern const u8 dvd_png[]; +extern const u32 dvd_png_size; + +extern const u8 dvd_gray_png[]; +extern const u32 dvd_gray_png_size; + +extern const u8 new_png[]; +extern const u32 new_png_size; + +extern const u8 lock_png[]; +extern const u32 lock_png_size; + +extern const u8 lock_gray_png[]; +extern const u32 lock_gray_png_size; + +extern const u8 unlock_png[]; +extern const u32 unlock_png_size; + +extern const u8 unlock_gray_png[]; +extern const u32 unlock_gray_png_size; + +extern const u8 stub_bin[]; +extern const u32 stub_bin_size; + +extern const u8 fatffs_module_bin[]; +extern const u32 fatffs_module_bin_size; + +extern const u8 ehcmodule_frag_v4_bin[]; +extern const u32 ehcmodule_frag_v4_bin_size; + +extern const u8 ehcmodule_frag_v5_bin[]; +extern const u32 ehcmodule_frag_v5_bin_size; + +#endif diff --git a/source/homebrewboot/HomebrewBrowse.cpp b/source/homebrewboot/HomebrewBrowse.cpp index a3414801..6bb6173c 100644 --- a/source/homebrewboot/HomebrewBrowse.cpp +++ b/source/homebrewboot/HomebrewBrowse.cpp @@ -90,30 +90,21 @@ int MenuHomebrewBrowse() GuiSound btnClick1(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); /*** Image Variables ***/ - char imgPath[150]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); - snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", Settings.theme_path); - GuiImageData bgData(imgPath, settings_background_png); + GuiImageData bgData(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png")); - snprintf(imgPath, sizeof(imgPath), "%ssettings_title.png", Settings.theme_path); - GuiImageData MainButtonImgData(imgPath, settings_title_png); + GuiImageData MainButtonImgData(Resources::GetFile("settings_title.png"), Resources::GetFileSize("settings_title.png")); - snprintf(imgPath, sizeof(imgPath), "%ssettings_title_over.png", Settings.theme_path); - GuiImageData MainButtonImgOverData(imgPath, settings_title_over_png); + GuiImageData MainButtonImgOverData(Resources::GetFile("settings_title_over.png"), Resources::GetFileSize("settings_title_over.png")); - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_left.png", Settings.theme_path); - GuiImageData arrow_left(imgPath, startgame_arrow_left_png); + GuiImageData arrow_left(Resources::GetFile("startgame_arrow_left.png"), Resources::GetFileSize("startgame_arrow_left.png")); - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_right.png", Settings.theme_path); - GuiImageData arrow_right(imgPath, startgame_arrow_right_png); + GuiImageData arrow_right(Resources::GetFile("startgame_arrow_right.png"), Resources::GetFileSize("startgame_arrow_right.png")); - snprintf(imgPath, sizeof(imgPath), "%sWifi_btn.png", Settings.theme_path); - GuiImageData wifiImgData(imgPath, Wifi_btn_png); + GuiImageData wifiImgData(Resources::GetFile("Wifi_btn.png"), Resources::GetFileSize("Wifi_btn.png")); - snprintf(imgPath, sizeof(imgPath), "%sChannel_btn.png", Settings.theme_path); - GuiImageData channelImgData(imgPath, Channel_btn_png); + GuiImageData channelImgData(Resources::GetFile("Channel_btn.png"), Resources::GetFileSize("Channel_btn.png")); GuiImage background(&bgData); @@ -400,7 +391,7 @@ int MenuHomebrewBrowse() { char iconpath[200]; snprintf(iconpath, sizeof(iconpath), "%sicon.png", HomebrewFiles.GetFilepath(fileoffset + i)); - IconData[i] = new GuiImageData(iconpath, 0); + IconData[i] = new GuiImageData(iconpath); if (IconData[i]->GetImage()) { IconImg[i] = new GuiImage(IconData[i]); diff --git a/source/images/abcIcon_gray.png b/source/images/abcIcon_gray.png new file mode 100644 index 00000000..ea3d95c0 Binary files /dev/null and b/source/images/abcIcon_gray.png differ diff --git a/source/images/arrangeCarousel_gray.png b/source/images/arrangeCarousel_gray.png new file mode 100644 index 00000000..c7955d54 Binary files /dev/null and b/source/images/arrangeCarousel_gray.png differ diff --git a/source/images/arrangeGrid_gray.png b/source/images/arrangeGrid_gray.png new file mode 100644 index 00000000..f8e066d3 Binary files /dev/null and b/source/images/arrangeGrid_gray.png differ diff --git a/source/images/arrangeList_gray.png b/source/images/arrangeList_gray.png new file mode 100644 index 00000000..59c6410b Binary files /dev/null and b/source/images/arrangeList_gray.png differ diff --git a/source/images/dvd_gray.png b/source/images/dvd_gray.png new file mode 100644 index 00000000..84cdeb1b Binary files /dev/null and b/source/images/dvd_gray.png differ diff --git a/source/images/favIcon_gray.png b/source/images/favIcon_gray.png new file mode 100644 index 00000000..cf28a899 Binary files /dev/null and b/source/images/favIcon_gray.png differ diff --git a/source/images/lock_gray.png b/source/images/lock_gray.png new file mode 100644 index 00000000..72db0075 Binary files /dev/null and b/source/images/lock_gray.png differ diff --git a/source/images/playCountIcon_gray.png b/source/images/playCountIcon_gray.png new file mode 100644 index 00000000..e8f09582 Binary files /dev/null and b/source/images/playCountIcon_gray.png differ diff --git a/source/images/rankIcon_gray.png b/source/images/rankIcon_gray.png new file mode 100644 index 00000000..6c1c77c4 Binary files /dev/null and b/source/images/rankIcon_gray.png differ diff --git a/source/images/searchIcon_gray.png b/source/images/searchIcon_gray.png new file mode 100644 index 00000000..6396ca65 Binary files /dev/null and b/source/images/searchIcon_gray.png differ diff --git a/source/images/unlock_gray.png b/source/images/unlock_gray.png new file mode 100644 index 00000000..8f6c90ea Binary files /dev/null and b/source/images/unlock_gray.png differ diff --git a/source/libwiigui/gui.h b/source/libwiigui/gui.h index e693493d..7aa4e475 100644 --- a/source/libwiigui/gui.h +++ b/source/libwiigui/gui.h @@ -40,7 +40,7 @@ #include #include #include -#include "pngu/pngu.h" +#include "gui_imagedata.h" #include "FreeTypeGX.h" #include "video.h" #include "filelist.h" @@ -558,41 +558,6 @@ class GuiWindow: public GuiElement std::vector _elements; //!< Contains all elements within the GuiWindow }; -//!Converts image data into GX-useable RGBA8. Currently designed for use only with PNG files -class GuiImageData -{ - public: - //!Constructor - //!Converts the image data to RGBA8 - expects PNG format - //!\param i Image data - GuiImageData(const u8 * i); - GuiImageData(const char * imgPath, const u8 * buffer); - GuiImageData(const u8 * img, int imgSize); - GuiImageData(const char *path, const char *file, const u8 * buffer, bool force_widescreen = false, - const u8 * wbuffer = NULL); - //!Destructor - ~GuiImageData(); - //!Gets a pointer to the image data - //!\return pointer to image data - u8 * GetImage(); - //!Gets the image width - //!\return image width - int GetWidth(); - //!Gets the image height - //!\return image height - int GetHeight(); - //!LoadJpeg file - void LoadJpeg(const u8 *img, int imgSize); - //!RawTo4x4RGBA - void RawTo4x4RGBA(const unsigned char *src, void *dst, const unsigned int width, const unsigned int height); - //!Sets the image to grayscale - void SetGrayscale(void); - protected: - u8 * data; //!< Image data - int height; //!< Height of image - int width; //!< Width of image -}; - //!Display, manage, and manipulate images in the GUI class GuiImage: public GuiElement { @@ -1078,9 +1043,8 @@ typedef struct _optionlist class GuiOptionBrowser: public GuiElement { public: - GuiOptionBrowser(int w, int h, OptionList * l, const u8 *imagebg, int scrollbar); - GuiOptionBrowser(int w, int h, OptionList * l, const char * themePath, const u8 *imagebg, int scrollbar, - int start); + GuiOptionBrowser(int w, int h, OptionList * l, const char *imagebg, int scrollbar); + GuiOptionBrowser(int w, int h, OptionList * l, const char *imagebg, int scrollbar, int start); ~GuiOptionBrowser(); void SetCol2Position(int x); int FindMenuItem(int c, int d); diff --git a/source/libwiigui/gui_customoptionbrowser.cpp b/source/libwiigui/gui_customoptionbrowser.cpp index eb88cca8..028d4088 100644 --- a/source/libwiigui/gui_customoptionbrowser.cpp +++ b/source/libwiigui/gui_customoptionbrowser.cpp @@ -141,8 +141,7 @@ void customOptionList::Clear(bool OnlyValue/*=false*/) /** * Constructor for the GuiCustomOptionBrowser class. */ -GuiCustomOptionBrowser::GuiCustomOptionBrowser(int w, int h, customOptionList * l, const char *themePath, - const char *custombg, const u8 *imagebg, int scrollon, int col2) +GuiCustomOptionBrowser::GuiCustomOptionBrowser(int w, int h, customOptionList * l, const char * custombg, int scrollon, int col2) { width = w; height = h; @@ -154,7 +153,6 @@ GuiCustomOptionBrowser::GuiCustomOptionBrowser(int w, int h, customOptionList * selectedItem = 0; focus = 1; // allow focus coL2 = col2; - char imgPath[100]; trigA = new GuiTrigger; trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -162,37 +160,31 @@ GuiCustomOptionBrowser::GuiCustomOptionBrowser(int w, int h, customOptionList * trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A, PAD_BUTTON_A); btnSoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); - snprintf(imgPath, sizeof(imgPath), "%s%s", themePath, custombg); - bgOptions = new GuiImageData(imgPath, imagebg); + bgOptions = Resources::GetImageData(custombg); bgOptionsImg = new GuiImage(bgOptions); bgOptionsImg->SetParent(this); bgOptionsImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - snprintf(imgPath, sizeof(imgPath), "%sbg_options_entry.png", themePath); - bgOptionsEntry = new GuiImageData(imgPath, bg_options_entry_png); + bgOptionsEntry = Resources::GetImageData("bg_options_entry.png"); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar.png", themePath); - scrollbar = new GuiImageData(imgPath, scrollbar_png); + scrollbar = Resources::GetImageData("scrollbar.png"); scrollbarImg = new GuiImage(scrollbar); scrollbarImg->SetParent(this); scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); scrollbarImg->SetPosition(0, 4); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_arrowdown.png", themePath); - arrowDown = new GuiImageData(imgPath, scrollbar_arrowdown_png); + arrowDown = Resources::GetImageData("scrollbar_arrowdown.png"); arrowDownImg = new GuiImage(arrowDown); - arrowDownOver = new GuiImageData(imgPath, scrollbar_arrowdown_png); + arrowDownOver = Resources::GetImageData("scrollbar_arrowdown.png"); arrowDownOverImg = new GuiImage(arrowDownOver); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_arrowup.png", themePath); - arrowUp = new GuiImageData(imgPath, scrollbar_arrowup_png); + arrowUp = Resources::GetImageData("scrollbar_arrowup.png"); arrowUpImg = new GuiImage(arrowUp); - arrowUpOver = new GuiImageData(imgPath, scrollbar_arrowup_png); + arrowUpOver = Resources::GetImageData("scrollbar_arrowup.png"); arrowUpOverImg = new GuiImage(arrowUpOver); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_box.png", themePath); - scrollbarBox = new GuiImageData(imgPath, scrollbar_box_png); + scrollbarBox = Resources::GetImageData("scrollbar_box.png"); scrollbarBoxImg = new GuiImage(scrollbarBox); - scrollbarBoxOver = new GuiImageData(imgPath, scrollbar_box_png); + scrollbarBoxOver = Resources::GetImageData("scrollbar_box.png"); scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver); arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); diff --git a/source/libwiigui/gui_customoptionbrowser.h b/source/libwiigui/gui_customoptionbrowser.h index 1c4bf32a..1e717995 100644 --- a/source/libwiigui/gui_customoptionbrowser.h +++ b/source/libwiigui/gui_customoptionbrowser.h @@ -44,8 +44,7 @@ class customOptionList class GuiCustomOptionBrowser: public GuiElement { public: - GuiCustomOptionBrowser(int w, int h, customOptionList * l, const char * themePath, const char *custombg, - const u8 *imagebg, int scrollbar, int col2); + GuiCustomOptionBrowser(int w, int h, customOptionList * l, const char * background, int scrollbar, int col2); ~GuiCustomOptionBrowser(); int FindMenuItem(int c, int d); int GetClickedOption(); diff --git a/source/libwiigui/gui_filebrowser.cpp b/source/libwiigui/gui_filebrowser.cpp index 1a226729..1e71fbdc 100644 --- a/source/libwiigui/gui_filebrowser.cpp +++ b/source/libwiigui/gui_filebrowser.cpp @@ -11,6 +11,7 @@ #include "gui.h" #include "prompts/filebrowser.h" #include "settings/CSettings.h" +#include "themes/CTheme.h" /** * Constructor for the GuiFileBrowser class. @@ -34,40 +35,27 @@ GuiFileBrowser::GuiFileBrowser(int w, int h) btnSoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, Settings.sfxvolume); btnSoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbg_browser.png", Settings.theme_path); - bgFileSelection = new GuiImageData(imgPath, bg_browser_png); + bgFileSelection = new GuiImageData(Resources::GetFile("bg_browser.png"), Resources::GetFileSize("bg_browser.png")); bgFileSelectionImg = new GuiImage(bgFileSelection); bgFileSelectionImg->SetParent(this); bgFileSelectionImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - snprintf(imgPath, sizeof(imgPath), "%sbg_browser_selection.png", Settings.theme_path); - bgFileSelectionEntry = new GuiImageData(imgPath, bg_browser_selection_png); - // fileArchives = new GuiImageData(icon_archives_png); - // fileDefault = new GuiImageData(icon_default_png); - fileFolder = new GuiImageData(icon_folder_png); - // fileGFX = new GuiImageData(icon_gfx_png); - // filePLS = new GuiImageData(icon_pls_png); - // fileSFX = new GuiImageData(icon_sfx_png); - // fileTXT = new GuiImageData(icon_txt_png); - // fileXML = new GuiImageData(icon_xml_png); - - snprintf(imgPath, sizeof(imgPath), "%sscrollbar.png", Settings.theme_path); - scrollbar = new GuiImageData(imgPath, scrollbar_png); + bgFileSelectionEntry = Resources::GetImageData("bg_browser_selection.png"); + + fileFolder = Resources::GetImageData("icon_folder.png"); + + scrollbar = Resources::GetImageData("scrollbar.png"); scrollbarImg = new GuiImage(scrollbar); scrollbarImg->SetParent(this); scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); scrollbarImg->SetPosition(0, 2); scrollbarImg->SetSkew(0, 0, 0, 0, 0, -30, 0, -30); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_arrowdown.png", Settings.theme_path); - arrowDown = new GuiImageData(imgPath, scrollbar_arrowdown_png); + arrowDown = Resources::GetImageData("scrollbar_arrowdown.png"); arrowDownImg = new GuiImage(arrowDown); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_arrowup.png", Settings.theme_path); - arrowUp = new GuiImageData(imgPath, scrollbar_arrowup_png); + arrowUp = Resources::GetImageData("scrollbar_arrowup.png"); arrowUpImg = new GuiImage(arrowUp); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_box.png", Settings.theme_path); - scrollbarBox = new GuiImageData(imgPath, scrollbar_box_png); + scrollbarBox = Resources::GetImageData("scrollbar_box.png"); scrollbarBoxImg = new GuiImage(scrollbarBox); arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); diff --git a/source/libwiigui/gui_gamebrowser.cpp b/source/libwiigui/gui_gamebrowser.cpp index 95b07f6f..0351b520 100644 --- a/source/libwiigui/gui_gamebrowser.cpp +++ b/source/libwiigui/gui_gamebrowser.cpp @@ -1,627 +1,618 @@ -/**************************************************************************** - * libwiigui - * - * gui_gamebrowser.cpp - * - * GUI class definitions - ***************************************************************************/ - -#include "gui.h" -#include "../wpad.h" - -#include -#include "gui_gamebrowser.h" -#include "../settings/CSettings.h" -#include "../main.h" -#include "settings/newtitles.h" -#include "usbloader/GameList.h" -#include "themes/CTheme.h" - -#include -#include - -#define GAMESELECTSIZE 30 -int txtscroll = 0; -/** - * Constructor for the GuiGameBrowser class. - */ -GuiGameBrowser::GuiGameBrowser(int w, int h, const char *themePath, const u8 *imagebg, int selected, int offset) -{ - width = w; - height = h; - pagesize = Theme.pagesize; - scrollbaron = (gameList.size() > pagesize) ? 1 : 0; - selectable = true; - listOffset = MAX( 0, MIN( offset, ( gameList.size() - pagesize ) ) ); - selectedItem = selected - offset; - focus = 1; // allow focus - char imgPath[100]; - - trigA = new GuiTrigger; - trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); - trigHeldA = new GuiTrigger; - trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A, PAD_BUTTON_A); - btnSoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); - - snprintf(imgPath, sizeof(imgPath), "%sbg_options.png", themePath); - bgGames = new GuiImageData(imgPath, imagebg); - - snprintf(imgPath, sizeof(imgPath), "%snew.png", themePath); - newGames = new GuiImageData(imgPath, new_png); - - bgGameImg = new GuiImage(bgGames); - bgGameImg->SetParent(this); - bgGameImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - - maxTextWidth = bgGameImg->GetWidth() - 24 - 4; - - snprintf(imgPath, sizeof(imgPath), "%sbg_options_entry.png", themePath); - bgGamesEntry = new GuiImageData(imgPath, bg_options_entry_png); - - snprintf(imgPath, sizeof(imgPath), "%sscrollbar.png", themePath); - scrollbar = new GuiImageData(imgPath, scrollbar_png); - scrollbarImg = new GuiImage(scrollbar); - scrollbarImg->SetParent(this); - scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); - scrollbarImg->SetPosition(0, 4); - - maxTextWidth -= scrollbarImg->GetWidth() + 4; - - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_arrowdown.png", themePath); - arrowDown = new GuiImageData(imgPath, scrollbar_arrowdown_png); - arrowDownImg = new GuiImage(arrowDown); - arrowDownOver = new GuiImageData(imgPath, scrollbar_arrowdown_png); - arrowDownOverImg = new GuiImage(arrowDownOver); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_arrowup.png", themePath); - arrowUp = new GuiImageData(imgPath, scrollbar_arrowup_png); - arrowUpImg = new GuiImage(arrowUp); - arrowUpOver = new GuiImageData(imgPath, scrollbar_arrowup_png); - arrowUpOverImg = new GuiImage(arrowUpOver); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_box.png", themePath); - scrollbarBox = new GuiImageData(imgPath, scrollbar_box_png); - scrollbarBoxImg = new GuiImage(scrollbarBox); - scrollbarBoxOver = new GuiImageData(imgPath, scrollbar_box_png); - scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver); - - arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); - arrowUpBtn->SetParent(this); - arrowUpBtn->SetImage(arrowUpImg); - arrowUpBtn->SetImageOver(arrowUpOverImg); - arrowUpBtn->SetImageHold(arrowUpOverImg); - arrowUpBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - arrowUpBtn->SetPosition(width / 2 - 18 + 7, -18); - arrowUpBtn->SetSelectable(false); - arrowUpBtn->SetTrigger(trigA); - arrowUpBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowUpBtn->SetSoundClick(btnSoundClick); - - arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); - arrowDownBtn->SetParent(this); - arrowDownBtn->SetImage(arrowDownImg); - arrowDownBtn->SetImageOver(arrowDownOverImg); - arrowDownBtn->SetImageHold(arrowDownOverImg); - arrowDownBtn->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); - arrowDownBtn->SetPosition(width / 2 - 18 + 7, 18); - arrowDownBtn->SetSelectable(false); - arrowDownBtn->SetTrigger(trigA); - arrowDownBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); - arrowDownBtn->SetSoundClick(btnSoundClick); - - scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->GetWidth(), scrollbarBoxImg->GetHeight()); - scrollbarBoxBtn->SetParent(this); - scrollbarBoxBtn->SetImage(scrollbarBoxImg); - scrollbarBoxBtn->SetImageOver(scrollbarBoxOverImg); - scrollbarBoxBtn->SetImageHold(scrollbarBoxOverImg); - scrollbarBoxBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - scrollbarBoxBtn->SetSelectable(false); - scrollbarBoxBtn->SetEffectOnOver(EFFECT_SCALE, 50, 120); - scrollbarBoxBtn->SetMinY(0); - scrollbarBoxBtn->SetMaxY(height - 30); - scrollbarBoxBtn->SetHoldable(true); - scrollbarBoxBtn->SetTrigger(trigHeldA); - - gameIndex = new int[pagesize]; - game = new GuiButton *[pagesize]; - gameTxt = new GuiText *[pagesize]; - gameTxtOver = new GuiText *[pagesize]; - gameBg = new GuiImage *[pagesize]; - newImg = new GuiImage *[pagesize]; - - for (int i = 0; i < pagesize; i++) - { - gameTxt[i] = new GuiText(get_title(gameList[i]), 20, Theme.gametext); - gameTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - gameTxt[i]->SetPosition(24, 0); - gameTxt[i]->SetMaxWidth(maxTextWidth, DOTTED); - - gameTxtOver[i] = new GuiText(get_title(gameList[i]), 20, Theme.gametext); - gameTxtOver[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - gameTxtOver[i]->SetPosition(24, 0); - gameTxtOver[i]->SetMaxWidth(maxTextWidth, SCROLL_HORIZONTAL); - - gameBg[i] = new GuiImage(bgGamesEntry); - - newImg[i] = new GuiImage(newGames); - newImg[i]->SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE); - newImg[i]->SetVisible(false); - - game[i] = new GuiButton(width - 28, GAMESELECTSIZE); - game[i]->SetParent(this); - game[i]->SetLabel(gameTxt[i]); - game[i]->SetLabelOver(gameTxtOver[i]); - game[i]->SetIcon(newImg[i]); - game[i]->SetImageOver(gameBg[i]); - game[i]->SetPosition(5, GAMESELECTSIZE * i + 4); - game[i]->SetRumble(false); - game[i]->SetTrigger(trigA); - game[i]->SetSoundClick(btnSoundClick); - - gameIndex[i] = i; - } - UpdateListEntries(); -} - -/** - * Destructor for the GuiGameBrowser class. - */ -GuiGameBrowser::~GuiGameBrowser() -{ - delete arrowUpBtn; - delete arrowDownBtn; - delete scrollbarBoxBtn; - delete scrollbarImg; - delete arrowDownImg; - delete arrowDownOverImg; - delete arrowUpImg; - delete arrowUpOverImg; - delete scrollbarBoxImg; - delete scrollbarBoxOverImg; - delete scrollbar; - delete arrowDown; - delete arrowDownOver; - delete arrowUp; - delete arrowUpOver; - delete scrollbarBox; - delete scrollbarBoxOver; - delete bgGameImg; - delete bgGames; - delete bgGamesEntry; - delete newGames; - - delete trigA; - delete trigHeldA; - delete btnSoundClick; - - for (int i = 0; i < pagesize; i++) - { - delete gameTxt[i]; - delete gameTxtOver[i]; - delete gameBg[i]; - delete game[i]; - delete newImg[i]; - } - delete[] gameIndex; - delete[] game; - delete[] gameTxt; - delete[] gameTxtOver; - delete[] gameBg; -} - -void GuiGameBrowser::SetFocus(int f) -{ - LOCK( this ); - if (!gameList.size()) return; - - focus = f; - - for (int i = 0; i < pagesize; i++) - game[i]->ResetState(); - - if (f == 1) game[selectedItem]->SetState(STATE_SELECTED); -} - -void GuiGameBrowser::ResetState() -{ - LOCK( this ); - if (state != STATE_DISABLED) - { - state = STATE_DEFAULT; - stateChan = -1; - } - - for (int i = 0; i < pagesize; i++) - { - game[i]->ResetState(); - } -} - -int GuiGameBrowser::GetOffset() -{ - return listOffset; -} -int GuiGameBrowser::GetClickedOption() -{ - int found = -1; - for (int i = 0; i < pagesize; i++) - { - if (game[i]->GetState() == STATE_CLICKED) - { - game[i]->SetState(STATE_SELECTED); - found = gameIndex[i]; - break; - } - } - return found; -} - -int GuiGameBrowser::GetSelectedOption() -{ - int found = -1; - for (int i = 0; i < pagesize; i++) - { - if (game[i]->GetState() == STATE_SELECTED) - { - game[i]->SetState(STATE_SELECTED); - found = gameIndex[i]; - break; - } - } - return found; -} - -/**************************************************************************** - * FindMenuItem - * - * Help function to find the next visible menu item on the list - ***************************************************************************/ - -int GuiGameBrowser::FindMenuItem(int currentItem, int direction) -{ - int nextItem = currentItem + direction; - - if (nextItem < 0 || nextItem >= gameList.size()) return -1; - - if (strlen(get_title(gameList[nextItem])) > 0) - return nextItem; - else return FindMenuItem(nextItem, direction); -} - -/** - * Draw the button on screen - */ -void GuiGameBrowser::Draw() -{ - LOCK( this ); - if (!this->IsVisible() || !gameList.size()) return; - - bgGameImg->Draw(); - - int next = listOffset; - - for (int i = 0; i < pagesize; i++) - { - if (next >= 0) - { - game[i]->Draw(); - next = this->FindMenuItem(next, 1); - } - else break; - } - - if (scrollbaron == 1) - { - scrollbarImg->Draw(); - arrowUpBtn->Draw(); - arrowDownBtn->Draw(); - scrollbarBoxBtn->Draw(); - } - this->UpdateEffects(); -} - -void GuiGameBrowser::UpdateListEntries() -{ - int next = listOffset; - for (int i = 0; i < pagesize; i++) - { - if (next >= 0) - { - if (game[i]->GetState() == STATE_DISABLED) - { - game[i]->SetVisible(true); - game[i]->SetState(STATE_DEFAULT); - } - gameTxt[i]->SetText(get_title(gameList[next])); - gameTxt[i]->SetPosition(24, 0); - gameTxtOver[i]->SetText(get_title(gameList[next])); - gameTxtOver[i]->SetPosition(24, 0); - - if (Settings.marknewtitles) - { - bool isNew = NewTitles::Instance()->IsNew(gameList[next]->id); - if (isNew) - { - gameTxt[i]->SetMaxWidth(maxTextWidth - (newGames->GetWidth() + 1), DOTTED); - gameTxtOver[i]->SetMaxWidth(maxTextWidth - (newGames->GetWidth() + 1), SCROLL_HORIZONTAL); - } - else - { - gameTxt[i]->SetMaxWidth(maxTextWidth, DOTTED); - gameTxtOver[i]->SetMaxWidth(maxTextWidth, SCROLL_HORIZONTAL); - } - newImg[i]->SetVisible(isNew); - } - - gameIndex[i] = next; - next = this->FindMenuItem(next, 1); - } - else - { - game[i]->SetVisible(false); - game[i]->SetState(STATE_DISABLED); - } - } -} - -void GuiGameBrowser::Update(GuiTrigger * t) -{ - LOCK( this ); - if (state == STATE_DISABLED || !t || !gameList.size()) return; - - int next, prev; - int old_listOffset = listOffset; - static int position2; - // scrolldelay affects how fast the list scrolls - // when the arrows are clicked - float scrolldelay = 3.5; - - if (scrollbaron == 1) - { - // update the location of the scroll box based on the position in the option list - arrowUpBtn->Update(t); - arrowDownBtn->Update(t); - scrollbarBoxBtn->Update(t); - } - - next = listOffset; - - u32 buttonshold = ButtonsHold(); - - if (buttonshold != WPAD_BUTTON_UP && buttonshold != WPAD_BUTTON_DOWN) - { - - for (int i = 0; i < pagesize; i++) - { - if (next >= 0) next = this->FindMenuItem(next, 1); - - if (focus) - { - if (i != selectedItem && game[i]->GetState() == STATE_SELECTED) - game[i]->ResetState(); - else if (i == selectedItem && game[i]->GetState() == STATE_DEFAULT) game[selectedItem]->SetState( - STATE_SELECTED, t->chan); - } - - game[i]->Update(t); - - if (game[i]->GetState() == STATE_SELECTED) - { - selectedItem = i; - } - } - } - - // pad and joystick navigation - if (!focus || !gameList.size()) return; // skip navigation - - if (scrollbaron == 1) - { - - if (t->Down() || arrowDownBtn->GetState() == STATE_CLICKED || arrowDownBtn->GetState() == STATE_HELD) //down - { - - next = this->FindMenuItem(gameIndex[selectedItem], 1); - - if (next >= 0) - { - if (selectedItem == pagesize - 1) - { - // move list down by 1 - listOffset = this->FindMenuItem(listOffset, 1); - } - else if (game[selectedItem + 1]->IsVisible()) - { - game[selectedItem]->ResetState(); - game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); - selectedItem++; - } - // scrollbarBoxBtn->Draw(); - usleep(10000 * scrolldelay); - } - if (!(ButtonsHold() & WPAD_BUTTON_A)) arrowDownBtn->ResetState(); - } - else if (t->Up() || arrowUpBtn->GetState() == STATE_CLICKED || arrowUpBtn->GetState() == STATE_HELD) //up - { - prev = this->FindMenuItem(gameIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - } - else - { - game[selectedItem]->ResetState(); - game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - // scrollbarBoxBtn->Draw(); - usleep(10000 * scrolldelay); - } - if (!(ButtonsHold() & WPAD_BUTTON_A)) arrowUpBtn->ResetState(); - } - int position1 = t->wpad.ir.y; - - if (position2 == 0 && position1 > 0) - { - position2 = position1; - } - - if ((buttonshold & WPAD_BUTTON_B) && position1 > 0) - { - scrollbarBoxBtn->ScrollIsOn(1); - if (position2 > position1) - { - - prev = this->FindMenuItem(gameIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - } - else - { - game[selectedItem]->ResetState(); - game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - // scrollbarBoxBtn->Draw(); - usleep(10000 * scrolldelay); - } - } - else if (position2 < position1) - { - next = this->FindMenuItem(gameIndex[selectedItem], 1); - - if (next >= 0) - { - if (selectedItem == pagesize - 1) - { - // move list down by 1 - listOffset = this->FindMenuItem(listOffset, 1); - } - else if (game[selectedItem + 1]->IsVisible()) - { - game[selectedItem]->ResetState(); - game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); - selectedItem++; - } - // scrollbarBoxBtn->Draw(); - usleep(10000 * scrolldelay); - } - } - - } - else if (!(buttonshold & WPAD_BUTTON_B)) - { - scrollbarBoxBtn->ScrollIsOn(0); - position2 = 0; - } - - if (scrollbarBoxBtn->GetState() == STATE_HELD && scrollbarBoxBtn->GetStateChan() == t->chan && t->wpad.ir.valid - && gameList.size() > pagesize) - { - // allow dragging of scrollbar box - scrollbarBoxBtn->SetPosition(width / 2 - 18 + 7, 0); - int position = t->wpad.ir.y - 32 - scrollbarBoxBtn->GetTop(); - - listOffset = (position * gameList.size()) / (25.2 * pagesize) - selectedItem; - - if (listOffset <= 0) - { - listOffset = 0; - selectedItem = 0; - } - else if (listOffset + pagesize >= gameList.size()) - { - listOffset = gameList.size() - pagesize; - selectedItem = pagesize - 1; - } - - } - int positionbar = (25.2 * pagesize) * (listOffset + selectedItem) / gameList.size(); - - if (positionbar > (24 * pagesize)) positionbar = (24 * pagesize); - scrollbarBoxBtn->SetPosition(width / 2 - 18 + 7, positionbar + 8); - - if (t->Right()) //skip pagesize # of games if right is pressed - { - if (listOffset < gameList.size() && gameList.size() > pagesize) - { - listOffset = listOffset + pagesize; - if (listOffset + pagesize >= gameList.size()) listOffset = gameList.size() - pagesize; - } - } - else if (t->Left()) - { - if (listOffset > 0) - { - listOffset = listOffset - pagesize; - if (listOffset < 0) listOffset = 0; - } - } - - } - else - { - if (t->Down()) //if there isn't a scrollbar and down is pressed - { - next = this->FindMenuItem(gameIndex[selectedItem], 1); - - if (next >= 0) - { - if (selectedItem == pagesize - 1) - { - // move list down by 1 - listOffset = this->FindMenuItem(listOffset, 1); - } - else if (game[selectedItem + 1]->IsVisible()) - { - game[selectedItem]->ResetState(); - game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); - selectedItem++; - } - } - } - else if (t->Up()) //up - { - prev = this->FindMenuItem(gameIndex[selectedItem], -1); - - if (prev >= 0) - { - if (selectedItem == 0) - { - // move list up by 1 - listOffset = prev; - } - else - { - game[selectedItem]->ResetState(); - game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); - selectedItem--; - } - } - } - } - - if (old_listOffset != listOffset) UpdateListEntries(); - - if (updateCB) updateCB(this); -} - -void GuiGameBrowser::Reload() -{ - LOCK( this ); - scrollbaron = (gameList.size() > pagesize) ? 1 : 0; - selectedItem = 0; - listOffset = 0; - focus = 1; - UpdateListEntries(); - - for (int i = 0; i < pagesize; i++) - game[i]->ResetState(); -} +/**************************************************************************** + * libwiigui + * + * gui_gamebrowser.cpp + * + * GUI class definitions + ***************************************************************************/ + +#include "gui.h" +#include "../wpad.h" + +#include +#include "gui_gamebrowser.h" +#include "../settings/CSettings.h" +#include "../main.h" +#include "settings/newtitles.h" +#include "usbloader/GameList.h" +#include "themes/CTheme.h" + +#include +#include + +#define GAMESELECTSIZE 30 +int txtscroll = 0; +/** + * Constructor for the GuiGameBrowser class. + */ +GuiGameBrowser::GuiGameBrowser(int w, int h, int selected, int offset) +{ + width = w; + height = h; + pagesize = Theme.pagesize; + scrollbaron = (gameList.size() > pagesize) ? 1 : 0; + selectable = true; + listOffset = MAX( 0, MIN( offset, ( gameList.size() - pagesize ) ) ); + selectedItem = selected - offset; + focus = 1; // allow focus + + trigA = new GuiTrigger; + trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); + trigHeldA = new GuiTrigger; + trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A, PAD_BUTTON_A); + btnSoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); + + bgGames = Resources::GetImageData("bg_options.png"); + newGames = Resources::GetImageData("new.png"); + + bgGameImg = new GuiImage(bgGames); + bgGameImg->SetParent(this); + bgGameImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + + maxTextWidth = bgGameImg->GetWidth() - 24 - 4; + + bgGamesEntry = Resources::GetImageData("bg_options_entry.png"); + + scrollbar = Resources::GetImageData("sscrollbar.png"); + scrollbarImg = new GuiImage(scrollbar); + scrollbarImg->SetParent(this); + scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); + scrollbarImg->SetPosition(0, 4); + + maxTextWidth -= scrollbarImg->GetWidth() + 4; + + arrowDown = Resources::GetImageData("scrollbar_arrowdown.png"); + arrowDownImg = new GuiImage(arrowDown); + arrowDownOver = Resources::GetImageData("scrollbar_arrowdown.png"); + arrowDownOverImg = new GuiImage(arrowDownOver); + arrowUp = Resources::GetImageData("scrollbar_arrowup.png"); + arrowUpImg = new GuiImage(arrowUp); + arrowUpOver = Resources::GetImageData("scrollbar_arrowup.png"); + arrowUpOverImg = new GuiImage(arrowUpOver); + scrollbarBox = Resources::GetImageData("scrollbar_box.png"); + scrollbarBoxImg = new GuiImage(scrollbarBox); + scrollbarBoxOver = Resources::GetImageData("scrollbar_box.png"); + scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver); + + arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); + arrowUpBtn->SetParent(this); + arrowUpBtn->SetImage(arrowUpImg); + arrowUpBtn->SetImageOver(arrowUpOverImg); + arrowUpBtn->SetImageHold(arrowUpOverImg); + arrowUpBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + arrowUpBtn->SetPosition(width / 2 - 18 + 7, -18); + arrowUpBtn->SetSelectable(false); + arrowUpBtn->SetTrigger(trigA); + arrowUpBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); + arrowUpBtn->SetSoundClick(btnSoundClick); + + arrowDownBtn = new GuiButton(arrowDownImg->GetWidth(), arrowDownImg->GetHeight()); + arrowDownBtn->SetParent(this); + arrowDownBtn->SetImage(arrowDownImg); + arrowDownBtn->SetImageOver(arrowDownOverImg); + arrowDownBtn->SetImageHold(arrowDownOverImg); + arrowDownBtn->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM); + arrowDownBtn->SetPosition(width / 2 - 18 + 7, 18); + arrowDownBtn->SetSelectable(false); + arrowDownBtn->SetTrigger(trigA); + arrowDownBtn->SetEffectOnOver(EFFECT_SCALE, 50, 130); + arrowDownBtn->SetSoundClick(btnSoundClick); + + scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->GetWidth(), scrollbarBoxImg->GetHeight()); + scrollbarBoxBtn->SetParent(this); + scrollbarBoxBtn->SetImage(scrollbarBoxImg); + scrollbarBoxBtn->SetImageOver(scrollbarBoxOverImg); + scrollbarBoxBtn->SetImageHold(scrollbarBoxOverImg); + scrollbarBoxBtn->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); + scrollbarBoxBtn->SetSelectable(false); + scrollbarBoxBtn->SetEffectOnOver(EFFECT_SCALE, 50, 120); + scrollbarBoxBtn->SetMinY(0); + scrollbarBoxBtn->SetMaxY(height - 30); + scrollbarBoxBtn->SetHoldable(true); + scrollbarBoxBtn->SetTrigger(trigHeldA); + + gameIndex = new int[pagesize]; + game = new GuiButton *[pagesize]; + gameTxt = new GuiText *[pagesize]; + gameTxtOver = new GuiText *[pagesize]; + gameBg = new GuiImage *[pagesize]; + newImg = new GuiImage *[pagesize]; + + for (int i = 0; i < pagesize; i++) + { + gameTxt[i] = new GuiText(get_title(gameList[i]), 20, Theme.gametext); + gameTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + gameTxt[i]->SetPosition(24, 0); + gameTxt[i]->SetMaxWidth(maxTextWidth, DOTTED); + + gameTxtOver[i] = new GuiText(get_title(gameList[i]), 20, Theme.gametext); + gameTxtOver[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); + gameTxtOver[i]->SetPosition(24, 0); + gameTxtOver[i]->SetMaxWidth(maxTextWidth, SCROLL_HORIZONTAL); + + gameBg[i] = new GuiImage(bgGamesEntry); + + newImg[i] = new GuiImage(newGames); + newImg[i]->SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE); + newImg[i]->SetVisible(false); + + game[i] = new GuiButton(width - 28, GAMESELECTSIZE); + game[i]->SetParent(this); + game[i]->SetLabel(gameTxt[i]); + game[i]->SetLabelOver(gameTxtOver[i]); + game[i]->SetIcon(newImg[i]); + game[i]->SetImageOver(gameBg[i]); + game[i]->SetPosition(5, GAMESELECTSIZE * i + 4); + game[i]->SetRumble(false); + game[i]->SetTrigger(trigA); + game[i]->SetSoundClick(btnSoundClick); + + gameIndex[i] = i; + } + UpdateListEntries(); +} + +/** + * Destructor for the GuiGameBrowser class. + */ +GuiGameBrowser::~GuiGameBrowser() +{ + delete arrowUpBtn; + delete arrowDownBtn; + delete scrollbarBoxBtn; + delete scrollbarImg; + delete arrowDownImg; + delete arrowDownOverImg; + delete arrowUpImg; + delete arrowUpOverImg; + delete scrollbarBoxImg; + delete scrollbarBoxOverImg; + delete scrollbar; + delete arrowDown; + delete arrowDownOver; + delete arrowUp; + delete arrowUpOver; + delete scrollbarBox; + delete scrollbarBoxOver; + delete bgGameImg; + delete bgGames; + delete bgGamesEntry; + delete newGames; + + delete trigA; + delete trigHeldA; + delete btnSoundClick; + + for (int i = 0; i < pagesize; i++) + { + delete gameTxt[i]; + delete gameTxtOver[i]; + delete gameBg[i]; + delete game[i]; + delete newImg[i]; + } + delete[] gameIndex; + delete[] game; + delete[] gameTxt; + delete[] gameTxtOver; + delete[] gameBg; +} + +void GuiGameBrowser::SetFocus(int f) +{ + LOCK( this ); + if (!gameList.size()) return; + + focus = f; + + for (int i = 0; i < pagesize; i++) + game[i]->ResetState(); + + if (f == 1) game[selectedItem]->SetState(STATE_SELECTED); +} + +void GuiGameBrowser::ResetState() +{ + LOCK( this ); + if (state != STATE_DISABLED) + { + state = STATE_DEFAULT; + stateChan = -1; + } + + for (int i = 0; i < pagesize; i++) + { + game[i]->ResetState(); + } +} + +int GuiGameBrowser::GetOffset() +{ + return listOffset; +} +int GuiGameBrowser::GetClickedOption() +{ + int found = -1; + for (int i = 0; i < pagesize; i++) + { + if (game[i]->GetState() == STATE_CLICKED) + { + game[i]->SetState(STATE_SELECTED); + found = gameIndex[i]; + break; + } + } + return found; +} + +int GuiGameBrowser::GetSelectedOption() +{ + int found = -1; + for (int i = 0; i < pagesize; i++) + { + if (game[i]->GetState() == STATE_SELECTED) + { + game[i]->SetState(STATE_SELECTED); + found = gameIndex[i]; + break; + } + } + return found; +} + +/**************************************************************************** + * FindMenuItem + * + * Help function to find the next visible menu item on the list + ***************************************************************************/ + +int GuiGameBrowser::FindMenuItem(int currentItem, int direction) +{ + int nextItem = currentItem + direction; + + if (nextItem < 0 || nextItem >= gameList.size()) return -1; + + if (strlen(get_title(gameList[nextItem])) > 0) + return nextItem; + else return FindMenuItem(nextItem, direction); +} + +/** + * Draw the button on screen + */ +void GuiGameBrowser::Draw() +{ + LOCK( this ); + if (!this->IsVisible() || !gameList.size()) return; + + bgGameImg->Draw(); + + int next = listOffset; + + for (int i = 0; i < pagesize; i++) + { + if (next >= 0) + { + game[i]->Draw(); + next = this->FindMenuItem(next, 1); + } + else break; + } + + if (scrollbaron == 1) + { + scrollbarImg->Draw(); + arrowUpBtn->Draw(); + arrowDownBtn->Draw(); + scrollbarBoxBtn->Draw(); + } + this->UpdateEffects(); +} + +void GuiGameBrowser::UpdateListEntries() +{ + int next = listOffset; + for (int i = 0; i < pagesize; i++) + { + if (next >= 0) + { + if (game[i]->GetState() == STATE_DISABLED) + { + game[i]->SetVisible(true); + game[i]->SetState(STATE_DEFAULT); + } + gameTxt[i]->SetText(get_title(gameList[next])); + gameTxt[i]->SetPosition(24, 0); + gameTxtOver[i]->SetText(get_title(gameList[next])); + gameTxtOver[i]->SetPosition(24, 0); + + if (Settings.marknewtitles) + { + bool isNew = NewTitles::Instance()->IsNew(gameList[next]->id); + if (isNew) + { + gameTxt[i]->SetMaxWidth(maxTextWidth - (newGames->GetWidth() + 1), DOTTED); + gameTxtOver[i]->SetMaxWidth(maxTextWidth - (newGames->GetWidth() + 1), SCROLL_HORIZONTAL); + } + else + { + gameTxt[i]->SetMaxWidth(maxTextWidth, DOTTED); + gameTxtOver[i]->SetMaxWidth(maxTextWidth, SCROLL_HORIZONTAL); + } + newImg[i]->SetVisible(isNew); + } + + gameIndex[i] = next; + next = this->FindMenuItem(next, 1); + } + else + { + game[i]->SetVisible(false); + game[i]->SetState(STATE_DISABLED); + } + } +} + +void GuiGameBrowser::Update(GuiTrigger * t) +{ + LOCK( this ); + if (state == STATE_DISABLED || !t || !gameList.size()) return; + + int next, prev; + int old_listOffset = listOffset; + static int position2; + // scrolldelay affects how fast the list scrolls + // when the arrows are clicked + float scrolldelay = 3.5; + + if (scrollbaron == 1) + { + // update the location of the scroll box based on the position in the option list + arrowUpBtn->Update(t); + arrowDownBtn->Update(t); + scrollbarBoxBtn->Update(t); + } + + next = listOffset; + + u32 buttonshold = ButtonsHold(); + + if (buttonshold != WPAD_BUTTON_UP && buttonshold != WPAD_BUTTON_DOWN) + { + + for (int i = 0; i < pagesize; i++) + { + if (next >= 0) next = this->FindMenuItem(next, 1); + + if (focus) + { + if (i != selectedItem && game[i]->GetState() == STATE_SELECTED) + game[i]->ResetState(); + else if (i == selectedItem && game[i]->GetState() == STATE_DEFAULT) game[selectedItem]->SetState( + STATE_SELECTED, t->chan); + } + + game[i]->Update(t); + + if (game[i]->GetState() == STATE_SELECTED) + { + selectedItem = i; + } + } + } + + // pad and joystick navigation + if (!focus || !gameList.size()) return; // skip navigation + + if (scrollbaron == 1) + { + + if (t->Down() || arrowDownBtn->GetState() == STATE_CLICKED || arrowDownBtn->GetState() == STATE_HELD) //down + { + + next = this->FindMenuItem(gameIndex[selectedItem], 1); + + if (next >= 0) + { + if (selectedItem == pagesize - 1) + { + // move list down by 1 + listOffset = this->FindMenuItem(listOffset, 1); + } + else if (game[selectedItem + 1]->IsVisible()) + { + game[selectedItem]->ResetState(); + game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); + selectedItem++; + } + // scrollbarBoxBtn->Draw(); + usleep(10000 * scrolldelay); + } + if (!(ButtonsHold() & WPAD_BUTTON_A)) arrowDownBtn->ResetState(); + } + else if (t->Up() || arrowUpBtn->GetState() == STATE_CLICKED || arrowUpBtn->GetState() == STATE_HELD) //up + { + prev = this->FindMenuItem(gameIndex[selectedItem], -1); + + if (prev >= 0) + { + if (selectedItem == 0) + { + // move list up by 1 + listOffset = prev; + } + else + { + game[selectedItem]->ResetState(); + game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); + selectedItem--; + } + // scrollbarBoxBtn->Draw(); + usleep(10000 * scrolldelay); + } + if (!(ButtonsHold() & WPAD_BUTTON_A)) arrowUpBtn->ResetState(); + } + int position1 = t->wpad.ir.y; + + if (position2 == 0 && position1 > 0) + { + position2 = position1; + } + + if ((buttonshold & WPAD_BUTTON_B) && position1 > 0) + { + scrollbarBoxBtn->ScrollIsOn(1); + if (position2 > position1) + { + + prev = this->FindMenuItem(gameIndex[selectedItem], -1); + + if (prev >= 0) + { + if (selectedItem == 0) + { + // move list up by 1 + listOffset = prev; + } + else + { + game[selectedItem]->ResetState(); + game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); + selectedItem--; + } + // scrollbarBoxBtn->Draw(); + usleep(10000 * scrolldelay); + } + } + else if (position2 < position1) + { + next = this->FindMenuItem(gameIndex[selectedItem], 1); + + if (next >= 0) + { + if (selectedItem == pagesize - 1) + { + // move list down by 1 + listOffset = this->FindMenuItem(listOffset, 1); + } + else if (game[selectedItem + 1]->IsVisible()) + { + game[selectedItem]->ResetState(); + game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); + selectedItem++; + } + // scrollbarBoxBtn->Draw(); + usleep(10000 * scrolldelay); + } + } + + } + else if (!(buttonshold & WPAD_BUTTON_B)) + { + scrollbarBoxBtn->ScrollIsOn(0); + position2 = 0; + } + + if (scrollbarBoxBtn->GetState() == STATE_HELD && scrollbarBoxBtn->GetStateChan() == t->chan && t->wpad.ir.valid + && gameList.size() > pagesize) + { + // allow dragging of scrollbar box + scrollbarBoxBtn->SetPosition(width / 2 - 18 + 7, 0); + int position = t->wpad.ir.y - 32 - scrollbarBoxBtn->GetTop(); + + listOffset = (position * gameList.size()) / (25.2 * pagesize) - selectedItem; + + if (listOffset <= 0) + { + listOffset = 0; + selectedItem = 0; + } + else if (listOffset + pagesize >= gameList.size()) + { + listOffset = gameList.size() - pagesize; + selectedItem = pagesize - 1; + } + + } + int positionbar = (25.2 * pagesize) * (listOffset + selectedItem) / gameList.size(); + + if (positionbar > (24 * pagesize)) positionbar = (24 * pagesize); + scrollbarBoxBtn->SetPosition(width / 2 - 18 + 7, positionbar + 8); + + if (t->Right()) //skip pagesize # of games if right is pressed + { + if (listOffset < gameList.size() && gameList.size() > pagesize) + { + listOffset = listOffset + pagesize; + if (listOffset + pagesize >= gameList.size()) listOffset = gameList.size() - pagesize; + } + } + else if (t->Left()) + { + if (listOffset > 0) + { + listOffset = listOffset - pagesize; + if (listOffset < 0) listOffset = 0; + } + } + + } + else + { + if (t->Down()) //if there isn't a scrollbar and down is pressed + { + next = this->FindMenuItem(gameIndex[selectedItem], 1); + + if (next >= 0) + { + if (selectedItem == pagesize - 1) + { + // move list down by 1 + listOffset = this->FindMenuItem(listOffset, 1); + } + else if (game[selectedItem + 1]->IsVisible()) + { + game[selectedItem]->ResetState(); + game[selectedItem + 1]->SetState(STATE_SELECTED, t->chan); + selectedItem++; + } + } + } + else if (t->Up()) //up + { + prev = this->FindMenuItem(gameIndex[selectedItem], -1); + + if (prev >= 0) + { + if (selectedItem == 0) + { + // move list up by 1 + listOffset = prev; + } + else + { + game[selectedItem]->ResetState(); + game[selectedItem - 1]->SetState(STATE_SELECTED, t->chan); + selectedItem--; + } + } + } + } + + if (old_listOffset != listOffset) UpdateListEntries(); + + if (updateCB) updateCB(this); +} + +void GuiGameBrowser::Reload() +{ + LOCK( this ); + scrollbaron = (gameList.size() > pagesize) ? 1 : 0; + selectedItem = 0; + listOffset = 0; + focus = 1; + UpdateListEntries(); + + for (int i = 0; i < pagesize; i++) + game[i]->ResetState(); +} diff --git a/source/libwiigui/gui_gamebrowser.h b/source/libwiigui/gui_gamebrowser.h index e7f9768e..c8370dc9 100644 --- a/source/libwiigui/gui_gamebrowser.h +++ b/source/libwiigui/gui_gamebrowser.h @@ -7,7 +7,7 @@ class GuiGameBrowser: public GuiElement { public: - GuiGameBrowser(int w, int h, const char *themePath, const u8 *imagebg, int selected = 0, int offset = 0); + GuiGameBrowser(int w, int h, int selected = 0, int offset = 0); ~GuiGameBrowser(); int FindMenuItem(int c, int d); int GetClickedOption(); diff --git a/source/libwiigui/gui_gamecarousel.cpp b/source/libwiigui/gui_gamecarousel.cpp index 457719c0..ee24639f 100644 --- a/source/libwiigui/gui_gamecarousel.cpp +++ b/source/libwiigui/gui_gamecarousel.cpp @@ -44,8 +44,8 @@ static GuiImageData *GameCarouselLoadCoverImage(void * Arg) /** * Constructor for the GuiGameCarousel class. */ -GuiGameCarousel::GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int selected, int offset) : - noCover(nocover_png) +GuiGameCarousel::GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int imagebgsize, int selected, int offset) : + noCover(nocover_png, nocover_png_size) { width = w; height = h; @@ -57,7 +57,6 @@ GuiGameCarousel::GuiGameCarousel(int w, int h, const char *themePath, const u8 * clickedItem = -1; speed = 0; - char imgPath[100]; trigA = new GuiTrigger; trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -73,10 +72,8 @@ GuiGameCarousel::GuiGameCarousel(int w, int h, const char *themePath, const u8 * btnSoundClick = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); btnSoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, Settings.sfxvolume); - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_left.png", Settings.theme_path); - imgLeft = new GuiImageData(imgPath, startgame_arrow_left_png); - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_right.png", Settings.theme_path); - imgRight = new GuiImageData(imgPath, startgame_arrow_right_png); + imgLeft = Resources::GetImageData("startgame_arrow_left.png"); + imgRight = Resources::GetImageData("startgame_arrow_right.png"); int btnHeight = (int) lround(sqrt(RADIUS * RADIUS - 90000) - RADIUS - 50); diff --git a/source/libwiigui/gui_gamecarousel.h b/source/libwiigui/gui_gamecarousel.h index a45fb9b0..bd8db075 100644 --- a/source/libwiigui/gui_gamecarousel.h +++ b/source/libwiigui/gui_gamecarousel.h @@ -7,7 +7,7 @@ class GuiImageAsync; class GuiGameCarousel: public GuiElement { public: - GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int selected = 0, int offset = 0); + GuiGameCarousel(int w, int h, const char *themePath, const u8 *imagebg, int imagebgsize, int selected = 0, int offset = 0); ~GuiGameCarousel(); int FindMenuItem(int c, int d); int GetClickedOption(); diff --git a/source/libwiigui/gui_gamegrid.cpp b/source/libwiigui/gui_gamegrid.cpp index 8ca68f0a..519df1b9 100644 --- a/source/libwiigui/gui_gamegrid.cpp +++ b/source/libwiigui/gui_gamegrid.cpp @@ -201,7 +201,7 @@ static GuiImageData *GameGridLoadCoverImage(void * Arg) * Constructor for the GuiGamegrid class. */ GuiGameGrid::GuiGameGrid(int w, int h, const char *themePath, const u8 *imagebg, int selected, int offset) : - noCover(nocoverFlat_png) + noCover(nocoverFlat_png, nocoverFlat_png_size) { width = w; height = h; diff --git a/source/libwiigui/gui_image_async.cpp b/source/libwiigui/gui_image_async.cpp index a2fed80c..ff08d800 100644 --- a/source/libwiigui/gui_image_async.cpp +++ b/source/libwiigui/gui_image_async.cpp @@ -160,7 +160,7 @@ static void GuiImageAsyncThread_RemoveImage(GuiImageAsync* Image) */ GuiImageData *StdImageLoaderCallback(void *arg) { - return new GuiImageData((char*) arg, NULL); + return new GuiImageData((char*) arg); } GuiImageAsync::GuiImageAsync(const char *Filename, GuiImageData * PreloadImg) : diff --git a/source/libwiigui/gui_imagedata.cpp b/source/libwiigui/gui_imagedata.cpp index c3875ba4..546b0754 100644 --- a/source/libwiigui/gui_imagedata.cpp +++ b/source/libwiigui/gui_imagedata.cpp @@ -1,292 +1,65 @@ -/**************************************************************************** - * libwiigui +/*************************************************************************** + * Copyright (C) 2010 + * by Dimok * - * Tantric 2009 + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. * - * gui_imagedata.cpp + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: * - * LoadJpeg copyright by r-win for WiiXplorer - * check WiiXplorer source for license conditions + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. * - * GUI class definitions + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + * for WiiXplorer 2010 ***************************************************************************/ - #include "gui.h" +#include "ImageOperations/TextureConverter.h" +#include "ImageOperations/TplImage.h" +#include "FileOperations/fileops.h" -#ifdef __cplusplus -extern "C" -{ -#endif - -#include - -#ifdef __cplusplus -} -#endif - -#define new_width 640 -#define new_height 480 +#define ALIGN32(x) (((x) + 31) & ~31) /** * Constructor for the GuiImageData class. */ - -extern int idiotFlag; -extern char idiotChar[50]; -GuiImageData::GuiImageData(const u8 * img) +GuiImageData::GuiImageData(const char * filepath) { - data = NULL; - width = 0; - height = 0; + data = NULL; + width = 0; + height = 0; + format = GX_TF_RGBA8; - if (img) - { - PNGUPROP imgProp; - IMGCTX ctx = PNGU_SelectImageFromBuffer(img); + u8 *buffer = NULL; + u64 size = 0; - if (!ctx) return; + if(LoadFileToMem(filepath, &buffer, &size) < 0) + return; - int res = PNGU_GetImageProperties(ctx, &imgProp); - //if (((4%imgProp.imgWidth)!=0)||((4%imgProp.imgHeight)!=0))idiotFlag=1; + LoadImage(buffer, size); - if (res == PNGU_OK) - { - int len = imgProp.imgWidth * imgProp.imgHeight * 4; - if (len % 32) len += (32 - len % 32); - data = (u8 *) memalign(32, len); - - if (data) - { - res = PNGU_DecodeTo4x4RGBA8(ctx, imgProp.imgWidth, imgProp.imgHeight, data, 255); - - if (res == PNGU_OK) - { - width = imgProp.imgWidth; - height = imgProp.imgHeight; - DCFlushRange(data, len); - } - else - { - free(data); - data = NULL; - idiotFlag = 1; - snprintf(idiotChar, sizeof(idiotChar), "%s", img); - - } - } - } - PNGU_ReleaseImageContext(ctx); - } + if(buffer) + free(buffer); } GuiImageData::GuiImageData(const u8 * img, int imgSize) { - data = NULL; - width = 0; - height = 0; + data = NULL; + width = 0; + height = 0; + format = GX_TF_RGBA8; - if (img) - { - if (img[0] == 0xFF && img[1] == 0xD8) // IMAGE_JPEG - { - LoadJpeg(img, imgSize); - } - } -} -/** - * Constructor for the GuiImageData class. - */ -GuiImageData::GuiImageData(const char * imgPath, const u8 * buffer) -{ - data = NULL; - width = 0; - height = 0; - - if (imgPath) - { - PNGUPROP imgProp; - IMGCTX ctx = PNGU_SelectImageFromDevice(imgPath); - //if (((4%imgProp.imgWidth)!=0)||((4%imgProp.imgHeight)!=0))idiotFlag=1; - - if (ctx) - { - int res = PNGU_GetImageProperties(ctx, &imgProp); - - if (res == PNGU_OK) - { - int len = imgProp.imgWidth * imgProp.imgHeight * 4; - if (len % 32) len += (32 - len % 32); - data = (u8 *) memalign(32, len); - - if (data) - { - res = PNGU_DecodeTo4x4RGBA8(ctx, imgProp.imgWidth, imgProp.imgHeight, data, 255); - - if (res == PNGU_OK) - { - width = imgProp.imgWidth; - height = imgProp.imgHeight; - DCFlushRange(data, len); - } - else - { - free(data); - data = NULL; - idiotFlag = 1; - snprintf(idiotChar, sizeof(idiotChar), "%s", imgPath); - } - } - } - PNGU_ReleaseImageContext(ctx); - } - } - - if (!data) //use buffer data instead - { - width = 0; - height = 0; - if (buffer) - { - PNGUPROP imgProp; - IMGCTX ctx = PNGU_SelectImageFromBuffer(buffer); - - if (!ctx) return; - - int res = PNGU_GetImageProperties(ctx, &imgProp); - - if (res == PNGU_OK) - { - int len = imgProp.imgWidth * imgProp.imgHeight * 4; - if (len % 32) len += (32 - len % 32); - data = (u8 *) memalign(32, len); - - if (data) - { - res = PNGU_DecodeTo4x4RGBA8(ctx, imgProp.imgWidth, imgProp.imgHeight, data, 255); - - if (res == PNGU_OK) - { - width = imgProp.imgWidth; - height = imgProp.imgHeight; - DCFlushRange(data, len); - } - else - { - free(data); - data = NULL; - } - } - } - PNGU_ReleaseImageContext(ctx); - } - } -} - -/** - * Constructor for the GuiImageData class. - */ -GuiImageData::GuiImageData(const char *path, const char *file, const u8 *buffer, bool force_widescreen/*=false*/, - const u8 *wbuffer/*=NULL*/) -{ - data = NULL; - width = 0; - height = 0; - char path_4_3[100]; - char path_16_9[100]; - char *imgPath; - - snprintf(path_4_3, sizeof(path_4_3), "%s%s", path, file); - if (force_widescreen) - { - snprintf(path_16_9, sizeof(path_16_9), "%sw%s", path, file); - imgPath = path_16_9; - if (wbuffer) buffer = wbuffer; - } - else imgPath = path_4_3; - - for (;;) - { - if (imgPath) - { - PNGUPROP imgProp; - IMGCTX ctx = PNGU_SelectImageFromDevice(imgPath); - //if (((4%imgProp.imgWidth)!=0)||((4%imgProp.imgHeight)!=0))idiotFlag=1; - - if (ctx) - { - int res = PNGU_GetImageProperties(ctx, &imgProp); - - if (res == PNGU_OK) - { - int len = imgProp.imgWidth * imgProp.imgHeight * 4; - if (len % 32) len += (32 - len % 32); - data = (u8 *) memalign(32, len); - - if (data) - { - res = PNGU_DecodeTo4x4RGBA8(ctx, imgProp.imgWidth, imgProp.imgHeight, data, 255); - - if (res == PNGU_OK) - { - width = imgProp.imgWidth; - height = imgProp.imgHeight; - DCFlushRange(data, len); - } - else - { - free(data); - data = NULL; - idiotFlag = 1; - snprintf(idiotChar, sizeof(idiotChar), "%s", imgPath); - } - } - } - PNGU_ReleaseImageContext(ctx); - } - } - if (data || imgPath == path_4_3) break; - imgPath = path_4_3; - } - - if (!data) //use buffer data instead - { - width = 0; - height = 0; - if (buffer) - { - PNGUPROP imgProp; - IMGCTX ctx = PNGU_SelectImageFromBuffer(buffer); - - if (!ctx) return; - - int res = PNGU_GetImageProperties(ctx, &imgProp); - - if (res == PNGU_OK) - { - int len = imgProp.imgWidth * imgProp.imgHeight * 4; - if (len % 32) len += (32 - len % 32); - data = (u8 *) memalign(32, len); - - if (data) - { - res = PNGU_DecodeTo4x4RGBA8(ctx, imgProp.imgWidth, imgProp.imgHeight, data, 255); - - if (res == PNGU_OK) - { - width = imgProp.imgWidth; - height = imgProp.imgHeight; - DCFlushRange(data, len); - } - else - { - free(data); - data = NULL; - } - } - } - PNGU_ReleaseImageContext(ctx); - } - } + LoadImage(img, imgSize); } /** @@ -294,162 +67,114 @@ GuiImageData::GuiImageData(const char *path, const char *file, const u8 *buffer, */ GuiImageData::~GuiImageData() { - if (data) + if(data) + { + free(data); + data = NULL; + } +} + +void GuiImageData::LoadImage(const u8 * img, int imgSize) +{ + if(!img) + return; + + if(data) { free(data); data = NULL; } -} -u8 * GuiImageData::GetImage() -{ - return data; -} - -int GuiImageData::GetWidth() -{ - return width; -} - -int GuiImageData::GetHeight() -{ - return height; -} -void GuiImageData::SetGrayscale(void) -{ - GXColor color; - u32 offset, gray; - - for (int x = 0; x < width; x++) + if (imgSize < 8) { - for (int y = 0; y < height; y++) - { - offset = (((y >> 2) << 4) * width) + ((x >> 2) << 6) + (((y % 4 << 2) + x % 4) << 1); - color.r = *(data + offset + 1); - color.g = *(data + offset + 32); - color.b = *(data + offset + 33); - - gray = (77 * color.r + 150 * color.g + 28 * color.b) / 255; - - *(data + offset + 1) = gray; - *(data + offset + 32) = gray; - *(data + offset + 33) = gray; - } + return; + } + else if (img[0] == 0x89 && img[1] == 'P' && img[2] == 'N' && img[3] == 'G') + { + // IMAGE_PNG + LoadPNG(img, imgSize); + } + else if (img[0] == 0xFF && img[1] == 0xD8) + { + // IMAGE_JPEG + LoadJpeg(img, imgSize); + } + else if (img[0] == 'B' && img[1] == 'M') + { + // IMAGE_BMP + LoadBMP(img, imgSize); + } + else if (img[0] == 'G' && img[1] == 'I' && img[2] == 'F') + { + // IMAGE_GIF + LoadGIF(img, imgSize); + } + else if (img[0] == 0x00 && img[1] == 0x20 && img[2] == 0xAF && img[3] == 0x30) + { + // IMAGE_TPL + LoadTPL(img, imgSize); } } -// This function finds it's origin in GRRLIB, which can be found here: http://code.google.com/p/grrlib/ +void GuiImageData::LoadPNG(const u8 *img, int imgSize) +{ + gdImagePtr gdImg = gdImageCreateFromPngPtr(imgSize, (u8*) img); + if(gdImg == 0) + return; + + data = GDImageToRGBA8(&gdImg, &width, &height); + gdImageDestroy(gdImg); +} + void GuiImageData::LoadJpeg(const u8 *img, int imgSize) { - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; + gdImagePtr gdImg = gdImageCreateFromJpegPtr(imgSize, (u8*) img); + if(gdImg == 0) + return; - int n = imgSize; - - while (n > 1) - { - if (img[n - 1] == 0xff && img[n] == 0xd9) - { - break; - } - n--; - } - - jpeg_create_decompress( &cinfo ); - cinfo.err = jpeg_std_error(&jerr); - cinfo.progress = NULL; - jpeg_mem_src(&cinfo, (u8 *) img, n); - jpeg_read_header(&cinfo, TRUE); - jpeg_calc_output_dimensions(&cinfo); - - if (cinfo.output_width > new_width || cinfo.output_height > new_height) - { - float factor = (cinfo.output_width > cinfo.output_height) ? (1.0 * cinfo.output_width) / new_width : (1.0 - * cinfo.output_height) / new_height; - cinfo.scale_num = 1; - cinfo.scale_denom = factor; - cinfo.do_fancy_upsampling = true; - cinfo.do_block_smoothing = false; - cinfo.dct_method = JDCT_IFAST; - } - - jpeg_start_decompress(&cinfo); - - int rowsize = cinfo.output_width * cinfo.num_components; - unsigned char *tempBuffer = (unsigned char *) malloc(rowsize * cinfo.output_height); - - JSAMPROW row_pointer[1]; - - row_pointer[0] = (unsigned char*) malloc(rowsize); - size_t location = 0; - while (cinfo.output_scanline < cinfo.output_height) - { - jpeg_read_scanlines(&cinfo, row_pointer, 1); - memcpy(tempBuffer + location, row_pointer[0], rowsize); - location += rowsize; - } - - int len = ((cinfo.output_width + 3) >> 2) * ((cinfo.output_height + 3) >> 2) * 32 * 2; - - data = (u8 *) memalign(32, len); - - RawTo4x4RGBA(tempBuffer, data, cinfo.output_width, cinfo.output_height); - DCFlushRange(data, len); - - width = cinfo.output_width; - height = cinfo.output_height; - - jpeg_finish_decompress(&cinfo); - jpeg_destroy_decompress(&cinfo); - free(row_pointer[0]); - free(tempBuffer); + data = GDImageToRGBA8(&gdImg, &width, &height); + gdImageDestroy(gdImg); } -/** - * Convert a raw bmp (RGB, no alpha) to 4x4RGBA. - * @author DragonMinded - * @param src - * @param dst - * @param width - * @param height - */ -void GuiImageData::RawTo4x4RGBA(const unsigned char *src, void *dst, const unsigned int width, - const unsigned int height) +void GuiImageData::LoadGIF(const u8 *img, int imgSize) { - unsigned int block; - unsigned int i; - unsigned int c; - unsigned int ar; - unsigned int gb; - unsigned char *p = (unsigned char*) dst; + gdImagePtr gdImg = gdImageCreateFromGifPtr(imgSize, (u8*) img); + if(gdImg == 0) + return; - for (block = 0; block < height; block += 4) - { - for (i = 0; i < width; i += 4) - { - /* Alpha and Red */ - for (c = 0; c < 4; ++c) - { - for (ar = 0; ar < 4; ++ar) - { - /* Alpha pixels */ - *p++ = 255; - /* Red pixels */ - *p++ = src[((i + ar) + ((block + c) * width)) * 3]; - } - } - - /* Green and Blue */ - for (c = 0; c < 4; ++c) - { - for (gb = 0; gb < 4; ++gb) - { - /* Green pixels */ - *p++ = src[(((i + gb) + ((block + c) * width)) * 3) + 1]; - /* Blue pixels */ - *p++ = src[(((i + gb) + ((block + c) * width)) * 3) + 2]; - } - } - } /* i */ - } /* block */ + data = GDImageToRGBA8(&gdImg, &width, &height); + gdImageDestroy(gdImg); +} + +void GuiImageData::LoadBMP(const u8 *img, int imgSize) +{ + gdImagePtr gdImg = gdImageCreateFromBmpPtr(imgSize, (u8*) img); + if(gdImg == 0) + return; + + data = GDImageToRGBA8(&gdImg, &width, &height); + gdImageDestroy(gdImg); +} + +void GuiImageData::LoadTPL(const u8 *img, int imgSize) +{ + TplImage TplFile(img, imgSize); + + width = TplFile.GetWidth(0); + height = TplFile.GetHeight(0); + format = (u8) TplFile.GetFormat(0); + + const u8 * ImgPtr = TplFile.GetTextureBuffer(0); + + if(ImgPtr) + { + int len = ALIGN32(TplFile.GetTextureSize(0)); + + data = (u8 *) memalign(32, len); + if(!data) + return; + + memcpy(data, ImgPtr, len); + DCFlushRange(data, len); + } } diff --git a/source/libwiigui/gui_imagedata.h b/source/libwiigui/gui_imagedata.h new file mode 100644 index 00000000..271c2887 --- /dev/null +++ b/source/libwiigui/gui_imagedata.h @@ -0,0 +1,69 @@ +/**************************************************************************** + * Copyright (C) 2010 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + * for WiiXplorer 2010 + ***************************************************************************/ +#ifndef GUI_IMAGEDATA_H_ +#define GUI_IMAGEDATA_H_ + +#include +#include + +class GuiImageData +{ + public: + //!Constructor + //!\param img Image data + //!\param imgSize The image size + GuiImageData(const u8 * img, int imgSize); + //!Overload + GuiImageData(const char * filepath); + //!Destructor + ~GuiImageData(); + //!Gets a pointer to the image data + //!\return pointer to image data + u8 * GetImage() { return data; }; + //!Gets the image width + //!\return image width + int GetWidth() { return width; }; + //!Gets the image height + //!\return image height + int GetHeight() { return height; }; + //!Gets the texture format + u8 GetTextureFormat() { return format; }; + //!Load a new image into this GuiImageData + void LoadImage(const u8 * img, int imgSize); + protected: + void LoadPNG(const u8 *img, int imgSize); + void LoadBMP(const u8 *img, int imgSize); + void LoadJpeg(const u8 *img, int imgSize); + void LoadGIF(const u8 *img, int imgSize); + void LoadTPL(const u8 *img, int imgSize); + + u8 * data; //!< Image data + int height; //!< Height of image + int width; //!< Width of image + u8 format; //!< Texture format +}; + +#endif diff --git a/source/libwiigui/gui_keyboard.cpp b/source/libwiigui/gui_keyboard.cpp index 376f13ff..59ced7df 100644 --- a/source/libwiigui/gui_keyboard.cpp +++ b/source/libwiigui/gui_keyboard.cpp @@ -117,7 +117,7 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, int min, int lang) memcpy(keys, thekeys, sizeof(thekeys)); } - keyTextbox = new GuiImageData(keyboard_textbox_png); + keyTextbox = new GuiImageData(keyboard_textbox_png, keyboard_textbox_png_size); keyTextboxImg = new GuiImage(keyTextbox); keyTextboxImg->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); keyTextboxImg->SetPosition(0, 40);//(0,0); @@ -129,12 +129,12 @@ GuiKeyboard::GuiKeyboard(char * t, u32 max, int min, int lang) kbText->SetPosition(0, 53);//(0, 13); this->Append(kbText); - key = new GuiImageData(keyboard_key_png); - keyOver = new GuiImageData(keyboard_key_over_png); - keyMedium = new GuiImageData(keyboard_mediumkey_over_png); - keyMediumOver = new GuiImageData(keyboard_mediumkey_over_png); - keyLarge = new GuiImageData(keyboard_largekey_over_png); - keyLargeOver = new GuiImageData(keyboard_largekey_over_png); + key = new GuiImageData(keyboard_key_png, keyboard_key_png_size); + keyOver = new GuiImageData(keyboard_key_over_png, keyboard_key_over_png_size); + keyMedium = new GuiImageData(keyboard_mediumkey_over_png, keyboard_mediumkey_over_png_size); + keyMediumOver = new GuiImageData(keyboard_mediumkey_over_png, keyboard_mediumkey_over_png_size); + keyLarge = new GuiImageData(keyboard_largekey_over_png, keyboard_largekey_over_png_size); + keyLargeOver = new GuiImageData(keyboard_largekey_over_png, keyboard_largekey_over_png_size); keySoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, Settings.sfxvolume); keySoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); diff --git a/source/libwiigui/gui_numpad.cpp b/source/libwiigui/gui_numpad.cpp index 9021f724..83dbd9db 100644 --- a/source/libwiigui/gui_numpad.cpp +++ b/source/libwiigui/gui_numpad.cpp @@ -35,7 +35,7 @@ GuiNumpad::GuiNumpad(char * t, u32 max) char thekeys[11] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0', '0' }; memcpy(keys, thekeys, sizeof(thekeys)); - keyTextbox = new GuiImageData(keyboard_textbox_png); + keyTextbox = new GuiImageData(keyboard_textbox_png, keyboard_textbox_png_size); keyTextboxImg = new GuiImage(keyTextbox); keyTextboxImg->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); keyTextboxImg->SetPosition(0, 40);//(0,0); @@ -48,8 +48,8 @@ GuiNumpad::GuiNumpad(char * t, u32 max) kbText->SetPassChar('*'); this->Append(kbText); - keyMedium = new GuiImageData(keyboard_mediumkey_over_png); - keyMediumOver = new GuiImageData(keyboard_mediumkey_over_png); + keyMedium = new GuiImageData(keyboard_mediumkey_over_png, keyboard_mediumkey_over_png_size); + keyMediumOver = new GuiImageData(keyboard_mediumkey_over_png, keyboard_mediumkey_over_png_size); keySoundOver = new GuiSound(button_over_pcm, button_over_pcm_size, Settings.sfxvolume); keySoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); diff --git a/source/libwiigui/gui_optionbrowser.cpp b/source/libwiigui/gui_optionbrowser.cpp index bbae2f3c..2824c43f 100644 --- a/source/libwiigui/gui_optionbrowser.cpp +++ b/source/libwiigui/gui_optionbrowser.cpp @@ -11,6 +11,7 @@ #include "gui.h" #include "../wpad.h" #include "settings/CSettings.h" +#include "themes/CTheme.h" #include @@ -20,7 +21,7 @@ static int scrollbaron = 0, startat = 0, loaded = 0; /** * Constructor for the GuiOptionBrowser class. */ -GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l, const u8 *imagebg, int scrollon) +GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l, const char *imagebg, int scrollon) { width = w; height = h; @@ -39,31 +40,31 @@ GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l, const u8 *image btnSoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); - bgOptions = new GuiImageData(imagebg); + bgOptions = Resources::GetImageData(imagebg); bgOptionsImg = new GuiImage(bgOptions); bgOptionsImg->SetParent(this); bgOptionsImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - bgOptionsEntry = new GuiImageData(bg_options_entry_png); + bgOptionsEntry = Resources::GetImageData("bg_options_entry.png"); if (scrollbaron == 1) { - scrollbar = new GuiImageData(scrollbar_png); + scrollbar = Resources::GetImageData("scrollbar.png"); scrollbarImg = new GuiImage(scrollbar); scrollbarImg->SetParent(this); scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); scrollbarImg->SetPosition(0, 4); - arrowDown = new GuiImageData(scrollbar_arrowdown_png); + arrowDown = Resources::GetImageData("scrollbar_arrowdown.png"); arrowDownImg = new GuiImage(arrowDown); - arrowDownOver = new GuiImageData(scrollbar_arrowdown_png); + arrowDownOver = Resources::GetImageData("scrollbar_arrowdown.png"); arrowDownOverImg = new GuiImage(arrowDownOver); - arrowUp = new GuiImageData(scrollbar_arrowup_png); + arrowUp = Resources::GetImageData("scrollbar_arrowup.png"); arrowUpImg = new GuiImage(arrowUp); - arrowUpOver = new GuiImageData(scrollbar_arrowup_png); + arrowUpOver = Resources::GetImageData("scrollbar_arrowup.png"); arrowUpOverImg = new GuiImage(arrowUpOver); - scrollbarBox = new GuiImageData(scrollbar_box_png); + scrollbarBox = Resources::GetImageData("scrollbar_box.png"); scrollbarBoxImg = new GuiImage(scrollbarBox); - scrollbarBoxOver = new GuiImageData(scrollbar_box_png); + scrollbarBoxOver = Resources::GetImageData("scrollbar_box.png"); scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver); arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); @@ -134,8 +135,7 @@ GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l, const u8 *image /** * Constructor for the GuiOptionBrowser class. */ -GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l, const char *themePath, const u8 *imagebg, - int scrollon, int start) +GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l, const char *imagebg, int scrollon, int start) { width = w; height = h; @@ -147,7 +147,6 @@ GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l, const char *the listOffset = this->FindMenuItem(-1, 1); selectedItem = 0; focus = 1; // allow focus - char imgPath[100]; trigA = new GuiTrigger; trigA->SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -155,38 +154,32 @@ GuiOptionBrowser::GuiOptionBrowser(int w, int h, OptionList * l, const char *the trigHeldA->SetHeldTrigger(-1, WPAD_BUTTON_A, PAD_BUTTON_A); btnSoundClick = new GuiSound(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); - snprintf(imgPath, sizeof(imgPath), "%sbg_options.png", themePath); - bgOptions = new GuiImageData(imgPath, imagebg); + bgOptions = Resources::GetImageData(imagebg); bgOptionsImg = new GuiImage(bgOptions); bgOptionsImg->SetParent(this); bgOptionsImg->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); - snprintf(imgPath, sizeof(imgPath), "%sbg_options_entry.png", themePath); - bgOptionsEntry = new GuiImageData(imgPath, bg_options_entry_png); + bgOptionsEntry = Resources::GetImageData("bg_options_entry.png"); if (scrollbaron == 1) { - snprintf(imgPath, sizeof(imgPath), "%sscrollbar.png", themePath); - scrollbar = new GuiImageData(imgPath, scrollbar_png); + scrollbar = Resources::GetImageData("scrollbar.png"); scrollbarImg = new GuiImage(scrollbar); scrollbarImg->SetParent(this); scrollbarImg->SetAlignment(ALIGN_RIGHT, ALIGN_TOP); scrollbarImg->SetPosition(0, 4); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_arrowdown.png", themePath); - arrowDown = new GuiImageData(imgPath, scrollbar_arrowdown_png); + arrowDown = Resources::GetImageData("scrollbar_arrowdown.png"); arrowDownImg = new GuiImage(arrowDown); - arrowDownOver = new GuiImageData(imgPath, scrollbar_arrowdown_png); + arrowDownOver = Resources::GetImageData("scrollbar_arrowdown.png"); arrowDownOverImg = new GuiImage(arrowDownOver); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_arrowup.png", themePath); - arrowUp = new GuiImageData(imgPath, scrollbar_arrowup_png); + arrowUp = Resources::GetImageData("scrollbar_arrowup.png"); arrowUpImg = new GuiImage(arrowUp); - arrowUpOver = new GuiImageData(imgPath, scrollbar_arrowup_png); + arrowUpOver = Resources::GetImageData("scrollbar_arrowup.png"); arrowUpOverImg = new GuiImage(arrowUpOver); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_box.png", themePath); - scrollbarBox = new GuiImageData(imgPath, scrollbar_box_png); + scrollbarBox = Resources::GetImageData("scrollbar_box.png"); scrollbarBoxImg = new GuiImage(scrollbarBox); - scrollbarBoxOver = new GuiImageData(imgPath, scrollbar_box_png); + scrollbarBoxOver = Resources::GetImageData("scrollbar_box.png"); scrollbarBoxOverImg = new GuiImage(scrollbarBoxOver); arrowUpBtn = new GuiButton(arrowUpImg->GetWidth(), arrowUpImg->GetHeight()); diff --git a/source/libwiigui/gui_searchbar.cpp b/source/libwiigui/gui_searchbar.cpp index c7d29207..f05afafb 100644 --- a/source/libwiigui/gui_searchbar.cpp +++ b/source/libwiigui/gui_searchbar.cpp @@ -4,6 +4,7 @@ #include "../wpad.h" #include "../main.h" #include "../settings/CSettings.h" +#include "../themes/CTheme.h" #include "../usbloader/GameList.h" extern GuiWindow * mainWindow; @@ -30,11 +31,10 @@ class cSearchButton GuiSearchBar::GuiSearchBar(const wchar_t *SearchChars) : inSide(0), text((char *) NULL, 22, ( GXColor ) - { 0, 0, 0, 255}), buttons(0), keyImageData(keyboard_key_png), keyOverImageData(keyboard_key_over_png), sndOver( + { 0, 0, 0, 255}), buttons(0), keyImageData(keyboard_key_png, keyboard_key_png_size), keyOverImageData(keyboard_key_over_png, keyboard_key_over_png_size), sndOver( button_over_pcm, button_over_pcm_size, Settings.sfxvolume), sndClick(button_click_pcm, button_click_pcm_size, Settings.sfxvolume) { - char imgPath[100]; trig.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); @@ -69,8 +69,7 @@ GuiSearchBar::GuiSearchBar(const wchar_t *SearchChars) : text.SetMaxWidth(width - (10 + 2 * 42 + 10), SCROLL_HORIZONTAL); this->Append(&text); - snprintf(imgPath, sizeof(imgPath), "%skeyboard_backspace_over.png", Settings.theme_path); - imgBacspaceBtn = new GuiImageData(imgPath, keyboard_backspace_over_png); + imgBacspaceBtn = Resources::GetImageData("keyboard_backspace_over.png"); BacspaceBtnImg_Over = new GuiImage(imgBacspaceBtn); BacspaceBtnImg = new GuiImage(BacspaceBtnImg_Over); BacspaceBtnImg->SetGrayscale(); @@ -78,8 +77,7 @@ GuiSearchBar::GuiSearchBar(const wchar_t *SearchChars) : &sndClick, 1); this->Append(BacspaceBtn); - snprintf(imgPath, sizeof(imgPath), "%skeyboard_clear_over.png", Settings.theme_path); - imgClearBtn = new GuiImageData(imgPath, keyboard_clear_over_png); + imgClearBtn = Resources::GetImageData("keyboard_clear_over.png"); ClearBtnImg_Over = new GuiImage(imgClearBtn); ClearBtnImg = new GuiImage(ClearBtnImg_Over); ClearBtnImg->SetGrayscale(); diff --git a/source/libwiigui/gui_tooltip.cpp b/source/libwiigui/gui_tooltip.cpp index ab94fd0d..b3fa5365 100644 --- a/source/libwiigui/gui_tooltip.cpp +++ b/source/libwiigui/gui_tooltip.cpp @@ -10,9 +10,9 @@ #include "gui.h" -static GuiImageData tooltipLeft(tooltip_left_png); -static GuiImageData tooltipTile(tooltip_tile_png); -static GuiImageData tooltipRight(tooltip_right_png); +static GuiImageData tooltipLeft(tooltip_left_png, tooltip_left_png_size); +static GuiImageData tooltipTile(tooltip_tile_png, tooltip_left_png_size); +static GuiImageData tooltipRight(tooltip_right_png, tooltip_right_png_size); /** * Constructor for the GuiTooltip class. diff --git a/source/menu.cpp b/source/menu.cpp index 9f5acc1f..0873b6e3 100644 --- a/source/menu.cpp +++ b/source/menu.cpp @@ -218,13 +218,13 @@ GuiImageData *LoadCoverImage(struct discHdr *header, bool Prefere3D, bool noCove //Load full id image snprintf(Path, sizeof(Path), "%s%s.png", coverPath, IDfull); delete Cover; - Cover = new (std::nothrow) GuiImageData(Path, NULL); + Cover = new (std::nothrow) GuiImageData(Path); //Load short id image if (!Cover || !Cover->GetImage()) { snprintf(Path, sizeof(Path), "%s%s.png", coverPath, ID); delete Cover; - Cover = new (std::nothrow) GuiImageData(Path, NULL); + Cover = new (std::nothrow) GuiImageData(Path); } if (Cover && Cover->GetImage()) break; } @@ -234,11 +234,9 @@ GuiImageData *LoadCoverImage(struct discHdr *header, bool Prefere3D, bool noCove flag = Prefere3D; for (int i = 0; i < 2; ++i) { - const char *nocoverPath = (flag ? "%snoimage.png" : "%snoimage2d.png"); flag = !flag; - snprintf(Path, sizeof(Path), nocoverPath, Settings.theme_path); delete Cover; - Cover = new (std::nothrow) GuiImageData(Path, (Prefere3D ? nocover_png : nocoverFlat_png)); + Cover = new (std::nothrow) GuiImageData(Resources::GetFile(Prefere3D ? "nocover.png" : "nocoverFlat.png"), Resources::GetFileSize(Prefere3D ? "nocover.png" : "nocoverFlat.png")); if (Cover && Cover->GetImage()) break; } } @@ -257,27 +255,20 @@ int MainMenu(int menu) { currentMenu = menu; - char imgPath[100]; //if (strcmp(headlessID,"")!=0)HaltGui(); //WindowPrompt("Can you see me now",0,"ok"); - snprintf(imgPath, sizeof(imgPath), "%splayer1_point.png", Settings.theme_path); - pointer[0] = new GuiImageData(imgPath, player1_point_png); - snprintf(imgPath, sizeof(imgPath), "%splayer2_point.png", Settings.theme_path); - pointer[1] = new GuiImageData(imgPath, player2_point_png); - snprintf(imgPath, sizeof(imgPath), "%splayer3_point.png", Settings.theme_path); - pointer[2] = new GuiImageData(imgPath, player3_point_png); - snprintf(imgPath, sizeof(imgPath), "%splayer4_point.png", Settings.theme_path); - pointer[3] = new GuiImageData(imgPath, player4_point_png); + pointer[0] = new GuiImageData(Resources::GetFile("player1_point.png"), Resources::GetFileSize("player1_point.png")); + pointer[1] = new GuiImageData(Resources::GetFile("player2_point.png"), Resources::GetFileSize("player2_point.png")); + pointer[2] = new GuiImageData(Resources::GetFile("player3_point.png"), Resources::GetFileSize("player3_point.png")); + pointer[3] = new GuiImageData(Resources::GetFile("player4_point.png"), Resources::GetFileSize("player4_point.png")); mainWindow = new GuiWindow(screenwidth, screenheight); + + const char * image = Settings.widescreen ? "wbackground.png" : "background.png"; - if (Settings.widescreen) - snprintf(imgPath, sizeof(imgPath), "%swbackground.png", Settings.theme_path); - else snprintf(imgPath, sizeof(imgPath), "%sbackground.png", Settings.theme_path); - - background = new GuiImageData(imgPath, Settings.widescreen ? wbackground_png : background_png); + background = new GuiImageData(Resources::GetFile(image), Resources::GetFileSize(image)); bgImg = new GuiImage(background); mainWindow->Append(bgImg); diff --git a/source/menu/menu_disclist.cpp b/source/menu/menu_disclist.cpp index 1bc92a4d..f8fa4274 100644 --- a/source/menu/menu_disclist.cpp +++ b/source/menu/menu_disclist.cpp @@ -63,7 +63,6 @@ int MenuDiscList() char ID[4]; char IDfull[7]; u32 covert = 0; - char imgPath[100]; if (!dvdheader) dvdheader = new struct discHdr; u8 mountMethodOLD = 0; @@ -103,80 +102,46 @@ int MenuDiscList() if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - snprintf(imgPath, sizeof(imgPath), "%sbutton_install.png", Settings.theme_path); - GuiImageData btnInstall(imgPath, button_install_png); - snprintf(imgPath, sizeof(imgPath), "%sbutton_install_over.png", Settings.theme_path); - GuiImageData btnInstallOver(imgPath, button_install_over_png); + GuiImageData btnInstall(Resources::GetFile("button_install.png"), Resources::GetFileSize("button_install.png")); + GuiImageData btnInstallOver(Resources::GetFile("button_install_over.png"), Resources::GetFileSize("button_install_over.png")); - snprintf(imgPath, sizeof(imgPath), "%ssettings_button.png", Settings.theme_path); - GuiImageData btnSettings(imgPath, settings_button_png); - snprintf(imgPath, sizeof(imgPath), "%ssettings_button_over.png", Settings.theme_path); - GuiImageData btnSettingsOver(imgPath, settings_button_over_png); + GuiImageData btnSettings(Resources::GetFile("settings_button.png"), Resources::GetFileSize("settings_button.png")); + GuiImageData btnSettingsOver(Resources::GetFile("settings_button_over.png"), Resources::GetFileSize("settings_button_over.png")); - snprintf(imgPath, sizeof(imgPath), "%swiimote_poweroff.png", Settings.theme_path); - GuiImageData btnpwroff(imgPath, wiimote_poweroff_png); - snprintf(imgPath, sizeof(imgPath), "%swiimote_poweroff_over.png", Settings.theme_path); - GuiImageData btnpwroffOver(imgPath, wiimote_poweroff_over_png); - snprintf(imgPath, sizeof(imgPath), "%smenu_button.png", Settings.theme_path); - GuiImageData btnhome(imgPath, menu_button_png); - snprintf(imgPath, sizeof(imgPath), "%smenu_button_over.png", Settings.theme_path); - GuiImageData btnhomeOver(imgPath, menu_button_over_png); - snprintf(imgPath, sizeof(imgPath), "%sSDcard_over.png", Settings.theme_path); - GuiImageData btnsdcardOver(imgPath, sdcard_over_png); - snprintf(imgPath, sizeof(imgPath), "%sSDcard.png", Settings.theme_path); - GuiImageData btnsdcard(imgPath, sdcard_png); + GuiImageData btnpwroff(Resources::GetFile("wiimote_poweroff.png"), Resources::GetFileSize("wiimote_poweroff.png")); + GuiImageData btnpwroffOver(Resources::GetFile("wiimote_poweroff_over.png"), Resources::GetFileSize("wiimote_poweroff_over.png")); + GuiImageData btnhome(Resources::GetFile("menu_button.png"), Resources::GetFileSize("menu_button.png")); + GuiImageData btnhomeOver(Resources::GetFile("menu_button_over.png"), Resources::GetFileSize("menu_button_over.png")); + GuiImageData btnsdcardOver(Resources::GetFile("sdcard_over.png"), Resources::GetFileSize("sdcard_over.png")); + GuiImageData btnsdcard(Resources::GetFile("sdcard.png"), Resources::GetFileSize("sdcard.png")); - snprintf(imgPath, sizeof(imgPath), "%sfavIcon.png", Settings.theme_path); - GuiImageData imgfavIcon(imgPath, favIcon_png); - snprintf(imgPath, sizeof(imgPath), "%sfavIcon_gray.png", Settings.theme_path); - GuiImageData imgfavIcon_gray(imgPath, NULL); - snprintf(imgPath, sizeof(imgPath), "%ssearchIcon.png", Settings.theme_path); - GuiImageData imgsearchIcon(imgPath, searchIcon_png); - snprintf(imgPath, sizeof(imgPath), "%ssearchIcon_gray.png", Settings.theme_path); - GuiImageData imgsearchIcon_gray(imgPath, NULL); - snprintf(imgPath, sizeof(imgPath), "%sabcIcon.png", Settings.theme_path); - GuiImageData imgabcIcon(imgPath, abcIcon_png); - snprintf(imgPath, sizeof(imgPath), "%sabcIcon_gray.png", Settings.theme_path); - GuiImageData imgabcIcon_gray(imgPath, NULL); - snprintf(imgPath, sizeof(imgPath), "%srankIcon.png", Settings.theme_path); - GuiImageData imgrankIcon(imgPath, rankIcon_png); - snprintf(imgPath, sizeof(imgPath), "%srankIcon_gray.png", Settings.theme_path); - GuiImageData imgrankIcon_gray(imgPath, NULL); - snprintf(imgPath, sizeof(imgPath), "%splayCountIcon.png", Settings.theme_path); - GuiImageData imgplayCountIcon(imgPath, playCountIcon_png); - snprintf(imgPath, sizeof(imgPath), "%splayCountIcon_gray.png", Settings.theme_path); - GuiImageData imgplayCountIcon_gray(imgPath, NULL); - snprintf(imgPath, sizeof(imgPath), "%sarrangeGrid.png", Settings.theme_path); - GuiImageData imgarrangeGrid(imgPath, arrangeGrid_png); - snprintf(imgPath, sizeof(imgPath), "%sarrangeGrid_gray.png", Settings.theme_path); - GuiImageData imgarrangeGrid_gray(imgPath, NULL); - snprintf(imgPath, sizeof(imgPath), "%sarrangeList.png", Settings.theme_path); - GuiImageData imgarrangeList(imgPath, arrangeList_png); - snprintf(imgPath, sizeof(imgPath), "%sarrangeList_gray.png", Settings.theme_path); - GuiImageData imgarrangeList_gray(imgPath, NULL); - snprintf(imgPath, sizeof(imgPath), "%sarrangeCarousel.png", Settings.theme_path); - GuiImageData imgarrangeCarousel(imgPath, arrangeCarousel_png); - snprintf(imgPath, sizeof(imgPath), "%sarrangeCarousel_gray.png", Settings.theme_path); - GuiImageData imgarrangeCarousel_gray(imgPath, NULL); + GuiImageData imgfavIcon(Resources::GetFile("favIcon.png"), Resources::GetFileSize("favIcon.png")); + GuiImageData imgfavIcon_gray(Resources::GetFile("favIcon_gray.png"), Resources::GetFileSize("favIcon_gray.png")); + GuiImageData imgsearchIcon(Resources::GetFile("searchIcon.png"), Resources::GetFileSize("searchIcon.png")); + GuiImageData imgsearchIcon_gray(Resources::GetFile("searchIcon_gray.png"), Resources::GetFileSize("searchIcon_gray.png")); + GuiImageData imgabcIcon(Resources::GetFile("abcIcon.png"), Resources::GetFileSize("abcIcon.png")); + GuiImageData imgabcIcon_gray(Resources::GetFile("abcIcon_gray.png"), Resources::GetFileSize("abcIcon_gray.png")); + GuiImageData imgrankIcon(Resources::GetFile("rankIcon.png"), Resources::GetFileSize("rankIcon.png")); + GuiImageData imgrankIcon_gray(Resources::GetFile("rankIcon_gray.png"), Resources::GetFileSize("rankIcon_gray.png")); + GuiImageData imgplayCountIcon(Resources::GetFile("playCountIcon.png"), Resources::GetFileSize("playCountIcon.png")); + GuiImageData imgplayCountIcon_gray(Resources::GetFile("playCountIcon_gray.png"), Resources::GetFileSize("playCountIcon_gray.png")); + GuiImageData imgarrangeGrid(Resources::GetFile("arrangeGrid.png"), Resources::GetFileSize("arrangeGrid.png")); + GuiImageData imgarrangeGrid_gray(Resources::GetFile("arrangeGrid_gray.png"), Resources::GetFileSize("arrangeGrid_gray.png")); + GuiImageData imgarrangeList(Resources::GetFile("arrangeList.png"), Resources::GetFileSize("arrangeList.png")); + GuiImageData imgarrangeList_gray(Resources::GetFile("arrangeList_gray.png"), Resources::GetFileSize("arrangeList_gray.png")); + GuiImageData imgarrangeCarousel(Resources::GetFile("arrangeCarousel.png"), Resources::GetFileSize("arrangeCarousel.png")); + GuiImageData imgarrangeCarousel_gray(Resources::GetFile("arrangeCarousel_gray.png"), Resources::GetFileSize("arrangeCarousel_gray.png")); - snprintf(imgPath, sizeof(imgPath), "%slock.png", Settings.theme_path); - GuiImageData imgLock(imgPath, lock_png); - snprintf(imgPath, sizeof(imgPath), "%slock_gray.png", Settings.theme_path); - GuiImageData imgLock_gray(imgPath, NULL); - snprintf(imgPath, sizeof(imgPath), "%sunlock.png", Settings.theme_path); - GuiImageData imgUnlock(imgPath, unlock_png); - snprintf(imgPath, sizeof(imgPath), "%sunlock_gray.png", Settings.theme_path); - GuiImageData imgUnlock_gray(imgPath, NULL); + GuiImageData imgLock(Resources::GetFile("lock.png"), Resources::GetFileSize("lock.png")); + GuiImageData imgLock_gray(Resources::GetFile("lock_gray.png"), Resources::GetFileSize("lock_gray.png")); + GuiImageData imgUnlock(Resources::GetFile("lock_gray.png"), Resources::GetFileSize("lock_gray.png")); + GuiImageData imgUnlock_gray(Resources::GetFile("unlock_gray.png"), Resources::GetFileSize("unlock_gray.png")); - snprintf(imgPath, sizeof(imgPath), "%sdvd.png", Settings.theme_path); - GuiImageData imgdvd(imgPath, dvd_png); - snprintf(imgPath, sizeof(imgPath), "%sdvd_gray.png", Settings.theme_path); - GuiImageData imgdvd_gray(imgPath, NULL); + GuiImageData imgdvd(Resources::GetFile("dvd.png"), Resources::GetFileSize("dvd.png")); + GuiImageData imgdvd_gray(Resources::GetFile("dvd_gray.png"), Resources::GetFileSize("dvd_gray.png")); - snprintf(imgPath, sizeof(imgPath), "%sbrowser.png", Settings.theme_path); - GuiImageData homebrewImgData(imgPath, browser_png); - snprintf(imgPath, sizeof(imgPath), "%sbrowser_over.png", Settings.theme_path); - GuiImageData homebrewImgDataOver(imgPath, browser_over_png); + GuiImageData homebrewImgData(Resources::GetFile("browser.png"), Resources::GetFileSize("browser.png")); + GuiImageData homebrewImgDataOver(Resources::GetFile("browser_over.png"), Resources::GetFileSize("browser_over.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -290,11 +255,6 @@ int MenuDiscList() GuiImage favoriteBtnImg(&imgfavIcon); favoriteBtnImg.SetWidescreen(Settings.widescreen); GuiImage favoriteBtnImg_g(&imgfavIcon_gray); - if (favoriteBtnImg_g.GetImage() == NULL) - { - favoriteBtnImg_g = favoriteBtnImg; - favoriteBtnImg_g.SetGrayscale(); - } favoriteBtnImg_g.SetWidescreen(Settings.widescreen); GuiButton favoriteBtn(&favoriteBtnImg_g, &favoriteBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_favorite_x, Theme.gamelist_favorite_y, &trigA, &btnSoundOver, btnClick2, 1, &favoriteBtnTT, -15, 52, 0, 3); @@ -306,11 +266,6 @@ int MenuDiscList() GuiImage searchBtnImg(&imgsearchIcon); searchBtnImg.SetWidescreen(Settings.widescreen); GuiImage searchBtnImg_g(&imgsearchIcon_gray); - if (searchBtnImg_g.GetImage() == NULL) - { - searchBtnImg_g = searchBtnImg; - searchBtnImg_g.SetGrayscale(); - } searchBtnImg_g.SetWidescreen(Settings.widescreen); GuiButton searchBtn(&searchBtnImg_g, &searchBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_search_x, Theme.gamelist_search_y, &trigA, &btnSoundOver, btnClick2, 1, &searchBtnTT, -15, 52, 0, 3); @@ -322,11 +277,6 @@ int MenuDiscList() GuiImage abcBtnImg(Settings.fave ? &imgrankIcon : &imgabcIcon); abcBtnImg.SetWidescreen(Settings.widescreen); GuiImage abcBtnImg_g(Settings.fave ? &imgrankIcon_gray : &imgabcIcon_gray); - if (abcBtnImg_g.GetImage() == NULL) - { - abcBtnImg_g = abcBtnImg; - abcBtnImg_g.SetGrayscale(); - } abcBtnImg_g.SetWidescreen(Settings.widescreen); GuiButton abcBtn(&abcBtnImg_g, &abcBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_abc_x, Theme.gamelist_abc_y, &trigA, &btnSoundOver, btnClick2, 1, &abcBtnTT, -15, 52, 0, 3); @@ -338,11 +288,6 @@ int MenuDiscList() GuiImage countBtnImg(&imgplayCountIcon); countBtnImg.SetWidescreen(Settings.widescreen); GuiImage countBtnImg_g(&imgplayCountIcon_gray); - if (countBtnImg_g.GetImage() == NULL) - { - countBtnImg_g = countBtnImg; - countBtnImg_g.SetGrayscale(); - } countBtnImg_g.SetWidescreen(Settings.widescreen); GuiButton countBtn(&countBtnImg_g, &countBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_count_x, Theme.gamelist_count_y, &trigA, &btnSoundOver, btnClick2, 1, &countBtnTT, -15, 52, 0, 3); @@ -354,11 +299,6 @@ int MenuDiscList() GuiImage listBtnImg(&imgarrangeList); listBtnImg.SetWidescreen(Settings.widescreen); GuiImage listBtnImg_g(&imgarrangeList_gray); - if (listBtnImg_g.GetImage() == NULL) - { - listBtnImg_g = listBtnImg; - listBtnImg_g.SetGrayscale(); - } listBtnImg_g.SetWidescreen(Settings.widescreen); GuiButton listBtn(&listBtnImg_g, &listBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_list_x, Theme.gamelist_list_y, &trigA, &btnSoundOver, btnClick2, 1, &listBtnTT, 15, 52, 1, 3); @@ -370,11 +310,6 @@ int MenuDiscList() GuiImage gridBtnImg(&imgarrangeGrid); gridBtnImg.SetWidescreen(Settings.widescreen); GuiImage gridBtnImg_g(&imgarrangeGrid_gray); - if (gridBtnImg_g.GetImage() == NULL) - { - gridBtnImg_g = gridBtnImg; - gridBtnImg_g.SetGrayscale(); - } gridBtnImg_g.SetWidescreen(Settings.widescreen); GuiButton gridBtn(&gridBtnImg_g, &gridBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_grid_x, Theme.gamelist_grid_y, &trigA, &btnSoundOver, btnClick2, 1, &gridBtnTT, 15, 52, 1, 3); @@ -386,11 +321,6 @@ int MenuDiscList() GuiImage carouselBtnImg(&imgarrangeCarousel); carouselBtnImg.SetWidescreen(Settings.widescreen); GuiImage carouselBtnImg_g(&imgarrangeCarousel_gray); - if (carouselBtnImg_g.GetImage() == NULL) - { - carouselBtnImg_g = carouselBtnImg; - carouselBtnImg_g.SetGrayscale(); - } carouselBtnImg_g.SetWidescreen(Settings.widescreen); GuiButton carouselBtn(&carouselBtnImg_g, &carouselBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_carousel_x, Theme.gamelist_carousel_y, &trigA, &btnSoundOver, btnClick2, 1, &carouselBtnTT, 15, 52, 1, 3); @@ -404,11 +334,6 @@ int MenuDiscList() GuiImage lockBtnImg(&imgLock); lockBtnImg.SetWidescreen(Settings.widescreen); GuiImage lockBtnImg_g(&imgLock_gray); - if (lockBtnImg_g.GetImage() == NULL) - { - lockBtnImg_g = lockBtnImg; - lockBtnImg_g.SetGrayscale(); - } lockBtnImg_g.SetWidescreen(Settings.widescreen); GuiButton lockBtn(&lockBtnImg_g, &lockBtnImg_g, ALIGN_LEFT, ALIGN_TOP, Theme.gamelist_lock_x, Theme.gamelist_lock_y, &trigA, &btnSoundOver, btnClick2, 1, &lockBtnTT, 15, 52, 1, 3); @@ -420,11 +345,6 @@ int MenuDiscList() GuiImage unlockBtnImg(&imgUnlock); unlockBtnImg.SetWidescreen(Settings.widescreen); GuiImage unlockBtnImg_g(&imgUnlock_gray); - if (unlockBtnImg_g.GetImage() == NULL) - { - unlockBtnImg_g = unlockBtnImg; - unlockBtnImg_g.SetGrayscale(); - } unlockBtnImg_g.SetWidescreen(Settings.widescreen); if (canUnlock && Settings.godmode) @@ -581,8 +501,7 @@ int MenuDiscList() GuiGameCarousel * gameCarousel = NULL; if (Settings.gameDisplay == list) { - gameBrowser = new GuiGameBrowser(Theme.gamelist_w, Theme.gamelist_h, Settings.theme_path, bg_options_png, - startat, offset); + gameBrowser = new GuiGameBrowser(Theme.gamelist_w, Theme.gamelist_h, startat, offset); gameBrowser->SetPosition(Theme.gamelist_x, Theme.gamelist_y); gameBrowser->SetAlignment(ALIGN_LEFT, ALIGN_CENTRE); } @@ -1765,35 +1684,26 @@ void rockout(int f) { HaltGui(); - char imgPath[100]; if (gameSelected >= 0 && gameSelected < gameList.size() && (strcasestr(get_title(gameList[gameSelected]), "guitar") || strcasestr(get_title(gameList[gameSelected]), "band") || strcasestr(get_title(gameList[gameSelected]), "rock"))) { for (int i = 0; i < 4; i++) delete pointer[i]; - snprintf(imgPath, sizeof(imgPath), "%srplayer1_point.png", Settings.theme_path); - pointer[0] = new GuiImageData(imgPath, rplayer1_point_png); - snprintf(imgPath, sizeof(imgPath), "%srplayer2_point.png", Settings.theme_path); - pointer[1] = new GuiImageData(imgPath, rplayer2_point_png); - snprintf(imgPath, sizeof(imgPath), "%srplayer3_point.png", Settings.theme_path); - pointer[2] = new GuiImageData(imgPath, rplayer3_point_png); - snprintf(imgPath, sizeof(imgPath), "%srplayer4_point.png", Settings.theme_path); - pointer[3] = new GuiImageData(imgPath, rplayer4_point_png); + pointer[0] = Resources::GetImageData("rplayer1_point.png"); + pointer[1] = Resources::GetImageData("rplayer2_point.png"); + pointer[2] = Resources::GetImageData("rplayer3_point.png"); + pointer[3] = Resources::GetImageData("rplayer4_point.png"); } else { for (int i = 0; i < 4; i++) delete pointer[i]; - snprintf(imgPath, sizeof(imgPath), "%splayer1_point.png", Settings.theme_path); - pointer[0] = new GuiImageData(imgPath, player1_point_png); - snprintf(imgPath, sizeof(imgPath), "%splayer2_point.png", Settings.theme_path); - pointer[1] = new GuiImageData(imgPath, player2_point_png); - snprintf(imgPath, sizeof(imgPath), "%splayer3_point.png", Settings.theme_path); - pointer[2] = new GuiImageData(imgPath, player3_point_png); - snprintf(imgPath, sizeof(imgPath), "%splayer4_point.png", Settings.theme_path); - pointer[3] = new GuiImageData(imgPath, player4_point_png); + pointer[0] = Resources::GetImageData("player1_point.png"); + pointer[1] = Resources::GetImageData("player2_point.png"); + pointer[2] = Resources::GetImageData("player3_point.png"); + pointer[3] = Resources::GetImageData("player4_point.png"); } ResumeGui(); } diff --git a/source/menu/menu_format.cpp b/source/menu/menu_format.cpp index 05142d32..c1f57749 100644 --- a/source/menu/menu_format.cpp +++ b/source/menu/menu_format.cpp @@ -23,7 +23,6 @@ int MenuFormat() USBStorage2_Init(); int menu = MENU_NONE; - char imgPath[100]; customOptionList options(MAX_PARTITIONS_EX); extern PartList partitions; @@ -56,19 +55,15 @@ int MenuFormat() GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume); // because destroy GuiSound must wait while sound playing is finished, we use a global sound if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - snprintf(imgPath, sizeof(imgPath), "%swiimote_poweroff.png", Settings.theme_path); - GuiImageData btnpwroff(imgPath, wiimote_poweroff_png); - snprintf(imgPath, sizeof(imgPath), "%swiimote_poweroff_over.png", Settings.theme_path); - GuiImageData btnpwroffOver(imgPath, wiimote_poweroff_over_png); - snprintf(imgPath, sizeof(imgPath), "%smenu_button.png", Settings.theme_path); - GuiImageData btnhome(imgPath, menu_button_png); - snprintf(imgPath, sizeof(imgPath), "%smenu_button_over.png", Settings.theme_path); - GuiImageData btnhomeOver(imgPath, menu_button_over_png); - GuiImageData battery(battery_png); - GuiImageData batteryBar(battery_bar_png); - GuiImageData batteryRed(battery_red_png); - GuiImageData batteryBarRed(battery_bar_red_png); + + GuiImageData btnpwroff(Resources::GetFile("wiimote_poweroff.png"), Resources::GetFileSize("wiimote_poweroff.png")); + GuiImageData btnpwroffOver(Resources::GetFile("wiimote_poweroff_over.png"), Resources::GetFileSize("wiimote_poweroff_over.png")); + GuiImageData btnhome(Resources::GetFile("menu_button.png"), Resources::GetFileSize("menu_button.png")); + GuiImageData btnhomeOver(Resources::GetFile("menu_button_over.png"), Resources::GetFileSize("menu_button_over.png")); + GuiImageData battery(Resources::GetFile("battery.png"), Resources::GetFileSize("battery.png")); + GuiImageData batteryBar(Resources::GetFile("battery_bar.png"), Resources::GetFileSize("battery_bar.png")); + GuiImageData batteryRed(Resources::GetFile("battery_red.png"), Resources::GetFileSize("battery_red.png")); + GuiImageData batteryBarRed(Resources::GetFile("battery_bar_red.png"), Resources::GetFileSize("battery_bar_red.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -89,8 +84,7 @@ int MenuFormat() 1); exitBtn.SetTrigger(&trigHome); - GuiCustomOptionBrowser optionBrowser(396, 280, &options, Settings.theme_path, "bg_options_settings.png", - bg_options_settings_png, 0, 10); + GuiCustomOptionBrowser optionBrowser(396, 280, &options, "bg_options_settings.png", 0, 10); optionBrowser.SetPosition(0, 40); optionBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); diff --git a/source/menu/menu_install.cpp b/source/menu/menu_install.cpp index 6055d2f3..b85a3a8b 100644 --- a/source/menu/menu_install.cpp +++ b/source/menu/menu_install.cpp @@ -5,6 +5,7 @@ #include "usbloader/utils.h" #include "usbloader/GameList.h" #include "prompts/ProgressWindow.h" +#include "themes/CTheme.h" float gamesize; @@ -26,16 +27,10 @@ int MenuInstall() GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume); - char imgPath[100]; - - snprintf(imgPath, sizeof(imgPath), "%sbattery.png", Settings.theme_path); - GuiImageData battery(imgPath, battery_png); - snprintf(imgPath, sizeof(imgPath), "%sbattery_bar.png", Settings.theme_path); - GuiImageData batteryBar(imgPath, battery_bar_png); - snprintf(imgPath, sizeof(imgPath), "%sbattery_red.png", Settings.theme_path); - GuiImageData batteryRed(imgPath, battery_red_png); - snprintf(imgPath, sizeof(imgPath), "%sbattery_bar_red.png", Settings.theme_path); - GuiImageData batteryBarRed(imgPath, battery_bar_red_png); + GuiImageData battery(Resources::GetFile("battery.png"), Resources::GetFileSize("battery.png")); + GuiImageData batteryBar(Resources::GetFile("battery_bar.png"), Resources::GetFileSize("battery_bar.png")); + GuiImageData batteryRed(Resources::GetFile("battery_red.png"), Resources::GetFileSize("battery_red.png")); + GuiImageData batteryBarRed(Resources::GetFile("battery_bar_red.png"), Resources::GetFileSize("battery_bar_red.png")); HaltGui(); GuiWindow w(screenwidth, screenheight); diff --git a/source/prompts/DiscBrowser.cpp b/source/prompts/DiscBrowser.cpp index 593a0ba7..600274da 100644 --- a/source/prompts/DiscBrowser.cpp +++ b/source/prompts/DiscBrowser.cpp @@ -156,12 +156,8 @@ int DiscBrowse(struct discHdr * header) if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sgamesettings_background.png", Settings.theme_path); - GuiImageData settingsbg(imgPath, settings_background_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData settingsbg(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -198,8 +194,7 @@ int DiscBrowse(struct discHdr * header) u8 scrollbaron = 0; if (dolfilecount > 9) scrollbaron = 1; - GuiCustomOptionBrowser optionBrowser3(396, 280, &options3, Settings.theme_path, "bg_options_gamesettings.png", - bg_options_settings_png, dolfilecount > 9 ? 1 : 0, 200); + GuiCustomOptionBrowser optionBrowser3(396, 280, &options3, "bg_options_gamesettings.png", dolfilecount > 9 ? 1 : 0, 200); optionBrowser3.SetPosition(0, 90); optionBrowser3.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); diff --git a/source/prompts/ProgressWindow.cpp b/source/prompts/ProgressWindow.cpp index ba027015..805c9bd7 100644 --- a/source/prompts/ProgressWindow.cpp +++ b/source/prompts/ProgressWindow.cpp @@ -128,11 +128,8 @@ static void ProgressWindow(const char *title, const char *msg1, const char *msg2 promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); promptWindow.SetPosition(0, -10); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -143,8 +140,7 @@ static void ProgressWindow(const char *title, const char *msg1, const char *msg2 dialogBoxImg.SetWidescreen(Settings.widescreen); } - snprintf(imgPath, sizeof(imgPath), "%sprogressbar_outline.png", Settings.theme_path); - GuiImageData progressbarOutline(imgPath, progressbar_outline_png); + GuiImageData progressbarOutline(Resources::GetFile("progressbar_outline.png"), Resources::GetFileSize("progressbar_outline.png")); GuiImage progressbarOutlineImg(&progressbarOutline); if (Settings.wsprompt == yes) @@ -154,15 +150,13 @@ static void ProgressWindow(const char *title, const char *msg1, const char *msg2 progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarOutlineImg.SetPosition(25, 40); - snprintf(imgPath, sizeof(imgPath), "%sprogressbar_empty.png", Settings.theme_path); - GuiImageData progressbarEmpty(imgPath, progressbar_empty_png); + GuiImageData progressbarEmpty(Resources::GetFile("progressbar_empty.png"), Resources::GetFileSize("button_dialogue_box.png")); GuiImage progressbarEmptyImg(&progressbarEmpty); progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarEmptyImg.SetPosition(25, 40); progressbarEmptyImg.SetTile(100); - snprintf(imgPath, sizeof(imgPath), "%sprogressbar.png", Settings.theme_path); - GuiImageData progressbar(imgPath, progressbar_png); + GuiImageData progressbar(Resources::GetFile("progressbar.png"), Resources::GetFileSize("progressbar.png")); GuiImage progressbarImg(&progressbar); progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarImg.SetPosition(25, 40); diff --git a/source/prompts/PromptWindows.cpp b/source/prompts/PromptWindows.cpp index f034c4e7..63ace9c0 100644 --- a/source/prompts/PromptWindows.cpp +++ b/source/prompts/PromptWindows.cpp @@ -78,9 +78,7 @@ int OnScreenNumpad(char * var, u32 maxlen) // because destroy GuiSound must wait while sound playing is finished, we use a global sound if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -168,9 +166,7 @@ int OnScreenKeyboard(char * var, u32 maxlen, int min) if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -254,12 +250,12 @@ void WindowCredits() GuiWindow creditsWindowBox(580, 448); creditsWindowBox.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); - GuiImageData creditsBox(credits_bg_png); + GuiImageData creditsBox(credits_bg_png, credits_bg_png_size); GuiImage creditsBoxImg(&creditsBox); creditsBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); creditsWindowBox.Append(&creditsBoxImg); - GuiImageData star(little_star_png); + GuiImageData star(little_star_png, little_star_png_size); GuiImage starImg(&star); starImg.SetWidescreen(Settings.widescreen); //added starImg.SetAlignment(ALIGN_LEFT, ALIGN_TOP); @@ -471,13 +467,11 @@ int WindowScreensaver() gprintf("WindowScreenSaver()\n"); int i = 0; bool exit = false; - char imgPath[100];//uncomment for themable screensaver /* initialize random seed: */ srand(time(NULL)); - snprintf(imgPath, sizeof(imgPath), "%sscreensaver.png", Settings.theme_path);//uncomment for themable screensaver - GuiImageData GXlogo(imgPath, gxlogo_png);//uncomment for themable screensaver + GuiImageData GXlogo(Resources::GetFile("gxlogo.png"), Resources::GetFileSize("gxlogo.png"));//uncomment for themable screensaver //GuiImageData GXlogo(gxlogo_png);//comment for themable screensaver GuiImage GXlogoImg(&GXlogo); GXlogoImg.SetPosition(172, 152); @@ -545,12 +539,9 @@ int WindowPrompt(const char *title, const char *msg, const char *btn1Label, cons GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume); // because destroy GuiSound must wait while sound playing is finished, we use a global sound if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); + + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -837,7 +828,6 @@ int WindowExitPrompt() homeout->SetLoop(0); int choice = -1; - char imgPath[100]; u64 oldstub = getStubDest(); loadStub(); @@ -851,22 +841,18 @@ int WindowExitPrompt() if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - GuiImageData top(exit_top_png); - GuiImageData topOver(exit_top_over_png); - GuiImageData bottom(exit_bottom_png); - GuiImageData bottomOver(exit_bottom_over_png); - GuiImageData button(exit_button_png); - GuiImageData wiimote(wiimote_png); - GuiImageData close(closebutton_png); + GuiImageData top(exit_top_png, exit_top_png_size); + GuiImageData topOver(exit_top_over_png, exit_top_over_png_size); + GuiImageData bottom(exit_bottom_png, exit_bottom_png_size); + GuiImageData bottomOver(exit_bottom_over_png, exit_bottom_over_png_size); + GuiImageData button(exit_button_png, exit_button_png_size); + GuiImageData wiimote(wiimote_png, wiimote_png_size); + GuiImageData close(closebutton_png, closebutton_png_size); - snprintf(imgPath, sizeof(imgPath), "%sbattery_white.png", Settings.theme_path); - GuiImageData battery(imgPath, battery_white_png); - snprintf(imgPath, sizeof(imgPath), "%sbattery_bar_white.png", Settings.theme_path); - GuiImageData batteryBar(imgPath, battery_bar_white_png); - snprintf(imgPath, sizeof(imgPath), "%sbattery_red.png", Settings.theme_path); - GuiImageData batteryRed(imgPath, battery_red_png); - snprintf(imgPath, sizeof(imgPath), "%sbattery_bar_red.png", Settings.theme_path); - GuiImageData batteryBarRed(imgPath, battery_bar_red_png); + GuiImageData battery(Resources::GetFile("battery_white.png"), Resources::GetFileSize("battery_white.png")); + GuiImageData batteryBar(Resources::GetFile("battery_bar_white.png"), Resources::GetFileSize("battery_bar_white.png")); + GuiImageData batteryRed(Resources::GetFile("battery_red.png"), Resources::GetFileSize("battery_red.png")); + GuiImageData batteryBarRed(Resources::GetFile("battery_bar_red.png"), Resources::GetFileSize("battery_bar_red.png")); int i = 0, ret = 0, level; char txt[3]; @@ -1188,19 +1174,13 @@ int GameWindowPrompt() if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); - snprintf(imgPath, sizeof(imgPath), "%sfavorite.png", Settings.theme_path); - GuiImageData imgFavorite(imgPath, favorite_png); - snprintf(imgPath, sizeof(imgPath), "%snot_favorite.png", Settings.theme_path); - GuiImageData imgNotFavorite(imgPath, not_favorite_png); + GuiImageData imgFavorite(Resources::GetFile("favorite.png"), Resources::GetFileSize("favorite.png")); + GuiImageData imgNotFavorite(Resources::GetFile("not_favorite.png"), Resources::GetFileSize("not_favorite.png")); - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_left.png", Settings.theme_path); - GuiImageData imgLeft(imgPath, startgame_arrow_left_png); - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_right.png", Settings.theme_path); - GuiImageData imgRight(imgPath, startgame_arrow_right_png); + GuiImageData imgLeft(Resources::GetFile("startgame_arrow_left.png"), Resources::GetFileSize("startgame_arrow_left.png")); + GuiImageData imgRight(Resources::GetFile("startgame_arrow_right.png"), Resources::GetFileSize("startgame_arrow_right.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -1220,12 +1200,13 @@ int GameWindowPrompt() GuiButton screenShotBtn(0, 0); screenShotBtn.SetPosition(0, 0); screenShotBtn.SetTrigger(&trigZ); + + const char * image = "dialogue_box_startgame.png"; if (Settings.widescreen) - snprintf(imgPath, sizeof(imgPath), "%swdialogue_box_startgame.png", Settings.theme_path); - else snprintf(imgPath, sizeof(imgPath), "%sdialogue_box_startgame.png", Settings.theme_path); + image = "wdialogue_box_startgame.png"; - GuiImageData dialogBox(imgPath, Settings.widescreen ? wdialogue_box_startgame_png : dialogue_box_startgame_png); + GuiImageData dialogBox(Resources::GetFile(image), Resources::GetFileSize(image)); GuiImage dialogBoxImg(&dialogBox); GuiTooltip nameBtnTT(tr( "Rename Game on WBFS" )); @@ -1428,15 +1409,15 @@ int GameWindowPrompt() gprintf("\t%s\n", IDFull); if (diskCover) delete diskCover; - + char imgPath[150]; snprintf(imgPath, sizeof(imgPath), "%s%s.png", Settings.disc_path, IDFull); //changed to current full id - diskCover = new GuiImageData(imgPath, 0); + diskCover = new GuiImageData(imgPath); if (!diskCover->GetImage()) { delete diskCover; snprintf(imgPath, sizeof(imgPath), "%s%s.png", Settings.disc_path, ID); //changed to current id - diskCover = new GuiImageData(imgPath, 0); + diskCover = new GuiImageData(imgPath); if (!diskCover->GetImage()) { @@ -1444,12 +1425,11 @@ int GameWindowPrompt() delete diskCover; snprintf(imgPath, sizeof(imgPath), "%s%s.png", Settings.disc_path, ID); //changed to current id - diskCover = new GuiImageData(imgPath, 0); + diskCover = new GuiImageData(imgPath); if (!diskCover->GetImage()) { delete diskCover; - snprintf(imgPath, sizeof(imgPath), "%snodisc.png", Settings.theme_path); //changed to nodisc.png - diskCover = new GuiImageData(imgPath, nodisc_png); + diskCover = Resources::GetImageData("nodisc.png"); } } } @@ -1787,11 +1767,8 @@ int DiscWait(const char *title, const char *msg, const char *btn1Label, const ch if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); GuiTrigger trigB; @@ -1938,11 +1915,8 @@ int FormatingPartition(const char *title, partitionEntry *entry) promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); promptWindow.SetPosition(0, -10); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -1996,11 +1970,8 @@ bool SearchMissingImages(int choice2) if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -2131,11 +2102,8 @@ bool NetworkInitPrompt() if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -2240,11 +2208,8 @@ int ProgressDownloadWindow(int choice2) if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -2254,8 +2219,7 @@ int ProgressDownloadWindow(int choice2) dialogBoxImg.SetWidescreen(Settings.widescreen); } - snprintf(imgPath, sizeof(imgPath), "%sprogressbar_outline.png", Settings.theme_path); - GuiImageData progressbarOutline(imgPath, progressbar_outline_png); + GuiImageData progressbarOutline(Resources::GetFile("progressbar_outline.png"), Resources::GetFileSize("progressbar_outline.png")); GuiImage progressbarOutlineImg(&progressbarOutline); if (Settings.wsprompt == yes) { @@ -2264,15 +2228,13 @@ int ProgressDownloadWindow(int choice2) progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarOutlineImg.SetPosition(25, 40); - snprintf(imgPath, sizeof(imgPath), "%sprogressbar_empty.png", Settings.theme_path); - GuiImageData progressbarEmpty(imgPath, progressbar_empty_png); + GuiImageData progressbarEmpty(Resources::GetFile("progressbar_empty.png"), Resources::GetFileSize("progressbar_empty.png")); GuiImage progressbarEmptyImg(&progressbarEmpty); progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarEmptyImg.SetPosition(25, 40); progressbarEmptyImg.SetTile(100); - snprintf(imgPath, sizeof(imgPath), "%sprogressbar.png", Settings.theme_path); - GuiImageData progressbar(imgPath, progressbar_png); + GuiImageData progressbar(Resources::GetFile("progressbar.png"), Resources::GetFileSize("progressbar.png")); GuiImage progressbarImg(&progressbar); progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarImg.SetPosition(25, 40); @@ -3215,11 +3177,8 @@ int ProgressUpdateWindow() if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -3229,8 +3188,7 @@ int ProgressUpdateWindow() dialogBoxImg.SetWidescreen(Settings.widescreen); } - snprintf(imgPath, sizeof(imgPath), "%sprogressbar_outline.png", Settings.theme_path); - GuiImageData progressbarOutline(imgPath, progressbar_outline_png); + GuiImageData progressbarOutline(Resources::GetFile("progressbar_outline.png"), Resources::GetFileSize("progressbar_outline.png")); GuiImage progressbarOutlineImg(&progressbarOutline); if (Settings.wsprompt == yes) { @@ -3239,15 +3197,13 @@ int ProgressUpdateWindow() progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarOutlineImg.SetPosition(25, 7); - snprintf(imgPath, sizeof(imgPath), "%sprogressbar_empty.png", Settings.theme_path); - GuiImageData progressbarEmpty(imgPath, progressbar_empty_png); + GuiImageData progressbarEmpty(Resources::GetFile("progressbar_empty.png"), Resources::GetFileSize("progressbar_empty.png")); GuiImage progressbarEmptyImg(&progressbarEmpty); progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarEmptyImg.SetPosition(25, 7); progressbarEmptyImg.SetTile(100); - snprintf(imgPath, sizeof(imgPath), "%sprogressbar.png", Settings.theme_path); - GuiImageData progressbar(imgPath, progressbar_png); + GuiImageData progressbar(Resources::GetFile("progressbar.png"), Resources::GetFileSize("progressbar.png")); GuiImage progressbarImg(&progressbar); progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarImg.SetPosition(25, 7); @@ -3614,11 +3570,8 @@ int CodeDownload(const char *id) if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -3801,28 +3754,22 @@ int HBCWindowPrompt(const char *name, const char *coder, const char *version, co // because destroy GuiSound must wait while sound playing is finished, we use a global sound if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sbg_options.png", Settings.theme_path); - GuiImageData whiteBox(imgPath, bg_options_png); + + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); + GuiImageData whiteBox(Resources::GetFile("bg_options.png"), Resources::GetFileSize("bg_options.png")); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar.png", Settings.theme_path); - GuiImageData scrollbar(imgPath, scrollbar_png); + GuiImageData scrollbar(Resources::GetFile("scrollbar.png"), Resources::GetFileSize("scrollbar.png")); GuiImage scrollbarImg(&scrollbar); scrollbarImg.SetAlignment(ALIGN_RIGHT, ALIGN_TOP); scrollbarImg.SetPosition(-40, 114); scrollbarImg.SetSkew(0, 0, 0, 0, 0, -120, 0, -120); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_arrowdown.png", Settings.theme_path); - GuiImageData arrowDown(imgPath, scrollbar_arrowdown_png); + GuiImageData arrowDown(Resources::GetFile("scrollbar_arrowdown.png"), Resources::GetFileSize("scrollbar_arrowdown.png")); GuiImage arrowDownImg(&arrowDown); arrowDownImg.SetScale(.8); - snprintf(imgPath, sizeof(imgPath), "%sscrollbar_arrowup.png", Settings.theme_path); - GuiImageData arrowUp(imgPath, scrollbar_arrowup_png); + GuiImageData arrowUp(Resources::GetFile("scrollbar_arrowup.png"), Resources::GetFileSize("scrollbar_arrowup.png")); GuiImage arrowUpImg(&arrowUp); arrowUpImg.SetScale(.8); @@ -3846,13 +3793,20 @@ int HBCWindowPrompt(const char *name, const char *coder, const char *version, co GuiImageData *iconData = NULL; GuiImage *iconImg = NULL; + + char imgPath[150]; snprintf(imgPath, sizeof(imgPath), "%s", iconPath); bool iconExist = CheckFile(imgPath); if (iconExist) { - iconData = new GuiImageData(iconPath, dialogue_box_png); - iconImg = new GuiImage(iconData); + iconData = new GuiImageData(imgPath); + if(!iconData->GetImage()) + { + delete iconData; + iconData = new GuiImageData(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); + } + iconImg = new GuiImage(iconData); iconImg->SetAlignment(ALIGN_LEFT, ALIGN_TOP); iconImg->SetPosition(45, 10); } diff --git a/source/prompts/TitleBrowser.cpp b/source/prompts/TitleBrowser.cpp index b9fcd3b5..277eff34 100644 --- a/source/prompts/TitleBrowser.cpp +++ b/source/prompts/TitleBrowser.cpp @@ -130,12 +130,8 @@ bool TitleSelector(char output[]) // because destroy GuiSound must wait while sound playing is finished, we use a global sound if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sgamesettings_background.png", Settings.theme_path); - GuiImageData settingsbg(imgPath, settings_background_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData settingsbg(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png")); GuiImage settingsbackground(&settingsbg); GuiButton settingsbackgroundbtn(settingsbackground.GetWidth(), settingsbackground.GetHeight()); @@ -163,8 +159,7 @@ bool TitleSelector(char output[]) u8 scrollbaron = 0; if (num_titles + 1 > 9) scrollbaron = 1; - GuiCustomOptionBrowser optionBrowser4(396, 280, &options4, Settings.theme_path, "bg_options_gamesettings.png", - bg_options_settings_png, scrollbaron, 200); + GuiCustomOptionBrowser optionBrowser4(396, 280, &options4, "bg_options_gamesettings.png", scrollbaron, 200); optionBrowser4.SetPosition(0, 90); optionBrowser4.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); @@ -362,12 +357,8 @@ int TitleBrowser() if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sgamesettings_background.png", Settings.theme_path); - GuiImageData settingsbg(imgPath, settings_background_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData settingsbg(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -404,13 +395,11 @@ int TitleBrowser() u8 scrollbaron = 0; if (total + 1 > 9) scrollbaron = 1; - GuiCustomOptionBrowser optionBrowser3(396, 280, &options3, Settings.theme_path, "bg_options_gamesettings.png", - bg_options_settings_png, scrollbaron, 200); + GuiCustomOptionBrowser optionBrowser3(396, 280, &options3, "bg_options_gamesettings.png", scrollbaron, 200); optionBrowser3.SetPosition(0, 90); optionBrowser3.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); - snprintf(imgPath, sizeof(imgPath), "%sWifi_btn.png", Settings.theme_path); - GuiImageData wifiImgData(imgPath, Wifi_btn_png); + GuiImageData wifiImgData(Resources::GetFile("Wifi_btn.png"), Resources::GetFileSize("Wifi_btn.png")); GuiImage wifiImg(&wifiImgData); if (Settings.wsprompt == yes) { diff --git a/source/prompts/filebrowser.cpp b/source/prompts/filebrowser.cpp index 0a6790da..b57f03af 100644 --- a/source/prompts/filebrowser.cpp +++ b/source/prompts/filebrowser.cpp @@ -310,7 +310,7 @@ int BrowseDevice(char * Path, int Path_size, int Flags, FILTERCASCADE *Filter/*= if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - GuiImageData folderImgData(icon_folder_png); + GuiImageData folderImgData(Resources::GetFile("icon_folder.png"), Resources::GetFileSize("icon_folder.png")); GuiImage folderImg(&folderImgData); GuiButton folderBtn(folderImg.GetWidth(), folderImg.GetHeight()); folderBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE); @@ -319,9 +319,7 @@ int BrowseDevice(char * Path, int Path_size, int Flags, FILTERCASCADE *Filter/*= folderBtn.SetTrigger(&trigA); folderBtn.SetEffectGrow(); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); GuiText ExitBtnTxt(tr( "Cancel" ), 24, ( GXColor ) { 0, 0, 0, 255}); GuiImage ExitBtnImg(&btnOutline); @@ -369,7 +367,7 @@ int BrowseDevice(char * Path, int Path_size, int Flags, FILTERCASCADE *Filter/*= fileBrowser.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); fileBrowser.SetPosition(0, 120); - GuiImageData Address(addressbar_textbox_png); + GuiImageData Address(Resources::GetFile("addressbar_textbox.png"), Resources::GetFileSize("addressbar_textbox.png")); GuiText AdressText((char*) NULL, 20, ( GXColor ) { 0, 0, 0, 255}); AdressText.SetTextf("%s%s", browser->rootdir, browser->dir); diff --git a/source/prompts/gameinfo.cpp b/source/prompts/gameinfo.cpp index 143a5ba5..15107930 100644 --- a/source/prompts/gameinfo.cpp +++ b/source/prompts/gameinfo.cpp @@ -18,6 +18,7 @@ #include "fatmounter.h" #include "FileOperations/fileops.h" #include "prompts/PromptWindows.h" +#include "themes/CTheme.h" #include "gameinfo.h" #include "usbloader/GameList.h" #include "../gecko.h" @@ -137,17 +138,12 @@ int showGameInfo(char *ID) GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume); GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sgameinfo1_png.png", Settings.theme_path); - GuiImageData dialogBox1(imgPath, gameinfo1_png); - snprintf(imgPath, sizeof(imgPath), "%sgameinfo1a_png.png", Settings.theme_path); - GuiImageData dialogBox2(imgPath, gameinfo1a_png); - snprintf(imgPath, sizeof(imgPath), "%sgameinfo2_png.png", Settings.theme_path); - GuiImageData dialogBox3(imgPath, gameinfo2_png); - snprintf(imgPath, sizeof(imgPath), "%sgameinfo2a_png.png", Settings.theme_path); - GuiImageData dialogBox4(imgPath, gameinfo2a_png); + + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox1(Resources::GetFile("gameinfo1.png"), Resources::GetFileSize("gameinfo1.png")); + GuiImageData dialogBox2(Resources::GetFile("gameinfo1a.png"), Resources::GetFileSize("gameinfo1a.png")); + GuiImageData dialogBox3(Resources::GetFile("gameinfo2.png"), Resources::GetFileSize("gameinfo2.png")); + GuiImageData dialogBox4(Resources::GetFile("gameinfo2a.png"), Resources::GetFileSize("gameinfo2a.png")); GuiTrigger trig1; trig1.SetButtonOnlyTrigger(-1, WPAD_BUTTON_1 | WPAD_CLASSIC_BUTTON_X, 0); @@ -217,59 +213,56 @@ int showGameInfo(char *ID) // switch icons if (nunchuk) - nunchukImgData = new GuiImageData(nunchukR_png); - else nunchukImgData = new GuiImageData(nunchuk_png); + nunchukImgData = Resources::GetImageData("nunchukR.png"); + else nunchukImgData = Resources::GetImageData("nunchuk.png"); if (classiccontroller) - classiccontrollerImgData = new GuiImageData(classiccontrollerR_png); - else classiccontrollerImgData = new GuiImageData(classiccontroller_png); + classiccontrollerImgData = Resources::GetImageData("classiccontrollerR.png"); + else classiccontrollerImgData = Resources::GetImageData("classiccontroller.png"); if (guitar) - guitarImgData = new GuiImageData(guitarR_png); - else guitarImgData = new GuiImageData(guitar_png); + guitarImgData = Resources::GetImageData("guitarR.png"); + else guitarImgData = Resources::GetImageData("guitar.png"); if (gamecube) - gamecubeImgData = new GuiImageData(gcncontrollerR_png); - else gamecubeImgData = new GuiImageData(gcncontroller_png); + gamecubeImgData = Resources::GetImageData("gcncontrollerR.png"); + else gamecubeImgData = Resources::GetImageData("gcncontroller.png"); if (wheel) - wheelImgData = new GuiImageData(wheelR_png); - else wheelImgData = new GuiImageData(wheel_png); + wheelImgData = Resources::GetImageData("wheelR.png"); + else wheelImgData = Resources::GetImageData("wheel.png"); if (motionplus) - motionplusImgData = new GuiImageData(motionplusR_png); - else motionplusImgData = new GuiImageData(motionplus_png); + motionplusImgData = Resources::GetImageData("motionplusR.png"); + else motionplusImgData = Resources::GetImageData("motionplus.png"); if (drums) - drumsImgData = new GuiImageData(drumsR_png); - else drumsImgData = new GuiImageData(drums_png); + drumsImgData = Resources::GetImageData("drumsR.png"); + else drumsImgData = Resources::GetImageData("drums.png"); if (microphone) - microphoneImgData = new GuiImageData(microphoneR_png); - else microphoneImgData = new GuiImageData(microphone_png); + microphoneImgData = Resources::GetImageData("microphoneR.png"); + else microphoneImgData = Resources::GetImageData("microphone.png"); if (zapper) - zapperImgData = new GuiImageData(zapperR_png); - else zapperImgData = new GuiImageData(zapper_png); + zapperImgData = Resources::GetImageData("zapperR.png"); + else zapperImgData = Resources::GetImageData("zapper.png"); if (wiispeak) - wiispeakImgData = new GuiImageData(wiispeakR_png); - else wiispeakImgData = new GuiImageData(wiispeak_png); + wiispeakImgData = Resources::GetImageData("wiispeakR.png"); + else wiispeakImgData = Resources::GetImageData("wiispeak.png"); if (nintendods) - nintendodsImgData = new GuiImageData(nintendodsR_png); - else nintendodsImgData = new GuiImageData(nintendods_png); - - //if (vitalitysensor) vitalitysensorImgData = new GuiImageData(vitalitysensorR_png); - //else vitalitysensorImgData = new GuiImageData(vitalitysensor_png); + nintendodsImgData = Resources::GetImageData("nintendodsR.png"); + else nintendodsImgData = Resources::GetImageData("nintendods.png"); if (balanceboard) - balanceboardImgData = new GuiImageData(balanceboardR_png); - else balanceboardImgData = new GuiImageData(balanceboard_png); + balanceboardImgData = Resources::GetImageData("balanceboardR.png"); + else balanceboardImgData = Resources::GetImageData("balanceboard.png"); if (dancepad) - dancepadImgData = new GuiImageData(dancepadR_png); - else dancepadImgData = new GuiImageData(dancepad_png); + dancepadImgData = Resources::GetImageData("dancepadR.png"); + else dancepadImgData = Resources::GetImageData("dancepad.png"); // look for optional accessories for (int i = 1; i <= XML_ELEMMAX; i++) @@ -311,14 +304,14 @@ int showGameInfo(char *ID) gameinfoWindow.Append(dialogBoxImg2); gameinfoWindow.Append(dialogBoxImg3); gameinfoWindow.Append(dialogBoxImg4); - + + char imgPath[150]; snprintf(imgPath, sizeof(imgPath), "%s%s.png", Settings.covers_path, ID); - cover = new GuiImageData(imgPath, 0); //load full id image + cover = new GuiImageData(imgPath); //load full id image if (!cover->GetImage()) { delete cover; - snprintf(imgPath, sizeof(imgPath), "%snoimage.png", Settings.covers_path); - cover = new GuiImageData(imgPath, nocover_png); //load no image + cover = Resources::GetImageData("nocover.png"); } delete coverImg; coverImg = NULL; @@ -331,14 +324,14 @@ int showGameInfo(char *ID) // # of players if (strcmp(gameinfo.players, "") != 0) { - playersImgData = new GuiImageData(Wiimote1_png); + playersImgData = Resources::GetImageData("wiimote1.png"); if (atoi(gameinfo.players) > 1) { - playersImgData = new GuiImageData(Wiimote2_png); + playersImgData = Resources::GetImageData("wiimote2.png"); } if (atoi(gameinfo.players) > 2) { - playersImgData = new GuiImageData(Wiimote4_png); + playersImgData = Resources::GetImageData("wiimote4.png"); } playersImg = new GuiImage(playersImgData); @@ -450,16 +443,6 @@ int showGameInfo(char *ID) gameinfoWindow.Append(nintendodsImg); intputX += (Settings.widescreen ? nintendodsImg->GetWidth() * .8 : nintendodsImg->GetWidth()) + 5; } - /* - if (vitalitysensor==1) { - vitalitysensorImg = new GuiImage(vitalitysensorImgData); - vitalitysensorImg->SetWidescreen(Settings.widescreen); - vitalitysensorImg->SetPosition(intputX , inputY); - vitalitysensorImg->SetAlignment(0,4); - gameinfoWindow.Append(vitalitysensorImg); - intputX += (Settings.widescreen ? vitalitysensorImg->GetWidth() * .8 : vitalitysensorImg->GetWidth())+5; - } - */ if (dancepad == 1) { dancepadImg = new GuiImage(dancepadImgData); @@ -482,36 +465,30 @@ int showGameInfo(char *ID) // # online players if ((strcmp(gameinfo.wifiplayers, "") != 0) && (strcmp(gameinfo.wifiplayers, "0") != 0)) { - wifiplayersImgData = new GuiImageData(wifi1_png); + wifiplayersImgData = Resources::GetImageData("wifi1.png"); if (atoi(gameinfo.wifiplayers) > 1) { - wifiplayersImgData = new GuiImageData(wifi2_png); + wifiplayersImgData = Resources::GetImageData("wifi2.png"); } if (atoi(gameinfo.wifiplayers) > 2) { - wifiplayersImgData = new GuiImageData(wifi4_png); + wifiplayersImgData = Resources::GetImageData("wifi4.png"); } if (atoi(gameinfo.wifiplayers) > 4) { - //wifiplayersImgData= new GuiImageData(wifi6_png); - wifiplayersImgData = new GuiImageData(wifi8_png); + wifiplayersImgData =Resources::GetImageData("wifi8.png"); } - /* - if (atoi(gameinfo.wifiplayers)>6) { - wifiplayersImgData= new GuiImageData(wifi8_png); - } - */ if (atoi(gameinfo.wifiplayers) > 8) { - wifiplayersImgData = new GuiImageData(wifi12_png); + wifiplayersImgData = Resources::GetImageData("wifi12.png"); } if (atoi(gameinfo.wifiplayers) > 12) { - wifiplayersImgData = new GuiImageData(wifi16_png); + wifiplayersImgData = Resources::GetImageData("wifi16.png"); } if (atoi(gameinfo.wifiplayers) > 16) { - wifiplayersImgData = new GuiImageData(wifi32_png); + wifiplayersImgData = Resources::GetImageData("wifi32.png"); } wifiplayersImg = new GuiImage(wifiplayersImgData); wifiplayersImg->SetWidescreen(Settings.widescreen); @@ -527,60 +504,60 @@ int showGameInfo(char *ID) if (strcmp(gameinfo.ratingtype, "ESRB") == 0) { if (strcmp(gameinfo.ratingvalueESRB, "EC") == 0) - ratingImgData = new GuiImageData(esrb_ec_png); + ratingImgData = Resources::GetImageData("esrb_ec.png"); else if (strcmp(gameinfo.ratingvalueESRB, "E") == 0) - ratingImgData = new GuiImageData(esrb_e_png); + ratingImgData = Resources::GetImageData("esrb_e.png"); else if (strcmp(gameinfo.ratingvalueESRB, "E10+") == 0) - ratingImgData = new GuiImageData(esrb_eten_png); + ratingImgData = Resources::GetImageData("esrb_eten.png"); else if (strcmp(gameinfo.ratingvalueESRB, "T") == 0) - ratingImgData = new GuiImageData(esrb_t_png); + ratingImgData = Resources::GetImageData("esrb_t.png"); else if (strcmp(gameinfo.ratingvalueESRB, "M") == 0) - ratingImgData = new GuiImageData(esrb_m_png); + ratingImgData = Resources::GetImageData("esrb_m.png"); else if (strcmp(gameinfo.ratingvalueESRB, "AO") == 0) - ratingImgData = new GuiImageData(esrb_ao_png); + ratingImgData = Resources::GetImageData("esrb_ao.png"); else { - ratingImgData = new GuiImageData(norating_png); + ratingImgData = Resources::GetImageData("norating.png"); } } //there are 2 values here cause some countries are stupid and else if (strcmp(gameinfo.ratingtype, "PEGI") == 0) //can't use the same as everybody else { if ((strcmp(gameinfo.ratingvaluePEGI, "3") == 0) || (strcmp(gameinfo.ratingvaluePEGI, "4") == 0)) - ratingImgData = new GuiImageData(pegi_3_png); + ratingImgData = Resources::GetImageData("pegi_3.png"); else if ((strcmp(gameinfo.ratingvaluePEGI, "7") == 0) || (strcmp(gameinfo.ratingvaluePEGI, "7") == 0)) - ratingImgData = new GuiImageData(pegi_7_png); + ratingImgData = Resources::GetImageData("pegi_7.png"); else if (strcmp(gameinfo.ratingvaluePEGI, "12") == 0) - ratingImgData = new GuiImageData(pegi_12_png); + ratingImgData = Resources::GetImageData("pegi_12.png"); else if ((strcmp(gameinfo.ratingvaluePEGI, "16") == 0) || (strcmp(gameinfo.ratingvaluePEGI, "15") == 0)) - ratingImgData = new GuiImageData(pegi_16_png); + ratingImgData = Resources::GetImageData("pegi_16.png"); else if (strcmp(gameinfo.ratingvaluePEGI, "18") == 0) - ratingImgData = new GuiImageData(pegi_18_png); + ratingImgData = Resources::GetImageData("pegi_18.png"); else { - ratingImgData = new GuiImageData(norating_png); + ratingImgData = Resources::GetImageData("norating.png"); } } else if (strcmp(gameinfo.ratingtype, "CERO") == 0) { if (strcmp(gameinfo.ratingvalueCERO, "A") == 0) - ratingImgData = new GuiImageData(cero_a_png); + ratingImgData = Resources::GetImageData("cero_a.png"); else if (strcmp(gameinfo.ratingvalueCERO, "B") == 0) - ratingImgData = new GuiImageData(cero_b_png); + ratingImgData = Resources::GetImageData("cero_b.png"); else if (strcmp(gameinfo.ratingvalueCERO, "C") == 0) - ratingImgData = new GuiImageData(cero_c_png); + ratingImgData = Resources::GetImageData("cero_c.png"); else if (strcmp(gameinfo.ratingvalueCERO, "D") == 0) - ratingImgData = new GuiImageData(cero_d_png); + ratingImgData = Resources::GetImageData("cero_d.png"); else if (strcmp(gameinfo.ratingvalueCERO, "Z") == 0) - ratingImgData = new GuiImageData(cero_z_png); + ratingImgData = Resources::GetImageData("cero_z.png"); else { - ratingImgData = new GuiImageData(norating_png); + ratingImgData = Resources::GetImageData("norating.png"); } } else { - ratingImgData = new GuiImageData(norating_png); + ratingImgData = Resources::GetImageData("norating.png"); } ratingImg = new GuiImage(ratingImgData); ratingImg->SetWidescreen(Settings.widescreen); diff --git a/source/ramdisk/ramdisk.cpp b/source/ramdisk/ramdisk.cpp deleted file mode 100644 index 9bb39e0a..00000000 --- a/source/ramdisk/ramdisk.cpp +++ /dev/null @@ -1,981 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include "ramdisk.h" - -#define NAMELENMAX 0x80 -#define MAXPATHLEN 0x100 - -class RAMDISK_PARTITION; -class RAMDISK_LINK_ENTRY; -class RAMDISK_DIR_ENTRY; -class RAMDISK_FILE_ENTRY; -class RAMDISK_BASE_ENTRY -{ - public: - RAMDISK_BASE_ENTRY(const char *Name, RAMDISK_DIR_ENTRY *Parent); - virtual ~RAMDISK_BASE_ENTRY(); - void Rename(const char *Name); - RAMDISK_LINK_ENTRY *IsLink(); - RAMDISK_DIR_ENTRY *IsDir(); - RAMDISK_FILE_ENTRY *IsFile(); - RAMDISK_PARTITION *GetPartition(); - char *name; - RAMDISK_DIR_ENTRY *parent; - RAMDISK_BASE_ENTRY *next; -}; -class RAMDISK_LINK_ENTRY: public RAMDISK_BASE_ENTRY -{ - public: - RAMDISK_LINK_ENTRY(const char* Name, RAMDISK_DIR_ENTRY *Parent, RAMDISK_BASE_ENTRY *Link); - RAMDISK_BASE_ENTRY *link; -}; -class RAMDISK_DIR_ENTRY: public RAMDISK_BASE_ENTRY -{ - public: - RAMDISK_DIR_ENTRY(const char* Name, RAMDISK_DIR_ENTRY *Parent); - ~RAMDISK_DIR_ENTRY(); - RAMDISK_BASE_ENTRY *FindEntry(const char* Path); - RAMDISK_FILE_ENTRY *CreateFile(const char *Filename); - RAMDISK_DIR_ENTRY *CreateDir(const char *Filename); - void RemoveEntry(RAMDISK_BASE_ENTRY *Entry); - RAMDISK_BASE_ENTRY *first; - RAMDISK_BASE_ENTRY *last; -}; -typedef struct -{ - RAMDISK_DIR_ENTRY *dir; - RAMDISK_BASE_ENTRY *current_entry; -} DIR_STRUCT; - -class RAMDISK_PARTITION: public RAMDISK_DIR_ENTRY -{ - public: - RAMDISK_PARTITION(const char *Mountpoint, bool AutoMount); - RAMDISK_BASE_ENTRY *FindEntry(const char* Path); - RAMDISK_DIR_ENTRY *FindPath(const char* Path, const char **Basename = NULL); - RAMDISK_DIR_ENTRY *cwd; - bool automount; -}; - -class FILE_DATA -{ - public: - FILE_DATA(size_t Len); - ~FILE_DATA(); - u8 *data; - size_t len; - FILE_DATA *next; -}; -typedef struct -{ - RAMDISK_FILE_ENTRY *file; - bool isLink; - u32 current_pos; - bool read; - bool write; -} FILE_STRUCT; -class RAMDISK_FILE_ENTRY: public RAMDISK_BASE_ENTRY -{ - public: - RAMDISK_FILE_ENTRY(const char* Name, RAMDISK_DIR_ENTRY *Parent); - ~RAMDISK_FILE_ENTRY(); - bool Truncate(size_t newLen); - bool AddCluster(size_t size); - size_t Read(struct _reent *r, FILE_STRUCT *fileStruct, char *ptr, size_t len); - size_t Write(struct _reent *r, FILE_STRUCT *fileStruct, const char *ptr, size_t len); - size_t file_len; - size_t cluster_len; - FILE_DATA *first_cluster; - FILE_DATA *last_cluster; -}; - -RAMDISK_LINK_ENTRY::RAMDISK_LINK_ENTRY(const char* Name, RAMDISK_DIR_ENTRY *Parent, RAMDISK_BASE_ENTRY *Link) : - RAMDISK_BASE_ENTRY(Name, Parent), link(Link) -{ - -} - -RAMDISK_BASE_ENTRY::RAMDISK_BASE_ENTRY(const char *Name, RAMDISK_DIR_ENTRY *Parent) : - name(strdup(Name)), parent(Parent), next(NULL) -{ -} -RAMDISK_BASE_ENTRY::~RAMDISK_BASE_ENTRY() -{ - free(name); - if (parent) parent->RemoveEntry(this); -} -void RAMDISK_BASE_ENTRY::Rename(const char *Name) -{ - free(name); - name = strdup(Name); -} - -inline RAMDISK_LINK_ENTRY *RAMDISK_BASE_ENTRY::IsLink() -{ - return dynamic_cast (this); -} -inline RAMDISK_DIR_ENTRY *RAMDISK_BASE_ENTRY::IsDir() -{ - RAMDISK_LINK_ENTRY *lentry = dynamic_cast (this); - return dynamic_cast (lentry ? lentry->link : this); -} -inline RAMDISK_FILE_ENTRY *RAMDISK_BASE_ENTRY::IsFile() -{ - RAMDISK_LINK_ENTRY *lentry = dynamic_cast (this); - return dynamic_cast (lentry ? lentry->link : this); -} -RAMDISK_PARTITION *RAMDISK_BASE_ENTRY::GetPartition() -{ - for (RAMDISK_BASE_ENTRY *entry = this; entry; entry = entry->parent) - if (entry->parent == NULL) return dynamic_cast (entry); - return NULL; -} - -RAMDISK_DIR_ENTRY::RAMDISK_DIR_ENTRY(const char* Name, RAMDISK_DIR_ENTRY *Parent) : - RAMDISK_BASE_ENTRY(Name, Parent) -{ - RAMDISK_BASE_ENTRY* entry = new RAMDISK_LINK_ENTRY(".", this, this); - first = entry; - last = entry; - if (parent) - { - entry = new RAMDISK_LINK_ENTRY("..", this, parent); - first->next = entry; - last = entry; - } -} -RAMDISK_DIR_ENTRY::~RAMDISK_DIR_ENTRY() -{ - while (first) - { - first->parent = NULL; // ~RAMDISK_BASE_ENTRY() no calls RemoveEntry() - RAMDISK_BASE_ENTRY* next = first->next; - delete first; - first = next; - } -} - -RAMDISK_BASE_ENTRY *RAMDISK_DIR_ENTRY::FindEntry(const char* Path) -{ - const char* dirpath = Path; - const char* cptr; - while (dirpath[0] == '/') - dirpath++; // move past leading '/' - - if (dirpath[0] == '\0') // this path is found - return this; - - cptr = strchr(dirpath, '/'); // find next '/' - if (cptr == NULL) cptr = strchr(dirpath, '\0'); // cptr at end - for (RAMDISK_BASE_ENTRY *curr = first; curr; curr = curr->next) - { - if (strncmp(curr->name, dirpath, cptr - dirpath) == 0) - { - if ( RAMDISK_DIR_ENTRY *dir = curr->IsDir() ) - return dir->FindEntry(cptr); - else return curr; - } - } - - return NULL; -} -RAMDISK_FILE_ENTRY *RAMDISK_DIR_ENTRY::CreateFile(const char *Filename) -{ - try - { - RAMDISK_FILE_ENTRY* file = new RAMDISK_FILE_ENTRY(Filename, this); - if (!first) first = file; - last->next = file; - last = file; - return file; - } - catch (...) - { - return NULL; - } -} -RAMDISK_DIR_ENTRY *RAMDISK_DIR_ENTRY::CreateDir(const char *Filename) -{ - try - { - RAMDISK_DIR_ENTRY* dir = new RAMDISK_DIR_ENTRY(Filename, this); - if (!first) first = dir; - last->next = dir; - last = dir; - return dir; - } - catch (...) - { - return NULL; - } -} -void RAMDISK_DIR_ENTRY::RemoveEntry(RAMDISK_BASE_ENTRY *Entry) -{ - RAMDISK_BASE_ENTRY **p_last = NULL; - for (RAMDISK_BASE_ENTRY **curr = &first; *curr; curr = &((*curr)->next)) - { - if (*curr == Entry) - { - *curr = Entry->next; - if (Entry->next == NULL) // entry is last - last = *p_last; - break; - } - p_last = curr; - } -} - -RAMDISK_PARTITION::RAMDISK_PARTITION(const char *Mountpoint, bool AutoMount) : - RAMDISK_DIR_ENTRY(Mountpoint, NULL), cwd(this), automount(AutoMount) -{ -} - -RAMDISK_BASE_ENTRY * RAMDISK_PARTITION::FindEntry(const char* path) -{ - char *cptr; - if ((cptr = strchr(path, ':'))) path = cptr + 1; //move path past any device names - if (strchr(path, ':') != NULL) - { - // r->_errno = EINVAL; - return NULL; - } - if (*path == '/') // if first character is '/' use absolute root path - return RAMDISK_DIR_ENTRY::FindEntry(path); - else // else use current working dir - return cwd->FindEntry(path); -} -RAMDISK_DIR_ENTRY * RAMDISK_PARTITION::FindPath(const char* path, const char **basename) -{ - int pathLen = strlen(path); - char dirfilename[pathLen + 1]; // to hold a full path - const char *cptr = path + pathLen; // find the end... - const char *filename = NULL; // to hold filename - while (cptr-- > path) //search till start - { - if ((*cptr == '/') || (*cptr == ':')) // split at either / or : (whichever comes first form the end!) - { - cptr++; - strlcpy(dirfilename, path, 1 + cptr - path); //copy string up till and including / or : - filename = cptr; //filename = now remainder of string - break; - } - } - - if (!filename) - { - filename = path; //filename = complete path - dirfilename[0] = 0; //make directory path "" - } - RAMDISK_BASE_ENTRY *entry = FindEntry(dirfilename); - if (entry) - { - if (basename) *basename = filename; - return entry->IsDir(); - } - return NULL; -} - -FILE_DATA::FILE_DATA(size_t Len) : - next(NULL) -{ - data = new u8[Len]; - len = Len; - memset(data, 0, len); -} -FILE_DATA::~FILE_DATA() -{ - delete[] data; - delete next; -} - -RAMDISK_FILE_ENTRY::RAMDISK_FILE_ENTRY(const char* Name, RAMDISK_DIR_ENTRY *Parent) : - RAMDISK_BASE_ENTRY(Name, Parent), file_len(0), cluster_len(0), first_cluster(NULL), last_cluster(NULL) -{ -} -RAMDISK_FILE_ENTRY::~RAMDISK_FILE_ENTRY() -{ - Truncate(0); -} -#define CLUSTER_SIZE 4*1024 - -bool RAMDISK_FILE_ENTRY::Truncate(size_t newSize) -{ - if (newSize > cluster_len) - { - // Expanding the file over cluster_len - return AddCluster(newSize - cluster_len); - } - else if (newSize < file_len) - { - // Shrinking the file - FILE_DATA *prev_cluster = NULL; - size_t len = 0; - for (FILE_DATA **p_cluster = &first_cluster; *p_cluster; p_cluster = &(*p_cluster)->next) - { - if (len >= newSize) - { - last_cluster = prev_cluster; - delete *p_cluster; - (*p_cluster) = NULL; - break; - } - len += (*p_cluster)->len; - prev_cluster = *p_cluster; - } - } - file_len = newSize; - return true; -} - -bool RAMDISK_FILE_ENTRY::AddCluster(size_t len) -{ - if (len < CLUSTER_SIZE) len = CLUSTER_SIZE; - try - { - *(last_cluster ? &last_cluster->next : &first_cluster) = last_cluster = new FILE_DATA(len); - cluster_len += len; - return true; - } - catch (...) - { - return false; - } -} - -size_t RAMDISK_FILE_ENTRY::Read(struct _reent *r, FILE_STRUCT *fileStruct, char *ptr, size_t len) -{ - if (!fileStruct->read) - { - r->_errno = EBADF; - return 0; - } - // Short circuit cases where len is 0 (or less) - if (len <= 0) return 0; - // Don't try to read if the read pointer is past the end of file - if (fileStruct->current_pos >= file_len) - { - r->_errno = EOVERFLOW; - return 0; - } - - // Don't read past end of file - if (len + fileStruct->current_pos > file_len) - { - r->_errno = EOVERFLOW; - len = fileStruct->current_pos - file_len; - } - - off_t pos = fileStruct->current_pos; - size_t readed = 0; - size_t max_len = file_len; - for (FILE_DATA *cluster = first_cluster; cluster; cluster = cluster->next) - { - if (pos > cluster->len) - { - pos -= cluster->len; - max_len -= cluster->len; - } - else - { - size_t read = max_len; - if (read > cluster->len) read = cluster->len; - read -= pos; - if (read > len) read = len; - memcpy(ptr, &(cluster->data[pos]), read); - readed += read; - ptr += read; - len -= read; - if (len == 0) break; - pos -= cluster->len; - max_len -= cluster->len; - - } - } - fileStruct->current_pos += readed; - return readed; -} -size_t RAMDISK_FILE_ENTRY::Write(struct _reent *r, FILE_STRUCT *fileStruct, const char *ptr, size_t len) -{ - - if (!fileStruct->write) - { - r->_errno = EBADF; - return 0; - } - // Short circuit cases where len is 0 (or less) - if (len <= 0) return 0; - - off_t pos = fileStruct->current_pos; - if (cluster_len < (pos + len) && !AddCluster((pos + len) - cluster_len)) - { - // Couldn't get a cluster, so abort - r->_errno = ENOSPC; - return 0; - } - if (file_len < (pos + len)) file_len = (pos + len); - - size_t written = 0; - size_t max_len = cluster_len; - for (FILE_DATA *cluster = first_cluster; cluster; cluster = cluster->next) - { - if (pos > cluster->len) - { - pos -= cluster->len; - max_len -= cluster->len; - } - else - { - size_t write = cluster->len - pos; - if (write > len) write = len; - memcpy(&(cluster->data[pos]), ptr, write); - written += write; - ptr += write; - len -= write; - if (len == 0) break; - pos -= cluster->len; - max_len -= cluster->len; - } - } - fileStruct->current_pos += written; - return written; -} - -static int ramdiskFS_open_r(struct _reent *r, void *fileStruct, const char *path, int flags, int mode); -static int ramdiskFS_close_r(struct _reent *r, int fd); -static int ramdiskFS_write_r(struct _reent *r, int fd, const char *ptr, size_t len); -static int ramdiskFS_read_r(struct _reent *r, int fd, char *ptr, size_t len); -static off_t ramdiskFS_seek_r(struct _reent *r, int fd, off_t pos, int dir); -static int ramdiskFS_fstat_r(struct _reent *r, int fd, struct stat *st); -static int ramdiskFS_stat_r(struct _reent *r, const char *file, struct stat *st); -static int ramdiskFS_unlink_r(struct _reent *r, const char *name); -static int ramdiskFS_chdir_r(struct _reent *r, const char *name); -static int ramdiskFS_mkdir_r(struct _reent *r, const char *path, int mode); - -static DIR_ITER* ramdiskFS_diropen_r(struct _reent *r, DIR_ITER *dirState, const char *path); -static int ramdiskFS_dirreset_r(struct _reent *r, DIR_ITER *dirState); -static int ramdiskFS_dirnext_r(struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *st); -static int ramdiskFS_dirclose_r(struct _reent *r, DIR_ITER *dirState); - -static int ramdiskFS_ftruncate_r(struct _reent *r, int fd, off_t len); - -static devoptab_t ramdiskFS_devoptab = { "ramdisk", sizeof(FILE_STRUCT), // int structSize; - &ramdiskFS_open_r, // int (*open_r)(struct _reent *r, void *fileStruct, const char *path,int - // flags,int mode); - &ramdiskFS_close_r, // int (*close_r)(struct _reent *r, int fd); - &ramdiskFS_write_r, // int (*write_r)(struct _reent *r, int fd, const char *ptr, int len); - &ramdiskFS_read_r, // int (*read_r)(struct _reent *r, int fd, char *ptr, int len); - &ramdiskFS_seek_r, // off_t (*seek_r)(struct _reent *r, off_t fd, int pos, int dir); - &ramdiskFS_fstat_r, // int (*fstat_r)(struct _reent *r, int fd, struct stat *st); - &ramdiskFS_stat_r, // int (*stat_r)(struct _reent *r, const char *file, struct stat *st); - NULL, // int (*link_r)(struct _reent *r, const char *existing, const char *newLink); - &ramdiskFS_unlink_r, // int (*unlink_r)(struct _reent *r, const char *name); - &ramdiskFS_chdir_r, // int (*chdir_r)(struct _reent *r, const char *name); - NULL, // int (*rename_r) (struct _reent *r, const char *oldName, const char *newName); - ramdiskFS_mkdir_r, // int (*mkdir_r) (struct _reent *r, const char *path, int mode); - sizeof(DIR_STRUCT), // int dirStateSize; - &ramdiskFS_diropen_r, // DIR_ITER* (*diropen_r)(struct _reent *r, DIR_ITER *dirState, const char *path); - &ramdiskFS_dirreset_r, // int (*dirreset_r)(struct _reent *r, DIR_ITER *dirState); - &ramdiskFS_dirnext_r, // int (*dirnext_r)(struct _reent *r, DIR_ITER *dirState, char *filename, - // struct stat *filestat); - &ramdiskFS_dirclose_r, // int (*dirclose_r)(struct _reent *r, DIR_ITER *dirState); - NULL, // statvfs_r - &ramdiskFS_ftruncate_r, // int (*ftruncate_r)(struct _reent *r, int fd, off_t len); - - NULL, // fsync_r, - NULL // Device data - }; - -//--------------------------------------------------------------------------------- -static inline RAMDISK_PARTITION* ramdiskFS_getPartitionFromPath(const char* path) -{ - //--------------------------------------------------------------------------------- - const devoptab_t *devops = GetDeviceOpTab(path); - if (!devops) return NULL; - return *((RAMDISK_PARTITION**) devops->deviceData); -} - -//--------------------------------------------------------------------------------- -// File functions -//--------------------------------------------------------------------------------- -static int ramdiskFS_open_r(struct _reent *r, void *file_Struct, const char *path, int flags, int mode) -{ - //--------------------------------------------------------------------------------- - FILE_STRUCT *fileStruct = (FILE_STRUCT*) file_Struct; - - RAMDISK_PARTITION *partition = ramdiskFS_getPartitionFromPath(path); - if (partition == NULL) - { - r->_errno = ENODEV; - return -1; - } - - if ((flags & 0x03) == O_RDONLY) - { - // Open the file for read-only access - fileStruct->read = true; - fileStruct->write = false; - } - else if ((flags & 0x03) == O_WRONLY) - { - // Open file for write only access - fileStruct->read = false; - fileStruct->write = true; - } - else if ((flags & 0x03) == O_RDWR) - { - // Open file for read/write access - fileStruct->read = true; - fileStruct->write = true; - } - else - { - r->_errno = EACCES; - return -1; - } - RAMDISK_BASE_ENTRY *entry = partition->FindEntry(path); - - // The file shouldn't exist if we are trying to create it - if (entry && (flags & O_CREAT) && (flags & O_EXCL)) - { - r->_errno = EEXIST; - return -1; - } - // It should not be a directory if we're openning a file, - if (entry && entry->IsDir()) - { - r->_errno = EISDIR; - return -1; - } - - fileStruct->isLink = entry ? entry->IsLink() : false; - fileStruct->file = entry ? entry->IsFile() : NULL; - if (!fileStruct->file) // entry not exists - { - if (flags & O_CREAT) - { - const char *filename; - RAMDISK_DIR_ENTRY *dir = partition->FindPath(path, &filename); - if (!dir) - { - r->_errno = ENOTDIR; - return -1; - } - fileStruct->file = dir->CreateFile(filename); - } - else - { - // file doesn't exist, and we aren't creating it - r->_errno = ENOENT; - return -1; - } - } - if (fileStruct->file) - { - fileStruct->current_pos = 0; - // Truncate the file if requested - if ((flags & O_TRUNC) && fileStruct->write) fileStruct->file->Truncate(0); - if (flags & O_APPEND) fileStruct->current_pos = fileStruct->file->file_len; - return 0; - } - r->_errno = ENOENT; - return (-1); -} - -//--------------------------------------------------------------------------------- -static int ramdiskFS_close_r(struct _reent *r, int fd) -{ - //--------------------------------------------------------------------------------- - return (0); -} - -//--------------------------------------------------------------------------------- -static int ramdiskFS_read_r(struct _reent *r, int fd, char *ptr, size_t len) -{ - //--------------------------------------------------------------------------------- - FILE_STRUCT *fileStruct = (FILE_STRUCT*) fd; - return fileStruct->file->Read(r, fileStruct, ptr, len); -} - -//--------------------------------------------------------------------------------- -static int ramdiskFS_write_r(struct _reent *r, int fd, const char *ptr, size_t len) -{ - //--------------------------------------------------------------------------------- - FILE_STRUCT *fileStruct = (FILE_STRUCT*) fd; - return fileStruct->file->Write(r, fileStruct, ptr, len); -} - -//--------------------------------------------------------------------------------- -static off_t ramdiskFS_seek_r(struct _reent *r, int fd, off_t pos, int dir) -{ - //--------------------------------------------------------------------------------- - //need check for eof here... - FILE_STRUCT *fileStruct = (FILE_STRUCT*) fd; - - switch (dir) - { - case SEEK_SET: - break; - case SEEK_CUR: - pos += fileStruct->current_pos; - break; - case SEEK_END: - pos += fileStruct->file->file_len; // set start to end of file - break; - default: - r->_errno = EINVAL; - return -1; - } - return fileStruct->current_pos = pos; -} - -//--------------------------------------------------------------------------------- -static int ramdiskFS_fstat_r(struct _reent *r, int fd, struct stat *st) -{ - //--------------------------------------------------------------------------------- - FILE_STRUCT *fileStruct = (FILE_STRUCT*) fd; - - st->st_mode = fileStruct->isLink ? S_IFLNK : S_IFREG; - st->st_size = fileStruct->file->file_len; - return (0); -} - -//--------------------------------------------------------------------------------- -static int ramdiskFS_stat_r(struct _reent *r, const char *file, struct stat *st) -{ - //--------------------------------------------------------------------------------- - FILE_STRUCT fileStruct; - DIR_STRUCT dirStruct; - DIR_ITER dirState; - dirState.dirStruct = &dirStruct; //create a temp dirstruct - int ret; - - if (ramdiskFS_open_r(r, &fileStruct, file, 0, 0) == 0) - { - ret = ramdiskFS_fstat_r(r, (int) &fileStruct, st); - ramdiskFS_close_r(r, (int) &fileStruct); - return (ret); - } - else if ((ramdiskFS_diropen_r(r, &dirState, file) != NULL)) - { - st->st_mode = S_IFDIR; - ramdiskFS_dirclose_r(r, &dirState); - return (0); - } - r->_errno = ENOENT; - return (-1); -} - -//--------------------------------------------------------------------------------- -static int ramdiskFS_unlink_r(struct _reent *r, const char *name) -{ - //--------------------------------------------------------------------------------- - RAMDISK_PARTITION *partition = ramdiskFS_getPartitionFromPath(name); - if (partition == NULL) - { - r->_errno = ENODEV; - return -1; - } - RAMDISK_BASE_ENTRY *entry = partition->FindEntry(name); - if (!entry) - { - r->_errno = ENOENT; - return -1; - } - - if (entry->IsLink()) - { - if (entry->name[0] == '.' && (entry->name[1] == '\0' || (entry->name[1] == '.' && entry->name[2] == '\0'))) - { - r->_errno = EPERM; - return -1; - } - delete entry; - return 0; - } - - if ( RAMDISK_DIR_ENTRY *dir = entry->IsDir() ) - { - for (RAMDISK_BASE_ENTRY *entry = dir->first; entry; entry = entry->next) - { - if (!(entry->name[0] == '.' - && (entry->name[1] == '\0' || (entry->name[1] == '.' && entry->name[2] == '\0')))) - { - r->_errno = EPERM; - return -1; - } - } - } - delete entry; - return 0; -} - -//--------------------------------------------------------------------------------- -static int ramdiskFS_chdir_r(struct _reent *r, const char *name) -{ - //--------------------------------------------------------------------------------- - DIR_STRUCT dirStruct; - DIR_ITER dirState; - dirState.dirStruct = &dirStruct; - if ((name == NULL)) - { - r->_errno = ENODEV; - return -1; - } - - if ((ramdiskFS_diropen_r(r, &dirState, name) == NULL)) return -1; - - RAMDISK_PARTITION *partition = dirStruct.dir->GetPartition(); - if (partition == NULL) - { - r->_errno = ENODEV; - return -1; - } - partition->cwd = dirStruct.dir; - ramdiskFS_dirclose_r(r, &dirState); - return 0; -} - -//--------------------------------------------------------------------------------- -static int ramdiskFS_mkdir_r(struct _reent *r, const char *path, int mode) -{ - //--------------------------------------------------------------------------------- - RAMDISK_PARTITION *partition = ramdiskFS_getPartitionFromPath(path); - if (partition == NULL) - { - r->_errno = ENODEV; - return -1; - } - RAMDISK_BASE_ENTRY *entry = partition->FindEntry(path); - if (entry) - { - r->_errno = EEXIST; - return -1; - } - const char *filename; - RAMDISK_DIR_ENTRY *dir = partition->FindPath(path, &filename); - if (!dir) - { - r->_errno = ENOTDIR; - return -1; - } - dir->CreateDir(filename); - return 0; -} - -//--------------------------------------------------------------------------------- -// Directory functions -//--------------------------------------------------------------------------------- -static DIR_ITER* ramdiskFS_diropen_r(struct _reent *r, DIR_ITER *dirState, const char *path) -{ - //--------------------------------------------------------------------------------- - - DIR_STRUCT *dirStruct = (DIR_STRUCT*) dirState->dirStruct; - char *cptr; - - RAMDISK_PARTITION *partition = ramdiskFS_getPartitionFromPath(path); - if (partition == NULL) - { - r->_errno = ENODEV; - return NULL; - } - - if ((cptr = strchr(path, ':'))) path = cptr + 1; //move path past any device names - if (strchr(path, ':') != NULL) - { - r->_errno = EINVAL; - return NULL; - } - - if (*path == '/') //if first character is '/' use absolute root path - dirStruct->dir = partition; //first root dir - else dirStruct->dir = partition->cwd; //else use current working dir - - RAMDISK_BASE_ENTRY *entry = dirStruct->dir->FindEntry(path); - if (entry == NULL) - { - r->_errno = ENOENT; - return NULL; - } - dirStruct->dir = entry->IsDir(); - if (dirStruct->dir == NULL) - { - r->_errno = ENOTDIR; - return NULL; - } - dirStruct->current_entry = dirStruct->dir->first; - return dirState; -} - -/*Consts containing relative system path strings*/ -//reset dir to start of entry selected by dirStruct->cur_dir_id -//--------------------------------------------------------------------------------- -static int ramdiskFS_dirreset_r(struct _reent *r, DIR_ITER *dirState) -{ - //--------------------------------------------------------------------------------- - DIR_STRUCT *dirStruct = (DIR_STRUCT*) dirState->dirStruct; - dirStruct->current_entry = dirStruct->dir->first; - return (0); -} - -//--------------------------------------------------------------------------------- -static int ramdiskFS_dirnext_r(struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *st) -{ - //--------------------------------------------------------------------------------- - DIR_STRUCT *dirStruct = (DIR_STRUCT*) dirState->dirStruct; - // RAMDISK_BASE_ENTRY **dirStruct = (RAMDISK_BASE_ENTRY**)dirState->dirStruct; - - if (dirStruct->current_entry) - { - strcpy(filename, dirStruct->current_entry->name); - if (dirStruct->current_entry->IsDir()) - { - if (st) st->st_mode = S_IFDIR; - } - else - { - if (st) st->st_mode = 0; - } - dirStruct->current_entry = dirStruct->current_entry->next; - return (0); - } - r->_errno = ENOENT; - return (-1); -} - -//--------------------------------------------------------------------------------- -static int ramdiskFS_dirclose_r(struct _reent *r, DIR_ITER *dirState) -{ - //--------------------------------------------------------------------------------- - return (0); -} - -//--------------------------------------------------------------------------------- -static int ramdiskFS_ftruncate_r(struct _reent *r, int fd, off_t len) -{ - //--------------------------------------------------------------------------------- - FILE_STRUCT *fileStruct = (FILE_STRUCT*) fd; - - if (len < 0) - { - // Trying to truncate to a negative size - r->_errno = EINVAL; - return -1; - } - /* - if ((sizeof(len) > 4) && len > (off_t)FILE_MAX_SIZE) - { - // Trying to extend the file beyond what supports - r->_errno = EFBIG; - return -1; - } - */ - if (!fileStruct->write) - { - // Read-only file - r->_errno = EINVAL; - return -1; - } - if (fileStruct->file->Truncate(len)) return 0; - r->_errno = ENOSPC; - return -1; -} - -//--------------------------------------------------------------------------------- -void ramdiskFS_Unmount(const char* mountpoint) -{ - //--------------------------------------------------------------------------------- - RAMDISK_PARTITION *partition; - devoptab_t *devops = (devoptab_t*) GetDeviceOpTab(mountpoint); - - if (!devops) return; - - // Perform a quick check to make sure we're dealing with a ramdiskFS_ controlled device - if (devops->open_r != ramdiskFS_devoptab.open_r) return; - - if (RemoveDevice(mountpoint) == -1) return; - - partition = *((RAMDISK_PARTITION **) devops->deviceData); - if (partition->automount) delete partition; - free(devops); -} -extern "C" void ramdiskUnmount(const char *mountpoint) -{ - ramdiskFS_Unmount(mountpoint); -} -//--------------------------------------------------------------------------------- -int ramdiskFS_Mount(const char *mountpoint, void *handle) -{ - //--------------------------------------------------------------------------------- - devoptab_t* devops; - char* nameCopy; - RAMDISK_PARTITION** partition; - char Mountpoint[100]; - char *cptr; - - strlcpy(Mountpoint, mountpoint, sizeof(Mountpoint)); - int len = strlen(Mountpoint); - cptr = strchr(Mountpoint, ':'); - if (cptr) - { - len = cptr - Mountpoint; - *++cptr = 0; - } - else strlcat(Mountpoint, ":", sizeof(Mountpoint)); - ramdiskFS_Unmount(Mountpoint); - if (handle) ramdiskFS_Unmount(((RAMDISK_PARTITION*) handle)->name); - - devops = (devoptab_t*) malloc(sizeof(devoptab_t) + sizeof(RAMDISK_PARTITION*) + len + 1); - if (!devops) return false; - - partition = (RAMDISK_PARTITION**) (devops + 1); // Use the space allocated at the end of the devoptab struct - // for storing the partition - nameCopy = (char*) (partition + 1); // Use the space allocated at the end of the partition struct - // for storing the name - - memcpy(devops, &ramdiskFS_devoptab, sizeof(ramdiskFS_devoptab)); // Add an entry for this device to the devoptab table - - strlcpy(nameCopy, Mountpoint, len + 1); - devops->name = nameCopy; - - if (handle) - { - *partition = (RAMDISK_PARTITION*) handle; - (*partition)->Rename(Mountpoint); - } - else *partition = new RAMDISK_PARTITION(Mountpoint, true); - devops->deviceData = partition; - - if (AddDevice(devops) < 0) - { - free(devops); - return false; - } - - return true; - -} -extern "C" int ramdiskMount(const char *mountpoint, void *handle) -{ - return ramdiskFS_Mount(mountpoint, handle); -} -//--------------------------------------------------------------------------------- -extern "C" void* ramdiskCreate() -{ - //--------------------------------------------------------------------------------- - return new RAMDISK_PARTITION("", false); -} -//--------------------------------------------------------------------------------- -extern "C" void ramdiskDelete(void* Handle) -{ - //--------------------------------------------------------------------------------- - RAMDISK_PARTITION *partition = (RAMDISK_PARTITION*) Handle; - if (partition->automount == false) ramdiskFS_Unmount(partition->name); - delete partition; -} - diff --git a/source/ramdisk/ramdisk.h b/source/ramdisk/ramdisk.h deleted file mode 100644 index bf1779fd..00000000 --- a/source/ramdisk/ramdisk.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef __RAMDISK_H -#define __RAMDISK_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* - ramdiskCreate initialize a dynamic RAM-disk. - return: Handle for ramdiskMount - */ - void* ramdiskCreate(); - - /************************************************** - * ramdiskDelete - * - * destroy all datas - * if the ramdisk is allready mounted forces ramdiskUnmount - * IN: a Handle was created witch ramdiskCreate(); - **************************************************/ - void ramdiskDelete(void* Handle); - - /************************************************** - * ramdiskMount - * - * mounts a ramdisk - * IN: mountpoint e.g. "RAM" or "MEM:" - * handle is a Handle was created ramdiskCreate() - * or NULL for auto-create - * OUT: 0 = Error / !0 = OK - **************************************************/ - int ramdiskMount(const char *mountpoint, void *handle); - - /************************************************** - * ramdiskUnmount - * - * unmounts a ramdisk - * IN: mountpoint e.g "RAM" or "MEM:" - **************************************************/ - void ramdiskUnmount(const char *mountpoint); - -/* - NOTE: - if the ramdisk not explizit created with ramdiskCreate (e.g ramdiskMount("RAMDISK:", NULL)) - the ramdisk is implizit created. When unmount this "auto-created" ramdisk the ramdisk automitic deleted - - but if the ramdisk explizit created (with ramdiskCreate), - then we can remount the filesystem without lost all datas. - - Example1: - ========= - void *ram = ramdiskCreate(); // create ramdisk - ramdiskMount("RAM", ram); // mount the ramdisk - ... - fopen("RAM:/file", ...); - ... - ramdiskMount("MEM", ram); // remount as MEM: (without lost of data) - ... - fopen("RAM:/file", ...); - ... - ramdiskUnmount("MEM"); // unmount - ... - ramdiskMount("RAM", ram); // remount as RAM: (without lost of data) - ... - ramdiskDelete(ram); // unmount and delete - - Example2: - ========= - ramdiskMount("RAM", NULL); // create and mount the ramdisk - ... - fopen("RAM:/file", ...); - ... - ramdiskUnmount("RAM"); // unmount and delete - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__RAMDISK_H*/ diff --git a/source/settings/Settings.cpp b/source/settings/Settings.cpp index 531e4cb2..04a0fba0 100644 --- a/source/settings/Settings.cpp +++ b/source/settings/Settings.cpp @@ -106,33 +106,22 @@ int MenuSettings() // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); GuiSound btnClick1(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); - char imgPath[100]; + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData settingsbg(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png")); - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", Settings.theme_path); - GuiImageData settingsbg(imgPath, settings_background_png); + GuiImageData MainButtonImgData(Resources::GetFile("settings_title.png"), Resources::GetFileSize("settings_title.png")); - snprintf(imgPath, sizeof(imgPath), "%ssettings_title.png", Settings.theme_path); - GuiImageData MainButtonImgData(imgPath, settings_title_png); + GuiImageData MainButtonImgOverData(Resources::GetFile("settings_title_over.png"), Resources::GetFileSize("settings_title_over.png")); - snprintf(imgPath, sizeof(imgPath), "%ssettings_title_over.png", Settings.theme_path); - GuiImageData MainButtonImgOverData(imgPath, settings_title_over_png); + GuiImageData PageindicatorImgData(Resources::GetFile("pageindicator.png"), Resources::GetFileSize("pageindicator.png")); - snprintf(imgPath, sizeof(imgPath), "%spageindicator.png", Settings.theme_path); - GuiImageData PageindicatorImgData(imgPath, pageindicator_png); + GuiImageData arrow_left(Resources::GetFile("startgame_arrow_left.png"), Resources::GetFileSize("startgame_arrow_left.png")); - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_left.png", Settings.theme_path); - GuiImageData arrow_left(imgPath, startgame_arrow_left_png); + GuiImageData arrow_right(Resources::GetFile("startgame_arrow_right.png"), Resources::GetFileSize("startgame_arrow_right.png")); - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_right.png", Settings.theme_path); - GuiImageData arrow_right(imgPath, startgame_arrow_right_png); + GuiImageData creditsImgData(Resources::GetFile("credits_button.png"), Resources::GetFileSize("credits_button.png")); - snprintf(imgPath, sizeof(imgPath), "%scredits_button.png", Settings.theme_path); - GuiImageData creditsImgData(imgPath, credits_button_png); - - snprintf(imgPath, sizeof(imgPath), "%scredits_button_over.png", Settings.theme_path); - GuiImageData creditsOver(imgPath, credits_button_over_png); + GuiImageData creditsOver(Resources::GetFile("credits_button_over.png"), Resources::GetFileSize("credits_button_over.png")); GuiImage creditsImg(&creditsImgData); GuiImage creditsImgOver(&creditsOver); @@ -305,8 +294,7 @@ int MenuSettings() MainButton4.SetTrigger(&trigA); customOptionList options2(MAXOPTIONS); - GuiCustomOptionBrowser optionBrowser2(396, 280, &options2, Settings.theme_path, "bg_options_settings.png", - bg_options_settings_png, 0, 150); + GuiCustomOptionBrowser optionBrowser2(396, 280, &options2, "bg_options_settings.png", 0, 150); optionBrowser2.SetPosition(0, 90); optionBrowser2.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); @@ -1731,27 +1719,17 @@ int MenuSettings() Theme.Load(Settings.theme_path); ResumeGui(); menu = MENU_SETTINGS; - snprintf(imgPath, sizeof(imgPath), "%splayer1_point.png", - Settings.theme_path); - pointer[0] = new GuiImageData(imgPath, player1_point_png); - snprintf(imgPath, sizeof(imgPath), "%splayer2_point.png", - Settings.theme_path); - pointer[1] = new GuiImageData(imgPath, player2_point_png); - snprintf(imgPath, sizeof(imgPath), "%splayer3_point.png", - Settings.theme_path); - pointer[2] = new GuiImageData(imgPath, player3_point_png); - snprintf(imgPath, sizeof(imgPath), "%splayer4_point.png", - Settings.theme_path); - pointer[3] = new GuiImageData(imgPath, player4_point_png); - if (Settings.widescreen) - snprintf(imgPath, sizeof(imgPath), "%swbackground.png", - Settings.theme_path); - else snprintf(imgPath, sizeof(imgPath), "%sbackground.png", - Settings.theme_path); - - background = new GuiImageData(imgPath, - Settings.widescreen ? wbackground_png : background_png); - + if(pointer[0]) delete pointer[0]; + if(pointer[1]) delete pointer[1]; + if(pointer[2]) delete pointer[2]; + if(pointer[3]) delete pointer[3]; + pointer[0] = Resources::GetImageData("player1_point.png"); + pointer[1] = Resources::GetImageData("player2_point.png"); + pointer[2] = Resources::GetImageData("player3_point.png"); + pointer[3] = Resources::GetImageData("player4_point.png"); + if(background) delete background; + background = Resources::GetImageData(Settings.widescreen ? "wbackground.png" : "background.png"); + if(bgImg) delete bgImg; bgImg = new GuiImage(background); mainWindow->Append(bgImg); mainWindow->Append(&w); @@ -2292,18 +2270,12 @@ int MenuGameSettings(struct discHdr * header) // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); GuiSound btnClick1(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); - char imgPath[100]; + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData settingsbg(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png")); - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", Settings.theme_path); - GuiImageData settingsbg(imgPath, settings_background_png); + GuiImageData MainButtonImgData(Resources::GetFile("settings_title.png"), Resources::GetFileSize("settings_title.png")); - snprintf(imgPath, sizeof(imgPath), "%ssettings_title.png", Settings.theme_path); - GuiImageData MainButtonImgData(imgPath, settings_title_png); - - snprintf(imgPath, sizeof(imgPath), "%ssettings_title_over.png", Settings.theme_path); - GuiImageData MainButtonImgOverData(imgPath, settings_title_over_png); + GuiImageData MainButtonImgOverData(Resources::GetFile("settings_title_over.png"), Resources::GetFileSize("settings_title_over.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -2429,8 +2401,7 @@ int MenuGameSettings(struct discHdr * header) MainButton4.SetTrigger(&trigA); customOptionList options2(MAXOPTIONS); - GuiCustomOptionBrowser optionBrowser2(396, 280, &options2, Settings.theme_path, "bg_options_settings.png", - bg_options_settings_png, 0, 150); + GuiCustomOptionBrowser optionBrowser2(396, 280, &options2, "bg_options_settings.png", 0, 150); optionBrowser2.SetPosition(0, 90); optionBrowser2.SetAlignment(ALIGN_CENTRE, ALIGN_TOP); diff --git a/source/settings/SettingsPrompts.cpp b/source/settings/SettingsPrompts.cpp index e390365f..6fb51bb8 100644 --- a/source/settings/SettingsPrompts.cpp +++ b/source/settings/SettingsPrompts.cpp @@ -100,12 +100,8 @@ int MenuLanguageSelect() if ( !btnClick2 ) btnClick2 = new GuiSound( button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume ); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - - snprintf( imgPath, sizeof( imgPath ), "%sbutton_dialogue_box.png", Settings.theme_path ); - GuiImageData btnOutline( imgPath, button_dialogue_box_png ); - snprintf( imgPath, sizeof( imgPath ), "%ssettings_background.png", Settings.theme_path ); - GuiImageData settingsbg( imgPath, settings_background_png ); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData settingsbg(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png")); GuiTrigger trigA; trigA.SetSimpleTrigger( -1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A ); @@ -217,7 +213,7 @@ int MenuLanguageSelect() scrollon = 1; } - GuiCustomOptionBrowser optionBrowser4( 396, 280, &options2, Settings.theme_path, "bg_options_settings.png", bg_options_settings_png, scrollon, 10 ); + GuiCustomOptionBrowser optionBrowser4( 396, 280, &options2, "bg_options_settings.png", scrollon, 10 ); optionBrowser4.SetPosition( 0, 90 ); optionBrowser4.SetAlignment( ALIGN_CENTRE, ALIGN_TOP ); diff --git a/source/themes/CTheme.cpp b/source/themes/CTheme.cpp index 633e5af5..fbb95ded 100644 --- a/source/themes/CTheme.cpp +++ b/source/themes/CTheme.cpp @@ -145,6 +145,8 @@ CTheme::~CTheme() void CTheme::SetDefault() { + Resources::Clear(); + gamelist_x = 200; gamelist_y = 49;//40; gamelist_w = 396; @@ -357,6 +359,8 @@ bool CTheme::Load(const char * theme_path) } fclose(file); + Resources::LoadFiles(theme_path); + return true; } diff --git a/source/themes/CTheme.h b/source/themes/CTheme.h index 1262cfe1..4d536e10 100644 --- a/source/themes/CTheme.h +++ b/source/themes/CTheme.h @@ -4,6 +4,7 @@ #include #include #include +#include "Resources.h" class CTheme { diff --git a/source/themes/Resources.cpp b/source/themes/Resources.cpp new file mode 100644 index 00000000..b3b167a6 --- /dev/null +++ b/source/themes/Resources.cpp @@ -0,0 +1,260 @@ +#include +#include +#include "FileOperations/fileops.h" +#include "filelist.h" +#include "Resources.h" + +RecourceFile Resources::RecourceFiles[] = +{ + {"closebutton.png", closebutton_png, closebutton_png_size, NULL, 0}, + {"gxlogo.png", gxlogo_png, gxlogo_png_size, NULL, 0}, + {"sdcard.png", sdcard_png, sdcard_png_size, NULL, 0}, + {"sdcard_over.png", sdcard_over_png, sdcard_over_png_size, NULL, 0}, + {"Wifi_btn.png", Wifi_btn_png, Wifi_btn_png_size, NULL, 0}, + {"wiimote.png", wiimote_png, wiimote_png_size, NULL, 0}, + {"gameinfo1.png", gameinfo1_png, gameinfo1_png_size, NULL, 0}, + {"gameinfo2.png", gameinfo2_png, gameinfo2_png_size, NULL, 0}, + {"gameinfo1a.png", gameinfo1a_png, gameinfo1a_png_size, NULL, 0}, + {"gameinfo2a.png", gameinfo2a_png, gameinfo2a_png_size, NULL, 0}, + {"credits_button.png", credits_button_png, credits_button_png_size, NULL, 0}, + {"credits_button_over.png", credits_button_over_png, credits_button_over_png_size, NULL, 0}, + {"tooltip_left.png", tooltip_left_png, tooltip_left_png_size, NULL, 0}, + {"tooltip_tile.png", tooltip_tile_png, tooltip_tile_png_size, NULL, 0}, + {"tooltip_right.png", tooltip_right_png, tooltip_right_png_size, NULL, 0}, + {"startgame_arrow_left.png", startgame_arrow_left_png, startgame_arrow_left_png_size, NULL, 0}, + {"startgame_arrow_right.png", startgame_arrow_right_png, startgame_arrow_right_png_size, NULL, 0}, + {"credits_bg.png", credits_bg_png, credits_bg_png_size, NULL, 0}, + {"little_star.png", little_star_png, little_star_png_size, NULL, 0}, + {"background.png", background_png, background_png_size, NULL, 0}, + {"wbackground.png", wbackground_png, wbackground_png_size, NULL, 0}, + {"bg_options_settings.png", bg_options_settings_png, bg_options_settings_png_size, NULL, 0}, + {"settings_background.png", settings_background_png, settings_background_png_size, NULL, 0}, + {"bg_browser.png", bg_browser_png, bg_browser_png_size, NULL, 0}, + {"icon_folder.png", icon_folder_png, icon_folder_png_size, NULL, 0}, + {"bg_browser_selection.png", bg_browser_selection_png, bg_browser_selection_png_size, NULL, 0}, + {"addressbar_textbox.png", addressbar_textbox_png, addressbar_textbox_png_size, NULL, 0}, + {"browser.png", browser_png, browser_png_size, NULL, 0}, + {"browser_over.png", browser_over_png, browser_over_png_size, NULL, 0}, + {"nocover.png", nocover_png, nocover_png_size, NULL, 0}, + {"nocoverFlat.png", nocoverFlat_png, nocoverFlat_png_size, NULL, 0}, + {"nodisc.png", nodisc_png, nodisc_png_size, NULL, 0}, + {"theme_dialogue_box.png", theme_dialogue_box_png, theme_dialogue_box_png_size, NULL, 0}, + {"button_install.png", button_install_png, button_install_png_size, NULL, 0}, + {"button_install_over.png", button_install_over_png, button_install_over_png_size, NULL, 0}, + {"dialogue_box_startgame.png", dialogue_box_startgame_png, dialogue_box_startgame_png_size, NULL, 0}, + {"wdialogue_box_startgame.png", wdialogue_box_startgame_png, wdialogue_box_startgame_png_size, NULL, 0}, + {"button_dialogue_box.png", button_dialogue_box_png, button_dialogue_box_png_size, NULL, 0}, + {"keyboard_textbox.png", keyboard_textbox_png, keyboard_textbox_png_size, NULL, 0}, + {"keyboard_key.png", keyboard_key_png, keyboard_key_png_size, NULL, 0}, + {"keyboard_key_over.png", keyboard_key_over_png, keyboard_key_over_png_size, NULL, 0}, + {"keyboard_mediumkey_over.png", keyboard_mediumkey_over_png, keyboard_mediumkey_over_png_size, NULL, 0}, + {"keyboard_largekey_over.png", keyboard_largekey_over_png, keyboard_largekey_over_png_size, NULL, 0}, + {"keyboard_backspace_over.png", keyboard_backspace_over_png, keyboard_backspace_over_png_size, NULL, 0}, + {"keyboard_clear_over.png", keyboard_clear_over_png, keyboard_clear_over_png_size, NULL, 0}, + {"menu_button.png", menu_button_png, menu_button_png_size, NULL, 0}, + {"menu_button_over.png", menu_button_over_png, menu_button_over_png_size, NULL, 0}, + {"settings_button.png", settings_button_png, settings_button_png_size, NULL, 0}, + {"settings_button_over.png", settings_button_over_png, settings_button_over_png_size, NULL, 0}, + {"settings_menu_button.png", settings_menu_button_png, settings_menu_button_png_size, NULL, 0}, + {"wiimote_poweroff.png", wiimote_poweroff_png, wiimote_poweroff_png_size, NULL, 0}, + {"dialogue_box.png", dialogue_box_png, dialogue_box_png_size, NULL, 0}, + {"theme_box.png", theme_box_png, theme_box_png_size, NULL, 0}, + {"wiimote_poweroff_over.png", wiimote_poweroff_over_png, wiimote_poweroff_over_png_size, NULL, 0}, + {"bg_options.png", bg_options_png, bg_options_png_size, NULL, 0}, + {"bg_options_entry.png", bg_options_entry_png, bg_options_entry_png_size, NULL, 0}, + {"scrollbar.png", scrollbar_png, scrollbar_png_size, NULL, 0}, + {"scrollbar_arrowup.png", scrollbar_arrowup_png, scrollbar_arrowup_png_size, NULL, 0}, + {"scrollbar_arrowdown.png", scrollbar_arrowdown_png, scrollbar_arrowdown_png_size, NULL, 0}, + {"scrollbar_box.png", scrollbar_box_png, scrollbar_box_png_size, NULL, 0}, + {"progressbar.png", progressbar_png, progressbar_png_size, NULL, 0}, + {"progressbar_empty.png", progressbar_empty_png, progressbar_empty_png_size, NULL, 0}, + {"progressbar_outline.png", progressbar_outline_png, progressbar_outline_png_size, NULL, 0}, + {"player1_point.png", player1_point_png, player1_point_png_size, NULL, 0}, + {"player2_point.png", player2_point_png, player2_point_png_size, NULL, 0}, + {"player3_point.png", player3_point_png, player3_point_png_size, NULL, 0}, + {"player4_point.png", player4_point_png, player4_point_png_size, NULL, 0}, + {"rplayer1_point.png", rplayer1_point_png, rplayer1_point_png_size, NULL, 0}, + {"rplayer2_point.png", rplayer2_point_png, rplayer2_point_png_size, NULL, 0}, + {"rplayer3_point.png", rplayer3_point_png, rplayer3_point_png_size, NULL, 0}, + {"rplayer4_point.png", rplayer4_point_png, rplayer4_point_png_size, NULL, 0}, + {"battery.png", battery_png, battery_png_size, NULL, 0}, + {"battery_bar.png", battery_bar_png, battery_bar_png_size, NULL, 0}, + {"battery_white.png", battery_white_png, battery_white_png_size, NULL, 0}, + {"battery_red.png", battery_red_png, battery_red_png_size, NULL, 0}, + {"battery_bar_white.png", battery_bar_white_png, battery_bar_white_png_size, NULL, 0}, + {"battery_bar_red.png", battery_bar_red_png, battery_bar_red_png_size, NULL, 0}, + {"arrow_next.png", arrow_next_png, arrow_next_png_size, NULL, 0}, + {"arrow_previous.png", arrow_previous_png, arrow_previous_png_size, NULL, 0}, + {"mp3_pause.png", mp3_pause_png, mp3_pause_png_size, NULL, 0}, + {"mp3_stop.png", mp3_stop_png, mp3_stop_png_size, NULL, 0}, + {"exit_top.png", exit_top_png, exit_top_png_size, NULL, 0}, + {"exit_top_over.png", exit_top_over_png, exit_top_over_png_size, NULL, 0}, + {"exit_bottom.png", exit_bottom_png, exit_bottom_png_size, NULL, 0}, + {"exit_bottom_over.png", exit_bottom_over_png, exit_bottom_over_png_size, NULL, 0}, + {"exit_button.png", exit_button_png, exit_button_png_size, NULL, 0}, + {"favorite.png", favorite_png, favorite_png_size, NULL, 0}, + {"not_favorite.png", not_favorite_png, not_favorite_png_size, NULL, 0}, + {"favIcon.png", favIcon_png, favIcon_png_size, NULL, 0}, + {"favIcon_gray.png", favIcon_gray_png, favIcon_gray_png_size, NULL, 0}, + {"searchIcon.png", searchIcon_png, searchIcon_png_size, NULL, 0}, + {"searchIcon_gray.png", searchIcon_gray_png, searchIcon_gray_png_size, NULL, 0}, + {"abcIcon.png", abcIcon_png, abcIcon_png_size, NULL, 0}, + {"abcIcon_gray.png", abcIcon_gray_png, abcIcon_gray_png_size, NULL, 0}, + {"rankIcon.png", rankIcon_png, rankIcon_png_size, NULL, 0}, + {"rankIcon_gray.png", rankIcon_gray_png, rankIcon_gray_png_size, NULL, 0}, + {"playCountIcon.png", playCountIcon_png, playCountIcon_png_size, NULL, 0}, + {"playCountIcon_gray.png", playCountIcon_gray_png, playCountIcon_gray_png_size, NULL, 0}, + {"arrangeList.png", arrangeList_png, arrangeList_png_size, NULL, 0}, + {"arrangeList_gray.png", arrangeList_gray_png, arrangeList_gray_png_size, NULL, 0}, + {"arrangeGrid.png", arrangeGrid_png, arrangeGrid_png_size, NULL, 0}, + {"arrangeGrid_gray.png", arrangeGrid_gray_png, arrangeGrid_gray_png_size, NULL, 0}, + {"arrangeCarousel.png", arrangeCarousel_png, arrangeCarousel_png_size, NULL, 0}, + {"arrangeCarousel_gray.png", arrangeCarousel_gray_png, arrangeCarousel_gray_png_size, NULL, 0}, + {"settings_title.png", settings_title_png, settings_title_png_size, NULL, 0}, + {"settings_title_over.png", settings_title_over_png, settings_title_over_png_size, NULL, 0}, + {"pageindicator.png", pageindicator_png, pageindicator_png_size, NULL, 0}, + {"Wiimote1.png", Wiimote1_png, Wiimote1_png_size, NULL, 0}, + {"Wiimote2.png", Wiimote2_png, Wiimote1_png_size, NULL, 0}, + {"Wiimote4.png", Wiimote4_png, Wiimote4_png_size, NULL, 0}, + {"wifi1.png", wifi1_png, wifi1_png_size, NULL, 0}, + {"wifi2.png", wifi2_png, wifi2_png_size, NULL, 0}, + {"wifi3.png", wifi3_png, wifi3_png_size, NULL, 0}, + {"wifi4.png", wifi4_png, wifi4_png_size, NULL, 0}, + {"wifi8.png", wifi8_png, wifi8_png_size, NULL, 0}, + {"wifi12.png", wifi12_png, wifi12_png_size, NULL, 0}, + {"wifi16.png", wifi16_png, wifi16_png_size, NULL, 0}, + {"wifi32.png", wifi32_png, wifi32_png_size, NULL, 0}, + {"norating.png", norating_png, norating_png_size, NULL, 0}, + {"guitar.png", guitar_png, guitar_png_size, NULL, 0}, + {"guitarR.png", guitarR_png, guitarR_png_size, NULL, 0}, + {"microphone.png", microphone_png, microphone_png_size, NULL, 0}, + {"microphoneR.png", microphoneR_png, microphoneR_png_size, NULL, 0}, + {"gcncontroller.png", gcncontroller_png, gcncontroller_png_size, NULL, 0}, + {"gcncontrollerR.png", gcncontrollerR_png, gcncontrollerR_png_size, NULL, 0}, + {"classiccontroller.png", classiccontroller_png, classiccontroller_png_size, NULL, 0}, + {"classiccontrollerR.png", classiccontrollerR_png, classiccontrollerR_png_size, NULL, 0}, + {"nunchuk.png", nunchuk_png, nunchuk_png_size, NULL, 0}, + {"nunchukR.png", nunchukR_png, nunchukR_png_size, NULL, 0}, + {"dancepad.png", dancepad_png, dancepad_png_size, NULL, 0}, + {"dancepadR.png", dancepadR_png, dancepadR_png_size, NULL, 0}, + {"balanceboard.png", balanceboard_png, balanceboard_png_size, NULL, 0}, + {"balanceboardR.png", balanceboardR_png, balanceboardR_png_size, NULL, 0}, + {"drums.png", drums_png, drums_png_size, NULL, 0}, + {"drumsR.png", drumsR_png, drumsR_png_size, NULL, 0}, + {"motionplus.png", motionplus_png, motionplus_png_size, NULL, 0}, + {"motionplusR.png", motionplusR_png, motionplusR_png_size, NULL, 0}, + {"wheel.png", wheel_png, wheel_png_size, NULL, 0}, + {"wheelR.png", wheelR_png, wheelR_png_size, NULL, 0}, + {"zapper.png", zapper_png, zapper_png_size, NULL, 0}, + {"zapperR.png", zapperR_png, zapperR_png_size, NULL, 0}, + {"wiispeak.png", wiispeak_png, wiispeak_png_size, NULL, 0}, + {"wiispeakR.png", wiispeakR_png, wiispeakR_png_size, NULL, 0}, + {"nintendods.png", nintendods_png, nintendods_png_size, NULL, 0}, + {"nintendodsR.png", nintendodsR_png, nintendodsR_png_size, NULL, 0}, + {"esrb_ec.png", esrb_ec_png, esrb_ec_png_size, NULL, 0}, + {"esrb_e.png", esrb_e_png, esrb_e_png_size, NULL, 0}, + {"esrb_eten.png", esrb_eten_png, esrb_eten_png_size, NULL, 0}, + {"esrb_t.png", esrb_t_png, esrb_t_png_size, NULL, 0}, + {"esrb_m.png", esrb_m_png, esrb_m_png_size, NULL, 0}, + {"esrb_ao.png", esrb_ao_png, esrb_ao_png_size, NULL, 0}, + {"cero_a.png", cero_a_png, cero_a_png_size, NULL, 0}, + {"cero_b.png", cero_b_png, cero_b_png_size, NULL, 0}, + {"cero_c.png", cero_c_png, cero_c_png_size, NULL, 0}, + {"cero_d.png", cero_d_png, cero_d_png_size, NULL, 0}, + {"cero_z.png", cero_z_png, cero_z_png_size, NULL, 0}, + {"pegi_3.png", pegi_3_png, pegi_3_png_size, NULL, 0}, + {"pegi_7.png", pegi_7_png, pegi_7_png_size, NULL, 0}, + {"pegi_12.png", pegi_12_png, pegi_12_png_size, NULL, 0}, + {"pegi_16.png", pegi_16_png, pegi_16_png_size, NULL, 0}, + {"pegi_18.png", pegi_18_png, pegi_18_png_size, NULL, 0}, + {"dvd.png", dvd_png, dvd_png_size, NULL, 0}, + {"dvd_gray.png", dvd_gray_png, dvd_gray_png_size, NULL, 0}, + {"new.png", new_png, new_png_size, NULL, 0}, + {"lock.png", lock_png, lock_png_size, NULL, 0}, + {"lock_gray.png", lock_gray_png, lock_gray_png_size, NULL, 0}, + {"unlock.png", unlock_png, unlock_png_size, NULL, 0}, + {"unlock_gray.png", unlock_gray_png, unlock_gray_png_size, NULL, 0}, + {NULL, NULL, 0, NULL, 0} +}; + +void Resources::Clear() +{ + for(int i = 0; RecourceFiles[i].filename != NULL; ++i) + { + if(RecourceFiles[i].CustomFile) + { + free(RecourceFiles[i].CustomFile); + RecourceFiles[i].CustomFile = NULL; + } + + if(RecourceFiles[i].CustomFileSize != 0) + RecourceFiles[i].CustomFileSize = 0; + } +} + +void Resources::LoadFiles(const char * path) +{ + if(!path) + return; + + Clear(); + + char fullpath[1024]; + + for(int i = 0; RecourceFiles[i].filename != NULL; ++i) + { + snprintf(fullpath, sizeof(fullpath), "%s/%s", path, RecourceFiles[i].filename); + + if(CheckFile(fullpath)) + { + u8 * buffer = NULL; + u64 filesize = 0; + + LoadFileToMem(fullpath, &buffer, &filesize); + + RecourceFiles[i].CustomFile = buffer; + RecourceFiles[i].CustomFileSize = (u32) filesize; + } + } +} + +const u8 * Resources::GetFile(const char * filename) +{ + for(int i = 0; RecourceFiles[i].filename != NULL; ++i) + { + if(strcasecmp(filename, RecourceFiles[i].filename) == 0) + { + return (RecourceFiles[i].CustomFile ? RecourceFiles[i].CustomFile : RecourceFiles[i].DefaultFile); + } + } + + return NULL; +} + +const u32 Resources::GetFileSize(const char * filename) +{ + for(int i = 0; RecourceFiles[i].filename != NULL; ++i) + { + if(strcasecmp(filename, RecourceFiles[i].filename) == 0) + { + return (RecourceFiles[i].CustomFile ? RecourceFiles[i].CustomFileSize : RecourceFiles[i].DefaultFileSize); + } + } + + return NULL; +} + +GuiImageData * Resources::GetImageData(const char * filename) +{ + for(int i = 0; RecourceFiles[i].filename != NULL; ++i) + { + if(strcasecmp(filename, RecourceFiles[i].filename) == 0) + { + const u8 * buff = RecourceFiles[i].CustomFile ? RecourceFiles[i].CustomFile : RecourceFiles[i].DefaultFile; + const u32 size = RecourceFiles[i].CustomFile ? RecourceFiles[i].CustomFileSize : RecourceFiles[i].DefaultFileSize; + return (new GuiImageData(buff, size)); + } + } + + return NULL; +} diff --git a/source/themes/Resources.h b/source/themes/Resources.h new file mode 100644 index 00000000..49cf8ee4 --- /dev/null +++ b/source/themes/Resources.h @@ -0,0 +1,29 @@ +#ifndef RECOURCES_H_ +#define RECOURCES_H_ + +#include "libwiigui/gui_imagedata.h" +#include "filelist.h" + +typedef struct _RecourceFile +{ + const char *filename; + const u8 *DefaultFile; + const u32 DefaultFileSize; + u8 *CustomFile; + u32 CustomFileSize; +} RecourceFile; + +class Resources +{ + public: + static void Clear(); + static void LoadFiles(const char * path); + static const u8 * GetFile(const char * filename); + static const u32 GetFileSize(const char * filename); + static GuiImageData * GetImageData(const char * filename); + + private: + static RecourceFile RecourceFiles[]; +}; + +#endif diff --git a/source/themes/Theme_Downloader.cpp b/source/themes/Theme_Downloader.cpp index b49c0687..8382a299 100644 --- a/source/themes/Theme_Downloader.cpp +++ b/source/themes/Theme_Downloader.cpp @@ -153,11 +153,8 @@ static int Theme_Prompt(const char *title, const char *author, GuiImageData *thu if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%stheme_dialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, theme_dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("theme_dialogue_box.png"), Resources::GetFileSize("theme_dialogue_box.png")); GuiImage dialogBoxImg(&dialogBox); @@ -285,38 +282,28 @@ int Theme_Downloader() char THEME_LINK[70]; sprintf(THEME_LINK, "http://wii.spiffy360.com/themes.php?xml=1&category=1&adult=%d", Settings.godmode); - //gprintf("\nTHEME_LINK: %s", THEME_LINK); - //const char THEME_LINK_ADULT[70] = "http://wii.spiffy360.com/themes.php?xml=1&category=1&adult=1"; /*** Sound Variables ***/ GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume); // because destroy GuiSound must wait while sound playing is finished, we use a global sound if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); + GuiSound btnClick1(button_click_pcm, button_click_pcm_size, Settings.sfxvolume); /*** Image Variables ***/ - char imgPath[150]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); - snprintf(imgPath, sizeof(imgPath), "%stheme_box.png", Settings.theme_path); - GuiImageData theme_box_Data(imgPath, theme_box_png); + GuiImageData theme_box_Data(Resources::GetFile("theme_box.png"), Resources::GetFileSize("theme_box.png")); - snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", Settings.theme_path); - GuiImageData bgData(imgPath, settings_background_png); + GuiImageData bgData(Resources::GetFile("settings_background.png"), Resources::GetFileSize("settings_background.png")); - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_left.png", Settings.theme_path); - GuiImageData arrow_left(imgPath, startgame_arrow_left_png); + GuiImageData arrow_left(Resources::GetFile("startgame_arrow_left.png"), Resources::GetFileSize("startgame_arrow_left.png")); - snprintf(imgPath, sizeof(imgPath), "%sstartgame_arrow_right.png", Settings.theme_path); - GuiImageData arrow_right(imgPath, startgame_arrow_right_png); + GuiImageData arrow_right(Resources::GetFile("startgame_arrow_right.png"), Resources::GetFileSize("startgame_arrow_right.png")); - snprintf(imgPath, sizeof(imgPath), "%sWifi_btn.png", Settings.theme_path); - GuiImageData wifiImgData(imgPath, Wifi_btn_png); + GuiImageData wifiImgData(Resources::GetFile("Wifi_btn.png"), Resources::GetFileSize("Wifi_btn.png")); - snprintf(imgPath, sizeof(imgPath), "%spageindicator.png", Settings.theme_path); - GuiImageData PageindicatorImgData(imgPath, pageindicator_png); + GuiImageData PageindicatorImgData(Resources::GetFile("pageindicator.png"), Resources::GetFileSize("pageindicator.png")); GuiImage background(&bgData); diff --git a/source/video.cpp b/source/video.cpp index 539cfc5e..fccc694f 100644 --- a/source/video.cpp +++ b/source/video.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include "input.h" #include "gecko.h" diff --git a/source/wad/wad.cpp b/source/wad/wad.cpp index 6a3b5865..91bd09fc 100644 --- a/source/wad/wad.cpp +++ b/source/wad/wad.cpp @@ -125,11 +125,8 @@ s32 Wad_Install(FILE *fp) if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A); @@ -150,8 +147,7 @@ s32 Wad_Install(FILE *fp) btn1.SetLabel(&btn1Txt); btn1.SetState(STATE_SELECTED); - snprintf(imgPath, sizeof(imgPath), "%sprogressbar_outline.png", Settings.theme_path); - GuiImageData progressbarOutline(imgPath, progressbar_outline_png); + GuiImageData progressbarOutline(Resources::GetFile("progressbar_outline.png"), Resources::GetFileSize("progressbar_outline.png")); GuiImage progressbarOutlineImg(&progressbarOutline); if (Settings.wsprompt == yes) { @@ -160,15 +156,13 @@ s32 Wad_Install(FILE *fp) progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarOutlineImg.SetPosition(25, 50); - snprintf(imgPath, sizeof(imgPath), "%sprogressbar_empty.png", Settings.theme_path); - GuiImageData progressbarEmpty(imgPath, progressbar_empty_png); + GuiImageData progressbarEmpty(Resources::GetFile("progressbar_empty.png"), Resources::GetFileSize("progressbar_empty.png")); GuiImage progressbarEmptyImg(&progressbarEmpty); progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarEmptyImg.SetPosition(25, 50); progressbarEmptyImg.SetTile(100); - snprintf(imgPath, sizeof(imgPath), "%sprogressbar.png", Settings.theme_path); - GuiImageData progressbar(imgPath, progressbar_png); + GuiImageData progressbar(Resources::GetFile("progressbar.png"), Resources::GetFileSize("progressbar.png")); GuiImage progressbarImg(&progressbar); progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE); progressbarImg.SetPosition(25, 50); @@ -311,6 +305,8 @@ s32 Wad_Install(FILE *fp) // Get TMD info tmd_data = (tmd *) SIGNATURE_PAYLOAD(p_tmd); + + char imgPath[150]; // Install contents //ResumeGui(); @@ -448,11 +444,8 @@ s32 Wad_Uninstall(FILE *fp) if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); // GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume); - char imgPath[100]; - snprintf(imgPath, sizeof(imgPath), "%sbutton_dialogue_box.png", Settings.theme_path); - GuiImageData btnOutline(imgPath, button_dialogue_box_png); - snprintf(imgPath, sizeof(imgPath), "%sdialogue_box.png", Settings.theme_path); - GuiImageData dialogBox(imgPath, dialogue_box_png); + GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png")); + GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png")); GuiTrigger trigA; trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);