load cover images directly from file instead of an intermediary buffer

This commit is contained in:
Daryl 2020-08-09 13:08:51 -06:00
parent c1fb2e5a1e
commit ff223e4da8
5 changed files with 39 additions and 30 deletions

View File

@ -951,6 +951,16 @@ static void WindowCredits(void * ptr)
* Displays a list of games on the specified load device, and allows the user * Displays a list of games on the specified load device, and allows the user
* to browse and select from this list. * to browse and select from this list.
***************************************************************************/ ***************************************************************************/
static char* getImageFolder()
{
switch(GCSettings.PreviewImage)
{
case 1 : return GCSettings.CoverFolder; break;
case 2 : return GCSettings.ArtworkFolder; break;
default: return GCSettings.ScreenshotsFolder; break;
}
}
static int MenuGameSelection() static int MenuGameSelection()
{ {
int menu = MENU_NONE; int menu = MENU_NONE;
@ -1120,27 +1130,18 @@ static int MenuGameSelection()
{ {
previousBrowserIndex = browser.selIndex; previousBrowserIndex = browser.selIndex;
previousPreviewImg = GCSettings.PreviewImage; previousPreviewImg = GCSettings.PreviewImage;
snprintf(imagePath, MAXJOLIET, "%s%s/%s.png", pathPrefix[GCSettings.LoadMethod], ImageFolder(), browserList[browser.selIndex].displayname); snprintf(imagePath, MAXJOLIET, "%s%s/%s.png", pathPrefix[GCSettings.LoadMethod], getImageFolder(), browserList[browser.selIndex].displayname);
AllocSaveBuffer();
int width, height; int width, height;
if(LoadFile(imagePath, SILENT)) if(DecodePNGFromFile(imagePath, &width, &height, imgBuffer, 512, 512))
{ {
if(DecodePNG(savebuffer, &width, &height, imgBuffer, 512, 512)) preview.SetImage(imgBuffer, width, height);
{ preview.SetScale( MIN(225.0f / width, 235.0f / height) );
preview.SetImage(imgBuffer, width, height);
preview.SetScale( MIN(225.0f / width, 235.0f / height) );
}
else
{
preview.SetImage(NULL, 0, 0);
}
} }
else else
{ {
preview.SetImage(NULL, 0, 0); preview.SetImage(NULL, 0, 0);
} }
FreeSaveBuffer();
} }
if(settingsBtn.GetState() == STATE_CLICKED) if(settingsBtn.GetState() == STATE_CLICKED)

View File

@ -565,13 +565,3 @@ int main(int argc, char *argv[])
} // emulation loop } // emulation loop
} // main loop } // main loop
} }
char* ImageFolder()
{
switch(GCSettings.PreviewImage)
{
case 1 : return GCSettings.CoverFolder; break;
case 2 : return GCSettings.ArtworkFolder; break;
default: return GCSettings.ScreenshotsFolder; break;
}
}

View File

@ -124,8 +124,6 @@ struct SGCSettings{
int Interpolation; int Interpolation;
}; };
char* ImageFolder();
void ExitApp(); void ExitApp();
void ShutdownWii(); void ShutdownWii();
bool SupportedIOS(u32 ios); bool SupportedIOS(u32 ios);

View File

@ -110,10 +110,6 @@ static int pngu_info (IMGCTX ctx)
else if (ctx->source == PNGU_SOURCE_DEVICE) else if (ctx->source == PNGU_SOURCE_DEVICE)
{ {
// Open file
if (!(ctx->fd = fopen (ctx->filename, "rb")))
return PNGU_CANT_OPEN_FILE;
// Load first 8 bytes into magic buffer // Load first 8 bytes into magic buffer
if (fread (magic, 1, 8, ctx->fd) != 8) if (fread (magic, 1, 8, ctx->fd) != 8)
{ {
@ -580,6 +576,29 @@ u8 * DecodePNG(const u8 *src, int * width, int * height, u8 *dstPtr, int maxwidt
return dst; return dst;
} }
u8 * DecodePNGFromFile(const char *filepath, int * width, int * height, u8 *dstPtr, int maxwidth, int maxheight)
{
FILE *file = fopen (filepath, "rb");
if (!file)
return NULL;
IMGCTX ctx = PNGU_SelectImageFromDevice(filepath);
if(!ctx)
return NULL;
ctx->fd = file;
PNGUPROP imgProp;
u8 *dst = NULL;
if(PNGU_GetImageProperties(ctx, &imgProp) == PNGU_OK && imgProp.imgWidth <= maxwidth && imgProp.imgHeight < maxheight)
dst = PNGU_DecodeTo4x4RGBA8 (ctx, imgProp.imgWidth, imgProp.imgHeight, width, height, dstPtr, maxwidth, maxheight);
PNGU_ReleaseImageContext (ctx);
return dst;
}
int PNGU_EncodeFromRGB (IMGCTX ctx, u32 width, u32 height, void *buffer, u32 stride) int PNGU_EncodeFromRGB (IMGCTX ctx, u32 width, u32 height, void *buffer, u32 stride)
{ {
png_uint_32 rowbytes; png_uint_32 rowbytes;

View File

@ -64,6 +64,7 @@ int PNGU_GetImageProperties (IMGCTX ctx, PNGUPROP *fileproperties);
****************************************************************************/ ****************************************************************************/
u8 * DecodePNG(const u8 *src, int *width, int *height, u8 *dst, int maxwidth, int maxheight); u8 * DecodePNG(const u8 *src, int *width, int *height, u8 *dst, int maxwidth, int maxheight);
u8 * DecodePNGFromFile(const char *filepath, int *width, int *height, u8 *dst, int maxwidth, int maxheight);
int PNGU_EncodeFromRGB (IMGCTX ctx, u32 width, u32 height, void *buffer, u32 stride); int PNGU_EncodeFromRGB (IMGCTX ctx, u32 width, u32 height, void *buffer, u32 stride);
int PNGU_EncodeFromGXTexture (IMGCTX ctx, u32 width, u32 height, void *buffer, u32 stride); int PNGU_EncodeFromGXTexture (IMGCTX ctx, u32 width, u32 height, void *buffer, u32 stride);
int PNGU_EncodeFromEFB (IMGCTX ctx, u32 width, u32 height); int PNGU_EncodeFromEFB (IMGCTX ctx, u32 width, u32 height);