Part of overall "improve filtering situation" (#116980) task: * Add Bicubic filtering option to strip Transform "Filter" setting. Previously this option only existed in Transform Effect "Interpolation" setting. - With this addition, it feels like the transform effect could possibly be marked as legacy/deprecated, since the regular Transform that is on all strips can do everything that Transform Effect did? * Speed up bicubic filtering (used now in VSE, but also in CPU Compositor, image paint, etc.) by slightly simplifying the code and using some SIMD. Upscaling 96x54 image to 3840x2160 resolution, using Bicubic filtering: - Windows (VS2022, Ryzen 5950X): 35.5ms -> 15.1ms - Mac (clang 15, M1 Max): 29.6ms -> 24.4ms * Add gtest coverage for bicubic functionality. Pull Request: https://projects.blender.org/blender/blender/pulls/117100
63 lines
2.0 KiB
C++
63 lines
2.0 KiB
C++
/* SPDX-FileCopyrightText: 2024 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#pragma once
|
|
|
|
/** \file
|
|
* \ingroup bli
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
void BLI_bicubic_interpolation_fl(
|
|
const float *buffer, float *output, int width, int height, int components, float u, float v);
|
|
|
|
void BLI_bicubic_interpolation_char(
|
|
const unsigned char *buffer, unsigned char *output, int width, int height, float u, float v);
|
|
|
|
void BLI_bilinear_interpolation_fl(
|
|
const float *buffer, float *output, int width, int height, int components, float u, float v);
|
|
|
|
void BLI_bilinear_interpolation_char(
|
|
const unsigned char *buffer, unsigned char *output, int width, int height, 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);
|
|
|
|
#define EWA_MAXIDX 255
|
|
extern const float EWA_WTS[EWA_MAXIDX + 1];
|
|
|
|
typedef void (*ewa_filter_read_pixel_cb)(void *userdata, int x, int y, float result[4]);
|
|
|
|
void BLI_ewa_imp2radangle(
|
|
float A, float B, float C, float F, float *a, float *b, float *th, float *ecc);
|
|
|
|
/**
|
|
* TODO(sergey): Consider making this function inlined, so the pixel read callback
|
|
* could also be inlined in order to avoid per-pixel function calls.
|
|
*/
|
|
void BLI_ewa_filter(int width,
|
|
int height,
|
|
bool intpol,
|
|
bool use_alpha,
|
|
const float uv[2],
|
|
const float du[2],
|
|
const float dv[2],
|
|
ewa_filter_read_pixel_cb read_pixel_cb,
|
|
void *userdata,
|
|
float result[4]);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|