summaryrefslogtreecommitdiff
path: root/subprojects/pixpat/pixpat-native/src/pipeline.h
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/pixpat/pixpat-native/src/pipeline.h')
-rw-r--r--subprojects/pixpat/pixpat-native/src/pipeline.h44
1 files changed, 44 insertions, 0 deletions
diff --git a/subprojects/pixpat/pixpat-native/src/pipeline.h b/subprojects/pixpat/pixpat-native/src/pipeline.h
new file mode 100644
index 0000000..09e13bc
--- /dev/null
+++ b/subprojects/pixpat/pixpat-native/src/pipeline.h
@@ -0,0 +1,44 @@
+#pragma once
+
+#include <cstddef>
+
+#include "color.h"
+#include "layout.h"
+
+// Inlined source → color → sink composition. The intermediate Pixel
+// values stay in registers across stages; there is no normalized RGB16
+// or YUV16 buffer between source and sink. Block size is dictated by
+// the sink: 1x1 for non-subsampled formats, h_sub × v_sub for chroma-
+// subsampled ones.
+
+namespace pixpat
+{
+
+template <typename Source, typename Sink>
+struct Converter {
+ using Xfm = ColorXfm<typename Source::Pixel, typename Sink::Pixel>;
+ static constexpr size_t bh = Sink::block_h;
+ static constexpr size_t bw = Sink::block_w;
+
+ static void run(const Buffer<Source::Layout::num_planes>& src,
+ Buffer<Sink::Layout::num_planes>& dst,
+ size_t W, size_t H,
+ size_t by_start, size_t by_end,
+ ColorSpec spec) noexcept
+ {
+ const ColorCoeffs c = coeffs_for(spec);
+ for (size_t by = by_start; by < by_end; by += bh) {
+ for (size_t bx = 0; bx < W; bx += bw) {
+ typename Sink::Pixel block[bh][bw];
+ for (size_t dy = 0; dy < bh; ++dy)
+ for (size_t dx = 0; dx < bw; ++dx)
+ block[dy][dx] = Xfm::apply(
+ Source::read(src, bx + dx, by + dy,
+ W, H), c);
+ Sink::write_block(dst, bx, by, block);
+ }
+ }
+ }
+};
+
+} // namespace pixpat