29 const uint arr_stride_uint = (
uint)arr_stride;
30 const uint arr_half_stride = (arr_len / 2) * arr_stride_uint;
35 for (i = 0, i_end = (arr_len - 1) * arr_stride_uint; i < arr_half_stride;
36 i += arr_stride_uint, i_end -= arr_stride_uint)
38 memcpy(buf, &arr[i], arr_stride);
39 memcpy(&arr[i], &arr[i_end], arr_stride);
40 memcpy(&arr[i_end], buf, arr_stride);
50 memcpy(buf, arr, arr_stride);
51 memmove(arr, arr + arr_stride, arr_stride * (arr_len - 1));
52 memcpy(arr + (arr_stride * (arr_len - 1)), buf, arr_stride);
55 memcpy(buf, arr + (arr_stride * (arr_len - 1)), arr_stride);
56 memmove(arr + arr_stride, arr, arr_stride * (arr_len - 1));
57 memcpy(arr, buf, arr_stride);
65 void *arr,
const uint arr_len,
const size_t arr_stride,
const uint *order,
void *arr_temp)
67 const size_t len = arr_len * arr_stride;
68 const uint arr_stride_uint = (
uint)arr_stride;
72 if (arr_temp ==
NULL) {
79 memcpy(arr_orig, arr,
len);
81 for (i = 0; i < arr_len; i++) {
88 if (arr_temp ==
NULL) {
99 const uint arr_stride_uint = (
uint)arr_stride;
101 for (
uint i = 0; i < arr_len; i++) {
118 const char *arr_step = (
const char *)arr;
119 for (
uint i = 0; i < arr_len; i++, arr_step += arr_stride) {
120 if (memcmp(arr_step, p, arr_stride) == 0) {
129 const char *arr_step = (
const char *)arr + (arr_stride * arr_len);
130 for (
uint i = arr_len; i-- != 0;) {
131 arr_step -= arr_stride;
132 if (memcmp(arr_step, p, arr_stride) == 0) {
140 void *arr,
const void *arr_a,
const void *arr_b,
uint arr_len,
size_t arr_stride)
143 const char *src_a = arr_a;
144 const char *src_b = arr_b;
146 size_t i = arr_stride * arr_len;
148 *(dst++) = *(src_a++) & *(src_b++);
153 void *arr,
const void *arr_a,
const void *arr_b,
uint arr_len,
size_t arr_stride)
156 const char *src_a = arr_a;
157 const char *src_b = arr_b;
159 size_t i = arr_stride * arr_len;
161 *(dst++) = *(src_a++) | *(src_b++);
169 bool use_delimit_bounds,
170 bool (*test_fn)(
const void *arr_item,
void *user_data),
178 if (use_wrap && (span_step[0] != arr_len) && (span_step[0] > span_step[1])) {
182 const uint arr_stride_uint = (
uint)arr_stride;
183 const void *item_prev;
188 if ((span_step[0] == arr_len) && (span_step[1] == arr_len)) {
192 test_prev = test_fn(item_prev, user_data);
194 else if (use_delimit_bounds ==
false) {
197 test_prev = test_fn(item_prev, user_data);
205 else if ((i_curr = span_step[1] + 2) < arr_len) {
206 item_prev =
POINTER_OFFSET(arr, (span_step[1] + 1) * arr_stride_uint);
207 test_prev = test_fn(item_prev, user_data);
214 const void *item_curr =
POINTER_OFFSET(arr, i_curr * arr_stride_uint);
216 while (i_curr < arr_len) {
217 bool test_curr = test_fn(item_curr, user_data);
218 if ((test_prev ==
false) && (test_curr ==
true)) {
220 uint i_step_prev = i_curr;
223 uint i_step = i_curr + 1;
227 while (test_fn(
POINTER_OFFSET(arr, i_step * arr_stride_uint), user_data)) {
228 i_step_prev = i_step;
235 if (i_step_prev < i_curr) {
236 span_len = (i_step_prev + (arr_len - i_curr)) + 1;
239 span_len = (i_step_prev - i_curr) + 1;
243 uint i_step = i_curr + 1;
244 while ((i_step != arr_len) &&
245 test_fn(
POINTER_OFFSET(arr, i_step * arr_stride_uint), user_data))
247 i_step_prev = i_step;
251 span_len = (i_step_prev - i_curr) + 1;
253 if ((use_delimit_bounds ==
false) && (i_step_prev == arr_len - 1)) {
258 span_step[0] = i_curr;
259 span_step[1] = i_step_prev;
260 *r_span_len = span_len;
265 test_prev = test_curr;
267 item_prev = item_curr;
277 const char *arr_step = (
const char *)arr_v;
278 size_t i = arr_stride * arr_len;
288 const int arr_shape[2],
291 bool (*test_fn)(
const void *arr_item,
void *user_data),
294 BLI_assert(center[0] >= 0 && center[1] >= 0 && center[0] < arr_shape[0] &&
295 center[1] < arr_shape[1]);
297 const char *arr = arr_v;
298 const int stride[2] = {arr_shape[0] * (
int)elem_size, (
int)elem_size};
301 int ofs[2] = {center[0] * stride[1], center[1] * stride[0]};
302 if (test_fn(arr + ofs[0] + ofs[1], user_data)) {
308 int steps_in, steps_out;
310 int x_minus = center[0];
311 int x_plus = arr_shape[0] - center[0] - 1;
312 int y_minus = center[1];
313 int y_plus = arr_shape[1] - center[1] - 1;
315 steps_in = 2 *
min_iiii(x_minus, x_plus, y_minus, y_plus);
316 steps_out = 2 *
max_iiii(x_minus, x_plus, y_minus, y_plus);
320 const int limits[2] = {(arr_shape[0] - 1) * stride[0], stride[0] - stride[1]};
323 while (
steps < steps_out) {
330 bool check_bounds =
steps > steps_in;
333 for (
int sign = 2; sign--;) {
335 for (
int axis = 2; axis--;) {
336 int ofs_step = stride[axis];
341 int ofs_iter = ofs[axis] + ofs_step;
342 int ofs_dest = ofs[axis] +
steps * ofs_step;
343 int ofs_other = ofs[!axis];
345 ofs[axis] = ofs_dest;
347 if (ofs_other < 0 || ofs_other > limits[!axis]) {
352 CLAMP(ofs_iter, 0, limits[axis]);
353 CLAMP(ofs_dest, 0, limits[axis]);
357 if (test_fn(arr + ofs_other + ofs_iter, user_data)) {
360 if (ofs_iter == ofs_dest) {
363 ofs_iter += ofs_step;
#define BLI_array_alloca(arr, realsize)
Generic array manipulation API.
#define BLI_assert_unreachable()
MINLINE int max_iiii(int a, int b, int c, int d)
MINLINE int min_iiii(int a, int b, int c, int d)
#define POINTER_OFFSET(v, ofs)
Read Guarded memory(de)allocation.
void _bli_array_binary_or(void *arr, const void *arr_a, const void *arr_b, uint arr_len, size_t arr_stride)
int _bli_array_rfindindex(const void *arr, uint arr_len, size_t arr_stride, const void *p)
uint _bli_array_deduplicate_ordered(void *arr, uint arr_len, size_t arr_stride)
bool _bli_array_is_zeroed(const void *arr_v, uint arr_len, size_t arr_stride)
bool _bli_array_iter_spiral_square(const void *arr_v, const int arr_shape[2], size_t elem_size, const int center[2], bool(*test_fn)(const void *arr_item, void *user_data), void *user_data)
int _bli_array_findindex(const void *arr, uint arr_len, size_t arr_stride, const void *p)
bool _bli_array_iter_span(const void *arr, uint arr_len, size_t arr_stride, bool use_wrap, bool use_delimit_bounds, bool(*test_fn)(const void *arr_item, void *user_data), void *user_data, uint span_step[2], uint *r_span_len)
void _bli_array_wrap(void *arr_v, uint arr_len, size_t arr_stride, int dir)
void _bli_array_permute(void *arr, const uint arr_len, const size_t arr_stride, const uint *order, void *arr_temp)
void _bli_array_reverse(void *arr_v, uint arr_len, size_t arr_stride)
void _bli_array_binary_and(void *arr, const void *arr_a, const void *arr_b, uint arr_len, size_t arr_stride)
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)