46 for (const int64_t y : sub_y_range) {
47 for (const int64_t x : IndexRange(size.x)) {
48 int2 texel = int2(x, y);
50 int2 closest_seed_texel = int2(0);
51 float minimum_squared_distance = std::numeric_limits<float>::max();
52 for (int j = -1; j <= 1; j++) {
53 for (int i = -1; i <= 1; i++) {
54 int2 offset = int2(i, j) * step_size;
56 int2 fallback = JUMP_FLOODING_NON_FLOODED_VALUE;
57 int2 jump_flooding_value = load_jump_flooding(input, texel + offset, size, fallback);
59 if (jump_flooding_value == JUMP_FLOODING_NON_FLOODED_VALUE) {
63 int2 closest_seed_texel_to_neighbor = jump_flooding_value;
65 float squared_distance = math::distance_squared(float2(closest_seed_texel_to_neighbor),
68 if (squared_distance < minimum_squared_distance) {
69 minimum_squared_distance = squared_distance;
70 closest_seed_texel = closest_seed_texel_to_neighbor;
75 bool flooding_happened = minimum_squared_distance != std::numeric_limits<float>::max();
76 int2 jump_flooding_value = encode_jump_flooding_value(closest_seed_texel,
79 output[size_t(texel.y) * size.x + texel.x] = jump_flooding_value;
87 Array<int2> initial_flooded_result(
size_t(size.x) * size.y);
90 Array<int2> *result_to_flood = &initial_flooded_result;
91 Array<int2> intermediate_result(
size_t(size.x) * size.y);
92 Array<int2> *result_after_flooding = &intermediate_result;
94 const int max_size =
math::max(size.x, size.y);
97 while (step_size != 0) {
99 std::swap(result_to_flood, result_after_flooding);
103 return *result_to_flood;