7#include "../numeric_array.hpp"
9#include "../float16.hpp"
10#include "../pixel_map.hpp"
34 ttlet rhs_fp16 = _mm_cvtps_ph(
static_cast<__m128
>(rhs), _MM_FROUND_CUR_DIRECTION);
35 _mm_storeu_si64(v.
data(), rhs_fp16);
40 ttlet rhs_fp16 = _mm_cvtps_ph(
static_cast<__m128
>(rhs), _MM_FROUND_CUR_DIRECTION);
41 _mm_storeu_si64(v.
data(), rhs_fp16);
45 explicit operator f32x4()
const noexcept
47 ttlet rhs_fp16 = _mm_loadu_si64(v.
data());
48 return f32x4{_mm_cvtph_ps(rhs_fp16)};
55 return *
this =
static_cast<f32x4>(rhs);
58 explicit operator color()
const noexcept
73 return lhs.v == rhs.v;
84 std::get<3>(r.v) = 0x0000;
91 for (
ssize_t y = 0; y != image.height(); ++y) {
93 for (
ssize_t x = 0; x != image.width(); ++x) {
99inline void desaturate(pixel_map<sfloat_rgba16> &image,
float brightness)
noexcept
101 for (ssize_t y = 0; y != image.height(); ++y) {
103 for (ssize_t x = 0; x != image.width(); ++x) {
104 row[x] = desaturate(
static_cast<f32x4
>(row[x]), brightness);
109inline void composit(pixel_map<sfloat_rgba16> &under, pixel_map<sfloat_rgba16>
const &over)
noexcept
111 tt_assert(over.height() >= under.height());
112 tt_assert(over.width() >= under.width());
114 for (ssize_t rowNr = 0; rowNr != under.height(); ++rowNr) {
115 ttlet overRow = over.at(rowNr);
116 auto underRow = under.at(rowNr);
117 for (ssize_t columnNr = 0; columnNr != under.width(); ++columnNr) {
118 ttlet &overPixel = overRow[columnNr];
119 auto &underPixel = underRow[columnNr];
121 underPixel = composit(
static_cast<f32x4
>(underPixel),
static_cast<f32x4
>(overPixel));
126inline void composit(pixel_map<sfloat_rgba16> &under, color over, pixel_map<uint8_t>
const &mask)
noexcept
128 tt_assert(mask.height() >= under.height());
129 tt_assert(mask.width() >= under.width());
131 auto maskPixel = color{1.0f, 1.0f, 1.0f, 1.0f};
133 for (ssize_t rowNr = 0; rowNr != under.height(); ++rowNr) {
134 ttlet maskRow = mask.at(rowNr);
135 auto underRow = under.at(rowNr);
136 for (ssize_t columnNr = 0; columnNr != under.width(); ++columnNr) {
137 ttlet maskValue = maskRow[columnNr] / 255.0f;
138 maskPixel.a() = maskValue;
140 auto &pixel = underRow[columnNr];
141 pixel = composit(
static_cast<color
>(pixel), over * maskPixel);
This is a RGBA floating point color.
Definition color.hpp:39
Definition sfloat_rgba16.hpp:17
A 2D canvas of pixels.
Definition pixel_map.hpp:99