Merge changes from the-witness.

This commit is contained in:
castano
2011-01-08 04:54:06 +00:00
parent 993e853a5f
commit 5f8cd22cdb
22 changed files with 401 additions and 194 deletions

View File

@ -44,17 +44,19 @@ using namespace nv;
const uint nv::FOURCC_NVTT = MAKEFOURCC('N', 'V', 'T', 'T');
const uint nv::FOURCC_DDS = MAKEFOURCC('D', 'D', 'S', ' ');
const uint nv::FOURCC_DXT1 = MAKEFOURCC('D', 'X', 'T', '1');
const uint nv::FOURCC_DXT2 = MAKEFOURCC('D', 'X', 'T', '2');
const uint nv::FOURCC_DXT3 = MAKEFOURCC('D', 'X', 'T', '3');
const uint nv::FOURCC_DXT4 = MAKEFOURCC('D', 'X', 'T', '4');
const uint nv::FOURCC_DXT5 = MAKEFOURCC('D', 'X', 'T', '5');
const uint nv::FOURCC_RXGB = MAKEFOURCC('R', 'X', 'G', 'B');
const uint nv::FOURCC_ATI1 = MAKEFOURCC('A', 'T', 'I', '1');
const uint nv::FOURCC_ATI2 = MAKEFOURCC('A', 'T', 'I', '2');
namespace
{
static const uint FOURCC_DDS = MAKEFOURCC('D', 'D', 'S', ' ');
static const uint FOURCC_DXT1 = MAKEFOURCC('D', 'X', 'T', '1');
static const uint FOURCC_DXT2 = MAKEFOURCC('D', 'X', 'T', '2');
static const uint FOURCC_DXT3 = MAKEFOURCC('D', 'X', 'T', '3');
static const uint FOURCC_DXT4 = MAKEFOURCC('D', 'X', 'T', '4');
static const uint FOURCC_DXT5 = MAKEFOURCC('D', 'X', 'T', '5');
static const uint FOURCC_RXGB = MAKEFOURCC('R', 'X', 'G', 'B');
static const uint FOURCC_ATI1 = MAKEFOURCC('A', 'T', 'I', '1');
static const uint FOURCC_ATI2 = MAKEFOURCC('A', 'T', 'I', '2');
static const uint FOURCC_A2XY = MAKEFOURCC('A', '2', 'X', 'Y');
@ -133,7 +135,10 @@ namespace
static const uint DDPF_PALETTEINDEXED8 = 0x00000020U;
static const uint DDPF_LUMINANCE = 0x00020000U;
static const uint DDPF_ALPHAPREMULT = 0x00008000U;
static const uint DDPF_NORMAL = 0x80000000U; // @@ Custom nv flag.
// Custom NVTT flags.
static const uint DDPF_NORMAL = 0x80000000U;
static const uint DDPF_SRGB = 0x40000000U;
// DX10 formats.
enum DXGI_FORMAT
@ -522,24 +527,26 @@ namespace
static const uint s_d3dFormatCount = sizeof(s_d3dFormats) / sizeof(s_d3dFormats[0]);
static uint findD3D9Format(uint bitcount, uint rmask, uint gmask, uint bmask, uint amask)
{
for (uint i = 0; i < s_d3dFormatCount; i++)
{
if (s_d3dFormats[i].bitcount == bitcount &&
s_d3dFormats[i].rmask == rmask &&
s_d3dFormats[i].gmask == gmask &&
s_d3dFormats[i].bmask == bmask &&
s_d3dFormats[i].amask == amask)
{
return s_d3dFormats[i].format;
}
}
} // namespace
return 0;
uint nv::findD3D9Format(uint bitcount, uint rmask, uint gmask, uint bmask, uint amask)
{
for (int i = 0; i < s_d3dFormatCount; i++)
{
if (s_d3dFormats[i].bitcount == bitcount &&
s_d3dFormats[i].rmask == rmask &&
s_d3dFormats[i].gmask == gmask &&
s_d3dFormats[i].bmask == bmask &&
s_d3dFormats[i].amask == amask)
{
return s_d3dFormats[i].format;
}
}
} // namespace
return 0;
}
DDSHeader::DDSHeader()
{
@ -755,6 +762,12 @@ void DDSHeader::setNormalFlag(bool b)
else this->pf.flags &= ~DDPF_NORMAL;
}
void DDSHeader::setSrgbFlag(bool b)
{
if (b) this->pf.flags |= DDPF_SRGB;
else this->pf.flags &= ~DDPF_SRGB;
}
void DDSHeader::setHasAlphaFlag(bool b)
{
if (b) this->pf.flags |= DDPF_ALPHAPIXELS;
@ -831,6 +844,11 @@ bool DDSHeader::isNormalMap() const
return (pf.flags & DDPF_NORMAL) != 0;
}
bool DDSHeader::isSrgb() const
{
return (pf.flags & DDPF_SRGB) != 0;
}
bool DDSHeader::hasAlpha() const
{
return (pf.flags & DDPF_ALPHAPIXELS) != 0;
@ -1160,7 +1178,7 @@ void * DirectDrawSurface::readData(uint * sizePtr)
void * data = new unsigned char [size];
size = stream->serialize(data, size);
nvDebugCheck(uint(size) == *sizePtr);
nvDebugCheck(size == *sizePtr);
return data;
}

View File

@ -34,6 +34,17 @@ namespace nv
struct ColorBlock;
extern const uint FOURCC_NVTT;
extern const uint FOURCC_DDS;
extern const uint FOURCC_DXT1;
extern const uint FOURCC_DXT2;
extern const uint FOURCC_DXT3;
extern const uint FOURCC_DXT4;
extern const uint FOURCC_DXT5;
extern const uint FOURCC_RXGB;
extern const uint FOURCC_ATI1;
extern const uint FOURCC_ATI2;
extern uint findD3D9Format(uint bitcount, uint rmask, uint gmask, uint bmask, uint amask);
struct NVIMAGE_CLASS DDSPixelFormat
{
@ -101,6 +112,7 @@ namespace nv
void setPixelFormat(uint bitcount, uint rmask, uint gmask, uint bmask, uint amask);
void setDX10Format(uint format);
void setNormalFlag(bool b);
void setSrgbFlag(bool b);
void setHasAlphaFlag(bool b);
void setUserVersion(int version);
@ -111,6 +123,7 @@ namespace nv
uint toolVersion() const;
uint userVersion() const;
bool isNormalMap() const;
bool isSrgb() const;
bool hasAlpha() const;
uint d3d9Format() const;
};

View File

@ -33,47 +33,47 @@ namespace nv
namespace PixelFormat
{
// Convert component @a c having @a inbits to the returned value having @a outbits.
inline uint convert(uint c, uint inbits, uint outbits)
{
if (inbits == 0)
{
return 0;
}
else if (inbits >= outbits)
{
// truncate
return c >> (inbits - outbits);
}
else
{
// bitexpand
return (c << (outbits - inbits)) | convert(c, inbits, outbits - inbits);
}
}
// Convert component @a c having @a inbits to the returned value having @a outbits.
inline uint convert(uint c, uint inbits, uint outbits)
{
if (inbits == 0)
{
return 0;
}
else if (inbits >= outbits)
{
// truncate
return c >> (inbits - outbits);
}
else
{
// bitexpand
return (c << (outbits - inbits)) | convert(c, inbits, outbits - inbits);
}
}
// Get pixel component shift and size given its mask.
inline void maskShiftAndSize(uint mask, uint * shift, uint * size)
{
if (!mask)
{
*shift = 0;
*size = 0;
return;
}
*shift = 0;
while((mask & 1) == 0) {
++(*shift);
mask >>= 1;
}
*size = 0;
while((mask & 1) == 1) {
++(*size);
mask >>= 1;
}
}
// Get pixel component shift and size given its mask.
inline void maskShiftAndSize(uint mask, uint * shift, uint * size)
{
if (!mask)
{
*shift = 0;
*size = 0;
return;
}
*shift = 0;
while((mask & 1) == 0) {
++(*shift);
mask >>= 1;
}
*size = 0;
while((mask & 1) == 1) {
++(*size);
mask >>= 1;
}
}
inline float quantizeCeil(float f, int inbits, int outbits)
{