Color.cppm 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. export module Core.Color;
  2. export import Core.Types;
  3. export namespace Core {
  4. using ColorChannel = u8;
  5. template<size_t N>
  6. class Color final {
  7. static_assert(N >= 1 && N <= 4, "a color has 1 to 4 channels");
  8. ColorChannel data[N] = {};
  9. public:
  10. Color() noexcept = default;
  11. template<typename OT, typename... Args>
  12. Color(OT a, Args&&... args) noexcept :
  13. data(
  14. static_cast<ColorChannel>(a),
  15. static_cast<ColorChannel>(args)...) {
  16. static_assert(
  17. sizeof...(args) + 1 == N,
  18. "color channel parameters do not match its size");
  19. }
  20. float asFloat(size_t index) const noexcept {
  21. return data[index] * (1.0f / 255.0f);
  22. }
  23. ColorChannel& operator[](size_t index) noexcept {
  24. return data[index];
  25. }
  26. const ColorChannel& operator[](size_t index) const noexcept {
  27. return data[index];
  28. }
  29. };
  30. using Color4 = Color<4>;
  31. using Color3 = Color<3>;
  32. using Color2 = Color<2>;
  33. using Color1 = Color<1>;
  34. }