mirror of
https://github.com/yuzu-emu/FasTC.git
synced 2025-01-08 05:45:27 +00:00
Change the pixel channel size to 16 bits so that our arithmetic operations don't overflow.
This commit is contained in:
parent
dd12cc92cd
commit
a4a289c177
|
@ -58,17 +58,19 @@
|
|||
|
||||
namespace FasTC {
|
||||
|
||||
class Pixel : public Vector4<uint8> {
|
||||
class Pixel : public Vector4<uint16> {
|
||||
private:
|
||||
typedef uint16 ChannelType;
|
||||
typedef Vector4<ChannelType> VectorType;
|
||||
uint8 m_BitDepth[4];
|
||||
|
||||
public:
|
||||
Pixel() : Vector4<uint8>(0, 0, 0, 0) {
|
||||
Pixel() : VectorType(0, 0, 0, 0) {
|
||||
for(int i = 0; i < 4; i++)
|
||||
m_BitDepth[i] = 8;
|
||||
}
|
||||
|
||||
explicit Pixel(uint32 rgba) : Vector4<uint8>() {
|
||||
explicit Pixel(uint32 rgba) : VectorType() {
|
||||
for(int i = 0; i < 4; i++)
|
||||
m_BitDepth[i] = 8;
|
||||
Unpack(rgba);
|
||||
|
@ -76,7 +78,7 @@ class Pixel : public Vector4<uint8> {
|
|||
|
||||
Pixel(const uint8 *bits,
|
||||
const uint8 channelDepth[4] = static_cast<uint8 *>(0),
|
||||
uint8 bitOffset = 0) : Vector4<uint8>() {
|
||||
uint8 bitOffset = 0) : VectorType() {
|
||||
FromBits(bits, channelDepth, bitOffset);
|
||||
}
|
||||
|
||||
|
@ -104,18 +106,18 @@ class Pixel : public Vector4<uint8> {
|
|||
|
||||
// Changes the bit depth of a single component. See the comment
|
||||
// above for how we do this.
|
||||
static uint8 ChangeBitDepth(uint8 val, uint8 oldDepth, uint8 newDepth);
|
||||
static ChannelType ChangeBitDepth(ChannelType val, uint8 oldDepth, uint8 newDepth);
|
||||
|
||||
const uint8 &A() const { return X(); }
|
||||
uint8 &A() { return X(); }
|
||||
const uint8 &R() const { return Y(); }
|
||||
uint8 &R() { return Y(); }
|
||||
const uint8 &G() const { return Z(); }
|
||||
uint8 &G() { return Z(); }
|
||||
const uint8 &B() const { return W(); }
|
||||
uint8 &B() { return W(); }
|
||||
const uint8 &Component(uint32 idx) const { return vec[idx]; }
|
||||
uint8 &Component(uint32 idx) { return vec[idx]; }
|
||||
const ChannelType &A() const { return X(); }
|
||||
ChannelType &A() { return X(); }
|
||||
const ChannelType &R() const { return Y(); }
|
||||
ChannelType &R() { return Y(); }
|
||||
const ChannelType &G() const { return Z(); }
|
||||
ChannelType &G() { return Z(); }
|
||||
const ChannelType &B() const { return W(); }
|
||||
ChannelType &B() { return W(); }
|
||||
const ChannelType &Component(uint32 idx) const { return vec[idx]; }
|
||||
ChannelType &Component(uint32 idx) { return vec[idx]; }
|
||||
|
||||
void GetBitDepth(uint8 (&outDepth)[4]) const {
|
||||
for(int i = 0; i < 4; i++) {
|
||||
|
|
|
@ -82,7 +82,7 @@ namespace FasTC {
|
|||
}
|
||||
|
||||
for(int32 i = 0; i < 4; i++) {
|
||||
uint8 &channel = Component(i);
|
||||
ChannelType &channel = Component(i);
|
||||
uint32 depth = m_BitDepth[i];
|
||||
|
||||
assert(depth <= 8);
|
||||
|
@ -125,7 +125,7 @@ namespace FasTC {
|
|||
|
||||
uint8 bitIdx = bitOffset;
|
||||
for(int i = 3; i >= 0; i--) {
|
||||
uint8 val = Component(i);
|
||||
ChannelType val = Component(i);
|
||||
uint8 depth = m_BitDepth[i];
|
||||
|
||||
if(depth + bitIdx > 8) {
|
||||
|
@ -146,7 +146,7 @@ namespace FasTC {
|
|||
}
|
||||
}
|
||||
|
||||
uint8 Pixel::ChangeBitDepth(uint8 val, uint8 oldDepth, uint8 newDepth) {
|
||||
Pixel::ChannelType Pixel::ChangeBitDepth(Pixel::ChannelType val, uint8 oldDepth, uint8 newDepth) {
|
||||
assert(newDepth <= 8);
|
||||
assert(oldDepth <= 8);
|
||||
|
||||
|
@ -222,7 +222,7 @@ namespace FasTC {
|
|||
ok = ok && m_BitDepth[i] == depths[i];
|
||||
|
||||
uint8 mask = (1 << depths[i]) - 1;
|
||||
const uint8 c = other.Component(i) & mask;
|
||||
const ChannelType c = other.Component(i) & mask;
|
||||
ok = ok && (c == (Component(i) & mask));
|
||||
}
|
||||
return ok;
|
||||
|
|
Loading…
Reference in a new issue