Blender  V3.3
COM_AlphaOverPremultiplyOperation.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2011 Blender Foundation. */
3 
5 
6 namespace blender::compositor {
7 
9 {
10  flags_.can_be_constant = true;
11 }
12 
14  float x,
15  float y,
17 {
18  float input_color1[4];
19  float input_over_color[4];
20  float value[4];
21 
24  input_color2_operation_->read_sampled(input_over_color, x, y, sampler);
25 
26  /* Zero alpha values should still permit an add of RGB data */
27  if (input_over_color[3] < 0.0f) {
28  copy_v4_v4(output, input_color1);
29  }
30  else if (value[0] == 1.0f && input_over_color[3] >= 1.0f) {
31  copy_v4_v4(output, input_over_color);
32  }
33  else {
34  float mul = 1.0f - value[0] * input_over_color[3];
35 
36  output[0] = (mul * input_color1[0]) + value[0] * input_over_color[0];
37  output[1] = (mul * input_color1[1]) + value[0] * input_over_color[1];
38  output[2] = (mul * input_color1[2]) + value[0] * input_over_color[2];
39  output[3] = (mul * input_color1[3]) + value[0] * input_over_color[3];
40  }
41 }
42 
44 {
45  for (; p.out < p.row_end; p.next()) {
46  const float *color1 = p.color1;
47  const float *over_color = p.color2;
48  const float value = *p.value;
49 
50  /* Zero alpha values should still permit an add of RGB data. */
51  if (over_color[3] < 0.0f) {
52  copy_v4_v4(p.out, color1);
53  }
54  else if (value == 1.0f && over_color[3] >= 1.0f) {
55  copy_v4_v4(p.out, over_color);
56  }
57  else {
58  const float mul = 1.0f - value * over_color[3];
59 
60  p.out[0] = (mul * color1[0]) + value * over_color[0];
61  p.out[1] = (mul * color1[1]) + value * over_color[1];
62  p.out[2] = (mul * color1[2]) + value * over_color[2];
63  p.out[3] = (mul * color1[3]) + value * over_color[3];
64  }
65  }
66 }
67 
68 } // namespace blender::compositor
MINLINE void copy_v4_v4(float r[4], const float a[4])
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
static void mul(btAlignedObjectArray< T > &items, const Q &value)
void execute_pixel_sampled(float output[4], float x, float y, PixelSampler sampler) override
void read_sampled(float result[4], float x, float y, PixelSampler sampler)
depth_tx sampler(1, ImageType::FLOAT_2D, "combined_tx") .sampler(2
ccl_global KernelShaderEvalInput ccl_global float * output