Blender V4.3
COM_ConvertOperation.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
7#include "BLI_color.hh"
8
10
11namespace blender::compositor {
12
17
19
21 const rcti &area,
23{
24 BuffersIterator<float> it = output->iterate_with(inputs, area);
26}
27
28std::unique_ptr<MetaData> ConvertBaseOperation::get_meta_data()
29{
30 if (this->get_input_operation(0)) {
32 }
33
34 return nullptr;
35}
36
37/* ******** Value to Color ******** */
38
44
46{
47 for (; !it.is_end(); ++it) {
48 it.out[0] = it.out[1] = it.out[2] = *it.in(0);
49 it.out[3] = 1.0f;
50 }
51}
52
53/* ******** Color to Value ******** */
54
60
62{
63 for (; !it.is_end(); ++it) {
64 const float *in = it.in(0);
65 it.out[0] = (in[0] + in[1] + in[2]) / 3.0f;
66 }
67}
68
69/* ******** Color to BW ******** */
70
76
78{
79 for (; !it.is_end(); ++it) {
80 it.out[0] = IMB_colormanagement_get_luminance(it.in(0));
81 }
82}
83
84/* ******** Color to Vector ******** */
85
91
93{
94 for (; !it.is_end(); ++it) {
95 copy_v3_v3(it.out, it.in(0));
96 }
97}
98
99/* ******** Value to Vector ******** */
100
106
108{
109 for (; !it.is_end(); ++it) {
110 it.out[0] = it.out[1] = it.out[2] = *it.in(0);
111 }
112}
113
114/* ******** Vector to Color ******** */
115
121
123{
124 for (; !it.is_end(); ++it) {
125 copy_v3_v3(it.out, it.in(0));
126 it.out[3] = 1.0f;
127 }
128}
129
130/* ******** Vector to Value ******** */
131
137
139{
140 for (; !it.is_end(); ++it) {
141 const float *in = it.in(0);
142 it.out[0] = (in[0] + in[1] + in[2]) / 3.0f;
143 }
144}
145
146/* ******** RGB to YCC ******** */
147
153
155{
156 switch (mode) {
157 case 0:
158 mode_ = BLI_YCC_ITU_BT601;
159 break;
160 case 2:
161 mode_ = BLI_YCC_JFIF_0_255;
162 break;
163 case 1:
164 default:
165 mode_ = BLI_YCC_ITU_BT709;
166 break;
167 }
168}
169
175
177{
178 for (; !it.is_end(); ++it) {
179 const float *in = it.in(0);
180 rgb_to_ycc(in[0], in[1], in[2], &it.out[0], &it.out[1], &it.out[2], mode_);
181
182 /* Normalize for viewing (#rgb_to_ycc returns 0-255 values). */
183 mul_v3_fl(it.out, 1.0f / 255.0f);
184 it.out[3] = in[3];
185 }
186}
187
188/* ******** YCC to RGB ******** */
189
195
197{
198 switch (mode) {
199 case 0:
200 mode_ = BLI_YCC_ITU_BT601;
201 break;
202 case 2:
203 mode_ = BLI_YCC_JFIF_0_255;
204 break;
205 case 1:
206 default:
207 mode_ = BLI_YCC_ITU_BT709;
208 break;
209 }
210}
211
217
219{
220 for (; !it.is_end(); ++it) {
221 const float *in = it.in(0);
222 /* Multiply by 255 to un-normalize (#ycc_to_rgb needs input values in 0-255 range). */
224 in[0] * 255.0f, in[1] * 255.0f, in[2] * 255.0f, &it.out[0], &it.out[1], &it.out[2], mode_);
225 it.out[3] = in[3];
226 }
227}
228
229/* ******** RGB to YUV ******** */
230
236
238{
239 for (; !it.is_end(); ++it) {
240 const float *in = it.in(0);
241 rgb_to_yuv(in[0], in[1], in[2], &it.out[0], &it.out[1], &it.out[2], BLI_YUV_ITU_BT709);
242 it.out[3] = in[3];
243 }
244}
245
246/* ******** YUV to RGB ******** */
247
253
255{
256 for (; !it.is_end(); ++it) {
257 const float *in = it.in(0);
258 yuv_to_rgb(in[0], in[1], in[2], &it.out[0], &it.out[1], &it.out[2], BLI_YUV_ITU_BT709);
259 it.out[3] = in[3];
260 }
261}
262
263/* ******** RGB to HSV ******** */
264
270
272{
273 for (; !it.is_end(); ++it) {
274 const float *in = it.in(0);
275 rgb_to_hsv_v(in, it.out);
276 it.out[3] = in[3];
277 }
278}
279
280/* ******** HSV to RGB ******** */
281
287
289{
290 for (; !it.is_end(); ++it) {
291 const float *in = it.in(0);
292 hsv_to_rgb_v(in, it.out);
293 it.out[0] = max_ff(it.out[0], 0.0f);
294 it.out[1] = max_ff(it.out[1], 0.0f);
295 it.out[2] = max_ff(it.out[2], 0.0f);
296 it.out[3] = in[3];
297 }
298}
299
300/* ******** RGB to HSL ******** */
301
307
309{
310 for (; !it.is_end(); ++it) {
311 const float *in = it.in(0);
312 rgb_to_hsl_v(in, it.out);
313 it.out[3] = in[3];
314 }
315}
316
317/* ******** HSL to RGB ******** */
318
324
326{
327 for (; !it.is_end(); ++it) {
328 const float *in = it.in(0);
329 hsl_to_rgb_v(in, it.out);
330 it.out[0] = max_ff(it.out[0], 0.0f);
331 it.out[1] = max_ff(it.out[1], 0.0f);
332 it.out[2] = max_ff(it.out[2], 0.0f);
333 it.out[3] = in[3];
334 }
335}
336
337/* ******** Pre-multiplied to Straight ******** */
338
344
351
352/* ******** Straight to Pre-multiplied ******** */
353
359
366
367/* ******** Separate Channels ******** */
368
375
377 const rcti &area,
379{
380 for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
381 it.out[0] = it.in(0)[channel_];
382 }
383}
384
385/* ******** Combine Channels ******** */
386
398
400 const rcti &area,
402{
403 for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
404 it.out[0] = *it.in(0);
405 it.out[1] = *it.in(1);
406 it.out[2] = *it.in(2);
407 it.out[3] = *it.in(3);
408 }
409}
410
411} // namespace blender::compositor
MINLINE float max_ff(float a, float b)
void hsv_to_rgb_v(const float hsv[3], float r_rgb[3])
Definition math_color.cc:57
void rgb_to_hsv_v(const float rgb[3], float r_hsv[3])
#define BLI_YUV_ITU_BT709
#define BLI_YCC_JFIF_0_255
void hsl_to_rgb_v(const float hsl[3], float r_rgb[3])
Definition math_color.cc:62
void ycc_to_rgb(float y, float cb, float cr, float *r_r, float *r_g, float *r_b, int colorspace)
#define BLI_YCC_ITU_BT601
void rgb_to_ycc(float r, float g, float b, float *r_y, float *r_cb, float *r_cr, int colorspace)
void rgb_to_yuv(float r, float g, float b, float *r_y, float *r_u, float *r_v, int colorspace)
Definition math_color.cc:67
void yuv_to_rgb(float y, float u, float v, float *r_r, float *r_g, float *r_b, int colorspace)
Definition math_color.cc:91
void rgb_to_hsl_v(const float rgb[3], float r_hsl[3])
#define BLI_YCC_ITU_BT709
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
BLI_INLINE float IMB_colormanagement_get_luminance(const float rgb[3])
ColorSceneLinear4f< eAlpha::Straight > unpremultiply_alpha() const
Definition BLI_color.hh:192
ColorSceneLinear4f< eAlpha::Premultiplied > premultiply_alpha() const
Definition BLI_color.hh:175
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) final
std::unique_ptr< MetaData > get_meta_data() override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
void update_memory_buffer_partial(BuffersIterator< float > &it) override
a MemoryBuffer contains access to the data
void add_output_socket(DataType datatype)
virtual std::unique_ptr< MetaData > get_meta_data()
NodeOperation * get_input_operation(int index)
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
void set_canvas_input_index(unsigned int index)
set the index of the input socket that will determine the canvas of this operation
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
@ Vector
Vector data type.
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator