TextureTaffy/Source/HalfFloat.cpp

1040 lines
11 KiB
C++
Raw Normal View History

2023-04-28 15:47:06 +03:00
#include "HalfFloat.h"
namespace HalfFloat {
static const uint16_t basetable[512] = {
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0001,
0x0002,
0x0004,
0x0008,
0x0010,
0x0020,
0x0040,
0x0080,
0x0100,
0x0200,
0x0400,
0x0800,
0x0c00,
0x1000,
0x1400,
0x1800,
0x1c00,
0x2000,
0x2400,
0x2800,
0x2c00,
0x3000,
0x3400,
0x3800,
0x3c00,
0x4000,
0x4400,
0x4800,
0x4c00,
0x5000,
0x5400,
0x5800,
0x5c00,
0x6000,
0x6400,
0x6800,
0x6c00,
0x7000,
0x7400,
0x7800,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x7c00,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8000,
0x8001,
0x8002,
0x8004,
0x8008,
0x8010,
0x8020,
0x8040,
0x8080,
0x8100,
0x8200,
0x8400,
0x8800,
0x8c00,
0x9000,
0x9400,
0x9800,
0x9c00,
0xa000,
0xa400,
0xa800,
0xac00,
0xb000,
0xb400,
0xb800,
0xbc00,
0xc000,
0xc400,
0xc800,
0xcc00,
0xd000,
0xd400,
0xd800,
0xdc00,
0xe000,
0xe400,
0xe800,
0xec00,
0xf000,
0xf400,
0xf800,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00,
0xfc00
};
static const uint8_t shifttable[512] = {
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x17,
0x16,
0x15,
0x14,
0x13,
0x12,
0x11,
0x10,
0x0f,
0x0e,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x0d,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x17,
0x16,
0x15,
0x14,
0x13,
0x12,
0x11,
0x10,
0x0f,
0x0e,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x0d,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x18,
0x0d
};
uint16_t FromFloat(float x)
{
uint32_t f = *reinterpret_cast<uint32_t *>(&x);
return basetable[(f >> 23) & 0x1ff] + ((f & 0x007fffff) >> shifttable[(f >> 23) & 0x1ff]);
}
}