跳转到内容

图形工具套件

图形工具套件

After Effects 通过以下函数套件公开其内部的变换和图形工具例程。


变换世界

这些函数以有趣的方式组合 PF_EffectWorlds。当你使用这些函数时,你正在使用 After Effects 内部使用的相同代码。

PF_WorldTransformSuite1

函数用途
composite_rect使用 After Effects 的传输模式之一,将一个矩形从一个 PF_EffectWorld 合成到另一个中。
PF_Err composite_rect (
PF_ProgPtr effect_ref,
PF_Rect *src_rect,
A_long src_opacity,
PF_EffectWorld *src_world,
A_long dst_x,
A_long dst_y,
PF_Field field_rdr,
PF_XferMode xfer_mode,
PF_EffectWorld *dst);
field_rdr 可以是上、下或两者。
xfer_mode 是以下之一:
- PF_Xfer_COPY
- PF_Xfer_BEHIND
- PF_Xfer_IN_FRONT
blend对两个图像进行 alpha 加权混合。不处理不同大小的源,尽管目标可以是 PF_EffectWorld
PF_Err blend (
PF_ProgPtr effect_ref,
const PF_EffectWorld *src1,
const PF_EffectWorld *src2,
PF_Fixed ratio,
PF_EffectWorld *dst);
convolve使用任意大小的核分别对图像的 a、r、g 和 b 通道进行卷积。
你可以指定一个矩形进行卷积(例如,来自 PF_EffectWorld 结构extent_hint),或者传递 0 以卷积整个图像。
如果源 目标,请不要使用。
使用 核标志 描述卷积。
PF_Err convolve(
PF_EffectWorld *src,
const PF_Rect *area,
PF_KernelFlags flags,
A_long kernel_size,
void *a_kernel,
void *r_kernel,
void *g_kernel,
void *b_kernel,
PF_EffectWorld *dst);
copy将一个区域从一个 PF_EffectWorld 复制到另一个,保留 alpha(与 macOS 的 CopyBits 不同)。
PF_Err copy (
PF_EffectWorld *src,
PF_EffectWorld *dst,
PF_Rect *src_r,
PF_Rect *dst_r);
copy_hq上述函数的高保真版本(使用相同的参数)。
transfer_rect使用传输模式进行混合,带有可选的蒙版。
PF_Err transfer_rect (
PF_ProgPtr effect_ref,
PF_Quality quality,
PF_ModeFlags m_flags,
PF_Field field,
const PF_Rect *src_rec,
const PF_EffectWorld *src_world,
const PF_CompositeMode *comp_mode,
const PF_MaskWorld *mask_world0,
A_long dest_x,
A_long dest_y,
PF_EffectWorld *dst_world);
transform_world给定一个 PF_EffectWorld 和一个矩阵(或矩阵数组),使用 After Effects 的传输模式进行变换和混合,带有可选的蒙版。
矩阵指针指向用于运动模糊的矩阵数组。
什么时候变换不是变换?Z 轴缩放变换不是变换,除非变换的图层是其他图层的父级,而这些图层并不都位于 z=0 平面。
PF_Err transform_world (
PF_InData *in_data,
PF_Quality quality,
PF_ModeFlags m_flags,
PF_Field field,
const PF_EffectWorld *src_world,
const PF_CompositeMode *comp_mode,
const PF_MaskWorld *mask_world0,
const PF_FloatMatrix *matrices,
A_long num_matrices,
Boolean src2dst_matrix,
const PF_Rect *dest_rect,
PF_EffectWorld *dst_world);

核标志

诸如 convolve 或高斯核之类的函数使用核或滤波器权重值的矩阵。这些矩阵可以是任何格式。核标志描述了应如何创建和使用这些矩阵。根据需要将任何标志进行 OR 运算。

与给定例程相关的标志与例程原型一起记录。左列中的第一个条目始终是默认值,值为 0。

核标志指示
PF_KernelFlag_2D指定一维或二维核。
PF_KernelFlag_1D
PF_KernelFlag_UNNORMALIZEDNORMALIZED 均衡核;核表面下的体积与覆盖像素区域的体积相同。
PF_KernelFlag_NORMALIZED
PF_KernelFlag_CLAMPCLAMP 将值限制为其数据类型的有效范围。
PF_KernelFlag_NO_CLAMP
PF_KernelFlag_USE_LONGUSE_LONG 将核定义为从 0 到 255 的长整型数组。USE_LONG 是唯一实现的标志。
PF_KernelFlag_USE_CHARUSE_CHAR 将核定义为从 0 到 255 的无符号字符数组。
PF_KernelFlag_USE_FIXEDUSE_FIXED 将核定义为从 0 到 1 的固定数组。
PF_KernelFlag_USE_UNDEFINED
PF_KernelFlag_HORIZONTAL指定卷积的方向。
PF_KernelFlag_VERTICAL
PF_KernelFlag_TRANSPARENT_BORDERS使用 TRANSPARENT_BORDERS 将边缘外的像素视为 alpha 为零(黑色)。
PF_KernelFlag_REPLICATE_BORDERS使用 REPLICATE_BORDERS 在采样边缘时复制边缘像素。
REPLICATE_BORDERS 未实现,将被忽略。
PF_KernelFlag_STRAIGHT_CONVOLVE使用 STRAIGHT_CONVOLVE 表示直接卷积。
PF_KernelFlag_ALPHA_WEIGHT_CONVOLVE使用 ALPHA_WEIGHT_CONVOLVE 告诉卷积代码对像素的贡献进行 alpha 加权,以生成卷积输出。
ALPHA_WEIGHT_CONVOLVE 未实现,将被忽略。

填充它们!

FillMatteSuite 可用于填充 PF_EffectWorld,可以使用特定颜色或与 alpha 值预乘。

PF_FillMatteSuite2

函数用途
fill用颜色填充矩形(或者,如果颜色指针为空,则用黑色和 alpha 零填充)。
如果矩形为空,则填充整个图像。
PF_Err fill (
PF_ProgPtr effect_ref,
const PF_Pixel *color,
const PF_Rect *dst_rect,
PF_EffectWorld *world);
fill16与 fill 相同,但接受指向 PF_Pixel16 颜色的指针。
fill_float接受指向 PF_PixelFloat 颜色的指针。
premultiply转换为(或从)r、g 和 b 颜色值预乘以黑色表示 alpha 通道。
质量无关。
- forward 用作布尔值
- true 表示将非预乘转换为预乘
- false 表示取消预乘。
PF_Err premultiply (
A_long forward,
PF_EffectWorld *dst);
premultiply_color转换为(或从)r、g 和 b 颜色值预乘以任何颜色表示 alpha 通道。
PF_Err premultiply_color (
PF_ProgPtr effect_ref,
PF_EffectWorld *src,
PF_Pixel *color,
A_long forward,
PF_EffectWorld *dst);
premultiply_color16与上述相同,但接受指向 PF_Pixel16 颜色的指针。
premultiply_color_float接受指向 PF_PixelFloat 颜色的指针。

采样图像

注意:采样图像边界之外的区域被视为零 alpha。为了方便起见,PF_Sampling8Suite1PF_Sampling16Suite1PF_SamplingFloatSuite1 中的函数都列在此表中。

PF_SamplingSuite 函数(多个套件)

函数用途
nn_sample执行最近邻采样。
PF_Err nn_sample (
PF_ProgPtr effect_ref,
PF_Fixed x,
PF_Fixed y,
const PF_SampPB *params,
PF_Pixel *dst_pixel );
nn_sample16与上述相同,但接受指向 PF_Pixel16 dst_pixel 的指针。
nn_sample_float接受指向 PF_PixelFloat dst_pixel 的指针。
subpixel_sample查询源图像中非积分点颜色的适当 alpha 加权插值,高质量。低质量下使用最近邻采样。
由于采样例程(如果使用)通常会被多次调用,因此将函数指针复制到回调结构中并放入寄存器或堆栈中以加速内部循环是很方便的。
请参阅示例代码以获取示例。
!!! 注意
采样假设 0,0 是左上角像素的中心。
PF_Err subpixel_sample (
PF_ProgPtr effect_ref,
PF_Fixed x,
PF_Fixed y,
const PF_SampPB *params,
PF_Pixel *dst_pixel);
subpixel_sample16与上述相同,但接受指向 PF_Pixel16* dst_pixel 的指针。
subpixel_sample_float接受指向 PF_PixelFloat* dst_pixel 的指针。
area_sample使用此函数计算源图像中轴对齐的非积分矩形颜色的适当 alpha 加权平均值,高质量。
低质量下使用最近邻采样。由于溢出问题,此函数最多只能平均 256 x 256 像素区域(即 x 和 y 半径 < 128 像素)。
!!! 注意
采样半径在 x 和 y 方向上必须至少为 1。
PF_Err area_sample (
PF_ProgPtr effect_ref,
PF_Fixed x,
PF_Fixed y,
const PF_SampPB *params,
PF_Pixel *dst_pixel);
!!! 注意
图层边界之外的区域在采样时被视为零 alpha。
area_sample16与上述相同,但接受 PF_Pixel16* dst_pixel

PF_BatchSamplingSuite1 函数

函数用途
begin_sampling你的效果将执行一些批量采样;After Effects 将执行设置任务以优化你的采样。
PF_Err (*begin_sampling)(
PF_ProgPtr effect_ref,
PF_Quality qual,
PF_ModeFlags mf,
PF_SampPB *params);
end_sampling告诉 After Effects 你已完成采样。
PF_Err (*end_sampling)(
PF_ProgPtr effect_ref,
PF_Quality qual,
PF_ModeFlags mf,
PF_SampPB *params);
get_batch_func获取指向 After Effects 的批量采样函数(高度优化)的指针。
PF_Err (*get_batch_func)(
PF_ProgPtr effect_ref,
PF_Quality quality,
PF_ModeFlags mode_flags,
const PF_SampPB *params,
PF_BatchSampleFunc *batch);
get_batch_func16获取指向 After Effects 的 16-bpc 批量采样函数(同样高度优化)的指针。
PF_Err (*get_batch_func16)(
PF_ProgPtr effect_ref,
PF_Quality quality,
PF_ModeFlags mode_flags,
const PF_SampPB *params,
PF_BatchSample16Func *batch);

为我做数学

除了各种图形工具外,我们还提供了一组 ANSI 标准例程,以便插件不需要包含其他库来使用标准函数。

我们提供了大量数学函数(三角函数、平方根、对数等)的函数指针。

使用我们的套件函数可以提供一些(应用程序级别的)错误处理,并防止包含不同版本的多个“标准”库时出现问题。

所有函数都返回一个双精度值。所有角度均以弧度表示,如果需要从度转换为弧度,请使用 PF_RAD_PER_DEGREE(来自 AE_EffectCB.h 的常量)。

PF_ANSICallbackSuite1

函数用途替换
acos返回 x 的反余弦。PF_ACOS
asin返回 x 的反正弦。PF_ASIN
atan返回 x 的反正切。PF_ATAN
atan2返回 atan(y/x)。PF_ATAN2
ceil返回大于 x 的下一个整数。PF_CEIL
cos返回 x 的余弦。