60static inline bool Tex3DSi_ReadData(decompressCallback callback,
void** userdata,
void* buffer,
size_t size,
size_t* insize)
63 return callback(*userdata, buffer, size) == size;
67 memcpy(buffer, *userdata, size);
68 *userdata = (u8*)*userdata + size;
74Tex3DSi_ImportCommon(C3D_Tex* tex, C3D_TexCube* texcube,
bool vram, decompressCallback callback,
void* userdata,
size_t insize)
78 if (!Tex3DSi_ReadData(callback, &userdata, &hdr,
sizeof(hdr), &insize))
82 Tex3DS_Texture texture = (Tex3DS_Texture)malloc(
sizeof(
struct Tex3DS_Texture_s) + hdr.numSubTextures*
sizeof(Tex3DS_SubTexture));
87 texture->numSubTextures = hdr.numSubTextures;
88 texture->width = 1 << (hdr.width_log2 + 3);
89 texture->height = 1 << (hdr.height_log2 + 3);
90 texture->format = hdr.format;
91 texture->mipmapLevels = hdr.mipmapLevels;
94 for (
size_t i = 0; i < hdr.numSubTextures; i ++)
97 if (!Tex3DSi_ReadData(callback, &userdata, &subtex,
sizeof(
Tex3DSi_SubTexture), &insize))
102 texture->subTextures[i].width = subtex.
width;
103 texture->subTextures[i].height = subtex.
height;
104 texture->subTextures[i].left = subtex.
left / 1024.0f;
105 texture->subTextures[i].top = subtex.
top / 1024.0f;
106 texture->subTextures[i].right = subtex.
right / 1024.0f;
107 texture->subTextures[i].bottom = subtex.
bottom / 1024.0f;
111 C3D_TexInitParams params;
112 params.width = texture->width;
113 params.height = texture->height;
114 params.maxLevel = texture->mipmapLevels;
115 params.format = texture->format;
116 params.type = (GPU_TEXTURE_MODE_PARAM)hdr.type;
117 params.onVram = vram;
125 size_t base_texsize = C3D_TexCalcTotalSize(tex->size, texture->mipmapLevels);
126 size_t texsize = base_texsize;
129 if (params.type == GPU_TEX_CUBE_MAP)
135 void* texdata = linearAlloc(texsize);
144 if (!decompress(texdata, texsize, callback, userdata, insize))
153 GSPGPU_FlushDataCache(texdata, texsize);
156 if (params.type == GPU_TEX_CUBE_MAP)
160 for (
size_t i = 0; i < texcount; ++i)
164 }
else if (params.type == GPU_TEX_CUBE_MAP)
166 decompressIOVec iov[6];
169 for (
size_t i = 0; i < 6; ++i)
172 iov[i].data = C3D_TexCubeGetImagePtr(tex, i, -1, &size);
177 if (!decompressV(iov, 6, callback, userdata, insize))
186 void*
data = C3D_Tex2DGetImagePtr(tex, -1, &size);
189 if (!decompress(
data, size, callback, userdata, insize))
203 return Tex3DSi_ImportCommon(tex, texcube, vram, NULL, (
void*)input, insize);
209 return Tex3DSi_ImportCommon(tex, texcube, vram, callback, userdata, 0);
215 return Tex3DSi_ImportCommon(tex, texcube, vram, decompressCallback_FD, &fd, 0);
221 return Tex3DSi_ImportCommon(tex, texcube, vram, decompressCallback_Stdio, fp, 0);
227 return texture->numSubTextures;
230const Tex3DS_SubTexture*
233 if (index < texture->numSubTextures)
234 return &texture->subTextures[index];
u16 numSubTextures
Number of subtextures.
u16 height
Texture height.
u8 mipmapLevels
Number of mipmaps.
Tex3DS_SubTexture subTextures[]
Subtextures.
Tex3DS_Texture Tex3DS_TextureImportFD(int fd, C3D_Tex *tex, C3D_TexCube *texcube, bool vram)
Tex3DS_Texture Tex3DS_TextureImportStdio(FILE *fp, C3D_Tex *tex, C3D_TexCube *texcube, bool vram)
void Tex3DS_TextureFree(Tex3DS_Texture texture)
Tex3DS_Texture Tex3DS_TextureImportCallback(C3D_Tex *tex, C3D_TexCube *texcube, bool vram, decompressCallback callback, void *userdata)
size_t Tex3DS_GetNumSubTextures(const Tex3DS_Texture texture)
struct __attribute__((packed))
const Tex3DS_SubTexture * Tex3DS_GetSubTexture(const Tex3DS_Texture texture, size_t index)
Tex3DS_Texture Tex3DS_TextureImport(const void *input, size_t insize, C3D_Tex *tex, C3D_TexCube *texcube, bool vram)
void C3D_TexLoadImage(C3D_Tex *tex, const void *data, GPU_TEXFACE face, int level)
void C3D_TexDelete(C3D_Tex *tex)
bool C3D_TexInitWithParams(C3D_Tex *tex, C3D_TexCube *cube, C3D_TexInitParams p)