clippy: clear the workspace errors and apply the machine fixes

- Mark the raw-pointer interop entry points unsafe with # Safety docs
  (oak-core upload/download/frame-from-pixels, oak-audio convert) and
  satisfy the existing callers (tests).
- mut_from_ref: allow with the ABI contract documented (the handle
  get_mut helpers in oak-timeline/oak-render/oak-task take the shared
  reference the C ABI passes; exclusivity is the caller's unsafe
  contract).
- Fix the eq_op in the white-balance normalization (green / green).
- Apply cargo clippy --fix across the workspace (redundant closures and
  field names, field reassignment, items after test modules, ...).
- Revert the replace_box fix in image_effect's clip_define: a
  redefinition must allocate a new box, otherwise the old clip handle
  stays valid and the HS-map replace contract (clip != clip2) breaks.
- 283 warnings remain; they are all non-machine-applicable
  (chunks_exact -> as_chunks needs a manual iter_mut, too_many_arguments,
  complex types, missing Safety docs, ...) and are tracked as the
  follow-up.
This commit is contained in:
2026-09-15 19:29:32 +08:00
parent 7e87ec135e
commit ee7ea18d94
146 changed files with 5235 additions and 4046 deletions
+2 -2
View File
@@ -537,7 +537,7 @@ impl NodeBehavior for FootageBehavior {
if let Some(v) = reader.attribute("ppreset") {
if !v.is_empty() {
let mut a = [0u8; 32];
let n = v.as_bytes().len().min(31);
let n = v.len().min(31);
a[..n].copy_from_slice(&v.as_bytes()[..n]);
custom.preset = a;
}
@@ -545,7 +545,7 @@ impl NodeBehavior for FootageBehavior {
if let Some(v) = reader.attribute("pext") {
if !v.is_empty() {
let mut a = [0u8; 32];
let n = v.as_bytes().len().min(31);
let n = v.len().min(31);
a[..n].copy_from_slice(&v.as_bytes()[..n]);
custom.extension = a;
}
+1 -6
View File
@@ -130,12 +130,7 @@ impl KeyframeTrack {
}
}
let (b, a) = match before {
Some(pair) => pair,
// Unreachable given the front/back guards; C++ logs and falls
// through to the standard value.
None => return None,
};
let (b, a) = before?;
let before_key = &keys[b];
let after_key = &keys[a];
+15 -17
View File
@@ -364,12 +364,11 @@ impl NodeBehavior for BlurFilterNode {
let mut can_push_job = true;
if radius > 0.0 {
// Method-specific considerations.
if method == Method::Box as i64 || method == Method::Gaussian as i64 {
if !horiz && !vert {
if (method == Method::Box as i64 || method == Method::Gaussian as i64)
&& !horiz && !vert {
// Disable the job if both directions are unchecked.
can_push_job = false;
}
}
} else {
can_push_job = false;
}
@@ -378,11 +377,10 @@ impl NodeBehavior for BlurFilterNode {
// all other methods are single-pass (C++ `iterations = 2` only for
// the double-pass case).
let mut iterations = 1;
if method == Method::Box as i64 || method == Method::Gaussian as i64 {
if horiz && vert {
if (method == Method::Box as i64 || method == Method::Gaussian as i64)
&& horiz && vert {
iterations = 2;
}
}
if can_push_job {
// The shader-job box (C++ ShaderJob): the behavior's type id
@@ -578,6 +576,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(BlurFilterNode))
}
/// Register this node type (C++ `k_blur_filter` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.blur",
name: "Blur",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -736,14 +745,3 @@ mod tests {
assert_eq!(dup.name(), "Blur");
}
}
/// Register this node type (C++ `k_blur_filter` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.blur",
name: "Blur",
categories: &[Category::Filter],
create,
});
}
+10 -10
View File
@@ -234,6 +234,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(CheckerBoardNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.checkerboard",
name: "Checkerboard",
categories: &[Category::Generator],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -398,13 +408,3 @@ mod tests {
assert_eq!(dup.name(), "Checkerboard");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.checkerboard",
name: "Checkerboard",
categories: &[Category::Generator],
create,
});
}
+10 -10
View File
@@ -257,6 +257,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(ColorBarsNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.colorbars",
name: "Color Bars",
categories: &[Category::Generator],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -383,13 +393,3 @@ mod tests {
assert_eq!(dup.name(), "Color Bars");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.colorbars",
name: "Color Bars",
categories: &[Category::Generator],
create,
});
}
+10 -10
View File
@@ -198,6 +198,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(ColorMatrixNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.colormatrix",
name: "Color Matrix",
categories: &[Category::Color],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -329,13 +339,3 @@ mod tests {
assert_eq!(dup.name(), "Color Matrix");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.colormatrix",
name: "Color Matrix",
categories: &[Category::Color],
create,
});
}
@@ -518,6 +518,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
)
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.cornerpin`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.cornerpin",
name: "Corner Pin",
categories: &[Category::Distort],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -675,14 +686,3 @@ mod tests {
assert_eq!(dup.name(), "Corner Pin");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.cornerpin`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.cornerpin",
name: "Corner Pin",
categories: &[Category::Distort],
create,
});
}
+11 -11
View File
@@ -410,6 +410,17 @@ fn create_crop_side_input(core: &mut NodeCore, id: &str) {
core.add_input(input);
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.crop`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.crop",
name: "Crop",
categories: &[Category::Distort],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -528,14 +539,3 @@ mod tests {
assert_eq!(dup.name(), "Crop");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.crop`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.crop",
name: "Crop",
categories: &[Category::Distort],
create,
});
}
+10 -10
View File
@@ -196,6 +196,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(DilateNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.dilate",
name: "Dilate",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -318,13 +328,3 @@ mod tests {
assert_eq!(dup.name(), "Dilate");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.dilate",
name: "Dilate",
categories: &[Category::Filter],
create,
});
}
+10 -10
View File
@@ -244,6 +244,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(DirBlurNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.dirblur",
name: "Directional Blur",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -394,13 +404,3 @@ mod tests {
assert_eq!(dup.name(), "Directional Blur");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.dirblur",
name: "Directional Blur",
categories: &[Category::Filter],
create,
});
}
+10 -10
View File
@@ -243,6 +243,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(DissolveNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.dissolve",
name: "Dissolve",
categories: &[Category::Math],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -402,13 +412,3 @@ mod tests {
assert_eq!(dup.name(), "Dissolve");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.dissolve",
name: "Dissolve",
categories: &[Category::Math],
create,
});
}
+11 -11
View File
@@ -367,6 +367,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(DropShadowFilter))
}
/// Register this node type (C++ `k_drop_shadow_filter` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.dropshadow",
name: "Drop Shadow",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -485,14 +496,3 @@ mod tests {
assert_eq!(dup.name(), "Drop Shadow");
}
}
/// Register this node type (C++ `k_drop_shadow_filter` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.dropshadow",
name: "Drop Shadow",
categories: &[Category::Filter],
create,
});
}
+10 -10
View File
@@ -190,6 +190,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(EdgeDetectNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.edgedetect",
name: "Edge Detect",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -307,13 +317,3 @@ mod tests {
assert_eq!(dup.name(), "Edge Detect");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.edgedetect",
name: "Edge Detect",
categories: &[Category::Filter],
create,
});
}
+10 -10
View File
@@ -196,6 +196,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(ErodeNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.erode",
name: "Erode",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -318,13 +328,3 @@ mod tests {
assert_eq!(dup.name(), "Erode");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.erode",
name: "Erode",
categories: &[Category::Filter],
create,
});
}
+11 -11
View File
@@ -199,6 +199,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(FlipDistortNode))
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.flip`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.flip",
name: "Flip",
categories: &[Category::Distort],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -315,14 +326,3 @@ mod tests {
assert_eq!(dup.name(), "Flip");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.flip`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.flip",
name: "Flip",
categories: &[Category::Distort],
create,
});
}
+10 -10
View File
@@ -219,6 +219,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(KeyMixNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.keymix",
name: "KeyMix",
categories: &[Category::Math],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -357,13 +367,3 @@ mod tests {
assert_eq!(dup.name(), "KeyMix");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.keymix",
name: "KeyMix",
categories: &[Category::Math],
create,
});
}
+11 -11
View File
@@ -406,6 +406,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(MatrixGenerator))
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.ortho`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.ortho",
name: "Orthographic Matrix",
categories: &[Category::Generator, Category::Math],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -587,14 +598,3 @@ mod tests {
assert_eq!(dup.name(), "Orthographic Matrix");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.ortho`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.ortho",
name: "Orthographic Matrix",
categories: &[Category::Generator, Category::Math],
create,
});
}
+11 -11
View File
@@ -208,6 +208,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(MergeNode))
}
/// Register this node type (C++ `k_merge_node` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.merge",
name: "Merge",
categories: &[Category::Math],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -306,14 +317,3 @@ mod tests {
assert_eq!(dup.name(), "Merge");
}
}
/// Register this node type (C++ `k_merge_node` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.merge",
name: "Merge",
categories: &[Category::Math],
create,
});
}
+10 -10
View File
@@ -189,6 +189,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(MirrorNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.mirror",
name: "Mirror",
categories: &[Category::Distort],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -327,13 +337,3 @@ mod tests {
assert_eq!(dup.name(), "Mirror");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.mirror",
name: "Mirror",
categories: &[Category::Distort],
create,
});
}
+11 -11
View File
@@ -214,6 +214,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(MosaicFilterNode))
}
/// Register this node type (C++ `k_mosaic_filter` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.mosaicfilter",
name: "Mosaic",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -312,14 +323,3 @@ mod tests {
assert_eq!(dup.name(), "Mosaic");
}
}
/// Register this node type (C++ `k_mosaic_filter` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.mosaicfilter",
name: "Mosaic",
categories: &[Category::Filter],
create,
});
}
+11 -11
View File
@@ -219,6 +219,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(NoiseGeneratorNode))
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.noise`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.noise",
name: "Noise",
categories: &[Category::Generator],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -310,14 +321,3 @@ mod tests {
assert_eq!(dup.name(), "Noise");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.noise`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.noise",
name: "Noise",
categories: &[Category::Generator],
create,
});
}
+11 -11
View File
@@ -244,6 +244,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
)
}
/// Register this node type (C++ `k_opacity_effect` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.opacity",
name: "Opacity",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -396,14 +407,3 @@ mod tests {
assert_eq!(dup.name(), "Opacity");
}
}
/// Register this node type (C++ `k_opacity_effect` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.opacity",
name: "Opacity",
categories: &[Category::Filter],
create,
});
}
+11 -11
View File
@@ -196,6 +196,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(PanNode))
}
/// Register this node type (C++ `k_audio_panning` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.pan",
name: "Pan",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -338,14 +349,3 @@ mod tests {
assert_eq!(dup.name(), "Pan");
}
}
/// Register this node type (C++ `k_audio_panning` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.pan",
name: "Pan",
categories: &[Category::Filter],
create,
});
}
+2 -2
View File
@@ -546,7 +546,7 @@ mod tests {
sample_count: 3,
// Planar layout: channel 0 plane [1, 2, 3], channel 1 plane
// [4, 5, 6].
data: vec![1.0f32, 2.0, 3.0, 4.0, 5.0, 6.0]
data: [1.0f32, 2.0, 3.0, 4.0, 5.0, 6.0]
.iter()
.flat_map(|f| f.to_le_bytes())
.collect(),
@@ -580,7 +580,7 @@ mod tests {
format: oak_core::SampleFormat::F32,
channels: 1,
sample_count: 2,
data: vec![1.0f32, 2.0]
data: [1.0f32, 2.0]
.iter()
.flat_map(|f| f.to_le_bytes())
.collect(),
+12 -12
View File
@@ -112,7 +112,7 @@ pub fn point_array(core: &NodeCore, inputs: &crate::value::NodeValueRow, time: o
.inputs
.iter()
.find(|i| i.id == POINTS_INPUT)
.map(|i| (i.array_size as usize).min(64))
.map(|i| i.array_size.min(64))
.unwrap_or(5);
let mut points: Vec<[f64; 4]> = Vec::new();
for i in 0..size {
@@ -380,6 +380,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(PolygonGenerator))
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.polygon`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.polygon",
name: "Polygon",
categories: &[Category::Generator],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -507,14 +518,3 @@ mod tests {
assert_eq!(dup.name(), "Polygon");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.polygon`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.polygon",
name: "Polygon",
categories: &[Category::Generator],
create,
});
}
+10 -10
View File
@@ -193,6 +193,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(PositionNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.position",
name: "Position",
categories: &[Category::Distort],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -307,13 +317,3 @@ mod tests {
assert_eq!(dup.name(), "Position");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.position",
name: "Position",
categories: &[Category::Distort],
create,
});
}
+10 -10
View File
@@ -233,6 +233,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(PremultiplyNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.premult",
name: "Premultiply",
categories: &[Category::Math],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -372,13 +382,3 @@ mod tests {
assert_eq!(dup.name(), "Premultiply");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.premult",
name: "Premultiply",
categories: &[Category::Math],
create,
});
}
+10 -10
View File
@@ -233,6 +233,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(RampNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.ramp",
name: "Ramp",
categories: &[Category::Generator],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -394,13 +404,3 @@ mod tests {
assert_eq!(dup.name(), "Ramp");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.ramp",
name: "Ramp",
categories: &[Category::Generator],
create,
});
}
+11 -11
View File
@@ -299,6 +299,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(RippleDistortNode { gizmo }))
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.ripple`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.ripple",
name: "Ripple",
categories: &[Category::Distort],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -404,14 +415,3 @@ mod tests {
assert_eq!(dup.name(), "Ripple");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.ripple`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.ripple",
name: "Ripple",
categories: &[Category::Distort],
create,
});
}
+11 -11
View File
@@ -359,6 +359,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(ShapeNode))
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.shape`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.shape",
name: "Shape",
categories: &[Category::Generator],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -516,14 +527,3 @@ mod tests {
assert_eq!(dup.name(), "Shape");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.shape`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.shape",
name: "Shape",
categories: &[Category::Generator],
create,
});
}
+10 -10
View File
@@ -209,6 +209,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(SharpenNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.sharpen",
name: "Sharpen",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -327,13 +337,3 @@ mod tests {
assert_eq!(dup.name(), "Sharpen");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.sharpen",
name: "Sharpen",
categories: &[Category::Filter],
create,
});
}
+11 -11
View File
@@ -139,6 +139,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(SolidGenerator))
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.solidgenerator`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.solidgenerator",
name: "Solid",
categories: &[Category::Generator],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -209,14 +220,3 @@ mod tests {
assert_eq!(dup.name(), "Solid");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.solidgenerator`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.solidgenerator",
name: "Solid",
categories: &[Category::Generator],
create,
});
}
+11 -11
View File
@@ -295,6 +295,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(StrokeFilterNode))
}
/// Register this node type (C++ `k_stroke_filter` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.stroke",
name: "Stroke",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -413,14 +424,3 @@ mod tests {
assert_eq!(dup.name(), "Stroke");
}
}
/// Register this node type (C++ `k_stroke_filter` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.stroke",
name: "Stroke",
categories: &[Category::Filter],
create,
});
}
+11 -11
View File
@@ -274,6 +274,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(SwirlDistortNode { gizmo }))
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.swirl`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.swirl",
name: "Swirl",
categories: &[Category::Distort],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -390,14 +401,3 @@ mod tests {
assert_eq!(dup.name(), "Swirl");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.swirl`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.swirl",
name: "Swirl",
categories: &[Category::Distort],
create,
});
}
+2 -2
View File
@@ -84,7 +84,7 @@ impl TextGeneratorV1 {
let text = row
.get(TEXT_INPUT)
.map(to_text)
.unwrap_or_else(|| String::new());
.unwrap_or_default();
let html = matches!(row.get(HTML_INPUT), Some(NodeValue::Boolean(true)));
let mut mode = TextLayoutMode::PlainText;
let text = if html {
@@ -100,7 +100,7 @@ impl TextGeneratorV1 {
TextLayoutRequest {
text,
mode,
font_family: row.get(FONT_INPUT).map(to_text).unwrap_or_else(String::new),
font_family: row.get(FONT_INPUT).map(to_text).unwrap_or_default(),
font_size_pt: row
.get(FONT_SIZE_INPUT)
.map(NodeValue::to_double)
+2 -2
View File
@@ -92,7 +92,7 @@ impl TextGeneratorV2 {
let text = row
.get(TEXT_INPUT)
.map(to_text)
.unwrap_or_else(|| String::new());
.unwrap_or_default();
let html = matches!(row.get(HTML_INPUT), Some(NodeValue::Boolean(true)));
let mut mode = TextLayoutMode::PlainText;
let text = if html {
@@ -111,7 +111,7 @@ impl TextGeneratorV2 {
TextLayoutRequest {
text,
mode,
font_family: row.get(FONT_INPUT).map(to_text).unwrap_or_else(String::new),
font_family: row.get(FONT_INPUT).map(to_text).unwrap_or_default(),
font_size_pt: row
.get(FONT_SIZE_INPUT)
.map(NodeValue::to_double)
+4 -4
View File
@@ -760,12 +760,12 @@ impl TextGeneratorV3 {
text: row
.get(PLAIN_TEXT_INPUT)
.map(to_text)
.unwrap_or_else(String::new),
.unwrap_or_default(),
mode: TextLayoutMode::PlainText,
font_family: row
.get(FONT_FAMILY_INPUT)
.map(to_text)
.unwrap_or_else(String::new),
.unwrap_or_default(),
font_size_pt: row
.get(FONT_SIZE_INPUT)
.map(|v| v.to_double())
@@ -776,7 +776,7 @@ impl TextGeneratorV3 {
}
} else {
TextLayoutRequest {
text: row.get(TEXT_INPUT).map(to_text).unwrap_or_else(String::new),
text: row.get(TEXT_INPUT).map(to_text).unwrap_or_default(),
mode: TextLayoutMode::OliveHtml,
font_family: String::new(),
font_size_pt: 0.0,
@@ -2257,7 +2257,7 @@ mod tests {
else {
panic!("expected a CPU coverage frame");
};
let stride = frame.linesize_bytes() as usize;
let stride = frame.linesize_bytes();
let at = y * stride + x * 16;
let mut out = [0f32; 4];
for (c, v) in out.iter_mut().enumerate() {
+11 -11
View File
@@ -381,6 +381,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(TileDistortNode { gizmo }))
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.tile`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.tile",
name: "Tile",
categories: &[Category::Distort],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -483,14 +494,3 @@ mod tests {
assert_eq!(dup.name(), "Tile");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.tile`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.tile",
name: "Tile",
categories: &[Category::Distort],
create,
});
}
@@ -246,19 +246,19 @@ impl TransformDistortNode {
let scale_by_x = sequence_res.0 / texture_res.0;
let scale_by_y = sequence_res.1 / texture_res.1;
let autoscale_val;
if (autoscale_type == AutoScaleType::Fit) == (sequence_real_ar > footage_real_ar) {
let autoscale_val = if (autoscale_type == AutoScaleType::Fit) == (sequence_real_ar > footage_real_ar) {
// Scale by height. Either the sequence is wider than
// the footage or we're using fill and cutting off the
// sides.
autoscale_val = scale_by_y;
scale_by_y
} else {
// Scale by width. Either the footage is wider than the
// sequence or we're using fill and cutting off the top
// and bottom.
autoscale_val = scale_by_x;
}
scale_by_x
};
adjusted_matrix =
super::matrix::matrix_scale(adjusted_matrix, autoscale_val, autoscale_val, 1.0);
@@ -671,6 +671,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
)
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.transform`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.transform",
name: "Transform",
categories: &[Category::Distort],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -960,14 +971,3 @@ mod tests {
assert_eq!(dup.short_name(), "Transform");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.transform`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.transform",
name: "Transform",
categories: &[Category::Distort],
create,
});
}
+10 -10
View File
@@ -478,6 +478,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(TransitionFxNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.transitionfx",
name: "Transition FX",
categories: &[Category::Effect],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -754,13 +764,3 @@ mod tests {
assert_eq!(dup.name(), "Transition FX");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.transitionfx",
name: "Transition FX",
categories: &[Category::Effect],
create,
});
}
+10 -10
View File
@@ -403,6 +403,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(TransitionNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.transition",
name: "Transition",
categories: &[Category::Timeline],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -596,13 +606,3 @@ mod tests {
assert_eq!(dup.name(), "Transition");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.transition",
name: "Transition",
categories: &[Category::Timeline],
create,
});
}
+11 -11
View File
@@ -213,6 +213,17 @@ pub const OPERATION_NAMES: [&str; 9] = [
"Hyperbolic Tangent",
];
/// Register this node type (C++ `k_trigonometry_node` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.trigonometry",
name: "Trigonometry",
categories: &[Category::Math],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -363,14 +374,3 @@ mod tests {
assert_eq!(dup.name(), "Trigonometry");
}
}
/// Register this node type (C++ `k_trigonometry_node` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.trigonometry",
name: "Trigonometry",
categories: &[Category::Math],
create,
});
}
+10 -10
View File
@@ -242,6 +242,16 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(UnpremultiplyNode))
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.unpremult",
name: "Unpremultiply",
categories: &[Category::Math],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -370,13 +380,3 @@ mod tests {
assert_eq!(dup.name(), "Unpremultiply");
}
}
/// Register this node type.
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.unpremult",
name: "Unpremultiply",
categories: &[Category::Math],
create,
});
}
+11 -11
View File
@@ -171,6 +171,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(ValueNode))
}
/// Register this node type (C++ `k_value_node` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.value",
name: "Value",
categories: &[Category::Generator],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -262,14 +273,3 @@ mod tests {
assert_eq!(dup.name(), "Value");
}
}
/// Register this node type (C++ `k_value_node` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.value",
name: "Value",
categories: &[Category::Generator],
create,
});
}
+11 -11
View File
@@ -177,6 +177,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(VolumeNode))
}
/// Register this node type (C++ `k_audio_volume` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.volume",
name: "Volume",
categories: &[Category::Filter],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -331,14 +342,3 @@ mod tests {
assert_eq!(dup.type_id(), "org.olivevideoeditor.Olive.volume");
}
}
/// Register this node type (C++ `k_audio_volume` in
/// `factory.cpp::create_from_factory_index`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.volume",
name: "Volume",
categories: &[Category::Filter],
create,
});
}
+11 -11
View File
@@ -241,6 +241,17 @@ pub fn create() -> (NodeCore, Box<dyn NodeBehavior>) {
(core, Box::new(WaveDistortNode))
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.wave`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.wave",
name: "Wave",
categories: &[Category::Distort],
create,
});
}
#[cfg(test)]
mod tests {
use super::*;
@@ -341,14 +352,3 @@ mod tests {
assert_eq!(dup.name(), "Wave");
}
}
/// Register this node type (C++ factory entry for
/// `org.olivevideoeditor.Olive.wave`).
pub fn register(meta: &mut Vec<NodeMeta>) {
meta.push(NodeMeta {
type_id: "org.olivevideoeditor.Olive.wave",
name: "Wave",
categories: &[Category::Distort],
create,
});
}
+18 -17
View File
@@ -110,7 +110,7 @@ impl WhiteBalanceNode {
// exposure, then let tint move along the green-magenta axis.
let tint_gain = (1.0 + tint).clamp(0.0, 2.0);
[red / green, green / green * tint_gain, blue / green]
[red / green, tint_gain, blue / green]
}
}
@@ -189,16 +189,18 @@ impl NodeBehavior for WhiteBalanceNode {
params.insert(GAIN_INPUT.to_string(), crate::value::NodeValue::Vec3(gain));
table.push(
crate::value::ValueType::Texture,
crate::value::NodeValue::Texture(crate::handle::make_owned(Job::ShaderJob(ShaderJobPayload {
node_id: crate::id::NodeId::INVALID,
time,
iterations: 1,
type_id: self.type_id().to_string(),
shader_id: String::new(),
effect_input: core.effect_input.clone(),
params,
iterative_input: String::new(),
}))),
crate::value::NodeValue::Texture(crate::handle::make_owned(Job::ShaderJob(
ShaderJobPayload {
node_id: crate::id::NodeId::INVALID,
time,
iterations: 1,
type_id: self.type_id().to_string(),
shader_id: String::new(),
effect_input: core.effect_input.clone(),
params,
iterative_input: String::new(),
},
))),
None,
);
}
@@ -270,11 +272,11 @@ pub fn register(meta: &mut Vec<NodeMeta>) {
#[cfg(test)]
mod tests {
use super::*;
use crate::value::{NodeValue, NodeValueTable, ValueType};
use oak_core::Rational;
use super::*;
use crate::value::{NodeValue, NodeValueTable, ValueType};
use oak_core::Rational;
#[test]
#[test]
fn input_names() {
let n = WhiteBalanceNode;
assert_eq!(n.input_name(TEXTURE_INPUT), "Input");
@@ -391,8 +393,7 @@ mod tests {
panic!("expected a texture-typed value");
};
let payload =
unsafe { crate::jobs::shader_job(handle) }
.expect("payload boxed behind the handle");
unsafe { crate::jobs::shader_job(handle) }.expect("payload boxed behind the handle");
assert_eq!(payload.type_id, "org.olivevideoeditor.Olive.whitebalance");
assert_eq!(payload.shader_id, "");
assert_eq!(payload.iterations, 1);
+1 -3
View File
@@ -252,9 +252,7 @@ pub fn set_value_at_time_command(
.and_then(|e| e.core.keyframe_track(&input, element))
.and_then(|t| {
t.keys()
.iter()
.filter(|k| k.time <= time)
.next_back()
.iter().rfind(|k| k.time <= time)
.map(|k| k.interpolation)
})
.unwrap_or(Interpolation::Linear);
+2 -3
View File
@@ -347,8 +347,8 @@ impl Project {
return self.custom_cache_path.clone();
}
}
1 => {
if !self.filename.is_empty() {
1
if !self.filename.is_empty() => {
let dir = std::path::Path::new(&self.filename)
.parent()
.map(|p| p.to_string_lossy().into_owned())
@@ -357,7 +357,6 @@ impl Project {
return format!("{}/cache", dir);
}
}
}
_ => {}
}
// Default location: the shared disk-cache directory (single-lib:
+1 -1
View File
@@ -690,7 +690,7 @@ impl Clone for NodeValue {
fn clone(&self) -> Self {
match self {
NodeValue::Texture(h) => {
let h2 = h.clone();
let h2 = *h;
if let Some(f) = h2.addref {
// Safety: `h2` is a valid handle; addref only touches
// the refcount.