Core (nodes/core/): alpha, masks, batch consolidation, blend, transform matrix, bbox, parameters, validation engines shared across nodes, each with unit tests. Fix an unconditional RGB clamp to [0,1] that silently destroyed HDR/negative values in Merge, Transform, Color Correct, Comp, CornerPin, Distort, Spherize, Crop Stitch, and the shared masked-compositing helpers. Alpha stays clamped everywhere; RGB no longer does. Fix Grain applying `amount` twice in overlay/soft_light modes (quadratic instead of linear falloff). Add STMap mode to Distort (absolute UV remap vs relative displacement). Add bbox output/input wiring between Crop and Crop Stitch. Add edge_grow and edge_color_match to Crop Stitch. Add despill to Keyer. Add shuffle mode to Channel (R/G/B/A routed from any source). Add size/luma_response to Grain. Add grid mode to Constant. Add frame/layer accumulation limits to Preview and Draw, plus a font-path containment fix and supersampling in Text. Make Frame Range and Append recognize a real ComfyUI VIDEO input (not only this pack's internal media wrapper), preserving true fps/audio instead of silently dropping them, and add a native VIDEO output alongside the existing IMAGE output on both. Add node_replacements.py (empty registry, wired into the extension lifecycle) for future schema migrations. Add a CI matrix pinning the verified requires-comfyui floor, and .comfyignore for Registry packaging.
32 lines
1.1 KiB
Python
32 lines
1.1 KiB
Python
"""Node replacement registry for ImageOps.
|
|
|
|
Register an entry here only when a node's ID, widget layout, or output order
|
|
changes in a way that would otherwise strand saved workflows. Additive schema
|
|
changes (a new optional input, a new output appended at the end) do not need
|
|
an entry — those stay backward compatible on their own.
|
|
|
|
See comfy_api.latest.io.NodeReplace for the mapping fields.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from comfy_api.latest import ComfyAPI, io
|
|
|
|
REPLACEMENTS: list[io.NodeReplace] = [
|
|
# Example, once a node is actually renamed/restructured:
|
|
# io.NodeReplace(
|
|
# new_node_id="ImageOpsChannelShuffle",
|
|
# old_node_id="ImageOpsChannel",
|
|
# old_widget_ids=["bypass", "channel"],
|
|
# input_mapping=[{"new_id": "image", "old_id": "image"}],
|
|
# output_mapping=[{"new_idx": 0, "old_idx": 0}],
|
|
# ),
|
|
]
|
|
|
|
|
|
async def register_node_replacements() -> None:
|
|
if not REPLACEMENTS:
|
|
return
|
|
api = ComfyAPI()
|
|
for replacement in REPLACEMENTS:
|
|
await api.node_replacement.register(replacement)
|