47 void init(
const float transform_matrix[4][4])
49 init_start_uv(transform_matrix);
50 init_add_x(transform_matrix);
51 init_add_y(transform_matrix);
55 void init_start_uv(
const float transform_matrix[4][4])
64 void init_add_x(
const float transform_matrix[4][4])
78 void init_add_y(
const float transform_matrix[4][4])
138 const float UNUSED(uv[2]))
override
152 typename StorageType =
float,
163 StorageType *pointer;
168 const size_t offset = (
y * (size_t)image_buffer->
x +
x) * NumChannels;
170 if constexpr (std::is_same_v<StorageType, float>) {
173 else if constexpr (std::is_same_v<StorageType, unsigned char>) {
174 pointer =
const_cast<unsigned char *
>(
175 static_cast<const unsigned char *
>(
static_cast<const void *
>(image_buffer->
rect)) +
193 pointer += NumChannels;
240 x =
x % source_buffer->
x;
242 x += source_buffer->
x;
250 y =
y % source_buffer->
y;
252 y += source_buffer->
y;
269 typename StorageType,
283 UVWrapping uv_wrapper;
294 const float wrapped_u = uv_wrapper.modify_u(source, u);
295 const float wrapped_v = uv_wrapper.modify_v(source,
v);
299 std::is_same_v<StorageType, unsigned char> && NumChannels == 4) {
300 const float wrapped_u = uv_wrapper.modify_u(source, u);
301 const float wrapped_v = uv_wrapper.modify_v(source,
v);
305 std::is_same_v<StorageType, unsigned char> && NumChannels == 4) {
306 const float wrapped_u = uv_wrapper.modify_u(source, u);
307 const float wrapped_v = uv_wrapper.modify_v(source,
v);
311 if constexpr (std::is_same_v<UVWrapping, WrapRepeatUV>) {
323 const float wrapped_u = uv_wrapper.modify_u(source, u);
324 const float wrapped_v = uv_wrapper.modify_v(source,
v);
334 else if constexpr (Filter ==
IMB_FILTER_NEAREST && std::is_same_v<StorageType, float>) {
335 const float wrapped_u = uv_wrapper.modify_u(source, u);
336 const float wrapped_v = uv_wrapper.modify_v(source,
v);
337 sample_nearest_float(source, wrapped_u, wrapped_v, r_sample);
346 void sample_nearest_float(
const ImBuf *source,
358 if (x1 < 0 || x1 >= source->
x || y1 < 0 || y1 >= source->
y) {
359 for (
int i = 0; i < NumChannels; i++) {
365 const size_t offset = ((size_t)source->
x *
y1 + x1) * NumChannels;
367 for (
int i = 0; i < NumChannels; i++) {
368 r_sample[i] = dataF[i];
384 template<
typename StorageType,
int SourceNumChannels,
int DestinationNumChannels>
387 using SampleType = std::array<StorageType, SourceNumChannels>;
396 if constexpr (std::is_same_v<StorageType, unsigned char>) {
397 BLI_STATIC_ASSERT(SourceNumChannels == 4,
"Unsigned chars always have 4 channels.");
398 BLI_STATIC_ASSERT(DestinationNumChannels == 4,
"Unsigned chars always have 4 channels.");
402 else if constexpr (std::is_same_v<StorageType, float> && SourceNumChannels == 4 &&
403 DestinationNumChannels == 4) {
406 else if constexpr (std::is_same_v<StorageType, float> && SourceNumChannels == 3 &&
407 DestinationNumChannels == 4) {
410 else if constexpr (std::is_same_v<StorageType, float> && SourceNumChannels == 2 &&
411 DestinationNumChannels == 4) {
414 else if constexpr (std::is_same_v<StorageType, float> && SourceNumChannels == 1 &&
415 DestinationNumChannels == 4) {
444 typename OutputPixelPointer>
447 OutputPixelPointer output;
456 OutputPixelPointer::ChannelLen>
471 for (
int xi = 0; xi <
width; xi++) {
472 if (!discarder.should_discard(*
user_data, uv)) {
479 output.increase_pixel_pointer();
495 typename StorageType,
496 int SourceNumChannels,
497 int DestinationNumChannels>
523 template<eIMBInterpolationFilterMode Filter>
531 return get_scanline_function<Filter, float, 4, 4>(mode);
534 return get_scanline_function<Filter, float, 3, 4>(mode);
537 return get_scanline_function<Filter, float, 2, 4>(mode);
540 return get_scanline_function<Filter, float, 1, 4>(mode);
545 template<eIMBInterpolationFilterMode Filter>
551 scanline_func = get_scanline_function<Filter>(
user_data, mode);
555 scanline_func = get_scanline_function<Filter, unsigned char, 4, 4>(mode);
558 if (scanline_func !=
nullptr) {
573 const float transform_matrix[4][4],
574 const struct rctf *src_crop)
577 "No source crop rect given, but crop source is requested. Or source crop rect "
578 "was given, but crop source was not requested.");
589 transform_threaded<IMB_FILTER_NEAREST>(&
user_data, mode);
592 transform_threaded<IMB_FILTER_BILINEAR>(&
user_data, mode);
typedef float(TangentPoint)[2]
#define BLI_assert_unreachable()
#define BLI_STATIC_ASSERT(a, msg)
#define BLI_assert_msg(a, msg)
void BLI_bilinear_interpolation_fl(const float *buffer, float *output, int width, int height, int components, float u, float v)
void BLI_bilinear_interpolation_wrap_fl(const float *buffer, float *output, int width, int height, int components, float u, float v, bool wrap_x, bool wrap_y)
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void copy_v4_fl4(float v[4], float x, float y, float z, float w)
MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f)
MINLINE void sub_v2_v2(float r[2], const float a[2])
MINLINE void copy_v4_v4_uchar(unsigned char r[4], const unsigned char a[4])
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void add_v2_v2(float r[2], const float a[2])
MINLINE void zero_v3(float r[3])
_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 GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble y1
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_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
_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 GLsizei width
void bilinear_interpolation_color_fl(const struct ImBuf *in, unsigned char outI[4], float outF[4], float u, float v)
eIMBTransformMode
Transform modes to use for IMB_transform function.
@ IMB_TRANSFORM_MODE_WRAP_REPEAT
Wrap repeat the source buffer. Only supported in with nearest filtering.
@ IMB_TRANSFORM_MODE_REGULAR
Do not crop or repeat.
@ IMB_TRANSFORM_MODE_CROP_SRC
Crop the source buffer.
void IMB_processor_apply_threaded_scanlines(int total_scanlines, ScanlineThreadFunc do_thread, void *custom_data)
void bilinear_interpolation_color_char(const struct ImBuf *in, unsigned char outI[4], float outF[4], float u, float v)
void(* ScanlineThreadFunc)(void *custom_data, int scanline)
eIMBInterpolationFilterMode
void nearest_interpolation_color_char(const struct ImBuf *in, unsigned char outI[4], float outF[4], float u, float v)
Contains defines and structs used throughout the imbuf module.
ATTR_WARN_UNUSED_RESULT const BMVert * v
SyclQueue void void * src
depth_tx sampler(1, ImageType::FLOAT_2D, "combined_tx") .sampler(2
DO_INLINE void filter(lfVector *V, fmatrix3x3 *S)
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset