Blender V4.3
COM_BuffersIterator.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include "BLI_rect.h"
8#include "BLI_vector.hh"
9
10namespace blender::compositor {
11
17template<typename T> class BuffersIteratorBuilder {
18 public:
19 class Iterator {
20 int x_start_;
21 int x_end_;
22 const T *out_end_;
23 int out_elem_stride_;
24 /* Stride between an output row end and the next row start. */
25 int out_rows_gap_;
26
27 struct In {
28 int elem_stride;
29 int rows_gap;
30 const T *in;
31 };
32 Vector<In, 6> ins_;
33
35
36 public:
37 int x;
38 int y;
40 T *out;
41
42 public:
46 const T *in(int input_index) const
47 {
48 BLI_assert(input_index < ins_.size());
49 return ins_[input_index].in;
50 }
51
52 int get_num_inputs() const
53 {
54 return ins_.size();
55 }
56
60 bool is_end() const
61 {
62 return out >= out_end_;
63 }
64
68 void next()
69 {
70 out += out_elem_stride_;
71 for (In &in : ins_) {
72 in.in += in.elem_stride;
73 }
74 x++;
75 if (x == x_end_) {
76 x = x_start_;
77 y++;
78 out += out_rows_gap_;
79 for (In &in : ins_) {
80 in.in += in.rows_gap;
81 }
82 }
83 }
84
86 {
87 this->next();
88 return *this;
89 }
90 };
91
92 private:
93 Iterator iterator_;
94 rcti area_;
95 bool is_built_;
96
97 public:
106 const rcti &buffer_area,
107 const rcti &iterated_area,
108 int elem_stride = 1)
109 : area_(iterated_area), is_built_(false)
110 {
111 BLI_assert(BLI_rcti_inside_rcti(&buffer_area, &iterated_area));
112 iterator_.x = iterated_area.xmin;
113 iterator_.y = iterated_area.ymin;
114 iterator_.x_start_ = iterated_area.xmin;
115 iterator_.x_end_ = iterated_area.xmax;
116
117 iterator_.out_elem_stride_ = elem_stride;
118 const int buffer_width = BLI_rcti_size_x(&buffer_area);
119 intptr_t out_row_stride = buffer_width * elem_stride;
120 iterator_.out_rows_gap_ = out_row_stride - BLI_rcti_size_x(&iterated_area) * elem_stride;
121 const int out_start_x = iterated_area.xmin - buffer_area.xmin;
122 const int out_start_y = iterated_area.ymin - buffer_area.ymin;
123 iterator_.out = output + (intptr_t)out_start_y * out_row_stride +
124 (intptr_t)out_start_x * elem_stride;
125 const T *out_row_end_ = iterator_.out +
126 (intptr_t)BLI_rcti_size_x(&iterated_area) * elem_stride;
127 iterator_.out_end_ = out_row_end_ +
128 (intptr_t)out_row_stride * (BLI_rcti_size_y(&iterated_area) - 1);
129 }
130
134 BuffersIteratorBuilder(T *output, int buffer_width, int buffer_height, int elem_stride = 1)
135 : BuffersIteratorBuilder(output,
136 {0, buffer_width, 0, buffer_height},
137 {0, buffer_width, 0, buffer_height},
138 elem_stride)
139 {
140 }
141
145 void add_input(const T *input, const rcti &buffer_area, int elem_stride = 1)
146 {
147 BLI_assert(!is_built_);
148 BLI_assert(BLI_rcti_inside_rcti(&buffer_area, &area_));
149 typename Iterator::In in;
150 in.elem_stride = elem_stride;
151 const size_t buffer_width = BLI_rcti_size_x(&buffer_area);
152 in.rows_gap = buffer_width * elem_stride - BLI_rcti_size_x(&area_) * elem_stride;
153 const size_t in_start_x = area_.xmin - buffer_area.xmin;
154 const size_t in_start_y = area_.ymin - buffer_area.ymin;
155 in.in = input + in_start_y * buffer_width * elem_stride + in_start_x * elem_stride;
156 iterator_.ins_.append(std::move(in));
157 }
158
162 void add_input(const T *input, int buffer_width, int elem_stride = 1)
163 {
164 rcti buffer_area;
165 BLI_rcti_init(&buffer_area, 0, buffer_width, 0, area_.ymax);
166 add_input(input, buffer_area, elem_stride);
167 }
168
173 {
174 is_built_ = true;
175 return iterator_;
176 }
177};
178
179template<typename T> using BuffersIterator = typename BuffersIteratorBuilder<T>::Iterator;
180
181} // namespace blender::compositor
#define BLI_assert(a)
Definition BLI_assert.h:50
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
Definition BLI_rect.h:193
void BLI_rcti_init(struct rcti *rect, int xmin, int xmax, int ymin, int ymax)
Definition rct.c:418
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition BLI_rect.h:189
bool BLI_rcti_inside_rcti(const rcti *rct_a, const rcti *rct_b)
Definition rct.c:198
int64_t size() const
BuffersIteratorBuilder(T *output, const rcti &buffer_area, const rcti &iterated_area, int elem_stride=1)
void add_input(const T *input, const rcti &buffer_area, int elem_stride=1)
BuffersIteratorBuilder(T *output, int buffer_width, int buffer_height, int elem_stride=1)
void add_input(const T *input, int buffer_width, int elem_stride=1)
BuffersIteratorBuilder::Iterator build()
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
_W64 int intptr_t
Definition stdint.h:118
int ymin
int ymax
int xmin
int xmax