1 /*---------------------------------------------------------------------------*
2 
3   Copyright (C) Nintendo.  All rights reserved.
4 
5   These coded instructions, statements, and computer programs contain
6   proprietary information of Nintendo of America Inc. and/or Nintendo
7   Company Ltd., and are protected by Federal copyright law.  They may
8   not be disclosed to third parties or copied or duplicated in any form,
9   in whole or in part, without the prior written consent of Nintendo.
10 
11  *---------------------------------------------------------------------------*/
12 // -------------------------------------------------------
13 // DDS_Helpers.h
14 //
15 // Declares helper functions for DDS Reader.
16 // -------------------------------------------------------
17 #ifndef DDS_HELPERS_H
18 #define DDS_HELPERS_H
19 
20 #include "DDS.h"
21 
22 namespace DDSReader
23 {
24 #define FOURCC_BC1 MAKEFOURCC('B', 'C', '1', ' ')
25 #define FOURCC_BC2 MAKEFOURCC('B', 'C', '2', ' ')
26 #define FOURCC_BC3 MAKEFOURCC('B', 'C', '3', ' ')
27 #define FOURCC_BC4 MAKEFOURCC('B', 'C', '4', ' ')
28 #define FOURCC_BC5 MAKEFOURCC('B', 'C', '5', ' ')
29 
30 #define FOURCC_BC4S MAKEFOURCC('B', 'C', '4', 'S')
31 #define FOURCC_BC4U MAKEFOURCC('B', 'C', '4', 'U')
32 #define FOURCC_BC5S MAKEFOURCC('B', 'C', '5', 'S')
33 
34 typedef struct _ARGB8888Struct
35 {
36 	int		nFlags;
37 	void*	pMemory;
38 	int		nRMask;
39 	int		nRShift;
40 	int		nGMask;
41 	int		nGShift;
42 	int		nBMask;
43 	int		nBShift;
44 } ARGB8888Struct;
45 
46 typedef enum _ExtraFlags
47 {
48 	EF_None = 0,
49 	EF_UseBitMasks = 0x1,
50 } ExtraFlags;
51 
52 typedef TU_Error (PreLoopFunction)(FILE*& pFile, DDSD2*& pDDSD, GX2Surface*& pSurface, void*& extra);
53 typedef TU_Error (LoopFunction)(FILE*& pFile, DDSD2*& pDDSD, GX2Surface*& pSurface, void*& extra, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
54 typedef TU_Error (PostLoopFunction)(FILE*& pFile, DDSD2*& pDDSD, GX2Surface*& pSurface, void*& extra);
55 TU_Error GenericLoadFunction(FILE*& pFile, DDSD2*& pDDSD, GX2Surface*& pSurface, void*& extra, ChannelFormat channelFormat, TextureDataType textureDataType, PreLoopFunction fnPreLoop, LoopFunction fnLoop, PostLoopFunction fnPostLoop);
56 
57 bool IsD3D10Format(const GX2Surface* pSurface);
58 void DetermineTextureType(const DDSD2* pDDSD, GX2Surface* pSurface);
59 TU_Error GenericLoadFunction(FILE*& pFile, DDSD2*& pDDSD, GX2Surface*& pSurface, void*& extra, ChannelFormat channelFormat,
60 								   TextureDataType textureDataType, PreLoopFunction fnPreLoop, LoopFunction fnLoop, PostLoopFunction fnPostLoop);
61 TU_Error GenericFreeFunction(GX2Surface*& pSurface);
62 TU_Error PreLoopDefault(FILE*&, DDSD2*&, GX2Surface*&, void*&);
63 TU_Error LoopDefault(FILE*& pFile, DDSD2*&, GX2Surface*& pSurface, void*& extra, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
64 TU_Error PostLoopDefault(FILE*&, DDSD2*&, GX2Surface*&, void*&);
65 TU_Error PreLoopFourCC(FILE*& pFile, DDSD2*& pDDSD, GX2Surface*& pSurface, void*& extra);
66 TU_Error LoopFourCC(FILE*& pFile, DDSD2*&, GX2Surface*& pSurface, void*& /*extra*/, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
67 TU_Error PostLoopFourCC(FILE*&, DDSD2*&, GX2Surface*&, void*&);
68 TU_Error PreLoopRGB565(FILE*&, DDSD2*& pDDSD, GX2Surface*& pSurface, void*& extra);
69 TU_Error LoopRGB565(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*& extra, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
70 TU_Error PostLoopRGB565(FILE*&, DDSD2*&, GX2Surface*&, void*& extra);
71 TU_Error PreLoopRGB888(FILE*&, DDSD2*& pDDSD, GX2Surface*& pSurface, void*& extra);
72 TU_Error LoopRGB888(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*& extra, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
73 TU_Error PostLoopRGB888(FILE*&, DDSD2*&, GX2Surface*&, void*& extra);
74 TU_Error PreLoopRGB8888(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
75 TU_Error LoopRGB8888(FILE*& pFile, DDSD2*&, GX2Surface*& pSurface, void*& extra, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
76 TU_Error PostLoopRGB8888(FILE*&, DDSD2*&, GX2Surface*&, void*&);
77 TU_Error PreLoopABGR32F(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
78 TU_Error LoopABGR32F(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
79 TU_Error LoopR32F(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
80 TU_Error LoopGR32F(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
81 TU_Error PostLoopABGR32F(FILE*&, DDSD2*&, GX2Surface*&, void*&);
82 TU_Error LoopGR32F(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
83 TU_Error LoopR32F(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
84 TU_Error PreLoopABGR16F(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
85 TU_Error LoopABGR16F(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
86 TU_Error LoopGR16F(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
87 TU_Error LoopR16F(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
88 TU_Error PostLoopABGR16F(FILE*&, DDSD2*&, GX2Surface*&, void*&);
89 TU_Error PreLoopG8(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
90 TU_Error LoopG8(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
91 TU_Error PostLoopG8(FILE*&, DDSD2*&, GX2Surface*&, void*&);
92 TU_Error PreLoopA4L4(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
93 TU_Error LoopA4L4(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
94 TU_Error PostLoopA4L4(FILE*&, DDSD2*&, GX2Surface*&, void*&);
95 TU_Error PreLoopA8L8(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
96 TU_Error LoopA8L8(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
97 TU_Error PostLoopA8L8(FILE*&, DDSD2*&, GX2Surface*&, void*&);
98 TU_Error PreLoopAG8(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
99 TU_Error LoopAG8(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
100 TU_Error PostLoopAG8(FILE*&, DDSD2*&, GX2Surface*&, void*&);
101 TU_Error PreLoopG16(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
102 TU_Error LoopG16(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
103 TU_Error PostLoopG16(FILE*&, DDSD2*&, GX2Surface*&, void*&);
104 TU_Error PreLoopA8(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
105 TU_Error LoopA8(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&,u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
106 TU_Error PostLoopA8(FILE*&, DDSD2*&, GX2Surface*&, void*&);
107 TU_Error PreLoopABGR16(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
108 TU_Error LoopABGR16(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&,u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
109 TU_Error PostLoopABGR16(FILE*&, DDSD2*&, GX2Surface*&, void*&);
110 TU_Error PreLoopG16R16(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
111 TU_Error LoopG16R16(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
112 TU_Error PostLoopG16R16(FILE*&, DDSD2*&, GX2Surface*&, void*&);
113 TU_Error PreLoopARGB1555(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
114 TU_Error LoopARGB1555(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
115 TU_Error PostLoopARGB1555(FILE*&, DDSD2*&, GX2Surface*&, void*&);
116 TU_Error PreLoopARGB4444(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
117 TU_Error LoopARGB4444(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
118 TU_Error PostLoopARGB4444(FILE*&, DDSD2*&, GX2Surface*&, void*&);
119 TU_Error PreLoopABGR32(FILE*&, DDSD2*&, GX2Surface*& pSurface, void*&);
120 TU_Error LoopABGR32(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&,u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
121 TU_Error PostLoopABGR32(FILE*&, DDSD2*&, GX2Surface*&, void*&);
122 TU_Error LoopR32G32(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&,u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
123 TU_Error LoopA2R10G10B10(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&,u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
124 TU_Error LoopR16G16(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&,u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
125 TU_Error LoopR32(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
126 TU_Error LoopR8G8(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&,u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
127 TU_Error LoopR16(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&, u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
128 TU_Error LoopR8(FILE*& pFile, DDSD2*& , GX2Surface*& pSurface, void*&,u32 nMipLevel, u32 nFaceOrSlice, u32 dwWidth, u32 dwHeight);
129 bool SetupDDSD(DDSD2& ddsd2, const GX2Surface* pSurface, bool bCompressed);
130 bool SetupDDSD_DDS10(DDSD2& ddsd2, const GX2Surface* pSurface, bool bCompressed);
131 }   //namespace DDSReader
132 
133 #endif  //#ifndef DDS_HELPERS_H
134