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