use after_effects::{self as ae, ParamFlag, Parameters};
use crate::params::SetupParams;
#[repr(u32)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BlendMode {
Normal = 0,
Add = 1,
Multiply = 2,
Screen = 3,
ColorBurn = 4,
ColorDodge = 5,
DarkerColor = 6,
Overlay = 7,
Difference = 8,
Subtract = 9,
Divide = 10,
Hue = 11,
Saturation = 12,
Color = 13,
Luminosity = 14,
}
impl BlendMode {
pub const COUNT: usize = 14;
pub fn as_u32(self) -> u32 {
self as u32
}
pub fn from_popup_value(v: i32) -> Self {
match v {
1 => Self::Add,
2 => Self::Multiply,
3 => Self::Screen,
4 => Self::ColorBurn,
5 => Self::ColorDodge,
6 => Self::DarkerColor,
7 => Self::Overlay,
8 => Self::Difference,
9 => Self::Subtract,
10 => Self::Divide,
11 => Self::Hue,
12 => Self::Saturation,
13 => Self::Color,
14 => Self::Luminosity,
_ => Self::Normal,
}
}
pub fn to_popup_value(self) -> i32 {
match self {
Self::Normal => 1,
other => other as i32,
}
}
}
pub const BLEND_MODE_OPTIONS: &[&str] = &[
"Add",
"Multiply",
"Screen",
"Color Burn",
"Color Dodge",
"Darker Color",
"Overlay",
"Difference",
"Subtract",
"Divide",
"Hue",
"Saturation",
"Color",
"Luminosity",
];
pub fn add_blend_mode_param<P: SetupParams>(
params: &mut Parameters<'_, P>,
id: P,
label: &str,
default: BlendMode,
) -> Result<(), ae::Error> {
let default_idx = match default {
BlendMode::Normal => BlendMode::Multiply.to_popup_value(),
other => other.to_popup_value(),
};
params.add_customized(
id,
label,
ae::PopupDef::setup(|f| {
f.set_default(default_idx);
f.set_value(default_idx);
f.set_options(BLEND_MODE_OPTIONS);
}),
|p| {
p.set_flag(ParamFlag::SUPERVISE, true);
-1
},
)
}