diff --git a/src/libwhb/include/whb/gfx.h b/src/libwhb/include/whb/gfx.h index 095af9b1..96f52c18 100644 --- a/src/libwhb/include/whb/gfx.h +++ b/src/libwhb/include/whb/gfx.h @@ -80,6 +80,13 @@ WHBGfxInitFetchShader(WHBGfxShaderGroup *group); BOOL WHBGfxFreeShaderGroup(WHBGfxShaderGroup *group); +GX2Texture * +WHBGfxLoadGFDTexture(uint32_t index, + const void *file); + +BOOL +WHBGfxFreeTexture(GX2Texture *texture); + #ifdef __cplusplus } #endif diff --git a/src/libwhb/src/gfx_texture.c b/src/libwhb/src/gfx_texture.c new file mode 100644 index 00000000..b71f03ad --- /dev/null +++ b/src/libwhb/src/gfx_texture.c @@ -0,0 +1,52 @@ +#include "gfx_heap.h" +#include +#include +#include +#include + +GX2Texture * +WHBGfxLoadGFDTexture(uint32_t index, + const void *file) +{ + uint32_t headerSize, imageSize; + GX2Texture *texture = NULL; + void *image = NULL; + + if (index >= GFDGetTextureCount(file)) { + goto error; + } + + headerSize = GFDGetTextureHeaderSize(index, file); + imageSize = GFDGetTextureImageSize(index, file); + + if (!headerSize || !imageSize) { + goto error; + } + + texture = (GX2Texture *)GfxHeapAllocMEM2(headerSize, 64); + if (!texture) { + goto error; + } + + if (!GFDGetGX2RTexture(texture, index, file)) { + goto error; + } + + return texture; + +error: + if (texture) { + GX2RDestroySurfaceEx(&texture->surface, 0); + GfxHeapFreeMEM2(texture); + } + + return NULL; +} + +BOOL +WHBGfxFreeTexture(GX2Texture *texture) +{ + GX2RDestroySurfaceEx(&texture->surface, 0); + GfxHeapFreeMEM2(texture); + return TRUE; +}