mirror of
https://github.com/yuzu-emu/FasTC.git
synced 2024-11-30 22:14:20 +01:00
Add YCoCg pixel type
This commit is contained in:
parent
4fc75f22dc
commit
9dc23db287
@ -59,7 +59,7 @@
|
|||||||
namespace FasTC {
|
namespace FasTC {
|
||||||
|
|
||||||
class Pixel : public Vector4<uint16> {
|
class Pixel : public Vector4<uint16> {
|
||||||
private:
|
protected:
|
||||||
typedef uint16 ChannelType;
|
typedef uint16 ChannelType;
|
||||||
typedef Vector4<ChannelType> VectorType;
|
typedef Vector4<ChannelType> VectorType;
|
||||||
uint8 m_BitDepth[4];
|
uint8 m_BitDepth[4];
|
||||||
@ -159,6 +159,28 @@ class Pixel : public Vector4<uint16> {
|
|||||||
};
|
};
|
||||||
REGISTER_VECTOR_TYPE(Pixel);
|
REGISTER_VECTOR_TYPE(Pixel);
|
||||||
|
|
||||||
|
class YCoCgPixel : public Pixel {
|
||||||
|
private:
|
||||||
|
void ToYCoCg();
|
||||||
|
|
||||||
|
public:
|
||||||
|
YCoCgPixel() : Pixel() { }
|
||||||
|
explicit YCoCgPixel(uint32 rgba) : Pixel(rgba) { ToYCoCg(); }
|
||||||
|
explicit YCoCgPixel(const Pixel &p) : Pixel(p) { ToYCoCg(); }
|
||||||
|
|
||||||
|
Pixel ToRGBA() const;
|
||||||
|
|
||||||
|
float ToIntensity() const { return ConvertChannelToFloat(R(), 8); }
|
||||||
|
uint32 Pack() const { return ToRGBA().Pack(); }
|
||||||
|
void Unpack(uint32 rgba) { Pixel::Unpack(rgba); ToYCoCg(); }
|
||||||
|
|
||||||
|
const ChannelType &Co() const { return Z(); }
|
||||||
|
ChannelType &Co() { return Z(); }
|
||||||
|
const ChannelType &Cg() const { return W(); }
|
||||||
|
ChannelType &Cg() { return W(); }
|
||||||
|
};
|
||||||
|
REGISTER_VECTOR_TYPE(YCoCgPixel);
|
||||||
|
|
||||||
} // namespace FasTC
|
} // namespace FasTC
|
||||||
|
|
||||||
#endif // BASE_INCLUDE_PIXEL_H_
|
#endif // BASE_INCLUDE_PIXEL_H_
|
||||||
|
@ -56,6 +56,11 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static inline T Clamp(const T &v, const T &_min, const T &_max) {
|
||||||
|
return std::max(_min, std::min(v, _max));
|
||||||
|
}
|
||||||
|
|
||||||
namespace FasTC {
|
namespace FasTC {
|
||||||
|
|
||||||
void Pixel::FromBits(const uint8 *bits,
|
void Pixel::FromBits(const uint8 *bits,
|
||||||
@ -260,4 +265,30 @@ namespace FasTC {
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void YCoCgPixel::ToYCoCg() {
|
||||||
|
int16 Y = ((R() + (G() << 1) + B()) + 2) >> 2;
|
||||||
|
int16 Co = (R() - B() + 1) >> 1;
|
||||||
|
int16 Cg = ((-R() + (G() << 1) - B()) + 2) >> 2;
|
||||||
|
|
||||||
|
this->Y() = Clamp<int16>(Y, 0, 255);
|
||||||
|
this->Co() = Clamp<int16>(Co + 128, 0, 255);
|
||||||
|
this->Cg() = Clamp<int16>(Cg + 128, 0, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
Pixel YCoCgPixel::ToRGBA() const {
|
||||||
|
int16 Co = this->Co() - 128;
|
||||||
|
int16 Cg = this->Cg() - 128;
|
||||||
|
|
||||||
|
int16 R = Y() + (Co - Cg);
|
||||||
|
int16 G = Y() + Cg;
|
||||||
|
int16 B = Y() - (Co + Cg);
|
||||||
|
|
||||||
|
Pixel p;
|
||||||
|
p.R() = Clamp<int16>(R, 0, 255);
|
||||||
|
p.G() = Clamp<int16>(G, 0, 255);
|
||||||
|
p.B() = Clamp<int16>(B, 0, 255);
|
||||||
|
p.A() = A();
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace FasTC
|
} // namespace FasTC
|
||||||
|
Loading…
Reference in New Issue
Block a user