- Add stream_sexp_generic.py: fully generic sexp interpreter - Add streaming primitives for video sources and audio analysis - Add config system for external sources and audio files - Add templates for reusable scans and macros - Fix video/audio stream mapping in file output - Add dynamic source cycling based on sources array length - Remove old Python effect files (migrated to sexp) - Update sexp effects to use namespaced primitives Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
37 lines
1.3 KiB
Common Lisp
37 lines
1.3 KiB
Common Lisp
;; Layer effect - composite overlay over background at position
|
|
;; Streaming-compatible: frame is background, overlay is foreground
|
|
;; Usage: (layer background overlay :x 10 :y 20 :opacity 0.8)
|
|
;;
|
|
;; Params:
|
|
;; overlay - frame to composite on top
|
|
;; x, y - position to place overlay
|
|
;; opacity - blend amount (0-1)
|
|
;; mode - blend mode (alpha, multiply, screen, etc.)
|
|
|
|
(require-primitives "image" "blending" "core")
|
|
|
|
(define-effect layer
|
|
:params (
|
|
(overlay :type frame :default nil)
|
|
(x :type int :default 0)
|
|
(y :type int :default 0)
|
|
(opacity :type float :default 1.0)
|
|
(mode :type string :default "alpha")
|
|
)
|
|
(if (core:is-nil overlay)
|
|
frame
|
|
(let [bg (copy frame)
|
|
fg overlay
|
|
fg-w (image:width fg)
|
|
fg-h (image:height fg)]
|
|
(if (= opacity 1.0)
|
|
;; Simple paste
|
|
(paste bg fg x y)
|
|
;; Blend with opacity
|
|
(let [blended (if (= mode "alpha")
|
|
(blending:blend-images (image:crop bg x y fg-w fg-h) fg opacity)
|
|
(blending:blend-images (image:crop bg x y fg-w fg-h)
|
|
(blending:blend-mode (image:crop bg x y fg-w fg-h) fg mode)
|
|
opacity))]
|
|
(paste bg blended x y))))))
|