Files
oak-editor/crates/oak-plugin/cbits/ofx_param_shim.c
T
Mike-Solar 244d5e860f
CI / Build & test (Windows) (push) Failing after 7s
workspace: kebab-case crates, app under crates/oak-app, shared versions
All crates take the oak-* kebab-case naming (oak-audio, oak-codec,
oak-common, oak-core, oak-ffmpeg-link, oak-node, oak-otio, oak-plugin,
oak-render, oak-storage, oak-task, oak-timeline, oak-undo), with the
lib identifiers rewritten (oakrender:: -> oak_render::, oakcore_rs:: ->
oak_core::, ...) across all 226 referencing files.

The GUI application moves from the workspace root into
crates/oak-app/: src/, build.rs (paths fixed for the new location) and
tests/ travel with it, the root Cargo.toml becomes workspace-only
([workspace] + workspace.package + profiles), and the app package
inherits the workspace version. The screenshots example becomes a
standalone crate examples/simple_player/ with its own Cargo.toml.

Every crate now inherits the single workspace version
(version.workspace = true), and the workflows' crate paths and the
build docs follow the renames.

Validated with a clean cargo check --workspace.
2026-08-22 16:58:37 +08:00

269 lines
7.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Oak Video Editor - Non-Linear Video Editor
* Copyright (C) 2026 Oak Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* OfxParameterSuite 的 variadic 入口。stable Rust 不能定义
* C-variadic 函数(c_variadic 仍不稳定):paramGetValue /
* paramSetValue / *AtTime / derivative / integral 的 '...' 在这里
* 按参数类型解析(类型经 Rust 导出的 ofx_param_kind_of 查询),
* 再转发给 Rust 的类型化实现。
*
* 变长参数形状(HS: ofxhParam.cpp 各类型的 getV/setV):
* getInteger/Boolean/Choice → int*Double→double*
* 2D/3D/颜色 → 按维度的 int* / double* 指针序列;String →
* char**(写内驻指针)
* set:同形状但按值传(int/double 值序列;String → char*
*
* KIND_* 与 Rust 侧 param::ParamKind 枚举逐字对应。
*/
#include <stdarg.h>
/* Rust 导出 */
extern int ofx_param_kind_of(void *param);
extern int ofx_param_get_impl(void *param, int kind, void *out);
extern int ofx_param_set_impl(void *param, int kind, const void *in);
extern int ofx_param_get_string_impl(void *param, char **out);
extern int ofx_param_set_string_impl(void *param, const char *in);
extern int ofx_param_missing_feature_impl(void *param);
enum {
KIND_INT = 1,
KIND_INT2 = 2,
KIND_INT3 = 3,
KIND_DOUBLE = 4,
KIND_DOUBLE2 = 5,
KIND_DOUBLE3 = 6,
KIND_BOOL = 7,
KIND_CHOICE = 8,
KIND_RGB = 9,
KIND_RGBA = 10,
KIND_STRING = 11,
KIND_STRCHOICE = 12
};
/* get:把插件传的指针序列收进局部缓冲,调 Rust,再散回。 */
static int get_dispatch(void *param, int kind, va_list ap)
{
switch (kind) {
case KIND_INT:
case KIND_BOOL:
case KIND_CHOICE: {
int *v = va_arg(ap, int *);
return ofx_param_get_impl(param, kind, v);
}
case KIND_INT2: {
int *a = va_arg(ap, int *);
int *b = va_arg(ap, int *);
int buf[2] = { *a, *b };
int r = ofx_param_get_impl(param, kind, buf);
*a = buf[0];
*b = buf[1];
return r;
}
case KIND_INT3: {
int *a = va_arg(ap, int *);
int *b = va_arg(ap, int *);
int *c = va_arg(ap, int *);
int buf[3] = { *a, *b, *c };
int r = ofx_param_get_impl(param, kind, buf);
*a = buf[0];
*b = buf[1];
*c = buf[2];
return r;
}
case KIND_DOUBLE: {
double *v = va_arg(ap, double *);
return ofx_param_get_impl(param, kind, v);
}
case KIND_DOUBLE2: {
double *a = va_arg(ap, double *);
double *b = va_arg(ap, double *);
double buf[2] = { *a, *b };
int r = ofx_param_get_impl(param, kind, buf);
*a = buf[0];
*b = buf[1];
return r;
}
case KIND_DOUBLE3: {
double *a = va_arg(ap, double *);
double *b = va_arg(ap, double *);
double *c = va_arg(ap, double *);
double buf[3] = { *a, *b, *c };
int r = ofx_param_get_impl(param, kind, buf);
*a = buf[0];
*b = buf[1];
*c = buf[2];
return r;
}
case KIND_RGB: {
double *a = va_arg(ap, double *);
double *b = va_arg(ap, double *);
double *c = va_arg(ap, double *);
double buf[3] = { *a, *b, *c };
int r = ofx_param_get_impl(param, kind, buf);
*a = buf[0];
*b = buf[1];
*c = buf[2];
return r;
}
case KIND_RGBA: {
double *a = va_arg(ap, double *);
double *b = va_arg(ap, double *);
double *c = va_arg(ap, double *);
double *d = va_arg(ap, double *);
double buf[4] = { *a, *b, *c, *d };
int r = ofx_param_get_impl(param, kind, buf);
*a = buf[0];
*b = buf[1];
*c = buf[2];
*d = buf[3];
return r;
}
case KIND_STRING:
case KIND_STRCHOICE: {
char **p = va_arg(ap, char **);
return ofx_param_get_string_impl(param, p);
}
default:
return 1; /* kOfxStatFailed:未知类型 */
}
}
/* set:按值收进局部缓冲,调 Rust。 */
static int set_dispatch(void *param, int kind, va_list ap)
{
switch (kind) {
case KIND_INT:
case KIND_BOOL:
case KIND_CHOICE: {
int v = va_arg(ap, int);
return ofx_param_set_impl(param, kind, &v);
}
case KIND_INT2: {
int a = va_arg(ap, int);
int b = va_arg(ap, int);
int buf[2] = { a, b };
return ofx_param_set_impl(param, kind, buf);
}
case KIND_INT3: {
int a = va_arg(ap, int);
int b = va_arg(ap, int);
int c = va_arg(ap, int);
int buf[3] = { a, b, c };
return ofx_param_set_impl(param, kind, buf);
}
case KIND_DOUBLE: {
double v = va_arg(ap, double);
return ofx_param_set_impl(param, kind, &v);
}
case KIND_DOUBLE2: {
double a = va_arg(ap, double);
double b = va_arg(ap, double);
double buf[2] = { a, b };
return ofx_param_set_impl(param, kind, buf);
}
case KIND_DOUBLE3: {
double a = va_arg(ap, double);
double b = va_arg(ap, double);
double c = va_arg(ap, double);
double buf[3] = { a, b, c };
return ofx_param_set_impl(param, kind, buf);
}
case KIND_RGB: {
double a = va_arg(ap, double);
double b = va_arg(ap, double);
double c = va_arg(ap, double);
double buf[3] = { a, b, c };
return ofx_param_set_impl(param, kind, buf);
}
case KIND_RGBA: {
double a = va_arg(ap, double);
double b = va_arg(ap, double);
double c = va_arg(ap, double);
double d = va_arg(ap, double);
double buf[4] = { a, b, c, d };
return ofx_param_set_impl(param, kind, buf);
}
case KIND_STRING:
case KIND_STRCHOICE: {
const char *s = va_arg(ap, const char *);
return ofx_param_set_string_impl(param, s);
}
default:
return 1; /* kOfxStatFailed */
}
}
int ofx_param_get_value_shim(void *param, ...)
{
va_list ap;
va_start(ap, param);
int kind = ofx_param_kind_of(param);
int r = get_dispatch(param, kind, ap);
va_end(ap);
return r;
}
int ofx_param_get_value_at_time_shim(void *param, double time, ...)
{
(void)time; /* 第 1 期无动画:AtTime 即当前值(Rust 侧实现) */
va_list ap;
va_start(ap, time);
int kind = ofx_param_kind_of(param);
int r = get_dispatch(param, kind, ap);
va_end(ap);
return r;
}
int ofx_param_set_value_shim(void *param, ...)
{
va_list ap;
va_start(ap, param);
int kind = ofx_param_kind_of(param);
int r = set_dispatch(param, kind, ap);
va_end(ap);
return r;
}
int ofx_param_set_value_at_time_shim(void *param, double time, ...)
{
(void)time; /* 第 1 期无动画 */
va_list ap;
va_start(ap, time);
int kind = ofx_param_kind_of(param);
int r = set_dispatch(param, kind, ap);
va_end(ap);
return r;
}
/* derivative/integral:第 1 期无动画支持;不消费 va_args,
* 统一返回 kOfxStatErrMissingHostFeature。 */
int ofx_param_get_derivative_shim(void *param, double time, ...)
{
(void)time;
return ofx_param_missing_feature_impl(param);
}
int ofx_param_get_integral_shim(void *param, double time1, double time2, ...)
{
(void)time1;
(void)time2;
return ofx_param_missing_feature_impl(param);
}