24 const int2 output_size =
int2(output.get_width(), output.get_height());
31 for (const int64_t y : sub_y_range) {
32 for (const int64_t x : IndexRange(output_size.x)) {
35 int2 texel = int2(x, y);
39 float2 coordinates = (float2(texel) + float2(0.5)) / float2(output_size);
51 float4 upsampled = float4(0.0f);
52 upsampled += (4.0f / 16.0f) * input.texture_bilinear_extend(coordinates);
53 upsampled += (2.0f / 16.0f) *
54 input.texture_bilinear_extend(coordinates + pixel_size * float2(-1.0f, 0.0f));
55 upsampled += (2.0f / 16.0f) *
56 input.texture_bilinear_extend(coordinates + pixel_size * float2(0.0f, 1.0f));
57 upsampled += (2.0f / 16.0f) *
58 input.texture_bilinear_extend(coordinates + pixel_size * float2(1.0f, 0.0f));
59 upsampled += (2.0f / 16.0f) *
60 input.texture_bilinear_extend(coordinates + pixel_size * float2(0.0f, -1.0f));
61 upsampled += (1.0f / 16.0f) * input.texture_bilinear_extend(
62 coordinates + pixel_size * float2(-1.0f, -1.0f));
63 upsampled += (1.0f / 16.0f) *
64 input.texture_bilinear_extend(coordinates + pixel_size * float2(-1.0f, 1.0f));
65 upsampled += (1.0f / 16.0f) *
66 input.texture_bilinear_extend(coordinates + pixel_size * float2(1.0f, -1.0f));
67 upsampled += (1.0f / 16.0f) *
68 input.texture_bilinear_extend(coordinates + pixel_size * float2(1.0f, 1.0f));
70 const float4 original_value = output.get_elem(texel.x, texel.y);
71 copy_v4_v4(output.get_elem(texel.x, texel.y), original_value + upsampled);
101 const int2 input_size =
int2(input.get_width(), input.get_height());
102 const int2 output_size =
int2(output.get_width(), output.get_height());
109 for (const int64_t y : sub_y_range) {
110 for (const int64_t x : IndexRange(output_size.x)) {
113 int2 texel = int2(x, y);
117 float2 coordinates = (float2(texel) + float2(0.5f)) / float2(output_size);
130 float4 center = input.texture_bilinear_extend(coordinates);
131 float4 upper_left_near = input.texture_bilinear_extend(coordinates +
132 pixel_size * float2(-1.0f, 1.0f));
133 float4 upper_right_near = input.texture_bilinear_extend(coordinates +
134 pixel_size * float2(1.0f, 1.0f));
135 float4 lower_left_near = input.texture_bilinear_extend(coordinates +
136 pixel_size * float2(-1.0f, -1.0f));
137 float4 lower_right_near = input.texture_bilinear_extend(coordinates +
138 pixel_size * float2(1.0f, -1.0f));
139 float4 left_far = input.texture_bilinear_extend(coordinates +
140 pixel_size * float2(-2.0f, 0.0f));
141 float4 right_far = input.texture_bilinear_extend(coordinates +
142 pixel_size * float2(2.0f, 0.0f));
143 float4 upper_far = input.texture_bilinear_extend(coordinates +
144 pixel_size * float2(0.0f, 2.0f));
145 float4 lower_far = input.texture_bilinear_extend(coordinates +
146 pixel_size * float2(0.0f, -2.0f));
147 float4 upper_left_far = input.texture_bilinear_extend(coordinates +
148 pixel_size * float2(-2.0f, 2.0f));
149 float4 upper_right_far = input.texture_bilinear_extend(coordinates +
150 pixel_size * float2(2.0f, 2.0f));
151 float4 lower_left_far = input.texture_bilinear_extend(coordinates +
152 pixel_size * float2(-2.0f, -2.0f));
153 float4 lower_right_far = input.texture_bilinear_extend(coordinates +
154 pixel_size * float2(2.0f, -2.0f));
156 if (!use_karis_average) {
165 float4 result = (4.0f / 32.0f) * center +
166 (4.0f / 32.0f) * (upper_left_near + upper_right_near + lower_left_near +
168 (2.0f / 32.0f) * (left_far + right_far + upper_far + lower_far) +
169 (1.0f / 32.0f) * (upper_left_far + upper_right_far + lower_left_far +
171 copy_v4_v4(output.get_elem(texel.x, texel.y), result);
181 float4 center_weighted_sum = karis_brightness_weighted_sum(
182 upper_left_near, upper_right_near, lower_right_near, lower_left_near);
183 float4 upper_left_weighted_sum = karis_brightness_weighted_sum(
184 upper_left_far, upper_far, center, left_far);
185 float4 upper_right_weighted_sum = karis_brightness_weighted_sum(
186 upper_far, upper_right_far, right_far, center);
187 float4 lower_right_weighted_sum = karis_brightness_weighted_sum(
188 center, right_far, lower_right_far, lower_far);
189 float4 lower_left_weighted_sum = karis_brightness_weighted_sum(
190 left_far, center, lower_far, lower_left_far);
197 float4 result = (4.0f / 8.0f) * center_weighted_sum +
198 (1.0f / 8.0f) * (upper_left_weighted_sum + upper_right_weighted_sum +
199 lower_left_weighted_sum + lower_right_weighted_sum);
200 copy_v4_v4(output.get_elem(texel.x, texel.y), result);
221 downsample_chain[0] = std::make_unique<MemoryBuffer>(highlights);
222 const IndexRange downsample_passes_range(chain_length - 1);
224 for (
const int i : downsample_passes_range) {
227 const int2 input_size =
int2(input.get_width(), input.get_height());
228 const int2 output_size = input_size / 2;
231 BLI_rcti_init(&output_rect, 0, output_size.x, 0, output_size.y);
232 downsample_chain[i + 1] = std::make_unique<MemoryBuffer>(DataType::Color, output_rect,
false);
239 const bool use_karis_average = i == downsample_passes_range.
first();
243 return downsample_chain;
static T sum(const btAlignedObjectArray< T > &items)